CTC Breakdown Input

Splits a job offer's CTC into what is actually paid monthly, so the headline number isn't mistaken for take-home pay.

StopsCTC mistaken for take-home pay

Installation

pnpm dlx shadcn@latest add https://bollard-ui.vercel.app/r/ctc-breakdown-input.json

The files land in your project. They're yours to edit.

Usage

ctc-breakdown-input-usage.tsx
import { CtcBreakdownInput } from "@/components/ui/ctc-breakdown-input"

<CtcBreakdownInput defaultValue={{ ctc: 2_400_000, variable: 400_000, esop: 300_000, joiningBonus: 200_000, pf: 21_600 }} />

What it catches

  • Variable pay, ESOPs and one-time bonuses counted in the headline
  • Gratuity and employer PF that never reach the bank account
  • In-hand pay far below the headline (minInHandRatio)
  • Parts that add up to more than the CTC

Props

CtcBreakdownInput props
PropTypeDefault
value

Controlled CTC parts.

Partial<CtcParts>—
defaultValue

Initial CTC parts when uncontrolled.

Partial<CtcParts>{}
onValueChange

Called with the parts whenever one changes.

(parts: CtcParts) => void—
minInHandRatio

Flag the offer when monthly in-hand × 12 is below this share of CTC.

number0.7
maxVariableShare

Flag variable pay above this share of CTC.

number0.2
assumptions

Override the in-hand assumptions (basic share, PF, professional tax, standard deduction).

InHandAssumptions{}
aria-describedby

Merged onto the CTC input.

string—
messages

Override any visible string.

Partial<CtcBreakdownInputMessages>—

* required. Also accepts the native props of <fieldset> (className, aria-*, data-*…), passed through to it.

Accessibility

  • Each amount has a <label>; aria-invalid and aria-describedby to its error
  • Colour swatches are aria-hidden; parts are named in text
  • Results are announced in a visually hidden aria-live="polite" region
  • Estimate actions move focus to the field they fill

Only what the source does. Test with your own screen reader and content before shipping.

Limitations

  • An estimate under India's new tax regime only; old-regime deductions, HRA and other income are not modelled
  • Assumes basic is 50% of fixed pay, PF capped at the ₹15,000/month wage ceiling and ₹2,500 professional tax unless you change the assumptions
  • Tax rules are built in as of the verification date and need updating each budget

Rules

Rules last verified:

Informational; not tax advice. Checked new-regime slabs (₹4 L nil up to 30% above ₹24 L) and the ₹60,000 87A rebate up to ₹12 L for AY 2026-27. Not checked: that FY 2026-27 is unchanged, surcharge bands, the 4.81% gratuity factor, the PF wage ceiling and professional tax. Copied components don't update themselves, so re-check after rule changes (see updating a component).

What it stops

CTC mistaken for take-home pay

Also known as

ctc · in-hand salary · take home · lpa · salary breakup · offer letter · esop · pf

Field type

Dependencies

Pairs well with