diff --git a/.changeset/solid-hook-naming-react-compiler.md b/.changeset/solid-hook-naming-react-compiler.md
new file mode 100644
index 00000000..0785e0d3
--- /dev/null
+++ b/.changeset/solid-hook-naming-react-compiler.md
@@ -0,0 +1,13 @@
+---
+'@tanstack/devtools-ui': minor
+'@tanstack/devtools': patch
+'@tanstack/devtools-a11y': patch
+---
+
+fix: rename Solid `use*` primitives to `create*` so React Compiler doesn't transform them
+
+The devtools packages are written in Solid but used React-style naming (`useStyles`, `useTheme`, `useDevtoolsState`, …) for their custom primitives. When an app enables React Compiler, the compiler matches the `use*` naming convention and transforms/optimizes this Solid code as if it were React, breaking the panel (it is Solid JSX, not React).
+
+All custom Solid primitives in `@tanstack/devtools`, `@tanstack/devtools-ui`, and `@tanstack/devtools-a11y` are renamed from `use*` to `create*`, and Solid's own `useContext` / `@solid-primitives` `useKeyDownList` are imported under non-`use` aliases (`getContext`, `getKeyDownList`).
+
+Breaking for `@tanstack/devtools-ui`: the exported `useTheme` is renamed to `createTheme`.
diff --git a/packages/devtools-a11y/src/core/components/IssueCard.tsx b/packages/devtools-a11y/src/core/components/IssueCard.tsx
index 8fb8db85..4420616d 100644
--- a/packages/devtools-a11y/src/core/components/IssueCard.tsx
+++ b/packages/devtools-a11y/src/core/components/IssueCard.tsx
@@ -2,7 +2,7 @@
import { For, Show } from 'solid-js'
import { Button } from '@tanstack/devtools-ui'
-import { useStyles } from '../styles/styles'
+import { createStyles } from '../styles/styles'
// types
import type { A11yIssue, SeverityThreshold } from '../types/types'
@@ -17,7 +17,7 @@ interface A11yIssueCardProps {
export function A11yIssueCard(props: A11yIssueCardProps) {
const selector = () => props.issue.nodes[0]?.selector || 'unknown'
- const styles = useStyles()
+ const styles = createStyles()
return (
{
diff --git a/packages/devtools-a11y/src/core/components/Settings.tsx b/packages/devtools-a11y/src/core/components/Settings.tsx
index 71a3bd43..943d7c6e 100644
--- a/packages/devtools-a11y/src/core/components/Settings.tsx
+++ b/packages/devtools-a11y/src/core/components/Settings.tsx
@@ -3,8 +3,8 @@
import { For, Show, createMemo, createSignal } from 'solid-js'
import { Button, Input, Select } from '@tanstack/devtools-ui'
import { getAvailableRules } from '../utils/ally-audit.utils'
-import { useAllyContext } from '../contexts/allyContext'
-import { CATEGORIES, CATEGORY_LABELS, useStyles } from '../styles/styles'
+import { createAllyContext } from '../contexts/allyContext'
+import { CATEGORIES, CATEGORY_LABELS, createStyles } from '../styles/styles'
// types
import type {
@@ -18,8 +18,8 @@ interface A11ySettingsOverlayProps {
}
export function A11ySettingsOverlay(props: A11ySettingsOverlayProps) {
- const { config, setConfig } = useAllyContext()
- const styles = useStyles()
+ const { config, setConfig } = createAllyContext()
+ const styles = createStyles()
const disabledRulesSet = createMemo(() => new Set(config.disabledRules))
const availableRules = createMemo(() => getAvailableRules())
diff --git a/packages/devtools-a11y/src/core/components/Shell.tsx b/packages/devtools-a11y/src/core/components/Shell.tsx
index d049ae71..f5ed7970 100644
--- a/packages/devtools-a11y/src/core/components/Shell.tsx
+++ b/packages/devtools-a11y/src/core/components/Shell.tsx
@@ -2,18 +2,18 @@
import { Match, Show, Switch, createMemo, createSignal } from 'solid-js'
import { Button, Header, MainPanel } from '@tanstack/devtools-ui'
-import { useAllyContext } from '../contexts/allyContext'
+import { createAllyContext } from '../contexts/allyContext'
import { RULE_SET_LABELS, SEVERITY_LABELS } from '../utils/ui.utils'
-import { useStyles } from '../styles/styles'
+import { createStyles } from '../styles/styles'
import { A11yIssueList } from './IssueList'
import { A11ySettingsOverlay } from './Settings'
export function Shell() {
- const styles = useStyles()
+ const styles = createStyles()
// ally context
const { filteredIssues, allyResult, config, setConfig, triggerAllyScan } =
- useAllyContext()
+ createAllyContext()
// ui state
const selectedIssueSignal = createSignal
('')
diff --git a/packages/devtools-a11y/src/core/contexts/allyContext.tsx b/packages/devtools-a11y/src/core/contexts/allyContext.tsx
index c6abc8c9..920eae9c 100644
--- a/packages/devtools-a11y/src/core/contexts/allyContext.tsx
+++ b/packages/devtools-a11y/src/core/contexts/allyContext.tsx
@@ -5,7 +5,7 @@ import {
createEffect,
createMemo,
createSignal,
- useContext,
+ useContext as getContext,
} from 'solid-js'
import { createStore } from 'solid-js/store'
import { filterIssuesAboveThreshold, runAudit } from '../utils/ally-audit.utils'
@@ -24,7 +24,7 @@ import type { ParentComponent } from 'solid-js'
// context state
//
-function useAllyValue() {
+function createAllyValue() {
const [config, setConfig] =
createStore>(mergeConfig())
@@ -89,7 +89,7 @@ function useAllyValue() {
}
}
-type ContextType = ReturnType
+type ContextType = ReturnType
//
// context
@@ -100,18 +100,18 @@ const AllyContext = createContext(null)
type AllyProviderProps = {}
export const AllyProvider: ParentComponent = (props) => {
- const value = useAllyValue()
+ const value = createAllyValue()
return (
{props.children}
)
}
-export function useAllyContext() {
- const context = useContext(AllyContext)
+export function createAllyContext() {
+ const context = getContext(AllyContext)
if (context === null) {
- throw new Error('useAllyContext must be used within an AllyProvider')
+ throw new Error('createAllyContext must be used within an AllyProvider')
}
return context
diff --git a/packages/devtools-a11y/src/core/styles/styles.ts b/packages/devtools-a11y/src/core/styles/styles.ts
index 64b40104..d7d41e46 100644
--- a/packages/devtools-a11y/src/core/styles/styles.ts
+++ b/packages/devtools-a11y/src/core/styles/styles.ts
@@ -1,5 +1,5 @@
import * as goober from 'goober'
-import { useTheme } from '@tanstack/devtools-ui'
+import { createTheme } from '@tanstack/devtools-ui'
import { createMemo } from 'solid-js'
import type { TanStackDevtoolsTheme } from '@tanstack/devtools-ui'
@@ -548,8 +548,8 @@ function createA11yPanelStyles(theme: TanStackDevtoolsTheme) {
}
}
-export function useStyles() {
- const { theme } = useTheme()
+export function createStyles() {
+ const { theme } = createTheme()
const styles = createMemo(() => createA11yPanelStyles(theme()))
return styles
diff --git a/packages/devtools-ui/src/components/button.tsx b/packages/devtools-ui/src/components/button.tsx
index b96b453c..f292cdc6 100644
--- a/packages/devtools-ui/src/components/button.tsx
+++ b/packages/devtools-ui/src/components/button.tsx
@@ -1,6 +1,6 @@
import { createMemo } from 'solid-js'
import clsx from 'clsx'
-import { useStyles } from '../styles/use-styles'
+import { createStyles } from '../styles/use-styles'
// types
import type { JSX } from 'solid-js'
@@ -20,7 +20,7 @@ type ButtonProps = JSX.ButtonHTMLAttributes & {
className?: string
}
export function Button(props: ButtonProps) {
- const styles = useStyles()
+ const styles = createStyles()
const classes = createMemo(() => {
const variant = props.variant || 'primary'
diff --git a/packages/devtools-ui/src/components/checkbox.tsx b/packages/devtools-ui/src/components/checkbox.tsx
index de16270e..d87a4efc 100644
--- a/packages/devtools-ui/src/components/checkbox.tsx
+++ b/packages/devtools-ui/src/components/checkbox.tsx
@@ -1,5 +1,5 @@
import { createSignal } from 'solid-js'
-import { useStyles } from '../styles/use-styles'
+import { createStyles } from '../styles/use-styles'
interface CheckboxProps {
label?: string
@@ -9,7 +9,7 @@ interface CheckboxProps {
}
export function Checkbox(props: CheckboxProps) {
- const styles = useStyles()
+ const styles = createStyles()
const [isChecked, setIsChecked] = createSignal(props.checked || false)
const handleChange = (e: Event) => {
diff --git a/packages/devtools-ui/src/components/header.tsx b/packages/devtools-ui/src/components/header.tsx
index 29b23aa0..5f52f0c7 100644
--- a/packages/devtools-ui/src/components/header.tsx
+++ b/packages/devtools-ui/src/components/header.tsx
@@ -1,5 +1,5 @@
import clsx from 'clsx'
-import { useStyles } from '../styles/use-styles'
+import { createStyles } from '../styles/use-styles'
import type { JSX } from 'solid-js/jsx-runtime'
export function Header({
@@ -7,7 +7,7 @@ export function Header({
class: className,
...rest
}: JSX.IntrinsicElements['header']) {
- const styles = useStyles()
+ const styles = createStyles()
return (