Just Fucking React to React

You spent years learning React. Now unlearn it. Your HTML was fine.
42KB React Hello World
0.1KB HTML Hello World
150KB+ React Todo App
3KB HTML Todo App
Modal Dialog
HTML: 2 lines | React: 47 lines + framer-motion
HTML (Works Since 2022)
<dialog id="modal">
  <p>Modal content</p>
  <button onclick="modal.close()">Close</button>
</dialog>

<button onclick="modal.showModal()">Open Modal</button>
Dark Mode Toggle
HTML: 1 line | React: Context + Provider + Hook
HTML
<button onclick="document.documentElement.classList.toggle('dark')">
  Toggle Dark Mode
</button>
React
// ThemeProvider.jsx
import { createContext, useContext, useState, useEffect } from 'react';

const ThemeContext = createContext();

export const useTheme = () => {
  const context = useContext(ThemeContext);
  if (!context) throw new Error('useTheme must be used within ThemeProvider');
  return context;
};

export const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState(() => 
    localStorage.getItem('theme') || 'light'
  );
  
  useEffect(() => {
    document.documentElement.setAttribute('data-theme', theme);
    localStorage.setItem('theme', theme);
  }, [theme]);
  
  const toggleTheme = () => setTheme(prev => prev === 'light' ? 'dark' : 'light');
  
  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

// DarkModeToggle.jsx
import { useTheme } from './ThemeProvider';

const DarkModeToggle = () => {
  const { theme, toggleTheme } = useTheme();
  return <button onClick={toggleTheme}>{theme}</button>;
};
Form Validation
HTML: Built-in | React: react-hook-form + yup + resolver
HTML
<form>
  <input type="email" required>
  <input type="password" minlength="8" required>
  <button type="submit">Login</button>
</form>
React
import { useState, useEffect } from 'react';
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';

const schema = yup.object({
  email: yup.string().email().required(),
  password: yup.string().min(8).required()
});

const LoginForm = () => {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: yupResolver(schema)
  });
  
  const onSubmit = (data) => console.log(data);
  
  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('email')} />
      {errors.email && <span>{errors.email.message}</span>}
      
      <input {...register('password')} type="password" />
      {errors.password && <span>{errors.password.message}</span>}
      
      <button type="submit">Login</button>
    </form>
  );
};
Accordion/Collapsible
HTML: 1 tag | React: State management + event handlers
HTML
<details>
  <summary>Click to expand</summary>
  <p>Hidden content appears here</p>
</details>
React
import { useState } from 'react';

const Accordion = ({ items }) => {
  const [openItems, setOpenItems] = useState(new Set());
  
  const toggleItem = (index) => {
    setOpenItems(prev => {
      const newSet = new Set(prev);
      if (newSet.has(index)) newSet.delete(index);
      else newSet.add(index);
      return newSet;
    });
  };
  
  return (
    <div>
      {items.map((item, index) => (
        <div key={index}>
          <button onClick={() => toggleItem(index)}>
            {item.title}
          </button>
          {openItems.has(index) && <div>{item.content}</div>}
        </div>
      ))}
    </div>
  );
};
Live Demos (All HTML, No React)

Modal Demo

I'm a native HTML dialog!

No React, no virtual DOM, no build process.

Accordion Demo

Click me to expand

This is native HTML. No JavaScript needed.

Form Validation Demo

Dark Mode Toggle

The Brutal Truth
React Developer: "Senior Frontend Engineer with 5+ years experience in modern JavaScript frameworks, Redux, TypeScript, and component architecture"
HTML Developer: "I make websites"
Your React app has more dependencies than a small country has citizens
Remember when websites loaded instantly? Pepperidge Farm remembers. So does HTML.
Now head on over to Just Use Postgres TM to see react take a real beating. From an angry mob.