From cc9c0562ffc85cd00d1fe5eb25e2c158323d9c57 Mon Sep 17 00:00:00 2001 From: kimdaeyeobbb Date: Tue, 21 Jan 2025 23:56:17 +0900 Subject: [PATCH] feat(checkbox): add checkbox story --- packages/checkbox/src/Checkbox.stories.tsx | 181 +++++++++++++++++- .../checkbox/src/images/checkbox-icon.svg | 3 + packages/checkbox/src/types/svg.d.ts | 4 + 3 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 packages/checkbox/src/images/checkbox-icon.svg create mode 100644 packages/checkbox/src/types/svg.d.ts diff --git a/packages/checkbox/src/Checkbox.stories.tsx b/packages/checkbox/src/Checkbox.stories.tsx index 6238827..4faef89 100644 --- a/packages/checkbox/src/Checkbox.stories.tsx +++ b/packages/checkbox/src/Checkbox.stories.tsx @@ -1,15 +1,192 @@ import type { Meta, StoryObj } from '@storybook/react'; +import { useState } from 'react'; import { Checkbox } from './Checkbox'; +import { useCheckboxGroup } from './hooks/useCheckboxGroup'; +import CheckboxIcon from './images/checkbox-icon.svg'; const meta = { - component: Checkbox, title: 'Checkbox', + component: Checkbox, parameters: { layout: 'centered', }, } satisfies Meta; + export default meta; type Story = StoryObj; -export const Basic: Story = {}; +export const Basic: Story = { + args: { + label: 'Basic Checkbox', + value: 'test', + name: 'test', + }, +}; + +export const Checked: Story = { + args: { + label: 'Checked Checkbox', + value: 'test', + name: 'test', + checked: true, + }, +}; + +export const Disabled: Story = { + args: { + label: 'Disabled Checkbox', + value: 'test', + name: 'test', + disabled: true, + }, +}; + +export const Sizes: Story = { + render: () => ( +
+ + + +
+ ), +}; + +export const customStyles: Story = { + args: { + label: 'Custom Styled Checkbox', + style: { + padding: '20px', + border: '2px solid #007bff', + borderRadius: '10px', + backgroundColor: '#f8f9fa', + // backgroundImage: `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z'/%3E%3C/svg%3E")`, + // backgroundSize: '75%', + // backgroundPosition: 'center', + // backgroundRepeat: 'no-repeat', + }, + value: 'test', + name: 'test', + }, +}; + +export const Controlled: Story = { + render: () => { + const [isChecked, setIsChecked] = useState(false); + + return ( + + ); + }, +}; + +export const Uncontrolled: Story = { + args: { + label: 'Uncontrolled Checkbox', + defaultChecked: true, + value: 'test', + name: 'test', + }, +}; + +export const CheckboxGroup: Story = { + render: () => { + const items = ['Item 1', 'Item 2', 'Item 3']; + const { checkedItems, updateCheckedItems, setAllChecked, allChecked } = + useCheckboxGroup({ + total: items.length, + }); + + return ( +
+ + {items.map((item, index) => ( + updateCheckedItems(index, checked)} + /> + ))} +
+ ); + }, +}; + +export const Indeterminate: Story = { + render: () => { + const [parentChecked, setParentChecked] = useState(false); + const [parentIndeterminate, setParentIndeterminate] = useState(false); + const [childChecked, setChildChecked] = useState([false, false]); + + const updateParentState = (newChildChecked: boolean[]) => { + const checkedCount = newChildChecked.filter(Boolean).length; + setParentIndeterminate( + checkedCount > 0 && checkedCount < newChildChecked.length, + ); + setParentChecked(checkedCount === newChildChecked.length); + }; + + const handleParentChange = (checked: boolean) => { + setParentChecked(checked); + setParentIndeterminate(false); + setChildChecked([checked, checked]); + }; + + const handleChildChange = (index: number, checked: boolean) => { + const newChildChecked = [...childChecked]; + newChildChecked[index] = checked; + setChildChecked(newChildChecked); + updateParentState(newChildChecked); + }; + + return ( +
+ +
+ handleChildChange(0, checked)} + /> + handleChildChange(1, checked)} + /> +
+
+ ); + }, +}; diff --git a/packages/checkbox/src/images/checkbox-icon.svg b/packages/checkbox/src/images/checkbox-icon.svg new file mode 100644 index 0000000..1ae5515 --- /dev/null +++ b/packages/checkbox/src/images/checkbox-icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/checkbox/src/types/svg.d.ts b/packages/checkbox/src/types/svg.d.ts new file mode 100644 index 0000000..cdb2b1a --- /dev/null +++ b/packages/checkbox/src/types/svg.d.ts @@ -0,0 +1,4 @@ +declare module '*.svg' { + const content: string; + export default content; +}