Skip to content

feat(hiiq): rebuild the hiiq page around lock, estimate and decay - #73

Merged
invisiblemask merged 45 commits into
restructure/iq-hiiq-scopefrom
restructure/hiiq-page
Aug 20, 2026
Merged

feat(hiiq): rebuild the hiiq page around lock, estimate and decay#73
invisiblemask merged 45 commits into
restructure/iq-hiiq-scopefrom
restructure/hiiq-page

Conversation

@invisiblemask

@invisiblemask invisiblemask commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Closes https://github.com/IQIndustries/issues/issues/5201 and https://github.com/IQIndustries/issues/issues/5202 when this PR merged

Continues the restructure on restructure/iq-hiiq-scope by giving /hiiq the same
system as the redesigned homepage.

What changed

  • Hero — centred, faint masked grid over a pink radial, two CTAs, and four mono
    chips (4× max boost, veCRV model, non-transferable, rewards in IQ).
  • Stats band — a two-cell ruled band for IQ locked and total HiIQ, both still
    from getTvl() / getLockOverview().
  • How it works — a lock-to-boost board: deposit → 4-year lock → 4× balance,
    with the dashed tail its decay follows.
  • Estimate — an interactive panel. The slider runs 1 week to 208 weeks and the
    boost is the veCRV curve itself, 1 + 3 × weeks / 208, so the duration readout,
    the HiIQ amount and the gauge cannot disagree (2 years reads 2.5× on 2,500 HiIQ).
  • Decay — a HiIQ-over-lifetime chart, 4× down to parity at expiry, plus the
    dashed line an extension puts the balance back on.
  • Rewards — a closing two-cell grid for the IQ payout and what you need to stake.

The route is now just a composition root; each section lives in
src/components/layouts/hiiq/, and the four new diagrams join the existing .ill
scope in globals.css.

Notes

  • All copy is translated in en/kr/zh. Lock durations are ICU plurals since the
    estimator renders them for both the readout and the slider ticks.
  • The whole hiiq message namespace is replaced — the old cta, stats.locked
    string and sections.* keys are gone.

Verification

  • npx tsc --noEmit and biome check clean.
  • Slider exercised by pointer and keyboard: value, duration label, HiIQ amount and
    gauge sweep move together, focus is retained.
  • Checked at 1280, 768 and 375. No horizontal overflow. The last three commits are
    fixes that pass turned up: the boards' headline values were being sized by the
    .ill classes rather than their own attributes, and the estimator's five slider
    ticks collided at phone width.

The hiiq sections need three marks the homepage set does not carry.
Two diagrams carry the hiiq mechanics: the deposit-to-lock-to-boosted-balance
pipeline with the tail its decay follows, and the balance over a lock's
lifetime falling from 4x to parity with the line an extension restores.
The estimator needs a readout that moves with its slider, so the sweep is a
dashoffset on a normalised pathLength rather than a redrawn arc.
Small boards for the closing grid: rewards splitting out to stakers, and a
decorative checklist over the requirements the cell spells out in text.
The lock's orbiting ring, the decay curve's draw-in and marching extend line,
the gauge sweep and the requirement checks. Reduced motion drops the gauge's
transition too, since its arc is driven by state rather than a keyframe.
Both engines share one track rule by painting the filled half with a gradient
stop parked at --range-pct, which the estimator keeps in sync with its value.
The old block only covered a hero and a stats line. The rebuilt page adds the
mechanism board, the estimator, the decay section and the closing grid, so the
whole hiiq namespace is replaced. Lock durations are ICU plurals because the
estimator renders them for both the readout and the slider ticks.
A centred hero over a masked grid, with the four claims about hiiq as mono
chips, and a two-cell band for the locked IQ and the hiiq outstanding.
The slider runs 1 to 208 weeks and the boost is the veCRV curve itself,
1 + 3 * weeks / 208, so the duration readout, the hiiq amount and the gauge
cannot disagree — two years reads 2.5x on 2,500 hiiq.
The route keeps its metadata and the two chain reads, and the prose it used to
render inline now lives in the sections themselves. The new anchors join the
group carrying the navbar's scroll offset.
.val and .val-p carry a font-size, and a class beats a presentation attribute,
so both boards were rendering their headline values at the caption size. The
sizes move inline, the gauge's end ticks drop clear of the arc it was drawing
them on, and the lock board loses the dead space under its decay tail.
At phone width the five duration ticks overlap, so the odd ones hide below sm
and the track keeps its start, midpoint and end.
@vercel

vercel Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
braindao-ui Ready Ready Preview Aug 20, 2026 5:20pm

Request Review

The eyebrow goes neutral, the description steps up to 16px so it wraps
to three lines, the CTA pair takes the hero's size instead of the shared
footer pill, and the chip row widens to the mock's gap. The grid backdrop
widens with the headline.
Dropping the negative inset puts the cells in the same column the rest of
the page's copy starts at, which lands the divider on the centre line, and
the value takes the design's 28px.
The board was too flat: the lock was the same size as the two ends when
the design makes it the focal node carrying the board's height, and the
boosted balance read left-aligned in its node. Rescales every node to the
mock, centres the balance, and leaves the token's name in its own case.
At 375 the board scaled down to 293px, which put its captions under 6px.
It now holds its width and the panel bleeds to the screen edge to scroll.
The ring's own travelling arc already carries the motion, and the dot read
as a second, unrelated animation.
The ring nearly met the node's top edge and its caption sat right under the
arc. The ring loses a little radius, the node gains height, and the caption
drops below the other two.
The tail was the one static piece of the board. Its dashes now march toward
the expiry label and the balance's dot rides down them and fades, on the
same clock, so the decay reads as leaving the boosted balance.
A 4px track under an 18px knob; at 2px the filled half read as a
hairline next to the panel's other rules.
The design draws the arc as a neon tube rather than the boards' flat
strokes; a drop-shadow on the arc alone carries that.
Four faint dots sit just off the tube in the design; the box grows a
hair in each direction to hold them without clipping.
The tube is white-hot inside its pink glow, not a flat pink stroke: a
white core path rides the same dashoffset as the arc beneath it.
The design gives the slider and the receive row more air than the
boards' stock spacing; the panel lands at its ~350px height.
The fan gets the design's tall symmetric sweep: curved rays that leave the
arrowhead flat and arrive flat at each staker dot, a grey-bordered pill, and
no pulse dashes. The checklist's squares are bare grey outlines with a big
static pink check — the one pink thing on the row. Both boards share a fixed
slot so the card headings sit on one line, and the source footnote goes,
matching the mock.
The lit arc read as a bar filling and holding, which fought the pink
readout underneath it. Cut the dash to a short glint and walk it along
the swept arc with a hold at each end, so the gauge shows a light
travelling rather than a level rising. Faster and thinner to match.
The travelling glint is the head now, so the dot riding the arc's end
was a second marker for the same thing. Takes its rotation rule and its
reduced-motion entry with it.
@invisiblemask
invisiblemask merged commit 0dbb775 into restructure/iq-hiiq-scope Aug 20, 2026
2 checks passed
invisiblemask added a commit that referenced this pull request Aug 21, 2026
Brings in the HiIQ page rewrite from #73. The only conflict was the
import block in app/[locale]/hiiq/page.tsx: the page now composes from
components/layouts/hiiq/* instead of section-kit, so the old section-kit
import goes and `alternatesFor` stays. Git had already merged the body,
keeping generateMetadata's canonical alongside the new section list.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants