diff --git a/src/svelte-interface/components/Switch.svelte b/src/svelte-interface/components/Switch.svelte index 6345d011..a053fbb0 100644 --- a/src/svelte-interface/components/Switch.svelte +++ b/src/svelte-interface/components/Switch.svelte @@ -29,7 +29,7 @@
onChange(!state)} onkeydown={(e) => e.key === "Enter" && onChange(!state)} diff --git a/src/svelte-interface/pages/themeCreator.svelte b/src/svelte-interface/pages/themeCreator.svelte index 8bbc73b0..eb75ae0f 100644 --- a/src/svelte-interface/pages/themeCreator.svelte +++ b/src/svelte-interface/pages/themeCreator.svelte @@ -2,6 +2,7 @@ import { v4 as uuidv4 } from 'uuid'; import { onMount } from 'svelte'; import { slide } from 'svelte/transition'; + import { fade } from 'svelte/transition'; import { type LoadedCustomTheme } from '@/types/CustomThemes' @@ -86,7 +87,7 @@ }); - type SettingType = 'switch' | 'button' | 'slider' | 'colourPicker' | 'select' | 'codeEditor' | 'imageUpload'; + type SettingType = 'switch' | 'button' | 'slider' | 'colourPicker' | 'select' | 'codeEditor' | 'imageUpload' | 'conditional' | 'lightDarkToggle'; type SwitchProps = { state: boolean; onChange: (value: boolean) => void }; type ButtonProps = { onClick: () => void; text: string }; @@ -94,8 +95,14 @@ type ColourPickerProps = { color: string; onChange: (color: string) => void }; type SelectProps = { options: Array<{ value: string; label: string }>; value: string; onChange: (value: string) => void }; type CodeEditorProps = { value: string; onChange: (value: string) => void }; + type LightDarkToggleProps = { state: boolean; onChange: (value: boolean) => void }; - type ComponentProps = SwitchProps | ButtonProps | SliderProps | ColourPickerProps | SelectProps | CodeEditorProps; + type ConditionalProps = { + condition: boolean; + children: SettingItem; + }; + + type ComponentProps = SwitchProps | ButtonProps | SliderProps | ColourPickerProps | SelectProps | CodeEditorProps | LightDarkToggleProps | ConditionalProps; type SettingItem = { type: SettingType; @@ -107,64 +114,89 @@ {#snippet settingItem(item: SettingItem)} -
- -
{ item.direction === 'vertical' && toggleAccordion(item.title) }} - onkeydown={(e) => { e.key === 'Enter' && item.direction === 'vertical' && toggleAccordion(item.title) }} - class="flex justify-between pr-4 {item.direction === 'vertical' ? 'cursor-pointer w-full select-none' : ''}"> -
-

{item.title}

-

{item.description}

+ {#if item.type === 'conditional'} + {#if (item.props as ConditionalProps).condition } +
+ {@render settingItem((item.props as ConditionalProps).children)}
+ {/if} + {:else} +
+ +
{ item.direction === 'vertical' && toggleAccordion(item.title) }} + onkeydown={(e) => { e.key === 'Enter' && item.direction === 'vertical' && toggleAccordion(item.title) }} + class="flex justify-between pr-4 {item.direction === 'vertical' ? 'cursor-pointer w-full select-none' : ''}"> - {#if item.direction === 'vertical'} -
- {'\ue9e6'} +
+

{item.title}

+

{item.description}

- {/if} -
- {#if !closedAccordions.includes(item.title)} -
- {#if item.type === 'switch'} - - {:else if item.type === 'button'} - -
- {/each} - -
- {'\uec60'} - Add image - + {#if item.direction === 'vertical'} +
+ {'\ue9e6'}
{/if}
- {/if} -
+ + {#if !closedAccordions.includes(item.title)} +
+ {#if item.type === 'switch'} + + {:else if item.type === 'button'} + +
+ {/each} + +
+ {'\uec60'} + Add image + +
+ {:else if item.type === 'lightDarkToggle'} + + {/if} +
+ {/if} +
+ {/if} {/snippet}
@@ -236,6 +268,21 @@ onChange: (value: boolean) => theme = { ...theme, forceDark: value ? false : undefined } } }, + { + type: 'conditional', + props: { + condition: theme.forceDark !== undefined, + children: { + type: 'lightDarkToggle', + title: 'Mode', + description: 'Choose whether to force light or dark mode', + props: { + state: theme.forceDark === true, + onChange: (value: boolean) => theme = { ...theme, forceDark: value } + } + } + } + }, { type: 'colourPicker', title: 'Default Theme Colour',