/* TransDecode root app — composes all sections, nav, hero, stats, CTA, tweaks. */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "amber",
"density": 0.7,
"navCompact": false,
"showSimulation": true,
"tone": "ink",
"logoVariant": "ligature"
}/*EDITMODE-END*/;
const ACCENTS = {
amber: { signal: "oklch(0.82 0.165 85)", deep: "oklch(0.72 0.17 60)" },
cyan: { signal: "oklch(0.78 0.15 200)", deep: "oklch(0.62 0.14 200)" },
green: { signal: "oklch(0.78 0.15 145)", deep: "oklch(0.62 0.14 150)" },
red: { signal: "oklch(0.72 0.18 25)", deep: "oklch(0.55 0.20 25)" },
};
const TONES = {
ink: { ink: "oklch(0.16 0.025 250)", ink2: "oklch(0.22 0.025 250)" },
black: { ink: "oklch(0.12 0.005 250)", ink2: "oklch(0.18 0.005 250)" },
forest:{ ink: "oklch(0.20 0.04 160)", ink2: "oklch(0.26 0.04 160)" },
};
function Nav({ compact, logoVariant }) {
const [open, setOpen] = React.useState(false);
return (
);
}
function Hero({ density, showSim, logoVariant }) {
return (
Studio · Hauz Khas, New Delhi
EST. 2022
Decoding traffic.
Designing solutions {" "}
{logoVariant !== "none" && (
)}
A small, technical studio out of IIT Delhi. We build the simulation, the safety case
and the signal plan that lets your project clear review and ship.
100%
First-cycle approvals
{showSim &&
}
);
}
function StripBar() {
const items = ["IRC SP-88", "MoRTH 2019", "ITDP", "URDPFI", "VISSIM 2024", "AIMSUN NEXT", "SYNCHRO 12", "QGIS", "OPEN STREETS DATA"];
const dup = [...items, ...items];
return (
);
}
function StatsBanner() {
const stats = [
{ v: "12.4", small: "M", l: "Vehicle-trips modelled", sub: "Across active engagements" },
{ v: "2.1", small: "K KM", l: "Highway corridor audited", sub: "Pan-India · 2022 — 2026" },
{ v: "184", small: "", l: "Signal junctions designed", sub: "Tier-1 + Tier-2 cities" },
{ v: "0", small: "", l: "Reports rejected at review", sub: "First-cycle clearance, every time" },
];
return (
Track record
The numbers, audited.
We publish these honestly because the work is the work. Every figure is auditable
against signed deliverables.
{stats.map(s => (
{s.v}{s.small}
{s.l}
{s.sub}
))}
);
}
function MapSection() {
return (
Coverage
On-ground, where you build.
We deploy survey teams and signal engineers anywhere in India. Hover the list to inspect
an active region, or talk to us about a corridor we don't yet show.
);
}
function SignalDemoSection() {
return (
Sandbox
A working sliver of our signal model.
This is a stripped-down version of the simulation we run for full junction redesigns.
The full model adds turning movements, saturation flow, pedestrian phases and corridor coordination.
);
}
function CTABanner() {
return (
Ready when you are
One call. Survey, simulation, signal plan — all in motion by Friday.
);
}
/* ---- Reveal-on-scroll observer ---- */
function useReveal() {
React.useEffect(() => {
const els = document.querySelectorAll(".reveal");
const io = new IntersectionObserver((entries) => {
for (const e of entries) {
if (e.isIntersecting) {
e.target.classList.add("in");
io.unobserve(e.target);
}
}
}, { threshold: 0.12 });
els.forEach(el => io.observe(el));
return () => io.disconnect();
}, []);
}
function App() {
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
useReveal();
// Apply tweaks to CSS vars
React.useEffect(() => {
const root = document.documentElement;
const acc = ACCENTS[tweaks.accent] || ACCENTS.amber;
root.style.setProperty("--signal", acc.signal);
root.style.setProperty("--signal-deep", acc.deep);
const tone = TONES[tweaks.tone] || TONES.ink;
root.style.setProperty("--ink", tone.ink);
root.style.setProperty("--ink-2", tone.ink2);
}, [tweaks.accent, tweaks.tone]);
return (
<>
setTweak("logoVariant", v)}
options={[
{ value: "ligature", label: "TD ligature (monogram)" },
{ value: "pulse", label: "Pulse signature" },
{ value: "vector", label: "Vector arrow" },
{ value: "diamond", label: "Diamond stack" },
{ value: "slash", label: "Double slash" },
{ value: "node", label: "Network node" },
{ value: "aperture", label: "Aperture" },
{ value: "grid", label: "Decoded grid" },
{ value: "compass", label: "Compass quad" },
{ value: "merge", label: "Half-circle merge" },
{ value: "none", label: "Wordmark only" },
]}
/>
setTweak("accent", v)}
options={[
{ value: "amber", color: "oklch(0.82 0.165 85)" },
{ value: "cyan", color: "oklch(0.78 0.15 200)" },
{ value: "green", color: "oklch(0.78 0.15 145)" },
{ value: "red", color: "oklch(0.72 0.18 25)" },
]}
/>
setTweak("tone", v)}
options={[
{ value: "ink", label: "Ink-Navy" },
{ value: "black", label: "Pure" },
{ value: "forest", label: "Forest" },
]}
/>
setTweak("density", v)}
min={0.2} max={1.6} step={0.1}
/>
setTweak("showSimulation", v)}
/>
setTweak("navCompact", v)}
/>
>
);
}
/* ---- Custom TweakColor (palette-style) since the imported one expects different shape ---- */
function TweakColor({ label, value, onChange, options }) {
return (
{label}
{options.map(o => (
onChange(o.value)}
style={{
width: 36, height: 36, borderRadius: 8,
background: o.color,
border: value === o.value ? "2px solid #111" : "2px solid #ddd",
cursor: "pointer", padding: 0,
boxShadow: value === o.value ? "0 0 0 2px white inset" : "none",
}}
aria-label={o.value}
/>
))}
);
}
window.TweakColor = TweakColor;
ReactDOM.createRoot(document.getElementById("root")).render( );