/* Chart.js needs a sized parent when maintainAspectRatio is off. Without it the
canvas grows on every resize event, which on a phone means every scroll that
hides the address bar. */
.cw{position:relative;height:300px}
.cw.tall{height:360px}
canvas{display:block}
.addr{font-family:var(--mono);font-size:11.5px;color:var(--brand);background:var(--brand-lt);border:1px solid var(--brand-bd);border-radius:5px;padding:2px 7px;text-decoration:none;white-space:nowrap}
.addr:hover{background:var(--brand-bd)}
/* The bar-selector row. The chart takes clicks, but a bar is a poor target on a
phone and no target at all for a keyboard, so every bar also has a button. */
.picks{display:flex;flex-wrap:wrap;gap:6px;margin-top:14px}
.pick{font-family:var(--mono);font-size:12px;padding:4px 9px;border-radius:999px;border:1px solid var(--rule);
background:var(--surface);color:var(--ink-2);cursor:pointer;line-height:1.2;font-variant-numeric:tabular-nums}
.pick:hover{border-color:var(--brand-bd);background:var(--brand-lt);color:var(--brand-dk)}
.pick[aria-pressed="true"]{background:var(--brand);border-color:var(--brand);color:#fff}
.pick .c{opacity:.6;margin-left:5px}
/* The drill-down. Statutory descriptions run long, so entries are stacked
lines, not table rows: nothing to squeeze at 360px wide. */
.drill{margin-top:14px;border-top:1px solid var(--rule);padding-top:12px;display:none}
.drill.open{display:block}
.drill-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.drill-head b{font-size:13.5px}
.drill-head .m{font-size:11.5px;color:var(--ink-3)}
.drill-close{margin-left:auto;background:none;border:1px solid var(--rule);border-radius:6px;
font-size:11px;color:var(--ink-2);cursor:pointer;padding:3px 9px;font-family:var(--sans)}
.drill-close:hover{border-color:var(--ink-3);color:var(--ink)}
.dlist{list-style:none;max-height:340px;overflow-y:auto;margin:0 -4px;padding:0 4px}
.dlist li{padding:8px 0;border-bottom:1px solid var(--rule);font-size:12.5px;line-height:1.5}
.dlist li:last-child{border-bottom:none}
.dlist .blk{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3);font-weight:600;display:block;margin-bottom:2px}
.dlist .sl{font-family:var(--mono);font-size:11px;color:var(--ink-3);margin-right:6px}
.dlist .th{display:block;font-size:11.5px;color:var(--ink-2);margin-top:3px}
.dlist .th b{font-weight:600;color:var(--ink)}
.chip{display:inline-block;font-family:var(--mono);font-size:12px;font-weight:500;font-variant-numeric:tabular-nums;padding:2px 8px;border-radius:6px;white-space:nowrap;margin-right:6px}
.chip-single,.chip-amount{color:var(--brand-dk);background:var(--brand-lt);box-shadow:inset 0 0 0 1px var(--brand-bd)}
.chip-multi{color:var(--brand-dk);background:var(--brand-lt);box-shadow:inset 0 0 0 1px var(--brand-bd);font-size:11px}
.chip-inforce{color:var(--amber);background:var(--amber-lt);box-shadow:inset 0 0 0 1px var(--amber-bd)}
.chip-nil{color:var(--ink-2);background:#f2f1ec;box-shadow:inset 0 0 0 1px var(--rule)}
.chip-text{color:var(--ink-3);background:transparent;box-shadow:inset 0 0 0 1px var(--rule);font-family:var(--sans);font-size:11px}
.flag{display:inline-block;margin-top:4px;font-size:10.5px;font-weight:500;color:var(--amber);background:var(--amber-lt);border:1px solid var(--amber-bd);border-radius:5px;padding:1px 6px;text-decoration:none}
/* The rule 218 strip. */
.qt{width:100%;border-collapse:collapse;font-size:13px}
.qt th{text-align:left;font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3);
font-weight:600;padding:0 12px 8px 0;border-bottom:1px solid var(--rule)}
.qt td{padding:10px 12px 10px 0;border-bottom:1px solid var(--rule);vertical-align:top}
.qt tr:last-child td{border-bottom:none}
.qt .q{font-family:var(--mono);font-size:11px;color:var(--ink-3)}
.qt .d{font-family:var(--mono);font-weight:500}
.qt tr.odd td{background:var(--amber-lt)}
.qt tr.odd .d{color:var(--amber-dk)}
.note{margin-top:12px;font-size:11.5px;line-height:1.6;color:var(--ink-2);background:var(--amber-lt);
border:1px solid var(--amber-bd);border-radius:var(--rad);padding:10px 12px}
.note b{color:var(--amber-dk)}
.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
footer{margin-top:34px;padding:18px 0 0;border-top:1px solid var(--rule);font-size:11.5px;line-height:1.65;color:var(--ink-3);max-width:76ch}
footer a{color:var(--brand)}
noscript .nojs{background:var(--amber-lt);border:1px solid var(--amber-bd);border-radius:var(--rad);
padding:10px 12px;font-size:12px;color:var(--amber-dk);margin-bottom:18px;display:block}
@media (max-width: 900px) {
body{display:block}
.mobile-nav-toggle{display:inline-flex;align-items:center;justify-content:center;margin-left:0}
.sidebar{position:fixed;inset:0 30% 0 0;z-index:100;width:auto;max-width:280px;
transform:translateX(-100%);transition:transform .22s ease;box-shadow:4px 0 24px rgba(0,0,0,.25)}
.sidebar.open{transform:translateX(0)}
body.nav-open .scrim{display:block;position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:99}
.grid{grid-template-columns:1fr}
.topbar{padding:12px 16px 10px}
.wrap{padding:6px 16px 44px}
}
@media (max-width: 700px) {
.cw,.cw.tall{height:300px}
.card{padding:15px}
.dlist{max-height:none;overflow:visible}
.qt{font-size:12.5px}
}
@media (prefers-reduced-motion: reduce) {
.sidebar{transition:none}
}
Ready ReferenceCharts
Rate distributions taken straight from the statute. Select a
rate — click its bar or its button — to see every entry that carries it,
without opening the rule or the section.
Depreciation — rule 25
Appendix I written-down value
138 entries at 8 distinct rates, % of written-down value. Largest block: Machinery and Plant (129 entries). Highest rate: 45% (1 entry). Rule 25
Appendix II actual cost
38 entries at 10 distinct rates, % of actual cost. Largest block: Building and civil engineering works of permanent character, not mentioned above (6 entries). Highest rate: 33.4% (5 entries). Rule 25
Deduction and collection at source — sections 393 & 394
Rates across the four tables
57 rows
Each bar is stacked by the table the row comes from.
Two counting rules, so the bars can be read literally:
a row whose rate cell holds more than one percentage
(5 of them do) counts once under
each rate it names, and the rows with no fixed percentage —
“rates in force”, which Parliament sets annually in the
Finance Act, plus Nil and see-text — are kept as their own bar rather
than dropped.
Section 393Section 394
Quarterly payment of tax deducted — rule 218
Quarter end to payment date
Rule 218 — where the Assessing Officer permits quarterly payment. 218
Q
Quarter of the financial year ended on
Date for quarterly payment
1
30th June.
7th July.
2
30th September.
7th October.
3
31st December.
7th January.
4
31st March.
30th April.
Note the last row. Three quarters are paid by the
7th of the following month; the quarter ended 31st March is paid by the
30th April. Rule 218 applies only where the Assessing
Officer has permitted quarterly payment — the general rule is monthly.
Corpus structure
Act sections and schedules per chapter
536 + 16
Counted live from the database, so this grows as chapters are added
Rules by subject area 333 rules
The 30 curated bands used by the Rules browse page
Cross-references 4,890
Which document cites which, resolved links only
Provisions carrying a statutory table
77 provisions hold
the corpus’s 70 tables — every rate, threshold and date grid on this site
is parsed out of one of them