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. <1>A NO vote repeals it." + }, "ballot_question_results_summary": "Showing {{count}} questions", "ballot_question_reset_filters": "Reset filters", "ballot_question_no_summary": "No summary available yet.",