Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
a0a0fd6
beta: vanilaa 19'
dreamwasp Mar 16, 2026
39d5707
format
dreamwasp Mar 16, 2026
3f68790
.spec
dreamwasp Mar 17, 2026
2a98de1
Merge branch 'main' into cass-gm-plain-19
dreamwasp Mar 17, 2026
2fa55ca
test
dreamwasp Mar 17, 2026
e29e664
Merge branch 'cass-gm-plain-19' of github.com:Codecademy/gamut into c…
dreamwasp Mar 17, 2026
b79068d
Merge branch 'main' into cass-gm-plain-19
dreamwasp Mar 17, 2026
91f5f46
ref check
dreamwasp Mar 18, 2026
fc66bcc
type widening + formatting
dreamwasp Mar 18, 2026
3bb18db
revert type widening
dreamwasp Mar 18, 2026
fe532d0
18/19
dreamwasp Mar 19, 2026
16e2769
terst build
dreamwasp Mar 19, 2026
bd2e499
update react-hook-form
dreamwasp Mar 19, 2026
077f07b
put connected form back
dreamwasp Mar 19, 2026
469095e
try re-creating ref type in cast;
dreamwasp Mar 19, 2026
2df70b1
ts upgrade test
dreamwasp Mar 24, 2026
3adb8cb
test typescript
dreamwasp Mar 25, 2026
5d52f0d
lint + format
dreamwasp Mar 25, 2026
aa6bb4b
update to main
dreamwasp Apr 2, 2026
7117ecc
test in ci
dreamwasp Apr 2, 2026
d78affa
start fixing test failures
dreamwasp Apr 3, 2026
ad2809d
add release plan
dreamwasp Apr 3, 2026
5134194
Merge origin/cass-gm-plain-19 into cass-gm-plain-1819
dreamwasp Apr 3, 2026
e6fd469
chore: align babel-plugin-macros and component-test-setup for syncpack
dreamwasp Apr 3, 2026
d8b11d8
dedupe yrn
dreamwasp Apr 3, 2026
b6d3eeb
lint fix
dreamwasp Apr 3, 2026
e103d5d
release plan update
dreamwasp Apr 3, 2026
8cfdf84
Merge branch 'main' into cass-gmt-1473-beta
dreamwasp Apr 15, 2026
71b5d00
update plan
dreamwasp Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,21 @@ module.exports = {

ignorePatterns: ['packages/code-connect/**/*'],

settings: {
'import/parsers': {
[require.resolve('@typescript-eslint/parser')]: [
'.ts',
'.cts',
'.mts',
'.tsx',
'.js',
'.jsx',
'.mjs',
'.cjs',
],
},
},

rules: {
'gamut/prefer-themed': 'error',
'gamut/no-css-standalone': 'error',
Expand Down Expand Up @@ -38,6 +53,13 @@ module.exports = {
// being applied to subsequent plugin imports/extensions. Wild.
files: ['*.tsx', '*.ts'],
rules: {
'@typescript-eslint/no-empty-object-type': [
'error',
{
allowInterfaces: 'with-single-extends',
allowObjectTypes: 'always',
},
],
'no-void': ['error', { allowAsStatement: true }],
// These rules could be useful, but we haven't gotten around to enabling them here
// See WEB-2 for general tracking.
Expand Down
12 changes: 12 additions & 0 deletions .nx/version-plans/version-plan-1775236316343.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
eslint-plugin-gamut: major
gamut-illustrations: major
gamut-patterns: major
gamut-styles: major
gamut-icons: major
gamut-tests: major
variance: major
gamut: major
---

React 18+19 compatibility: workspace on React 19; peers support React 18.3 and 19. Includes eslint-plugin-gamut and core Gamut packages (major bumps per plan).
3 changes: 2 additions & 1 deletion jest.config.base.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { Config } from 'jest';
import path from 'node:path';

import type { Config } from 'jest';

const COVERAGE_PATH_IGNORE_PATTERNS = [
'<rootDir>/node_modules/',
'<rootDir>/dist/',
Expand Down
37 changes: 19 additions & 18 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
"@vidstack/react": "^1.12.12",
"core-js": "3.7.0",
"lodash": "^4.17.23",
"react": "18.3.1",
"react-dom": "18.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-helmet-async": "^2.0.5"
},
"devDependencies": {
Expand All @@ -19,7 +19,7 @@
"@babel/preset-env": "^7.24.7",
"@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.24.7",
"@codecademy/eslint-config": "8.0.0",
"@codecademy/eslint-config": "8.2.0",
"@codecademy/prettier-config": "^0.2.0",
"@codecademy/tsconfig": "^0.3.0",
"@commander-js/extra-typings": "^14.0.0",
Expand All @@ -42,27 +42,27 @@
"@svgr/cli": "5.5.0",
"@swc-node/register": "^1.11.1",
"@swc/core": "^1.15.18",
"@testing-library/dom": "^8.11.1",
"@testing-library/dom": "^10.0.0",
"@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "15.0.6",
"@testing-library/react": "^16.0.0",
"@testing-library/react-hooks": "^7.0.2",
"@testing-library/user-event": "^14.5.2",
"@types/classnames": "2.2.10",
"@types/invariant": "2.2.29",
"@types/konami-code-js": "^0.8.0",
"@types/lodash": "4.17.23",
"@types/react": "18.3.27",
"@types/react-dom": "18.3.1",
"@types/react-test-renderer": "18.3.0",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"@types/react-test-renderer": "^18.2.0",
"@types/stylis": "^4.2.0",
"@typescript-eslint/eslint-plugin": "^5.15.0",
"@typescript-eslint/parser": "^5.15.0",
"@typescript-eslint/eslint-plugin": "^8.57.0",
"@typescript-eslint/parser": "^8.57.0",
"babel-jest": "29.6.4",
"babel-plugin-macros": "3.0.1",
"babel-plugin-macros": "^3.0.1",
"commander": "^14.0.3",
"component-test-setup": "^0.3.1",
"cpy-cli": "^4.1.0",
"eslint": "^8.11.0",
"eslint": "^8.57.0",
"eslint-plugin-gamut": "workspace:*",
"eslint-plugin-local-rules": "^1.1.0",
"eslint-plugin-lodash": "^7.4.0",
Expand All @@ -82,7 +82,7 @@
"onchange": "^7.0.2",
"playwright": "^1.49.1",
"prettier": "^2.8.7",
"react-test-renderer": "18.3.1",
"react-test-renderer": "^19.0.0",
"start-server-and-test": "^2.1.5",
"storybook": "^10.3.1",
"storybook-addon-deep-controls": "^0.9.5",
Expand Down Expand Up @@ -113,13 +113,14 @@
"repository": "git@github.com:Codecademy/gamut.git",
"resolutions": {
"@react-aria/interactions": "3.25.0",
"@types/react": "18.3.27",
"@types/react-dom": "18.3.1",
"@typescript-eslint/utils": "^5.15.0",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"@types/react-test-renderer": "^18.2.0",
"@typescript-eslint/utils": "^8.57.0",
"axios": "1.14.0",
"error-ex": "1.3.4",
"react": "18.3.1",
"react-dom": "18.3.1"
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"scripts": {
"build": "nx run-many --target=build --all",
Expand Down
2 changes: 1 addition & 1 deletion packages/eslint-plugin-gamut/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"version": "2.4.3",
"author": "Codecademy Engineering <dev@codecademy.com>",
"dependencies": {
"@typescript-eslint/utils": "^5.15.0"
"@typescript-eslint/utils": "^8.57.0"
},
"files": [
"dist"
Expand Down
1 change: 0 additions & 1 deletion packages/eslint-plugin-gamut/src/gamut-import-paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ export default createRule({
meta: {
docs: {
description: 'Ensure Gamut import statements have proper module paths.',
recommended: 'error',
},
fixable: 'code',
messages: {
Expand Down
6 changes: 3 additions & 3 deletions packages/eslint-plugin-gamut/src/no-css-standalone.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ESLintUtils } from '@typescript-eslint/utils';
import { TSESLint } from '@typescript-eslint/utils';

import rule from './no-css-standalone';

const ruleTester = new ESLintUtils.RuleTester({
parser: '@typescript-eslint/parser',
const ruleTester = new TSESLint.RuleTester({
parser: require.resolve('@typescript-eslint/parser'),
});

ruleTester.run('no-css-standalone', rule, {
Expand Down
1 change: 0 additions & 1 deletion packages/eslint-plugin-gamut/src/no-css-standalone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ export default createRule({
meta: {
docs: {
description: 'Ensure no standalone .css or .scss files.',
recommended: 'error',
},
messages: {
noCssStandalone:
Expand Down
6 changes: 3 additions & 3 deletions packages/eslint-plugin-gamut/src/no-inline-style.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ESLintUtils } from '@typescript-eslint/utils';
import { TSESLint } from '@typescript-eslint/utils';

import rule from './no-inline-style';

const ruleTester = new ESLintUtils.RuleTester({
parser: '@typescript-eslint/parser',
const ruleTester = new TSESLint.RuleTester({
parser: require.resolve('@typescript-eslint/parser'),
parserOptions: {
ecmaFeatures: {
jsx: true,
Expand Down
8 changes: 6 additions & 2 deletions packages/eslint-plugin-gamut/src/no-inline-style.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import { AST_NODE_TYPES } from '@typescript-eslint/utils';

import { createRule } from './createRule';

export default createRule({
create(context) {
return {
JSXAttribute(node) {
if (node.name.type === 'JSXIdentifier' && node.name.name === 'style') {
if (
node.name.type === AST_NODE_TYPES.JSXIdentifier &&
node.name.name === 'style'
) {
context.report({
messageId: 'noInlineStyle',
node,
Expand All @@ -17,7 +22,6 @@ export default createRule({
meta: {
docs: {
description: 'Disallow inline style props on JSX elements.',
recommended: 'error',
},
messages: {
noInlineStyle:
Expand Down
6 changes: 3 additions & 3 deletions packages/eslint-plugin-gamut/src/no-kbd-element.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ESLintUtils } from '@typescript-eslint/utils';
import { TSESLint } from '@typescript-eslint/utils';

import rule from './no-kbd-element';

const ruleTester = new ESLintUtils.RuleTester({
parser: '@typescript-eslint/parser',
const ruleTester = new TSESLint.RuleTester({
parser: require.resolve('@typescript-eslint/parser'),
parserOptions: {
ecmaFeatures: {
jsx: true,
Expand Down
8 changes: 6 additions & 2 deletions packages/eslint-plugin-gamut/src/no-kbd-element.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import { AST_NODE_TYPES } from '@typescript-eslint/utils';

import { createRule } from './createRule';

export default createRule({
create(context) {
return {
JSXOpeningElement(node) {
if (node.name.type === 'JSXIdentifier' && node.name.name === 'kbd') {
if (
node.name.type === AST_NODE_TYPES.JSXIdentifier &&
node.name.name === 'kbd'
) {
context.report({
messageId: 'noKbdElement',
node,
Expand All @@ -18,7 +23,6 @@ export default createRule({
docs: {
description:
'Intended to be used in Storybook docs to disallow use of the `kbd` HTML element in favor of the `KeyboardKey` component for styling purposes.',
recommended: 'error',
},
messages: {
noKbdElement: 'Please use the `KeyboardKey` component instead.',
Expand Down
6 changes: 3 additions & 3 deletions packages/eslint-plugin-gamut/src/prefer-themed.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ESLintUtils } from '@typescript-eslint/utils';
import { TSESLint } from '@typescript-eslint/utils';

import rule from './prefer-themed';

const ruleTester = new ESLintUtils.RuleTester({
parser: '@typescript-eslint/parser',
const ruleTester = new TSESLint.RuleTester({
parser: require.resolve('@typescript-eslint/parser'),
});

ruleTester.run('prefer-themed', rule, {
Expand Down
12 changes: 4 additions & 8 deletions packages/eslint-plugin-gamut/src/prefer-themed.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { AST_NODE_TYPES } from '@typescript-eslint/utils';

import { createRule } from './createRule';
import {
checkArrowFuncBodyTypesAndReturnThemeVars,
Expand All @@ -10,15 +8,14 @@ export default createRule({
create(context) {
return {
TaggedTemplateExpression(node) {
if (node.tag.type === AST_NODE_TYPES.MemberExpression) {
/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison -- @typescript-eslint/types use string enums; literals match ESTree */
if (node.tag.type === 'MemberExpression') {
if (node.tag.object.type !== 'Identifier') return;
const expressionVariable = node.tag.object.name;
const arrowFuncExpression = node.quasi.expressions[0];

if (
arrowFuncExpression?.type !== AST_NODE_TYPES.ArrowFunctionExpression
)
return;
if (arrowFuncExpression?.type !== 'ArrowFunctionExpression') return;
/* eslint-enable @typescript-eslint/no-unsafe-enum-comparison */

if (!isNamedVariableTheme(arrowFuncExpression)) return;

Expand Down Expand Up @@ -48,7 +45,6 @@ export default createRule({
meta: {
docs: {
description: 'Prefer themed style utility',
recommended: 'error',
},
fixable: 'code',
messages: {
Expand Down
2 changes: 1 addition & 1 deletion packages/gamut-icons/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"@emotion/react": "^11.4.0",
"@emotion/styled": "^11.3.0",
"lodash": "^4.17.23",
"react": "^17.0.2 || ^18.3.0"
"react": "^17.0.2 || ^18.3.0 || ^19.0.0"
},
"publishConfig": {
"access": "public"
Expand Down
4 changes: 2 additions & 2 deletions packages/gamut-illustrations/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
"peerDependencies": {
"@emotion/react": "^11.4.0",
"@emotion/styled": "^11.3.0",
"react": "^17.0.2 || ^18.3.0",
"react-dom": "^17.0.2 || ^18.3.0"
"react": "^17.0.2 || ^18.3.0 || ^19.0.0",
"react-dom": "^17.0.2 || ^18.3.0 || ^19.0.0"
},
"publishConfig": {
"access": "public"
Expand Down
4 changes: 2 additions & 2 deletions packages/gamut-patterns/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
"peerDependencies": {
"@emotion/react": "^11.4.0",
"@emotion/styled": "^11.3.0",
"react": "^17.0.2 || ^18.3.0",
"react-dom": "^17.0.2 || ^18.3.0"
"react": "^17.0.2 || ^18.3.0 || ^19.0.0",
"react-dom": "^17.0.2 || ^18.3.0 || ^19.0.0"
},
"publishConfig": {
"access": "public"
Expand Down
4 changes: 2 additions & 2 deletions packages/gamut-styles/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"dependencies": {
"@codecademy/variance": "0.26.1",
"@emotion/is-prop-valid": "^1.1.0",
"framer-motion": "^11.18.0",
"framer-motion": "^12.0.0",
"get-nonce": "^1.0.0",
"polished": "^4.1.2"
},
Expand All @@ -26,7 +26,7 @@
"@emotion/react": "^11.4.0",
"@emotion/styled": "^11.3.0",
"lodash": "^4.17.23",
"react": "^17.0.2 || ^18.3.0",
"react": "^17.0.2 || ^18.3.0 || ^19.0.0",
"stylis": "^4.0.7"
},
"publishConfig": {
Expand Down
Loading
Loading