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.
Files changed (311) hide show
  1. package/README.md +65 -0
  2. package/dist/components/ActionModal/ActionModal.cjs +3085 -0
  3. package/dist/components/ActionModal/ActionModal.cjs.map +1 -0
  4. package/dist/components/ActionModal/ActionModal.d.ts +24 -0
  5. package/dist/components/ActionModal/ActionModal.js +3062 -0
  6. package/dist/components/ActionModal/ActionModal.js.map +1 -0
  7. package/dist/components/ActionModal/index.d.ts +1 -0
  8. package/dist/components/Badge/Badge.cjs +39 -0
  9. package/dist/components/Badge/Badge.cjs.map +1 -0
  10. package/dist/components/Badge/Badge.d.ts +12 -0
  11. package/dist/components/Badge/Badge.js +36 -0
  12. package/dist/components/Badge/Badge.js.map +1 -0
  13. package/dist/components/Badge/index.d.ts +1 -0
  14. package/dist/components/BarcodeInput/BarcodeInput.cjs +3183 -0
  15. package/dist/components/BarcodeInput/BarcodeInput.cjs.map +1 -0
  16. package/dist/components/BarcodeInput/BarcodeInput.d.ts +45 -0
  17. package/dist/components/BarcodeInput/BarcodeInput.js +3160 -0
  18. package/dist/components/BarcodeInput/BarcodeInput.js.map +1 -0
  19. package/dist/components/BarcodeInput/index.d.ts +1 -0
  20. package/dist/components/Button/Button.cjs +2796 -0
  21. package/dist/components/Button/Button.cjs.map +1 -0
  22. package/dist/components/Button/Button.d.ts +21 -0
  23. package/dist/components/Button/Button.js +2794 -0
  24. package/dist/components/Button/Button.js.map +1 -0
  25. package/dist/components/Button/button.config.d.ts +33 -0
  26. package/dist/components/Button/index.d.ts +2 -0
  27. package/dist/components/Calendar/Calendar.cjs +3055 -0
  28. package/dist/components/Calendar/Calendar.cjs.map +1 -0
  29. package/dist/components/Calendar/Calendar.d.ts +27 -0
  30. package/dist/components/Calendar/Calendar.js +3033 -0
  31. package/dist/components/Calendar/Calendar.js.map +1 -0
  32. package/dist/components/Calendar/index.d.ts +1 -0
  33. package/dist/components/Callout/Callout.cjs +2701 -0
  34. package/dist/components/Callout/Callout.cjs.map +1 -0
  35. package/dist/components/Callout/Callout.d.ts +20 -0
  36. package/dist/components/Callout/Callout.js +2699 -0
  37. package/dist/components/Callout/Callout.js.map +1 -0
  38. package/dist/components/Callout/index.d.ts +1 -0
  39. package/dist/components/Card/Card.cjs +26 -0
  40. package/dist/components/Card/Card.cjs.map +1 -0
  41. package/dist/components/Card/Card.d.ts +7 -0
  42. package/dist/components/Card/Card.js +24 -0
  43. package/dist/components/Card/Card.js.map +1 -0
  44. package/dist/components/Card/index.d.ts +1 -0
  45. package/dist/components/Checkbox/Checkbox.cjs +2729 -0
  46. package/dist/components/Checkbox/Checkbox.cjs.map +1 -0
  47. package/dist/components/Checkbox/Checkbox.d.ts +23 -0
  48. package/dist/components/Checkbox/Checkbox.js +2707 -0
  49. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  50. package/dist/components/Checkbox/index.d.ts +1 -0
  51. package/dist/components/Chip/Chip.cjs +2958 -0
  52. package/dist/components/Chip/Chip.cjs.map +1 -0
  53. package/dist/components/Chip/Chip.d.ts +39 -0
  54. package/dist/components/Chip/Chip.js +2936 -0
  55. package/dist/components/Chip/Chip.js.map +1 -0
  56. package/dist/components/Chip/index.d.ts +1 -0
  57. package/dist/components/ChipInput/ChipInput.cjs +3558 -0
  58. package/dist/components/ChipInput/ChipInput.cjs.map +1 -0
  59. package/dist/components/ChipInput/ChipInput.d.ts +51 -0
  60. package/dist/components/ChipInput/ChipInput.js +3535 -0
  61. package/dist/components/ChipInput/ChipInput.js.map +1 -0
  62. package/dist/components/ChipInput/index.d.ts +1 -0
  63. package/dist/components/CircleProgress/CircleProgress.cjs +102 -0
  64. package/dist/components/CircleProgress/CircleProgress.cjs.map +1 -0
  65. package/dist/components/CircleProgress/CircleProgress.d.ts +16 -0
  66. package/dist/components/CircleProgress/CircleProgress.js +100 -0
  67. package/dist/components/CircleProgress/CircleProgress.js.map +1 -0
  68. package/dist/components/CircleProgress/index.d.ts +1 -0
  69. package/dist/components/ConfirmModal/ConfirmModal.cjs +3145 -0
  70. package/dist/components/ConfirmModal/ConfirmModal.cjs.map +1 -0
  71. package/dist/components/ConfirmModal/ConfirmModal.d.ts +41 -0
  72. package/dist/components/ConfirmModal/ConfirmModal.js +3122 -0
  73. package/dist/components/ConfirmModal/ConfirmModal.js.map +1 -0
  74. package/dist/components/ConfirmModal/index.d.ts +1 -0
  75. package/dist/components/DatePicker/DatePicker.cjs +3409 -0
  76. package/dist/components/DatePicker/DatePicker.cjs.map +1 -0
  77. package/dist/components/DatePicker/DatePicker.d.ts +40 -0
  78. package/dist/components/DatePicker/DatePicker.js +3386 -0
  79. package/dist/components/DatePicker/DatePicker.js.map +1 -0
  80. package/dist/components/DatePicker/index.d.ts +1 -0
  81. package/dist/components/DateRangePicker/DateRangePicker.cjs +3367 -0
  82. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -0
  83. package/dist/components/DateRangePicker/DateRangePicker.d.ts +41 -0
  84. package/dist/components/DateRangePicker/DateRangePicker.js +3344 -0
  85. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -0
  86. package/dist/components/DateRangePicker/index.d.ts +1 -0
  87. package/dist/components/Divider/Divider.cjs +31 -0
  88. package/dist/components/Divider/Divider.cjs.map +1 -0
  89. package/dist/components/Divider/Divider.d.ts +7 -0
  90. package/dist/components/Divider/Divider.js +29 -0
  91. package/dist/components/Divider/Divider.js.map +1 -0
  92. package/dist/components/Divider/index.d.ts +1 -0
  93. package/dist/components/DropdownButton/DropdownButton.cjs +2884 -0
  94. package/dist/components/DropdownButton/DropdownButton.cjs.map +1 -0
  95. package/dist/components/DropdownButton/DropdownButton.d.ts +43 -0
  96. package/dist/components/DropdownButton/DropdownButton.js +2862 -0
  97. package/dist/components/DropdownButton/DropdownButton.js.map +1 -0
  98. package/dist/components/DropdownButton/index.d.ts +1 -0
  99. package/dist/components/Field/Field.cjs +2895 -0
  100. package/dist/components/Field/Field.cjs.map +1 -0
  101. package/dist/components/Field/Field.d.ts +64 -0
  102. package/dist/components/Field/Field.js +2872 -0
  103. package/dist/components/Field/Field.js.map +1 -0
  104. package/dist/components/Field/index.d.ts +1 -0
  105. package/dist/components/FilePicker/FilePicker.cjs +3385 -0
  106. package/dist/components/FilePicker/FilePicker.cjs.map +1 -0
  107. package/dist/components/FilePicker/FilePicker.d.ts +49 -0
  108. package/dist/components/FilePicker/FilePicker.js +3362 -0
  109. package/dist/components/FilePicker/FilePicker.js.map +1 -0
  110. package/dist/components/FilePicker/index.d.ts +1 -0
  111. package/dist/components/GhostButton/GhostButton.cjs +2804 -0
  112. package/dist/components/GhostButton/GhostButton.cjs.map +1 -0
  113. package/dist/components/GhostButton/GhostButton.d.ts +27 -0
  114. package/dist/components/GhostButton/GhostButton.js +2782 -0
  115. package/dist/components/GhostButton/GhostButton.js.map +1 -0
  116. package/dist/components/GhostButton/index.d.ts +1 -0
  117. package/dist/components/Guide/Guide.cjs +2884 -0
  118. package/dist/components/Guide/Guide.cjs.map +1 -0
  119. package/dist/components/Guide/Guide.d.ts +20 -0
  120. package/dist/components/Guide/Guide.js +2861 -0
  121. package/dist/components/Guide/Guide.js.map +1 -0
  122. package/dist/components/Guide/index.d.ts +1 -0
  123. package/dist/components/Icon/Icon.cjs +2638 -0
  124. package/dist/components/Icon/Icon.cjs.map +1 -0
  125. package/dist/components/Icon/Icon.d.ts +21 -0
  126. package/dist/components/Icon/Icon.js +2636 -0
  127. package/dist/components/Icon/Icon.js.map +1 -0
  128. package/dist/components/Icon/icons.gen.cjs +2615 -0
  129. package/dist/components/Icon/icons.gen.cjs.map +1 -0
  130. package/dist/components/Icon/icons.gen.d.ts +96 -0
  131. package/dist/components/Icon/icons.gen.js +2613 -0
  132. package/dist/components/Icon/icons.gen.js.map +1 -0
  133. package/dist/components/Icon/index.d.ts +2 -0
  134. package/dist/components/Input/Input.cjs +3044 -0
  135. package/dist/components/Input/Input.cjs.map +1 -0
  136. package/dist/components/Input/Input.d.ts +52 -0
  137. package/dist/components/Input/Input.js +3021 -0
  138. package/dist/components/Input/Input.js.map +1 -0
  139. package/dist/components/Input/index.d.ts +1 -0
  140. package/dist/components/KeyValueTable/KeyValueTable.cjs +5339 -0
  141. package/dist/components/KeyValueTable/KeyValueTable.cjs.map +1 -0
  142. package/dist/components/KeyValueTable/KeyValueTable.d.ts +40 -0
  143. package/dist/components/KeyValueTable/KeyValueTable.js +5314 -0
  144. package/dist/components/KeyValueTable/KeyValueTable.js.map +1 -0
  145. package/dist/components/KeyValueTable/index.d.ts +1 -0
  146. package/dist/components/LinearProgress/LinearProgress.cjs +70 -0
  147. package/dist/components/LinearProgress/LinearProgress.cjs.map +1 -0
  148. package/dist/components/LinearProgress/LinearProgress.d.ts +16 -0
  149. package/dist/components/LinearProgress/LinearProgress.js +68 -0
  150. package/dist/components/LinearProgress/LinearProgress.js.map +1 -0
  151. package/dist/components/LinearProgress/index.d.ts +1 -0
  152. package/dist/components/LoadingContainer/LoadingContainer.cjs +126 -0
  153. package/dist/components/LoadingContainer/LoadingContainer.cjs.map +1 -0
  154. package/dist/components/LoadingContainer/LoadingContainer.d.ts +16 -0
  155. package/dist/components/LoadingContainer/LoadingContainer.js +124 -0
  156. package/dist/components/LoadingContainer/LoadingContainer.js.map +1 -0
  157. package/dist/components/LoadingContainer/index.d.ts +2 -0
  158. package/dist/components/LoadingContainer/loading.cjs +164 -0
  159. package/dist/components/LoadingContainer/loading.cjs.map +1 -0
  160. package/dist/components/LoadingContainer/loading.d.ts +10 -0
  161. package/dist/components/LoadingContainer/loading.js +161 -0
  162. package/dist/components/LoadingContainer/loading.js.map +1 -0
  163. package/dist/components/LoadingModal/LoadingModal.cjs +3178 -0
  164. package/dist/components/LoadingModal/LoadingModal.cjs.map +1 -0
  165. package/dist/components/LoadingModal/LoadingModal.d.ts +23 -0
  166. package/dist/components/LoadingModal/LoadingModal.js +3155 -0
  167. package/dist/components/LoadingModal/LoadingModal.js.map +1 -0
  168. package/dist/components/LoadingModal/index.d.ts +1 -0
  169. package/dist/components/ModalContainer/ModalContainer.cjs +2875 -0
  170. package/dist/components/ModalContainer/ModalContainer.cjs.map +1 -0
  171. package/dist/components/ModalContainer/ModalContainer.d.ts +27 -0
  172. package/dist/components/ModalContainer/ModalContainer.js +2852 -0
  173. package/dist/components/ModalContainer/ModalContainer.js.map +1 -0
  174. package/dist/components/ModalContainer/index.d.ts +1 -0
  175. package/dist/components/NumberInput/NumberInput.cjs +3136 -0
  176. package/dist/components/NumberInput/NumberInput.cjs.map +1 -0
  177. package/dist/components/NumberInput/NumberInput.d.ts +63 -0
  178. package/dist/components/NumberInput/NumberInput.js +3113 -0
  179. package/dist/components/NumberInput/NumberInput.js.map +1 -0
  180. package/dist/components/NumberInput/index.d.ts +1 -0
  181. package/dist/components/Pagination/Pagination.cjs +2721 -0
  182. package/dist/components/Pagination/Pagination.cjs.map +1 -0
  183. package/dist/components/Pagination/Pagination.d.ts +15 -0
  184. package/dist/components/Pagination/Pagination.js +2719 -0
  185. package/dist/components/Pagination/Pagination.js.map +1 -0
  186. package/dist/components/Pagination/index.d.ts +1 -0
  187. package/dist/components/Popover/Popover.cjs +2973 -0
  188. package/dist/components/Popover/Popover.cjs.map +1 -0
  189. package/dist/components/Popover/Popover.d.ts +48 -0
  190. package/dist/components/Popover/Popover.js +2951 -0
  191. package/dist/components/Popover/Popover.js.map +1 -0
  192. package/dist/components/Popover/index.d.ts +1 -0
  193. package/dist/components/Popup/Popup.cjs +2859 -0
  194. package/dist/components/Popup/Popup.cjs.map +1 -0
  195. package/dist/components/Popup/Popup.d.ts +31 -0
  196. package/dist/components/Popup/Popup.js +2857 -0
  197. package/dist/components/Popup/Popup.js.map +1 -0
  198. package/dist/components/Popup/index.d.ts +1 -0
  199. package/dist/components/Radio/Radio.cjs +104 -0
  200. package/dist/components/Radio/Radio.cjs.map +1 -0
  201. package/dist/components/Radio/Radio.d.ts +21 -0
  202. package/dist/components/Radio/Radio.js +102 -0
  203. package/dist/components/Radio/Radio.js.map +1 -0
  204. package/dist/components/Radio/RadioGroup.cjs +139 -0
  205. package/dist/components/Radio/RadioGroup.cjs.map +1 -0
  206. package/dist/components/Radio/RadioGroup.d.ts +26 -0
  207. package/dist/components/Radio/RadioGroup.js +137 -0
  208. package/dist/components/Radio/RadioGroup.js.map +1 -0
  209. package/dist/components/Radio/index.d.ts +2 -0
  210. package/dist/components/RadioButton/RadioButton.cjs +67 -0
  211. package/dist/components/RadioButton/RadioButton.cjs.map +1 -0
  212. package/dist/components/RadioButton/RadioButton.d.ts +28 -0
  213. package/dist/components/RadioButton/RadioButton.js +65 -0
  214. package/dist/components/RadioButton/RadioButton.js.map +1 -0
  215. package/dist/components/RadioButton/index.d.ts +1 -0
  216. package/dist/components/Select/Select.cjs +3274 -0
  217. package/dist/components/Select/Select.cjs.map +1 -0
  218. package/dist/components/Select/Select.d.ts +71 -0
  219. package/dist/components/Select/Select.js +3250 -0
  220. package/dist/components/Select/Select.js.map +1 -0
  221. package/dist/components/Select/index.d.ts +1 -0
  222. package/dist/components/Select/select.config.d.ts +24 -0
  223. package/dist/components/Switch/Switch.cjs +91 -0
  224. package/dist/components/Switch/Switch.cjs.map +1 -0
  225. package/dist/components/Switch/Switch.d.ts +15 -0
  226. package/dist/components/Switch/Switch.js +69 -0
  227. package/dist/components/Switch/Switch.js.map +1 -0
  228. package/dist/components/Switch/index.d.ts +1 -0
  229. package/dist/components/Table/Table.cjs +4021 -0
  230. package/dist/components/Table/Table.cjs.map +1 -0
  231. package/dist/components/Table/Table.d.ts +117 -0
  232. package/dist/components/Table/Table.js +3996 -0
  233. package/dist/components/Table/Table.js.map +1 -0
  234. package/dist/components/Table/index.d.ts +1 -0
  235. package/dist/components/Tabs/Tabs.cjs +2849 -0
  236. package/dist/components/Tabs/Tabs.cjs.map +1 -0
  237. package/dist/components/Tabs/Tabs.d.ts +24 -0
  238. package/dist/components/Tabs/Tabs.js +2847 -0
  239. package/dist/components/Tabs/Tabs.js.map +1 -0
  240. package/dist/components/Tabs/index.d.ts +2 -0
  241. package/dist/components/Tabs/tabs.config.d.ts +37 -0
  242. package/dist/components/Tag/Tag.cjs +2716 -0
  243. package/dist/components/Tag/Tag.cjs.map +1 -0
  244. package/dist/components/Tag/Tag.d.ts +23 -0
  245. package/dist/components/Tag/Tag.js +2714 -0
  246. package/dist/components/Tag/Tag.js.map +1 -0
  247. package/dist/components/Tag/index.d.ts +2 -0
  248. package/dist/components/Tag/tag.config.d.ts +17 -0
  249. package/dist/components/TextLink/TextLink.cjs +2717 -0
  250. package/dist/components/TextLink/TextLink.cjs.map +1 -0
  251. package/dist/components/TextLink/TextLink.d.ts +27 -0
  252. package/dist/components/TextLink/TextLink.js +2715 -0
  253. package/dist/components/TextLink/TextLink.js.map +1 -0
  254. package/dist/components/TextLink/index.d.ts +1 -0
  255. package/dist/components/Textarea/Textarea.cjs +2999 -0
  256. package/dist/components/Textarea/Textarea.cjs.map +1 -0
  257. package/dist/components/Textarea/Textarea.d.ts +49 -0
  258. package/dist/components/Textarea/Textarea.js +2976 -0
  259. package/dist/components/Textarea/Textarea.js.map +1 -0
  260. package/dist/components/Textarea/index.d.ts +1 -0
  261. package/dist/components/Toast/Toast.cjs +3050 -0
  262. package/dist/components/Toast/Toast.cjs.map +1 -0
  263. package/dist/components/Toast/Toast.d.ts +27 -0
  264. package/dist/components/Toast/Toast.js +3028 -0
  265. package/dist/components/Toast/Toast.js.map +1 -0
  266. package/dist/components/Toast/ToastContainer.cjs +3285 -0
  267. package/dist/components/Toast/ToastContainer.cjs.map +1 -0
  268. package/dist/components/Toast/ToastContainer.d.ts +28 -0
  269. package/dist/components/Toast/ToastContainer.js +3263 -0
  270. package/dist/components/Toast/ToastContainer.js.map +1 -0
  271. package/dist/components/Toast/index.d.ts +2 -0
  272. package/dist/components/Toggle/Toggle.cjs +45 -0
  273. package/dist/components/Toggle/Toggle.cjs.map +1 -0
  274. package/dist/components/Toggle/Toggle.d.ts +18 -0
  275. package/dist/components/Toggle/Toggle.js +43 -0
  276. package/dist/components/Toggle/Toggle.js.map +1 -0
  277. package/dist/components/Toggle/index.d.ts +1 -0
  278. package/dist/components/Tooltip/Tooltip.cjs +2753 -0
  279. package/dist/components/Tooltip/Tooltip.cjs.map +1 -0
  280. package/dist/components/Tooltip/Tooltip.d.ts +44 -0
  281. package/dist/components/Tooltip/Tooltip.js +2730 -0
  282. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  283. package/dist/components/Tooltip/index.d.ts +1 -0
  284. package/dist/index.cjs +8101 -0
  285. package/dist/index.cjs.map +1 -0
  286. package/dist/index.d.ts +44 -0
  287. package/dist/index.js +8019 -0
  288. package/dist/index.js.map +1 -0
  289. package/dist/lib/cn.cjs +13 -0
  290. package/dist/lib/cn.cjs.map +1 -0
  291. package/dist/lib/cn.d.ts +6 -0
  292. package/dist/lib/cn.js +11 -0
  293. package/dist/lib/cn.js.map +1 -0
  294. package/dist/lib/date.cjs +44 -0
  295. package/dist/lib/date.cjs.map +1 -0
  296. package/dist/lib/date.d.ts +15 -0
  297. package/dist/lib/date.js +38 -0
  298. package/dist/lib/date.js.map +1 -0
  299. package/dist/lib/form.cjs +15 -0
  300. package/dist/lib/form.cjs.map +1 -0
  301. package/dist/lib/form.d.ts +4 -0
  302. package/dist/lib/form.js +13 -0
  303. package/dist/lib/form.js.map +1 -0
  304. package/dist/lib/sanitize-inline-html.cjs +66 -0
  305. package/dist/lib/sanitize-inline-html.cjs.map +1 -0
  306. package/dist/lib/sanitize-inline-html.d.ts +1 -0
  307. package/dist/lib/sanitize-inline-html.js +64 -0
  308. package/dist/lib/sanitize-inline-html.js.map +1 -0
  309. package/dist/styles.css +3384 -0
  310. package/dist/theme.css +1483 -0
  311. 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":"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","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,2 @@
1
+ export { Radio, type RadioProps, type RadioValue } from './Radio';
2
+ export { RadioGroup, type RadioGroupProps, type RadioOption } from './RadioGroup';
@@ -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';