diff --git a/ballotQuestions/2026/24-firearms-referendum.yaml b/ballotQuestions/2026/24-firearms-referendum.yaml
new file mode 100644
index 000000000..3fe006b41
--- /dev/null
+++ b/ballotQuestions/2026/24-firearms-referendum.yaml
@@ -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"
diff --git a/components/ballotquestions/BallotQuestionHeader.tsx b/components/ballotquestions/BallotQuestionHeader.tsx
index bddafedee..915a28eb0 100644
--- a/components/ballotquestions/BallotQuestionHeader.tsx
+++ b/components/ballotquestions/BallotQuestionHeader.tsx
@@ -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"
@@ -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)
@@ -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"
}
diff --git a/components/ballotquestions/OverviewTab.tsx b/components/ballotquestions/OverviewTab.tsx
index 569c478bb..4804dd127 100644
--- a/components/ballotquestions/OverviewTab.tsx
+++ b/components/ballotquestions/OverviewTab.tsx
@@ -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"
@@ -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",
@@ -47,6 +49,21 @@ export const OverviewTab = ({
+ {ballotQuestion.type === "referendum" && (
+
+
+ {t("ballot_question_referendum_how_vote_works.title")}
+
+
+ , ]}
+ />
+
+
+ )}
+
{ballotQuestion.atAGlance && ballotQuestion.atAGlance.length > 0 && (
Key Details
diff --git a/functions/src/ballotQuestions/types.ts b/functions/src/ballotQuestions/types.ts
index cca6adeb4..234dc8ff8 100644
--- a/functions/src/ballotQuestions/types.ts
+++ b/functions/src/ballotQuestions/types.ts
@@ -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),
diff --git a/pages/ballotQuestions/[id].tsx b/pages/ballotQuestions/[id].tsx
index 15394d031..6e12616bb 100644
--- a/pages/ballotQuestions/[id].tsx
+++ b/pages/ballotQuestions/[id].tsx
@@ -100,7 +100,8 @@ export const getServerSideProps: GetServerSideProps = async ctx => {
"common",
"footer",
"testimony",
- "profile"
+ "profile",
+ "search"
]))
}
}
diff --git a/public/locales/en/search.json b/public/locales/en/search.json
index c9e6bd8a1..4998206d9 100644
--- a/public/locales/en/search.json
+++ b/public/locales/en/search.json
@@ -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.",