sellmate-design-system-react 0.1.0
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/README.md +65 -0
- package/dist/components/ActionModal/ActionModal.cjs +3085 -0
- package/dist/components/ActionModal/ActionModal.cjs.map +1 -0
- package/dist/components/ActionModal/ActionModal.d.ts +24 -0
- package/dist/components/ActionModal/ActionModal.js +3062 -0
- package/dist/components/ActionModal/ActionModal.js.map +1 -0
- package/dist/components/ActionModal/index.d.ts +1 -0
- package/dist/components/Badge/Badge.cjs +39 -0
- package/dist/components/Badge/Badge.cjs.map +1 -0
- package/dist/components/Badge/Badge.d.ts +12 -0
- package/dist/components/Badge/Badge.js +36 -0
- package/dist/components/Badge/Badge.js.map +1 -0
- package/dist/components/Badge/index.d.ts +1 -0
- package/dist/components/BarcodeInput/BarcodeInput.cjs +3183 -0
- package/dist/components/BarcodeInput/BarcodeInput.cjs.map +1 -0
- package/dist/components/BarcodeInput/BarcodeInput.d.ts +45 -0
- package/dist/components/BarcodeInput/BarcodeInput.js +3160 -0
- package/dist/components/BarcodeInput/BarcodeInput.js.map +1 -0
- package/dist/components/BarcodeInput/index.d.ts +1 -0
- package/dist/components/Button/Button.cjs +2796 -0
- package/dist/components/Button/Button.cjs.map +1 -0
- package/dist/components/Button/Button.d.ts +21 -0
- package/dist/components/Button/Button.js +2794 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Button/button.config.d.ts +33 -0
- package/dist/components/Button/index.d.ts +2 -0
- package/dist/components/Calendar/Calendar.cjs +3055 -0
- package/dist/components/Calendar/Calendar.cjs.map +1 -0
- package/dist/components/Calendar/Calendar.d.ts +27 -0
- package/dist/components/Calendar/Calendar.js +3033 -0
- package/dist/components/Calendar/Calendar.js.map +1 -0
- package/dist/components/Calendar/index.d.ts +1 -0
- package/dist/components/Callout/Callout.cjs +2701 -0
- package/dist/components/Callout/Callout.cjs.map +1 -0
- package/dist/components/Callout/Callout.d.ts +20 -0
- package/dist/components/Callout/Callout.js +2699 -0
- package/dist/components/Callout/Callout.js.map +1 -0
- package/dist/components/Callout/index.d.ts +1 -0
- package/dist/components/Card/Card.cjs +26 -0
- package/dist/components/Card/Card.cjs.map +1 -0
- package/dist/components/Card/Card.d.ts +7 -0
- package/dist/components/Card/Card.js +24 -0
- package/dist/components/Card/Card.js.map +1 -0
- package/dist/components/Card/index.d.ts +1 -0
- package/dist/components/Checkbox/Checkbox.cjs +2729 -0
- package/dist/components/Checkbox/Checkbox.cjs.map +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +23 -0
- package/dist/components/Checkbox/Checkbox.js +2707 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Checkbox/index.d.ts +1 -0
- package/dist/components/Chip/Chip.cjs +2958 -0
- package/dist/components/Chip/Chip.cjs.map +1 -0
- package/dist/components/Chip/Chip.d.ts +39 -0
- package/dist/components/Chip/Chip.js +2936 -0
- package/dist/components/Chip/Chip.js.map +1 -0
- package/dist/components/Chip/index.d.ts +1 -0
- package/dist/components/ChipInput/ChipInput.cjs +3558 -0
- package/dist/components/ChipInput/ChipInput.cjs.map +1 -0
- package/dist/components/ChipInput/ChipInput.d.ts +51 -0
- package/dist/components/ChipInput/ChipInput.js +3535 -0
- package/dist/components/ChipInput/ChipInput.js.map +1 -0
- package/dist/components/ChipInput/index.d.ts +1 -0
- package/dist/components/CircleProgress/CircleProgress.cjs +102 -0
- package/dist/components/CircleProgress/CircleProgress.cjs.map +1 -0
- package/dist/components/CircleProgress/CircleProgress.d.ts +16 -0
- package/dist/components/CircleProgress/CircleProgress.js +100 -0
- package/dist/components/CircleProgress/CircleProgress.js.map +1 -0
- package/dist/components/CircleProgress/index.d.ts +1 -0
- package/dist/components/ConfirmModal/ConfirmModal.cjs +3145 -0
- package/dist/components/ConfirmModal/ConfirmModal.cjs.map +1 -0
- package/dist/components/ConfirmModal/ConfirmModal.d.ts +41 -0
- package/dist/components/ConfirmModal/ConfirmModal.js +3122 -0
- package/dist/components/ConfirmModal/ConfirmModal.js.map +1 -0
- package/dist/components/ConfirmModal/index.d.ts +1 -0
- package/dist/components/DatePicker/DatePicker.cjs +3409 -0
- package/dist/components/DatePicker/DatePicker.cjs.map +1 -0
- package/dist/components/DatePicker/DatePicker.d.ts +40 -0
- package/dist/components/DatePicker/DatePicker.js +3386 -0
- package/dist/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/components/DatePicker/index.d.ts +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.cjs +3367 -0
- package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +41 -0
- package/dist/components/DateRangePicker/DateRangePicker.js +3344 -0
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -0
- package/dist/components/DateRangePicker/index.d.ts +1 -0
- package/dist/components/Divider/Divider.cjs +31 -0
- package/dist/components/Divider/Divider.cjs.map +1 -0
- package/dist/components/Divider/Divider.d.ts +7 -0
- package/dist/components/Divider/Divider.js +29 -0
- package/dist/components/Divider/Divider.js.map +1 -0
- package/dist/components/Divider/index.d.ts +1 -0
- package/dist/components/DropdownButton/DropdownButton.cjs +2884 -0
- package/dist/components/DropdownButton/DropdownButton.cjs.map +1 -0
- package/dist/components/DropdownButton/DropdownButton.d.ts +43 -0
- package/dist/components/DropdownButton/DropdownButton.js +2862 -0
- package/dist/components/DropdownButton/DropdownButton.js.map +1 -0
- package/dist/components/DropdownButton/index.d.ts +1 -0
- package/dist/components/Field/Field.cjs +2895 -0
- package/dist/components/Field/Field.cjs.map +1 -0
- package/dist/components/Field/Field.d.ts +64 -0
- package/dist/components/Field/Field.js +2872 -0
- package/dist/components/Field/Field.js.map +1 -0
- package/dist/components/Field/index.d.ts +1 -0
- package/dist/components/FilePicker/FilePicker.cjs +3385 -0
- package/dist/components/FilePicker/FilePicker.cjs.map +1 -0
- package/dist/components/FilePicker/FilePicker.d.ts +49 -0
- package/dist/components/FilePicker/FilePicker.js +3362 -0
- package/dist/components/FilePicker/FilePicker.js.map +1 -0
- package/dist/components/FilePicker/index.d.ts +1 -0
- package/dist/components/GhostButton/GhostButton.cjs +2804 -0
- package/dist/components/GhostButton/GhostButton.cjs.map +1 -0
- package/dist/components/GhostButton/GhostButton.d.ts +27 -0
- package/dist/components/GhostButton/GhostButton.js +2782 -0
- package/dist/components/GhostButton/GhostButton.js.map +1 -0
- package/dist/components/GhostButton/index.d.ts +1 -0
- package/dist/components/Guide/Guide.cjs +2884 -0
- package/dist/components/Guide/Guide.cjs.map +1 -0
- package/dist/components/Guide/Guide.d.ts +20 -0
- package/dist/components/Guide/Guide.js +2861 -0
- package/dist/components/Guide/Guide.js.map +1 -0
- package/dist/components/Guide/index.d.ts +1 -0
- package/dist/components/Icon/Icon.cjs +2638 -0
- package/dist/components/Icon/Icon.cjs.map +1 -0
- package/dist/components/Icon/Icon.d.ts +21 -0
- package/dist/components/Icon/Icon.js +2636 -0
- package/dist/components/Icon/Icon.js.map +1 -0
- package/dist/components/Icon/icons.gen.cjs +2615 -0
- package/dist/components/Icon/icons.gen.cjs.map +1 -0
- package/dist/components/Icon/icons.gen.d.ts +96 -0
- package/dist/components/Icon/icons.gen.js +2613 -0
- package/dist/components/Icon/icons.gen.js.map +1 -0
- package/dist/components/Icon/index.d.ts +2 -0
- package/dist/components/Input/Input.cjs +3044 -0
- package/dist/components/Input/Input.cjs.map +1 -0
- package/dist/components/Input/Input.d.ts +52 -0
- package/dist/components/Input/Input.js +3021 -0
- package/dist/components/Input/Input.js.map +1 -0
- package/dist/components/Input/index.d.ts +1 -0
- package/dist/components/KeyValueTable/KeyValueTable.cjs +5339 -0
- package/dist/components/KeyValueTable/KeyValueTable.cjs.map +1 -0
- package/dist/components/KeyValueTable/KeyValueTable.d.ts +40 -0
- package/dist/components/KeyValueTable/KeyValueTable.js +5314 -0
- package/dist/components/KeyValueTable/KeyValueTable.js.map +1 -0
- package/dist/components/KeyValueTable/index.d.ts +1 -0
- package/dist/components/LinearProgress/LinearProgress.cjs +70 -0
- package/dist/components/LinearProgress/LinearProgress.cjs.map +1 -0
- package/dist/components/LinearProgress/LinearProgress.d.ts +16 -0
- package/dist/components/LinearProgress/LinearProgress.js +68 -0
- package/dist/components/LinearProgress/LinearProgress.js.map +1 -0
- package/dist/components/LinearProgress/index.d.ts +1 -0
- package/dist/components/LoadingContainer/LoadingContainer.cjs +126 -0
- package/dist/components/LoadingContainer/LoadingContainer.cjs.map +1 -0
- package/dist/components/LoadingContainer/LoadingContainer.d.ts +16 -0
- package/dist/components/LoadingContainer/LoadingContainer.js +124 -0
- package/dist/components/LoadingContainer/LoadingContainer.js.map +1 -0
- package/dist/components/LoadingContainer/index.d.ts +2 -0
- package/dist/components/LoadingContainer/loading.cjs +164 -0
- package/dist/components/LoadingContainer/loading.cjs.map +1 -0
- package/dist/components/LoadingContainer/loading.d.ts +10 -0
- package/dist/components/LoadingContainer/loading.js +161 -0
- package/dist/components/LoadingContainer/loading.js.map +1 -0
- package/dist/components/LoadingModal/LoadingModal.cjs +3178 -0
- package/dist/components/LoadingModal/LoadingModal.cjs.map +1 -0
- package/dist/components/LoadingModal/LoadingModal.d.ts +23 -0
- package/dist/components/LoadingModal/LoadingModal.js +3155 -0
- package/dist/components/LoadingModal/LoadingModal.js.map +1 -0
- package/dist/components/LoadingModal/index.d.ts +1 -0
- package/dist/components/ModalContainer/ModalContainer.cjs +2875 -0
- package/dist/components/ModalContainer/ModalContainer.cjs.map +1 -0
- package/dist/components/ModalContainer/ModalContainer.d.ts +27 -0
- package/dist/components/ModalContainer/ModalContainer.js +2852 -0
- package/dist/components/ModalContainer/ModalContainer.js.map +1 -0
- package/dist/components/ModalContainer/index.d.ts +1 -0
- package/dist/components/NumberInput/NumberInput.cjs +3136 -0
- package/dist/components/NumberInput/NumberInput.cjs.map +1 -0
- package/dist/components/NumberInput/NumberInput.d.ts +63 -0
- package/dist/components/NumberInput/NumberInput.js +3113 -0
- package/dist/components/NumberInput/NumberInput.js.map +1 -0
- package/dist/components/NumberInput/index.d.ts +1 -0
- package/dist/components/Pagination/Pagination.cjs +2721 -0
- package/dist/components/Pagination/Pagination.cjs.map +1 -0
- package/dist/components/Pagination/Pagination.d.ts +15 -0
- package/dist/components/Pagination/Pagination.js +2719 -0
- package/dist/components/Pagination/Pagination.js.map +1 -0
- package/dist/components/Pagination/index.d.ts +1 -0
- package/dist/components/Popover/Popover.cjs +2973 -0
- package/dist/components/Popover/Popover.cjs.map +1 -0
- package/dist/components/Popover/Popover.d.ts +48 -0
- package/dist/components/Popover/Popover.js +2951 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Popover/index.d.ts +1 -0
- package/dist/components/Popup/Popup.cjs +2859 -0
- package/dist/components/Popup/Popup.cjs.map +1 -0
- package/dist/components/Popup/Popup.d.ts +31 -0
- package/dist/components/Popup/Popup.js +2857 -0
- package/dist/components/Popup/Popup.js.map +1 -0
- package/dist/components/Popup/index.d.ts +1 -0
- package/dist/components/Radio/Radio.cjs +104 -0
- package/dist/components/Radio/Radio.cjs.map +1 -0
- package/dist/components/Radio/Radio.d.ts +21 -0
- package/dist/components/Radio/Radio.js +102 -0
- package/dist/components/Radio/Radio.js.map +1 -0
- package/dist/components/Radio/RadioGroup.cjs +139 -0
- package/dist/components/Radio/RadioGroup.cjs.map +1 -0
- package/dist/components/Radio/RadioGroup.d.ts +26 -0
- package/dist/components/Radio/RadioGroup.js +137 -0
- package/dist/components/Radio/RadioGroup.js.map +1 -0
- package/dist/components/Radio/index.d.ts +2 -0
- package/dist/components/RadioButton/RadioButton.cjs +67 -0
- package/dist/components/RadioButton/RadioButton.cjs.map +1 -0
- package/dist/components/RadioButton/RadioButton.d.ts +28 -0
- package/dist/components/RadioButton/RadioButton.js +65 -0
- package/dist/components/RadioButton/RadioButton.js.map +1 -0
- package/dist/components/RadioButton/index.d.ts +1 -0
- package/dist/components/Select/Select.cjs +3274 -0
- package/dist/components/Select/Select.cjs.map +1 -0
- package/dist/components/Select/Select.d.ts +71 -0
- package/dist/components/Select/Select.js +3250 -0
- package/dist/components/Select/Select.js.map +1 -0
- package/dist/components/Select/index.d.ts +1 -0
- package/dist/components/Select/select.config.d.ts +24 -0
- package/dist/components/Switch/Switch.cjs +91 -0
- package/dist/components/Switch/Switch.cjs.map +1 -0
- package/dist/components/Switch/Switch.d.ts +15 -0
- package/dist/components/Switch/Switch.js +69 -0
- package/dist/components/Switch/Switch.js.map +1 -0
- package/dist/components/Switch/index.d.ts +1 -0
- package/dist/components/Table/Table.cjs +4021 -0
- package/dist/components/Table/Table.cjs.map +1 -0
- package/dist/components/Table/Table.d.ts +117 -0
- package/dist/components/Table/Table.js +3996 -0
- package/dist/components/Table/Table.js.map +1 -0
- package/dist/components/Table/index.d.ts +1 -0
- package/dist/components/Tabs/Tabs.cjs +2849 -0
- package/dist/components/Tabs/Tabs.cjs.map +1 -0
- package/dist/components/Tabs/Tabs.d.ts +24 -0
- package/dist/components/Tabs/Tabs.js +2847 -0
- package/dist/components/Tabs/Tabs.js.map +1 -0
- package/dist/components/Tabs/index.d.ts +2 -0
- package/dist/components/Tabs/tabs.config.d.ts +37 -0
- package/dist/components/Tag/Tag.cjs +2716 -0
- package/dist/components/Tag/Tag.cjs.map +1 -0
- package/dist/components/Tag/Tag.d.ts +23 -0
- package/dist/components/Tag/Tag.js +2714 -0
- package/dist/components/Tag/Tag.js.map +1 -0
- package/dist/components/Tag/index.d.ts +2 -0
- package/dist/components/Tag/tag.config.d.ts +17 -0
- package/dist/components/TextLink/TextLink.cjs +2717 -0
- package/dist/components/TextLink/TextLink.cjs.map +1 -0
- package/dist/components/TextLink/TextLink.d.ts +27 -0
- package/dist/components/TextLink/TextLink.js +2715 -0
- package/dist/components/TextLink/TextLink.js.map +1 -0
- package/dist/components/TextLink/index.d.ts +1 -0
- package/dist/components/Textarea/Textarea.cjs +2999 -0
- package/dist/components/Textarea/Textarea.cjs.map +1 -0
- package/dist/components/Textarea/Textarea.d.ts +49 -0
- package/dist/components/Textarea/Textarea.js +2976 -0
- package/dist/components/Textarea/Textarea.js.map +1 -0
- package/dist/components/Textarea/index.d.ts +1 -0
- package/dist/components/Toast/Toast.cjs +3050 -0
- package/dist/components/Toast/Toast.cjs.map +1 -0
- package/dist/components/Toast/Toast.d.ts +27 -0
- package/dist/components/Toast/Toast.js +3028 -0
- package/dist/components/Toast/Toast.js.map +1 -0
- package/dist/components/Toast/ToastContainer.cjs +3285 -0
- package/dist/components/Toast/ToastContainer.cjs.map +1 -0
- package/dist/components/Toast/ToastContainer.d.ts +28 -0
- package/dist/components/Toast/ToastContainer.js +3263 -0
- package/dist/components/Toast/ToastContainer.js.map +1 -0
- package/dist/components/Toast/index.d.ts +2 -0
- package/dist/components/Toggle/Toggle.cjs +45 -0
- package/dist/components/Toggle/Toggle.cjs.map +1 -0
- package/dist/components/Toggle/Toggle.d.ts +18 -0
- package/dist/components/Toggle/Toggle.js +43 -0
- package/dist/components/Toggle/Toggle.js.map +1 -0
- package/dist/components/Toggle/index.d.ts +1 -0
- package/dist/components/Tooltip/Tooltip.cjs +2753 -0
- package/dist/components/Tooltip/Tooltip.cjs.map +1 -0
- package/dist/components/Tooltip/Tooltip.d.ts +44 -0
- package/dist/components/Tooltip/Tooltip.js +2730 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/components/Tooltip/index.d.ts +1 -0
- package/dist/index.cjs +8101 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +8019 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.cjs +13 -0
- package/dist/lib/cn.cjs.map +1 -0
- package/dist/lib/cn.d.ts +6 -0
- package/dist/lib/cn.js +11 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/date.cjs +44 -0
- package/dist/lib/date.cjs.map +1 -0
- package/dist/lib/date.d.ts +15 -0
- package/dist/lib/date.js +38 -0
- package/dist/lib/date.js.map +1 -0
- package/dist/lib/form.cjs +15 -0
- package/dist/lib/form.cjs.map +1 -0
- package/dist/lib/form.d.ts +4 -0
- package/dist/lib/form.js +13 -0
- package/dist/lib/form.js.map +1 -0
- package/dist/lib/sanitize-inline-html.cjs +66 -0
- package/dist/lib/sanitize-inline-html.cjs.map +1 -0
- package/dist/lib/sanitize-inline-html.d.ts +1 -0
- package/dist/lib/sanitize-inline-html.js +64 -0
- package/dist/lib/sanitize-inline-html.js.map +1 -0
- package/dist/styles.css +3384 -0
- package/dist/theme.css +1483 -0
- package/package.json +78 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import 'react';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
function Radio({
|
|
11
|
+
val,
|
|
12
|
+
value,
|
|
13
|
+
label,
|
|
14
|
+
disabled = false,
|
|
15
|
+
name,
|
|
16
|
+
onValueChange,
|
|
17
|
+
className,
|
|
18
|
+
style
|
|
19
|
+
}) {
|
|
20
|
+
const valStr = String(val);
|
|
21
|
+
const checked = value === val;
|
|
22
|
+
const select = () => {
|
|
23
|
+
if (!disabled && !checked) onValueChange?.(val);
|
|
24
|
+
};
|
|
25
|
+
return /* @__PURE__ */ jsxs(
|
|
26
|
+
"label",
|
|
27
|
+
{
|
|
28
|
+
role: "radio",
|
|
29
|
+
"aria-checked": checked,
|
|
30
|
+
tabIndex: disabled ? -1 : 0,
|
|
31
|
+
onClick: select,
|
|
32
|
+
onKeyDown: (e) => {
|
|
33
|
+
if (e.key === " " || e.key === "Enter") {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
select();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
className: cn(
|
|
39
|
+
"inline-flex items-center gap-[8px]",
|
|
40
|
+
disabled ? "cursor-not-allowed" : "cursor-pointer",
|
|
41
|
+
className
|
|
42
|
+
),
|
|
43
|
+
style,
|
|
44
|
+
children: [
|
|
45
|
+
name && /* @__PURE__ */ jsx(
|
|
46
|
+
"input",
|
|
47
|
+
{
|
|
48
|
+
type: "radio",
|
|
49
|
+
name,
|
|
50
|
+
value: valStr,
|
|
51
|
+
checked,
|
|
52
|
+
disabled,
|
|
53
|
+
onChange: () => {
|
|
54
|
+
},
|
|
55
|
+
tabIndex: -1,
|
|
56
|
+
"aria-hidden": true,
|
|
57
|
+
className: "sr-only"
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"span",
|
|
62
|
+
{
|
|
63
|
+
className: cn(
|
|
64
|
+
"flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-full border border-solid border-[color:var(--rd-border)] bg-[var(--rd-bg)]",
|
|
65
|
+
!disabled && !checked && "hover:border-[color:var(--cmp-radio-border-hover)] hover:bg-[var(--cmp-radio-bg-hover)]"
|
|
66
|
+
),
|
|
67
|
+
style: {
|
|
68
|
+
"--rd-bg": disabled ? "var(--cmp-radio-bg-disabled)" : "var(--cmp-radio-bg-default)",
|
|
69
|
+
"--rd-border": disabled ? "var(--cmp-radio-border-disabled)" : checked ? "var(--cmp-radio-border-active)" : "var(--cmp-radio-border-default)"
|
|
70
|
+
},
|
|
71
|
+
children: checked && /* @__PURE__ */ jsx(
|
|
72
|
+
"span",
|
|
73
|
+
{
|
|
74
|
+
className: "h-[10px] w-[10px] rounded-full",
|
|
75
|
+
style: {
|
|
76
|
+
background: disabled ? "var(--cmp-radio-dot-disabled)" : "var(--cmp-radio-dot-default)"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
label && /* @__PURE__ */ jsxs(
|
|
83
|
+
"span",
|
|
84
|
+
{
|
|
85
|
+
className: "grid text-[12px] leading-[20px]",
|
|
86
|
+
style: {
|
|
87
|
+
color: disabled ? "var(--cmp-radio-label-disabled)" : "var(--cmp-radio-label-default)"
|
|
88
|
+
},
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "invisible font-medium", style: { gridArea: "1 / 1" }, children: label }),
|
|
91
|
+
/* @__PURE__ */ jsx("span", { style: { gridArea: "1 / 1", fontWeight: checked ? 500 : 400 }, children: label })
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { Radio };
|
|
101
|
+
//# sourceMappingURL=Radio.js.map
|
|
102
|
+
//# sourceMappingURL=Radio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/Radio/Radio.tsx"],"names":[],"mappings":"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","file":"Radio.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\n/** 라디오 값 타입 (sd-radio RadioValue) */\nexport type RadioValue = string | number | boolean;\n\nexport interface RadioProps {\n /** 이 라디오의 값 */\n val: RadioValue;\n /** 그룹의 현재 선택 값 */\n value?: RadioValue | null;\n /** 라벨 */\n label?: string;\n /** 비활성 */\n disabled?: boolean;\n /** native radio name (form-agnostic 그룹핑) */\n name?: string;\n /** 선택 변경 (sdUpdate) — 선택된 val 전달 */\n onValueChange?: (val: RadioValue) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Radio — sd-radio 포팅. value===val 이면 선택. 단독 또는 RadioGroup 안에서 사용. */\nexport function Radio({\n val,\n value,\n label,\n disabled = false,\n name,\n onValueChange,\n className,\n style,\n}: RadioProps) {\n // key/name 속성용 문자열 표현\n const valStr = String(val);\n const checked = value === val;\n const select = () => {\n if (!disabled && !checked) onValueChange?.(val);\n };\n\n return (\n <label\n role=\"radio\"\n aria-checked={checked}\n tabIndex={disabled ? -1 : 0}\n onClick={select}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n select();\n }\n }}\n className={cn(\n 'inline-flex items-center gap-[8px]',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n className,\n )}\n style={style}\n >\n {name && (\n <input\n type=\"radio\"\n name={name}\n value={valStr}\n checked={checked}\n disabled={disabled}\n onChange={() => {}}\n tabIndex={-1}\n aria-hidden\n className=\"sr-only\"\n />\n )}\n <span\n className={cn(\n 'flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-full border border-solid border-[color:var(--rd-border)] bg-[var(--rd-bg)]',\n !disabled &&\n !checked &&\n 'hover:border-[color:var(--cmp-radio-border-hover)] hover:bg-[var(--cmp-radio-bg-hover)]',\n )}\n style={\n {\n '--rd-bg': disabled ? 'var(--cmp-radio-bg-disabled)' : 'var(--cmp-radio-bg-default)',\n '--rd-border': disabled\n ? 'var(--cmp-radio-border-disabled)'\n : checked\n ? 'var(--cmp-radio-border-active)'\n : 'var(--cmp-radio-border-default)',\n } as CSSProperties\n }\n >\n {checked && (\n <span\n className=\"h-[10px] w-[10px] rounded-full\"\n style={{\n background: disabled\n ? 'var(--cmp-radio-dot-disabled)'\n : 'var(--cmp-radio-dot-default)',\n }}\n />\n )}\n </span>\n {label && (\n <span\n className=\"grid text-[12px] leading-[20px]\"\n style={{\n color: disabled ? 'var(--cmp-radio-label-disabled)' : 'var(--cmp-radio-label-default)',\n }}\n >\n <span aria-hidden className=\"invisible font-medium\" style={{ gridArea: '1 / 1' }}>\n {label}\n </span>\n <span style={{ gridArea: '1 / 1', fontWeight: checked ? 500 : 400 }}>{label}</span>\n </span>\n )}\n </label>\n );\n}\n"]}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
require('react');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
function Radio({
|
|
13
|
+
val,
|
|
14
|
+
value,
|
|
15
|
+
label,
|
|
16
|
+
disabled = false,
|
|
17
|
+
name,
|
|
18
|
+
onValueChange,
|
|
19
|
+
className,
|
|
20
|
+
style
|
|
21
|
+
}) {
|
|
22
|
+
const valStr = String(val);
|
|
23
|
+
const checked = value === val;
|
|
24
|
+
const select = () => {
|
|
25
|
+
if (!disabled && !checked) onValueChange?.(val);
|
|
26
|
+
};
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
28
|
+
"label",
|
|
29
|
+
{
|
|
30
|
+
role: "radio",
|
|
31
|
+
"aria-checked": checked,
|
|
32
|
+
tabIndex: disabled ? -1 : 0,
|
|
33
|
+
onClick: select,
|
|
34
|
+
onKeyDown: (e) => {
|
|
35
|
+
if (e.key === " " || e.key === "Enter") {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
select();
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
className: cn(
|
|
41
|
+
"inline-flex items-center gap-[8px]",
|
|
42
|
+
disabled ? "cursor-not-allowed" : "cursor-pointer",
|
|
43
|
+
className
|
|
44
|
+
),
|
|
45
|
+
style,
|
|
46
|
+
children: [
|
|
47
|
+
name && /* @__PURE__ */ jsxRuntime.jsx(
|
|
48
|
+
"input",
|
|
49
|
+
{
|
|
50
|
+
type: "radio",
|
|
51
|
+
name,
|
|
52
|
+
value: valStr,
|
|
53
|
+
checked,
|
|
54
|
+
disabled,
|
|
55
|
+
onChange: () => {
|
|
56
|
+
},
|
|
57
|
+
tabIndex: -1,
|
|
58
|
+
"aria-hidden": true,
|
|
59
|
+
className: "sr-only"
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
63
|
+
"span",
|
|
64
|
+
{
|
|
65
|
+
className: cn(
|
|
66
|
+
"flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-full border border-solid border-[color:var(--rd-border)] bg-[var(--rd-bg)]",
|
|
67
|
+
!disabled && !checked && "hover:border-[color:var(--cmp-radio-border-hover)] hover:bg-[var(--cmp-radio-bg-hover)]"
|
|
68
|
+
),
|
|
69
|
+
style: {
|
|
70
|
+
"--rd-bg": disabled ? "var(--cmp-radio-bg-disabled)" : "var(--cmp-radio-bg-default)",
|
|
71
|
+
"--rd-border": disabled ? "var(--cmp-radio-border-disabled)" : checked ? "var(--cmp-radio-border-active)" : "var(--cmp-radio-border-default)"
|
|
72
|
+
},
|
|
73
|
+
children: checked && /* @__PURE__ */ jsxRuntime.jsx(
|
|
74
|
+
"span",
|
|
75
|
+
{
|
|
76
|
+
className: "h-[10px] w-[10px] rounded-full",
|
|
77
|
+
style: {
|
|
78
|
+
background: disabled ? "var(--cmp-radio-dot-disabled)" : "var(--cmp-radio-dot-default)"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
label && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
85
|
+
"span",
|
|
86
|
+
{
|
|
87
|
+
className: "grid text-[12px] leading-[20px]",
|
|
88
|
+
style: {
|
|
89
|
+
color: disabled ? "var(--cmp-radio-label-disabled)" : "var(--cmp-radio-label-default)"
|
|
90
|
+
},
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "invisible font-medium", style: { gridArea: "1 / 1" }, children: label }),
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { gridArea: "1 / 1", fontWeight: checked ? 500 : 400 }, children: label })
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
function RadioGroup({
|
|
102
|
+
options = [],
|
|
103
|
+
value,
|
|
104
|
+
direction = "vertical",
|
|
105
|
+
disabled = false,
|
|
106
|
+
groupName,
|
|
107
|
+
onValueChange,
|
|
108
|
+
className,
|
|
109
|
+
style
|
|
110
|
+
}) {
|
|
111
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
112
|
+
"div",
|
|
113
|
+
{
|
|
114
|
+
role: "radiogroup",
|
|
115
|
+
className: cn(
|
|
116
|
+
"inline-flex",
|
|
117
|
+
direction === "vertical" ? "flex-col gap-[8px]" : "flex-row gap-[20px]",
|
|
118
|
+
className
|
|
119
|
+
),
|
|
120
|
+
style,
|
|
121
|
+
children: options.map((o) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
122
|
+
Radio,
|
|
123
|
+
{
|
|
124
|
+
val: o.value,
|
|
125
|
+
value,
|
|
126
|
+
label: o.label,
|
|
127
|
+
name: groupName,
|
|
128
|
+
disabled: disabled || o.disabled,
|
|
129
|
+
onValueChange
|
|
130
|
+
},
|
|
131
|
+
String(o.value)
|
|
132
|
+
))
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
exports.RadioGroup = RadioGroup;
|
|
138
|
+
//# sourceMappingURL=RadioGroup.cjs.map
|
|
139
|
+
//# sourceMappingURL=RadioGroup.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/Radio/Radio.tsx","../../../src/components/Radio/RadioGroup.tsx"],"names":["twMerge","clsx","jsxs","jsx"],"mappings":"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","file":"RadioGroup.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\n/** 라디오 값 타입 (sd-radio RadioValue) */\nexport type RadioValue = string | number | boolean;\n\nexport interface RadioProps {\n /** 이 라디오의 값 */\n val: RadioValue;\n /** 그룹의 현재 선택 값 */\n value?: RadioValue | null;\n /** 라벨 */\n label?: string;\n /** 비활성 */\n disabled?: boolean;\n /** native radio name (form-agnostic 그룹핑) */\n name?: string;\n /** 선택 변경 (sdUpdate) — 선택된 val 전달 */\n onValueChange?: (val: RadioValue) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Radio — sd-radio 포팅. value===val 이면 선택. 단독 또는 RadioGroup 안에서 사용. */\nexport function Radio({\n val,\n value,\n label,\n disabled = false,\n name,\n onValueChange,\n className,\n style,\n}: RadioProps) {\n // key/name 속성용 문자열 표현\n const valStr = String(val);\n const checked = value === val;\n const select = () => {\n if (!disabled && !checked) onValueChange?.(val);\n };\n\n return (\n <label\n role=\"radio\"\n aria-checked={checked}\n tabIndex={disabled ? -1 : 0}\n onClick={select}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n select();\n }\n }}\n className={cn(\n 'inline-flex items-center gap-[8px]',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n className,\n )}\n style={style}\n >\n {name && (\n <input\n type=\"radio\"\n name={name}\n value={valStr}\n checked={checked}\n disabled={disabled}\n onChange={() => {}}\n tabIndex={-1}\n aria-hidden\n className=\"sr-only\"\n />\n )}\n <span\n className={cn(\n 'flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-full border border-solid border-[color:var(--rd-border)] bg-[var(--rd-bg)]',\n !disabled &&\n !checked &&\n 'hover:border-[color:var(--cmp-radio-border-hover)] hover:bg-[var(--cmp-radio-bg-hover)]',\n )}\n style={\n {\n '--rd-bg': disabled ? 'var(--cmp-radio-bg-disabled)' : 'var(--cmp-radio-bg-default)',\n '--rd-border': disabled\n ? 'var(--cmp-radio-border-disabled)'\n : checked\n ? 'var(--cmp-radio-border-active)'\n : 'var(--cmp-radio-border-default)',\n } as CSSProperties\n }\n >\n {checked && (\n <span\n className=\"h-[10px] w-[10px] rounded-full\"\n style={{\n background: disabled\n ? 'var(--cmp-radio-dot-disabled)'\n : 'var(--cmp-radio-dot-default)',\n }}\n />\n )}\n </span>\n {label && (\n <span\n className=\"grid text-[12px] leading-[20px]\"\n style={{\n color: disabled ? 'var(--cmp-radio-label-disabled)' : 'var(--cmp-radio-label-default)',\n }}\n >\n <span aria-hidden className=\"invisible font-medium\" style={{ gridArea: '1 / 1' }}>\n {label}\n </span>\n <span style={{ gridArea: '1 / 1', fontWeight: checked ? 500 : 400 }}>{label}</span>\n </span>\n )}\n </label>\n );\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { Radio, type RadioValue } from './Radio';\n\nexport interface RadioOption {\n /** 옵션 값 (sd-radio-group RadioOption.value) */\n value: RadioValue;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n /** 옵션 목록 */\n options?: RadioOption[];\n /** 현재 선택 값 */\n value?: RadioValue | null;\n /** 배치 방향 */\n direction?: 'vertical' | 'horizontal';\n /** 전체 비활성 */\n disabled?: boolean;\n /** 라디오 name 속성 (form-agnostic 그룹핑) */\n groupName?: string;\n /** 선택 변경 (sdUpdate) */\n onValueChange?: (val: RadioValue) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/** RadioGroup — sd-radio-group 포팅. options를 Radio로 렌더. */\nexport function RadioGroup({\n options = [],\n value,\n direction = 'vertical',\n disabled = false,\n groupName,\n onValueChange,\n className,\n style,\n}: RadioGroupProps) {\n return (\n <div\n role=\"radiogroup\"\n className={cn(\n 'inline-flex',\n direction === 'vertical' ? 'flex-col gap-[8px]' : 'flex-row gap-[20px]',\n className,\n )}\n style={style}\n >\n {options.map(o => (\n <Radio\n key={String(o.value)}\n val={o.value}\n value={value}\n label={o.label}\n name={groupName}\n disabled={disabled || o.disabled}\n onValueChange={onValueChange}\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
import { type RadioValue } from './Radio';
|
|
3
|
+
export interface RadioOption {
|
|
4
|
+
/** 옵션 값 (sd-radio-group RadioOption.value) */
|
|
5
|
+
value: RadioValue;
|
|
6
|
+
label: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface RadioGroupProps {
|
|
10
|
+
/** 옵션 목록 */
|
|
11
|
+
options?: RadioOption[];
|
|
12
|
+
/** 현재 선택 값 */
|
|
13
|
+
value?: RadioValue | null;
|
|
14
|
+
/** 배치 방향 */
|
|
15
|
+
direction?: 'vertical' | 'horizontal';
|
|
16
|
+
/** 전체 비활성 */
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/** 라디오 name 속성 (form-agnostic 그룹핑) */
|
|
19
|
+
groupName?: string;
|
|
20
|
+
/** 선택 변경 (sdUpdate) */
|
|
21
|
+
onValueChange?: (val: RadioValue) => void;
|
|
22
|
+
className?: string;
|
|
23
|
+
style?: CSSProperties;
|
|
24
|
+
}
|
|
25
|
+
/** RadioGroup — sd-radio-group 포팅. options를 Radio로 렌더. */
|
|
26
|
+
export declare function RadioGroup({ options, value, direction, disabled, groupName, onValueChange, className, style, }: RadioGroupProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import 'react';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
function Radio({
|
|
11
|
+
val,
|
|
12
|
+
value,
|
|
13
|
+
label,
|
|
14
|
+
disabled = false,
|
|
15
|
+
name,
|
|
16
|
+
onValueChange,
|
|
17
|
+
className,
|
|
18
|
+
style
|
|
19
|
+
}) {
|
|
20
|
+
const valStr = String(val);
|
|
21
|
+
const checked = value === val;
|
|
22
|
+
const select = () => {
|
|
23
|
+
if (!disabled && !checked) onValueChange?.(val);
|
|
24
|
+
};
|
|
25
|
+
return /* @__PURE__ */ jsxs(
|
|
26
|
+
"label",
|
|
27
|
+
{
|
|
28
|
+
role: "radio",
|
|
29
|
+
"aria-checked": checked,
|
|
30
|
+
tabIndex: disabled ? -1 : 0,
|
|
31
|
+
onClick: select,
|
|
32
|
+
onKeyDown: (e) => {
|
|
33
|
+
if (e.key === " " || e.key === "Enter") {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
select();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
className: cn(
|
|
39
|
+
"inline-flex items-center gap-[8px]",
|
|
40
|
+
disabled ? "cursor-not-allowed" : "cursor-pointer",
|
|
41
|
+
className
|
|
42
|
+
),
|
|
43
|
+
style,
|
|
44
|
+
children: [
|
|
45
|
+
name && /* @__PURE__ */ jsx(
|
|
46
|
+
"input",
|
|
47
|
+
{
|
|
48
|
+
type: "radio",
|
|
49
|
+
name,
|
|
50
|
+
value: valStr,
|
|
51
|
+
checked,
|
|
52
|
+
disabled,
|
|
53
|
+
onChange: () => {
|
|
54
|
+
},
|
|
55
|
+
tabIndex: -1,
|
|
56
|
+
"aria-hidden": true,
|
|
57
|
+
className: "sr-only"
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"span",
|
|
62
|
+
{
|
|
63
|
+
className: cn(
|
|
64
|
+
"flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-full border border-solid border-[color:var(--rd-border)] bg-[var(--rd-bg)]",
|
|
65
|
+
!disabled && !checked && "hover:border-[color:var(--cmp-radio-border-hover)] hover:bg-[var(--cmp-radio-bg-hover)]"
|
|
66
|
+
),
|
|
67
|
+
style: {
|
|
68
|
+
"--rd-bg": disabled ? "var(--cmp-radio-bg-disabled)" : "var(--cmp-radio-bg-default)",
|
|
69
|
+
"--rd-border": disabled ? "var(--cmp-radio-border-disabled)" : checked ? "var(--cmp-radio-border-active)" : "var(--cmp-radio-border-default)"
|
|
70
|
+
},
|
|
71
|
+
children: checked && /* @__PURE__ */ jsx(
|
|
72
|
+
"span",
|
|
73
|
+
{
|
|
74
|
+
className: "h-[10px] w-[10px] rounded-full",
|
|
75
|
+
style: {
|
|
76
|
+
background: disabled ? "var(--cmp-radio-dot-disabled)" : "var(--cmp-radio-dot-default)"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
label && /* @__PURE__ */ jsxs(
|
|
83
|
+
"span",
|
|
84
|
+
{
|
|
85
|
+
className: "grid text-[12px] leading-[20px]",
|
|
86
|
+
style: {
|
|
87
|
+
color: disabled ? "var(--cmp-radio-label-disabled)" : "var(--cmp-radio-label-default)"
|
|
88
|
+
},
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "invisible font-medium", style: { gridArea: "1 / 1" }, children: label }),
|
|
91
|
+
/* @__PURE__ */ jsx("span", { style: { gridArea: "1 / 1", fontWeight: checked ? 500 : 400 }, children: label })
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
function RadioGroup({
|
|
100
|
+
options = [],
|
|
101
|
+
value,
|
|
102
|
+
direction = "vertical",
|
|
103
|
+
disabled = false,
|
|
104
|
+
groupName,
|
|
105
|
+
onValueChange,
|
|
106
|
+
className,
|
|
107
|
+
style
|
|
108
|
+
}) {
|
|
109
|
+
return /* @__PURE__ */ jsx(
|
|
110
|
+
"div",
|
|
111
|
+
{
|
|
112
|
+
role: "radiogroup",
|
|
113
|
+
className: cn(
|
|
114
|
+
"inline-flex",
|
|
115
|
+
direction === "vertical" ? "flex-col gap-[8px]" : "flex-row gap-[20px]",
|
|
116
|
+
className
|
|
117
|
+
),
|
|
118
|
+
style,
|
|
119
|
+
children: options.map((o) => /* @__PURE__ */ jsx(
|
|
120
|
+
Radio,
|
|
121
|
+
{
|
|
122
|
+
val: o.value,
|
|
123
|
+
value,
|
|
124
|
+
label: o.label,
|
|
125
|
+
name: groupName,
|
|
126
|
+
disabled: disabled || o.disabled,
|
|
127
|
+
onValueChange
|
|
128
|
+
},
|
|
129
|
+
String(o.value)
|
|
130
|
+
))
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { RadioGroup };
|
|
136
|
+
//# sourceMappingURL=RadioGroup.js.map
|
|
137
|
+
//# sourceMappingURL=RadioGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/Radio/Radio.tsx","../../../src/components/Radio/RadioGroup.tsx"],"names":["jsx"],"mappings":";;;;;AAOO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACiBO,SAAS,KAAA,CAAM;AAAA,EACpB,GAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAe;AAEb,EAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AACzB,EAAA,MAAM,UAAU,KAAA,KAAU,GAAA;AAC1B,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,kBAAyB,GAAG,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,OAAA;AAAA,MACd,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,MAC1B,OAAA,EAAS,MAAA;AAAA,MACT,WAAW,CAAA,CAAA,KAAK;AACd,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,OAAA,EAAS;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,oCAAA;AAAA,QACA,WAAW,oBAAA,GAAuB,gBAAA;AAAA,QAClC;AAAA,OACF;AAAA,MACA,KAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,oBACC,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,IAAA;AAAA,YACA,KAAA,EAAO,MAAA;AAAA,YACP,OAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAU,MAAM;AAAA,YAAC,CAAA;AAAA,YACjB,QAAA,EAAU,EAAA;AAAA,YACV,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAEF,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qJAAA;AAAA,cACA,CAAC,QAAA,IACC,CAAC,OAAA,IACD;AAAA,aACJ;AAAA,YACA,KAAA,EACE;AAAA,cACE,SAAA,EAAW,WAAW,8BAAA,GAAiC,6BAAA;AAAA,cACvD,aAAA,EAAe,QAAA,GACX,kCAAA,GACA,OAAA,GACE,gCAAA,GACA;AAAA,aACR;AAAA,YAGD,QAAA,EAAA,OAAA,oBACC,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,gCAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,UAAA,EAAY,WACR,+BAAA,GACA;AAAA;AACN;AAAA;AACF;AAAA,SAEJ;AAAA,QACC,KAAA,oBACC,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iCAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,WAAW,iCAAA,GAAoC;AAAA,aACxD;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,uBAAA,EAAwB,OAAO,EAAE,QAAA,EAAU,OAAA,EAAQ,EAC5E,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA,EAAS,UAAA,EAAY,OAAA,GAAU,GAAA,GAAM,GAAA,EAAI,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA;AAC9E;AAAA;AAAA,GAEJ;AAEJ;ACxFO,SAAS,UAAA,CAAW;AAAA,EACzB,UAAU,EAAC;AAAA,EACX,KAAA;AAAA,EACA,SAAA,GAAY,UAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,aAAA;AAAA,QACA,SAAA,KAAc,aAAa,oBAAA,GAAuB,qBAAA;AAAA,QAClD;AAAA,OACF;AAAA,MACA,KAAA;AAAA,MAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,qBACXA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,KAAK,CAAA,CAAE,KAAA;AAAA,UACP,KAAA;AAAA,UACA,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,IAAA,EAAM,SAAA;AAAA,UACN,QAAA,EAAU,YAAY,CAAA,CAAE,QAAA;AAAA,UACxB;AAAA,SAAA;AAAA,QANK,MAAA,CAAO,EAAE,KAAK;AAAA,OAQtB;AAAA;AAAA,GACH;AAEJ","file":"RadioGroup.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\n/** 라디오 값 타입 (sd-radio RadioValue) */\nexport type RadioValue = string | number | boolean;\n\nexport interface RadioProps {\n /** 이 라디오의 값 */\n val: RadioValue;\n /** 그룹의 현재 선택 값 */\n value?: RadioValue | null;\n /** 라벨 */\n label?: string;\n /** 비활성 */\n disabled?: boolean;\n /** native radio name (form-agnostic 그룹핑) */\n name?: string;\n /** 선택 변경 (sdUpdate) — 선택된 val 전달 */\n onValueChange?: (val: RadioValue) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Radio — sd-radio 포팅. value===val 이면 선택. 단독 또는 RadioGroup 안에서 사용. */\nexport function Radio({\n val,\n value,\n label,\n disabled = false,\n name,\n onValueChange,\n className,\n style,\n}: RadioProps) {\n // key/name 속성용 문자열 표현\n const valStr = String(val);\n const checked = value === val;\n const select = () => {\n if (!disabled && !checked) onValueChange?.(val);\n };\n\n return (\n <label\n role=\"radio\"\n aria-checked={checked}\n tabIndex={disabled ? -1 : 0}\n onClick={select}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n select();\n }\n }}\n className={cn(\n 'inline-flex items-center gap-[8px]',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n className,\n )}\n style={style}\n >\n {name && (\n <input\n type=\"radio\"\n name={name}\n value={valStr}\n checked={checked}\n disabled={disabled}\n onChange={() => {}}\n tabIndex={-1}\n aria-hidden\n className=\"sr-only\"\n />\n )}\n <span\n className={cn(\n 'flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-full border border-solid border-[color:var(--rd-border)] bg-[var(--rd-bg)]',\n !disabled &&\n !checked &&\n 'hover:border-[color:var(--cmp-radio-border-hover)] hover:bg-[var(--cmp-radio-bg-hover)]',\n )}\n style={\n {\n '--rd-bg': disabled ? 'var(--cmp-radio-bg-disabled)' : 'var(--cmp-radio-bg-default)',\n '--rd-border': disabled\n ? 'var(--cmp-radio-border-disabled)'\n : checked\n ? 'var(--cmp-radio-border-active)'\n : 'var(--cmp-radio-border-default)',\n } as CSSProperties\n }\n >\n {checked && (\n <span\n className=\"h-[10px] w-[10px] rounded-full\"\n style={{\n background: disabled\n ? 'var(--cmp-radio-dot-disabled)'\n : 'var(--cmp-radio-dot-default)',\n }}\n />\n )}\n </span>\n {label && (\n <span\n className=\"grid text-[12px] leading-[20px]\"\n style={{\n color: disabled ? 'var(--cmp-radio-label-disabled)' : 'var(--cmp-radio-label-default)',\n }}\n >\n <span aria-hidden className=\"invisible font-medium\" style={{ gridArea: '1 / 1' }}>\n {label}\n </span>\n <span style={{ gridArea: '1 / 1', fontWeight: checked ? 500 : 400 }}>{label}</span>\n </span>\n )}\n </label>\n );\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { Radio, type RadioValue } from './Radio';\n\nexport interface RadioOption {\n /** 옵션 값 (sd-radio-group RadioOption.value) */\n value: RadioValue;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n /** 옵션 목록 */\n options?: RadioOption[];\n /** 현재 선택 값 */\n value?: RadioValue | null;\n /** 배치 방향 */\n direction?: 'vertical' | 'horizontal';\n /** 전체 비활성 */\n disabled?: boolean;\n /** 라디오 name 속성 (form-agnostic 그룹핑) */\n groupName?: string;\n /** 선택 변경 (sdUpdate) */\n onValueChange?: (val: RadioValue) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/** RadioGroup — sd-radio-group 포팅. options를 Radio로 렌더. */\nexport function RadioGroup({\n options = [],\n value,\n direction = 'vertical',\n disabled = false,\n groupName,\n onValueChange,\n className,\n style,\n}: RadioGroupProps) {\n return (\n <div\n role=\"radiogroup\"\n className={cn(\n 'inline-flex',\n direction === 'vertical' ? 'flex-col gap-[8px]' : 'flex-row gap-[20px]',\n className,\n )}\n style={style}\n >\n {options.map(o => (\n <Radio\n key={String(o.value)}\n val={o.value}\n value={value}\n label={o.label}\n name={groupName}\n disabled={disabled || o.disabled}\n onValueChange={onValueChange}\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
require('react');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
function RadioButton({
|
|
13
|
+
options = [],
|
|
14
|
+
value,
|
|
15
|
+
size = "sm",
|
|
16
|
+
disabled = false,
|
|
17
|
+
name,
|
|
18
|
+
onValueChange,
|
|
19
|
+
className,
|
|
20
|
+
style
|
|
21
|
+
}) {
|
|
22
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
role: "radiogroup",
|
|
26
|
+
"aria-disabled": disabled,
|
|
27
|
+
className: cn("inline-flex", className),
|
|
28
|
+
style,
|
|
29
|
+
children: options.map((o, i) => {
|
|
30
|
+
const selected = o.value === value;
|
|
31
|
+
const od = disabled || o.disabled;
|
|
32
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
"button",
|
|
34
|
+
{
|
|
35
|
+
type: "button",
|
|
36
|
+
role: "radio",
|
|
37
|
+
name,
|
|
38
|
+
"aria-checked": selected,
|
|
39
|
+
disabled: od,
|
|
40
|
+
onClick: () => !od && !selected && onValueChange?.(o.value),
|
|
41
|
+
className: cn(
|
|
42
|
+
"relative box-border inline-flex items-center justify-center whitespace-nowrap border border-solid text-[12px] font-medium leading-[20px] transition-colors",
|
|
43
|
+
i === 0 ? "rounded-l-[var(--cmp-radioButton-radius)]" : "-ml-px",
|
|
44
|
+
i === options.length - 1 ? "rounded-r-[var(--cmp-radioButton-radius)]" : "",
|
|
45
|
+
selected ? "z-10" : "",
|
|
46
|
+
!od && !selected && "hover:!bg-[var(--cmp-radioButton-bg-hover)] hover:!text-[color:var(--cmp-radioButton-content-hover)] hover:!border-[color:var(--cmp-radioButton-bg-hover)] hover:z-10",
|
|
47
|
+
od ? "cursor-not-allowed" : "cursor-pointer"
|
|
48
|
+
),
|
|
49
|
+
style: {
|
|
50
|
+
height: `var(--cmp-radioButton-${size}-height)`,
|
|
51
|
+
padding: `0 var(--cmp-radioButton-${size}-paddingX)`,
|
|
52
|
+
background: od ? "var(--cmp-radioButton-bg-disabled)" : "var(--cmp-radioButton-bg-default)",
|
|
53
|
+
borderColor: od ? "var(--cmp-radioButton-border-disabled)" : selected ? "var(--cmp-radioButton-border-select)" : "var(--cmp-radioButton-border-default)",
|
|
54
|
+
color: od ? "var(--cmp-radioButton-content-disabled)" : selected ? "var(--cmp-radioButton-content-select)" : "var(--cmp-radioButton-content-default)"
|
|
55
|
+
},
|
|
56
|
+
children: o.label
|
|
57
|
+
},
|
|
58
|
+
o.value
|
|
59
|
+
);
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
exports.RadioButton = RadioButton;
|
|
66
|
+
//# sourceMappingURL=RadioButton.cjs.map
|
|
67
|
+
//# sourceMappingURL=RadioButton.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/RadioButton/RadioButton.tsx"],"names":["twMerge","clsx","jsx"],"mappings":";;;;;;;AAOO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACyBO,SAAS,WAAA,CAAY;AAAA,EAC1B,UAAU,EAAC;AAAA,EACX,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,MACtC,KAAA;AAAA,MAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,QAAA,MAAM,QAAA,GAAW,EAAE,KAAA,KAAU,KAAA;AAC7B,QAAA,MAAM,EAAA,GAAK,YAAY,CAAA,CAAE,QAAA;AACzB,QAAA,uBACEA,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,OAAA;AAAA,YACL,IAAA;AAAA,YACA,cAAA,EAAc,QAAA;AAAA,YACd,QAAA,EAAU,EAAA;AAAA,YACV,OAAA,EAAS,MAAM,CAAC,EAAA,IAAM,CAAC,QAAA,IAAY,aAAA,GAAgB,EAAE,KAAK,CAAA;AAAA,YAC1D,SAAA,EAAW,EAAA;AAAA,cACT,4JAAA;AAAA,cACA,CAAA,KAAM,IAAI,2CAAA,GAA8C,QAAA;AAAA,cACxD,CAAA,KAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,2CAAA,GAA8C,EAAA;AAAA,cACzE,WAAW,MAAA,GAAS,EAAA;AAAA,cACpB,CAAC,EAAA,IACC,CAAC,QAAA,IACD,uKAAA;AAAA,cACF,KAAK,oBAAA,GAAuB;AAAA,aAC9B;AAAA,YACA,KAAA,EAAO;AAAA,cACL,MAAA,EAAQ,yBAAyB,IAAI,CAAA,QAAA,CAAA;AAAA,cACrC,OAAA,EAAS,2BAA2B,IAAI,CAAA,UAAA,CAAA;AAAA,cACxC,UAAA,EAAY,KACR,oCAAA,GACA,mCAAA;AAAA,cACJ,WAAA,EAAa,EAAA,GACT,wCAAA,GACA,QAAA,GACE,sCAAA,GACA,uCAAA;AAAA,cACN,KAAA,EAAO,EAAA,GACH,yCAAA,GACA,QAAA,GACE,uCAAA,GACA;AAAA,aACR;AAAA,YAEC,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UAnCE,CAAA,CAAE;AAAA,SAoCT;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","file":"RadioButton.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type RadioButtonSize = 'xs' | 'sm';\n\nexport interface RadioButtonOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioButtonProps {\n /** 옵션 목록 */\n options?: RadioButtonOption[];\n /** 현재 선택 값 */\n value?: string | number | null;\n /** 크기 */\n size?: RadioButtonSize;\n /** 전체 비활성 */\n disabled?: boolean;\n /** input name 속성 */\n name?: string;\n /** 변경 (sdUpdate) */\n onValueChange?: (value: string | number) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * RadioButton — sd-radio-button 포팅. 세그먼트형 라디오(버튼 그룹).\n * default(흰 배경/회색, hover 파란 채움) · select(흰 배경/파란 테두리·글자) · disabled.\n */\nexport function RadioButton({\n options = [],\n value,\n size = 'sm',\n disabled = false,\n name,\n onValueChange,\n className,\n style,\n}: RadioButtonProps) {\n return (\n <div\n role=\"radiogroup\"\n aria-disabled={disabled}\n className={cn('inline-flex', className)}\n style={style}\n >\n {options.map((o, i) => {\n const selected = o.value === value;\n const od = disabled || o.disabled;\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"radio\"\n name={name}\n aria-checked={selected}\n disabled={od}\n onClick={() => !od && !selected && onValueChange?.(o.value)}\n className={cn(\n 'relative box-border inline-flex items-center justify-center whitespace-nowrap border border-solid text-[12px] font-medium leading-[20px] transition-colors',\n i === 0 ? 'rounded-l-[var(--cmp-radioButton-radius)]' : '-ml-px',\n i === options.length - 1 ? 'rounded-r-[var(--cmp-radioButton-radius)]' : '',\n selected ? 'z-10' : '',\n !od &&\n !selected &&\n 'hover:!bg-[var(--cmp-radioButton-bg-hover)] hover:!text-[color:var(--cmp-radioButton-content-hover)] hover:!border-[color:var(--cmp-radioButton-bg-hover)] hover:z-10',\n od ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n height: `var(--cmp-radioButton-${size}-height)`,\n padding: `0 var(--cmp-radioButton-${size}-paddingX)`,\n background: od\n ? 'var(--cmp-radioButton-bg-disabled)'\n : 'var(--cmp-radioButton-bg-default)',\n borderColor: od\n ? 'var(--cmp-radioButton-border-disabled)'\n : selected\n ? 'var(--cmp-radioButton-border-select)'\n : 'var(--cmp-radioButton-border-default)',\n color: od\n ? 'var(--cmp-radioButton-content-disabled)'\n : selected\n ? 'var(--cmp-radioButton-content-select)'\n : 'var(--cmp-radioButton-content-default)',\n }}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
export type RadioButtonSize = 'xs' | 'sm';
|
|
3
|
+
export interface RadioButtonOption {
|
|
4
|
+
value: string | number;
|
|
5
|
+
label: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface RadioButtonProps {
|
|
9
|
+
/** 옵션 목록 */
|
|
10
|
+
options?: RadioButtonOption[];
|
|
11
|
+
/** 현재 선택 값 */
|
|
12
|
+
value?: string | number | null;
|
|
13
|
+
/** 크기 */
|
|
14
|
+
size?: RadioButtonSize;
|
|
15
|
+
/** 전체 비활성 */
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/** input name 속성 */
|
|
18
|
+
name?: string;
|
|
19
|
+
/** 변경 (sdUpdate) */
|
|
20
|
+
onValueChange?: (value: string | number) => void;
|
|
21
|
+
className?: string;
|
|
22
|
+
style?: CSSProperties;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* RadioButton — sd-radio-button 포팅. 세그먼트형 라디오(버튼 그룹).
|
|
26
|
+
* default(흰 배경/회색, hover 파란 채움) · select(흰 배경/파란 테두리·글자) · disabled.
|
|
27
|
+
*/
|
|
28
|
+
export declare function RadioButton({ options, value, size, disabled, name, onValueChange, className, style, }: RadioButtonProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import 'react';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
function RadioButton({
|
|
11
|
+
options = [],
|
|
12
|
+
value,
|
|
13
|
+
size = "sm",
|
|
14
|
+
disabled = false,
|
|
15
|
+
name,
|
|
16
|
+
onValueChange,
|
|
17
|
+
className,
|
|
18
|
+
style
|
|
19
|
+
}) {
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
role: "radiogroup",
|
|
24
|
+
"aria-disabled": disabled,
|
|
25
|
+
className: cn("inline-flex", className),
|
|
26
|
+
style,
|
|
27
|
+
children: options.map((o, i) => {
|
|
28
|
+
const selected = o.value === value;
|
|
29
|
+
const od = disabled || o.disabled;
|
|
30
|
+
return /* @__PURE__ */ jsx(
|
|
31
|
+
"button",
|
|
32
|
+
{
|
|
33
|
+
type: "button",
|
|
34
|
+
role: "radio",
|
|
35
|
+
name,
|
|
36
|
+
"aria-checked": selected,
|
|
37
|
+
disabled: od,
|
|
38
|
+
onClick: () => !od && !selected && onValueChange?.(o.value),
|
|
39
|
+
className: cn(
|
|
40
|
+
"relative box-border inline-flex items-center justify-center whitespace-nowrap border border-solid text-[12px] font-medium leading-[20px] transition-colors",
|
|
41
|
+
i === 0 ? "rounded-l-[var(--cmp-radioButton-radius)]" : "-ml-px",
|
|
42
|
+
i === options.length - 1 ? "rounded-r-[var(--cmp-radioButton-radius)]" : "",
|
|
43
|
+
selected ? "z-10" : "",
|
|
44
|
+
!od && !selected && "hover:!bg-[var(--cmp-radioButton-bg-hover)] hover:!text-[color:var(--cmp-radioButton-content-hover)] hover:!border-[color:var(--cmp-radioButton-bg-hover)] hover:z-10",
|
|
45
|
+
od ? "cursor-not-allowed" : "cursor-pointer"
|
|
46
|
+
),
|
|
47
|
+
style: {
|
|
48
|
+
height: `var(--cmp-radioButton-${size}-height)`,
|
|
49
|
+
padding: `0 var(--cmp-radioButton-${size}-paddingX)`,
|
|
50
|
+
background: od ? "var(--cmp-radioButton-bg-disabled)" : "var(--cmp-radioButton-bg-default)",
|
|
51
|
+
borderColor: od ? "var(--cmp-radioButton-border-disabled)" : selected ? "var(--cmp-radioButton-border-select)" : "var(--cmp-radioButton-border-default)",
|
|
52
|
+
color: od ? "var(--cmp-radioButton-content-disabled)" : selected ? "var(--cmp-radioButton-content-select)" : "var(--cmp-radioButton-content-default)"
|
|
53
|
+
},
|
|
54
|
+
children: o.label
|
|
55
|
+
},
|
|
56
|
+
o.value
|
|
57
|
+
);
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { RadioButton };
|
|
64
|
+
//# sourceMappingURL=RadioButton.js.map
|
|
65
|
+
//# sourceMappingURL=RadioButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/RadioButton/RadioButton.tsx"],"names":[],"mappings":";;;;;AAOO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACyBO,SAAS,WAAA,CAAY;AAAA,EAC1B,UAAU,EAAC;AAAA,EACX,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,MACtC,KAAA;AAAA,MAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,QAAA,MAAM,QAAA,GAAW,EAAE,KAAA,KAAU,KAAA;AAC7B,QAAA,MAAM,EAAA,GAAK,YAAY,CAAA,CAAE,QAAA;AACzB,QAAA,uBACE,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,OAAA;AAAA,YACL,IAAA;AAAA,YACA,cAAA,EAAc,QAAA;AAAA,YACd,QAAA,EAAU,EAAA;AAAA,YACV,OAAA,EAAS,MAAM,CAAC,EAAA,IAAM,CAAC,QAAA,IAAY,aAAA,GAAgB,EAAE,KAAK,CAAA;AAAA,YAC1D,SAAA,EAAW,EAAA;AAAA,cACT,4JAAA;AAAA,cACA,CAAA,KAAM,IAAI,2CAAA,GAA8C,QAAA;AAAA,cACxD,CAAA,KAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,2CAAA,GAA8C,EAAA;AAAA,cACzE,WAAW,MAAA,GAAS,EAAA;AAAA,cACpB,CAAC,EAAA,IACC,CAAC,QAAA,IACD,uKAAA;AAAA,cACF,KAAK,oBAAA,GAAuB;AAAA,aAC9B;AAAA,YACA,KAAA,EAAO;AAAA,cACL,MAAA,EAAQ,yBAAyB,IAAI,CAAA,QAAA,CAAA;AAAA,cACrC,OAAA,EAAS,2BAA2B,IAAI,CAAA,UAAA,CAAA;AAAA,cACxC,UAAA,EAAY,KACR,oCAAA,GACA,mCAAA;AAAA,cACJ,WAAA,EAAa,EAAA,GACT,wCAAA,GACA,QAAA,GACE,sCAAA,GACA,uCAAA;AAAA,cACN,KAAA,EAAO,EAAA,GACH,yCAAA,GACA,QAAA,GACE,uCAAA,GACA;AAAA,aACR;AAAA,YAEC,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UAnCE,CAAA,CAAE;AAAA,SAoCT;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","file":"RadioButton.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type RadioButtonSize = 'xs' | 'sm';\n\nexport interface RadioButtonOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioButtonProps {\n /** 옵션 목록 */\n options?: RadioButtonOption[];\n /** 현재 선택 값 */\n value?: string | number | null;\n /** 크기 */\n size?: RadioButtonSize;\n /** 전체 비활성 */\n disabled?: boolean;\n /** input name 속성 */\n name?: string;\n /** 변경 (sdUpdate) */\n onValueChange?: (value: string | number) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * RadioButton — sd-radio-button 포팅. 세그먼트형 라디오(버튼 그룹).\n * default(흰 배경/회색, hover 파란 채움) · select(흰 배경/파란 테두리·글자) · disabled.\n */\nexport function RadioButton({\n options = [],\n value,\n size = 'sm',\n disabled = false,\n name,\n onValueChange,\n className,\n style,\n}: RadioButtonProps) {\n return (\n <div\n role=\"radiogroup\"\n aria-disabled={disabled}\n className={cn('inline-flex', className)}\n style={style}\n >\n {options.map((o, i) => {\n const selected = o.value === value;\n const od = disabled || o.disabled;\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"radio\"\n name={name}\n aria-checked={selected}\n disabled={od}\n onClick={() => !od && !selected && onValueChange?.(o.value)}\n className={cn(\n 'relative box-border inline-flex items-center justify-center whitespace-nowrap border border-solid text-[12px] font-medium leading-[20px] transition-colors',\n i === 0 ? 'rounded-l-[var(--cmp-radioButton-radius)]' : '-ml-px',\n i === options.length - 1 ? 'rounded-r-[var(--cmp-radioButton-radius)]' : '',\n selected ? 'z-10' : '',\n !od &&\n !selected &&\n 'hover:!bg-[var(--cmp-radioButton-bg-hover)] hover:!text-[color:var(--cmp-radioButton-content-hover)] hover:!border-[color:var(--cmp-radioButton-bg-hover)] hover:z-10',\n od ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n height: `var(--cmp-radioButton-${size}-height)`,\n padding: `0 var(--cmp-radioButton-${size}-paddingX)`,\n background: od\n ? 'var(--cmp-radioButton-bg-disabled)'\n : 'var(--cmp-radioButton-bg-default)',\n borderColor: od\n ? 'var(--cmp-radioButton-border-disabled)'\n : selected\n ? 'var(--cmp-radioButton-border-select)'\n : 'var(--cmp-radioButton-border-default)',\n color: od\n ? 'var(--cmp-radioButton-content-disabled)'\n : selected\n ? 'var(--cmp-radioButton-content-select)'\n : 'var(--cmp-radioButton-content-default)',\n }}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RadioButton, type RadioButtonProps, type RadioButtonOption, type RadioButtonSize, } from './RadioButton';
|