From 6b23e5ef6040e8e233dd9e70c604e4d600cbd197 Mon Sep 17 00:00:00 2001 From: Amit Haridas Date: Fri, 5 Jun 2026 17:18:19 +0530 Subject: [PATCH] feat(renderer): add shadcn switch primitive --- package-lock.json | 30 +++++++++++++++++++++++++++ package.json | 1 + src/renderer/components/ui/switch.tsx | 26 +++++++++++++++++++++++ tests/component/ui/switch.test.tsx | 13 ++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 src/renderer/components/ui/switch.tsx create mode 100644 tests/component/ui/switch.test.tsx diff --git a/package-lock.json b/package-lock.json index c25893f..4445aba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-switch": "^1.2.6", "@tanstack/react-table": "^8.21.3", "codemirror": "^6.0.2", "core-util-is": "^1.0.3", @@ -4450,6 +4451,35 @@ } } }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "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-use-callback-ref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", diff --git a/package.json b/package.json index bf83635..8d31a3b 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-switch": "^1.2.6", "@tanstack/react-table": "^8.21.3", "codemirror": "^6.0.2", "core-util-is": "^1.0.3", diff --git a/src/renderer/components/ui/switch.tsx b/src/renderer/components/ui/switch.tsx new file mode 100644 index 0000000..2783b63 --- /dev/null +++ b/src/renderer/components/ui/switch.tsx @@ -0,0 +1,26 @@ +import * as React from "react" +import * as SwitchPrimitive from "@radix-ui/react-switch" +import { cn } from "@/lib/utils" + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +Switch.displayName = SwitchPrimitive.Root.displayName + +export { Switch } \ No newline at end of file diff --git a/tests/component/ui/switch.test.tsx b/tests/component/ui/switch.test.tsx new file mode 100644 index 0000000..72d74f8 --- /dev/null +++ b/tests/component/ui/switch.test.tsx @@ -0,0 +1,13 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Switch } from '@/components/ui/switch'; + +describe('Switch', () => { + it('toggles checked state', async () => { + const onCheckedChange = vi.fn(); + render(); + await userEvent.click(screen.getByRole('switch', { name: /airplane/i })); + expect(onCheckedChange).toHaveBeenCalledWith(true); + }); +}); \ No newline at end of file