diff --git a/package.json b/package.json index 1b5e2214..889249af 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ }, "dependencies": { "@bedframe/cli": "^0.0.85", + "@codemirror/lang-css": "^6.3.0", "@codemirror/lang-less": "^6.0.2", "@million/lint": "latest", "@sveltejs/vite-plugin-svelte": "4.0.0-next.7", @@ -70,6 +71,7 @@ "@vitejs/plugin-react": "^4.3.1", "autoprefixer": "^10.4.20", "classnames": "^2.5.1", + "codemirror": "^6.0.1", "color": "^4.2.3", "dompurify": "^3.1.6", "idb": "^8.0.0", diff --git a/src/svelte-interface/components/CodeEditor.svelte b/src/svelte-interface/components/CodeEditor.svelte index 6cc5ca67..7b817d00 100644 --- a/src/svelte-interface/components/CodeEditor.svelte +++ b/src/svelte-interface/components/CodeEditor.svelte @@ -1,4 +1,70 @@ -
Code Editor Here
+
diff --git a/src/svelte-interface/components/ColourPicker.svelte b/src/svelte-interface/components/ColourPicker.svelte index 6634788e..38e0cd4d 100644 --- a/src/svelte-interface/components/ColourPicker.svelte +++ b/src/svelte-interface/components/ColourPicker.svelte @@ -5,16 +5,18 @@ import { animate, spring } from 'motion'; import { delay } from '@/seqta/utils/delay.ts' - const { hidePicker, standalone = false } = $props<{ + const { hidePicker, standalone = false, savePresets = true } = $props<{ hidePicker?: () => void, - standalone?: boolean + standalone?: boolean, + savePresets?: boolean }>(); - let background: HTMLDivElement; - let content: HTMLDivElement; + let background = $state(null); + let content = $state(null); const closePicker = async () => { if (standalone) return; + if (!background || !content) return; animate( content, @@ -34,6 +36,7 @@ onMount(() => { if (standalone) return; + if (!background || !content) return; animate( background, @@ -69,7 +72,7 @@ {#if standalone}
- +
{:else} @@ -83,7 +86,7 @@ bind:this={content} class="h-auto p-4 bg-white border shadow-lg cursor-auto rounded-xl dark:bg-zinc-800 border-zinc-100 dark:border-zinc-700" > - + {/if} diff --git a/src/svelte-interface/components/ColourPicker.tsx b/src/svelte-interface/components/ColourPicker.tsx index 36231d2c..db49a13c 100644 --- a/src/svelte-interface/components/ColourPicker.tsx +++ b/src/svelte-interface/components/ColourPicker.tsx @@ -1,5 +1,5 @@ import ColorPicker from "react-best-gradient-color-picker" -import React, { useEffect, useState } from "react" +import React, { useEffect, useState, useRef } from "react" import { settingsState } from "@/seqta/utils/listeners/SettingsState.ts" const defaultPresets = [ @@ -35,13 +35,23 @@ export default function Picker({ customState, savePresets = true, }: PickerProps) { - const [customThemeColor, setCustomThemeColor] = useState( - () => customState ?? settingsState.selectedColor ?? null - ) - const [presets, setPresets] = useState(() => { - const savedPresets = localStorage.getItem("colorPickerPresets") - return savedPresets ? JSON.parse(savedPresets) : defaultPresets - }) + const [customThemeColor, setCustomThemeColor] = useState() + const [presets, setPresets] = useState() + + const latestValuesRef = useRef({ customThemeColor, customOnChange, savePresets, presets }); + + useEffect(() => { + if (customState !== undefined) { + setCustomThemeColor(customState) + } else { + setCustomThemeColor(settingsState.selectedColor ?? null) + } + + if (presets === undefined) { + const savedPresets = localStorage.getItem("colorPickerPresets") + setPresets(savedPresets ? JSON.parse(savedPresets) : defaultPresets) + } + }, []) useEffect(() => { if (customState !== undefined) { @@ -50,32 +60,34 @@ export default function Picker({ }, [customState]) useEffect(() => { - if (customThemeColor && !customOnChange && savePresets) { - return () => { - // Check if the selected color is already in the presets - const existingIndex = presets.indexOf(customThemeColor) + latestValuesRef.current = { customThemeColor, customOnChange, savePresets, presets }; + }, [customThemeColor, customOnChange, savePresets, presets]); - let updatedPresets - if (existingIndex > -1) { - // If the color exists, move it to the front - updatedPresets = [ - customThemeColor, - ...presets.slice(0, existingIndex), - ...presets.slice(existingIndex + 1), - ] - } else { - // If the color is new, add it to the front and slice the array - updatedPresets = [customThemeColor, ...presets].slice(0, 18) - } - - setPresets(updatedPresets) - localStorage.setItem( - "colorPickerPresets", - JSON.stringify(updatedPresets), - ) + useEffect(() => { + return () => { + const { customThemeColor, customOnChange, savePresets, presets } = latestValuesRef.current; + if (!(customThemeColor && !customOnChange && savePresets)) return; + + // Only proceed if presets are different (avoid unnecessary updates) + const existingIndex = presets.indexOf(customThemeColor); + let updatedPresets; + + if (existingIndex === 0) { + // No need to update if the selected color is already the first element + return; + } else if (existingIndex > -1) { + updatedPresets = [ + customThemeColor, + ...presets.slice(0, existingIndex), + ...presets.slice(existingIndex + 1), + ]; + } else { + updatedPresets = [customThemeColor, ...presets].slice(0, 18); } + + localStorage.setItem("colorPickerPresets", JSON.stringify(updatedPresets)); } - }, [customThemeColor, customOnChange, savePresets, presets]) + }, []) useEffect(() => { if (customThemeColor && !customOnChange) { diff --git a/src/svelte-interface/pages/themeCreator.svelte b/src/svelte-interface/pages/themeCreator.svelte index e829ea19..1659eb7e 100644 --- a/src/svelte-interface/pages/themeCreator.svelte +++ b/src/svelte-interface/pages/themeCreator.svelte @@ -74,16 +74,16 @@ {:else if item.type === 'slider'} {:else if item.type === 'colourPicker'} - + {:else if item.type === 'codeEditor'} - + {/if} {/snippet}
-
+

Theme Creator

{'\ueb44'}