From 4739510e8650e38e3c3a3cd2d8866dcf3abb8ab6 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sun, 26 Jul 2026 04:25:57 +0800 Subject: [PATCH 01/10] chore: prune dead mockup and primitive exports (IMP-04) Delete unused calculator/factsheet helpers and ui-primitives tokens with zero external importers. Unexport in-file-only tokens. Keep Skeleton and the commandInput focus shadow from current main. --- .../calculator-mockups/calculator-fixtures.ts | 8 +--- .../calculator-mockups/calculator-ui.tsx | 45 ++++++------------- src/components/factsheets/factsheets-data.ts | 14 +++--- src/components/factsheets/factsheets-icons.ts | 8 +--- src/components/ui-primitives.tsx | 29 +++--------- 5 files changed, 29 insertions(+), 75 deletions(-) diff --git a/src/components/calculator-mockups/calculator-fixtures.ts b/src/components/calculator-mockups/calculator-fixtures.ts index 707da5c54..c940c7415 100644 --- a/src/components/calculator-mockups/calculator-fixtures.ts +++ b/src/components/calculator-mockups/calculator-fixtures.ts @@ -15,7 +15,7 @@ import { export type CalculatorTone = "success" | "info" | "warning" | "danger"; -export type CalculatorOption = { +type CalculatorOption = { label: string; /** Compact label for segmented controls on narrow screens. */ short: string; @@ -622,12 +622,6 @@ export const calculators: CalculatorFixture[] = [ }, ]; -export const calculatorById = (id: string): CalculatorFixture => { - const found = calculators.find((calc) => calc.id === id); - if (!found) throw new Error(`Unknown calculator fixture: ${id}`); - return found; -}; - export const domainOrder: CalculatorDomain[] = ["mood", "anxiety", "substance", "risk", "distress"]; /** Extra directory entries shown as "coming soon" in directory-style mockups. */ diff --git a/src/components/calculator-mockups/calculator-ui.tsx b/src/components/calculator-mockups/calculator-ui.tsx index 3287217dc..352ab7ffc 100644 --- a/src/components/calculator-mockups/calculator-ui.tsx +++ b/src/components/calculator-mockups/calculator-ui.tsx @@ -1,7 +1,7 @@ "use client"; import { AlertTriangle, Check, CheckCheck, ClipboardCopy, RotateCcw, type LucideIcon } from "lucide-react"; -import { useCallback, useMemo, useState } from "react"; +import { useState } from "react"; import { cn } from "@/components/ui-primitives"; @@ -26,7 +26,7 @@ export function itemScore(item: CalculatorItem, selection: number | undefined): } /** True for scales whose every item is a yes/no checkbox (CAGE, SAD PERSONS). */ -export function isCheckboxOnly(calc: CalculatorFixture): boolean { +function isCheckboxOnly(calc: CalculatorFixture): boolean { return calc.items.length > 0 && calc.items.every((item) => item.kind === "checkbox"); } @@ -36,7 +36,7 @@ export function isCheckboxOnly(calc: CalculatorFixture): boolean { * CAGE/SAD PERSONS screen reads as a valid 0 result (started + complete) only * once the user chooses to record it, not merely by opening the scale. */ -export function seedCheckboxDefaults(calc: CalculatorFixture, answers: AnswerMap): AnswerMap { +function seedCheckboxDefaults(calc: CalculatorFixture, answers: AnswerMap): AnswerMap { if (!isCheckboxOnly(calc)) return answers; if (calc.items.every((item) => answers[item.id] !== undefined)) return answers; const next: AnswerMap = { ...answers }; @@ -46,13 +46,13 @@ export function seedCheckboxDefaults(calc: CalculatorFixture, answers: AnswerMap return next; } -export type CalculatorResult = { +type CalculatorResult = { label: string; tone: CalculatorTone; guidance: string; }; -export type CalculatorState = { +type CalculatorState = { answers: AnswerMap; score: number; /** Options-style items answered so far. */ @@ -157,38 +157,19 @@ export function deriveCalculator(calc: CalculatorFixture, answers: AnswerMap): D }; } -export function toggleCheckboxAnswer(answers: AnswerMap, itemId: string): AnswerMap { +function toggleCheckboxAnswer(answers: AnswerMap, itemId: string): AnswerMap { // Toggle between explicit 1 ("Yes") and 0 ("No") rather than clearing to // undefined, so an unticked box stays a recorded negative answer. return { ...answers, [itemId]: answers[itemId] === 1 ? 0 : 1 }; } -export function selectOptionAnswer(answers: AnswerMap, itemId: string, optionIndex: number): AnswerMap { +function selectOptionAnswer(answers: AnswerMap, itemId: string, optionIndex: number): AnswerMap { return { ...answers, [itemId]: answers[itemId] === optionIndex ? undefined : optionIndex }; } -export function useCalculatorState(calc: CalculatorFixture): CalculatorState { - const [answers, setAnswers] = useState({}); - - const toggleCheckbox = useCallback((itemId: string) => { - setAnswers((prev) => toggleCheckboxAnswer(prev, itemId)); - }, []); - - const selectOption = useCallback((itemId: string, optionIndex: number) => { - setAnswers((prev) => selectOptionAnswer(prev, itemId, optionIndex)); - }, []); - - const reset = useCallback(() => setAnswers({}), []); - - return useMemo( - () => ({ ...deriveCalculator(calc, answers), answers, toggleCheckbox, selectOption, reset }), - [answers, calc, reset, selectOption, toggleCheckbox], - ); -} - /* ---------- tone styling ---------- */ -export const toneChip: Record = { +const toneChip: Record = { success: "border-[color:var(--success-border)] bg-[color:var(--success-soft)] text-[color:var(--success)]", info: "border-[color:var(--info-border)] bg-[color:var(--info-soft)] text-[color:var(--info)]", warning: "border-[color:var(--warning-border)] bg-[color:var(--warning-soft)] text-[color:var(--warning)]", @@ -294,7 +275,7 @@ export function BandLegend({ calc, activeBand }: { calc: CalculatorFixture; acti /* ---------- interactive item controls ---------- */ -export function CheckboxRow({ +function CheckboxRow({ item, checked, onToggle, @@ -325,7 +306,7 @@ export function CheckboxRow({