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}