From 6d48a5cdff82bfd66c6455e4528fee781ce4c8a0 Mon Sep 17 00:00:00 2001 From: Tyler Marlow Date: Tue, 5 May 2026 21:22:16 -0400 Subject: [PATCH] feature: add PropTypes to shared components --- app/components/BrandWordmark.jsx | 12 ++++++++++++ app/components/DevTag.jsx | 5 +++++ app/components/IncompleteFeatureBadge.jsx | 9 +++++++++ app/components/StateIndicator.jsx | 11 +++++++++++ package-lock.json | 21 ++------------------- package.json | 1 + 6 files changed, 40 insertions(+), 19 deletions(-) diff --git a/app/components/BrandWordmark.jsx b/app/components/BrandWordmark.jsx index 553ac86..c3c61c6 100644 --- a/app/components/BrandWordmark.jsx +++ b/app/components/BrandWordmark.jsx @@ -1,4 +1,5 @@ import { Text } from '@mantine/core'; +import PropTypes from 'prop-types'; export default function BrandWordmark({ onClick, size = '1.5rem', color = '#00d9ff' }) { return ( @@ -18,3 +19,14 @@ export default function BrandWordmark({ onClick, size = '1.5rem', color = '#00d9 ); } + +BrandWordmark.propTypes = { + onClick: PropTypes.func, + size: PropTypes.string, + color: PropTypes.string, +}; + +BrandWordmark.defaultProps = { + size: '1.5rem', + color: '#00d9ff', +}; diff --git a/app/components/DevTag.jsx b/app/components/DevTag.jsx index 0e5ebd4..e5fc573 100644 --- a/app/components/DevTag.jsx +++ b/app/components/DevTag.jsx @@ -1,3 +1,4 @@ +import PropTypes from 'prop-types'; import { useAppStore } from '../stores'; /** @@ -13,3 +14,7 @@ export default function DevTag({ tag }) { if (!devMode) return null; return [{tag}] ; } + +DevTag.propTypes = { + tag: PropTypes.string.isRequired, +}; diff --git a/app/components/IncompleteFeatureBadge.jsx b/app/components/IncompleteFeatureBadge.jsx index 9218035..192b8c2 100644 --- a/app/components/IncompleteFeatureBadge.jsx +++ b/app/components/IncompleteFeatureBadge.jsx @@ -1,5 +1,6 @@ import { Badge } from '@mantine/core'; import { IconTool } from '@tabler/icons-react'; +import PropTypes from 'prop-types'; export default function IncompleteFeatureBadge({ label = 'In Development' }) { return ( @@ -13,3 +14,11 @@ export default function IncompleteFeatureBadge({ label = 'In Development' }) { ); } + +IncompleteFeatureBadge.propTypes = { + label: PropTypes.string, +}; + +IncompleteFeatureBadge.defaultProps = { + label: 'In Development', +}; diff --git a/app/components/StateIndicator.jsx b/app/components/StateIndicator.jsx index 7876dec..4b64a38 100644 --- a/app/components/StateIndicator.jsx +++ b/app/components/StateIndicator.jsx @@ -1,4 +1,5 @@ import { Badge, Tooltip } from '@mantine/core'; +import PropTypes from 'prop-types'; export const StateIndicator = ({ changed, pendingApply }) => { if (pendingApply) { @@ -27,3 +28,13 @@ export const StateIndicator = ({ changed, pendingApply }) => { ); }; + +StateIndicator.propTypes = { + changed: PropTypes.bool, + pendingApply: PropTypes.bool, +}; + +StateIndicator.defaultProps = { + changed: false, + pendingApply: false, +}; diff --git a/package-lock.json b/package-lock.json index 03b727c..e6599c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "obs-websocket-js": "^5.0.8", "path-to-regexp": "^8.4.0", "picomatch": "^2.3.2", + "prop-types": "^15.8.1", "qs": "^6.14.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -1256,7 +1257,6 @@ "version": "7.28.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -3587,7 +3587,6 @@ "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.14.tgz", "integrity": "sha512-ZOxggx65Av1Ii1NrckCuqzluRpmmG+8DyEw24wDom3rmwsPg9UV+0le2QTyI5Eo60LzPfUju1KuEPiUzNABIPg==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/react": "^0.27.16", "clsx": "^2.1.1", @@ -3636,7 +3635,6 @@ "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.14.tgz", "integrity": "sha512-0SbHnGEuHcF2QyjzBBcqidpjNmIb6n7TC3obnhkBToYhUTbMcJSK/8ei/yHtAelridJH4CPeohRlQdc0HajHyQ==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^18.x || ^19.x" } @@ -4976,7 +4974,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5000,7 +4997,6 @@ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5402,7 +5398,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -5777,8 +5772,7 @@ "version": "1.11.20", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", @@ -6177,7 +6171,6 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6456,7 +6449,6 @@ "node_modules/express": { "version": "5.2.1", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -8044,7 +8036,6 @@ "resolved": "https://registry.npmjs.org/motion/-/motion-10.18.0.tgz", "integrity": "sha512-MVAZZmwM/cp77BrNe1TxTMldxRPjwBNHheU5aPToqT4rJdZxLiADk58H+a0al5jKLxkB0OdgNq6DiVn11cjvIQ==", "license": "MIT", - "peer": true, "dependencies": { "@motionone/animation": "^10.18.0", "@motionone/dom": "^10.18.0", @@ -8663,7 +8654,6 @@ "node_modules/react": { "version": "18.3.1", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -8674,7 +8664,6 @@ "node_modules/react-dom": { "version": "18.3.1", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -9704,7 +9693,6 @@ "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -9759,7 +9747,6 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -10165,7 +10152,6 @@ "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -10290,7 +10276,6 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -10597,7 +10582,6 @@ "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -10754,7 +10738,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 18ac909..58e8603 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "obs-websocket-js": "^5.0.8", "path-to-regexp": "^8.4.0", "picomatch": "^2.3.2", + "prop-types": "^15.8.1", "qs": "^6.14.2", "react": "^18.3.1", "react-dom": "^18.3.1",