+ {/* Header */}
+
+
React Hook Form
+
+ {formOptions.length > 0 && (
+
+ )}
+
+
+ {/* Form state bar */}
+ {selectedSnapshot && (
+
+
+
+ )}
+
+ {/* Search */}
+
+
+
+ setSearchTerm(e.target.value)}
+ className="h-8 w-full pl-8 pr-3 text-sm bg-gray-700 border border-gray-600 rounded text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"
+ />
+
+
+
+ {/* Content */}
+
+ {selectedSnapshot ? (
+
+ ) : (
+
+
React Hook Form Inspector
+
+ Call{' '}
+ useRozeniteRHFPlugin({'{ control }'}){' '}
+ in your form component
+
+
+ )}
+
+
+ );
+}
diff --git a/packages/rhf-plugin/tailwind.config.ts b/packages/rhf-plugin/tailwind.config.ts
new file mode 100644
index 00000000..d0cdccb0
--- /dev/null
+++ b/packages/rhf-plugin/tailwind.config.ts
@@ -0,0 +1,52 @@
+import type { Config } from 'tailwindcss';
+
+const config: Config = {
+ darkMode: ['class'],
+ content: ['./src/ui/**/*.{js,ts,jsx,tsx,mdx}'],
+ theme: {
+ extend: {
+ colors: {
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ card: {
+ DEFAULT: 'hsl(var(--card))',
+ foreground: 'hsl(var(--card-foreground))',
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover))',
+ foreground: 'hsl(var(--popover-foreground))',
+ },
+ primary: {
+ DEFAULT: 'hsl(var(--primary))',
+ foreground: 'hsl(var(--primary-foreground))',
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary))',
+ foreground: 'hsl(var(--secondary-foreground))',
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted))',
+ foreground: 'hsl(var(--muted-foreground))',
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent))',
+ foreground: 'hsl(var(--accent-foreground))',
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive))',
+ foreground: 'hsl(var(--destructive-foreground))',
+ },
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ ring: 'hsl(var(--ring))',
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)',
+ },
+ },
+ },
+ plugins: [require('tailwindcss-animate')],
+};
+export default config;
diff --git a/packages/rhf-plugin/tsconfig.json b/packages/rhf-plugin/tsconfig.json
new file mode 100644
index 00000000..9bf92648
--- /dev/null
+++ b/packages/rhf-plugin/tsconfig.json
@@ -0,0 +1,35 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "paths": {
+ "@rozenite/plugin-bridge": ["../plugin-bridge/src/index.ts"]
+ },
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src/**/*", "react-native.ts", "rozenite.config.ts"],
+ "exclude": ["node_modules", "dist", "build"],
+ "references": [
+ {
+ "path": "../plugin-bridge"
+ },
+ {
+ "path": "../cli"
+ },
+ {
+ "path": "../vite-plugin"
+ }
+ ]
+}
diff --git a/packages/rhf-plugin/vite.config.ts b/packages/rhf-plugin/vite.config.ts
new file mode 100644
index 00000000..2e7ae6d8
--- /dev/null
+++ b/packages/rhf-plugin/vite.config.ts
@@ -0,0 +1,23 @@
+///