added storybook

This commit is contained in:
Nate Kelley 2025-02-21 14:13:15 -07:00
parent 6212f38615
commit 805c96c918
No known key found for this signature in database
GPG Key ID: FD90372AB8D98B4F
12 changed files with 6470 additions and 177 deletions

View File

@ -1,5 +1,8 @@
{
"extends": "next/core-web-vitals",
"extends": [
"next/core-web-vitals",
"plugin:storybook/recommended"
],
"env": {
"jest": true,
"node": true
@ -12,4 +15,4 @@
"no-undef": "error",
"react/no-children-prop": "off"
}
}
}

2
web/.gitignore vendored
View File

@ -44,3 +44,5 @@ next-env.d.ts
# Million Lint
.million
.million/store.json
*storybook.log

17
web/.storybook/main.ts Normal file
View File

@ -0,0 +1,17 @@
import type { StorybookConfig } from '@storybook/nextjs';
const config: StorybookConfig = {
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
addons: [
'@storybook/addon-onboarding',
'@storybook/addon-essentials',
'@chromatic-com/storybook',
'@storybook/addon-interactions'
],
framework: {
name: '@storybook/nextjs',
options: {}
},
staticDirs: ['../public']
};
export default config;

15
web/.storybook/preview.ts Normal file
View File

@ -0,0 +1,15 @@
import type { Preview } from '@storybook/react';
import '../src/styles/styles.scss';
const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i
}
}
}
};
export default preview;

6452
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,9 @@
"lint": "next lint",
"cy:run": "npx cypress run --browser chrome",
"test": "jest",
"test:watch": "jest --watch"
"test:watch": "jest --watch",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"
},
"engines": {
"node": ">=20.0.0"
@ -101,6 +103,14 @@
"virtua": "^0.40.0"
},
"devDependencies": {
"@chromatic-com/storybook": "^3.2.4",
"@storybook/addon-essentials": "^8.5.8",
"@storybook/addon-interactions": "^8.5.8",
"@storybook/addon-onboarding": "^8.5.8",
"@storybook/blocks": "^8.5.8",
"@storybook/nextjs": "^8.5.8",
"@storybook/react": "^8.5.8",
"@storybook/test": "^8.5.8",
"@tailwindcss/postcss": "^4.0.8",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.2.0",
@ -124,11 +134,13 @@
"eslint-config-next": "14.2.3",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.3",
"eslint-plugin-storybook": "^0.11.3",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"monaco-editor-webpack-plugin": "^7.1.0",
"postcss": "8.5.3",
"sass": "^1.83.4",
"storybook": "^8.5.8",
"tailwindcss": "^4.0.8",
"tailwindcss-animate": "^1.0.7",
"ts-jest": "^29.2.5",

View File

@ -1,31 +0,0 @@
"use client"
import * as React from "react"
import * as SwitchPrimitive from "@radix-ui/react-switch"
import { cn } from "@/lib/classMerge"
function Switch({
className,
...props
}: React.ComponentProps<typeof SwitchPrimitive.Root>) {
return (
<SwitchPrimitive.Root
data-slot="switch"
className={cn(
"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 inline-flex h-5 w-9 shrink-0 items-center rounded-full border-2 border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
className
)}
{...props}
>
<SwitchPrimitive.Thumb
data-slot="switch-thumb"
className={cn(
"bg-background pointer-events-none block size-4 rounded-full ring-0 shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"
)}
/>
</SwitchPrimitive.Root>
)
}
export { Switch }

View File

@ -0,0 +1,45 @@
import type { Meta, StoryObj } from '@storybook/react';
import { Switch } from './AppSwitch';
const meta: Meta<typeof Switch> = {
title: 'Base/Switch',
component: Switch,
argTypes: {
className: { control: 'text' },
defaultChecked: { control: 'boolean' },
disabled: { control: 'boolean' },
checked: { control: 'boolean' }
}
};
export default meta;
type Story = StoryObj<typeof Switch>;
export const Default: Story = {
args: {}
};
export const Checked: Story = {
args: {
defaultChecked: true
}
};
export const Disabled: Story = {
args: {
disabled: true
}
};
export const DisabledChecked: Story = {
args: {
disabled: true,
defaultChecked: true
}
};
export const WithCustomClassName: Story = {
args: {
className: 'bg-blue-500 data-[state=checked]:bg-green-500'
}
};

View File

@ -0,0 +1,34 @@
'use client';
import * as React from 'react';
import * as SwitchPrimitive from '@radix-ui/react-switch';
import { cn } from '@/lib/classMerge';
type SwitchProps = React.ComponentProps<typeof SwitchPrimitive.Root> & {
checked?: boolean;
defaultChecked?: boolean;
required?: boolean;
onCheckedChange?(checked: boolean): void;
};
function Switch({ className, ...props }: SwitchProps) {
return (
<SwitchPrimitive.Root
data-slot="switch"
className={cn(
'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
className
)}
{...props}>
<SwitchPrimitive.Thumb
data-slot="switch-thumb"
className={cn(
'bg-background pointer-events-none block size-4 rounded-full ring-0 shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0'
)}
/>
</SwitchPrimitive.Root>
);
}
export { Switch };

View File

@ -0,0 +1 @@

View File

@ -1,4 +1,5 @@
@import './fonts';
@import './buster';
@import './tailwind';
@import './sql';
@import './monaco';

View File

@ -41,8 +41,34 @@
--color-primary-light: #a26cff;
--color-primary-dark: #6d28d9;
--color-background: hsl(0 0% 100%);
--color-foreground: hsl(0 0% 3.9%);
--color-card: hsl(0 0% 100%);
--color-card-foreground: hsl(0 0% 3.9%);
--color-popover: hsl(0 0% 100%);
--color-popover-foreground: hsl(0 0% 3.9%);
--color-secondary: hsl(0 0% 96.1%);
--color-secondary-foreground: hsl(0 0% 9%);
--color-muted: hsl(0 0% 96.1%);
--color-muted-foreground: hsl(0 0% 45.1%);
--color-accent: hsl(0 0% 96.1%);
--color-accent-foreground: hsl(0 0% 9%);
--color-destructive: hsl(0 84.2% 60.2%);
--color-destructive-foreground: hsl(0 0% 98%);
--color-border: hsl(0 0% 89.8%);
--color-ring: hsl(0 0% 3.9%);
/* component color */
--color-input: var(--color-primary);
--color-input: hsl(0 0% 89.8%);
}
@import './tailwindAnimations.css';
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}