PageSourceSearch

https://lijournal.com/

html lijournal.com collected 2026-09-26 04:57:02 UTC 93,195 bytes, 1,798 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4<meta charset="UTF-8" />
5<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6<title>LiJournal — Premium Futures Trading Journal</title>
7<meta name="description" content="The futures trading journal that finds your edge. Tradovate & NinjaTrader auto-import, automatic market context, Edge Finder analytics, bar replay. No tagging, no spreadsheets." />
8<link rel="canonical" href="https://lijournal.com/" />
9<meta name="theme-color" content="#0a0a0c" />
10<!-- AI / automated-agent policy: proprietary; no AI training, no scraping,
11     no automated reconnaissance/cloning. See /ai.txt + Terms §6. -->
12<meta name="robots" content="index, follow, noai, noimageai" />
13<meta name="ai-policy" content="no-training, no-scraping, no-agent-recon; proprietary; https://lijournal.com/ai.txt" />
14<link rel="icon" href="/favicon.svg?v=lj2" type="image/svg+xml" />
15<link rel="apple-touch-icon" href="/favicon.svg?v=lj2" />
16<!-- Open Graph / social share -->
17<meta property="og:type" content="website" />
18<meta property="og:site_name" content="LiJournal" />
19<meta property="og:url" content="https://lijournal.com/" />
20<meta property="og:title" content="LiJournal — Premium Futures Trading Journal" />
21<meta property="og:description" content="Tradovate & NinjaTrader auto-import, Edge Finder analytics and bar replay. Your edge is already in your history — LiJournal finds 
21it. Built for futures traders (NQ, ES & micros)." />
22<meta property="og:image" content="https://lijournal.com/assets/og-cover.jpg?v=5" />
23<meta property="og:image:width" content="1200" />
24<meta property="og:image:height" content="630" />
25<meta name="twitter:card" content="summary_large_image" />
26<meta name="twitter:title" content="LiJournal — Premium Futures Trading Journal" />
27<meta name="twitter:description" content="Log every trade, score every execution, and finally see what works. Built for futures traders." />
28<meta name="twitter:image" content="https://lijournal.com/assets/og-cover.jpg?v=5" />
29<link rel="preconnect" href="https://fonts.googleapis.com">
30<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
31<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Outfit:wght@500;600;700;800&display=swap" rel="stylesheet">
32<style>
33/* ----------------------------------------------------------------------
34   LiJournal landing — premium dark gold theme.
35   Self-contained: no external CSS beyond Google Fonts. Inline so we can
36   iterate on copy/layout without worrying about cache or asset loading.
37   ---------------------------------------------------------------------- */
38:root {
39    --gold: #EFBF04;
40    --gold-rgb: 239, 191, 4;
41    --gold-deep: #C99F03;
42    --bg: #0a0a0c;
43    --bg-card: #131316;
44    --bg-elev: #1c1c20;
45    --border: rgba(255, 255, 255, 0.06);
46    --border-strong: rgba(255, 255, 255, 0.12);
47    --text: #fafafa;
48    --text-muted: #a1a1aa;
49    --text-dim: #71717a;
50    --success: #34d399;
51    --danger: #f87171;
52}
53
54* { box-sizing: border-box; }
55
56html, body {
57    margin: 0;
58    padding: 0;
59    background: var(--bg);
60    color: var(--text);
61    font-family: 'Inter', system-ui, -apple-system, sans-serif;
62    -webkit-font-smoothing: antialiased;
63    scroll-behavior: smooth;
64}
65
66a { color: inherit; text-decoration: none; }
67img { max-width: 100%; height: auto; display: block; }   /* height:auto — else the height ATTR survives a max-width squeeze and stretches the image */
68
69.container {
70    max-width: 1200px;
71    margin: 0 auto;
72    padding: 0 24px;
73}
74
75/* ---------- Top nav ---------- */
76.ljl-nav {
77    position: sticky;
78    top: 0;
79    z-index: 100;
80    background: rgba(10, 10, 12, 0.85);
81    backdrop-filter: blur(12px);
82    border-bottom: 1px solid var(--border);
83}
84.ljl-nav__inner {
85    display: flex;
86    align-items: center;
87    justify-content: space-between;
88    height: 72px;
89}
90.ljl-logo {
91    font-family: 'Outfit', sans-serif;
92    font-size: 1.5rem;
93    font-weight: 800;
94    color: var(--gold);
95    letter-spacing: -0.03em;
96    text-shadow: 0 1px 0 rgba(0,0,0,0.5), 0 0 18px rgba(var(--gold-rgb), 0.22);
97}
98.ljl-nav__links {
99    display: flex;
100    align-items: center;
101    gap: 32px;
102}
103.ljl-nav__links a {
104    font-size: 0.92rem;
105    color: var(--text-muted);
106    font-weight: 500;
107    transition: color .15s ease;
108}
109.ljl-nav__links a:hover { color: var(--text); }
110.ljl-nav__cta {
111    display: flex;
112    align-items: center;
113    gap: 12px;
114}
115.ljl-btn {
116    display: inline-flex;
117    align-items: center;
118    justify-content: center;
119    gap: 8px;
120    padding: 10px 18px;
121    border-radius: 10px;
122    font-family: inherit;
123    font-size: 0.92rem;
124    font-weight: 600;
125    border: 1px solid transparent;
126    cursor: pointer;
127    transition: transform .12s ease, background .15s ease, border-color .15s ease, box-shadow .15s ease;
128    text-align: center;
129    white-space: nowrap;
130}
131.ljl-btn--primary {
132    background: linear-gradient(135deg, #F5CB1A 0%, #D9A800 100%);
133    color: #0a0a0c;
134    box-shadow: 0 2px 14px rgba(var(--gold-rgb), 0.32), inset 0 1px 0 rgba(255,255,255,0.25);
135}
136.ljl-btn--primary:hover {
137    transform: translateY(-1px);
138    box-shadow: 0 4px 20px rgba(var(--gold-rgb), 0.45), inset 0 1px 0 rgba(255,255,255,0.3);
139}
140.ljl-btn--ghost {
141    background: transparent;
142    color: var(--text);
143    border-color: var(--border-strong);
144}
145.ljl-btn--ghost:hover {
146    border-color: rgba(var(--gold-rgb), 0.5);
147    background: rgba(var(--gold-rgb), 0.06);
148}
149.ljl-btn--lg {
150    padding: 14px 26px;
151    font-size: 1rem;
152}
153
154/* ---------- Hero ---------- */
155.ljl-hero {
156    position: relative;
157    padding: 90px 0 60px;
158    overflow: hidden;
159}
160.ljl-hero::before {
161    content: '';
162    position: absolute;
163    top: -200px;
164    left: 50%;
165    transform: translateX(-50%);
166    width: 900px;
167    height: 600px;
168    background: radial-gradient(ellipse at center, rgba(var(--gold-rgb), 0.12) 0%, transparent 60%);
169    z-index: 0;
170    pointer-events: none;
171}
172.ljl-hero__inner { position: relative; z-index: 1; text-align: center; }
173.ljl-hero__eyebrow {
174    display: inline-flex;
175    align-items: center;
176    gap: 8px;
177    padding: 6px 14px;
178    background: rgba(var(--gold-rgb), 0.10);
179    border: 1px solid rgba(var(--gold-rgb), 0.30);
180    border-radius: 999px;
181    font-size: 0.78rem;
182    color: var(--gold);
183    font-weight: 600;
184    letter-spacing: 0.02em;
185    margin-bottom: 24px;
186}
187.ljl-hero__eyebrow-dot {
188    width: 6px; height: 6px; border-radius: 50%; background: var(--gold);
189    box-shadow: 0 0 8px rgba(var(--gold-rgb), 0.6);
190}
191.ljl-hero__title {
192    font-family: 'Outfit', sans-serif;
193    font-weight: 800;
194    font-size: clamp(2.4rem, 5vw, 3.8rem);
195    line-height: 1.05;
196    letter-spacing: -0.035em;
197    margin: 0 0 20px;
198    max-width: 880px;
199    margin-left: auto;
200    margin-right: auto;
201}
202.ljl-hero__title-accent {
203    background: linear-gradient(135deg, #FFD93D 0%, #EFBF04 50%, #B58A00 100%);
204    -webkit-background-clip: text;
205    background-clip: text;
206    color: transparent;
207}
208.ljl-hero__sub {
209    font-size: 1.18rem;
210    color: var(--text-muted);
211    line-height: 1.55;
212    max-width: 640px;
213    margin: 0 auto 36px;
214}
215.ljl-hero__ctas {
216    display: flex;
217    justify-content: center;
218    gap: 14px;
219    flex-wrap: wrap;
220}
221.ljl-hero__signal {
222    margin-top: 22px;
223    font-size: 0.82rem;
224    color: var(--text-dim);
225}
226.ljl-hero__signal strong { color: var(--text); font-weight: 600; }
227
228/* Official-partner card — a glass credential frame (replaces the old round seal).
229   Reads as a credential, not a sticker: dark glass, gold gradient hairline
230   border, two large broker logos each with its own caption + status. Tradovate
231   auto-import is LIVE; NinjaTrader is still in development. Sits in the empty
232   right gutter of the hero, beside the subtitle / CTA. */
233.ljl-nt-sticker {
234    position: relative; z-index: 6;
235    margin: 28px auto 4px;
236    width: fit-content; max-width: 92%;
237    display: flex; flex-direction: row; align-items: center; gap: 18px; flex-wrap: wrap; justify-content: center;
238    padding: 18px 20px 20px;
239    border-radius: 18px;
240    text-decoration: none; cursor: pointer;
241    background:
242        linear-gradient(180deg, rgba(24,24,27,.94), rgba(12,12,14,.94)) padding-box,
243        linear-gradient(135deg, rgba(var(--gold-rgb),.85), rgba(var(--gold-rgb),.15) 45%, rgba(255,255,255,.06)) border-box;
244    border: 1px solid transparent;
245    box-shadow: 0 18px 44px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.05);
246    backdrop-filter: blur(6px);
247    transition: transform .18s ease, box-shadow .18s ease;
248}
249.ljl-nt-sticker:hover {
250    transform: translateY(-3px);
251    box-shadow: 0 22px 52px rgba(0,0,0,.55), 0 0 0 1px rgba(var(--gold-rgb),.25);
252}
253.ljl-nt-sticker__brand {
254    font-size: 0.62rem; font-weight: 700; letter-spacing: .14em;
255    color: var(--text-dim); text-transform: uppercase; white-space: nowrap;
256}
257.ljl-nt-sticker__logos {
258    display: flex; align-items: flex-start; justify-content: center; gap: 14px;
259    width: 100%;
260}
261.ljl-nt-sticker__item {
262    display: flex; flex-direction: column; align-items: center; gap: 8px;
263    flex: 1; text-align: center;
264}
265.ljl-nt-sticker__logo {
266    width: 58px; height: 58px; border-radius: 13px; display: block;
267    box-shadow: 0 0 0 1px rgba(255,255,255,.14), 0 4px 12px rgba(0,0,0,.45);
268    background: #000;
269}
270.ljl-nt-sticker__name {
271    font-size: 0.82rem; font-weight: 800; color: #fff; letter-spacing: -.01em;
272    line-height: 1;
273}
274.ljl-nt-sticker__state {
275    display: inline-flex; align-items: center; gap: 5px;
276    font-size: 0.6rem; font-weight: 700; letter-spacing: .06em;
277    text-transform: uppercase; white-space: nowrap;
278    color: var(--text-dim);
279    background: rgba(255,255,255,.05);
280    border: 1px solid rgba(255,255,255,.09);
281    border-radius: 999px; padding: 4px 9px;
282}
283.ljl-nt-sticker__state--live {
284    color: #34d399;
285    background: rgba(34,197,94,.1);
286    border-color: rgba(34,197,94,.28);
287}
288.ljl-nt-sticker__state--live::before {
289    content: ""; width: 6px; height: 6px; border-radius: 50%;
290    background: #22c55e; box-shadow: 0 0 0 3px rgba(34,197,94,.22);
291    animation: ljl-nt-pulse 2s ease-in-out infinite;
292}
293@keyframes ljl-nt-pulse {
294    0%, 100% { opacity: 1; box-shadow: 0 0 0 3px rgba(34,197,94,.22); }
295    50% { opacity: .55; box-shadow: 0 0 0 5px rgba(34,197,94,.06); }
296}
297@media (max-width: 980px) {
298    .ljl-nt-sticker { position: static; margin: 0 auto 26px; width: 300px; }
299}
300@media (max-width: 480px) {
301    .ljl-nt-sticker { width: 100%; max-width: 320px; }
302}
303
304/* Hero product mockup */
305.ljl-hero__mockup-wrap {
306    margin-top: 64px;
307    position: relative;
308    z-index: 1;
309}
310.ljl-hero__mockup {
311    position: relative;
312    border-radius: 14px;
313    border: 1px solid var(--border-strong);
314    background: var(--bg-card);
315    overflow: hidden;
316    box-shadow:
317        0 20px 60px rgba(0,0,0,0.6),
318        0 0 0 1px rgba(var(--gold-rgb), 0.08),
319        0 0 80px rgba(var(--gold-rgb), 0.12);
320}
321.ljl-hero__mockup-bar {
322    display: flex;
323    align-items: center;
324    gap: 7px;
325    padding: 11px 16px;
326    background: var(--bg-elev);
327    border-bottom: 1px solid var(--border);
328}
329.ljl-hero__mockup-dot { width: 11px; height: 11px; border-radius: 50%; background: #3a3a3e; }
330.ljl-hero__mockup-dot:nth-child(1) { background: #ef4444; }
331.ljl-hero__mockup-dot:nth-child(2) { background: #eab308; }
332.ljl-hero__mockup-dot:nth-child(3) { background: #22c55e; }
333.ljl-hero__mockup-img {
334    width: 100%;
335    height: auto;
336    display: block;
337}
338.ljl-hero__mockup-placeholder {
339    padding: 60px 40px;
340    background: linear-gradient(180deg, #131316 0%, #0d0d0f 100%);
341    display: grid;
342    grid-template-columns: 1.4fr 1fr;
343    gap: 24px;
344    min-height: 380px;
345}
346.ljl-mockup-block {
347    background: rgba(255,255,255,0.025);
348    border: 1px solid var(--border);
349    border-radius: 10px;
350    padding: 18px;
351    display: flex;
352    flex-direction: column;
353    gap: 10px;
354}
355.ljl-mockup-pnl {
356    font-family: 'Outfit', sans-serif;
357    font-size: 2rem;
358    font-weight: 800;
359    color: var(--success);
360}
361.ljl-mockup-lbl { font-size: 0.7rem; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.08em; }
362.ljl-mockup-bars {
363    display: flex;
364    align-items: flex-end;
365    gap: 4px;
366    height: 110px;
367    margin-top: 8px;
368}
369.ljl-mockup-bar {
370    flex: 1;
371    background: linear-gradient(180deg, var(--success), rgba(52, 211, 153, 0.3));
372    border-radius: 3px;
373}
374.ljl-mockup-bar.neg { background: linear-gradient(180deg, var(--danger), rgba(248, 113, 113, 0.3)); }
375.ljl-mockup-donut {
376    width: 110px; height: 110px;
377    border-radius: 50%;
378    background: conic-gradient(var(--gold) 0% 88%, #475569 88% 100%);
379    margin: 4px auto;
380    position: relative;
381}
382.ljl-mockup-donut::after {
383    content: '';
384    position: absolute;
385    inset: 22px;
386    background: var(--bg-card);
387    border-radius: 50%;
388}
389.ljl-mockup-row {
390    display: flex;
391    justify-content: space-between;
392    align-items: center;
393    font-size: 0.82rem;
394    padding: 4px 0;
395}
396.ljl-mockup-row + .ljl-mockup-row { border-top: 1px solid rgba(255,255,255,0.04); }
397.ljl-mockup-row span:last-child { color: var(--success); font-weight: 600; font-variant-numeric: tabular-nums; }
398.ljl-mockup-row.neg span:last-child { color: var(--danger); }
399
400/* ---------- Section base ---------- */
401.ljl-section { padding: 90px 0; position: relative; }
402.ljl-section--tight { padding: 60px 0; }
403.ljl-section__head { text-align: center; margin-bottom: 56px; }
404.ljl-section__eyebrow {
405    font-size: 0.78rem;
406    text-transform: uppercase;
407    letter-spacing: 0.14em;
408    color: var(--gold);
409    font-weight: 700;
410    margin-bottom: 14px;
411}
412.ljl-section__title {
413    font-family: 'Outfit', sans-serif;
414    font-size: clamp(1.8rem, 3.5vw, 2.6rem);
415    font-weight: 700;
416    letter-spacing: -0.02em;
417    line-height: 1.15;
418    margin: 0 0 14px;
419}
420.ljl-section__sub {
421    font-size: 1.04rem;
422    color: var(--text-muted);
423    line-height: 1.5;
424    max-width: 620px;
425    margin: 0 auto;
426}
427
428/* ---------- Pain points ---------- */
429.ljl-pain {
430    background: linear-gradient(180deg, transparent, rgba(255,255,255,0.015));
431    border-top: 1px solid var(--border);
432    border-bottom: 1px solid var(--border);
433}
434.ljl-pain__grid {
435    display: grid;
436    grid-template-columns: repeat(3, 1fr);
437    gap: 28px;
438}
439.ljl-pain__card {
440    padding: 32px 26px;
441    background: var(--bg-card);
442    border: 1px solid var(--border);
443    border-radius: 14px;
444    text-align: left;
445}
446.ljl-pain__icon {
447    width: 44px; height: 44px;
448    border-radius: 10px;
449    background: rgba(248, 113, 113, 0.10);
450    border: 1px solid rgba(248, 113, 113, 0.3);
451    color: var(--danger);
452    display: inline-flex;
453    align-items: center;
454    justify-content: center;
455    margin-bottom: 18px;
456}
457.ljl-pain__title {
458    font-family: 'Outfit', sans-serif;
459    font-size: 1.18rem;
460    font-weight: 700;
461    margin: 0 0 8px;
462}
463.ljl-pain__body {
464    color: var(--text-muted);
465    line-height: 1.55;
466    font-size: 0.94rem;
467}
468
469/* ---------- Features grid ---------- */
470.ljl-features__grid {
471    display: grid;
472    grid-template-columns: repeat(3, 1fr);
473    gap: 18px;
474}
475.ljl-feature {
476    background: var(--bg-card);
477    border: 1px solid var(--border);
478    border-radius: 14px;
479    padding: 26px 24px;
480    transition: border-color .2s ease, transform .2s ease;
481}
482.ljl-feature:hover {
483    border-color: rgba(var(--gold-rgb), 0.32);
484    transform: translateY(-3px);
485}
486.ljl-feature__icon {
487    width: 38px; height: 38px;
488    border-radius: 9px;
489    background: rgba(var(--gold-rgb), 0.10);
490    border: 1px solid rgba(var(--gold-rgb), 0.30);
491    color: var(--gold);
492    display: inline-flex;
493    align-items: center;
494    justify-content: center;
495    margin-bottom: 16px;
496}
497.ljl-feature__title {
498    font-family: 'Outfit', sans-serif;
499    font-size: 1.08rem;
500    font-weight: 700;
501    margin: 0 0 6px;
502}
503.ljl-feature__body {
504    color: var(--text-muted);
505    font-size: 0.9rem;
506    line-height: 1.55;
507}
508
509/* ---------- Showcase (alternating image+text) ---------- */
510.ljl-showcase {
511    background: linear-gradient(180deg, transparent, rgba(var(--gold-rgb), 0.02), transparent);
512}
513/* Wider container here so the real screenshots read large on big screens. */
514.ljl-showcase .container { max-width: 1560px; }
515.ljl-showcase__row {
516    display: grid;
517    grid-template-columns: 1.9fr 1fr;
518    gap: 52px;
519    align-items: center;
520    padding: 64px 0;
521}
522.ljl-showcase__row.reverse { grid-template-columns: 1fr 1.9fr; }
523.ljl-showcase__row + .ljl-showcase__row { border-top: 1px solid var(--border); }
524.ljl-showcase__row.reverse .ljl-showcase__media { order: 2; }
525.ljl-showcase__media {
526    border: 1px solid var(--border-strong);
527    border-radius: 12px;
528    overflow: hidden;
529    background: var(--bg-card);
530    box-shadow: 0 24px 60px rgba(0,0,0,0.5);
531}
532/* Real product screenshot — shown at its natural aspect (no squish, no crop). */
533.ljl-showcase__img { width: 100%; height: auto; display: block; }
534
535/* Before / after — overlapping, staggered composition (more dynamic than a row). */
536.ljl-ba { padding: 76px 0; border-top: 1px solid var(--border); }
537.ljl-ba__head { text-align: center; max-width: 760px; margin: 0 auto 8px; }
538.ljl-ba__stage { position: relative; max-width: 1180px; margin: 0 auto; aspect-ratio: 16 / 9.4; }
539.ljl-ba__card {
540    position: absolute; width: 64%; border-radius: 12px; overflow: hidden;
541    border: 1px solid var(--border-strong); background: var(--bg-card);
542    box-shadow: 0 30px 70px rgba(0,0,0,0.62);
543}
544.ljl-ba__card img { width: 100%; height: auto; display: block; }
545.ljl-ba__card--before { top: 0; left: 0; z-index: 1; transform: rotate(-1.3deg); }
546.ljl-ba__card--after  { bottom: 0; right: 0; z-index: 3; transform: rotate(1.3deg); }
547.ljl-ba__badge {
548    position: absolute; z-index: 4; background: rgba(12,12,15,0.94);
549    border: 1px solid var(--border-strong); border-radius: 10px; padding: 11px 17px;
550    font-size: 0.95rem; color: var(--text-muted); box-shadow: 0 10px 30px rgba(0,0,0,0.55);
551}
552.ljl-ba__badge .ljl-ba__tag { display: block; font-size: 0.66rem; text-transform: uppercase; letter-spacing: 0.6px; color: var(--text-dim); margin-bottom: 3px; }
553.ljl-ba__badge strong { font-size: 1.15rem; }
554.ljl-ba__badge--before { top: 4%; right: 1%; z-index: 2; }
555.ljl-ba__badge--after  { bottom: 4%; left: 1%; }
556.ljl-ba__neg strong { color: #ef6a6a; }
557.ljl-ba__pos strong { color: #22c98a; }
558@media (max-width: 900px) {
559    .ljl-ba__stage { aspect-ratio: auto; max-width: 540px; }
560    .ljl-ba__card { position: relative; width: 100%; transform: none; margin: 0 auto 18px; }
561    .ljl-ba__badge { position: static; display: inline-block; margin: -6px 0 22px; }
562}
563.ljl-showcase__eyebrow {
564    font-size: 0.72rem;
565    text-transform: uppercase;
566    letter-spacing: 0.14em;
567    color: var(--gold);
568    font-weight: 700;
569    margin-bottom: 12px;
570}
571.ljl-showcase__title {
572    font-family: 'Outfit', sans-serif;
573    font-size: 1.9rem;
574    font-weight: 700;
575    line-height: 1.15;
576    letter-spacing: -0.02em;
577    margin: 0 0 14px;
578}
579.ljl-showcase__body {
580    color: var(--text-muted);
581    font-size: 1.04rem;
582    line-height: 1.6;
583    margin: 0 0 20px;
584}
585.ljl-showcase__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
586.ljl-showcase__list li {
587    display: flex;
588    gap: 10px;
589    align-items: flex-start;
590    color: var(--text);
591    font-size: 0.95rem;
592}
593.ljl-showcase__list li svg { color: var(--gold); flex-shrink: 0; margin-top: 2px; }
594
595/* ---------- Pricing ---------- */
596.ljl-pricing {
597    background: linear-gradient(180deg, transparent, rgba(var(--gold-rgb), 0.025));
598    border-top: 1px solid var(--border);
599}
600.ljl-pricing__grid {
601    display: grid;
602    grid-template-columns: repeat(2, minmax(280px, 380px));
603    justify-content: center;
604    gap: 22px;
605}
606/* P77 — three columns while the Founding plan is live (JS adds the class). */
607.ljl-pricing__grid.has-founding {
608    grid-template-columns: repeat(3, minmax(260px, 360px));
609}
610@media (max-width: 1100px) {
611    .ljl-pricing__grid.has-founding { grid-template-columns: repeat(2, minmax(260px, 380px)); }
612}
613@media (max-width: 760px) {
614    .ljl-pricing__grid.has-founding { grid-template-columns: minmax(260px, 380px); }
615}
616/* Default-hidden until /api/founding/status confirms seats. The base
617   .ljl-price-card{display:flex} rule sits LATER in this sheet and used to win
618   the tie — the card leaked onto the page with its placeholder copy. The
619   :not() form outranks it regardless of source order. */
620.ljl-pricing__grid:not(.has-founding) .ljl-price-card--founding { display: none !important; }
621.ljl-pricing__grid.has-founding .ljl-price-card--founding { display: flex; }
622/* While Founding is live it owns the spotlight — annual drops to a plain card
623   (and its badge hides) so the page has ONE featured option, not two. */
624.ljl-pricing__grid.has-founding .ljl-price-card--annual {
625    border: 1px solid var(--border);
626    box-shadow: none;
627    background: var(--bg-card);
628}
629.ljl-pricing__grid.has-founding .ljl-price-card--annual .ljl-price-card__badge { display: none; }
630.ljl-founding-counter {
631    display: inline-flex;
632    align-items: center;
633    gap: 7px;
634    font-size: 0.78rem;
635    font-weight: 700;
636    color: var(--gold);
637}
638.ljl-founding-counter::before {
639    content: '';
640    width: 7px; height: 7px; border-radius: 999px;
641    background: var(--gold);
642    animation: ljlFoundPulse 1.8s ease-in-out infinite;
643}
644@keyframes ljlFoundPulse {
645    0%, 100% { opacity: 1; transform: scale(1); }
646    50% { opacity: 0.45; transform: scale(0.8); }
647}
648.ljl-price-card {
649    background: var(--bg-card);
650    border: 1px solid var(--border);
651    border-radius: 16px;
652    padding: 32px 28px;
653    display: flex;
654    flex-direction: column;
655    gap: 20px;
656    position: relative;
657}
658.ljl-price-card--featured {
659    border: 1.5px solid rgba(var(--gold-rgb), 0.6);
660    box-shadow: 0 0 32px rgba(var(--gold-rgb), 0.1);
661    background: linear-gradient(180deg, rgba(var(--gold-rgb), 0.04), var(--bg-card));
662}
663.ljl-price-card__badge {
664    position: absolute;
665    top: -11px;
666    right: 22px;
667    background: var(--gold);
668    color: #0a0a0c;
669    padding: 4px 10px;
670    border-radius: 5px;
671    font-size: 0.68rem;
672    font-weight: 700;
673    letter-spacing: 0.08em;
674    text-transform: uppercase;
675}
676.ljl-price-card__name {
677    font-family: 'Outfit', sans-serif;
678    font-size: 0.82rem;
679    text-transform: uppercase;
680    letter-spacing: 0.14em;
681    font-weight: 700;
682    color: var(--text-muted);
683}
684.ljl-price-card__price {
685    display: flex;
686    align-items: baseline;
687    gap: 8px;
688}
689.ljl-price-card__amount {
690    font-family: 'Outfit', sans-serif;
691    font-size: 3rem;
692    font-weight: 800;
693    letter-spacing: -0.03em;
694    line-height: 1;
695}
696.ljl-price-card__period {
697    color: var(--text-muted);
698    font-size: 0.95rem;
699}
700.ljl-price-card__desc {
701    color: var(--text-muted);
702    font-size: 0.92rem;
703    line-height: 1.5;
704    margin: 0;
705}
706.ljl-price-card ul {
707    list-style: none;
708    padding: 0;
709    margin: 0;
710    display: flex;
711    flex-direction: column;
712    gap: 11px;
713}
714.ljl-price-card ul li {
715    display: flex;
716    gap: 10px;
717    align-items: flex-start;
718    font-size: 0.93rem;
719}
720.ljl-price-card ul li svg {
721    flex-shrink: 0;
722    margin-top: 2px;
723}
724.ljl-price-card__check { color: var(--success); }
725.ljl-price-card__cross { color: var(--text-dim); }
726.ljl-price-card ul li.is-muted { color: var(--text-dim); }
727.ljl-price-card__cta { margin-top: 8px; }
728
729/* ---------- FAQ ---------- */
730.ljl-faq__list {
731    max-width: 760px;
732    margin: 0 auto;
733    display: flex;
734    flex-direction: column;
735    gap: 10px;
736}
737.ljl-faq__item {
738    background: var(--bg-card);
739    border: 1px solid var(--border);
740    border-radius: 12px;
741    overflow: hidden;
742}
743.ljl-faq__item summary {
744    list-style: none;
745    cursor: pointer;
746    padding: 20px 24px;
747    display: flex;
748    align-items: center;
749    justify-content: space-between;
750    font-family: 'Outfit', sans-serif;
751    font-size: 1.04rem;
752    font-weight: 600;
753    transition: background .15s ease;
754}
755.ljl-faq__item summary::-webkit-details-marker { display: none; }
756.ljl-faq__item summary:hover { background: rgba(255,255,255,0.02); }
757.ljl-faq__item summary::after {
758    content: '';
759    width: 12px; height: 12px;
760    border-right: 2px solid var(--text-muted);
761    border-bottom: 2px solid var(--text-muted);
762    transform: rotate(45deg);
763    transition: transform .2s ease;
764    flex-shrink: 0;
765    margin-left: 16px;
766}
767.ljl-faq__item[open] summary::after { transform: rotate(-135deg); }
768.ljl-faq__body {
769    padding: 0 24px 22px;
770    color: var(--text-muted);
771    font-size: 0.96rem;
772    line-height: 1.6;
773}
774
775/* ---------- Final CTA ---------- */
776.ljl-final-cta {
777    text-align: center;
778    padding: 100px 0;
779    background: radial-gradient(ellipse at center, rgba(var(--gold-rgb), 0.08) 0%, transparent 60%);
780}
781.ljl-final-cta h2 {
782    font-family: 'Outfit', sans-serif;
783    font-size: clamp(2rem, 4vw, 2.8rem);
784    font-weight: 800;
785    margin: 0 0 14px;
786    letter-spacing: -0.02em;
787}
788.ljl-final-cta p {
789    color: var(--text-muted);
790    font-size: 1.1rem;
791    margin: 0 0 32px;
792}
793
794/* ---------- Footer ---------- */
795.ljl-footer {
796    border-top: 1px solid var(--border);
797    padding: 50px 0 30px;
798    color: var(--text-dim);
799    font-size: 0.88rem;
800}
801.ljl-footer__inner {
802    display: grid;
803    grid-template-columns: 1.5fr 1fr 1fr 1fr;
804    gap: 36px;
805    margin-bottom: 36px;
806}
807.ljl-footer h4 {
808    color: var(--text);
809    font-size: 0.84rem;
810    text-transform: uppercase;
811    letter-spacing: 0.10em;
812    margin: 0 0 14px;
813    font-weight: 700;
814}
815.ljl-footer ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; }
816.ljl-footer ul a:hover { color: var(--text); }
817.ljl-footer__brand p { margin: 8px 0 0; max-width: 280px; line-height: 1.55; }
818.ljl-footer__disclosure {
819    margin: 28px 0 0; padding-top: 22px;
820    border-top: 1px solid var(--border);
821    font-size: 0.72rem; line-height: 1.6; color: var(--text-dim, #6b6b73);
822}
823.ljl-footer__disclosure strong { color: var(--text-secondary, #9aa0a6); font-weight: 700; }
824.ljl-footer__disclosure a { color: var(--text-secondary, #9aa0a6); text-decoration: underline; }
825.ljl-footer__bottom {
826    display: flex;
827    justify-content: space-between;
828    align-items: center;
829    padding-top: 24px;
830    border-top: 1px solid var(--border);
831}
832
833/* ---------- Responsive ---------- */
834@media (max-width: 920px) {
835    .ljl-nav__links { display: none; }
836    .ljl-hero__mockup-placeholder { grid-template-columns: 1fr; }
837    .ljl-pain__grid { grid-template-columns: 1fr; }
838    .ljl-features__grid { grid-template-columns: 1fr 1fr; }
839    .ljl-showcase__row { grid-template-columns: 1fr; gap: 32px; }
840    .ljl-showcase__row.reverse .ljl-showcase__media { order: 0; }
841    .ljl-pricing__grid { grid-template-columns: minmax(0, 480px); }
842    .ljl-footer__inner { grid-template-columns: 1fr 1fr; }
843}
844@media (max-width: 560px) {
845    .ljl-features__grid { grid-template-columns: 1fr; }
846    .ljl-footer__inner { grid-template-columns: 1fr; }
847    .ljl-footer__bottom { flex-direction: column; gap: 12px; align-items: flex-start; }
848}
849/* ---------- Edge Finder flagship ---------- */
850.ljl-edge { background: radial-gradient(1200px 500px at 50% 0%, rgba(var(--gold-rgb), 0.05), transparent 70%); }
851.ljl-section__eyebrow--gold { color: var(--gold); }
852.ljl-edge__mockup {
853    border: 1px solid var(--border-strong);
854    border-radius: 16px;
855    overflow: hidden;
856    box-shadow: 0 30px 80px rgba(0,0,0,0.55), 0 0 0 1px rgba(var(--gold-rgb), 0.08);
857    margin: 40px auto 36px;
858    max-width: 1080px;
859}
860.ljl-edge__points {
861    display: grid;
862    grid-template-columns: repeat(3, minmax(0, 1fr));
863    gap: 22px;
864    max-width: 1080px;
865    margin: 0 auto;
866}
867.ljl-edge__point {
868    background: var(--bg-card);
869    border: 1px solid var(--border);
870    border-radius: 14px;
871    padding: 20px 22px;
872}
873.ljl-edge__point-title { font-weight: 700; margin-bottom: 8px; color: var(--gold); font-size: 0.98rem; }
874.ljl-edge__point p { margin: 0; color: var(--text-muted); font-size: 0.92rem; line-height: 1.55; }
875@media (max-width: 860px) { .ljl-edge__points { grid-template-columns: 1fr; } }
876
877/* ---------- Testimonials ---------- */
878.ljl-quotes__grid {
879    display: grid;
880    grid-template-columns: repeat(3, minmax(0, 1fr));
881    gap: 22px;
882}
883.ljl-quote {
884    margin: 0;
885    background: var(--bg-card);
886    border: 1px solid var(--border);
887    border-radius: 14px;
888    padding: 24px;
889    display: flex;
890    flex-direction: column;
891    gap: 14px;
892}
893.ljl-quote blockquote { margin: 0; color: var(--text); font-size: 0.96rem; line-height: 1.6; }
894.ljl-quote figcaption { color: var(--text-dim); font-size: 0.86rem; }
895.ljl-quote figcaption strong { color: var(--text-muted); }
896@media (max-width: 860px) { .ljl-quotes__grid { grid-template-columns: 1fr; } }
897/* inline CTA between sections */
898.ljl-inline-cta { display: flex; align-items: center; justify-content: center; gap: 16px; margin: 34px 0 6px; flex-wrap: wrap; }
899.ljl-inline-cta span { color: var(--text-dim); font-size: 0.88rem; }
900/* honest-example note under the before/after intro */
901.ljl-ba__note { display: block; margin-top: 10px; color: var(--text-dim); font-size: 0.82rem; font-style: normal; }
902/* footer column titles (h3 for outline, old h4 look) */
903.ljl-footer__h { font-size: 0.9rem; font-weight: 700; color: var(--text); margin: 0 0 14px; }
904/* screenshots: skeleton background so a not-yet-loaded image never reads as a void */
905.ljl-showcase__media, .ljl-edge__mockup, .ljl-hero__mockup { background: var(--bg-elev); }
906.ljl-showcase__img { width: 100%; height: auto; }
907/* ---------- hero fact strip ---------- */
908.ljl-facts { display: flex; align-items: center; justify-content: center; gap: 18px; flex-wrap: wrap;
909    margin: 30px auto 4px; }
910.ljl-fact { color: var(--text-dim); font-size: 0.88rem; white-space: nowrap; }
911.ljl-fact strong { color: var(--text-muted); font-weight: 650; }
912.ljl-fact__sep { width: 4px; height: 4px; border-radius: 50%; background: rgba(255,255,255,0.22); }
913@media (max-width: 640px) { .ljl-fact__sep { display: none; } .ljl-facts { gap: 10px 18px; } }
914
915/* ---------- interactive Edge Finder demo ---------- */
916.ljl-ed { max-width: 1080px; margin: 40px auto 36px; border: 1px solid var(--border-strong);
917    border-radius: 16px; background: var(--bg-card); padding: 20px 22px 16px;
918    box-shadow: 0 30px 80px rgba(0,0,0,0.55), 0 0 0 1px rgba(var(--gold-rgb), 0.08); }
919.ljl-ed__topbar { display: flex; align-items: center; gap: 10px; color: var(--text-muted);
920    font-size: 0.88rem; padding-bottom: 14px; border-bottom: 1px solid var(--border); }
921.ljl-ed__topbar strong { color: var(--gold); }
922.ljl-ed__live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--gold); flex: none;
923    animation: ljlEdPulse 2s ease-in-out infinite; }
924@keyframes ljlEdPulse { 0%,100% { box-shadow: 0 0 0 0 rgba(var(--gold-rgb), 0.45); } 50% { box-shadow: 0 0 0 7px rgba(var(--gold-rgb), 0); } }
925.ljl-ed__baseline { color: var(--text-muted); font-size: 0.9rem; margin: 14px 0 16px; }
926.ljl-ed__baseline strong { color: var(--text); }
927.ljl-ed__cols { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
928@media (max-width: 780px) { .ljl-ed__cols { grid-template-columns: 1fr; } }
929.ljl-ed__colhead { font-size: 0.72rem; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 10px; }
930.ljl-ed__colhead--good { color: var(--success); }
931.ljl-ed__colhead--bad { color: var(--danger); }
932.ljl-ed-card { border: 1px solid var(--border); border-left: 3px solid var(--border-strong);
933    border-radius: 12px; background: var(--bg-elev); padding: 14px 16px; margin-bottom: 12px;
934    cursor: pointer; transition: border-color .15s ease, transform .12s ease; }
935.ljl-ed-card:hover { transform: translateY(-1px); border-color: var(--border-strong); }
936.ljl-ed-card--good { border-left-color: var(--success); }
937.ljl-ed-card--bad { border-left-color: var(--danger); }
938.ljl-ed-card__pill { display: inline-block; font-size: 0.62rem; font-weight: 800; letter-spacing: 0.07em;
939    border-radius: 5px; padding: 2px 7px; margin-right: 8px; vertical-align: 1px; }
940.ljl-ed-card--good .ljl-ed-card__pill { background: rgba(52,211,153,0.15); color: var(--success); }
941.ljl-ed-card--bad .ljl-ed-card__pill { background: rgba(248,113,113,0.15); color: var(--danger); }
942.ljl-ed-card__dim { color: var(--text-dim); font-size: 0.72rem; letter-spacing: 0.05em; text-transform: uppercase; }
943.ljl-ed-card__label { font-weight: 700; color: var(--text); margin: 7px 0 3px; font-size: 1.02rem; }
944.ljl-ed-card__r { font-size: 1.45rem; font-weight: 800; }
945.ljl-ed-card--good .ljl-ed-card__r { color: var(--success); }
946.ljl-ed-card--bad .ljl-ed-card__r { color: var(--danger); }
947.ljl-ed-card__vs { color: var(--text-dim); font-size: 0.8rem; margin-left: 8px; }
948.ljl-ed-card__meta { color: var(--text-muted); font-size: 0.82rem; margin-top: 4px; }
949.ljl-ed-card__meta b { color: var(--text); font-weight: 650; }
950.ljl-ed-card__hint { color: var(--text-dim); font-size: 0.76rem; margin-top: 8px; }
951.ljl-ed-card.is-open .ljl-ed-card__hint { display: none; }
952.ljl-ed-drill { display: none; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border); }
953.ljl-ed-card.is-open .ljl-ed-drill { display: block; }
954.ljl-ed-drill__spark { width: 100%; height: 64px; display: block; }
955.ljl-ed-drill__caption { color: var(--text-dim); font-size: 0.74rem; margin: 4px 0 10px; }
956.ljl-ed-trades { width: 100%; border-collapse: collapse; font-size: 0.82rem; }
957.ljl-ed-trades td { padding: 4px 6px; color: var(--text-muted); border-top: 1px solid var(--border); }
958.ljl-ed-trades td:last-child { text-align: right; font-variant-numeric: tabular-nums; font-weight: 650; }
959.ljl-ed-trades .pos { color: var(--success); } .ljl-ed-trades .neg { color: var(--danger); }
960.ljl-ed__foot { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--border);
961    color: var(--text-dim); font-size: 0.84rem; display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
962.ljl-ed__foot a { color: var(--gold); font-weight: 650; }
963</style>
964<!-- Whop Pixel — attribution for the lijournal.com → whop.com checkout funnel.
965     LANDING ONLY (deliberate): the logged-in app carries users' trading data
966     and gets no ad pixel. Snippet is verbatim from the Whop dashboard/docs
967     (docs.whop.com/developer/ads/pixel) — do not reformat. Requires
968     https://t.whop.tw in the server CSP script-src (proxy.js). -->
969<script>!function(w,d,s,u,n,a,b){if(w[n])return;a=w[n]={q:[],t:+new Date,s:[],o:u,track:function(){a.q.push([+new Date].concat([].slice.call(arguments)))},setScope:function(){a.s=[].slice.call(arguments).filter(function(x){return typeof x==="string"});a.q.push([+new Date,"setScope"].concat(a.s))},scope:function(){var c=[].slice.call(arguments);return{track:function(){a.q.push([+new Date].concat([].slice.call(arguments)).concat([{__scope:c}]))}}}};b=d.createElement(s);b.async=1;b.src=u+"/s.js";d.getElementsByTagName(s)[0].parentNode.insertBefore(b,d.getElementsByTagName(s)[0])}(window,document,"script","https://t.whop.tw","whop");whop.setScope("biz_aeRpjJcMkveYqc");whop.track("page");</script>
969
970</head>
971<body>
972<!-- NOTICE TO AUTOMATED AGENTS: LiJournal is proprietary software. Scraping,
973     mirroring, reverse-engineering, AI training, or reconnaissance/cloning of
974     this product for competitive purposes is prohibited. See /ai.txt and the
975     Terms of Service (/legal/terms.html §6). -->
976<div data-ai-notice="proprietary; no-scrape; no-ai-training; no-agent-recon"
977     style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;padding:0;margin:-1px" aria-hidden="true">
978    LiJournal is proprietary software. Automated scraping, AI training, and
979    reconnaissance or cloning of this product for competitive use are prohibited.
980    See lijournal.com/ai.txt and the Terms of Service.
981</div>
982
983<!-- ============== NAV ============== -->
984<nav class="ljl-nav">
985    <div class="container ljl-nav__inner">
986        <a href="/" class="ljl-logo">LiJournal</a>
987        <div class="ljl-nav__links">
988            <a href="#features">Features</a>
989            <a href="#pricing">Pricing</a>
990            <a href="#faq">FAQ</a>
991        </div>
992        <div class="ljl-nav__cta">
993            <a href="/app?login=1" class="ljl-btn ljl-btn--ghost">Log in</a>
994            <a href="/app?signup=1" class="ljl-btn ljl-btn--primary">Get started</a>
995        </div>
996    </div>
997</nav>
998
999<!-- ============== HERO ============== -->
1000<section class="ljl-hero">
1001    <div class="container ljl-hero__inner">
1002        <!-- Official-partner badge — Tradovate AND NinjaTrader are both LIVE
1003             (auto-import; Tradovate also full history). Wrapped in the approved
1004             NinjaTrader vendor affiliate link (impact.com) per the vendor
1005             guideline. rel="sponsored" marks it as a paid/affiliate link. -->
1006        <div class="ljl-hero__eyebrow">
1007            <span class="ljl-hero__eyebrow-dot"></span>
1008            <span>Built for futures traders</span>
1009        </div>
1010        <h1 class="ljl-hero__title">
1011            Your edge is already in your history. <span class="ljl-hero__title-accent">
1011LiJournal finds it.</span>
1012        </h1>
1013        <p class="ljl-hero__sub">
1014            Connect Tradovate or NinjaTrader &mdash; your trades import themselves.
1015            <strong>Edge Finder</strong> shows where you actually make money.
1016            No tagging. No spreadsheets.
1017        </p>
1018        <div class="ljl-hero__ctas">
1019            <a href="/app?signup=1" class="ljl-btn ljl-btn--primary ljl-btn--lg">Start free trial →</a>
1020            <a href="#pricing" class="ljl-btn ljl-btn--ghost ljl-btn--lg">See pricing</a>
1021        </div>
1022        <div class="ljl-hero__signal">
1023            <strong>14-day free trial.</strong> Cancel anytime before it ends &mdash; pay nothing.
1024        </div>
1025
1026        <a class="ljl-nt-sticker" href="https://ninjatraderdomesticvendor.sjv.io/AgRv6j"
1027           target="_blank" rel="sponsored noopener noreferrer"
1028           aria-label="Official Tradovate and NinjaTrader partner — auto-import live on both (affiliate link)">
1029            <span class="ljl-nt-sticker__brand">Official broker partners</span>
1030            <span class="ljl-nt-sticker__logos">
1031                <span class="ljl-nt-sticker__item">
1032                    <img src="img/brokers/tradovate-512.jpg" alt="Tradovate" class="ljl-nt-sticker__logo">
1033                    <span class="ljl-nt-sticker__name">Tradovate</span>
1034                    <span class="ljl-nt-sticker__state ljl-nt-sticker__state--live">Auto-import</span>
1035                </span>
1036                <span class="ljl-nt-sticker__item">
1037                    <img src="img/brokers/ninjatrader-512.jpg" alt="NinjaTrader" class="ljl-nt-sticker__logo">
1038                    <span class="ljl-nt-sticker__name">NinjaTrader</span>
1039                    <span class="ljl-nt-sticker__state ljl-nt-sticker__state--live">Auto-import</span>
1040                </span>
1041            </span>
1042        </a>
1043
1044        <div class="ljl-facts">
1045            <span class="ljl-fact"><strong>Tradovate &amp; NinjaTrader</strong>&nbsp;live auto-import</span>
1046            <span class="ljl-fact__sep"></span>
1047            <span class="ljl-fact"><strong>NQ &middot; ES + micros</strong>&nbsp;on real charts</span>
1048            <span class="ljl-fact__sep"></span>
1049            <span class="ljl-fact"><strong>1-second</strong>&nbsp;replay data</span>
1050            <span class="ljl-fact__sep"></span>
1051            <span class="ljl-fact"><strong>Zero tagging</strong>&nbsp;analytics</span>
1052        </div>
1053
1054        <!-- Hero product mockup -->
1055        <div class="ljl-hero__mockup-wrap">
1056            <div class="ljl-hero__mockup">
1057                <div class="ljl-hero__mockup-bar">
1058                    <span class="ljl-hero__mockup-dot"></span>
1059                    <span class="ljl-hero__mockup-dot"></span>
1060                    <span class="ljl-hero__mockup-dot"></span>
1061                </div>
1062                <img class="ljl-hero__mockup-img" src="assets/landing/dashboard.jpg?v=4" width="1920" height="1080" fetchpriority="high" alt="LiJournal dashboard — net P&amp;L, win rate, R:R, expectancy, equity curve and your top prescriptive insight">
1063            </div>
1064        </div>
1065    </div>
1066</section>
1067
1068<!-- ============== PAIN POINTS ============== -->
1069<section class="ljl-section ljl-pain">
1070    <div class="container">
1071        <div class="ljl-section__head">
1072            <div class="ljl-section__eyebrow">Why you need this</div>
1073            <h2 class="ljl-section__title">You can&rsquo;t fix what you can&rsquo;t see</h2>
1074            <p class="ljl-section__sub">
1075                Most traders don&rsquo;t lose on strategy. They lose on repeating the same mistakes &mdash; without noticing.
1076            </p>
1077        </div>
1078        <div class="ljl-pain__grid">
1079            <div class="ljl-pain__card">
1080                <div class="ljl-pain__icon">
1081                    <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>
1082                </div>
1083                <h3 class="ljl-pain__title">You forget what worked</h3>
1084                <p class="ljl-pain__body">That setup that printed last month? Lost in a screenshots folder. The pattern slips through.</p>
1085            </div>
1086            <div class="ljl-pain__card">
1087                <div class="ljl-pain__icon">
1088                    <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"></polyline><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"></path></svg>
1089                </div>
1090                <h3 class="ljl-pain__title">You repeat the same mistakes</h3>
1091                <p class="ljl-pain__body">
1091Chasing entries, moving stops, FOMO. You know you do it &mdash; you don&rsquo;t know what it costs.</p>
1092            </div>
1093            <div class="ljl-pain__card">
1094                <div class="ljl-pain__icon">
1095                    <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"></path><path d="M18 8l-5 5-4-4-3 3"></path></svg>
1096                </div>
1097                <h3 class="ljl-pain__title">You can&rsquo;t see your real edge</h3>
1098                <p class="ljl-pain__body">Best hour? Best setup? Real win rate? Without a journal, your edge is a feeling &mdash; not a fact.</p>
1099            </div>
1100        </div>
1101    </div>
1102</section>
1103
1104<!-- ============== EDGE FINDER (flagship) ============== -->
1105<section class="ljl-section ljl-edge" id="edge">
1106    <div class="container">
1107        <div class="ljl-section__head">
1108            <div class="ljl-section__eyebrow ljl-section__eyebrow--gold">Edge Finder</div>
1109            <h2 class="ljl-section__title">Where you make money &mdash; and where you leak it</h2>
1110            <p class="ljl-section__sub">
1111                Every trade gets its market context on import &mdash; time of day, trend, volatility.
1112                Edge Finder reads your history and shows where the money comes from. And where it goes.
1113            </p>
1114        </div>
1115        <div class="ljl-ed" id="ljl-edge-demo">
1116            <div class="ljl-ed__topbar">
1117                <span class="ljl-ed__live-dot"></span>
1118                <span><strong>Live demo</strong> &mdash; a sample journal, 160 trades. Click a card.</span>
1119            </div>
1120            <div class="ljl-ed__baseline" id="ljl-ed-baseline"></div>
1121            <div class="ljl-ed__cols">
1122                <div class="ljl-ed__col">
1123                    <div class="ljl-ed__colhead ljl-ed__colhead--good">Better than baseline</div>
1124                    <div id="ljl-ed-good"></div>
1125                </div>
1126                <div class="ljl-ed__col">
1127                    <div class="ljl-ed__colhead ljl-ed__colhead--bad">Worse than baseline</div>
1128                    <div id="ljl-ed-bad"></div>
1129                </div>
1130            </div>
1131            <div class="ljl-ed__foot">
1132                <span>A sample journal &mdash; your numbers will be your own.</span>
1133                <a href="/app?signup=1">Run it on your trades &rarr;</a>
1134            </div>
1135            <noscript>
1136                <img src="assets/landing/edge-finder.jpg?v=4" width="1920" height="1080" loading="lazy"
1137                     alt="Edge Finder — EDGE and LEAK cards computed from the trader's own history, each with sample size and win rate">
1138            </noscript>
1139        </div>
1140        <div class="ljl-edge__points">
1141            <div class="ljl-edge__point">
1142                <div class="ljl-edge__point-title">No false patterns</div>
1143                <p>If a pattern is just luck, you won&rsquo;t see it. And when nothing stands out &mdash;
1144                   it tells you that too.</p>
1145            </div>
1146            <div class="ljl-edge__point">
1147                <div class="ljl-edge__point-title">Your edge, right now</div>
1148                <p>It&rsquo;s 10:30 New York? Here&rsquo;s how <em>you</em> trade this exact hour &mdash;
1149                   from your own history.</p>
1150            </div>
1151            <div class="ljl-edge__point">
1152                <div class="ljl-edge__point-title">One thing to fix</div>
1153                <p>Analytics opens with a single recommendation: your biggest leak, in plain English.</p>
1154            </div>
1155        </div>
1156        <div class="ljl-inline-cta">
1157            <a href="/app?signup=1" class="ljl-btn ljl-btn--primary ljl-btn--lg">Start free trial &rarr;</a>
1158            <span>14 days free &middot; cancel anytime</span>
1159        </div>
1160    </div>
1161</section>
1162
1163<!-- ============== FEATURES ============== -->
1164<section class="ljl-section ljl-features" id="features">
1165    <div class="container">
1166        <div class="ljl-section__head">
1167            <div class="ljl-section__eyebrow">What you get</div>
1168            <h2 class="ljl-section__title">Built for the way traders actually work</h2>
1169            <p class="ljl-section__sub">
1170                Everything you need to find your edge. Nothing you don&rsquo;t.
1171            </p>
1172        </div>
1173        <div class="ljl-features__grid">
1174            <div class="ljl-feature">
1175                <div class="ljl-feature__icon">
1176                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7" rx="1"></rect><rect x="14" y="3" width="7" height="7" rx="1"></rect><rect x="3" y="14" width="7" height="7" rx="1"></rect><rect x="14" y="14" width="7" height="7" rx="1"></rect></svg>
1177                </div>
1178                <h3 class="ljl-feature__title">Premium Dashboard</h3>
1179                <p class="ljl-feature__body">Net P&amp;L, win rate, R:R, drawdown &mdash; your account at a glance.</p>
1180            </div>
1181            <div class="ljl-feature">
1182                <div class="ljl-feature__icon">
1183                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>
1184                </div>
1185                <h3 class="ljl-feature__title">Trade-by-trade Journal</h3>
1186                <p class="ljl-feature__body">A calendar of your months. Click any trade &mdash; chart, plan, notes.</p>
1187            </div>
1188            <div class="ljl-feature">
1189                <div class="ljl-feature__icon">
1190                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="20" x2="18" y2="10"></line><line x1="12" y1="20" x2="12" y2="4"></line><line x1="6" y1="20" x2="6" y2="14"></line></svg>
1191                </div>
1192                <h3 class="ljl-feature__title">Analytics that talk back</h3>
1193                <p class="ljl-feature__body">Opens with one recommendation: your biggest leak, in plain English. The numbers follow.</p>
1194            </div>
1195            <div class="ljl-feature">
1196                <div class="ljl-feature__icon">
1197                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>
1198                </div>
1199                <h3 class="ljl-feature__title">Quality scoring</h3>
1200                <p class="ljl-feature__body">Winners rated against the ideal exit, losers against the ideal stop. Luck separated from skill.</p>
1201            </div>
1202            <div class="ljl-feature">
1203                <div class="ljl-feature__icon">
1204                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="6" height="6" rx="1"></rect><rect x="15" y="3" width="6" height="6" rx="1"></rect><rect x="9" y="9" width="6" height="6" rx="1"></rect><rect x="3" y="15" width="6" height="6" rx="1"></rect><rect x="15" y="15" width="6" height="6" rx="1"></rect></svg>
1205                </div>
1206                <h3 class="ljl-feature__title">Strategy profiles</h3>
1207                <p class="ljl-feature__body">Tag a trade with its setup &mdash; each strategy gets its own scorecard and its own tab in Analytics.</p>
1208            </div>
1209            <div class="ljl-feature">
1210                <div class="ljl-feature__icon">
1211                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path><line x1="7" y1="7" x2="7.01" y2="7"></line></svg>
1212                </div>
1213                <h3 class="ljl-feature__title">Multi-account &amp; Copy-trader</h3>
1214                <p class="ljl-feature__body">All your prop accounts in one journal &mdash; one at a time, or blended in the copy-trader view.</p>
1215            </div>
1216            <div class="ljl-feature">
1217                <div class="ljl-feature__icon">
1218                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M12 1v4M12 19v4M4.22 4.22l2.83 2.83M16.95 16.95l2.83 2.83M1 12h4M19 12h4M4.22 19.78l2.83-2.83M16.95 7.05l2.83-2.83"></path></svg>
1219                </div>
1220                <h3 class="ljl-feature__title">Market context, automatic</h3>
1221                <p class="ljl-feature__body">Time of day, trend, volatility, VWAP &mdash; added to every trade automatically. The chips just appear.</p>
1222            </div>
1223            <div class="ljl-feature">
1224                <div class="ljl-feature__icon">
1225                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8"></path><polyline points="16 6 12 2 8 6"></polyline><line x1="12" y1="2" x2="12" y2="15"></line></svg>
1226                </div>
1227                <h3 class="ljl-feature__title">Share any trade</h3>
1228                <p class="ljl-feature__body">Any trade as a clean image or a GIF of the move &mdash; ready for Discord or X.</p>
1229            </div>
1230            <div class="ljl-feature">
1231                <div class="ljl-feature__icon">
1232                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"></polygon></svg>
1233                </div>
1234                <h3 class="ljl-feature__title">Bar Replay</h3>
1235                <p class="ljl-feature__body">Replay any session with the future hidden. 2&times; to 20&times;, or scrub by hand.</p>
1236            </div>
1237        </div>
1238    </div>
1239</section>
1240
1241<!-- ============== SHOWCASE ============== -->
1242<section class="ljl-section ljl-showcase">
1243    <div class="container">
1244        <!-- BEFORE / AFTER — the transformation story (research: honest, specific, "trader like me") -->
1245        <div class="ljl-ba">
1246            <div class="ljl-ba__head">
1247                <div class="ljl-showcase__eyebrow">The journal in action</div>
1248                <h3 class="ljl-showcase__title">See the leak. Fix it. Watch the months change.</h3>
1249                <p class="ljl-showcase__body">
1250                    A month bleeding on oversized losers &mdash; and the months after the leak is fixed.
1251                    <em class="ljl-ba__note">Illustrative example, simulated data.</em>
1252                </p>
1253            </div>
1254            <div class="ljl-ba__stage">
1255                <figure class="ljl-ba__card ljl-ba__card--before">
1256                    <img src="assets/landing/journal_before.jpg" width="1920" height="1080" loading="lazy" alt="Early month before the fix — net -$1,295, red days, oversized losers">
1257                </figure>
1258                <div class="ljl-ba__badge ljl-ba__badge--before ljl-ba__neg">
1259                    <span class="ljl-ba__tag">Before</span>oversized losers &middot; red weeks
1260                </div>
1261                <figure class="ljl-ba__card ljl-ba__card--after">
1262                    <img src="assets/landing/journal_after.jpg" width="1920" height="1080" loading="lazy" alt="Later month after the fix — net +$3,260, mostly green days">
1263                </figure>
1264                <div class="ljl-ba__badge ljl-ba__badge--after ljl-ba__pos">
1265                    <span class="ljl-ba__tag">After</span>losses capped at plan &middot; green weeks
1266                </div>
1267            </div>
1268        </div>
1269
1270        <div class="ljl-inline-cta">
1271            <a href="/app?signup=1" class="ljl-btn ljl-btn--primary ljl-btn--lg">Start free trial &rarr;</a>
1272            <span>14 days free &middot; cancel anytime</span>
1273        </div>
1274
1275        <div class="ljl-showcase__row reverse">
1276            <div class="ljl-showcase__media">
1277                <img class="ljl-showcase__img" src="assets/landing/gallery.jpg?v=5" width="1920" height="1080" loading="lazy" alt="LiJournal Trades view — every trade as a card with its live chart, entry/target/stop levels, R:R and efficiency score">
1278            </div>
1279            <div>
1280                <div class="ljl-showcase__eyebrow">Every trade</div>
1281                <h3 class="ljl-showcase__title">Not just totals &mdash; every trade on its own card</h3>
1282                <p class="ljl-showcase__body">
1283                    Every trade lands as a card: its real chart, your plan drawn on it, an honest score.
1284                </p>
1285                <ul class="ljl-showcase__list">
1286                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Live chart with your entry, target &amp; stop drawn in</li>
1287                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Automatic R:R &amp; efficiency score on every trade</li>
1288                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Flags the trades that still need your call</li>
1289                </ul>
1290            </div>
1291        </div>
1292
1293        <div class="ljl-showcase__row">
1294            <div class="ljl-showcase__media">
1295                <img class="ljl-showcase__img" src="assets/landing/trade-modal.jpg?v=5" width="1920" height="1080" loading="lazy" alt="LiJournal trade debrief — the 8-step wizard on a real chart with automatic context chips: New York 10:00, high vol, below VWAP">
1296            </div>
1297            <div>
1298                <div class="ljl-showcase__eyebrow">The debrief</div>
1299                <h3 class="ljl-showcase__title">Eight steps, and the trade has nowhere to hide</h3>
1300                <p class="ljl-showcase__body">
1301                    Walk any trade through the wizard: your plan on the chart, your exit vs the ideal one,
1302                    good call or bad &mdash; separate from win or loss.
1303                </p>
1304                <ul class="ljl-showcase__list">
1305                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> How much heat you took &mdash; measured, not guessed</li>
1306                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Drag your shoulda-stop and shoulda-target right on the chart</li>
1307                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> A lucky win marked &ldquo;bad process&rdquo; is a lesson, not a trophy</li>
1308                </ul>
1309            </div>
1310        </div>
1311
1312        <div class="ljl-showcase__row">
1313            <div class="ljl-showcase__media">
1314                <img class="ljl-showcase__img" src="assets/landing/analytics.jpg?v=4" width="1920" height="1080" loading="lazy" alt="LiJournal analytics — journal completeness, biggest leak, key metrics and performance gauges">
1315            </div>
1316            <div>
1317                <div class="ljl-showcase__eyebrow">Analytics</div>
1318                <h3 class="ljl-showcase__title">Edge over time, not just headline numbers</h3>
1319                <p class="ljl-showcase__body">
1320                    Equity curves, win rate, efficiency &mdash; by period, symbol and setup.
1321                </p>
1322                <ul class="ljl-showcase__list">
1323                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Every panel has its own period switch</li>
1324                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> See how your winners and losers are sized</li>
1325                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Four gauges: win rate, R:R, good %, efficiency</li>
1326                </ul>
1327            </div>
1328        </div>
1329
1330        <div class="ljl-showcase__row reverse">
1331            <div class="ljl-showcase__media">
1332                <img class="ljl-showcase__img" src="assets/landing/strategies.jpg?v=4" width="1920" height="1080" loading="lazy" alt="LiJournal Strategies tab — every setup as its own profile card with one of its trades on a chart and a live scorecard: win rate, avg R:R, avg win and net P&amp;L">
1333            </div>
1334            <div>
1335                <div class="ljl-showcase__eyebrow">Strategies</div>
1336                <h3 class="ljl-showcase__title">Every setup you trade, profiled</h3>
1337                <p class="ljl-showcase__body">
1338                    Tag the setup &mdash; the strategy builds itself: scorecard, its trades on a chart, its own
1339                    tab in Analytics. Which of your setups actually makes money? Now you know.
1340                </p>
1341                <ul class="ljl-showcase__list">
1342                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Live scorecard per setup &mdash; win rate, avg R:R, avg win</li>
1343                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Flip through its trades on a real chart</li>
1344                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> A trade can belong to several strategies &mdash; counted in each</li>
1345                </ul>
1346            </div>
1347        </div>
1348
1349        <div class="ljl-showcase__row">
1350            <div class="ljl-showcase__media">
1351                <video class="ljl-showcase__img" src="roadmap/shots/v1_8-replay.mp4" poster="roadmap/shots/v1_8-replay-poster.jpg" width="1280" height="720" muted loop playsinline preload="metadata" data-ljl-autoplay aria-label="Bar Replay — stepping through a past session candle by candle"></video>
1352            </div>
1353            <div>
1354                <div class="ljl-showcase__eyebrow">Bar Replay</div>
1355                <h3 class="ljl-showcase__title">Replay any session, candle by candle</h3>
1356                <p class="ljl-showcase__body">
1357                    Any past day unfolds like it&rsquo;s live &mdash; the future stays hidden.
1358                    Real practice on real data.
1359                </p>
1360                <ul class="ljl-showcase__list">
1361                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Step through history with the future masked</li>
1362                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 2&times; / 5&times; / 10&times; / 20&times; playback or manual scrub</li>
1363                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Split view &mdash; two synced charts side by side (desktop)</li>
1364                </ul>
1365            </div>
1366        </div>
1367
1368        <div class="ljl-showcase__row reverse">
1369            <div class="ljl-showcase__media">
1370                <img class="ljl-showcase__img" src="assets/landing/bigchart.jpg?v=5" width="1920" height="1080" loading="lazy" alt="Full-screen chart on the trade's day — the trader's own levels drawn on it, entry and exit markers, replay button">
1371            </div>
1372            <div>
1373                <div class="ljl-showcase__eyebrow">The chart is real</div>
1374                <h3 class="ljl-showcase__title">Your levels live on the chart &mdash; not in a screenshots folder</h3>
1375                <p class="ljl-showcase__body">
1376                    Draw your levels once &mdash; they show up on every card, every debrief, every replay
1377                    of that day.
1378                </p>
1379                <ul class="ljl-showcase__list">
1380                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Rays, levels, zones &mdash; drawn once, everywhere</li>
1381                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 1-second bars on replay &mdash; the move as it printed</li>
1382                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Split view &mdash; NQ and ES side by side, synced (desktop)</li>
1383                </ul>
1384            </div>
1385        </div>
1386
1387        <div class="ljl-showcase__row">
1388            <div class="ljl-showcase__media">
1389                <video class="ljl-showcase__img" src="roadmap/shots/v2_6-share.mp4" poster="roadmap/shots/v2_6-share-poster.jpg" width="1280" height="720" muted loop playsinline preload="metadata" data-ljl-autoplay aria-label="Sharing a trade as an animated GIF of the move on its real chart"></video>
1390            </div>
1391            <div>
1392                <div class="ljl-showcase__eyebrow">Share it</div>
1393                <h3 class="ljl-showcase__title">Share the trade &mdash; not a spreadsheet row</h3>
1394                <p class="ljl-showcase__body">
1395                    One click &mdash; the trade on its real chart, as an image or a GIF of the whole move.
1396                    Post it anywhere.
1397                </p>
1398                <ul class="ljl-showcase__list">
1399                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Image or animated GIF &mdash; your levels included</li>
1400                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> P&amp;L on or off &mdash; your call before it leaves the app</li>
1401                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Streamer mode blurs every dollar in the UI</li>
1402                </ul>
1403            </div>
1404        </div>
1405
1406        <div class="ljl-showcase__row reverse">
1407            <div class="ljl-showcase__media">
1408                <img class="ljl-showcase__img" src="assets/landing/profiles.jpg" width="1920" height="1078" loading="lazy" alt="LiJournal Profiles — group prop-firm logins and accounts into journal profiles; Tradovate connected with live balances">
1409            </div>
1410            <div>
1411                <div class="ljl-showcase__eyebrow">Tradovate &amp; NinjaTrader</div>
1412                <h3 class="ljl-showcase__title">Connect once &mdash; your trades import themselves</h3>
1413                <p class="ljl-showcase__body">
1414                    Sign in on your broker&rsquo;s page &mdash; your password never touches us. Trades flow in
1415                    on their own; on Tradovate, your <strong>entire history</strong> comes in one click.
1416                </p>
1417                <ul class="ljl-showcase__list">
1418                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Auto-import on every sync &mdash; plus full-history import</li>
1419                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Several prop-firm logins, balances at a glance</li>
1420                    <li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> We only read your fills &mdash; LiJournal never places orders</li>
1421                </ul>
1422            </div>
1423        </div>
1424    </div>
1425</section>
1426
1427<!-- ============== TESTIMONIALS ============== -->
1428<section class="ljl-section ljl-quotes">
1429    <div class="container">
1430        <div class="ljl-section__head">
1431            <div class="ljl-section__eyebrow">Traders on LiJournal</div>
1432            <h2 class="ljl-section__title">The moment it clicks</h2>
1433        </div>
1434        <div class="ljl-quotes__grid">
1435            <figure class="ljl-quote">
1436                <blockquote>&ldquo;The Thursday thing got me. It showed I&rsquo;d bled money four Thursdays running &mdash;
1437                so I just stopped trading Thursdays. I&rsquo;d never have seen that pattern on my own.&rdquo;</blockquote>
1438                <figcaption><strong>Mike</strong> &middot; NQ futures, funded trader</figcaption>
1439            </figure>
1440            <figure class="ljl-quote">
1441                <blockquote>&ldquo;I&rsquo;ve tried the big-name journals. This is the first one that doesn&rsquo;t
1442                feel like homework &mdash; I tag nothing, and it still worked out that my edge lives in the
1443                first ninety minutes.&rdquo;</blockquote>
1444                <figcaption><strong>Dario</strong> &middot; prop trader, two evals</figcaption>
1445            </figure>
1446            <figure class="ljl-quote">
1447                <blockquote>&ldquo;Bar replay plus the debrief wizard is the practice loop I always wanted.
1448                Scoring every exit against the ideal one changed how I take profit &mdash; that used to be
1449                my biggest leak.&rdquo;</blockquote>
1450                <figcaption><strong>Sasha</strong> &middot; MES scalper</figcaption>
1451            </figure>
1452        </div>
1453    </div>
1454</section>
1455
1456<!-- ============== PRICING ============== -->
1457<section class="ljl-section ljl-pricing" id="pricing">
1458    <div class="container">
1459        <div class="ljl-section__head">
1460            <div class="ljl-section__eyebrow">Pricing</div>
1461            <h2 class="ljl-section__title">Simple pricing. Try it free for 14 days.</h2>
1462            <p class="ljl-section__sub">
1463                One Pro plan, billed monthly or yearly. Cancel anytime before the trial ends and pay nothing.
1464            </p>
1465        </div>
1466        <div class="ljl-pricing__grid">
1467            <!-- PRO MONTHLY -->
1468            <div class="ljl-price-card">
1469                <div class="ljl-price-card__name">Pro &mdash; Monthly</div>
1470                <div class="ljl-price-card__price">
1471                    <span class="ljl-price-card__amount">$29.99</span>
1472                    <span class="ljl-price-card__period">/ month</span>
1473                </div>
1474                <p class="ljl-price-card__desc">Full access, billed monthly. Starts with a 14-day free trial.</p>
1475                <ul>
1476                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Dashboard, Journal &amp; KPI metrics</li>
1477                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Tradovate &amp; NinjaTrader auto-import, CSV &amp; manual entry, bar replay</li>
1478                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Full Insights &amp; Analytics</li>
1479                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Quality scoring &amp; R-multiple distribution</li>
1480                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Priority support</li>
1481                </ul>
1482                <div class="ljl-price-card__cta">
1483                    <a href="/app?signup=1" class="ljl-btn ljl-btn--ghost" style="width:100%">Start free trial</a>
1484                </div>
1485            </div>
1486
1487            <!-- P77: FOUNDING MEMBER — hidden until /api/founding/status says
1488                 the plan is live with seats left (script at the bottom). -->
1489            <div class="ljl-price-card ljl-price-card--featured ljl-price-card--founding">
1490                <div class="ljl-price-card__badge">Founding &mdash; first 100</div>
1491                <div class="ljl-price-card__name">Founding Member</div>
1492                <div class="ljl-price-card__price">
1493                    <span class="ljl-price-card__amount">$24.99</span>
1494                    <span class="ljl-price-card__period">/ month &mdash; forever</span>
1495                </div>
1496                <p class="ljl-price-card__desc">
1497                    <span class="ljl-founding-counter" id="ljl-founding-left">limited seats</span><br>
1498                    Your price never goes up &mdash; even when ours does. No trial: you back us on day one, we lock you in for life.
1499                </p>
1500                <ul>
1501                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> <strong>Everything in Pro</strong></li>
1502                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Price locked at $24.99 forever</li>
1503                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Founder badge &mdash; gone when seats are gone</li>
1504                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Priority on the roadmap &mdash; your requests first</li>
1505                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> Early access to new features</li>
1506                </ul>
1507                <div class="ljl-price-card__cta">
1508                    <a href="/app?signup=1&plan=founding" class="ljl-btn ljl-btn--primary" style="width:100%">Claim a Founding seat</a>
1509                </div>
1510            </div>
1511
1512            <!-- PRO ANNUAL (featured by default; founding takes the spotlight
1513                 when its card is visible — see .has-founding reset below) -->
1514            <div class="ljl-price-card ljl-price-card--featured ljl-price-card--annual">
1515                <div class="ljl-price-card__badge">Best value &mdash; 2 months free</div>
1516                <div class="ljl-price-card__name">Pro &mdash; Annual</div>
1517                <div class="ljl-price-card__price">
1518                    <span class="ljl-price-card__amount">$299</span>
1519                    <span class="ljl-price-card__period">/ year</span>
1520                </div>
1521                <p class="ljl-price-card__desc">Everything in Pro &mdash; about $24.92/mo. Starts with a 14-day free trial.</p>
1522                <ul>
1523                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> <strong>Everything in Pro Monthly</strong></li>
1524                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> <span>2 months free vs monthly</span></li>
1525                    <li><svg class="ljl-price-card__check" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> <span>Price locked for the full year</span></li>
1526                </ul>
1527                <div class="ljl-price-card__cta">
1528                    <a href="/app?signup=1&plan=annual" class="ljl-btn ljl-btn--primary" style="width:100%">Start free trial</a>
1529                </div>
1530            </div>
1531        </div>
1532    </div>
1533</section>
1534
1535<!-- ============== FAQ ============== -->
1536<section class="ljl-section" id="faq">
1537    <div class="container">
1538        <div class="ljl-section__head">
1539            <div class="ljl-section__eyebrow">FAQ</div>
1540            <h2 class="ljl-section__title">Questions, answered</h2>
1541        </div>
1542        <div class="ljl-faq__list">
1543            <details class="ljl-faq__item">
1544                <summary>Which markets and platforms does LiJournal support?</summary>
1545                <div class="ljl-faq__body">
1546                    Built specifically for futures traders &mdash; NQ, ES, MNQ, MES, CL, GC and the rest. <strong>Tradovate connects natively:</strong>
1546 your trades import automatically on every sync, and you can pull your entire history in one click. <strong>NinjaTrader connects natively too</strong> &mdash; sign in once and your fills import automatically. Manual entry and CSV import cover any other platform, and more broker integrations are on the roadmap. On-chart features &mdash; trade charts, bar replay, context chips &mdash; currently cover CME index futures (NQ, ES and their micros); other symbols journal fully with all stats.
1547                </div>
1548            </details>
1549            <details class="ljl-faq__item">
1550                <summary>Do I have to tag my trades for the analytics to work?</summary>
1551                <div class="ljl-faq__body">
1552                    No. The market context behind every imported trade &mdash; session, time slot, volatility,
1553                    VWAP side, opening range, day trend &mdash; is computed automatically from real market data.
1554                    Edge Finder works on a completely untagged journal. Tagging strategies is optional and adds
1555                    per-setup scorecards on top.
1556                </div>
1557            </details>
1558            <details class="ljl-faq__item">
1559                <summary>Is my data private?</summary>
1560                <div class="ljl-faq__body">
1561                    Yes. Your trade data is stored encrypted in your own Supabase row. We never share it, sell it, or use it for ads. You can export and delete everything from your profile at any time.
1562                </div>
1563            </details>
1564            <details class="ljl-faq__item">
1565                <summary>Can I cancel anytime?</summary>
1566                <div class="ljl-faq__body">
1567                    Yes. Cancel from your profile in one click &mdash; you keep Pro features until the end of the billing period. No questions, no retention pressure.
1568                </div>
1569            </details>
1570            <details class="ljl-faq__item">
1571                <summary>How does the free trial and refunds work?</summary>
1572                <div class="ljl-faq__body">
1573                    You get a <strong>14-day free trial</strong> (a payment method is required to start it). Cancel anytime before it ends and you&rsquo;re never charged. If you don&rsquo;t cancel, it converts to a paid subscription. After billing, payments are non-refundable except where the law requires &mdash; the trial is your risk-free window to decide. One trial per customer.
1574                </div>
1575            </details>
1576            <details class="ljl-faq__item">
1577                <summary>I subscribed on Whop with a different email &mdash; where&rsquo;s my Pro?</summary>
1578                <div class="ljl-faq__body">
1579                    Use the same email on LiJournal and on Whop and your subscription links automatically.
1580                    Paid with a different one? Log in with the email you paid with, or write
1581                    <a href="mailto:[email protected]">[email protected]</a> and we&rsquo;ll link it.
1582                </div>
1583            </details>
1584            <details class="ljl-faq__item">
1585                <summary>What happens to my trades if my subscription ends?</summary>
1586                <div class="ljl-faq__body">
1587                    Nothing is deleted. Your full trade history stays safe on your account &mdash; you can export your data any time while subscribed, and everything is right where you left it the moment you resubscribe.
1588                </div>
1589            </details>
1590            <details class="ljl-faq__item">
1591                <summary>I have a feature request / found a bug</summary>
1592                <div class="ljl-faq__body">
1593                    Email [email protected]. Pro users get priority &mdash; bugs land same week, features go on the public roadmap.
1594                </div>
1595            </details>
1596        </div>
1597    </div>
1598</section>
1599
1600<!-- ============== FINAL CTA ============== -->
1601<section class="ljl-final-cta">
1602    <div class="container">
1603        <h2>Ready to find your edge?</h2>
1604        <p>Start your 14-day free trial. Cancel anytime before it ends &mdash; pay nothing.</p>
1605        <a href="/app?signup=1" class="ljl-btn ljl-btn--primary ljl-btn--lg">Start free trial →</a>
1606    </div>
1607</section>
1608
1609<!-- ============== FOOTER ============== -->
1610<footer class="ljl-footer">
1611    <div class="container">
1612        <div class="ljl-footer__inner">
1613            <div class="ljl-footer__brand">
1614                <a href="/" class="ljl-logo" style="font-size: 1.3rem;">LiJournal</a>
1615                <p>The premium futures trading journal built to turn your trade history into an edge.</p>
1616            </div>
1617            <div>
1618                <h3 class="ljl-footer__h">Product</h3>
1619                <ul>
1620                    <li><a href="#features">Features</a></li>
1621                    <li><a href="#pricing">Pricing</a></li>
1622                    <li><a href="/app?login=1">Log in</a></li>
1623                </ul>
1624            </div>
1625            <div>
1626                <h3 class="ljl-footer__h">Resources</h3>
1627                <ul>
1628                    <li><a href="#faq">FAQ</a></li>
1629                    <li><a href="mailto:[email protected]">Contact</a></li>
1630                </ul>
1631            </div>
1632            <div>
1633                <h3 class="ljl-footer__h">Legal</h3>
1634                <ul>
1635                    <li><a href="/legal/privacy.html">Privacy</a></li>
1636                    <li><a href="/legal/terms.html">Terms</a></li>
1637                    <li><a href="/legal/risk.html">Risk Disclaimer</a></li>
1638                </ul>
1639            </div>
1640        </div>
1641        <p class="ljl-footer__disclosure">
1642            <strong>Risk disclosure.</strong> Futures, foreign currency and options trading contains substantial risk and
1643            is not for every investor. An investor could potentially lose all or more than the initial investment. Only
1644            risk capital &mdash; money you can afford to lose &mdash; should be used for trading.
1645            <strong>CFTC Rule 4.41.</strong> Hypothetical or simulated performance results have certain limitations. Unlike
1646            an actual performance record, simulated results do not represent actual trading and may under- or
1647            over-compensate for the impact, if any, of certain market factors such as lack of liquidity. No representation
1648            is being made that any account will or is likely to achieve profit or losses similar to those shown. Any
1649            statistics, equity curves or projections in LiJournal describe historical, self-reported activity and do not
1650            guarantee future results. LiJournal is a trading journal and analytics tool &mdash; not a broker, dealer or
1651            investment adviser &mdash; and does not provide financial advice. NinjaTrader and Tradovate are integrations,
1652            not brokerage services offered by LiJournal. See our <a href="/legal/risk.html">full Risk Disclaimer</a>.
1653        </p>
1654        <div class="ljl-footer__bottom">
1655            <div>&copy; 2026 LiJournal. All rights reserved.</div>
1656            <div>Made for traders, by traders.</div>
1657        </div>
1658    </div>
1659</footer>
1660
1661<!-- Cookie / data-use notice. Shares the consent key with the app
1662     (lj_cookie_consent_v1) so accepting here doesn't re-prompt inside /app
1663     and vice-versa. Minimal: no tracking, no per-cookie toggles. -->
1664<div id="ljl-cookie-bar" class="ljl-cookie-bar" role="dialog" aria-label="Cookie notice" hidden>
1665    <div class="ljl-cookie-bar__msg">
1666        We use essential cookies for your session, plus privacy-friendly product analytics and anonymous
1667        error tracking to improve LiJournal. No advertising. See our <a href="/legal/privacy.html">Privacy Policy</a>.
1668    </div>
1669    <button type="button" class="ljl-btn ljl-btn--primary ljl-cookie-bar__accept" id="ljl-cookie-accept">Got it</button>
1670</div>
1671<style>
1672    .ljl-cookie-bar {
1673        position: fixed; left: 16px; right: 16px; bottom: 16px; z-index: 9999;
1674        max-width: 760px; margin: 0 auto;
1675        display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
1676        background: var(--bg-elev); border: 1px solid var(--border-strong);
1677        border-radius: 14px; padding: 14px 18px;
1678        box-shadow: 0 12px 40px rgba(0,0,0,0.5);
1679    }
1680    /* The bar uses display:flex, which (as an author rule) overrides the UA
1681       [hidden] default — so we must explicitly honor `hidden`, otherwise the
1682       "Got it" button (which sets bar.hidden=true) can't dismiss it. */
1683    .ljl-cookie-bar[hidden] { display: none !important; }
1684    .ljl-cookie-bar__msg { flex: 1 1 320px; color: var(--text-muted); font-size: 0.86rem; line-height: 1.5; }
1685    .ljl-cookie-bar__msg a { color: var(--text); text-decoration: underline; }
1686    .ljl-cookie-bar__accept { flex: 0 0 auto; padding: 9px 22px; }
1687</style>
1688<script src="lj-analytics.js?v=3"></script>
vendor: 1 bytes, line 1688
1688
1689<script>
1690    (function () {
1691        try {
1692            var KEY = 'lj_cookie_consent_v1';
1693            if (localStorage.getItem(KEY) === 'accepted') return;
1694            var bar = document.getElementById('ljl-cookie-bar');
1695            if (!bar) return;
1696            bar.hidden = false;
1697            document.getElementById('ljl-cookie-accept').addEventListener('click', function () {
1698                try { localStorage.setItem(KEY, 'accepted'); } catch (e) { /* private mode */ }
1699                bar.hidden = true;
1700                if (window.ljAnalytics) window.ljAnalytics.onConsent();
1701            });
1702        } catch (e) { /* localStorage blocked — silently skip */ }
1703    })();
1704</script>
vendor: 1 bytes, line 1704
1704
1705<script>
1706    /* P77 — Founding Member card reveal. Hidden by default; lights up when the
1707       backend reports the plan as live with seats remaining. Same-origin in
1708       prod; on the dev static server the API lives on :3003. */
1709    (function () {
1710        var base = /^(localhost|127\.0\.0\.1)$/i.test(location.hostname)
1711            ? ('http://' + location.hostname + ':3003') : '';
1712        fetch(base + '/api/founding/status')
1713            .then(function (r) { return r.ok ? r.json() : null; })
1714            .then(function (st) {
1715                if (!st || !st.enabled) return;
1716                var grid = document.querySelector('.ljl-pricing__grid');
1717                if (grid) grid.classList.add('has-founding');
1718                var left = document.getElementById('ljl-founding-left');
1719                if (left) {
1720                    left.textContent = (typeof st.left === 'number')
1721                        ? (st.left + ' of ' + st.total + ' seats left')
1722                        : ('first ' + st.total + ' traders only');
1723                }
1724            })
1725            .catch(function () { /* card stays hidden */ });
1726    })();
1727</script>
1727
1728
1729<script>
1730    /* Play the showcase videos only while on screen — saves ~580 KB of eager
1731       download and battery on phones. */
1732    (function () {
1733        var vids = document.querySelectorAll('video[data-ljl-autoplay]');
1734        if (!('IntersectionObserver' in window)) { for (var i = 0; i < vids.length; i++) vids[i].play(); return; }
1735        var io = new IntersectionObserver(function (entries) {
1736            entries.forEach(function (e) {
1737                if (e.isIntersecting) e.target.play().catch(function () {});
1738                else e.target.pause();
1739            });
1740        }, { rootMargin: '200px 0px', threshold: 0.25 });
1741        vids.forEach(function (v) { io.observe(v); });
1742    })();
1743</script>
vendor: 1 bytes, line 1743
1743
1744<script src="assets/landing/edge-demo-data.js?v=1" defer></script>
vendor: 1 bytes, line 1744
1744
1745<script defer>
1746    /* Interactive Edge Finder demo — renders window.LJL_EDGE_DEMO (the real
1747       engine's output over the sample dataset) and lets visitors click into
1748       the trades behind each number. */
1749    document.addEventListener('DOMContentLoaded', function () {
1750        var D = window.LJL_EDGE_DEMO;
1751        var rootGood = document.getElementById('ljl-ed-good');
1752        var rootBad = document.getElementById('ljl-ed-bad');
1753        if (!D || !rootGood || !rootBad) return;
1754        var base = document.getElementById('ljl-ed-baseline');
1755        function fr(v) { return (v >= 0 ? '+' : '') + v.toFixed(2) + 'R'; }
1756        base.innerHTML = 'Green &mdash; where this trader makes money. Red &mdash; where it leaks. '
1757            + '<strong>' + D.n + '</strong> trades \u00b7 ' + D.wr + '% win.';
1758        function spark(pts, good) {
1759            if (!pts || pts.length < 2) return '';
1760            var w = 560, h = 64, min = Math.min.apply(null, pts.concat([0])), max = Math.max.apply(null, pts.concat([0]));
1761            var span = (max - min) || 1;
1762            var xy = pts.map(function (v, i) {
1763                return (i / (pts.length - 1) * w).toFixed(1) + ',' + ((1 - (v - min) / span) * (h - 6) + 3).toFixed(1);
1764            });
1765            var zero = ((1 - (0 - min) / span) * (h - 6) + 3).toFixed(1);
1766            var col = good ? '#34d399' : '#f87171';
1767            return '<svg class="ljl-ed-drill__spark" viewBox="0 0 ' + w + ' ' + h + '" preserveAspectRatio="none" aria-hidden="true">'
1768                + '<line x1="0" y1="' + zero + '" x2="' + w + '" y2="' + zero + '" stroke="rgba(255,255,255,0.12)" stroke-dasharray="4 4"/>'
1769                + '<polyline fill="none" stroke="' + col + '" stroke-width="2" points="' + xy.join(' ') + '"/></svg>';
1770        }
1771        function card(c) {
1772            var el = document.createElement('div');
1773            el.className = 'ljl-ed-card ' + (c.good ? 'ljl-ed-card--good' : 'ljl-ed-card--bad');
1774            var rows = c.sample.map(function (t) {
1775                return '<tr><td>' + t.d + '</td><td>' + t.sym + ' \u00b7 ' + (t.dir === 'L' ? 'Long' : 'Short') + '</td>'
1776                    + '<td class="' + (t.r >= 0 ? 'pos' : 'neg') + '">' + fr(t.r) + '</td></tr>';
1777            }).join('');
1778            el.innerHTML =
1779                '<div><span class="ljl-ed-card__pill">' + (c.good ? 'EDGE' : 'LEAK') + '</span>'
1780                + '<span class="ljl-ed-card__dim">' + c.dim + '</span></div>'
1781                + '<div class="ljl-ed-card__label">' + c.label + '</div>'
1782                + '<div><span class="ljl-ed-card__r">' + fr(c.meanR) + '</span>'
1783                + '<span class="ljl-ed-card__vs">' + fr(c.delta) + ' vs baseline</span></div>'
1784                + '<div class="ljl-ed-card__meta"><b>n=' + c.n + '</b> \u00b7 ' + c.wr + '% win</div>'
1785                + '<div class="ljl-ed-card__hint">Click for the trades behind it \u2193</div>'
1786                + '<div class="ljl-ed-drill">' + spark(c.spark, c.good)
1787                + '<div class="ljl-ed-drill__caption">Cumulative R across all ' + c.n + ' trades in this context</div>'
1788                + '<table class="ljl-ed-trades"><tbody>' + rows + '</tbody></table></div>';
1789            el.addEventListener('click', function () { el.classList.toggle('is-open'); });
1790            return el;
1791        }
1792        D.cards.forEach(function (c) { (c.good ? rootGood : rootBad).appendChild(card(c)); });
1793    });
1794</script>
1794
1795<!-- P144o: anonymous presence ping (cid only, no auth on the landing) feeds the Community globe and the owner's pulse wall -->
1796<script src="presence-beacon.js?v=4-landing"></script>
1796
1797</body>
1798</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.