diff --git a/public/manifest.json b/public/manifest.json index 81859b9..3ef91f7 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,6 +1,6 @@ { "short_name": "Calque", - "name": "Calque", + "name": "Calque - manage your i18n files", "description": "Simple tool for maitaining i18n files", "icons": [ { @@ -13,8 +13,6 @@ "display_override": [ "window-controls-overlay" ], - "theme_color": "#222", - "background_color": "#222", "screenshots": [ { "src": "/images/screenshots/narrow.png", diff --git a/src/components/colorschemepicker.tsx b/src/components/colorschemepicker.tsx index 6075a53..d0f8ca9 100644 --- a/src/components/colorschemepicker.tsx +++ b/src/components/colorschemepicker.tsx @@ -1,47 +1,66 @@ -import { Accessor, Component, createEffect, createSignal, For, Setter } from "solid-js"; +import { Component, createEffect, createMemo, createResource, For, Setter } from "solid-js"; import css from './colorschemepicker.module.css'; import { CgDarkMode } from "solid-icons/cg"; +import { action, cache, useAction } from "@solidjs/router"; +import { useSession } from "vinxi/http"; export enum ColorScheme { Auto = 'light dark', Light = 'light', Dark = 'dark', } +type ColorSchemeKey = keyof typeof ColorScheme; -const colorSchemeEntries = [ - [ColorScheme.Auto, 'Auto'], - [ColorScheme.Light, 'Light'], - [ColorScheme.Dark, 'Dark'], -] as const; +const colorSchemeKeys: readonly ColorSchemeKey[] = ['Auto', 'Light', 'Dark'] as const; interface ColorSchemePickerProps { - value?: Setter | [Accessor, Setter]; + value?: Setter; } +const getSession = async () => { + 'use server'; + + return useSession<{ colorScheme: ColorSchemeKey }>({ + password: process.env.SESSION_SECRET!, + }); +}; + +export const getColorScheme = cache(async () => { + 'use server'; + + const session = await getSession(); + + return session.data.colorScheme; +}, 'color-scheme'); + +const setColorScheme = action(async (colorScheme: ColorSchemeKey) => { + 'use server'; + + const session = await getSession(); + await session.update({ colorScheme }); +}, 'color-scheme'); + export const ColorSchemePicker: Component = (props) => { - const [value, setValue] = createSignal(ColorScheme.Auto); + const [value, { mutate }] = createResource(() => getColorScheme(), { initialValue: 'Auto' }); + const updateStore = useAction(setColorScheme); createEffect(() => { - const currentValue = value(); - const setter = props.value instanceof Array ? props.value[1] : props.value; - - if (!setter) { - return; - } - - setter(currentValue); + props.value?.(ColorScheme[value()]); }); return ; diff --git a/src/routes/(editor).tsx b/src/routes/(editor).tsx index f8deedb..e28ad96 100644 --- a/src/routes/(editor).tsx +++ b/src/routes/(editor).tsx @@ -1,17 +1,24 @@ -import { Link, Meta, Title } from "@solidjs/meta"; -import { createSignal, For, ParentProps, Show } from "solid-js"; +import { Link, Title } from "@solidjs/meta"; +import { createEffect, createMemo, createSignal, ParentProps, Show } from "solid-js"; import { BsTranslate } from "solid-icons/bs"; import { FilesProvider } from "~/features/file"; import { CommandPalette, CommandPaletteApi, Menu, MenuProvider } from "~/features/menu"; import { isServer } from "solid-js/web"; -import { A } from "@solidjs/router"; +import { A, createAsync } from "@solidjs/router"; import { createCommand, Modifier } from "~/features/command"; -import { ColorScheme, ColorSchemePicker } from "~/components/colorschemepicker"; +import { ColorScheme, ColorSchemePicker, getColorScheme } from "~/components/colorschemepicker"; import css from "./editor.module.css"; export default function Editor(props: ParentProps) { + const storedColorScheme = createAsync(() => getColorScheme(), { initialValue: 'Auto' }); + const [commandPalette, setCommandPalette] = createSignal(); - const [colorScheme, setColorScheme] = createSignal(ColorScheme.Auto); + const colorScheme = createMemo(() => ColorScheme[storedColorScheme()]); + const color = createMemo(() => ({ + [ColorScheme.Auto]: undefined, + [ColorScheme.Light]: '#eee', + [ColorScheme.Dark]: '#333', + }[ColorScheme[storedColorScheme()]])); const supported = isServer || typeof window.showDirectoryPicker === 'function'; const commands = [ @@ -22,7 +29,15 @@ export default function Editor(props: ParentProps) { return Calque - + + + + + + + + + @@ -34,7 +49,7 @@ export default function Editor(props: ParentProps) {
- +
diff --git a/src/routes/editor.module.css b/src/routes/editor.module.css index e3b9f8b..8291471 100644 --- a/src/routes/editor.module.css +++ b/src/routes/editor.module.css @@ -11,16 +11,23 @@ grid-template-columns: auto minmax(0, 1fr) auto; grid-auto-flow: column; justify-content: start; + justify-items: start; position: relative; z-index: 10; gap: .5em; padding-inline: 1em; - block-size: 2em; + block-size: calc(env(titlebar-area-height, 2em) + .5px); + inline-size: env(titlebar-area-width, 100%); + -webkit-app-region: drag; background-color: var(--surface-3); color: var(--text-1); + & > * { + -webkit-app-region: no-drag; + } + & > .logo { inline-size: 3em; block-size: 3em;