Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
4272e15
Align preview toolbar chrome
vyctorbrzezowski Jun 27, 2026
43a53da
Tighten inspector top spacing
vyctorbrzezowski Jun 27, 2026
96aebbc
Fix web theme toggle and sidebar scrollbar
vyctorbrzezowski Jun 27, 2026
8f3c17b
Use neutral border for download action
vyctorbrzezowski Jun 27, 2026
fd0cbef
Add code wrap control to export dialog
vyctorbrzezowski Jun 27, 2026
aebbdc3
Keep export dialog height stable across tabs
vyctorbrzezowski Jun 27, 2026
6a7783f
Replay preview when resetting controls
vyctorbrzezowski Jun 27, 2026
b6b21b2
Restyle inspector sliders
vyctorbrzezowski Jun 27, 2026
b787515
Space sidebar section headings
vyctorbrzezowski Jun 27, 2026
152c236
Offset export wrap control from scrollbar
vyctorbrzezowski Jun 27, 2026
61e89bc
Show wrap control only for horizontal overflow
vyctorbrzezowski Jun 27, 2026
ce25581
Add centered effect navigation controls
vyctorbrzezowski Jun 27, 2026
ace8a78
Allow manual slider value entry
vyctorbrzezowski Jun 27, 2026
6ce78ad
Match switch controls to inspector sliders
vyctorbrzezowski Jun 27, 2026
1676f07
Add color preset controls
vyctorbrzezowski Jun 27, 2026
972fc90
Improve light mode contrast
vyctorbrzezowski Jun 27, 2026
8ec040d
Render short selects as choice blocks
vyctorbrzezowski Jun 27, 2026
e9b6691
Remove inspector reset action
vyctorbrzezowski Jun 27, 2026
c2db864
Navigate effects with arrow keys
vyctorbrzezowski Jun 27, 2026
669babb
Refine color preset layout
vyctorbrzezowski Jun 27, 2026
b296dc6
Add sidebar brand header
vyctorbrzezowski Jun 27, 2026
f40f168
Allow collapsing sidebar groups
vyctorbrzezowski Jun 27, 2026
99c7439
Float stage navigation controls
vyctorbrzezowski Jun 27, 2026
223c66b
Replay treatment animation on control changes
vyctorbrzezowski Jun 27, 2026
1b776b7
Add random easing control
vyctorbrzezowski Jun 27, 2026
548ff84
Add floating canvas background controls
vyctorbrzezowski Jun 27, 2026
7ff1120
Inset sidebar selection highlight
vyctorbrzezowski Jun 27, 2026
c08fc1e
Move sidebar group chevrons right
vyctorbrzezowski Jun 27, 2026
7be7da2
Add resizable sidebar width
vyctorbrzezowski Jun 27, 2026
0124924
Prevent sidebar horizontal scrolling
vyctorbrzezowski Jun 27, 2026
3f2791b
Generate harmonic random colors
vyctorbrzezowski Jun 27, 2026
c73bae9
Hide horizontal stage overflow when zoomed
vyctorbrzezowski Jun 27, 2026
caa1e9c
Cycle global appearance modes
vyctorbrzezowski Jun 27, 2026
604dd97
Refine canvas background modes
vyctorbrzezowski Jun 27, 2026
e5c784f
Use Motion Studio logo asset
vyctorbrzezowski Jun 27, 2026
34e5411
Add color preset reset action
vyctorbrzezowski Jun 27, 2026
c5ef928
Improve sidebar collapse chevron visibility
vyctorbrzezowski Jun 27, 2026
9320b21
Allow collapsing active sidebar group
vyctorbrzezowski Jun 27, 2026
d2edfd8
Reset sidebar width on double click
vyctorbrzezowski Jun 27, 2026
3ce83c7
Move theme toggle to sidebar header
vyctorbrzezowski Jun 27, 2026
ef1ece0
Fold canvas tone into background control
vyctorbrzezowski Jun 27, 2026
4b49a74
Make color reset contextual
vyctorbrzezowski Jun 27, 2026
d5a5779
Add contextual stage reset action
vyctorbrzezowski Jun 27, 2026
940388a
Replace Motion Studio logo asset
vyctorbrzezowski Jun 27, 2026
cff73b3
Refine sidebar header controls
vyctorbrzezowski Jun 27, 2026
cdcd7a5
Fix canvas controls contrast for mixed theme and tone
vyctorbrzezowski Jun 27, 2026
5caeef9
Add sidebar bottom scroll fade
vyctorbrzezowski Jun 27, 2026
81a4aae
Fix drag region blocking top controls
vyctorbrzezowski Jun 27, 2026
33d5ae7
Add theme toggle hover state
vyctorbrzezowski Jun 27, 2026
a00f864
Add sidebar collapse control on hover
vyctorbrzezowski Jun 27, 2026
c1b5957
Clean up branch diff
vyctorbrzezowski Jun 27, 2026
aab49e5
Remove sidebar panel collapse
vyctorbrzezowski Jun 27, 2026
3931a11
Use Minimize2 and Maximize2 for sidebar group toggle
vyctorbrzezowski Jun 27, 2026
2174ad8
Fix sidebar bottom scroll fade
vyctorbrzezowski Jun 27, 2026
ce48073
Fix infinite canvas scroll
vyctorbrzezowski Jun 27, 2026
361c393
Restore sidebar scroll fade styles
vyctorbrzezowski Jun 27, 2026
e72441f
Fix sidebar scroll fade (top + bottom)
vyctorbrzezowski Jun 27, 2026
58e9967
Refine sidebar scroll fade with mask-image
vyctorbrzezowski Jun 27, 2026
8f5e5d0
Use gradient overlays for sidebar scroll fade
vyctorbrzezowski Jun 27, 2026
e045de3
Tone down sidebar scroll fades
vyctorbrzezowski Jun 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/png" href="/favicon.png" />
<title>Motion Studio</title>
<script>
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
const savedTheme = window.localStorage.getItem("motion-studio-theme");
if (savedTheme === "dark" || (savedTheme !== "light" && window.matchMedia("(prefers-color-scheme: dark)").matches)) {
document.documentElement.classList.add("dark");
}
</script>
Expand Down
1 change: 1 addition & 0 deletions main-window.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/png" href="/favicon.png" />
<title>App</title>
<script>
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
Expand Down
Binary file added public/favicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 21 additions & 23 deletions renderer/components/appearance-toggle.tsx
Original file line number Diff line number Diff line change
@@ -1,44 +1,42 @@
import * as React from "react";
import { Button } from "@glaze/core/components";
import { Sun, Moon } from "lucide-react";
import { Laptop, Moon, Sun } from "lucide-react";

type ThemeSource = "system" | "dark" | "light";

const THEME_ORDER: ThemeSource[] = ["system", "dark", "light"];

// Quick light/dark switch for the main window. The full Auto/Light/Dark control
// still lives in Settings; this just flips the effective appearance in place.
export function AppearanceToggle() {
const [isDark, setIsDark] = React.useState<boolean | null>(null);
const [themeSource, setThemeSource] = React.useState<ThemeSource>("system");

React.useEffect(() => {
let active = true;
window.glazeAPI.nativeTheme.getShouldUseDarkColors().then((dark) => {
if (active) setIsDark(dark);
window.glazeAPI.nativeTheme.getThemeSource().then((source) => {
if (active) setThemeSource(source);
});

// Keep the icon in sync when the OS appearance changes while on "system".
const media = window.matchMedia("(prefers-color-scheme: dark)");
const onChange = (e: MediaQueryListEvent) => setIsDark(e.matches);
media.addEventListener("change", onChange);
return () => {
active = false;
media.removeEventListener("change", onChange);
};
}, []);

const toggle = async () => {
const next = !isDark;
setIsDark(next);
await window.glazeAPI.nativeTheme.setThemeSource(next ? "dark" : "light");
const next = THEME_ORDER[(THEME_ORDER.indexOf(themeSource) + 1) % THEME_ORDER.length];
setThemeSource(next);
await window.glazeAPI.nativeTheme.setThemeSource(next);
};

const label =
themeSource === "system" ? "Use dark mode" : themeSource === "dark" ? "Use light mode" : "Use system theme";

return (
<Button
iconOnly
variant="glass"
size="large"
<button
type="button"
className="inline-flex size-8 shrink-0 items-center justify-center rounded-full text-black/55 transition-colors hover:bg-black/[0.07] hover:text-foreground dark:text-white/50 dark:hover:bg-white/[0.07] dark:hover:text-white"
onClick={toggle}
aria-label={isDark ? "Switch to light mode" : "Switch to dark mode"}
title={isDark ? "Switch to light mode" : "Switch to dark mode"}
aria-label={label}
title={label}
>
{isDark ? <Sun /> : <Moon />}
</Button>
{themeSource === "system" ? <Laptop size={16} /> : themeSource === "dark" ? <Moon size={16} /> : <Sun size={16} />}
</button>
);
}
44 changes: 23 additions & 21 deletions renderer/components/control-panel.tsx
Original file line number Diff line number Diff line change
@@ -1,40 +1,42 @@
import { Button, Separator } from "@glaze/core/components";
import { RotateCcw } from "lucide-react";
import { ControlRow } from "./control-row";
import { Separator } from "@glaze/core/components";
import * as React from "react";
import { ColorPresetGrid, ControlRow } from "./control-row";
import type { Effect, EffectParams, ParamValue } from "./effects/types";

interface ControlPanelProps {
effect: Effect;
params: EffectParams;
onChange: (id: string, value: ParamValue) => void;
onReset: () => void;
}

export function ControlPanel({ effect, params, onChange, onReset }: ControlPanelProps) {
export function ControlPanel({ effect, params, onChange }: ControlPanelProps) {
let colorPresetsShown = false;

return (
<div className="h-full flex flex-col">
<div className="px-4 pt-13 pb-3 flex items-start justify-between gap-3">
<div className="titlebar-drag px-4 py-3 flex items-start justify-between gap-3">
<div className="min-w-0">
<h2 className="text-strong">{effect.name}</h2>
<p className="text-small text-secondary mt-0.5">{effect.description}</p>
</div>
<Button
variant="transparent"
size="small"
iconOnly
className="shrink-0 text-secondary"
title="Reset to defaults"
aria-label="Reset to defaults"
onClick={onReset}
>
<RotateCcw size={15} />
</Button>
</div>
<Separator />
<div className="flex-1 overflow-y-auto px-4 py-4 flex flex-col gap-4">
{effect.controls.map((control) => (
<ControlRow key={control.id} control={control} params={params} onChange={onChange} />
))}
<div className="flex-1 overflow-y-auto px-4 pt-3 pb-4 flex flex-col gap-4">
{effect.controls.map((control) => {
const showColorPresets =
!colorPresetsShown &&
control.type === "color" &&
(!control.visibleWhen || control.visibleWhen(params));
if (showColorPresets) colorPresetsShown = true;
return (
<React.Fragment key={control.id}>
{showColorPresets && (
<ColorPresetGrid controls={effect.controls} params={params} onChange={onChange} />
)}
<ControlRow control={control} params={params} onChange={onChange} />
</React.Fragment>
);
})}
</div>
</div>
);
Expand Down
Loading