Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions ballotQuestions/2026/24-firearms-referendum.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# ballotQuestions/2026/24-firearms-referendum.yaml
#
# Referendum petition (Article 48 §2) to repeal Chapter 135 of the Acts of 2024,
# "An Act Modernizing Firearm Laws." Filed with the Secretary of the
# Commonwealth on Aug. 9, 2024 by ten qualified voters; certified for the
# November 2026 ballot. Underlying bill is H.4885 of the 193rd General Court.
#
# id: descriptive. Unlike initiative petitions (which carry an AG YY-NN
# docket number — e.g. 25-03), referendum petitions in MA are not assigned
# a docket number; the Secretary's transmittal letter to the AG identifies
# the petition only by the chapter it seeks to repeal.
id: "24-firearms-referendum"
billId: "H4885"
title: "Referendum on the 2024 firearms law (Chapter 135)"
court: 193
electionYear: 2026
type: referendum
ballotStatus: certified
ballotQuestionNumber: null
relatedBillIds: []
description: null
atAGlance: null
fullSummary: |-
This referendum asks voters whether to repeal Chapter 135 of the Acts of 2024,
"An Act Modernizing Firearm Laws," an omnibus law passed by the Legislature
and signed by Governor Healey in 2024 that made several changes to the
state's firearm regulations.

Opponents of the law gathered enough certified signatures to qualify a
referendum petition for the November 2026 ballot. A YES vote keeps the law
in effect. A NO vote repeals it.

An official summary prepared by the Attorney General will appear in the
state's Information for Voters guide closer to the election.
pdfUrl: "https://malegislature.gov/Laws/SessionLaws/Acts/2024/Chapter135"
4 changes: 4 additions & 0 deletions components/ballotquestions/BallotQuestionHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { useTranslation } from "next-i18next"
import Link from "next/link"
import { Container, Row, Col } from "react-bootstrap"
import { useAuth } from "../auth"
Expand All @@ -16,6 +17,7 @@ export const BallotQuestionHeader = ({
ballotQuestion: BallotQuestion
bill: Bill | null
}) => {
const { t } = useTranslation("search")
const { notifications } = useFlags()
const { user } = useAuth()
const statusLabel = getBallotQuestionStatusLabel(ballotQuestion.ballotStatus)
Expand All @@ -36,6 +38,8 @@ export const BallotQuestionHeader = ({
return "Constitutional Amendment"
case "advisory":
return "Advisory Question"
case "referendum":
return t("ballot_question_type.referendum")
default:
return "Ballot Question"
}
Expand Down
17 changes: 17 additions & 0 deletions components/ballotquestions/OverviewTab.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Trans, useTranslation } from "next-i18next"
import type { ReactNode } from "react"
import { Col, Row } from "react-bootstrap"
import { BallotQuestion, Bill } from "../db"
Expand All @@ -14,6 +15,7 @@ export const OverviewTab = ({
bill: Bill | null
hearings: Hearing[]
}) => {
const { t } = useTranslation("search")
const sortedHearings = [...hearings].sort((a, b) => b.startsAt - a.startsAt)
const sectionCopyStyle = {
color: "#334155",
Expand Down Expand Up @@ -47,6 +49,21 @@ export const OverviewTab = ({
</div>
</SectionCard>

{ballotQuestion.type === "referendum" && (
<SectionCard>
<h3 className="h5 mb-2 text-dark">
{t("ballot_question_referendum_how_vote_works.title")}
</h3>
<p className="mb-0" style={sectionCopyStyle}>
<Trans
i18nKey="ballot_question_referendum_how_vote_works.body"
ns="search"
components={[<strong key="yes" />, <strong key="no" />]}
/>
</p>
</SectionCard>
)}

{ballotQuestion.atAGlance && ballotQuestion.atAGlance.length > 0 && (
<SectionCard>
<h3 className="h5 mb-3 text-dark">Key Details</h3>
Expand Down
3 changes: 2 additions & 1 deletion functions/src/ballotQuestions/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ export const BallotQuestion = withDefaults(
L("initiative_constitutional"),
L("legislative_referral"),
L("constitutional_amendment"),
L("advisory")
L("advisory"),
L("referendum")
),
ballotStatus: BallotQuestionStatus,
ballotQuestionNumber: Union(Number, Null),
Expand Down
3 changes: 2 additions & 1 deletion pages/ballotQuestions/[id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ export const getServerSideProps: GetServerSideProps = async ctx => {
"common",
"footer",
"testimony",
"profile"
"profile",
"search"
]))
}
}
Expand Down
7 changes: 7 additions & 0 deletions public/locales/en/search.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@
"rejected": "Rejected",
"accepted": "Accepted"
},
"ballot_question_type": {
"referendum": "Veto Referendum"
},
"ballot_question_referendum_how_vote_works": {
"title": "How the vote works",
"body": "This is a referendum on a law the Legislature has already enacted. <0>A YES vote keeps this law in effect.</0> <1>A NO vote repeals it.</1>"
},
"ballot_question_results_summary": "Showing {{count}} questions",
"ballot_question_reset_filters": "Reset filters",
"ballot_question_no_summary": "No summary available yet.",
Expand Down
Loading