From a0e8dc6be02a2a47e77c689ded6bfe04194beca2 Mon Sep 17 00:00:00 2001 From: Maciej Trojan Date: Thu, 30 Jan 2025 12:13:39 +0100 Subject: [PATCH] feat: add Label component --- package-lock.json | 49 ++++++++++++++++++- package.json | 1 + .../__snapshots__/label.spec.tsx.snap | 12 +++++ src/components/input.stories.tsx | 12 +++++ src/components/label.spec.tsx | 10 ++++ src/components/label.stories.tsx | 26 ++++++++++ src/components/label.tsx | 27 ++++++++++ 7 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/components/__snapshots__/label.spec.tsx.snap create mode 100644 src/components/label.spec.tsx create mode 100644 src/components/label.stories.tsx create mode 100644 src/components/label.tsx diff --git a/package-lock.json b/package-lock.json index 75a68fd..bfcff27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0-semantically-released", "license": "ISC", "dependencies": { + "@radix-ui/react-label": "^2.1.1", "@radix-ui/react-slot": "^1.1.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -1595,6 +1596,52 @@ } } }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz", + "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", @@ -11970,7 +12017,6 @@ "version": "19.0.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -12452,7 +12498,6 @@ "version": "0.25.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", - "dev": true, "license": "MIT", "peer": true }, diff --git a/package.json b/package.json index fb04232..371f183 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "vitest": "^3.0.4" }, "dependencies": { + "@radix-ui/react-label": "^2.1.1", "@radix-ui/react-slot": "^1.1.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", diff --git a/src/components/__snapshots__/label.spec.tsx.snap b/src/components/__snapshots__/label.spec.tsx.snap new file mode 100644 index 0000000..368965b --- /dev/null +++ b/src/components/__snapshots__/label.spec.tsx.snap @@ -0,0 +1,12 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Label component > renders correctly 1`] = ` +
+ +
+`; diff --git a/src/components/input.stories.tsx b/src/components/input.stories.tsx index 64afa0e..bca9321 100644 --- a/src/components/input.stories.tsx +++ b/src/components/input.stories.tsx @@ -2,6 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react"; import { Button } from "./button"; import { Input } from "./input"; +import { Label } from "./label"; const meta = { title: "Input", @@ -48,3 +49,14 @@ export const WithButton: Story = { ); }, }; + +export const WithLabel: Story = { + render() { + return ( +
+ + +
+ ); + }, +}; diff --git a/src/components/label.spec.tsx b/src/components/label.spec.tsx new file mode 100644 index 0000000..27ab4d9 --- /dev/null +++ b/src/components/label.spec.tsx @@ -0,0 +1,10 @@ +import { render } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; +import { Label } from "./label"; + +describe("Label component", () => { + it("renders correctly", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/components/label.stories.tsx b/src/components/label.stories.tsx new file mode 100644 index 0000000..e8c5ecf --- /dev/null +++ b/src/components/label.stories.tsx @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Input } from "./input"; +import { Label } from "./label"; + +const meta = { + title: "Label", + component: Label, + parameters: { + layout: "centered", + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const WithInput: Story = { + render() { + return ( +
+ + +
+ ); + }, +}; diff --git a/src/components/label.tsx b/src/components/label.tsx new file mode 100644 index 0000000..8d29fba --- /dev/null +++ b/src/components/label.tsx @@ -0,0 +1,27 @@ +"use client"; + +import * as LabelPrimitive from "@radix-ui/react-label"; +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +); + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)); + +Label.displayName = LabelPrimitive.Root.displayName; + +export { Label };