diff --git a/docs/THEMING.md b/docs/THEMING.md
new file mode 100644
index 00000000..5d6a7932
--- /dev/null
+++ b/docs/THEMING.md
@@ -0,0 +1,122 @@
+# Hailstorm Theming System
+
+## Overview
+
+Hailstorm now supports a flexible theming system with built-in dark mode support. The theming system uses CSS custom properties that automatically adjust based on the active theme.
+
+## Quick Start
+
+### Using ThemeProvider
+
+Wrap your application with the `ThemeProvider` component:
+
+```tsx
+import { ThemeProvider } from "@abusix/hailstorm";
+
+function App() {
+ return (
+
+ {/* Your app content */}
+
+ );
+}
+```
+
+### Using the Theme Hook
+
+Access and control the theme programmatically:
+
+```tsx
+import { useTheme } from "@abusix/hailstorm";
+
+function ThemeToggle() {
+ const { theme, setTheme } = useTheme();
+
+ return (
+
+ );
+}
+```
+
+## Semantic Color Tokens
+
+The theming system introduces semantic color tokens that automatically adapt to the current theme:
+
+### Core Colors
+
+- `--color-background`: Main background color
+- `--color-background-secondary`: Secondary background (cards, sections)
+- `--color-background-tertiary`: Tertiary background (hover states, inputs)
+- `--color-foreground`: Main text color
+- `--color-foreground-muted`: Muted text
+- `--color-foreground-subtle`: Subtle text (descriptions, hints)
+- `--color-border`: Default border color
+- `--color-border-hover`: Border color on hover
+- `--color-border-focus`: Border color on focus
+
+### Using in Components
+
+Use these semantic tokens in your Tailwind classes:
+
+```tsx
+
+
Title
+
Description
+
+```
+
+## Migrating Components
+
+To migrate existing components to use the theming system:
+
+### Before
+```tsx
+
+ Content
+
+```
+
+### After
+```tsx
+
+ Content
+
+```
+
+## Theme Modes
+
+The system supports three theme modes:
+
+1. **light**: Light theme
+2. **dark**: Dark theme
+3. **system**: Follows the user's system preference
+
+## Customization
+
+You can customize theme colors by modifying the CSS variables in `src/styles/index.css`:
+
+```css
+/* Light mode (default) */
+@theme {
+ --color-background: var(--color-neutral-0);
+ --color-foreground: var(--color-neutral-900);
+ /* ... */
+}
+
+/* Dark mode */
+.dark {
+ --color-background: #0a0a0a;
+ --color-foreground: #fafafa;
+ /* ... */
+}
+```
+
+## Compatibility with shadcn/ui
+
+This theming system is designed to be compatible with shadcn/ui components. You can now integrate shadcn/ui components directly into Hailstorm with minimal adjustments.
+
+## Examples
+
+See the Dialog component's "DarkMode" story in Storybook for a live example of the theming system in action.
\ No newline at end of file
diff --git a/package.json b/package.json
index bfa13b82..c65db82c 100644
--- a/package.json
+++ b/package.json
@@ -46,7 +46,6 @@
"@headlessui/tailwindcss": "^0.2.1",
"@popperjs/core": "^2.11.8",
"@tailwindcss/forms": "^0.5.9",
- "@tailwindcss/vite": "^4.1.13",
"@tanstack/react-table": "^8.20.5",
"@tanstack/react-virtual": "^3.10.8",
"@tanstack/table-core": "^8.20.5",
@@ -72,6 +71,7 @@
"@storybook/react-vite": "^8.3.6",
"@svgr/cli": "8.1.0",
"@tailwindcss/postcss": "^4.1.13",
+ "@tailwindcss/vite": "^4.1.13",
"@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "6.6.2",
"@testing-library/react": "^16.0.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 220abcea..ed9d7a8d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -24,9 +24,6 @@ importers:
'@tailwindcss/forms':
specifier: ^0.5.9
version: 0.5.10(tailwindcss@4.1.13)
- '@tailwindcss/vite':
- specifier: ^4.1.13
- version: 4.1.13(vite@5.4.20(@types/node@24.3.1)(lightningcss@1.30.1)(terser@5.44.0))
'@tanstack/react-table':
specifier: ^8.20.5
version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -97,6 +94,9 @@ importers:
'@tailwindcss/postcss':
specifier: ^4.1.13
version: 4.1.13
+ '@tailwindcss/vite':
+ specifier: ^4.1.13
+ version: 4.1.13(vite@5.4.20(@types/node@24.3.1)(lightningcss@1.30.1)(terser@5.44.0))
'@testing-library/dom':
specifier: ^10.4.0
version: 10.4.0
diff --git a/src/components/alert/alert.stories.tsx b/src/components/alert/alert.stories.tsx
index f6a2bc6c..faa9c45b 100644
--- a/src/components/alert/alert.stories.tsx
+++ b/src/components/alert/alert.stories.tsx
@@ -1,6 +1,6 @@
import type { Meta, StoryObj } from "@storybook/react";
-import React from "react";
+import React, { useState, useEffect } from "react";
import { Alert, AlertProps } from "./alert";
import { getStoryDescription, hiddenArgControl } from "../../util/storybook-utils";
@@ -43,3 +43,57 @@ export const OnlyTitles: Story = {
args: { children: undefined },
argTypes: { ...Intents.argTypes, children: hiddenArgControl },
};
+
+export const DarkMode: Story = {
+ argTypes: {
+ intent: hiddenArgControl,
+ children: hiddenArgControl,
+ },
+ render: () => {
+ // eslint-disable-next-line react-hooks/rules-of-hooks
+ const [theme, setTheme] = useState<"light" | "dark">("light");
+
+ // eslint-disable-next-line react-hooks/rules-of-hooks
+ useEffect(() => {
+ document.documentElement.classList.remove("light", "dark");
+ document.documentElement.classList.add(theme);
+ }, [theme]);
+
+ return (
+
+
+
+
+
+
+
+ This is an informational alert that adapts to light and dark themes.
+
+
+ Operation completed successfully! The changes have been saved.
+
+
+ Please review your settings before proceeding with this action.
+
+
+ An error occurred while processing your request. Please try again.
+
+
+
+
+
+ Note: Alert colors remain consistent across themes to maintain semantic
+ meaning. The background container demonstrates theme-aware background and
+ text colors.
+