Cook County Board of Review Appeals Guide
Pay Cook County Property Taxes 2026: Complete Guide & Deadlines :root{ /* Homepage palette */ --brand: 005988; --brand-mid: 0B5984; --brand-light: 0B6697; --brand-deep: 004163; --brand-ink: 014751; --brand-50: rgba(0,89,136,0.04); --brand-100: rgba(0,89,136,0.08); --brand-200: rgba(0,89,136,0.16); --ink: 191B21; --ink-2: 41474E; --ink-3: 475569; --ink-4: 64748B; --ink-5: 94A0B2; --surface: FFFFFF; --surface-2: F7F7FC; --surface-3: EEF2F6; --surface-4: E8EDF4; --surface-tint: F5F8FC; --border: D8DFEA; --border-soft: E9EEF5; --border-faint: F1F3F8; --success: 1B6D24; --success-mid: 2D8E3A; --success-light: D1FAE5; --success-bright: 4ADE80; --alert: BA1A1A; --info: 2299DD; --shadow-sm: 0 1px 2px rgba(11,89,132,0.04), 0 1px 1px rgba(11,89,132,0.04); --shadow-md: 0 8px 24px -12px rgba(11,89,132,0.18), 0 2px 6px rgba(11,89,132,0.05); --shadow-lg: 0 30px 70px -32px rgba(11,89,132,0.32), 0 4px 16px rgba(11,89,132,0.06); --font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; } *{box-sizing:border-box;margin:0;padding:0} html{scroll-behavior:smooth} body{ font-family: var(--font-body); background: var(--surface); color: var(--ink-2); font-size: 17px; line-height: 1.65; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; overflow-x: hidden; position: relative; } body::before{ content:""; position: fixed; inset: 0; pointer-events: none; z-index: 1000; opacity: 0.025; background-image: url("data:image/svg+xml;utf8, "); mix-blend-mode: multiply; } .wrap{max-width: 1240px; margin: 0 auto; padding: 0 32px} @media (max-width: 700px){.wrap{padding: 0 20px}} /* ============================================================ STATUS BAR ============================================================ */ .status-bar{ background: var(--brand-deep); color: rgba(255,255,255,0.9); font-size: 11.5px; letter-spacing: 0.16em; text-transform: uppercase; padding: 11px 0; font-family: var(--font-mono); font-weight: 500; position: relative; z-index: 5; } .status-bar .row{display: flex; justify-content: space-between; align-items: center; gap: 16px; flex-wrap: wrap} .status-bar .left{display:flex;align-items:center;gap:10px} .live-dot{ width: 7px; height: 7px; border-radius: 50%; background: var(--success-bright); box-shadow: 0 0 0 0 rgba(74,222,128,0.6); animation: livePulse 2.4s infinite; } @keyframes livePulse{ 0%{box-shadow:0 0 0 0 rgba(74,222,128,0.6)} 70%{box-shadow:0 0 0 10px rgba(74,222,128,0)} 100%{box-shadow:0 0 0 0 rgba(74,222,128,0)} } .status-bar .right{display: flex; gap: 24px; align-items: center; opacity: 0.75; font-size: 10.5px} .status-bar .sep{opacity: 0.4} @media (max-width: 640px){.status-bar .right{display: none}} /* ============================================================ HERO ============================================================ */ header.hero{ position: relative; padding: 80px 0 100px; background: radial-gradient(ellipse at 8% 10%, rgba(0,89,136,0.08) 0%, transparent 55%), radial-gradient(ellipse at 92% 90%, rgba(0,89,136,0.06) 0%, transparent 50%), var(--surface); border-bottom: 1px solid var(--border-soft); overflow: hidden; } header.hero::before{ content:""; position: absolute; inset: 0; background-image: linear-gradient(rgba(0,89,136,0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(0,89,136,0.03) 1px, transparent 1px); background-size: 64px 64px; background-position: -1px -1px; pointer-events: none; mask-image: radial-gradient(ellipse at center, rgba(0,0,0,0.6), transparent 80%); -webkit-mask-image: radial-gradient(ellipse at center, rgba(0,0,0,0.6), transparent 80%); } .hero .wrap{position: relative; z-index: 2} .hero-grid{ display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 64px; align-items: center; } @media (max-width: 980px){ .hero-grid{grid-template-columns: 1fr; gap: 48px} header.hero{padding: 56px 0 80px} } .kicker{ display: inline-flex; align-items: center; gap: 14px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--brand); margin-bottom: 32px; font-weight: 500; opacity: 0; transform: translateY(12px); animation: rise 0.7s 0.05s ease-out forwards; } .kicker .seg-line{width: 28px; height: 1px; background: var(--brand); opacity: 0.6} .kicker .seg-dot{width: 5px; height: 5px; background: var(--brand); border-radius: 50%; opacity: 0.6} h1.title{ font-family: var(--font-display); font-weight: 700; font-size: clamp(28px, 3.2vw, 44px); line-height: 1.0; letter-spacing: -0.022em; color: var(--ink); margin-bottom: 32px; opacity: 0; transform: translateY(20px); animation: rise 0.9s 0.15s ease-out forwards; } h1.title em{font-style: normal; color: var(--brand-light); color: var(--brand); position: relative} h1.title em::after{ content:""; position: absolute; left: 0; bottom: 6px; width: 100%; height: 2px; background: var(--brand); transform-origin: left; animation: drawLine 1s 0.9s cubic-bezier(0.65,0,0.35,1) forwards; transform: scaleX(0); } @keyframes drawLine{to{transform: scaleX(1)}} .dek{ font-family: var(--font-display); font-size: clamp(20px, 2.1vw, 26px); line-height: 1.45; font-weight: 700; color: var(--ink-3); max-width: 600px; margin-bottom: 44px; opacity: 0; transform: translateY(20px); animation: rise 0.9s 0.3s ease-out forwards; } .dek b{color: var(--ink); font-weight: 500; font-style: normal; color: var(--brand-light)} .meta-strip{ display: flex; gap: 36px; flex-wrap: wrap; padding-top: 28px; border-top: 1px solid var(--border-soft); opacity: 0; transform: translateY(20px); animation: rise 0.9s 0.45s ease-out forwards; } .meta-strip .item{display:flex; flex-direction: column; gap: 4px} .meta-strip .label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } .meta-strip .value{font-size: 15px; color: var(--ink); font-weight: 500} @keyframes rise{to{opacity:1; transform:translateY(0)}} /* ============================================================ HERO CLASS SMALL-MULTIPLES ============================================================ */ .hero-visual{ position: relative; opacity: 0; transform: translateY(20px) scale(0.96); animation: rise 1.1s 0.4s ease-out forwards; } .class-grid{display: grid; grid-template-columns: 1fr 1fr; gap: 12px} .class-mini{ background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 18px 18px 16px; position: relative; transition: all 0.25s; cursor: pointer; overflow: hidden; } .class-mini::before{ content:""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--brand); transition: background 0.25s; } .class-mini:hover{transform: translateY(-2px); box-shadow: var(--shadow-md); border-color: var(--brand)} .class-mini:hover::before{background: var(--success-bright)} .class-mini.commercial::before{background: var(--brand-light)} .class-mini .cm-tag{ font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--brand); font-weight: 500; margin-bottom: 6px; } .class-mini .cm-name{ font-family: var(--font-display); font-size: 18px; color: var(--ink); font-weight: 700; line-height: 1.15; margin-bottom: 10px; letter-spacing: -0.008em; } .class-mini .cm-rate{ font-family: var(--font-display); font-size: 26px; color: var(--ink); font-weight: 700; letter-spacing: -0.018em; line-height: 1; margin-bottom: 2px; } .class-mini .cm-rate .sym{font-size: 0.55em; color: var(--brand); font-style: normal; color: var(--brand-light); vertical-align: 0.3em; margin-left: 1px} .class-mini .cm-sub{ font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } .class-mini.featured{grid-column: span 2; background: var(--brand); color: fff} .class-mini.featured::before{background: var(--success-bright)} .class-mini.featured .cm-tag{color: var(--success-bright)} .class-mini.featured .cm-name{color: fff} .class-mini.featured .cm-rate{color: fff} .class-mini.featured .cm-rate .sym{color: var(--success-bright)} .class-mini.featured .cm-sub{color: rgba(255,255,255,0.7)} .class-mini.featured .cm-spread{ font-family: var(--font-display); font-style: normal; color: var(--brand-light); font-size: 14px; color: rgba(255,255,255,0.85); margin-top: 6px; } /* ============================================================ STAT BAND ============================================================ */ .stat-band{position: relative; z-index: 4; margin-top: -52px; padding: 0 32px} @media (max-width: 700px){.stat-band{padding: 0 20px}} .stat-band-inner{ max-width: 1240px; margin: 0 auto; background: var(--surface); border: 1px solid var(--border); border-radius: 4px; box-shadow: var(--shadow-lg); display: grid; grid-template-columns: repeat(5, 1fr); position: relative; overflow: hidden; } .stat-band-inner::before{ content:""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, var(--brand) 0%, var(--brand-light) 50%, var(--brand) 100%); } .stat-cell{ padding: 28px 22px 26px; border-right: 1px solid var(--border-soft); text-align: left; position: relative; background: var(--surface); transition: background 0.3s; } .stat-cell:hover{background: var(--surface-tint)} .stat-cell:last-child{border-right: 0} .stat-cell .stat-label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 12px; font-weight: 500; } .stat-cell .stat-num{ font-family: var(--font-display); font-size: clamp(20px, 2.2vw, 28px); font-weight: 700; color: var(--ink); letter-spacing: -0.022em; line-height: 1; margin-bottom: 10px; } .stat-cell .stat-num .prefix{color: var(--brand); font-style: normal; color: var(--brand-light); margin-right: 2px} .stat-cell .stat-num .suffix{font-size: 0.5em; color: var(--brand); font-style: normal; color: var(--brand-light); margin-left: 4px; vertical-align: 0.35em} .stat-cell .stat-context{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; color: var(--ink-4); text-transform: uppercase; font-weight: 500; margin-bottom: 14px; min-height: 1.4em; } .stat-cell .stat-bar{height: 3px; background: var(--border-faint); position: relative; overflow: hidden} .stat-cell .stat-bar::after{ content:""; position: absolute; left: 0; top: 0; bottom: 0; width: 0%; background: var(--brand); transition: width 1.6s 0.3s cubic-bezier(0.22, 1, 0.36, 1); } .stat-cell.go .stat-bar::after{width: var(--bar, 50%)} .stat-cell.featured{background: var(--brand)} .stat-cell.featured:hover{background: var(--brand-light)} .stat-cell.featured .stat-label{color: rgba(255,255,255,0.65)} .stat-cell.featured .stat-num{color: fff} .stat-cell.featured .stat-num .prefix, .stat-cell.featured .stat-num .suffix{color: rgba(255,255,255,0.75)} .stat-cell.featured .stat-context{color: rgba(255,255,255,0.65)} .stat-cell.featured .stat-bar{background: rgba(255,255,255,0.15)} .stat-cell.featured .stat-bar::after{background: var(--success-bright)} @media (max-width: 1000px){ .stat-band-inner{grid-template-columns: repeat(2, 1fr)} .stat-cell{border-bottom: 1px solid var(--border-soft)} .stat-cell:nth-child(2n){border-right: 0} .stat-cell:last-child{grid-column: span 2} } @media (max-width: 500px){ .stat-band-inner{grid-template-columns: 1fr} .stat-cell{border-right: 0} .stat-cell:last-child{grid-column: auto} } /* ============================================================ ARTICLE GRID ============================================================ */ article{position: relative; padding: 110px 0 60px} .article-grid{ display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 56px; align-items: start; } @media (max-width: 1100px){ .article-grid{grid-template-columns: minmax(0, 1fr) 300px; gap: 48px} } @media (max-width: 880px){ .article-grid{grid-template-columns: 1fr; gap: 48px} article{padding: 80px 0 40px} } /* ============================================================ PROSE ============================================================ */ .prose{max-width: 800px} .prose p{margin-bottom: 22px; font-size: 17.5px; line-height: 1.72; color: var(--ink-2)} .prose p.lead{ font-family: var(--font-display); font-size: clamp(22px, 2.4vw, 28px); line-height: 1.45; color: var(--ink); font-weight: 700; margin-bottom: 44px; min-height: 1.45em; } .prose a{ color: var(--brand); text-decoration: none; background-image: linear-gradient(currentColor, currentColor); background-size: 100% 1px; background-repeat: no-repeat; background-position: 0 100%; padding-bottom: 1px; transition: background-size 0.3s, color 0.25s; } .prose a:hover{color: var(--brand-light); background-size: 0% 1px} .prose strong{color: var(--ink); font-weight: 600} .prose h2{ font-family: var(--font-display); font-size: clamp(24px, 2.6vw, 36px); font-weight: 700; line-height: 1.1; letter-spacing: -0.02em; color: var(--ink); margin: 80px 0 18px; position: relative; } .prose h2 .h2-num{ display: block; font-family: var(--font-mono); font-style: normal; font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--brand); margin-bottom: 14px; font-weight: 500; } .prose h2 em{font-style: normal; color: var(--brand-light); color: var(--brand)} .prose h3{ font-family: var(--font-body); font-size: 20px; font-weight: 600; color: var(--ink); margin: 40px 0 14px; letter-spacing: -0.005em; } .prose ul, .prose ol{margin: 8px 0 28px 0; padding-left: 24px; color: var(--ink-2)} .prose li{margin-bottom: 10px; line-height: 1.65; padding-left: 6px} .prose li::marker{color: var(--brand); font-weight: 600} /* ============================================================ CLASS TAB INTERFACE ============================================================ */ .class-tabs-wrap{margin: 32px 0 24px} .class-tabs{ display: flex; gap: 4px; background: var(--surface-2); border: 1px solid var(--border); border-radius: 6px 6px 0 0; padding: 6px; overflow-x: auto; position: relative; z-index: 2; scrollbar-width: thin; } .class-tab{ flex: 1; background: transparent; border: 0; padding: 14px 12px 12px; font-family: var(--font-body); font-size: 13px; font-weight: 500; color: var(--ink-3); cursor: pointer; border-radius: 4px; transition: all 0.2s; text-align: left; min-width: 140px; line-height: 1.25; } .class-tab:hover{background: var(--surface); color: var(--ink)} .class-tab.active{ background: var(--brand); color: fff; box-shadow: var(--shadow-sm); } .class-tab .tab-label{ display: block; font-size: 13.5px; font-weight: 600; letter-spacing: -0.008em; margin-bottom: 2px; } .class-tab .tab-hint{ display: block; font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 500; opacity: 0.7; } .class-panel{display: none; animation: fadeUp 0.4s ease-out} .class-panel.active{display: block} @keyframes fadeUp{ from{opacity: 0; transform: translateY(8px)} to{opacity: 1; transform: translateY(0)} } .class-panel-header{ background: var(--surface); border: 1px solid var(--border); border-top: 0; padding: 24px 28px 22px; border-radius: 0 0 6px 6px; margin-bottom: 32px; display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: 32px; align-items: center; } .class-panel-header .ph-text .ph-tag{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--brand); font-weight: 500; margin-bottom: 8px; } .class-panel-header .ph-text h3{ font-family: var(--font-display); font-size: clamp(20px, 2.2vw, 28px); font-weight: 700; color: var(--ink); letter-spacing: -0.015em; line-height: 1.1; margin: 0 0 8px; } .class-panel-header .ph-text h3 em{font-style: normal; color: var(--brand-light); color: var(--brand)} .class-panel-header .ph-text .ph-meta{ font-size: 14px; color: var(--ink-4); line-height: 1.45; } .class-panel-header .ph-stats{ display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; } .class-panel-header .ph-cell{ padding: 12px 14px; background: var(--surface-tint); border: 1px solid var(--border-soft); border-radius: 4px; } .class-panel-header .ph-cell .ph-cl{ font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; margin-bottom: 5px; } .class-panel-header .ph-cell .ph-cv{ font-family: var(--font-display); font-size: 22px; color: var(--ink); letter-spacing: -0.012em; line-height: 1; font-weight: 700; } .class-panel-header .ph-cell .ph-cv .sm{font-size: 0.55em; color: var(--brand); font-style: normal; color: var(--brand-light); margin-left: 2px; vertical-align: 0.3em} @media (max-width: 800px){ .class-panel-header{grid-template-columns: 1fr; gap: 24px} } /* Stage cards inside class panels */ .stages-grid{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin: 24px 0; } @media (max-width: 900px){.stages-grid{grid-template-columns: 1fr}} .stage-card{ background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 26px 24px; position: relative; overflow: hidden; } .stage-card::before{ content:""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--brand); } .stage-card.bor::before{background: var(--brand-light)} .stage-card.combined{background: var(--brand); color: fff} .stage-card.combined::before{background: var(--success-bright)} .stage-card .tag{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--brand); font-weight: 500; margin-bottom: 10px; } .stage-card.bor .tag{color: var(--brand-light)} .stage-card.combined .tag{color: var(--success-bright)} .stage-card .stage-h{ font-family: var(--font-display); font-size: 22px; font-weight: 700; color: var(--ink); margin: 0 0 4px; letter-spacing: -0.01em; line-height: 1.15; } .stage-card.combined .stage-h{color: fff} .stage-card .stage-desc{ font-size: 13px; color: var(--ink-4); margin-bottom: 20px; line-height: 1.45; } .stage-card.combined .stage-desc{color: rgba(255,255,255,0.7)} .stage-card .stage-big{ font-family: var(--font-display); font-size: 56px; font-weight: 700; color: var(--ink); letter-spacing: -0.025em; line-height: 0.95; margin-bottom: 6px; } .stage-card.combined .stage-big{color: fff} .stage-card .stage-big .sym{ font-size: 0.42em; color: var(--brand); font-style: normal; color: var(--brand-light); vertical-align: 0.42em; margin-left: 2px; } .stage-card.bor .stage-big .sym{color: var(--brand-light)} .stage-card.combined .stage-big .sym{color: var(--success-bright)} .stage-card .stage-sub{ font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 18px; font-weight: 500; } .stage-card.combined .stage-sub{color: rgba(255,255,255,0.65)} .stage-rows{border-top: 1px solid var(--border-soft); padding-top: 16px} .stage-card.combined .stage-rows{border-top-color: rgba(255,255,255,0.12)} .stage-rows .row{display: flex; justify-content: space-between; padding: 6px 0; font-size: 13px} .stage-rows .row .k{color: var(--ink-3)} .stage-rows .row .v{font-family: var(--font-display); font-size: 16px; color: var(--ink); letter-spacing: -0.008em} .stage-card.combined .stage-rows .row .k{color: rgba(255,255,255,0.7)} .stage-card.combined .stage-rows .row .v{color: fff} /* AV Journey */ .journey{ margin: 28px 0; padding: 36px 32px 40px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 6px; position: relative; overflow: hidden; } .journey::before{ content:""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, var(--brand) 0%, var(--brand-light) 50%, var(--success) 100%); } .journey .head{text-align: center; margin-bottom: 30px} .journey h4{ font-family: var(--font-display); font-size: clamp(22px, 2.6vw, 28px); color: var(--ink); margin: 0 0 6px; font-weight: 700; letter-spacing: -0.015em; } .journey h4 em{font-style: normal; color: var(--brand-light); color: var(--brand)} .journey .sub{ font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } .journey-row{ display: grid; grid-template-columns: 1fr auto 1fr auto 1fr; gap: 14px; align-items: stretch; } .j-col{ text-align: center; padding: 22px 14px 20px; background: var(--surface); border: 1px solid var(--border); border-radius: 4px; position: relative; } .j-col .j-label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 10px; font-weight: 500; } .j-col .j-num{ font-family: var(--font-display); font-size: clamp(22px, 2.8vw, 30px); font-weight: 700; color: var(--ink); letter-spacing: -0.02em; line-height: 1; margin-bottom: 6px; } .j-col .j-stage{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--brand); font-weight: 500; } .j-col.final{background: var(--brand)} .j-col.final::before{ content:""; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--success-bright); } .j-col.final .j-label{color: rgba(255,255,255,0.6)} .j-col.final .j-num{color: fff} .j-col.final .j-stage{color: var(--success-bright)} .j-col.middle .j-stage{color: var(--brand-light)} .j-arrow{display: flex; align-items: center; justify-content: center} .j-arrow .icn{ width: 32px; height: 32px; background: var(--surface); border: 1px solid var(--border); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--brand); } .journey-summary{ margin-top: 22px; padding: 16px 22px; background: var(--surface); border: 1px solid var(--border); border-radius: 4px; display: flex; justify-content: space-between; align-items: center; gap: 16px; flex-wrap: wrap; } .journey-summary .sum-block{display: flex; flex-direction: column; gap: 4px} .journey-summary .sum-block.right{text-align: right} .journey-summary .sum-label{ font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } .journey-summary .sum-val{ font-family: var(--font-display); font-size: 22px; color: var(--success); letter-spacing: -0.01em; line-height: 1; } .journey-summary .sum-val em{font-style: normal; color: var(--brand-light); font-size: 0.7em; margin-left: 4px} @media (max-width: 800px){ .journey-row{grid-template-columns: 1fr; gap: 10px} .j-arrow{transform: rotate(90deg); height: 24px} } /* Class panel narrative + tax savings callout */ .class-callout{ margin: 28px 0; padding: 26px 28px; background: var(--surface-tint); border: 1px solid var(--border-soft); border-left: 3px solid var(--brand); border-radius: 0 6px 6px 0; } .class-callout h5{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--brand); font-weight: 500; margin: 0 0 10px; } .class-callout p{ font-size: 15.5px; line-height: 1.65; color: var(--ink-2); margin: 0; } .class-callout p strong{color: var(--ink); font-weight: 600} /* ============================================================ COMPARISON TABLE ============================================================ */ .comparison-table{ margin: 36px 0 24px; background: var(--surface); border: 1px solid var(--border); border-radius: 6px; overflow: hidden; box-shadow: var(--shadow-md); } .comparison-table-header{ background: var(--brand); color: fff; padding: 20px 28px; display: flex; justify-content: space-between; align-items: center; gap: 16px; position: relative; } .comparison-table-header::after{ content:""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1px; background: linear-gradient(90deg, var(--success-bright), transparent 50%); } .comparison-table-header h4{ font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.18em; font-weight: 500; margin: 0; text-transform: uppercase; color: fff; } .comparison-table-header .source{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; color: rgba(255,255,255,0.7); text-transform: uppercase; } .comparison-table table{width: 100%; border-collapse: collapse} .comparison-table th, .comparison-table td{ padding: 14px 18px; border-bottom: 1px solid var(--border-soft); font-size: 14px; } .comparison-table th{ background: var(--surface-2); text-align: left; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } .comparison-table th:not(:first-child), .comparison-table td:not(:first-child){text-align: right} .comparison-table td:first-child{ color: var(--ink); font-weight: 500; font-size: 14px; } .comparison-table td:first-child .cls-hint{ display: block; font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; margin-top: 3px; } .comparison-table td.num{ font-family: var(--font-display); font-size: 19px; color: var(--ink); letter-spacing: -0.01em; font-weight: 700; } .comparison-table td.num.success{color: var(--success); font-weight: 500} .comparison-table tr:last-child td{border-bottom: 0} .comparison-table tr:hover td{background: var(--surface-tint)} @media (max-width: 800px){ .comparison-table{overflow-x: auto} .comparison-table table{min-width: 700px} } /* ============================================================ DUAL BAR CHART ============================================================ */ .chart-card{ margin: 36px 0 24px; background: var(--surface); border: 1px solid var(--border); border-radius: 6px; overflow: hidden; box-shadow: var(--shadow-md); } .chart-card-header{padding: 22px 28px 18px; border-bottom: 1px solid var(--border-soft)} .chart-card-header h4{ font-family: var(--font-display); font-size: 22px; color: var(--ink); font-weight: 700; margin: 0 0 4px; letter-spacing: -0.01em; } .chart-card-header p{ font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); margin: 0; font-weight: 500; } .chart-card-body{padding: 24px 28px 28px} .dual-bar-chart{display: flex; flex-direction: column; gap: 22px} .dual-bar-row{display: grid; grid-template-columns: 240px 1fr; gap: 24px; align-items: start} .dual-bar-row .class-name{font-size: 14px; color: var(--ink-2); padding-top: 4px} .dual-bar-row .class-name .code{ display: block; font-family: var(--font-mono); font-size: 10px; color: var(--ink-4); letter-spacing: 0.14em; font-weight: 500; text-transform: uppercase; margin-top: 2px; } .dual-bar-row .class-name .total{ display: block; font-family: var(--font-mono); font-size: 10px; color: var(--ink-5); margin-top: 6px; letter-spacing: 0.08em; } .bars-stack{display: flex; flex-direction: column; gap: 8px} .bar-pair{display: grid; grid-template-columns: 50px 1fr 60px; gap: 10px; align-items: center} .bar-pair .stage-lbl{ font-family: var(--font-mono); font-size: 10px; color: var(--ink-4); letter-spacing: 0.14em; text-transform: uppercase; } .bar-pair .track{ height: 14px; background: var(--surface-3); border-radius: 3px; position: relative; overflow: hidden; } .bar-pair .fill{ height: 100%; background: var(--brand); border-radius: 3px; width: 0; transition: width 1.4s cubic-bezier(0.22, 1, 0.36, 1); } .bar-pair.bor .fill{background: var(--brand-light)} .bar-pair.combined .fill{background: var(--success-mid)} .bar-pair .pct{ font-family: var(--font-display); font-size: 16px; color: var(--ink); text-align: right; letter-spacing: -0.005em; } .bar-pair.bor .pct{color: var(--brand-light)} .bar-pair.combined .pct{color: var(--success)} .chart-legend{ display: flex; gap: 18px; margin-top: 24px; padding-top: 18px; border-top: 1px solid var(--border-soft); flex-wrap: wrap; } .chart-legend .item{ display: flex; align-items: center; gap: 8px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-3); font-weight: 500; } .chart-legend .swatch{width: 12px; height: 12px; border-radius: 2px} @media (max-width: 720px){ .dual-bar-row{grid-template-columns: 1fr; gap: 12px} .bar-pair{grid-template-columns: 44px 1fr 50px} } /* ============================================================ PULL QUOTE ============================================================ */ .pull-quote{margin: 60px 0; padding: 0 0 0 24px; position: relative; max-width: 720px} .pull-quote::before{ content: "\201C"; position: absolute; left: -20px; top: -40px; font-family: var(--font-display); font-style: normal; color: var(--brand-light); font-size: 180px; color: var(--brand); opacity: 0.18; line-height: 1; pointer-events: none; } .pull-quote blockquote{ font-family: var(--font-display); font-style: normal; color: var(--brand-light); font-size: clamp(20px, 2.2vw, 28px); line-height: 1.32; color: var(--ink); letter-spacing: -0.012em; font-weight: 700; margin: 0 0 20px; } .pull-quote blockquote em{font-style: normal; color: var(--brand)} .pull-quote .attribution{ font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } /* ============================================================ TAKEAWAYS ============================================================ */ .takeaway-block{margin: 36px 0 12px; position: relative} .takeaway-grid{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; background: var(--surface-2); border: 1px solid var(--border); border-radius: 6px; overflow: hidden; } @media (max-width: 800px){.takeaway-grid{grid-template-columns: 1fr}} .takeaway{ padding: 30px 26px; border-right: 1px solid var(--border); position: relative; background: var(--surface-2); transition: background 0.25s; } .takeaway:hover{background: var(--surface)} .takeaway:last-child{border-right: 0} .takeaway .num{ font-family: var(--font-display); font-style: normal; color: var(--brand-light); font-size: 48px; color: var(--brand); line-height: 1; margin-bottom: 14px; display: block; letter-spacing: -0.02em; } .takeaway h4{ font-family: var(--font-body); font-size: 16px; font-weight: 600; color: var(--ink); margin: 0 0 10px; letter-spacing: -0.005em; line-height: 1.3; } .takeaway p{font-size: 14px; color: var(--ink-3); line-height: 1.55; margin: 0} @media (max-width: 800px){ .takeaway{border-right: 0; border-bottom: 1px solid var(--border)} .takeaway:last-child{border-bottom: 0} } /* ============================================================ FAQ + METHODOLOGY + DIVIDER ============================================================ */ .faq{margin: 36px 0 12px; border-top: 1px solid var(--border)} .faq-item{border-bottom: 1px solid var(--border)} .faq-item summary{ list-style: none; cursor: pointer; padding: 24px 0; display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; font-family: var(--font-display); font-size: 22px; font-weight: 700; color: var(--ink); letter-spacing: -0.008em; line-height: 1.35; transition: color 0.25s; } .faq-item summary::-webkit-details-marker{display: none} .faq-item summary:hover{color: var(--brand)} .faq-item summary .plus{ flex-shrink: 0; width: 30px; height: 30px; border: 1px solid var(--ink); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-family: var(--font-body); font-size: 16px; color: var(--ink); transition: all 0.3s; } .faq-item[open] summary{color: var(--brand)} .faq-item[open] summary .plus{ transform: rotate(45deg); background: var(--brand); color: fff; border-color: var(--brand); } .faq-item .answer{ padding: 0 0 26px; font-size: 16px; color: var(--ink-3); line-height: 1.65; max-width: 720px; } .faq-item .answer code{ font-family: var(--font-mono); font-size: 13px; background: var(--surface-2); padding: 1px 6px; border-radius: 3px; color: var(--ink); } .section-divider{display: flex; align-items: center; gap: 16px; margin: 60px 0 32px; color: var(--ink-4)} .section-divider .line{flex: 1; height: 1px; background: var(--border)} .section-divider .dot{width: 7px; height: 7px; border: 1px solid var(--brand); transform: rotate(45deg); background: fff} .methodology{ margin: 48px 0 12px; padding: 28px 32px; background: var(--surface-2); border: 1px solid var(--border-soft); border-left: 3px solid var(--brand); border-radius: 0 4px 4px 0; font-size: 14px; line-height: 1.65; color: var(--ink-3); } .methodology h5{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--brand); font-weight: 500; margin-bottom: 12px; } .methodology a{color: var(--brand); text-decoration: underline} .methodology code{ font-family: var(--font-mono); font-size: 12.5px; background: var(--surface); padding: 1px 6px; border-radius: 3px; color: var(--ink); } .methodology strong{display: block; margin-bottom: 6px; color: var(--ink); font-weight: 600; margin-top: 16px} .methodology strong:first-child{margin-top: 0} /* ============================================================ SIDEBAR ============================================================ */ aside{position: sticky; top: 32px} @media (max-width: 1100px){aside{position: static}} .side-card{ background: var(--brand); color: fff; padding: 34px 28px; border-radius: 6px; position: relative; overflow: hidden; margin-bottom: 18px; } .side-card::before{ content:""; position: absolute; inset: 0; background-image: linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px); background-size: 40px 40px; pointer-events: none; } .side-card::after{ content:""; position: absolute; width: 180px; height: 180px; border-radius: 50%; background: radial-gradient(circle, rgba(255,255,255,0.06), transparent 65%); top: -60px; right: -60px; pointer-events: none; } .side-card .inner{position: relative; z-index: 2} .side-card .pill{ display: inline-flex; align-items: center; gap: 7px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; background: rgba(255,255,255,0.14); color: fff; padding: 6px 12px; border-radius: 100px; margin-bottom: 20px; font-weight: 500; } .side-card .pill::before{ content:""; width: 6px; height: 6px; background: var(--success-bright); border-radius: 50%; box-shadow: 0 0 0 0 rgba(74,222,128,0.5); animation: livePulse 2.4s infinite; } .side-card h4{ font-family: var(--font-display); font-size: 28px; font-weight: 700; color: fff; margin: 0 0 14px; line-height: 1.15; letter-spacing: -0.018em; } .side-card h4 em{font-style: normal; color: var(--brand-light); color: B7E1F5} .side-card p{ font-size: 14px; color: rgba(255,255,255,0.78); line-height: 1.6; margin-bottom: 22px; } .cta-btn{ display: inline-flex; align-items: center; gap: 8px; background: fff; color: var(--brand); padding: 13px 22px; font-family: var(--font-body); font-weight: 600; font-size: 13px; letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none; border-radius: 4px; transition: all 0.25s; border: none; cursor: pointer; } .cta-btn:hover{background: var(--surface-3); transform: translateX(3px)} .cta-btn .arrow{width: 14px; height: 14px} .side-list{ background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 24px 22px; margin-bottom: 18px; } .side-list h5{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 16px; font-weight: 500; } .side-list ul{list-style: none; padding: 0; margin: 0} .side-list li{ padding: 12px 0; border-bottom: 1px solid var(--border-soft); font-size: 14px; color: var(--ink-2); display: flex; gap: 12px; align-items: flex-start; line-height: 1.5; } .side-list li:last-child{border-bottom: 0} .side-list li svg{ flex-shrink: 0; width: 18px; height: 18px; color: var(--success); margin-top: 2px; padding: 2px; background: var(--success-light); border-radius: 50%; } .side-spread{ background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 6px; padding: 24px; position: relative; } .side-spread::before{ content:""; position: absolute; left: 0; top: 24px; bottom: 24px; width: 2px; background: var(--brand); } .side-spread .label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--brand); margin-bottom: 8px; font-weight: 500; } .side-spread h6{ font-family: var(--font-display); font-size: 19px; color: var(--ink); font-weight: 700; line-height: 1.25; margin: 0 0 16px; letter-spacing: -0.008em; } .side-spread .spread-row{ display: grid; grid-template-columns: minmax(0,1fr) auto; gap: 8px; align-items: baseline; padding: 8px 0; border-top: 1px solid var(--border-soft); font-size: 12.5px; color: var(--ink-3); } .side-spread .spread-row:first-of-type{border-top: 0} .side-spread .spread-row .sk{line-height: 1.3} .side-spread .spread-row .sv{ font-family: var(--font-display); font-size: 17px; color: var(--brand); font-weight: 700; letter-spacing: -0.008em; } .side-spread .spread-row.commercial .sv{color: var(--success)} /* ============================================================ FINAL CTA ============================================================ */ .final-cta-wrap{padding: 0 32px; margin-top: 36px} @media (max-width: 700px){.final-cta-wrap{padding: 0 20px}} .final-cta{ max-width: 1240px; margin: 0 auto; position: relative; background: linear-gradient(135deg, var(--brand-deep) 0%, var(--brand) 60%, var(--brand-mid) 100%); color: fff; overflow: hidden; border-radius: 6px; padding: 72px 64px; } .final-cta::before{ content:""; position: absolute; inset: 0; background-image: linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px); background-size: 56px 56px; pointer-events: none; mask-image: radial-gradient(ellipse at top left, rgba(0,0,0,0.7), transparent 80%); -webkit-mask-image: radial-gradient(ellipse at top left, rgba(0,0,0,0.7), transparent 80%); } .final-cta::after{ content:""; position: absolute; bottom: -160px; right: -160px; width: 440px; height: 440px; background: radial-gradient(circle, rgba(255,255,255,0.1), transparent 65%); border-radius: 50%; pointer-events: none; } .final-cta-inner{ position: relative; z-index: 2; display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 56px; align-items: center; } @media (max-width: 920px){ .final-cta-inner{grid-template-columns: 1fr; gap: 40px} .final-cta{padding: 48px 32px} } .final-cta .cta-kicker{ font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: rgba(255,255,255,0.7); font-weight: 500; margin-bottom: 22px; display: inline-flex; align-items: center; gap: 12px; } .final-cta .cta-kicker::before{content:""; width: 28px; height: 1px; background: rgba(255,255,255,0.4)} .final-cta h2{ font-family: var(--font-display); font-size: clamp(24px, 2.6vw, 36px); font-weight: 700; line-height: 1.04; color: fff; margin-bottom: 22px; letter-spacing: -0.022em; } .final-cta h2 em{font-style: normal; color: var(--brand-light); color: B7E1F5} .final-cta p{ font-size: 17px; color: rgba(255,255,255,0.82); line-height: 1.6; margin-bottom: 32px; max-width: 540px; } .cta-row{display: flex; gap: 14px; flex-wrap: wrap} .cta-btn.ghost{ background: transparent; color: fff; border: 1px solid rgba(255,255,255,0.3); } .cta-btn.ghost:hover{background: rgba(255,255,255,0.08); color: fff; transform: translateX(3px)} .cta-spread{ background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.14); border-radius: 6px; padding: 28px 26px; position: relative; } .cta-spread::before{ content:""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--success-bright); border-radius: 6px 0 0 6px; } .cta-spread .cta-label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: rgba(255,255,255,0.65); margin-bottom: 16px; font-weight: 500; } .cta-spread .cta-row-stat{ display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: baseline; padding: 7px 0; border-top: 1px solid rgba(255,255,255,0.1); font-size: 12.5px; color: rgba(255,255,255,0.75); } .cta-spread .cta-row-stat:first-of-type{border-top: 0} .cta-spread .cta-row-stat .v{ font-family: var(--font-display); font-size: 18px; color: fff; font-weight: 700; letter-spacing: -0.008em; } .cta-spread .cta-row-stat .v em{color: var(--success-bright); font-style: normal; color: var(--brand-light)} /* ============================================================ FOOTER ============================================================ */ footer{ background: var(--brand-deep); color: rgba(255,255,255,0.6); padding: 40px 0 36px; font-size: 13px; margin-top: 60px; } footer .row{ display: flex; justify-content: space-between; flex-wrap: wrap; gap: 16px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; } footer .row a{color: fff; text-decoration: none; opacity: 0.7; transition: opacity 0.25s} footer .row a:hover{opacity: 1} /* ============================================================ ARTICLE BYLINE / META ============================================================ */ .article-byline{ display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin-top: 22px; padding-top: 20px; border-top: 1px solid var(--border-soft); font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } .article-byline .by-item{display: flex; align-items: center; gap: 8px} .article-byline .by-item svg{width: 14px; height: 14px; color: var(--brand)} .article-byline .by-item .by-strong{color: var(--ink-2); font-weight: 600} .article-byline .by-sep{width: 4px; height: 4px; background: var(--ink-5); border-radius: 50%; opacity: 0.5} /* ============================================================ STICKY HIRE-US BAR (top of article) ============================================================ */ .hire-bar{ background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 14px 20px; margin: 0 0 48px; display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; box-shadow: var(--shadow-sm); position: relative; } .hire-bar::before{ content:""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--success); border-radius: 6px 0 0 6px; } .hire-bar .hb-text{ font-family: var(--font-display); font-size: 18px; color: var(--ink); font-weight: 700; line-height: 1.35; letter-spacing: -0.005em; } .hire-bar .hb-text em{font-style: normal; color: var(--brand-light); color: var(--brand)} .hire-bar .hb-actions{display: flex; gap: 10px; align-items: center; flex-wrap: wrap} .hire-bar .hb-note{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } @media (max-width: 720px){ .hire-bar{padding: 16px 18px} .hire-bar .hb-text{font-size: 16px} } /* ============================================================ INLINE CTA BLOCK (mid-article) ============================================================ */ .inline-cta{ margin: 48px 0; padding: 32px 36px; background: linear-gradient(135deg, var(--brand) 0%, var(--brand-light) 100%); color: fff; border-radius: 6px; position: relative; overflow: hidden; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 32px; align-items: center; } .inline-cta::before{ content:""; position: absolute; inset: 0; background-image: linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px); background-size: 40px 40px; pointer-events: none; mask-image: radial-gradient(ellipse at top right, rgba(0,0,0,0.5), transparent 75%); -webkit-mask-image: radial-gradient(ellipse at top right, rgba(0,0,0,0.5), transparent 75%); } .inline-cta::after{ content:""; position: absolute; top: -80px; right: -80px; width: 240px; height: 240px; background: radial-gradient(circle, rgba(255,255,255,0.1), transparent 65%); border-radius: 50%; pointer-events: none; } .inline-cta .ic-content{position: relative; z-index: 2} .inline-cta .ic-kicker{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--success-bright); font-weight: 500; margin-bottom: 10px; } .inline-cta h3{ font-family: var(--font-display); font-size: clamp(22px, 2.4vw, 28px); color: fff; margin: 0 0 8px; font-weight: 700; letter-spacing: -0.012em; line-height: 1.2; } .inline-cta h3 em{font-style: normal; color: var(--brand-light); color: B7E1F5} .inline-cta p{ font-size: 14.5px; color: rgba(255,255,255,0.82); margin: 0; line-height: 1.55; max-width: 540px; } .inline-cta .ic-actions{ display: flex; gap: 10px; flex-wrap: wrap; position: relative; z-index: 2; } @media (max-width: 760px){ .inline-cta{grid-template-columns: 1fr; gap: 22px; padding: 28px 26px} } /* ============================================================ CLASS PANEL CTA (inside each tab) ============================================================ */ .panel-cta{ margin: 22px 0 0; padding: 20px 24px; background: var(--surface); border: 1px solid var(--border); border-left: 3px solid var(--success); border-radius: 0 4px 4px 0; display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; } .panel-cta .pc-text{ font-size: 14.5px; color: var(--ink-2); line-height: 1.5; max-width: 540px; } .panel-cta .pc-text strong{color: var(--ink); font-weight: 600} .panel-cta .cta-btn{ background: var(--brand); color: fff; padding: 12px 20px; font-size: 12.5px; } .panel-cta .cta-btn:hover{background: var(--brand-light); color: fff} /* ============================================================ SERVICE AREA SIDEBAR BLOCK ============================================================ */ .side-service{ background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 22px 22px 20px; margin-bottom: 18px; } .side-service h5{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 8px; font-weight: 500; } .side-service h6{ font-family: var(--font-display); font-size: 18px; color: var(--ink); font-weight: 700; line-height: 1.25; margin: 0 0 14px; letter-spacing: -0.008em; } .side-service .muni-list{ display: flex; flex-wrap: wrap; gap: 6px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; } .side-service .muni{ padding: 4px 9px; background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 3px; color: var(--ink-3); transition: all 0.2s; } .side-service .muni:hover{ background: var(--brand-100); color: var(--brand); border-color: var(--brand-200); cursor: default; } .side-service .muni-note{ margin-top: 12px; font-size: 12px; color: var(--ink-4); line-height: 1.5; } /* ============================================================ CONCLUSION CTA STRIP ============================================================ */ .conclusion-cta{ margin: 32px 0 8px; padding: 22px 26px; background: var(--surface-tint); border: 1px solid var(--border-soft); border-radius: 6px; display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; } .conclusion-cta .cc-text{ font-family: var(--font-display); font-size: 19px; color: var(--ink); font-weight: 700; line-height: 1.4; letter-spacing: -0.008em; max-width: 560px; } .conclusion-cta .cc-text em{font-style: normal; color: var(--brand-light); color: var(--brand)} .conclusion-cta .cta-btn{background: var(--brand); color: fff} .conclusion-cta .cta-btn:hover{background: var(--brand-light); color: fff} /* ============================================================ TRUST BANNER (below status bar) ============================================================ */ .trust-banner{ background: var(--surface-2); border-bottom: 1px solid var(--border-soft); padding: 14px 0; } .trust-items{ display: flex; flex-wrap: wrap; gap: 28px; justify-content: center; font-size: 13px; color: var(--ink-3); } .trust-item{ display: flex; align-items: center; gap: 8px; } .trust-item svg{ width: 16px; height: 16px; color: var(--success); flex-shrink: 0; } .trust-item strong{color: var(--ink); font-weight: 600} @media (max-width: 720px){ .trust-items{gap: 14px; font-size: 12px} .trust-item svg{width: 14px; height: 14px} } /* ============================================================ "OFFICIAL SOURCE" callout (different from biz CTA) ============================================================ */ .gov-source{ margin: 24px 0; padding: 18px 22px; background: F0F7FC; border: 1px solid C4DAEA; border-left: 3px solid var(--info); border-radius: 0 6px 6px 0; } .gov-source .gs-label{ display: inline-flex; align-items: center; gap: 7px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--info); font-weight: 500; margin-bottom: 8px; } .gov-source .gs-label svg{width: 14px; height: 14px} .gov-source p{ font-size: 14.5px; line-height: 1.6; color: var(--ink-2); margin: 0; } .gov-source a{ color: var(--info); text-decoration: none; border-bottom: 1px solid currentColor; font-weight: 500; } .gov-source a:hover{color: var(--brand)} /* ============================================================ AUTHOR BIO (E-E-A-T) ============================================================ */ .author-bio{ margin: 48px 0 0; padding: 28px 32px; background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 6px; display: grid; grid-template-columns: 60px minmax(0, 1fr); gap: 22px; align-items: start; } .author-bio .author-avatar{ width: 60px; height: 60px; border-radius: 50%; background: var(--brand); display: flex; align-items: center; justify-content: center; color: fff; font-family: var(--font-display); font-size: 28px; } .author-bio .author-info .author-label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; margin-bottom: 4px; } .author-bio .author-info h5{ font-family: var(--font-display); font-size: 22px; color: var(--ink); margin: 0 0 6px; font-weight: 700; letter-spacing: -0.01em; } .author-bio .author-info p{ font-size: 14px; color: var(--ink-3); line-height: 1.55; margin: 0 0 8px; } .author-bio .author-credentials{ display: flex; flex-wrap: wrap; gap: 6px; } .author-bio .author-credentials .cred{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.08em; padding: 3px 9px; background: var(--surface); border: 1px solid var(--border-soft); border-radius: 3px; color: var(--ink-3); } @media (max-width: 600px){ .author-bio{grid-template-columns: 1fr; gap: 14px} } /* ============================================================ TL;DR (top of article) ============================================================ */ .tldr{ margin: 0 0 36px; padding: 24px 28px; background: linear-gradient(135deg, var(--surface-tint) 0%, var(--surface-2) 100%); border: 1px solid var(--border); border-radius: 6px; position: relative; } .tldr::before{ content:""; position: absolute; top: 0; bottom: 0; left: 0; width: 4px; background: var(--brand); border-radius: 6px 0 0 6px; } .tldr .tldr-label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--brand); font-weight: 500; margin-bottom: 12px; } .tldr h2{ font-family: var(--font-display); font-size: 20px; color: var(--ink); margin: 0 0 14px; font-weight: 700; border: 0; padding: 0; } .tldr ul{ margin: 0; padding-left: 20px; font-size: 15px; line-height: 1.6; color: var(--ink-2); } .tldr ul li{ margin-bottom: 6px; padding-left: 4px; } .tldr ul li strong{color: var(--ink)} /* Citation tag style */ .cite{ font-size: 0.85em; vertical-align: super; line-height: 1; color: var(--brand); text-decoration: none; font-family: var(--font-mono); padding: 1px 4px; background: var(--brand-100); border-radius: 2px; margin-left: 2px; font-weight: 500; } .cite:hover{background: var(--brand-200); color: var(--brand-deep)} /* Sources block at end */ .sources-block{ margin: 60px 0 0; padding: 32px 36px; background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 6px; } .sources-block h3{ font-family: var(--font-display); font-size: 22px; color: var(--ink); margin: 0 0 18px; font-weight: 700; } .sources-block ol{ margin: 0; padding-left: 22px; font-size: 13.5px; line-height: 1.7; color: var(--ink-3); } .sources-block ol li{ margin-bottom: 8px; padding-left: 4px; } .sources-block ol li a{ color: var(--brand); text-decoration: none; border-bottom: 1px solid var(--border); } .sources-block ol li a:hover{ border-bottom-color: var(--brand); color: var(--brand-light); } /* Improved late fee calculator */ .fee-calc{ margin: 28px 0; padding: 28px 32px; background: var(--surface); border: 1px solid var(--border); border-radius: 6px; box-shadow: var(--shadow-md); } .fee-calc h4{ font-family: var(--font-display); font-size: 22px; color: var(--ink); margin: 0 0 6px; font-weight: 700; letter-spacing: -0.01em; } .fee-calc h4 em{font-style: normal; color: var(--brand-light); color: var(--brand)} .fee-calc .calc-sub{ font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 22px; font-weight: 500; } .fee-calc .calc-controls{ display: grid; grid-template-columns: 1fr 1fr; gap: 22px; margin-bottom: 24px; } .fee-calc .calc-field label{ display: block; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 8px; font-weight: 500; } .fee-calc .calc-field input, .fee-calc .calc-field select{ width: 100%; padding: 12px 14px; border: 1px solid var(--border); border-radius: 4px; font-family: var(--font-body); font-size: 15px; color: var(--ink); background: var(--surface); transition: border 0.2s; } .fee-calc .calc-field input:focus, .fee-calc .calc-field select:focus{ outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-100); } .fee-calc .calc-result{ padding: 20px 24px; background: var(--brand); color: fff; border-radius: 4px; text-align: center; } .fee-calc .calc-result .calc-r-label{ font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: rgba(255,255,255,0.7); margin-bottom: 8px; font-weight: 500; } .fee-calc .calc-result .calc-r-amount{ font-family: var(--font-display); font-size: clamp(24px, 2.6vw, 36px); font-weight: 700; line-height: 1; letter-spacing: -0.025em; } .fee-calc .calc-result .calc-r-breakdown{ margin-top: 10px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.1em; color: rgba(255,255,255,0.65); } @media (max-width: 600px){ .fee-calc .calc-controls{grid-template-columns: 1fr; gap: 14px} } /* Bottom-dock section navigation */ body{padding-bottom: 80px} .bottom-dock{ position: fixed; bottom: 16px; left: 16px; right: 16px; z-index: 100; max-width: 1100px; margin: 0 auto; background: var(--brand-deep, 004163); border-radius: 8px; box-shadow: 0 8px 28px rgba(0,0,0,0.18), 0 2px 6px rgba(0,0,0,0.08); opacity: 0; transform: translateY(12px); transition: opacity 0.25s, transform 0.25s; pointer-events: none; overflow: hidden; } .bottom-dock.visible{ opacity: 1; transform: translateY(0); pointer-events: auto; } .bottom-dock .dock-progress{ height: 2px; background: rgba(255,255,255,0.1); } .bottom-dock .dock-progress-fill{ height: 100%; width: 0%; background: linear-gradient(90deg, var(--brand-light, 0B6697), B7E1F5); transition: width 0.15s linear; } .bottom-dock .dock-inner{ display: flex; align-items: center; gap: 10px; padding: 10px 14px; } .bottom-dock .dock-list{ display: flex; gap: 4px; flex: 1; overflow-x: auto; scrollbar-width: none; } .bottom-dock .dock-list::-webkit-scrollbar{display: none} .bottom-dock .dock-item{ display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 99px; background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.75); text-decoration: none; font-family: var(--font-body); font-size: 12px; font-weight: 500; white-space: nowrap; transition: all 0.15s; border: 1px solid transparent; } .bottom-dock .dock-item:hover{ background: rgba(255,255,255,0.12); color: fff; } .bottom-dock .dock-item.active{ background: var(--brand-light, 0B6697); color: fff; } .bottom-dock .dock-item .dn{ font-size: 9.5px; letter-spacing: 0.14em; font-weight: 700; opacity: 0.7; } .bottom-dock .dock-item.active .dn{opacity: 0.9} .bottom-dock .dock-cta{ flex-shrink: 0; display: inline-flex; align-items: center; gap: 4px; padding: 8px 14px; border-radius: 99px; background: fff; color: var(--brand-deep, 004163); text-decoration: none; font-family: var(--font-body); font-size: 12px; font-weight: 700; white-space: nowrap; transition: all 0.15s; } .bottom-dock .dock-cta:hover{ background: B7E1F5; transform: translateX(2px); } @media (max-width: 720px){ .bottom-dock{bottom: 8px; left: 8px; right: 8px} .bottom-dock .dock-inner{padding: 8px 10px} .bottom-dock .dock-item{padding: 5px 10px; font-size: 11px} .bottom-dock .dock-item .dl{display: none} .bottom-dock .dock-item.active .dl{display: inline} .bottom-dock .dock-cta{padding: 7px 12px; font-size: 11.5px} } /* ============================================================ PAYMENT-METHOD GRID (replaces class-tabs from Leyden) ============================================================ */ .method-tabs-wrap{margin: 32px 0 24px} .method-tabs{ display: flex; gap: 4px; background: var(--surface-2); border: 1px solid var(--border); border-radius: 6px 6px 0 0; padding: 6px; overflow-x: auto; position: relative; z-index: 2; scrollbar-width: thin; } .method-tab{ flex: 1; background: transparent; border: 0; padding: 14px 12px 12px; font-family: var(--font-body); font-size: 13px; font-weight: 500; color: var(--ink-3); cursor: pointer; border-radius: 4px; transition: all 0.2s; text-align: left; min-width: 130px; line-height: 1.25; } .method-tab:hover{background: var(--surface); color: var(--ink)} .method-tab.active{ background: var(--brand); color: fff; box-shadow: var(--shadow-sm); } .method-tab .mt-label{ display: block; font-size: 13.5px; font-weight: 600; letter-spacing: -0.008em; margin-bottom: 2px; } .method-tab .mt-hint{ display: block; font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 500; opacity: 0.7; } .method-panel{display: none; animation: fadeUp 0.4s ease-out} .method-panel.active{display: block} .method-panel-header{ background: var(--surface); border: 1px solid var(--border); border-top: 0; padding: 24px 28px 22px; border-radius: 0 0 6px 6px; margin-bottom: 24px; display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: 32px; align-items: center; } .method-panel-header .mph-text .mph-tag{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--brand); font-weight: 500; margin-bottom: 8px; } .method-panel-header .mph-text h3{ font-family: var(--font-display); font-size: clamp(20px, 2.2vw, 28px); font-weight: 400; color: var(--ink); letter-spacing: -0.015em; line-height: 1.1; margin: 0 0 8px; } .method-panel-header .mph-text h3 em{font-style: normal; color: var(--brand-light); font-weight: 600} .method-panel-header .mph-text .mph-meta{ font-size: 14px; color: var(--ink-4); line-height: 1.45; } .method-panel-header .mph-stats{ display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; } .method-panel-header .mph-cell{ padding: 12px 14px; background: var(--surface-tint); border: 1px solid var(--border-soft); border-radius: 4px; } .method-panel-header .mph-cell .mph-cl{ font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; margin-bottom: 5px; } .method-panel-header .mph-cell .mph-cv{ font-family: var(--font-display); font-size: 18px; color: var(--ink); letter-spacing: -0.012em; line-height: 1.2; font-weight: 400; } .method-panel-header .mph-cell .mph-cv.success{color: var(--success)} .method-panel-header .mph-cell .mph-cv.alert{color: var(--alert)} @media (max-width: 800px){ .method-panel-header{grid-template-columns: 1fr; gap: 24px} } /* Step-by-step inside method panels */ .method-steps{ background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 32px 36px; margin-bottom: 16px; } .method-steps h4{ font-family: var(--font-display); font-size: 22px; color: var(--ink); margin: 0 0 22px; font-weight: 400; letter-spacing: -0.01em; } .method-steps h4 em{font-style: normal; color: var(--brand-light); font-weight: 600} .step-row{ display: grid; grid-template-columns: 44px 1fr; gap: 18px; padding: 16px 0; border-top: 1px solid var(--border-soft); } .step-row:first-of-type{border-top: 0; padding-top: 0} .step-row .step-num{ font-family: var(--font-display); color: var(--brand-light); font-size: 32px; color: var(--brand); line-height: 1; letter-spacing: -0.02em; } .step-row .step-content h5{ font-family: var(--font-body); font-size: 16px; font-weight: 600; color: var(--ink); margin: 0 0 4px; letter-spacing: -0.005em; } .step-row .step-content p{ font-size: 14.5px; color: var(--ink-3); line-height: 1.55; margin: 0; } .step-row .step-content p code{ font-family: var(--font-mono); font-size: 12.5px; background: var(--surface-2); padding: 1px 6px; border-radius: 3px; color: var(--ink); } /* Deadline / fact strip (replaces stat-band content but reuses the look) */ /* Warning panel */ .warning-panel{ margin: 28px 0; padding: 22px 26px 24px; background: FEF7F0; border: 1px solid F4D5BA; border-left: 3px solid var(--alert); border-radius: 0 6px 6px 0; } .warning-panel h5{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--alert); font-weight: 500; margin: 0 0 10px; display: flex; align-items: center; gap: 8px; } .warning-panel h5 .icn{ width: 14px; height: 14px; } .warning-panel p{ font-size: 15px; line-height: 1.6; color: var(--ink-2); margin: 0 0 10px; } .warning-panel p:last-child{margin: 0} .warning-panel strong{color: var(--ink); font-weight: 600} /* Big "key deadline" block (replaces the journey block) */ .deadline-block{ margin: 28px 0; padding: 36px 32px 40px; background: var(--brand); color: fff; border-radius: 6px; position: relative; overflow: hidden; } .deadline-block::before{ content:""; position: absolute; inset: 0; background-image: linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px); background-size: 40px 40px; pointer-events: none; mask-image: radial-gradient(ellipse at top left, rgba(0,0,0,0.7), transparent 80%); -webkit-mask-image: radial-gradient(ellipse at top left, rgba(0,0,0,0.7), transparent 80%); } .deadline-block::after{ content:""; position: absolute; top: -100px; right: -100px; width: 260px; height: 260px; background: radial-gradient(circle, rgba(255,255,255,0.08), transparent 65%); border-radius: 50%; pointer-events: none; } .deadline-block .head{position: relative; z-index: 2; text-align: center; margin-bottom: 30px} .deadline-block h4{ font-family: var(--font-display); font-size: clamp(22px, 2.6vw, 28px); color: fff; margin: 0 0 6px; font-weight: 400; letter-spacing: -0.015em; } .deadline-block h4 em{font-style: normal; color: B7E1F5; font-weight: 600} .deadline-block .sub{ font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: rgba(255,255,255,0.65); font-weight: 500; } .deadline-row{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; position: relative; z-index: 2; } .deadline-col{ text-align: center; padding: 22px 14px 20px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.14); border-radius: 4px; } .deadline-col.featured{ background: rgba(255,255,255,0.16); border-color: var(--success-bright); } .deadline-col .dc-label{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: rgba(255,255,255,0.65); margin-bottom: 10px; font-weight: 500; } .deadline-col .dc-num{ font-family: var(--font-display); font-size: clamp(22px, 2.8vw, 30px); font-weight: 400; color: fff; letter-spacing: -0.02em; line-height: 1; margin-bottom: 6px; } .deadline-col .dc-stage{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--success-bright); font-weight: 500; } @media (max-width: 700px){ .deadline-row{grid-template-columns: 1fr; gap: 10px} } /* Fee comparison table (compact version of comparison-table for fees) */ .fee-table{ margin: 28px 0 24px; background: var(--surface); border: 1px solid var(--border); border-radius: 6px; overflow: hidden; box-shadow: var(--shadow-md); } .fee-table-header{ background: var(--brand); color: fff; padding: 18px 28px; display: flex; justify-content: space-between; align-items: center; gap: 16px; position: relative; } .fee-table-header::after{ content:""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1px; background: linear-gradient(90deg, var(--success-bright), transparent 50%); } .fee-table-header h4{ font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.18em; font-weight: 500; margin: 0; text-transform: uppercase; color: fff; } .fee-table-header .source{ font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; color: rgba(255,255,255,0.7); text-transform: uppercase; } .fee-table table{width: 100%; border-collapse: collapse} .fee-table th, .fee-table td{ padding: 14px 18px; border-bottom: 1px solid var(--border-soft); font-size: 14px; vertical-align: top; } .fee-table th{ background: var(--surface-2); text-align: left; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; } .fee-table th:not(:first-child), .fee-table td:not(:first-child){text-align: right} .fee-table td:first-child{ color: var(--ink); font-weight: 500; font-size: 14px; } .fee-table td:first-child .fee-hint{ display: block; font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-4); font-weight: 500; margin-top: 3px; } .fee-table td.num{ font-family: var(--font-display); font-size: 17px; color: var(--ink); letter-spacing: -0.01em; font-weight: 400; } .fee-table td.num.success{color: var(--success); font-weight: 500} .fee-table td.num.alert{color: var(--alert); font-weight: 500} .fee-table tr:last-child td{border-bottom: 0} .fee-table tr:hover td{background: var(--surface-tint)} @media (max-width: 800px){ .fee-table{overflow-x: auto} .fee-table table{min-width: 600px} } /* ============================================================ PIN FINDER LIST (Find Your PIN section) ============================================================ */ .pin-finder-list{ list-style: none; padding: 0; margin: 16px 0 24px; } .pin-finder-list li{ margin-bottom: 12px; font-size: 16px; line-height: 1.6; color: var(--ink-2); padding-left: 0; } .pin-finder-list li:not(.pin-finder-fast){ padding-left: 24px; position: relative; } .pin-finder-list li:not(.pin-finder-fast)::before{ content: '•'; position: absolute; left: 8px; color: var(--brand); font-weight: 600; } .pin-finder-fast{ background: linear-gradient(135deg, F0FDF4 0%, FAFFFC 100%); border: 1px solid BBEFCB; border-left: 3px solid var(--success); border-radius: 0 6px 6px 0; padding: 16px 20px 18px; margin-bottom: 16px; } .pin-finder-tag{ display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--success); font-weight: 600; margin-bottom: 8px; } .pin-finder-tag svg{ width: 12px; height: 12px; } .pin-finder-content strong{ color: var(--ink); font-weight: 600; } .pin-finder-content a{ color: var(--success); font-weight: 500; text-decoration: none; border-bottom: 1px solid currentColor; } .pin-finder-content a:hover{ color: var(--brand); } System online · Tax bills available now Cook County · 2025 Tax Year · First Installment · Due April 1, 2026 Sourced from Cook County Treasurer, Assessor & IL Dept. of Revenue Last reviewed May 2026 Reviewed by Cook County Tax Appeals attorneys & CPAs 2026 Payment Guide Tax Year 2025 First Installment Pay your Cook County property taxes — without paying more than you have to. For the 2025 tax year, the First Installment is due Wednesday, April 1, 2026 . There are six official ways to pay — and one is completely free. This guide walks through each method, what to bring, the fees that apply, and how to make sure next year's bill is lower. Due date April 1, 2026 First Installment 55% of 2024 total Late charge 0.75%/mo Free option Online ACH Cook County Tax Appeals Updated May 21, 2026 10 min read Option 1 · Fastest & free Online (ACH) $0 fee Posts in 2–3 business days Option 2 · Convenience cost Credit / debit card 2.10 % Third-party · non-refundable Option 3 · USPS postmark counts By mail $0 fee Allow up to 2 weeks to post Option 4 · ~400 IL Chase branches Chase or community bank $0 fee Coupon required Late after April 1, 2026 Late charge 0.75 %/mo 9% per year (cut from 18% in 2024) Partial payments accepted — interest still accrues on the unpaid balance. Bills mailed ~ 0 By March 2, 2026 First Installment is 0 % Of 2024's total tax Days until April 1 — Pay early to avoid risk Late charge per month 0.75 % Down from 1.5% (2024 reform) Treasurer phone 312-443-5100 Mon–Fri 8:30am–4:30pm Paying your bill is one part. Lowering next year's is the other. Get a property-specific savings estimate in 60 seconds. $0 upfront · 25% of savings only Calculate my savings ★ TL;DR — The 30-Second Version For homeowners short on time Due date: Wednesday, April 1, 2026 (Tax Year 2025 First Installment) [1] Cheapest way to pay: Online ACH from your bank account at cookcountytreasurer.com — $0 fee [2] If you're late: 0.75% per month interest applies to the unpaid balance — mandated by Illinois law [3] Bills mailed: By March 2, 2026 (~1.8 million bills sent) [1] Want to pay less next year? File a property tax appeal — Cook County's data shows appeals work for every property class If you searched "pay Cook County property taxes," you almost certainly want two things — to pay your bill on time, and to avoid paying more than you legally owe. This guide answers both, using only official sources from the Cook County Treasurer, Cook County Assessor, and Illinois Department of Revenue. The 2025 Tax Year First Installment is due Wednesday, April 1, 2026 . 01 · The basics How Cook County property taxes actually work Four separate Cook County offices each handle a different piece of your tax bill, and confusing them is the most common reason owners overpay. The brief version: Cook County Assessor — sets your property's value. The Assessor does not collect payments and does not set tax rates. Most successful property tax appeals start here. Cook County Board of Review — an independent three-member panel that hears appeals after the Assessor closes. Often the higher-yield stage for residential owners. Cook County Clerk — calculates the tax rate for your specific area based on local taxing district budgets (schools, parks, the city, the county). Also handles delinquent tax redemption. Cook County Treasurer — prints, mails, and collects the bill. This is the office you actually pay. The Treasurer also handles refunds and the annual tax sale. Two installments, two different rules Cook County bills property taxes in two installments each year. They behave very differently. The First Installment is an estimate. It's set at exactly 55% of the previous year's total tax, regardless of what's happened to your property since. Importantly, your exemptions don't apply to the First Installment — they're applied to the Second Installment later in the year. So even seniors and homeowners with active exemptions pay the unreduced 55% in the spring. The Second Installment is the true reconciliation. It uses your current assessed value, the latest local tax rates, and all of your applicable exemptions to produce the actual total — minus whatever you already paid in the spring. It typically arrives in late summer or fall. Current 2025 tax year deadlines Cook County Treasurer · Tax year 2025 (billed and paid in 2026) Bills mailed March 2, 2026 ~1.8M bills First Installment due April 1, 2026 By 11:59 PM Second Installment Summer/Fall 2026 Date TBD Why April 1 instead of the usual March 1? The Cook County government secured a one-month legislative extension for the 2025 cycle because the prior installment (Tax Year 2024 Second Installment, due December 15, 2025) ran late due to billing-service issues. The extension is one-time only — the standard March deadline returns next year unless something changes again. 02 · Find your PIN Find your Property Index Number and bill Every Cook County property has a unique 14-digit Property Index Number (PIN) . You need it to pay, to look up your bill, and to file any appeal. PINs look like this: 12-34-567-890-1234 Four ways to find yours: Fastest Cook County Tax Appeals search — enter your address at cookcountytaxappeal.com for one-click access to your PIN, current tax bill, exemption history, and an instant savings estimate. Aggregates data from the Treasurer, Assessor, and Property Tax Portal so you don't need to visit multiple government sites. Cook County Treasurer: cookcountytreasurer.com — search by property address or PIN. Shows current bill, payment history, exemptions, and refund status [2] . Cook County Property Tax Portal: cookcountypropertyinfo.com — the inter-agency portal showing data from the Assessor, Treasurer, Clerk, and Board of Review in one place. Cook County Assessor: cookcountyassessor.com — search by address for assessed value, exemption history, and property characteristics [4] . Official source The Cook County Treasurer's payment portal at cookcountytreasurer.com is the only payment system officially accepted by Cook County. Avoid any third-party site that asks for payment. Once you have your PIN, you can view: current and prior tax bill amounts, payment history, property classification, recorded exemptions, refund status, and direct links to the Treasurer's payment system. If you plan to file an appeal Save your 14-digit PIN somewhere accessible. Every official filing with the Assessor, the Board of Review, or the Illinois Property Tax Appeal Board (PTAB) requires it. The same number opens your records across all three agencies. 03 · How to pay Six ways to pay your Cook County property tax bill The Treasurer's Office accepts six official payment methods. Most owners use online ACH because it's free and posts within a few business days. But there are good reasons to use the others — partial payments, prior-year balances, or simply not having a bank account that supports ACH. Use the tabs below to compare each option side by side. Online (ACH) Free · 2–3 days Credit / debit 2.10% fee By mail USPS postmark Chase Bank ~400 IL branches Community bank 100+ partners In person Treasurer's Office Recommended · most owners Online from your bank account Pay directly via ACH from a checking or savings account on the official Cook County Treasurer website. This is the only online payment method the Treasurer endorses — and it's free. Fee $0 Posts in 2–3 business days Pay online step by step 1 Find your PIN The fastest way is the Cook County Tax Appeals search — enter your address for one-click PIN lookup. Alternatively, use cookcountytreasurer.com (Treasurer) or cookcountypropertyinfo.com (Property Tax Portal). 2 Open the Treasurer's payment portal Go to cookcountytreasurer.com and select the blue "Pay Online for Free" box. A photo of your property should appear when you enter your PIN or address — confirm it's the correct parcel before proceeding. 3 Enter your bank routing & account number The portal uses ACH debit. Have your check or bank account info ready. There is no fee from the Treasurer or from your bank for this method. 4 Verify the payment posted Within 2–3 business days, your payment status on the Treasurer's portal should update to "Paid." Save the confirmation page or email. If the status hasn't changed after 5 business days, call 312-443-5100 . Avoid third-party sites Several websites charge fees to forward payments to the Treasurer. None of these are official. Always start from cookcountytreasurer.com directly — anywhere else, you're paying extra to a middleman. Convenient · costs extra Online with a credit or debit card The Treasurer accepts credit and debit cards online, but a third-party processor — not the county — charges a 2.10% convenience fee. The fee is non-refundable, even if you file a successful appeal. Fee 2.10% On a $5,000 bill $105 extra When card payment makes sense For most owners, the 2.10% fee on a property tax payment is far more than any rewards card cashback rate (which top out around 2%). But if you're earning a one-time signup bonus, hitting a minimum-spend threshold, or you genuinely need the float between charge date and statement due date, the math can work — just calculate the full cost before you charge. The card fee is non-refundable If your appeal is later successful and the Treasurer issues you a refund, you'll get back the tax overpayment — but not the 2.10% processing fee. The fee is collected by an outside vendor and the county can't return it. Free · USPS postmark counts By mail Mail a check with your tax bill payment coupon to the Treasurer's lockbox. The USPS postmark date is your payment date, so a check mailed on April 1 and received April 7 still counts as on time. Fee $0 Allow to post ~2 weeks What to include in your mailed payment 1 The original payment coupon Detach the bottom of your tax bill. Don't send a photocopy or a printed image from a screen — the Treasurer's lockbox processes by scanning the coupon. 2 A check with all the right info written on it Write your 14-digit PIN, taxpayer name, property address (including unit number), mailing address, phone number, email, and tax year/installment on the check itself. If anything's unclear, the lockbox will reach out — which delays posting. 3 Send to the correct PO box Cook County Treasurer PO Box 805438 Chicago, IL 60680-4116 4 Save your canceled check Your canceled check is your receipt. Verify the payment posted on the Treasurer's portal within two weeks of mailing. Private carriers don't count the same way USPS uses the postmark date as your payment date — so a check stamped April 1 is on time even if it arrives April 7. But FedEx, UPS, and other private carriers count the receipt date , which means a package sent April 1 that arrives April 2 is one day late. Stick with USPS if you're mailing close to the deadline. ~400 Illinois Chase branches At any Chase Bank location You can pay at any of the nearly 400 Chase Bank branches in Illinois — including locations outside Cook County. You don't need to bank with Chase. They accept partial payments and provide a dated receipt. Fee $0 Partial payments Accepted What to bring to Chase 1 Your original tax bill payment coupon Or a printed copy from the Treasurer's portal. One coupon per PIN, per installment. 2 A check with full account info written on it Same requirements as mailing a check: PIN, taxpayer name, property address with unit, mailing address, phone, email, and tax year/installment all written on the check itself. 3 Check branch hours Branches vary. Some close mid-afternoon. If you're cutting close to the deadline, confirm hours before driving over. The Cook County Tax Appeals search tool links to the Chase branch finder. 100+ partner banks At a community bank More than 100 community banks in Cook County accept property tax payments — but only from their own account holders. If you already bank locally, this is often the most convenient in-person option. Fee $0 Requirement Active account Where to find the participating-bank list The complete list of community banks accepting Cook County tax payments is on the Treasurer's website — search "Ways to Pay." If your bank isn't on the list, your fallback options are online, by mail, or at a Chase branch. Downtown Chicago · Loop In person at the Treasurer's Office For owners who want a receipt directly from the Treasurer's Office — or who have prior-year, redemption, or open-item balances that can't be paid elsewhere — the office at 118 N. Clark Street accepts payments in Room 112. Office hours Mon–Fri 8:30am–4:30pm Phone 312-443-5100 Required for delinquent balances Open Item and Forfeiture Redemption bills (Tax Year 2022 and prior delinquencies) can only be paid by mail or in person at the Treasurer's Office — not at Chase, not at community banks, and not online. If you have a prior-year balance, start with the Cook County Clerk's Office (118 N. Clark Street, Room 434) to get the redemption bill first. Cook County Treasurer's Office 118 North Clark Street, Room 112 Chicago, Illinois 60602 312-443-5100 All six payment methods — at a glance Cook County Treasurer · 2026 cycle Method Fee Speed to post Partial OK? Online — ACH From a bank account $0 2–3 days Yes Online — card Credit or debit 2.10% 2–3 days Yes By mail Check + coupon $0 ~2 weeks Yes Chase Bank ~400 IL branches $0 ~1 week Yes Community bank If you have an account $0 ~1 week Bank-dependent In person 118 N. Clark Street $0 Same day Yes If you own 10 or more properties (bulk & TPA program) Commercial portfolios and large landlords face two specific rules: The 10+ PIN bulk fee — if you submit online payments for 10 or more PINs in a single session, the Treasurer applies a $2.00 enhanced processing fee per PIN, per installment . On a 100-PIN portfolio that's $200 per installment, $400 per year. Third Party Agent (TPA) program — for high-volume managers (typically hundreds of parcels), the Treasurer offers a TPA program that delivers tax data electronically and streamlines bulk payment. Contact the Treasurer's Office to apply. For portfolio owners — the math compounds If you own multiple properties, appeals scale fast . A 10% reduction on a single $5,000 commercial bill saves $500. Across a 25-PIN portfolio averaging that bill, that's $12,500 a year. We handle every parcel across all three appeal tiers (CCAO, BOR, PTAB) under one engagement. No upfront cost — 25% of first-year savings only. Calculate savings for my portfolio If your mortgage company pays through escrow Most homeowners with a mortgage have their property taxes paid automatically through an escrow account. The lender adds a portion of your annual tax bill to each monthly mortgage payment, holds it in escrow, and remits the lump sum to the Treasurer when it's due. Three things to know: You are still ultimately responsible. The Treasurer is explicit: if your escrow agent fails to pay on time, the late charge accrues against you, not the lender. Don't assume — verify. Check the payment posted. A few business days after the deadline, look up your PIN on the Treasurer's portal. Status should say "Paid." If it doesn't, contact your lender immediately. Don't double-pay. If your escrow is active, don't also pay yourself — you'll create a refund situation that can take months to resolve. 04 · If you're late What happens if you miss the deadline The First Installment late charge is 0.75% per month [3] of any unpaid balance. That's a state-mandated interest rate, set by Illinois law and applied uniformly across all 102 Illinois counties. One piece of good news: this rate was cut in half in 2024 . Until February 2024, the late charge was 1.5% per month (18% per year). A reform law signed by Governor Pritzker — promoted by the Cook County Treasurer and the Chicago Community Trust — reduced the rate to 0.75% per month (9% per year). For owners who fall behind, that saves about $90 per year on every $1,000 of overdue tax. What the late charge actually costs 0.75% per month on unpaid balance Unpaid balance 1 month late 3 months late 6 months late 12 months late $1,000 Modest single-family $7.50 $22.50 $45 $90 $3,000 Typical residential $22.50 $67.50 $135 $270 $5,000 Higher residential / small commercial $37.50 $112.50 $225 $450 $15,000 Commercial / multi-family $112.50 $337.50 $675 $1,350 Interactive late-fee calculator Estimate the cost of being late on your bill Unpaid balance ($) Months late 1 month 3 months 6 months 9 months 12 months Estimated interest charge $67.50 $3,000 × 0.75%/mo × 3 months Partial payments — almost always cheaper than carrying credit-card debt The Treasurer accepts partial payments at any of the six methods. Interest still accrues on the remaining unpaid balance, but the math usually works strongly in your favor: 0.75% monthly is roughly 9% annually, far below the 20–29% APR most credit cards charge. If paying in full means putting the balance on a credit card, partial payments to the Treasurer are almost always the cheaper option. The Payment Plan Calculator For overdue balances of $100 or more, the Treasurer's Payment Plan Calculator lets you set up a monthly or twice-monthly payment schedule to catch up over time. It's a free tool available on the Treasurer's website. A payment plan does NOT stop the annual tax sale This is critical and frequently misunderstood. The Treasurer is explicit: setting up a payment plan keeps you on a schedule, but it does not prevent your delinquent taxes from being sold at the annual tax sale to a third-party buyer. To prevent a tax sale, the full overdue balance must be paid before the sale begins. The payment plan is a budgeting tool, not a tax-sale shield. If you're approaching a tax sale, contact the Treasurer's Office or a property tax attorney immediately — don't rely on a payment plan to save the property. Beyond the standard 0.75% monthly rate, there are additional interest tiers that kick in if a property goes through the tax sale process and into redemption. Those rates can be materially higher. If you're more than 13 months overdue, get professional help — the math gets ugly quickly. If you missed an exemption: Certificate of Error If you qualified for the Homeowner, Senior, Senior Freeze, Persons with Disabilities, or Veterans exemption in a past year but it wasn't applied to your bill, the Cook County Assessor's Office can process a Certificate of Error . This is a refund or corrected-bill mechanism that lets you redeem missing exemptions for the current tax year plus the prior four years (2025, 2024, 2023, 2022, and 2021) [4] . To apply, file a Certificate of Error application with the Assessor's Office at cookcountyassessor.com/exemptions . Most exemptions auto-renew once initially applied — but if you sold a property, moved, hold the property in trust, or own multiple properties, exemptions may not roll over automatically. From the Assessor's Office Per the Cook County Assessor, the Senior Exemption alone is worth approximately $300/year on average, and combined with the Homeowner Exemption can reach $750/year. The Homeowner Exemption itself can be worth up to $2,000 depending on local tax rates [4] . Returned checks & bounced payments If a payment is returned by your bank for any reason (insufficient funds, closed account, stop-payment), the Treasurer treats the original payment as void. The unpaid balance accrues interest from the original due date, and the Treasurer may also assess a returned-check fee. Contact the Treasurer's Office at 312-443-5100 immediately if you discover a returned check, before the next interest accrual date. Prior-year delinquencies (Open Item & Forfeiture Redemption) If you have unpaid taxes from Tax Year 2022 or earlier , those balances are no longer with the Treasurer — they've moved to the Cook County Clerk's Office for redemption. These are called "Open Item" or "Forfeiture Redemption" bills, and they can only be paid by mail or in person at the Treasurer's Office once the Clerk has issued the redemption bill [5] . To get a redemption bill, visit the Cook County Clerk's Office at 118 N. Clark Street, Room 434, Chicago, IL 60602, or call 312-603-2107 . 05 · Lower next year's bill The real way to cut your Cook County property tax bill Paying on time avoids the late charge. But the only way to actually reduce what you owe is to lower your assessed value . That happens through a property tax appeal — and Cook County's data shows appeals work, especially when you escalate beyond the Assessor's initial decision. The Cook County system has three appeal tiers: Cook County Assessor (CCAO) — files first, when the Assessor opens your township's appeal window. Most successful but moderate reductions happen here. Cook County Board of Review (BOR) — an independent agency that hears appeals after the Assessor closes. Often the higher-yield stage for residential owners — success rates run 40-60% on most residential classes vs 17-26% at the Assessor. Illinois Property Tax Appeal Board (PTAB) — the state-level appeal, if BOR doesn't produce enough relief. Each tier applies a different review standard, so a "No change" at one stage doesn't prevent success at the next. The data consistently shows that filing at both the CCAO and BOR produces larger reductions than filing at either one alone. One key thing about appeals and your current bill An appeal lowers your future tax bills — not the one due April 1, 2026. The First Installment is locked in at 55% of 2024's total. If you appeal successfully now, the benefit shows up on the Second Installment this fall and on all bills going forward. So the safest strategy is: pay your current bill on time, and file an appeal in parallel. Don't wait — every township has a 30-day appeal window Pre-register your property and we'll file the moment your window opens . Cook County appeal deadlines shift constantly. Each of the 38 townships gets a brief window each year — usually 30 days. We track every deadline automatically. Pre-register once, and the day your township opens, our team files a data-driven appeal on your behalf. $0 upfront. 25% of first-year savings only — paid only if we win. Pre-register my property Frequently asked questions When are Cook County property taxes due in 2026? + The Tax Year 2025 First Installment is due Wednesday, April 1, 2026 . Bills were mailed by March 2, 2026 and have been viewable online at cookcountytreasurer.com since February 20, 2026. The Second Installment for tax year 2025 is expected later in 2026 — the exact date is set by the Treasurer once assessments and rates are finalized. Can I pay Cook County property taxes online for free? + Yes. Online payments via ACH (directly from a checking or savings account) are free on the official Cook County Treasurer website at cookcountytreasurer.com. The 2.10% processing fee only applies to credit and debit card payments, which are also accepted but charged by a third-party processor. Always start from the official Treasurer site to avoid unofficial third-party services that may add fees. How much is the late charge if I miss the April 1 deadline? + The late charge is 0.75% per month of any unpaid balance, mandated by Illinois law. That's about 9% per year. This rate was cut in half in 2024 from the previous 1.5%/month (18%/year). The Treasurer accepts partial payments, but interest still accrues on whatever balance remains unpaid after the deadline. Why is the First Installment 55% of last year's bill? + By Illinois law, the First Installment is an estimate set at exactly 55% of the previous year's total tax. The remaining 45% (plus or minus any changes from your current assessment, the current tax rates, and your exemptions) gets billed in the Second Installment. The 55% structure makes the First Installment predictable — you can calculate it from your prior year's bill — and your exemptions are applied only to the Second Installment. Do exemptions reduce the First Installment? + No. Exemptions only apply to the Second Installment . So even seniors, homeowners with active homestead exemptions, and disabled veterans pay the full unreduced 55% of last year's bill in April. The Second Installment is where the math gets reconciled — your exemptions, your current assessed value, and the current tax rates all get applied together. If you're missing an exemption you qualify for, the Assessor's Office can process a Certificate of Error to apply it retroactively. What if my mortgage company pays my taxes through escrow? + Most homeowners with a mortgage have escrow accounts that pay property taxes automatically. You are still ultimately responsible — if the lender pays late, the late charge accrues against your property, not the bank. A few business days after the deadline, look up your PIN on the Treasurer's portal to confirm the payment posted. If it didn't, contact your lender immediately. And if you have escrow, don't also pay yourself — you'll create a refund situation that takes months to resolve. Where can I pay in person? + Four in-person options. (1) Any of the nearly 400 Chase Bank branches in Illinois — you don't need to bank with Chase, just bring your tax bill coupon. (2) Any of the 100+ community banks participating in the program, if you have an active account there. (3) The Cook County Treasurer's Office at 118 N. Clark Street, Room 112, Chicago, IL 60602. (4) For prior-year delinquencies, the Cook County Clerk's Office (Room 434, same building) to get the redemption bill first. Can I appeal my property taxes and still pay on time? + Yes — and this is the recommended strategy. Pay your bill on time and in full to avoid the late charge, then file an appeal in parallel. The appeal process can take several months. If your appeal succeeds and reduces your assessment, the Treasurer's Office will issue a refund for any overpayment. Skipping the payment to "wait and see" doesn't pause the late charge — it just adds 0.75%/month on top of whatever you eventually owe. What is the 10+ PIN bulk fee for online payments? + If you submit online payments for 10 or more PINs in a single session , the Treasurer applies a $2.00 enhanced processing fee per PIN, per installment. This affects commercial portfolios and landlords with multiple properties. For high-volume users (typically hundreds of parcels), the Treasurer offers a Third Party Agent (TPA) program with electronic tax data delivery — apply through the Treasurer's Office. Take control of your Cook County property tax bill Paying on time avoids the 0.75% monthly late charge. But the only proven way to lower your tax bill is a strategic property tax appeal — and Cook County's published data shows appeals work for every property class, especially when escalated across both the Assessor and the Board of Review. Cook County Tax Appeals files appeals across all three tiers (CCAO, BOR, PTAB), monitors your township's deadline so you never miss the 30-day filing window, and charges nothing upfront. Our fee is 25% of first-year savings — paid only if we successfully reduce your bill. Sources & verification Every claim in this guide is verified against official Cook County and Illinois state government sources. Last reviewed May 2026. Cook County Treasurer's Office. "Pappas says property tax bills now online at cookcountytreasurer.com." Press release, February 20, 2026. cookcountytreasurer.com Cook County Treasurer's Office. "Pay Online with Your Bank Account." cookcountytreasurer.com/payonlinewithyourbankaccount Public Act 103-0007 (2023), reducing Illinois property tax interest rate from 1.5% to 0.75% per month, effective for tax year 2023 forward. Confirmed by Cook County Treasurer reform statement. Cook County Assessor's Office. "Property Tax Exemptions." cookcountyassessor.com/exemptions Cook County Treasurer's Office. "Ways to Pay." cookcountytreasurer.com/waystopay Cook County Treasurer's Office. "Making Cook County Property Tax Payments at Chase Bank." cookcountytreasurer.com/makingpaymentsatchasebank Illinois Department of Revenue. "Penalties and Interest for Illinois Taxes." Publication 103, September 2025. tax.illinois.gov Cook County Property Tax Portal. cookcountypropertyinfo.com CC Reviewed by Cook County Tax Appeals Editorial Team This guide is reviewed by licensed Illinois tax attorneys and CPAs who specialize in Cook County property tax appeals across all 38 townships. Every fact is verified against current Cook County Treasurer, Assessor, and Illinois Department of Revenue publications. IL Bar IL CPA PTAB-Certified Updated May 2026 Pay your current bill on time. Then pre-register your property so we can fight to lower next year's. 60 seconds, $0 upfront. Calculate my savings Risk-free service $0 upfront. You only pay if we win. Our fee is 25% of your first year's tax savings. We escalate every case across all three appeal tiers — Assessor, BOR, and PTAB — so you capture the full reduction. Calculate my savings Why choose us 70% higher success rate than the average attorney appeal Instant AI-powered property analysis Licensed Illinois tax attorneys & CPAs 3-tier escalation: Assessor → BOR → PTAB Fee is just 25% of first-year savings Key 2026 dates 2025 tax year cycle Bills mailed Mar 2, 2026 Online payments open Feb 20, 2026 1st Installment due Apr 1, 2026 2nd Installment TBD 2026 Payment methods Cost & speed by method Online ACH $0 Mail $0 Chase $0 Community bank $0 In person $0 Credit/debit card 2.10% Related guides Cook County appeal deadlines Property tax calculator Cook County exemptions Residential appeals Commercial appeals Hire Cook County Tax Appeals Paying on time is half the battle. Paying less is the other half. For the 2025 tax year, the First Installment is due April 1, 2026. Pay it on time to avoid the 0.75% monthly late charge — then let us file an appeal in parallel. Cook County Tax Appeals handles all three appeal tiers (CCAO, BOR, PTAB) under one engagement. $0 upfront. 25% of first-year savings only — paid only if we win. Calculate my savings Free consultation 2025 tax year · key facts 1st Installment due Apr 1, 2026 First Installment 55% of 2024 Online ACH fee $0 Card fee 2.10% Late charge 0.75%/mo © Cook County Tax Appeals LLC cookcountytaxappeal.com · (708) 888-8880 (function(){ // Counter animation function format(v, fmt, decimals){ if (fmt === 'currency') return '$' + Math.floor(v).toLocaleString('en-US'); if (fmt === 'number') return Math.floor(v).toLocaleString('en-US'); if (decimals > 0) return v.toFixed(decimals); return Math.floor(v).toLocaleString('en-US'); } function animateCounter(el){ var raw = parseFloat(el.dataset.count); var decimals = parseInt(el.dataset.decimals || 0); var fmt = el.dataset.format || 'plain'; var duration = 1700; var start = performance.now(); function setText(text){ for (var i = 0; i 0){ deadlineEl.textContent = diff; } else { deadlineEl.textContent = 'Past due'; deadlineEl.style.fontSize = '24px'; } } // Stat band bar fills var statObs = new IntersectionObserver(function(entries){ entries.forEach(function(e){ if (e.isIntersecting){ e.target.classList.add('go'); statObs.unobserve(e.target); } }); }, { threshold: 0.3 }); document.querySelectorAll('.stat-cell').forEach(function(el){ statObs.observe(el); }); // Section counter highlighting var sections = document.querySelectorAll('h2[id]'); var counterItems = document.querySelectorAll('.section-counter .count-item'); if (sections.length && counterItems.length){ var secObs = new IntersectionObserver(function(entries){ entries.forEach(function(e){ if (e.isIntersecting){ var id = e.target.id; counterItems.forEach(function(item){ item.classList.toggle('active', item.dataset.target === id); }); } }); }, { rootMargin: '-30% 0px -60% 0px', threshold: 0 }); sections.forEach(function(s){ secObs.observe(s); }); counterItems.forEach(function(item){ item.addEventListener('click', function(){ var target = document.getElementById(item.dataset.target); if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }); }); } // Method tab switching function switchMethod(targetMethod){ document.querySelectorAll('.method-tab').forEach(function(tab){ tab.classList.toggle('active', tab.dataset.method === targetMethod); }); document.querySelectorAll('.method-panel').forEach(function(panel){ panel.classList.toggle('active', panel.dataset.panel === targetMethod); }); } document.querySelectorAll('.method-tab').forEach(function(tab){ tab.addEventListener('click', function(){ switchMethod(tab.dataset.method); }); }); // Hero method-mini cards link to the tabs document.querySelectorAll('.class-mini[data-tab-target]').forEach(function(card){ card.addEventListener('click', function(){ var target = card.dataset.tabTarget; // Map late -> the section, others -> the tab if (target === 'late'){ var lateSection = document.getElementById('s4'); if (lateSection) lateSection.scrollIntoView({ behavior: 'smooth', block: 'start' }); return; } // Map online, card, mail, bank to method tabs var methodMap = { 'online': 'online', 'card': 'card', 'mail': 'mail', 'bank': 'chase' }; var method = methodMap[target] || 'online'; switchMethod(method); var tabsSection = document.querySelector('.method-tabs-wrap'); if (tabsSection){ tabsSection.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); // Late-fee calculator var calcAmount = document.getElementById('calc-amount'); var calcMonths = document.getElementById('calc-months'); var calcResult = document.getElementById('calc-result-amount'); var calcBreakdown = document.getElementById('calc-result-breakdown'); function updateCalc(){ if (!calcAmount || !calcMonths || !calcResult) return; var amt = parseFloat(calcAmount.value) || 0; var mo = parseInt(calcMonths.value) || 1; var fee = amt * 0.0075 * mo; calcResult.textContent = '$' + fee.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}); calcBreakdown.textContent = '$' + amt.toLocaleString('en-US') + ' × 0.75%/mo × ' + mo + ' month' + (mo > 1 ? 's' : ''); } if (calcAmount) calcAmount.addEventListener('input', updateCalc); if (calcMonths) calcMonths.addEventListener('change', updateCalc); // Bottom-dock section navigation var iDock = document.getElementById('bottom-dock'); var iFill = document.getElementById('dock-fill'); var iArticle = document.querySelector('article'); var iItems = document.querySelectorAll('.bottom-dock .dock-item'); var iSections = ['s1','s2','s3','s4','s5']; if (iDock && iArticle){ function updateDock(){ var rect = iArticle.getBoundingClientRect(); var total = iArticle.offsetHeight - window.innerHeight; var scrolled = Math.max(0, -rect.top); var pct = total > 0 ? Math.min(100, (scrolled / total) * 100) : 0; if (iFill) iFill.style.width = pct + '%'; var heroEl = document.querySelector('header.hero'); var heroBottom = heroEl ? heroEl.offsetHeight : 600; if (window.scrollY > heroBottom - 60){ iDock.classList.add('visible'); } else { iDock.classList.remove('visible'); } var curIdx = 0; for (var i = 0; i { "@context": "https://schema.org", "@graph": [ { "@type": "Article", "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxesarticle", "isPartOf": { "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxes" }, "mainEntityOfPage": { "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxes" }, "headline": "How to Pay Cook County Property Taxes 2026 — Bill & Deadlines", "description": "Pay your Cook County property taxes online, by mail, or in person. 2026 deadlines, payment portal, fees, and how to lower next year's bill with an appeal.", "image": { "@type": "ImageObject", "url": "https://www.cookcountytaxappeal.com/blog/pay-cook-county-property-taxes-featured.png", "width": 1200, "height": 630 }, "datePublished": "2026-03-24T09:00:00-05:00", "dateModified": "2026-05-21T09:00:00-05:00", "author": { "@id": "https://www.cookcountytaxappeal.com/organization" }, "publisher": { "@id": "https://www.cookcountytaxappeal.com/organization" }, "articleSection": "Property Tax Payments", "keywords": "pay cook county property taxes, cook county tax portal, cook county property tax bill, cook county tax assessor tax bill, cook county property tax due dates", "about": [ { "@type": "Place", "name": "Cook County, Illinois" }, { "@type": "Thing", "name": "Cook County property tax payment" }, { "@type": "Thing", "name": "Cook County Treasurer" } ], "citation": [ { "@type": "CreativeWork", "name": "Cook County Treasurer Ways to Pay", "url": "https://www.cookcountytreasurer.com/waystopay.aspx" }, { "@type": "CreativeWork", "name": "Cook County Assessor Property Tax Exemptions", "url": "https://www.cookcountyassessor.com/exemptions" }, { "@type": "CreativeWork", "name": "Illinois Department of Revenue Publication 103", "url": "https://tax.illinois.gov/research/publications/pubs/penalties-and-interest-for-illinois-taxes.html" } ], "isBasedOn": [ "https://www.cookcountytreasurer.com", "https://www.cookcountyassessor.com", "https://tax.illinois.gov" ] }, { "@type": "WebPage", "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxes", "url": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxes", "name": "How to Pay Cook County Property Taxes 2026", "isPartOf": { "@id": "https://www.cookcountytaxappeal.com/website" }, "inLanguage": "en-US", "breadcrumb": { "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxesbreadcrumbs" } }, { "@type": "BreadcrumbList", "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxesbreadcrumbs", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://www.cookcountytaxappeal.com/" }, { "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs" }, { "@type": "ListItem", "position": 3, "name": "How to Pay Cook County Property Taxes" } ] }, { "@type": "WebSite", "@id": "https://www.cookcountytaxappeal.com/website", "url": "https://www.cookcountytaxappeal.com/", "name": "Cook County Tax Appeals", "publisher": { "@id": "https://www.cookcountytaxappeal.com/organization" } }, { "@type": ["Organization", "LegalService"], "@id": "https://www.cookcountytaxappeal.com/organization", "name": "Cook County Tax Appeals", "url": "https://www.cookcountytaxappeal.com/", "telephone": "+1-708-888-8880", "address": { "@type": "PostalAddress", "streetAddress": "6600 College Drive, Suite 207", "addressLocality": "Palos Heights", "addressRegion": "IL", "postalCode": "60463", "addressCountry": "US" }, "areaServed": { "@type": "AdministrativeArea", "name": "Cook County, Illinois" }, "serviceType": [ "Property Tax Appeal", "Cook County Assessor Appeal", "Cook County Board of Review Appeal", "Illinois Property Tax Appeal Board (PTAB) Appeal" ], "priceRange": "Contingency · 25% of first-year savings" }, { "@type": "HowTo", "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxeshowto", "name": "How to Pay Cook County Property Taxes", "description": "Step-by-step instructions for paying Cook County property taxes online, by mail, or in person for the 2025 tax year First Installment due April 1, 2026.", "totalTime": "PT10M", "step": [ { "@type": "HowToStep", "position": 1, "name": "Find your 14-digit Property Index Number (PIN)", "text": "Look up your PIN by entering your property address on the Cook County Tax Appeals search tool or the official Cook County Treasurer website." }, { "@type": "HowToStep", "position": 2, "name": "Choose your payment method", "text": "Pay online via ACH for free (recommended), online by credit or debit card with a 2.10% third-party processing fee, by mail with check and original payment coupon, in person at any of nearly 400 Chase Bank locations in Illinois, at a participating community bank where you have an account, or in person at the Treasurer's Office at 118 N. Clark Street, Room 112, Chicago." }, { "@type": "HowToStep", "position": 3, "name": "Pay by 11:59 PM April 1, 2026", "text": "The 2025 Tax Year First Installment is due Wednesday, April 1, 2026. Late payments incur a state-mandated 0.75% per month late charge on the unpaid balance." }, { "@type": "HowToStep", "position": 4, "name": "Verify the payment posted", "text": "Within 2-3 business days for online payments, or up to 2 weeks for mailed checks, confirm the payment status updated to 'Paid' on the Treasurer's portal. Save your receipt or confirmation email." } ] }, { "@type": "FAQPage", "@id": "https://www.cookcountytaxappeal.com/property-tax-appeal-blogs/pay-cook-county-property-taxesfaq", "mainEntity": [ { "@type": "Question", "name": "When are Cook County property taxes due in 2026?", "acceptedAnswer": { "@type": "Answer", "text": "The Tax Year 2025 First Installment is due Wednesday, April 1, 2026. Bills were mailed by March 2, 2026 and have been viewable online at cookcountytreasurer.com since February 20, 2026. The Second Installment for tax year 2025 is expected later in 2026; the exact date is set by the Treasurer once assessments and rates are finalized." } }, { "@type": "Question", "name": "Can I pay Cook County property taxes online for free?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Online payments via ACH directly from a checking or savings account are free on the official Cook County Treasurer website at cookcountytreasurer.com. The 2.10% processing fee only applies to credit and debit card payments, which are also accepted but charged by a third-party processor." } }, { "@type": "Question", "name": "How much is the late charge if I miss the April 1 deadline?", "acceptedAnswer": { "@type": "Answer", "text": "The late charge is 0.75% per month of any unpaid balance, mandated by Illinois law. That works out to about 9% per year. This rate was cut in half in 2024 from the previous 1.5% per month (18% per year). The Treasurer accepts partial payments, but interest still accrues on whatever balance remains unpaid after the deadline." } }, { "@type": "Question", "name": "Why is the First Installment 55% of last year's bill?", "acceptedAnswer": { "@type": "Answer", "text": "By Illinois law, the First Installment is an estimate set at exactly 55% of the previous year's total tax. The remaining balance gets billed in the Second Installment, which uses your current assessed value, current tax rates, and any applicable exemptions. The 55% structure makes the First Installment predictable and your exemptions are applied only to the Second Installment." } }, { "@type": "Question", "name": "Do exemptions reduce the First Installment?", "acceptedAnswer": { "@type": "Answer", "text": "No. Exemptions only apply to the Second Installment. Seniors, homeowners with active homestead exemptions, and disabled veterans all pay the full unreduced 55% of last year's bill in April. The Second Installment is where exemptions and the current assessed value get applied together. If you are missing an exemption you qualify for, the Assessor's Office can process a Certificate of Error to apply it retroactively." } }, { "@type": "Question", "name": "What if my mortgage company pays my taxes through escrow?", "acceptedAnswer": { "@type": "Answer", "text": "Most homeowners with a mortgage have escrow accounts that pay property taxes automatically. The Cook County Treasurer is explicit that property owners are still ultimately responsible. If the lender pays late, the late charge accrues against the property, not the bank. A few business days after the deadline, look up your PIN on the Treasurer's portal to confirm the payment posted. If you have active escrow, do not also pay yourself to avoid creating a refund situation." } }, { "@type": "Question", "name": "Can I appeal my property taxes and still pay on time?", "acceptedAnswer": { "@type": "Answer", "text": "Yes, and this is the recommended strategy. Pay your bill on time and in full to avoid the late charge, then file an appeal in parallel. The appeal process can take several months. If your appeal succeeds and reduces your assessment, the Treasurer's Office will issue a refund for any overpayment. Skipping the payment to wait does not pause the late charge." } }, { "@type": "Question", "name": "What is the 10+ PIN bulk fee for Cook County property tax online payments?", "acceptedAnswer": { "@type": "Answer", "text": "If you submit online payments for 10 or more PINs in a single session, the Treasurer applies a 2 dollar enhanced processing fee per PIN per installment. This affects commercial portfolios and landlords with multiple properties. For high-volume users typically managing hundreds of parcels, the Treasurer offers a Third Party Agent program with electronic tax data delivery." } } ] } ] } 01 The basics 02 Find your PIN 03 How to pay 04 If you're late 05 Lower next year's bill Consult →