@@ -144,30 +175,53 @@ const AccentColorPad: React.FC<{
backgroundSize: '12px 12px, auto',
}}
>
+ {scheme && (
+
e.stopPropagation()}
+ style={{ position: 'absolute', top: 8, left: 8, display: 'flex', gap: 4, background: 'rgba(255,255,255,0.06)', borderRadius: 9, padding: 3 }}
+ >
+ {SCHEMES.map(({ key, Icon }) => (
+
+ ))}
+
+ )}
{dotPositions.map((p, i) => (
))}
e.stopPropagation()}
- style={{ position: 'absolute', bottom: 8, left: '50%', transform: 'translateX(-50%)', display: 'flex', gap: 6 }}
+ style={{ position: 'absolute', bottom: 8, left: '50%', transform: 'translateX(-50%)', display: 'flex', gap: 4, background: 'rgba(255,255,255,0.06)', borderRadius: 9, padding: 3 }}
>
-
@@ -184,7 +238,7 @@ const AccentColorPad: React.FC<{
{ACCENT_PRESETS.slice(presetPage * PRESETS_PER_PAGE, (presetPage + 1) * PRESETS_PER_PAGE).map((hex) => (
{ setHarmonyIdx(0); onChange([hex]); }}
+ onClick={() => { setFreeform(true); onChange([hex]); }}
style={{
width: 26, height: 26, borderRadius: 999, background: hex, cursor: 'pointer',
border: stops[0] === hex && stops.length === 1 ? '2.5px solid #fff' : '2.5px solid transparent',
@@ -200,7 +254,7 @@ const AccentColorPad: React.FC<{
{ setHarmonyIdx(0); onChange(null); }}
+ onClick={() => { setFreeform(true); onChange(null); }}
style={{
marginLeft: 'auto', border: 'none', background: 'transparent', padding: 0,
color: '#8a8a86', fontSize: '0.8125rem', cursor: 'pointer', fontFamily: 'inherit', textDecoration: 'underline',
@@ -209,9 +263,10 @@ const AccentColorPad: React.FC<{
Reset
- {/* Intensity knob only; the grain squiggle is gone on purpose (Eric's call, one dial fewer). */}
+ {/* Arc's dials row: wavy line = grain, round knob = intensity. */}
{wash && (
-
+
+
)}
diff --git a/frontend/src/app/pages/Settings/sections/general/GeneralInterface.tsx b/frontend/src/app/pages/Settings/sections/general/GeneralInterface.tsx
index 547f021d..6d2e899b 100644
--- a/frontend/src/app/pages/Settings/sections/general/GeneralInterface.tsx
+++ b/frontend/src/app/pages/Settings/sections/general/GeneralInterface.tsx
@@ -23,7 +23,7 @@ const GeneralInterface: React.FC<{
styles: SettingsStyles;
}> = ({ form, setForm, styles }) => {
const c = useClaudeTokens();
- const { washOpacity, setWashOpacity } = useThemeWash();
+ const { washOpacity, grain, setWashOpacity, setGrain } = useThemeWash();
const { fieldSx, sectionSx, rowSx, rowLastSx, inlineRowSx, inlineRowLastSx, labelSx, descSx, toggleGroupSx, switchSx } = styles;
return (
@@ -131,7 +131,11 @@ const GeneralInterface: React.FC<{
stops={form.accent_gradient ?? (form.accent_color ? [form.accent_color] : [])}
onChange={(next) => setForm({ ...form, accent_color: next?.[0] ?? null, accent_gradient: next && next.length > 1 ? next : null })}
height={120}
- wash={{ opacity: washOpacity, onOpacity: setWashOpacity }}
+ wash={{ opacity: washOpacity, grain, onOpacity: setWashOpacity, onGrain: setGrain }}
+ scheme={{
+ value: form.theme === 'dark' ? 'dark' : 'light',
+ onPick: (v) => setForm({ ...form, theme: v === 'system' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : v }),
+ }}
/>