/* ============================================================
Values.html — expressive Tweaks
Three controls, each orchestrating many properties:
• Atmosphere — the whole colour world (palette + light)
• Voice — rewrites the page's copy & personality
• Composition— type scale, rhythm & density
============================================================ */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"atmosphere": ["#0e1822", "#e6a92e", "#faf8f3"],
"voice": "editorial",
"composition": "balanced"
}/*EDITMODE-END*/;
/* ---- Atmosphere: coordinated theme token sets ---- */
const VT_THEMES = [
{ id:'twilight', swatch:['#0e1822','#e6a92e','#faf8f3'], vars:{
'--ink':'#0e1822','--ink-soft':'#14223a','--ink-2':'#1b2c45','--cream':'#faf8f3','--cream-2':'#f3ede1','--paper':'#ffffff',
'--gold':'#e6a92e','--gold-bright':'#ffc657','--gold-deep':'#b9802a',
'--text':'#1b2530','--text-ink':'#eef1f5','--muted':'#5d6773','--muted-ink':'#9bb0c6cc',
'--line':'rgba(20,30,45,.12)','--line-ink':'rgba(255,255,255,.13)' } },
{ id:'daybreak', swatch:['#2b211a','#f0a92e','#fff7ec'], vars:{
'--ink':'#2b211a','--ink-soft':'#392c22','--ink-2':'#4d3722','--cream':'#fff7ec','--cream-2':'#f8ecd8','--paper':'#fffdf8',
'--gold':'#d98a25','--gold-bright':'#f4b03e','--gold-deep':'#a9651b',
'--text':'#2a201a','--text-ink':'#fdf3e6','--muted':'#6e5c4b','--muted-ink':'#dcc6abcc',
'--line':'rgba(70,45,20,.14)','--line-ink':'rgba(255,240,220,.15)' } },
{ id:'midnight', swatch:['#080b11','#c9a96a','#eef1f5'], vars:{
'--ink':'#080b11','--ink-soft':'#0f1620','--ink-2':'#17212f','--cream':'#eef1f5','--cream-2':'#e2e7ee','--paper':'#f8fafc',
'--gold':'#c2a467','--gold-bright':'#e6cf9c','--gold-deep':'#947c4b',
'--text':'#1a212b','--text-ink':'#e9eef5','--muted':'#5a6473','--muted-ink':'#9fb0c4cc',
'--line':'rgba(20,30,45,.1)','--line-ink':'rgba(255,255,255,.1)' } },
{ id:'sage', swatch:['#0f1d18','#52bd8f','#f2f6f1'], vars:{
'--ink':'#0f1d18','--ink-soft':'#16291f','--ink-2':'#1d3829','--cream':'#f2f6f1','--cream-2':'#e6ede4','--paper':'#fbfdfa',
'--gold':'#3f9d77','--gold-bright':'#57c193','--gold-deep':'#2e7d5c',
'--text':'#18241f','--text-ink':'#e9f2ec','--muted':'#566b60','--muted-ink':'#9fc0afcc',
'--line':'rgba(20,45,30,.12)','--line-ink':'rgba(220,255,235,.12)' } }
];
function vtApplyAtmosphere(arr){
const key=JSON.stringify(arr);
const theme=VT_THEMES.find(x=>JSON.stringify(x.swatch)===key) || VT_THEMES[0];
const s=document.documentElement.style;
Object.keys(theme.vars).forEach(k=>s.setProperty(k, theme.vars[k]));
document.documentElement.setAttribute('data-atmosphere', theme.id);
}
/* ---- Voice: rewrites the page's words & personality ---- */
const VT_VOICES = {
editorial: {
eyebrow:'Our values',
title:'What we believe shapes every stitch we make.',
lead:"DreamSHARE isn't a methodology bolted onto good intentions. These commitments are the method — they decide what we map, what we surface, and what we refuse to do.",
creedLabel:'The promise',
creedLine:'We don\u2019t tell you what to do. We help you see what\u2019s already there — and trust you to act on it.',
practice:'How these show up in the room.',
cta:'Values you can see in the work.'
},
bold: {
eyebrow:'What we stand for',
title:'We map what you cannot see.',
lead:"No methodology theater. No filler. We surface the connections that move your vision forward — and refuse the noise that doesn\u2019t.",
creedLabel:'The promise',
creedLine:'We won\u2019t hand you a playbook. We make the invisible visible — then we get out of your way.',
practice:'This is how we work.',
cta:'The proof is in the work.'
},
warm: {
eyebrow:'What guides us',
title:'Your best ideas are already inside you.',
lead:"We\u2019re not here to hand you someone else\u2019s plan. We sit with what you already know, find the threads between it all, and help you see your way forward — in your own words.",
creedLabel:'Our promise to you',
creedLine:'We won\u2019t tell you what to do. We\u2019ll help you see what\u2019s already there — and trust you to take it from here.',
practice:'What it feels like to work with us.',
cta:'Let\u2019s find what\u2019s already there.'
}
};
function vtSet(id, html){ const el=document.getElementById(id); if(el) el.innerHTML=html; }
function vtApplyVoice(key){
const v=VT_VOICES[key]||VT_VOICES.editorial;
vtSet('vEyebrow', v.eyebrow);
vtSet('vTitle', v.title);
vtSet('vLead', v.lead);
vtSet('vCreedLabel', v.creedLabel);
vtSet('vCreedLine', v.creedLine);
vtSet('vPractice', v.practice);
vtSet('vCta', v.cta);
}
const VT_VOICE_OPTS = [
{value:'editorial', label:'Editorial'},
{value:'bold', label:'Bold'},
{value:'warm', label:'Warm'}
];
const VT_COMP_OPTS = [
{value:'balanced', label:'Balanced'},
{value:'grand', label:'Grand'},
{value:'quiet', label:'Quiet'}
];
function ValuesTweaks(){
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
React.useEffect(()=>{ vtApplyAtmosphere(t.atmosphere); }, [t.atmosphere]);
React.useEffect(()=>{ vtApplyVoice(t.voice); }, [t.voice]);
React.useEffect(()=>{ document.documentElement.setAttribute('data-composition', t.composition); }, [t.composition]);
return (
x.swatch)}
onChange={(v)=>setTweak('atmosphere', v)} />
setTweak('voice', v)} />
setTweak('composition', v)} />
);
}
/* Apply persisted values immediately on load (panel may be closed) */
vtApplyAtmosphere(TWEAK_DEFAULTS.atmosphere);
vtApplyVoice(TWEAK_DEFAULTS.voice);
document.documentElement.setAttribute('data-composition', TWEAK_DEFAULTS.composition);
ReactDOM.createRoot(document.getElementById('tweaks-root')).render();