refactor: remove core-ui from main (scaffoldable via gen core-package ui)
Removal across all three consumers: - apps/storybook: strips @repo/core-ui dep, clears stories glob (now []), removes globals.css import from preview.ts - apps/web-next: strips @repo/core-ui dep + transpilePackages entry - apps/web-tanstack: strips @repo/core-ui dep - packages/core-ui: deleted entirely (28 files) No app pages needed surgery — neither web-next nor web-tanstack source files imported @repo/core-ui directly. The storybook app referenced it only via the stories glob and the globals.css preview import. Gates: 40/40 tasks successful, all 4 e2e byte-identical reconstructions pass (realtime, events, trpc, ui). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,7 @@ import type { StorybookConfig } from "@storybook/react-vite";
|
||||
|
||||
const config: StorybookConfig = {
|
||||
framework: "@storybook/react-vite",
|
||||
stories: ["../../../packages/core-ui/src/**/*.stories.@(ts|tsx)"],
|
||||
stories: [],
|
||||
addons: ["@storybook/addon-essentials"],
|
||||
docs: {
|
||||
autodocs: "tag",
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import type { Preview } from "@storybook/react";
|
||||
import "@repo/core-ui/styles/globals.css";
|
||||
|
||||
const preview: Preview = {
|
||||
parameters: {
|
||||
|
||||
@@ -12,9 +12,7 @@
|
||||
"test-storybook": "test-storybook --url http://localhost:6006",
|
||||
"test:stories": "concurrently -k -s first -n 'SB,TEST' -c 'magenta,blue' 'pnpm exec http-server storybook-static --port 6006 --silent' 'pnpm exec wait-on tcp:6006 && pnpm test-storybook'"
|
||||
},
|
||||
"dependencies": {
|
||||
"@repo/core-ui": "workspace:*"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"@repo/core-eslint": "workspace:*",
|
||||
"@repo/core-typescript": "workspace:*",
|
||||
|
||||
@@ -8,7 +8,6 @@ const nextConfig = {
|
||||
"@repo/core-api",
|
||||
"@repo/core-cms",
|
||||
"@repo/core-shared",
|
||||
"@repo/core-ui",
|
||||
"@repo/marketing-pages",
|
||||
"@repo/media",
|
||||
"@repo/navigation",
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
"@repo/core-api": "workspace:*",
|
||||
"@repo/core-cms": "workspace:*",
|
||||
"@repo/core-shared": "workspace:*",
|
||||
"@repo/core-ui": "workspace:*",
|
||||
"@repo/marketing-pages": "workspace:*",
|
||||
"@repo/media": "workspace:*",
|
||||
"@repo/navigation": "workspace:*",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -15,7 +15,6 @@
|
||||
"@repo/blog": "workspace:*",
|
||||
"@repo/core-api": "workspace:*",
|
||||
"@repo/core-shared": "workspace:*",
|
||||
"@repo/core-ui": "workspace:*",
|
||||
"@repo/marketing-pages": "workspace:*",
|
||||
"@repo/navigation": "workspace:*",
|
||||
"@sentry/node": "^10.52.0",
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
# AGENTS.md — core-ui
|
||||
|
||||
Design-system primitives organized by Atomic Design. Only **generic components** (atoms, molecules, generic organisms) live here. Feature-specific components live in their respective feature packages.
|
||||
|
||||
## Responsibilities
|
||||
|
||||
- **Atoms** — Single HTML elements: Button, Input, Label, Card
|
||||
- **Molecules** — Combinations: FormField (Label + Input), Badge, Avatar
|
||||
- **Generic Organisms** — Reusable complex layouts: Modal, Tabs, NavigationMenu, CommandPalette
|
||||
- **Templates** — Page layouts: AuthLayout, DashboardLayout, LandingLayout
|
||||
- **Utilities** — `cn()` for className merging, design tokens, Tailwind config
|
||||
|
||||
## Feature-specific boundary
|
||||
|
||||
Feature-specific organisms (e.g., `ArticleCard`, `ArticleList`, `HeaderNavMenu`) live in their feature's `ui/` folder, NOT here. This boundary keeps `core-ui` framework-agnostic and reusable.
|
||||
|
||||
## Must NOT import
|
||||
|
||||
- Any feature package (`@repo/auth`, `@repo/blog`, etc.)
|
||||
- Any app package
|
||||
- `@repo/core-api`, `@repo/core-cms`, `@repo/core-trpc`
|
||||
|
||||
> Note: `@repo/core-trpc` is an optional package scaffolded via `pnpm turbo gen core-package trpc`. If not present, this constraint still applies to any future installation.
|
||||
|
||||
## Public exports
|
||||
|
||||
From `package.json`:
|
||||
- `.` — all atoms, molecules, organisms, templates
|
||||
|
||||
Example usage:
|
||||
```typescript
|
||||
import { Button, Input, Label } from "@repo/core-ui";
|
||||
import { FormField } from "@repo/core-ui";
|
||||
import { Modal, Tabs } from "@repo/core-ui";
|
||||
```
|
||||
|
||||
## Test conventions
|
||||
|
||||
- Tests colocated: `src/atoms/button/button.tsx` → `src/atoms/button/button.test.tsx`
|
||||
- Vitest environment: `jsdom` (React component testing)
|
||||
- Alias: `@/` resolves to `src/`
|
||||
- Run: `pnpm test --filter @repo/core-ui`
|
||||
- Storybook stories colocated: `src/atoms/button/button.stories.tsx`
|
||||
|
||||
## Structure
|
||||
|
||||
```
|
||||
src/
|
||||
atoms/
|
||||
{name}/
|
||||
{name}.tsx # Component
|
||||
{name}.test.tsx # Tests
|
||||
{name}.stories.tsx # Storybook story
|
||||
index.ts # Barrel export
|
||||
molecules/
|
||||
{name}/
|
||||
...
|
||||
organisms/
|
||||
{name}/
|
||||
...
|
||||
templates/
|
||||
{name}/
|
||||
...
|
||||
lib/
|
||||
utils.ts # cn() and helpers
|
||||
index.ts # Re-exports everything
|
||||
```
|
||||
@@ -1,3 +0,0 @@
|
||||
import baseConfig from "@repo/core-eslint/base";
|
||||
|
||||
export default baseConfig;
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"name": "@repo/core-ui",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
".": "./src/index.ts",
|
||||
"./styles/globals.css": "./src/styles/globals.css"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc --noEmit",
|
||||
"lint": "eslint .",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "vitest run --passWithNoTests"
|
||||
},
|
||||
"dependencies": {
|
||||
"clsx": "^2.1.1",
|
||||
"react": "^19.0.0",
|
||||
"tailwind-merge": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@repo/core-eslint": "workspace:*",
|
||||
"@repo/core-testing": "workspace:*",
|
||||
"@repo/core-typescript": "workspace:*",
|
||||
"@storybook/react": "^8.6.0",
|
||||
"@testing-library/jest-dom": "^6.5.0",
|
||||
"@testing-library/react": "^16.0.0",
|
||||
"@testing-library/user-event": "^14.5.0",
|
||||
"@types/react": "^19.0.0",
|
||||
"jsdom": "^25.0.0",
|
||||
"vitest": "^3.0.0"
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import type { Meta, StoryObj } from "@storybook/react";
|
||||
import { Button } from "./button";
|
||||
|
||||
const meta = {
|
||||
title: "Atoms/Button",
|
||||
component: Button,
|
||||
tags: ["autodocs"],
|
||||
argTypes: {
|
||||
variant: {
|
||||
control: "select",
|
||||
options: ["default", "secondary", "destructive", "outline", "ghost"],
|
||||
},
|
||||
size: { control: "select", options: ["sm", "default", "lg"] },
|
||||
},
|
||||
} satisfies Meta<typeof Button>;
|
||||
export default meta;
|
||||
|
||||
type Story = StoryObj<typeof meta>;
|
||||
|
||||
export const Default: Story = {
|
||||
args: { children: "Button", variant: "default" },
|
||||
};
|
||||
|
||||
export const Secondary: Story = {
|
||||
args: { children: "Secondary", variant: "secondary" },
|
||||
};
|
||||
|
||||
export const Destructive: Story = {
|
||||
args: { children: "Destructive", variant: "destructive" },
|
||||
};
|
||||
|
||||
export const Outline: Story = {
|
||||
args: { children: "Outline", variant: "outline" },
|
||||
};
|
||||
|
||||
export const Ghost: Story = {
|
||||
args: { children: "Ghost", variant: "ghost" },
|
||||
};
|
||||
@@ -1,42 +0,0 @@
|
||||
import { describe, it, expect, vi } from "vitest";
|
||||
import { renderWithProviders } from "@repo/core-testing/react";
|
||||
import { screen } from "@testing-library/react";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { Button } from "./button";
|
||||
|
||||
describe("Button", () => {
|
||||
it("renders children inside a button", () => {
|
||||
renderWithProviders(<Button>Click me</Button>);
|
||||
expect(screen.getByRole("button", { name: "Click me" })).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("calls onClick when activated", async () => {
|
||||
const handleClick = vi.fn();
|
||||
renderWithProviders(<Button onClick={handleClick}>Go</Button>);
|
||||
await userEvent.click(screen.getByRole("button", { name: "Go" }));
|
||||
expect(handleClick).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it("applies the destructive variant class", () => {
|
||||
renderWithProviders(<Button variant="destructive">X</Button>);
|
||||
expect(screen.getByRole("button")).toHaveClass(/destructive/);
|
||||
});
|
||||
|
||||
it("applies the lg size class", () => {
|
||||
renderWithProviders(<Button size="lg">X</Button>);
|
||||
expect(screen.getByRole("button")).toHaveClass(/h-11/);
|
||||
});
|
||||
|
||||
it("disabled prop sets the attribute and prevents click handler", async () => {
|
||||
const handleClick = vi.fn();
|
||||
renderWithProviders(
|
||||
<Button disabled onClick={handleClick}>
|
||||
X
|
||||
</Button>,
|
||||
);
|
||||
const button = screen.getByRole("button");
|
||||
expect(button).toBeDisabled();
|
||||
await userEvent.click(button);
|
||||
expect(handleClick).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@@ -1,41 +0,0 @@
|
||||
import { forwardRef, type ButtonHTMLAttributes } from "react";
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
variant?: "default" | "secondary" | "destructive" | "outline" | "ghost";
|
||||
size?: "sm" | "default" | "lg";
|
||||
}
|
||||
|
||||
const variantStyles: Record<NonNullable<ButtonProps["variant"]>, string> = {
|
||||
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
||||
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
||||
destructive:
|
||||
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
||||
outline:
|
||||
"border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
||||
ghost: "hover:bg-accent hover:text-accent-foreground",
|
||||
};
|
||||
|
||||
const sizeStyles: Record<NonNullable<ButtonProps["size"]>, string> = {
|
||||
sm: "h-9 px-3 text-sm",
|
||||
default: "h-10 px-4 py-2",
|
||||
lg: "h-11 px-8 text-lg",
|
||||
};
|
||||
|
||||
export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
|
||||
({ className, variant = "default", size = "default", ...props }, ref) => {
|
||||
return (
|
||||
<button
|
||||
className={cn(
|
||||
"inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
|
||||
variantStyles[variant],
|
||||
sizeStyles[size],
|
||||
className
|
||||
)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
Button.displayName = "Button";
|
||||
@@ -1 +0,0 @@
|
||||
export { Button, type ButtonProps } from "./button";
|
||||
@@ -1,3 +0,0 @@
|
||||
export { Button, type ButtonProps } from "./button/index";
|
||||
export { Input, type InputProps } from "./input/index";
|
||||
export { Label, type LabelProps } from "./label/index";
|
||||
@@ -1 +0,0 @@
|
||||
export { Input, type InputProps } from "./input";
|
||||
@@ -1,19 +0,0 @@
|
||||
import type { Meta, StoryObj } from "@storybook/react";
|
||||
import { Input } from "./input";
|
||||
|
||||
const meta = {
|
||||
title: "Atoms/Input",
|
||||
component: Input,
|
||||
tags: ["autodocs"],
|
||||
} satisfies Meta<typeof Input>;
|
||||
export default meta;
|
||||
|
||||
type Story = StoryObj<typeof meta>;
|
||||
|
||||
export const Default: Story = {
|
||||
args: { placeholder: "Enter text..." },
|
||||
};
|
||||
|
||||
export const Disabled: Story = {
|
||||
args: { placeholder: "Disabled", disabled: true },
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { renderWithProviders } from "@repo/core-testing/react";
|
||||
import { screen } from "@testing-library/react";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { Input } from "./input";
|
||||
|
||||
describe("Input", () => {
|
||||
it("renders an input with the given placeholder", () => {
|
||||
renderWithProviders(<Input placeholder="email" />);
|
||||
expect(screen.getByPlaceholderText("email")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("forwards the type attribute", () => {
|
||||
renderWithProviders(<Input type="email" placeholder="email" />);
|
||||
expect(screen.getByPlaceholderText("email")).toHaveAttribute("type", "email");
|
||||
});
|
||||
|
||||
it("accepts user input", async () => {
|
||||
renderWithProviders(<Input placeholder="email" />);
|
||||
const input = screen.getByPlaceholderText("email");
|
||||
await userEvent.type(input, "hi@example.com");
|
||||
expect(input).toHaveValue("hi@example.com");
|
||||
});
|
||||
|
||||
it("disabled prop blocks user input", async () => {
|
||||
renderWithProviders(<Input placeholder="email" disabled />);
|
||||
const input = screen.getByPlaceholderText("email");
|
||||
await userEvent.type(input, "hi");
|
||||
expect(input).toHaveValue("");
|
||||
});
|
||||
});
|
||||
@@ -1,21 +0,0 @@
|
||||
import { forwardRef, type InputHTMLAttributes } from "react";
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
export type InputProps = InputHTMLAttributes<HTMLInputElement>;
|
||||
|
||||
export const Input = forwardRef<HTMLInputElement, InputProps>(
|
||||
({ className, type, ...props }, ref) => {
|
||||
return (
|
||||
<input
|
||||
type={type}
|
||||
className={cn(
|
||||
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
||||
className
|
||||
)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
Input.displayName = "Input";
|
||||
@@ -1 +0,0 @@
|
||||
export { Label, type LabelProps } from "./label";
|
||||
@@ -1,16 +0,0 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { renderWithProviders } from "@repo/core-testing/react";
|
||||
import { screen } from "@testing-library/react";
|
||||
import { Label } from "./label";
|
||||
|
||||
describe("Label", () => {
|
||||
it("renders the label text", () => {
|
||||
renderWithProviders(<Label htmlFor="email">Email</Label>);
|
||||
expect(screen.getByText("Email")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("forwards htmlFor to associate with an input", () => {
|
||||
renderWithProviders(<Label htmlFor="email">Email</Label>);
|
||||
expect(screen.getByText("Email")).toHaveAttribute("for", "email");
|
||||
});
|
||||
});
|
||||
@@ -1,20 +0,0 @@
|
||||
import { forwardRef, type LabelHTMLAttributes } from "react";
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
export type LabelProps = LabelHTMLAttributes<HTMLLabelElement>;
|
||||
|
||||
export const Label = forwardRef<HTMLLabelElement, LabelProps>(
|
||||
({ className, ...props }, ref) => {
|
||||
return (
|
||||
<label
|
||||
className={cn(
|
||||
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
||||
className
|
||||
)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
Label.displayName = "Label";
|
||||
@@ -1,5 +0,0 @@
|
||||
export { cn } from "./lib/utils";
|
||||
export * from "./atoms/index";
|
||||
export * from "./molecules/index";
|
||||
export * from "./organisms/index";
|
||||
export * from "./templates/index";
|
||||
@@ -1,6 +0,0 @@
|
||||
import { clsx, type ClassValue } from "clsx";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
import type { Meta, StoryObj } from "@storybook/react";
|
||||
import { FormField } from "./form-field";
|
||||
|
||||
const meta = {
|
||||
title: "Molecules/FormField",
|
||||
component: FormField,
|
||||
tags: ["autodocs"],
|
||||
} satisfies Meta<typeof FormField>;
|
||||
export default meta;
|
||||
|
||||
type Story = StoryObj<typeof meta>;
|
||||
|
||||
export const Default: Story = {
|
||||
args: { label: "Email", placeholder: "you@example.com", type: "email" },
|
||||
};
|
||||
|
||||
export const WithDescription: Story = {
|
||||
args: {
|
||||
label: "Username",
|
||||
placeholder: "johndoe",
|
||||
description: "Must be 3-31 characters",
|
||||
},
|
||||
};
|
||||
|
||||
export const WithError: Story = {
|
||||
args: {
|
||||
label: "Password",
|
||||
type: "password",
|
||||
error: "Password must be at least 6 characters",
|
||||
},
|
||||
};
|
||||
@@ -1,33 +0,0 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { renderWithProviders } from "@repo/core-testing/react";
|
||||
import { screen } from "@testing-library/react";
|
||||
import { FormField } from "./form-field";
|
||||
|
||||
describe("FormField", () => {
|
||||
it("renders label associated with input via auto-derived id", () => {
|
||||
renderWithProviders(<FormField label="Email Address" />);
|
||||
const input = screen.getByLabelText("Email Address");
|
||||
expect(input).toBeInTheDocument();
|
||||
expect(input).toHaveAttribute("id", "email-address");
|
||||
});
|
||||
|
||||
it("uses an explicit id over the derived one", () => {
|
||||
renderWithProviders(<FormField label="Email" id="custom-id" />);
|
||||
expect(screen.getByLabelText("Email")).toHaveAttribute("id", "custom-id");
|
||||
});
|
||||
|
||||
it("renders a description when provided", () => {
|
||||
renderWithProviders(<FormField label="Email" description="We never share it." />);
|
||||
expect(screen.getByText("We never share it.")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("renders an error message when provided", () => {
|
||||
renderWithProviders(<FormField label="Email" error="Required" />);
|
||||
expect(screen.getByText("Required")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("forwards input props (e.g., type) to the underlying input", () => {
|
||||
renderWithProviders(<FormField label="Email" type="email" />);
|
||||
expect(screen.getByLabelText("Email")).toHaveAttribute("type", "email");
|
||||
});
|
||||
});
|
||||
@@ -1,31 +0,0 @@
|
||||
import { Label } from "../../atoms/label/index";
|
||||
import { Input, type InputProps } from "../../atoms/input/index";
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
export interface FormFieldProps extends InputProps {
|
||||
label: string;
|
||||
error?: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export function FormField({
|
||||
label,
|
||||
error,
|
||||
description,
|
||||
className,
|
||||
id,
|
||||
...inputProps
|
||||
}: FormFieldProps) {
|
||||
const fieldId = id ?? label.toLowerCase().replace(/\s+/g, "-");
|
||||
|
||||
return (
|
||||
<div className={cn("space-y-2", className)}>
|
||||
<Label htmlFor={fieldId}>{label}</Label>
|
||||
<Input id={fieldId} {...inputProps} />
|
||||
{description && (
|
||||
<p className="text-sm text-muted-foreground">{description}</p>
|
||||
)}
|
||||
{error && <p className="text-sm text-destructive">{error}</p>}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export { FormField, type FormFieldProps } from "./form-field";
|
||||
@@ -1 +0,0 @@
|
||||
export { FormField, type FormFieldProps } from "./form-field/index";
|
||||
@@ -1 +0,0 @@
|
||||
export {};
|
||||
@@ -1,26 +0,0 @@
|
||||
@import "tailwindcss";
|
||||
|
||||
@theme {
|
||||
--color-background: hsl(0 0% 100%);
|
||||
--color-foreground: hsl(240 10% 3.9%);
|
||||
--color-card: hsl(0 0% 100%);
|
||||
--color-card-foreground: hsl(240 10% 3.9%);
|
||||
--color-popover: hsl(0 0% 100%);
|
||||
--color-popover-foreground: hsl(240 10% 3.9%);
|
||||
--color-primary: hsl(240 5.9% 10%);
|
||||
--color-primary-foreground: hsl(0 0% 98%);
|
||||
--color-secondary: hsl(240 4.8% 95.9%);
|
||||
--color-secondary-foreground: hsl(240 5.9% 10%);
|
||||
--color-muted: hsl(240 4.8% 95.9%);
|
||||
--color-muted-foreground: hsl(240 3.8% 46.1%);
|
||||
--color-accent: hsl(240 4.8% 95.9%);
|
||||
--color-accent-foreground: hsl(240 5.9% 10%);
|
||||
--color-destructive: hsl(0 84.2% 60.2%);
|
||||
--color-destructive-foreground: hsl(0 0% 98%);
|
||||
--color-border: hsl(240 5.9% 90%);
|
||||
--color-input: hsl(240 5.9% 90%);
|
||||
--color-ring: hsl(240 5.9% 10%);
|
||||
--radius-sm: 0.25rem;
|
||||
--radius-md: 0.375rem;
|
||||
--radius-lg: 0.5rem;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export {};
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"extends": "@repo/core-typescript/react-library.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"rootDir": ".",
|
||||
"types": ["vitest/globals", "@testing-library/jest-dom"],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.stories.tsx", "**/*.stories.ts"]
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"extends": ["//"],
|
||||
"tags": ["core"]
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
import path from "node:path";
|
||||
import { mergeConfig } from "vitest/config";
|
||||
import { jsdomVitestConfig } from "@repo/core-typescript/vitest.base.jsdom";
|
||||
|
||||
export default mergeConfig(jsdomVitestConfig, {
|
||||
resolve: {
|
||||
alias: { "@": path.resolve(__dirname, "./src") },
|
||||
},
|
||||
});
|
||||
58
pnpm-lock.yaml
generated
58
pnpm-lock.yaml
generated
@@ -86,10 +86,6 @@ importers:
|
||||
version: 3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)
|
||||
|
||||
apps/storybook:
|
||||
dependencies:
|
||||
'@repo/core-ui':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/core-ui
|
||||
devDependencies:
|
||||
'@repo/core-eslint':
|
||||
specifier: workspace:*
|
||||
@@ -157,9 +153,6 @@ importers:
|
||||
'@repo/core-shared':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/core-shared
|
||||
'@repo/core-ui':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/core-ui
|
||||
'@repo/marketing-pages':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/marketing-pages
|
||||
@@ -251,9 +244,6 @@ importers:
|
||||
'@repo/core-shared':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/core-shared
|
||||
'@repo/core-ui':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/core-ui
|
||||
'@repo/marketing-pages':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/marketing-pages
|
||||
@@ -632,49 +622,6 @@ importers:
|
||||
specifier: ^3.1.0
|
||||
version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)
|
||||
|
||||
packages/core-ui:
|
||||
dependencies:
|
||||
clsx:
|
||||
specifier: ^2.1.1
|
||||
version: 2.1.1
|
||||
react:
|
||||
specifier: ^19.0.0
|
||||
version: 19.2.4
|
||||
tailwind-merge:
|
||||
specifier: ^3.0.0
|
||||
version: 3.5.0
|
||||
devDependencies:
|
||||
'@repo/core-eslint':
|
||||
specifier: workspace:*
|
||||
version: link:../core-eslint
|
||||
'@repo/core-testing':
|
||||
specifier: workspace:*
|
||||
version: link:../core-testing
|
||||
'@repo/core-typescript':
|
||||
specifier: workspace:*
|
||||
version: link:../core-typescript
|
||||
'@storybook/react':
|
||||
specifier: ^8.6.0
|
||||
version: 8.6.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@8.6.18(prettier@3.8.1))(typescript@5.9.3)
|
||||
'@testing-library/jest-dom':
|
||||
specifier: ^6.5.0
|
||||
version: 6.9.1
|
||||
'@testing-library/react':
|
||||
specifier: ^16.0.0
|
||||
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||
'@testing-library/user-event':
|
||||
specifier: ^14.5.0
|
||||
version: 14.6.1(@testing-library/dom@10.4.1)
|
||||
'@types/react':
|
||||
specifier: ^19.0.0
|
||||
version: 19.2.14
|
||||
jsdom:
|
||||
specifier: ^25.0.0
|
||||
version: 25.0.1
|
||||
vitest:
|
||||
specifier: ^3.0.0
|
||||
version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)
|
||||
|
||||
packages/marketing-pages:
|
||||
dependencies:
|
||||
'@repo/auth':
|
||||
@@ -6913,9 +6860,6 @@ packages:
|
||||
tabbable@6.4.0:
|
||||
resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
|
||||
|
||||
tailwind-merge@3.5.0:
|
||||
resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==}
|
||||
|
||||
tailwindcss@4.2.2:
|
||||
resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==}
|
||||
|
||||
@@ -14527,8 +14471,6 @@ snapshots:
|
||||
|
||||
tabbable@6.4.0: {}
|
||||
|
||||
tailwind-merge@3.5.0: {}
|
||||
|
||||
tailwindcss@4.2.2: {}
|
||||
|
||||
tapable@2.3.2: {}
|
||||
|
||||
Reference in New Issue
Block a user