nx_intake_form.nx source
↩ module page · 66 lines · 5301 B
1// nx_intake_form.nx -- R6 intake FORM: the zero-JS, accommodation-friendly survey a person fills (behind the
2// opaque wall) so the whole system runs on THEIR numbers. Native HTML POST (method=post action=/finance/
3// intake) -> nx_intake_handler. Built per feedback-disabilities-disappear: plain language, grouped, large
4// >=44px targets, reduce-motion, no overwhelm. Field names match nx_intake_handler exactly (money in whole
5// dollars; the handler converts to cents). 0 <script. license_tier: ORIGINAL
6import "nx_syscalls.nx"
7
8func ifr_cat(out: *u8, off: i64, s: *u8) -> i64 {
9 var o: i64 = off; var i: i64 = 0
10 while s[i] != (0 as u8) { out[o] = s[i]; o = o + 1; i = i + 1 }
11 return o
12}
13// a money/number row: label + a number input named `nm`.
14func ifr_num(out: *u8, off: i64, label: *u8, nm: *u8, prefix: *u8) -> i64 {
15 var o: i64 = off
16 o = ifr_cat(out, o, "<label class=\"row\"><span>" as *u8); o = ifr_cat(out, o, label)
17 o = ifr_cat(out, o, "</span><span class=\"in\">" as *u8); o = ifr_cat(out, o, prefix)
18 o = ifr_cat(out, o, "<input type=\"number\" inputmode=\"numeric\" min=\"0\" name=\"" as *u8); o = ifr_cat(out, o, nm)
19 o = ifr_cat(out, o, "\"></span></label>" as *u8)
20 return o
21}
22// a yes/no checkbox row (value=1).
23func ifr_chk(out: *u8, off: i64, label: *u8, nm: *u8) -> i64 {
24 var o: i64 = off
25 o = ifr_cat(out, o, "<label class=\"chk\"><input type=\"checkbox\" value=\"1\" name=\"" as *u8); o = ifr_cat(out, o, nm)
26 o = ifr_cat(out, o, "\"><span>" as *u8); o = ifr_cat(out, o, label); o = ifr_cat(out, o, "</span></label>" as *u8)
27 return o
28}
29
30func if_render(out: *u8) -> i64 {
31 var o: i64 = 0
32 o = ifr_cat(out, o, "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>Your situation</title><style>" as *u8)
33 o = ifr_cat(out, o, "*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:#fbfbf9;color:#1d1d1b}" as *u8)
34 o = ifr_cat(out, o, "main{max-width:640px;margin:0 auto;padding:1.4rem}h1{font-size:1.25rem}h2{font-size:1rem;margin:1.4rem 0 .4rem}p.lead{color:#555;line-height:1.5}" as *u8)
35 o = ifr_cat(out, o, ".row{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.6rem 0;border-bottom:1px solid #e3e3dd}.row span:first-child{flex:1}" as *u8)
36 o = ifr_cat(out, o, ".in{display:flex;align-items:center;gap:.2rem}input[type=number]{width:8rem;min-height:44px;font-size:1rem;padding:.4rem;border:1px solid #b9c2d6;border-radius:6px}" as *u8)
37 o = ifr_cat(out, o, ".chk{display:flex;align-items:center;gap:.6rem;min-height:44px;padding:.3rem 0}.chk input{width:24px;height:24px}" as *u8)
38 o = ifr_cat(out, o, "button{margin-top:1.4rem;width:100%;min-height:52px;font-size:1.05rem;background:#0b6b3a;color:#fff;border:0;border-radius:8px;cursor:pointer}" as *u8)
39 o = ifr_cat(out, o, ":focus-visible{outline:3px solid #0b6b3a;outline-offset:2px}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}" as *u8)
40 o = ifr_cat(out, o, "</style></head><body><main><h1>Your situation</h1><p class=\"lead\">A few plain questions. No wrong answers, nothing is shared, and you can skip any of them. This lets Nishi work with YOUR numbers.</p>" as *u8)
41 o = ifr_cat(out, o, "<form method=\"post\" action=\"/finance/intake\">" as *u8)
42
43 o = ifr_cat(out, o, "<h2>Money (whole dollars is fine)</h2>" as *u8)
44 o = ifr_num(out, o, "Your take-home income each month" as *u8, "income_monthly\x00" as *u8, "$\x00" as *u8)
45 o = ifr_num(out, o, "Your highest-interest debt (balance)" as *u8, "debt_balance\x00" as *u8, "$\x00" as *u8)
46 o = ifr_num(out, o, "Its interest rate" as *u8, "debt_apr_pct\x00" as *u8, "%\x00" as *u8)
47 o = ifr_num(out, o, "What you pay on it each month" as *u8, "monthly_payment\x00" as *u8, "$\x00" as *u8)
48 o = ifr_num(out, o, "Cash you have available right now" as *u8, "available\x00" as *u8, "$\x00" as *u8)
49 o = ifr_num(out, o, "What an hour of your work pays" as *u8, "hourly_wage\x00" as *u8, "$\x00" as *u8)
50 o = ifr_num(out, o, "Emergency buffer you want to build" as *u8, "buffer_goal\x00" as *u8, "$\x00" as *u8)
51
52 o = ifr_cat(out, o, "<h2>What is weighing on you? (check any)</h2>" as *u8)
53 o = ifr_chk(out, o, "I am behind on my mortgage or rent" as *u8, "behind_mortgage\x00" as *u8)
54 o = ifr_chk(out, o, "I have medical bills I cannot pay" as *u8, "medical_debt\x00" as *u8)
55 o = ifr_chk(out, o, "I am worried about losing my income" as *u8, "job_loss_risk\x00" as *u8)
56 o = ifr_chk(out, o, "I am carrying high-interest debt" as *u8, "high_interest_debt\x00" as *u8)
57
58 o = ifr_cat(out, o, "<h2>How can we make this easier for you? (check any)</h2>" as *u8)
59 o = ifr_chk(out, o, "I have ADHD / ADD — show me one thing at a time" as *u8, "has_adhd\x00" as *u8)
60 o = ifr_chk(out, o, "I have low energy / fatigue / sleep apnea — go easy on low days" as *u8, "low_energy\x00" as *u8)
61 o = ifr_chk(out, o, "I need larger text" as *u8, "low_vision\x00" as *u8)
62
63 o = ifr_cat(out, o, "<button type=\"submit\">Save my situation</button></form></main></body></html>" as *u8)
64 out[o] = 0 as u8
65 return o
66}