From addc46c380446dad5f86aad433b0c99408bac571 Mon Sep 17 00:00:00 2001 From: Charles Graham Date: Thu, 4 Jun 2026 10:38:53 -0500 Subject: [PATCH 1/3] Add PR lint and test checks --- .github/workflows/pr-checks.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/pr-checks.yml diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 00000000..4120863b --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,29 @@ +name: PR Checks + +on: + pull_request: + branches: + - main + +jobs: + lint-and-test: + name: Lint and Test + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + + - name: Test + run: npm test -- --run From 69cf77b1ed99e288076ec405542907c0f0285fb8 Mon Sep 17 00:00:00 2001 From: Charles Graham Date: Thu, 4 Jun 2026 10:39:05 -0500 Subject: [PATCH 2/3] Fix existing lint violations --- lib/catalyst/avatar.jsx | 2 +- lib/catalyst/fieldset.jsx | 4 ++-- lib/catalyst/pagination.jsx | 16 ++++++++-------- lib/catalyst/switch.jsx | 2 +- lib/components/display/badge.jsx | 2 +- lib/components/display/card.jsx | 2 +- lib/components/form/fieldset.jsx | 4 ++-- lib/components/layout/container.jsx | 2 +- .../documentation/buttons/login-button.jsx | 2 +- .../documentation/forms/radio-group.jsx | 12 ++++++++---- .../getting-started/adding-tailwind.jsx | 3 +-- tailwind.config.js | 4 +++- 12 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib/catalyst/avatar.jsx b/lib/catalyst/avatar.jsx index 1204c983..163763be 100644 --- a/lib/catalyst/avatar.jsx +++ b/lib/catalyst/avatar.jsx @@ -51,7 +51,7 @@ export function Avatar({ {/* Add an inset border that sits on top of the image */} ); diff --git a/lib/catalyst/fieldset.jsx b/lib/catalyst/fieldset.jsx index 0111b6ab..ac362313 100644 --- a/lib/catalyst/fieldset.jsx +++ b/lib/catalyst/fieldset.jsx @@ -72,7 +72,7 @@ export function Label({ className, ...props }) { ); } -export function Description({ className, disabled, ...props }) { +export function Description({ className, ...props }) { return (
{children} diff --git a/lib/components/form/fieldset.jsx b/lib/components/form/fieldset.jsx index 87bc13bc..d3aae92c 100644 --- a/lib/components/form/fieldset.jsx +++ b/lib/components/form/fieldset.jsx @@ -62,7 +62,7 @@ export function Label({ className, ...props }) { return ; } -export function Description({ className, disabled, ...props }) { +export function Description({ className, ...props }) { const descriptionClass = useMemo(() => { return gwMerge( "gw-text-base/6 gw-text-zinc-500 data-[disabled]:gw-opacity-50 sm:gw-text-sm/6 dark:gw-text-zinc-400", @@ -78,7 +78,7 @@ export function Description({ className, disabled, ...props }) { ); } -export function ErrorMessage({ className, disabled, ...props }) { +export function ErrorMessage({ className, ...props }) { const errorMessageClass = useMemo(() => { return gwMerge( "gw-text-base/6 gw-text-red-600 data-[disabled]:gw-opacity-50 sm:gw-text-sm/6 dark:gw-text-red-500", diff --git a/lib/components/layout/container.jsx b/lib/components/layout/container.jsx index 364f5cac..7ef08425 100644 --- a/lib/components/layout/container.jsx +++ b/lib/components/layout/container.jsx @@ -8,7 +8,7 @@ function Container({ className, children, fluid }) { fluid ? "gw-max-w-screen" : "gw-max-w-screen-2xl", className, ); - }, [className]); + }, [className, fluid]); return
{children}
; } diff --git a/src/app-pages/documentation/buttons/login-button.jsx b/src/app-pages/documentation/buttons/login-button.jsx index 8507e3cb..129dd29c 100644 --- a/src/app-pages/documentation/buttons/login-button.jsx +++ b/src/app-pages/documentation/buttons/login-button.jsx @@ -71,7 +71,7 @@ const componentProps_ProfileDropdown = [ ]; function validateEmail(email) { - const re = /^[A-Za-z0-9_!#$%&'*+\/=?`{|}~^.-]+@[A-Za-z0-9.-]+$/gm; + const re = /^[A-Za-z0-9_!#$%&'*+/=?`{|}~^.-]+@[A-Za-z0-9.-]+$/gm; return re.test(email); } diff --git a/src/app-pages/documentation/forms/radio-group.jsx b/src/app-pages/documentation/forms/radio-group.jsx index 6d44dcde..5d35427e 100644 --- a/src/app-pages/documentation/forms/radio-group.jsx +++ b/src/app-pages/documentation/forms/radio-group.jsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from "react"; +import { useEffect, useState } from "react"; import { UsaceBox, Code, Text, H3, RadioGroup } from "../../../../lib"; import { CodeExample } from "../../../app-components/code-example"; import PropsTable from "../../../app-components/props-table"; @@ -59,11 +59,15 @@ const FT_TO_METERS_SCALAR = 0.3048; function RadioGroupDocs() { const [units, setUnits] = useState(null); const [value, setValue] = useState(200); - useMemo(() => { + useEffect(() => { if (units?.toLowerCase() == "en") - setValue((value / FT_TO_METERS_SCALAR).toFixed(2)); + setValue((currentValue) => + (currentValue / FT_TO_METERS_SCALAR).toFixed(2), + ); else if (units?.toLowerCase() == "si") - setValue((value * FT_TO_METERS_SCALAR).toFixed(2)); + setValue((currentValue) => + (currentValue * FT_TO_METERS_SCALAR).toFixed(2), + ); }, [units]); return ( diff --git a/src/app-pages/documentation/getting-started/adding-tailwind.jsx b/src/app-pages/documentation/getting-started/adding-tailwind.jsx index 43dbb51a..8bf84a6e 100644 --- a/src/app-pages/documentation/getting-started/adding-tailwind.jsx +++ b/src/app-pages/documentation/getting-started/adding-tailwind.jsx @@ -1,5 +1,4 @@ -import { UsaceBox, Code, Text, H3, H4, Divider, Badge } from "../../../../lib"; -import { CodeBlock } from "../../../app-components/code-block"; +import { UsaceBox, Code, Text, H3, Divider, Badge } from "../../../../lib"; import { CodeExample } from "../../../app-components/code-example"; import DocsPage from "../_docs-page"; import { TbPlayerTrackNext } from "react-icons/tb"; diff --git a/tailwind.config.js b/tailwind.config.js index 205ef05b..0f441e8c 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,3 +1,5 @@ +import forms from "@tailwindcss/forms"; + /** @type {import('tailwindcss').Config} */ export default { prefix: "gw-", @@ -32,5 +34,5 @@ export default { }, }, darkMode: "class", - plugins: [require("@tailwindcss/forms")], + plugins: [forms], }; From 75641ebab8b7c902f0566e7b3e7c58f7855a1db9 Mon Sep 17 00:00:00 2001 From: Charles Graham Date: Thu, 4 Jun 2026 10:39:25 -0500 Subject: [PATCH 3/3] Honor existing component defaults --- lib/components/button.jsx | 7 ++++--- lib/components/search.jsx | 1 + lib/composite/footer/index.jsx | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/components/button.jsx b/lib/components/button.jsx index 475ee7a4..c6975b27 100644 --- a/lib/components/button.jsx +++ b/lib/components/button.jsx @@ -201,6 +201,7 @@ export const Button = React.forwardRef(function Button( }, ref, ) { + const buttonStyle = outline ? "outline" : plain ? "plain" : style; let classes = gwMerge( base, // styles.base, @@ -211,9 +212,9 @@ export const Button = React.forwardRef(function Button( // : gwMerge(styles.solid, styles.colors[color ?? "dark/zinc"]), radii[radius], sizes[size], - style === "filled" ? colorsFilled[color] : "", - style === "outline" ? colorsOutline[color] : "", - style === "plain" ? colorsPlain[color] : "", + buttonStyle === "filled" ? colorsFilled[color] : "", + buttonStyle === "outline" ? colorsOutline[color] : "", + buttonStyle === "plain" ? colorsPlain[color] : "", className, ); diff --git a/lib/components/search.jsx b/lib/components/search.jsx index b5595dd6..c5ca18e0 100644 --- a/lib/components/search.jsx +++ b/lib/components/search.jsx @@ -40,6 +40,7 @@ function SearchDotGov({ accessKey, affiliate, placeholder, ...props }) { setSearchString(e.target.value); }} onKeyUp={handleKeyUp} + placeholder={placeholder} {...props} /> ); diff --git a/lib/composite/footer/index.jsx b/lib/composite/footer/index.jsx index 482e0179..991bd146 100644 --- a/lib/composite/footer/index.jsx +++ b/lib/composite/footer/index.jsx @@ -89,8 +89,8 @@ function Footer({ flickrUrl, instagramUrl, linkedInUrl, - usaceLinks, - externalLinks, + usaceLinks = defaultLinks, + externalLinks = defaultOffsiteLinks, armyLogo, army250Logo, usaceLogo,