daleui 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bun.lock +2049 -9686
- package/package.json +12 -1
- package/src/components/Checkbox/Checkbox.stories.tsx +129 -0
- package/src/components/Checkbox/Checkbox.test.tsx +169 -0
- package/src/components/Checkbox/Checkbox.tsx +190 -0
- package/bun.lockb +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "daleui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"repository": "github:DaleStudy/daleui",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://www.daleui.com",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"design-system",
|
|
10
|
+
"ui-components",
|
|
11
|
+
"components-library",
|
|
12
|
+
"react",
|
|
13
|
+
"storybook"
|
|
14
|
+
],
|
|
5
15
|
"scripts": {
|
|
6
16
|
"dev": "vite",
|
|
7
17
|
"build": "tsc -b && vite build",
|
|
@@ -15,6 +25,7 @@
|
|
|
15
25
|
"prepare": "panda codegen"
|
|
16
26
|
},
|
|
17
27
|
"dependencies": {
|
|
28
|
+
"@radix-ui/react-checkbox": "^1.1.4",
|
|
18
29
|
"axe-playwright": "^2.0.3",
|
|
19
30
|
"chromatic": "^11.25.1",
|
|
20
31
|
"lucide-react": "^0.474.0",
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Checkbox } from "./Checkbox";
|
|
3
|
+
import { vstack } from "../../../styled-system/patterns";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
component: Checkbox,
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: "centered",
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
id: "checkbox",
|
|
12
|
+
label: "기본 체크박스",
|
|
13
|
+
},
|
|
14
|
+
} satisfies Meta<typeof Checkbox>;
|
|
15
|
+
|
|
16
|
+
export const Basic: StoryObj<typeof Checkbox> = {};
|
|
17
|
+
|
|
18
|
+
export const Tones: StoryObj<typeof Checkbox> = {
|
|
19
|
+
render: (args) => {
|
|
20
|
+
return (
|
|
21
|
+
<div className={vstack({ gap: "4" })}>
|
|
22
|
+
<Checkbox {...args} id="neutral" label="중립 색조" tone="neutral" />
|
|
23
|
+
<Checkbox {...args} id="accent" label="강조 색조" tone="accent" />
|
|
24
|
+
<Checkbox {...args} id="danger" label="위험 색조" tone="danger" />
|
|
25
|
+
<Checkbox {...args} id="warning" label="경고 색조" tone="warning" />
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
},
|
|
29
|
+
argTypes: {
|
|
30
|
+
label: {
|
|
31
|
+
control: false,
|
|
32
|
+
},
|
|
33
|
+
tone: {
|
|
34
|
+
control: false,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const States: StoryObj<typeof Checkbox> = {
|
|
40
|
+
render: (args) => {
|
|
41
|
+
return (
|
|
42
|
+
<div className={vstack({ gap: "4" })}>
|
|
43
|
+
<Checkbox {...args} id="checked" label="체크된 상태" checked={true} />
|
|
44
|
+
<Checkbox
|
|
45
|
+
{...args}
|
|
46
|
+
id="unchecked"
|
|
47
|
+
label="체크되지 않은 상태"
|
|
48
|
+
checked={false}
|
|
49
|
+
/>
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
},
|
|
53
|
+
argTypes: {
|
|
54
|
+
label: {
|
|
55
|
+
control: false,
|
|
56
|
+
},
|
|
57
|
+
checked: {
|
|
58
|
+
control: false,
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const Disabled: StoryObj<typeof Checkbox> = {
|
|
64
|
+
render: (args) => {
|
|
65
|
+
return (
|
|
66
|
+
<div className={vstack({ gap: "4" })}>
|
|
67
|
+
<Checkbox
|
|
68
|
+
{...args}
|
|
69
|
+
id="disabled-checked"
|
|
70
|
+
label="비활성화 & 체크된 상태"
|
|
71
|
+
disabled
|
|
72
|
+
checked
|
|
73
|
+
/>
|
|
74
|
+
<Checkbox
|
|
75
|
+
{...args}
|
|
76
|
+
id="disabled-unchecked"
|
|
77
|
+
label="비활성화 & 체크되지 않은 상태"
|
|
78
|
+
disabled
|
|
79
|
+
/>
|
|
80
|
+
<Checkbox {...args} id="enabled" label="활성화 상태" />
|
|
81
|
+
</div>
|
|
82
|
+
);
|
|
83
|
+
},
|
|
84
|
+
argTypes: {
|
|
85
|
+
label: {
|
|
86
|
+
control: false,
|
|
87
|
+
},
|
|
88
|
+
disabled: {
|
|
89
|
+
control: false,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const Required: StoryObj<typeof Checkbox> = {
|
|
95
|
+
render: (args) => {
|
|
96
|
+
return (
|
|
97
|
+
<div className={vstack({ gap: "4" })}>
|
|
98
|
+
<Checkbox {...args} id="required" label="필수 체크박스" required />
|
|
99
|
+
<Checkbox {...args} id="optional" label="선택 체크박스" />
|
|
100
|
+
</div>
|
|
101
|
+
);
|
|
102
|
+
},
|
|
103
|
+
argTypes: {
|
|
104
|
+
label: {
|
|
105
|
+
control: false,
|
|
106
|
+
},
|
|
107
|
+
required: {
|
|
108
|
+
control: false,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const WithValue: StoryObj<typeof Checkbox> = {
|
|
114
|
+
render: (args) => {
|
|
115
|
+
return (
|
|
116
|
+
<div className={vstack({ gap: "4" })}>
|
|
117
|
+
<Checkbox
|
|
118
|
+
{...args}
|
|
119
|
+
id="value-example"
|
|
120
|
+
label="값이 있는 체크박스"
|
|
121
|
+
value="checkbox-value"
|
|
122
|
+
onChange={(checked, value) =>
|
|
123
|
+
console.log(`체크박스 상태: ${checked}, 값: ${value}`)
|
|
124
|
+
}
|
|
125
|
+
/>
|
|
126
|
+
</div>
|
|
127
|
+
);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { composeStories } from "@storybook/react";
|
|
2
|
+
import { render, screen, fireEvent } from "@testing-library/react";
|
|
3
|
+
import { expect, test, vi } from "vitest";
|
|
4
|
+
import * as stories from "./Checkbox.stories";
|
|
5
|
+
import { Checkbox } from "./Checkbox";
|
|
6
|
+
|
|
7
|
+
const { Basic, Tones, States, Disabled, Required } = composeStories(stories);
|
|
8
|
+
|
|
9
|
+
test("renders the checkbox with the correct label", () => {
|
|
10
|
+
render(<Basic />);
|
|
11
|
+
expect(screen.getByText("기본 체크박스")).toBeInTheDocument();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test("applies the correct tone styles when checked", () => {
|
|
15
|
+
render(<Tones />);
|
|
16
|
+
|
|
17
|
+
const neutralCheckbox = screen.getByLabelText("중립 색조");
|
|
18
|
+
const accentCheckbox = screen.getByLabelText("강조 색조");
|
|
19
|
+
const dangerCheckbox = screen.getByLabelText("위험 색조");
|
|
20
|
+
const warningCheckbox = screen.getByLabelText("경고 색조");
|
|
21
|
+
|
|
22
|
+
// Simulate checking each checkbox
|
|
23
|
+
fireEvent.click(neutralCheckbox);
|
|
24
|
+
fireEvent.click(accentCheckbox);
|
|
25
|
+
fireEvent.click(dangerCheckbox);
|
|
26
|
+
fireEvent.click(warningCheckbox);
|
|
27
|
+
|
|
28
|
+
// Check for data-state attribute which indicates checked state
|
|
29
|
+
expect(neutralCheckbox).toHaveAttribute("data-state", "checked");
|
|
30
|
+
expect(accentCheckbox).toHaveAttribute("data-state", "checked");
|
|
31
|
+
expect(dangerCheckbox).toHaveAttribute("data-state", "checked");
|
|
32
|
+
expect(warningCheckbox).toHaveAttribute("data-state", "checked");
|
|
33
|
+
|
|
34
|
+
// Check for correct background colors based on tone
|
|
35
|
+
expect(neutralCheckbox).toHaveClass("[&[data-state='checked']]:bg-c_bg");
|
|
36
|
+
expect(accentCheckbox).toHaveClass(
|
|
37
|
+
"[&[data-state='checked']]:bg-c_bg.accent"
|
|
38
|
+
);
|
|
39
|
+
expect(dangerCheckbox).toHaveClass(
|
|
40
|
+
"[&[data-state='checked']]:bg-c_bg.danger"
|
|
41
|
+
);
|
|
42
|
+
expect(warningCheckbox).toHaveClass(
|
|
43
|
+
"[&[data-state='checked']]:bg-c_bg.warning"
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("renders checked and unchecked states correctly", () => {
|
|
48
|
+
render(<States />);
|
|
49
|
+
|
|
50
|
+
const checkedCheckbox = screen.getByLabelText("체크된 상태");
|
|
51
|
+
const uncheckedCheckbox = screen.getByLabelText("체크되지 않은 상태");
|
|
52
|
+
|
|
53
|
+
expect(checkedCheckbox).toHaveAttribute("data-state", "checked");
|
|
54
|
+
expect(uncheckedCheckbox).toHaveAttribute("data-state", "unchecked");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("applies the correct disabled styles", () => {
|
|
58
|
+
render(<Disabled />);
|
|
59
|
+
|
|
60
|
+
const disabledCheckedCheckbox =
|
|
61
|
+
screen.getByLabelText("비활성화 & 체크된 상태");
|
|
62
|
+
const disabledUncheckedCheckbox =
|
|
63
|
+
screen.getByLabelText("비활성화 & 체크되지 않은 상태");
|
|
64
|
+
const enabledCheckbox = screen.getByLabelText("활성화 상태");
|
|
65
|
+
|
|
66
|
+
expect(disabledCheckedCheckbox).toBeDisabled();
|
|
67
|
+
expect(disabledUncheckedCheckbox).toBeDisabled();
|
|
68
|
+
expect(enabledCheckbox).not.toBeDisabled();
|
|
69
|
+
|
|
70
|
+
// Check for opacity class that indicates disabled state
|
|
71
|
+
expect(disabledCheckedCheckbox).toHaveClass("[&:disabled]:op_0.5");
|
|
72
|
+
expect(disabledUncheckedCheckbox).toHaveClass("[&:disabled]:op_0.5");
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("displays required indicator correctly", () => {
|
|
76
|
+
render(<Required />);
|
|
77
|
+
|
|
78
|
+
const requiredLabel = screen.getByText("필수 체크박스").parentElement;
|
|
79
|
+
const optionalLabel = screen.getByText("선택 체크박스");
|
|
80
|
+
|
|
81
|
+
// Check for required indicator (asterisk)
|
|
82
|
+
expect(requiredLabel).toContainHTML("*");
|
|
83
|
+
expect(optionalLabel).not.toContainHTML("*");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("calls onChange handler when checkbox is clicked", () => {
|
|
87
|
+
const handleChange = vi.fn();
|
|
88
|
+
|
|
89
|
+
render(
|
|
90
|
+
<Checkbox
|
|
91
|
+
id="test-checkbox"
|
|
92
|
+
label="테스트 체크박스"
|
|
93
|
+
onChange={handleChange}
|
|
94
|
+
/>
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const checkbox = screen.getByLabelText("테스트 체크박스");
|
|
98
|
+
|
|
99
|
+
// Initially unchecked
|
|
100
|
+
expect(checkbox).toHaveAttribute("data-state", "unchecked");
|
|
101
|
+
|
|
102
|
+
// Click to check
|
|
103
|
+
fireEvent.click(checkbox);
|
|
104
|
+
expect(handleChange).toHaveBeenCalledTimes(1);
|
|
105
|
+
expect(handleChange).toHaveBeenCalledWith(true, undefined);
|
|
106
|
+
|
|
107
|
+
// Click again to uncheck
|
|
108
|
+
fireEvent.click(checkbox);
|
|
109
|
+
expect(handleChange).toHaveBeenCalledTimes(2);
|
|
110
|
+
expect(handleChange).toHaveBeenCalledWith(false, undefined);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("passes value to onChange handler when provided", () => {
|
|
114
|
+
const handleChange = vi.fn();
|
|
115
|
+
|
|
116
|
+
render(
|
|
117
|
+
<Checkbox
|
|
118
|
+
id="value-checkbox"
|
|
119
|
+
label="값이 있는 체크박스"
|
|
120
|
+
value="test-value"
|
|
121
|
+
onChange={handleChange}
|
|
122
|
+
/>
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
const checkbox = screen.getByLabelText("값이 있는 체크박스");
|
|
126
|
+
|
|
127
|
+
// Click to check
|
|
128
|
+
fireEvent.click(checkbox);
|
|
129
|
+
expect(handleChange).toHaveBeenCalledWith(true, "test-value");
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test("correctly handles required attribute", () => {
|
|
133
|
+
render(
|
|
134
|
+
<Checkbox id="required-checkbox" label="필수 체크박스" required={true} />
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// 정규 표현식을 사용하여 라벨 찾기 (별표가 있어도 일치)
|
|
138
|
+
const checkbox = screen.getByRole("checkbox", { name: /필수 체크박스/ });
|
|
139
|
+
|
|
140
|
+
// aria-required 속성 확인
|
|
141
|
+
expect(checkbox).toHaveAttribute("aria-required", "true");
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test("toggles checked state when clicked", () => {
|
|
145
|
+
render(<Basic />);
|
|
146
|
+
|
|
147
|
+
const checkbox = screen.getByLabelText("기본 체크박스");
|
|
148
|
+
|
|
149
|
+
// Initially unchecked
|
|
150
|
+
expect(checkbox).toHaveAttribute("data-state", "unchecked");
|
|
151
|
+
|
|
152
|
+
// Click to check
|
|
153
|
+
fireEvent.click(checkbox);
|
|
154
|
+
expect(checkbox).toHaveAttribute("data-state", "checked");
|
|
155
|
+
|
|
156
|
+
// Click again to uncheck
|
|
157
|
+
fireEvent.click(checkbox);
|
|
158
|
+
expect(checkbox).toHaveAttribute("data-state", "unchecked");
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("adds asterisk to label when required is true", () => {
|
|
162
|
+
render(
|
|
163
|
+
<Checkbox id="required-checkbox" label="필수 체크박스" required={true} />
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const requiredIndicator = screen.getByText("*");
|
|
167
|
+
expect(requiredIndicator).toBeInTheDocument();
|
|
168
|
+
expect(requiredIndicator).toHaveClass("c_text.danger");
|
|
169
|
+
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import React, { type ButtonHTMLAttributes } from "react";
|
|
2
|
+
import { css, cva } from "../../../styled-system/css";
|
|
3
|
+
import type { Tone } from "../../tokens/colors";
|
|
4
|
+
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
5
|
+
import { Check } from "lucide-react";
|
|
6
|
+
|
|
7
|
+
export interface CheckboxProps
|
|
8
|
+
extends Omit<
|
|
9
|
+
ButtonHTMLAttributes<HTMLButtonElement>,
|
|
10
|
+
"type" | "onChange" | "checked" | "value" | "required"
|
|
11
|
+
> {
|
|
12
|
+
/** 라벨 */
|
|
13
|
+
label: React.ReactNode;
|
|
14
|
+
/** 체크박스의 값 */
|
|
15
|
+
value?: string;
|
|
16
|
+
/** 색조 */
|
|
17
|
+
tone?: Tone;
|
|
18
|
+
/** 체크박스 비활성화 여부 */
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
/** 체크박스 선택 여부 */
|
|
21
|
+
checked?: boolean;
|
|
22
|
+
/** 필수 입력 여부 */
|
|
23
|
+
required?: boolean;
|
|
24
|
+
/** 변경 이벤트 핸들러 */
|
|
25
|
+
onChange?: (checked: boolean, value?: string) => void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* - `tone` 속성으로 체크박스의 색상 강조를 지정할 수 있습니다.
|
|
30
|
+
* - `disabled` 속성을 사용하여 체크박스를 비활성화할 수 있습니다.
|
|
31
|
+
* - `value` 속성을 통해 체크박스에 값을 지정할 수 있습니다.
|
|
32
|
+
* - `required` 속성을 사용하여 필수 입력 항목으로 지정할 수 있습니다.
|
|
33
|
+
*/
|
|
34
|
+
export const Checkbox = ({
|
|
35
|
+
label,
|
|
36
|
+
value,
|
|
37
|
+
tone = "neutral",
|
|
38
|
+
disabled,
|
|
39
|
+
checked,
|
|
40
|
+
required,
|
|
41
|
+
onChange,
|
|
42
|
+
...rest
|
|
43
|
+
}: CheckboxProps) => {
|
|
44
|
+
return (
|
|
45
|
+
<label
|
|
46
|
+
className={css({
|
|
47
|
+
display: "flex",
|
|
48
|
+
alignItems: "center",
|
|
49
|
+
gap: "0.5rem",
|
|
50
|
+
cursor: "pointer",
|
|
51
|
+
color: "text",
|
|
52
|
+
})}
|
|
53
|
+
>
|
|
54
|
+
<CheckboxPrimitive.Root
|
|
55
|
+
checked={checked}
|
|
56
|
+
required={required}
|
|
57
|
+
onCheckedChange={(checked) => {
|
|
58
|
+
onChange?.(checked === true, value);
|
|
59
|
+
}}
|
|
60
|
+
disabled={disabled}
|
|
61
|
+
className={styles({ tone })}
|
|
62
|
+
{...rest}
|
|
63
|
+
>
|
|
64
|
+
<CheckboxPrimitive.Indicator
|
|
65
|
+
className={css({
|
|
66
|
+
width: "100%",
|
|
67
|
+
height: "100%",
|
|
68
|
+
display: "flex",
|
|
69
|
+
alignItems: "center",
|
|
70
|
+
justifyContent: "center",
|
|
71
|
+
})}
|
|
72
|
+
>
|
|
73
|
+
<Check size={16} />
|
|
74
|
+
</CheckboxPrimitive.Indicator>
|
|
75
|
+
</CheckboxPrimitive.Root>
|
|
76
|
+
{label}
|
|
77
|
+
{required && <span className={css({ color: "text.danger" })}>*</span>}
|
|
78
|
+
</label>
|
|
79
|
+
);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const styles = cva({
|
|
83
|
+
base: {
|
|
84
|
+
appearance: "none",
|
|
85
|
+
margin: "0",
|
|
86
|
+
backgroundColor: "transparent",
|
|
87
|
+
border: "3px solid",
|
|
88
|
+
borderColor: "border",
|
|
89
|
+
borderRadius: "4px",
|
|
90
|
+
width: "1.5rem",
|
|
91
|
+
height: "1.5rem",
|
|
92
|
+
display: "flex",
|
|
93
|
+
alignItems: "center",
|
|
94
|
+
justifyContent: "center",
|
|
95
|
+
cursor: "pointer",
|
|
96
|
+
transition: "0.2s",
|
|
97
|
+
outline: "none",
|
|
98
|
+
"&:hover": {
|
|
99
|
+
backgroundColor: "bg.hover",
|
|
100
|
+
},
|
|
101
|
+
"&:focus": {
|
|
102
|
+
outline: "3px solid",
|
|
103
|
+
outlineOffset: "2px",
|
|
104
|
+
},
|
|
105
|
+
"&:disabled": {
|
|
106
|
+
opacity: 0.5,
|
|
107
|
+
cursor: "not-allowed",
|
|
108
|
+
"&:hover": {
|
|
109
|
+
backgroundColor: "transparent",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
variants: {
|
|
114
|
+
tone: {
|
|
115
|
+
neutral: {
|
|
116
|
+
"&[data-state='checked']": {
|
|
117
|
+
backgroundColor: "bg",
|
|
118
|
+
borderColor: "border",
|
|
119
|
+
color: "text",
|
|
120
|
+
},
|
|
121
|
+
"&:disabled[data-state='checked']": {
|
|
122
|
+
backgroundColor: "bg",
|
|
123
|
+
borderColor: "border",
|
|
124
|
+
},
|
|
125
|
+
"&:focus": {
|
|
126
|
+
outlineColor: "border",
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
accent: {
|
|
130
|
+
"&[data-state='checked']": {
|
|
131
|
+
backgroundColor: "bg.accent",
|
|
132
|
+
borderColor: "border.accent",
|
|
133
|
+
color: "text.accent",
|
|
134
|
+
},
|
|
135
|
+
"&:disabled[data-state='checked']": {
|
|
136
|
+
backgroundColor: "bg.accent",
|
|
137
|
+
borderColor: "border.accent",
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
danger: {
|
|
141
|
+
"&[data-state='checked']": {
|
|
142
|
+
backgroundColor: "bg.danger",
|
|
143
|
+
borderColor: "border.danger",
|
|
144
|
+
color: "text.danger",
|
|
145
|
+
},
|
|
146
|
+
"&:disabled[data-state='checked']": {
|
|
147
|
+
backgroundColor: "bg.danger",
|
|
148
|
+
borderColor: "border.danger",
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
warning: {
|
|
152
|
+
"&[data-state='checked']": {
|
|
153
|
+
backgroundColor: "bg.warning",
|
|
154
|
+
borderColor: "border.warning",
|
|
155
|
+
color: "text.warning",
|
|
156
|
+
},
|
|
157
|
+
"&:disabled[data-state='checked']": {
|
|
158
|
+
backgroundColor: "bg.warning",
|
|
159
|
+
borderColor: "border.warning",
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
compoundVariants: [
|
|
165
|
+
{
|
|
166
|
+
tone: "accent",
|
|
167
|
+
css: {
|
|
168
|
+
"&:focus": {
|
|
169
|
+
outlineColor: "border.accent",
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
tone: "danger",
|
|
175
|
+
css: {
|
|
176
|
+
"&:focus": {
|
|
177
|
+
outlineColor: "border.danger",
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
tone: "warning",
|
|
183
|
+
css: {
|
|
184
|
+
"&:focus": {
|
|
185
|
+
outlineColor: "border.warning",
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
});
|
package/bun.lockb
DELETED
|
Binary file
|