@hivcd-printshop/design-system 1.2.1 → 1.2.3

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/dist/index.mjs CHANGED
@@ -175,6 +175,89 @@ var IconCompass = ({ className, fill }) => {
175
175
  }
176
176
  );
177
177
  };
178
+ var IconRadioSelected = ({
179
+ className,
180
+ stroke,
181
+ fill
182
+ }) => {
183
+ return /* @__PURE__ */ jsxs(
184
+ "svg",
185
+ {
186
+ className,
187
+ width: "16",
188
+ height: "16",
189
+ viewBox: "0 0 16 16",
190
+ fill: "none",
191
+ xmlns: "http://www.w3.org/2000/svg",
192
+ children: [
193
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "7", stroke: stroke || "#121212" }),
194
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "4", fill: fill || "#121212" })
195
+ ]
196
+ }
197
+ );
198
+ };
199
+ var IconRadioUnselected = ({
200
+ className,
201
+ stroke
202
+ }) => {
203
+ return /* @__PURE__ */ jsx(
204
+ "svg",
205
+ {
206
+ className,
207
+ width: "16",
208
+ height: "16",
209
+ viewBox: "0 0 16 16",
210
+ fill: "none",
211
+ xmlns: "http://www.w3.org/2000/svg",
212
+ children: /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "7", stroke: stroke || "#B4B9C2" })
213
+ }
214
+ );
215
+ };
216
+ var IconExclamation = ({ className, fill }) => {
217
+ return /* @__PURE__ */ jsxs(
218
+ "svg",
219
+ {
220
+ className,
221
+ width: "12",
222
+ height: "12",
223
+ viewBox: "0 0 12 12",
224
+ fill: "none",
225
+ xmlns: "http://www.w3.org/2000/svg",
226
+ children: [
227
+ /* @__PURE__ */ jsx(
228
+ "path",
229
+ {
230
+ d: "M6.41438 7.18735H5.57954L5.50175 3.10938H6.49218L6.41438 7.18735ZM5.40001 8.3313C5.39801 8.23061 5.42395 8.13738 5.47781 8.05161C5.53167 7.96583 5.60448 7.89777 5.69624 7.84743C5.79 7.79708 5.89174 7.77191 6.00145 7.77191C6.10718 7.77191 6.20592 7.79708 6.29768 7.84743C6.38945 7.89777 6.46226 7.96583 6.51612 8.05161C6.57197 8.13738 6.5999 8.23061 6.5999 8.3313C6.5999 8.43199 6.57197 8.52522 6.51612 8.611C6.46226 8.69677 6.38945 8.76483 6.29768 8.81518C6.20592 8.86552 6.10718 8.89069 6.00145 8.89069C5.89174 8.89069 5.79 8.86552 5.69624 8.81518C5.60448 8.76483 5.53167 8.69677 5.47781 8.611C5.42395 8.52522 5.39801 8.43199 5.40001 8.3313Z",
231
+ fill: fill || "#505865"
232
+ }
233
+ ),
234
+ /* @__PURE__ */ jsx("circle", { cx: "6", cy: "6", r: "4.5", stroke: fill || "#505865" })
235
+ ]
236
+ }
237
+ );
238
+ };
239
+ var IconClose = ({ className, stroke }) => {
240
+ return /* @__PURE__ */ jsx(
241
+ "svg",
242
+ {
243
+ className,
244
+ width: "16",
245
+ height: "16",
246
+ viewBox: "0 0 16 16",
247
+ fill: "none",
248
+ xmlns: "http://www.w3.org/2000/svg",
249
+ children: /* @__PURE__ */ jsx(
250
+ "path",
251
+ {
252
+ d: "M4 4L12 12M12 4L4 12",
253
+ stroke: stroke || "#6d7683",
254
+ strokeWidth: "1.5",
255
+ strokeLinecap: "round"
256
+ }
257
+ )
258
+ }
259
+ );
260
+ };
178
261
 
179
262
  // src/components/BackButton/BackButton.tsx
180
263
  import { jsx as jsx2 } from "react/jsx-runtime";
@@ -862,30 +945,49 @@ function List({
862
945
 
863
946
  // src/components/Modal/Modal.tsx
864
947
  import { jsx as jsx25, jsxs as jsxs14 } from "react/jsx-runtime";
865
- var ModalBase = ({ isVisible, header, children, className }) => {
948
+ var ModalBase = ({ isVisible, header, children, className, onClose }) => {
866
949
  if (!isVisible) return null;
867
- return /* @__PURE__ */ jsx25("div", { className: cn("fixed inset-0 z-50 pointer-events-auto"), children: /* @__PURE__ */ jsx25(
868
- "div",
869
- {
870
- className: cn("fixed inset-0 z-1001 flex items-center justify-center pointer-events-auto"),
871
- children: /* @__PURE__ */ jsxs14(
872
- "main",
873
- {
874
- className: cn(
875
- "w-110 pt-8 h-fit",
876
- "flex flex-col items-center",
877
- "border border-gray02",
878
- "bg-white shadow-[0 0 30px 0 rgba(0, 0, 0, 0.08);]",
879
- className
950
+ return /* @__PURE__ */ jsxs14("div", { className: cn("fixed inset-0 z-50"), children: [
951
+ /* @__PURE__ */ jsx25(
952
+ "div",
953
+ {
954
+ "aria-hidden": true,
955
+ onClick: onClose,
956
+ className: cn("fixed inset-0 z-1000 bg-[#212121]/30", onClose && "cursor-pointer")
957
+ }
958
+ ),
959
+ /* @__PURE__ */ jsx25("div", { className: "fixed inset-0 z-1001 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs14(
960
+ "main",
961
+ {
962
+ role: "dialog",
963
+ "aria-modal": "true",
964
+ className: cn(
965
+ "relative w-110 pt-8 h-fit pointer-events-auto",
966
+ "flex flex-col items-center",
967
+ "border border-gray02",
968
+ "bg-white shadow-[0px_0px_30px_0px_rgba(0,0,0,0.08)]",
969
+ className
970
+ ),
971
+ children: [
972
+ onClose && /* @__PURE__ */ jsx25(
973
+ "button",
974
+ {
975
+ type: "button",
976
+ onClick: onClose,
977
+ "aria-label": "\uB2EB\uAE30",
978
+ className: cn(
979
+ "absolute right-3 top-3 flex size-8 items-center justify-center",
980
+ "text-tertiary transition-colors hover:bg-gray00 active:bg-gray01 cursor-pointer"
981
+ ),
982
+ children: /* @__PURE__ */ jsx25(IconClose, {})
983
+ }
880
984
  ),
881
- children: [
882
- /* @__PURE__ */ jsx25("h1", { className: cn("text-strong font-[500] text-[24px] leading-[32px]"), children: header }),
883
- children
884
- ]
885
- }
886
- )
887
- }
888
- ) });
985
+ /* @__PURE__ */ jsx25("h1", { className: cn("text-strong font-[500] text-[24px] leading-[32px]"), children: header }),
986
+ children
987
+ ]
988
+ }
989
+ ) })
990
+ ] });
889
991
  };
890
992
  var Contents = ({ children, className }) => {
891
993
  return /* @__PURE__ */ jsx25(
@@ -1137,18 +1239,6 @@ function useControllableState(controlled, defaultValue) {
1137
1239
  return [value, setValue, isControlled];
1138
1240
  }
1139
1241
 
1140
- // src/components/SideRadioAccordion/Exclamation.svg
1141
- var Exclamation_default = "./Exclamation-IUYZYYC4.svg";
1142
-
1143
- // src/components/SideRadioAccordion/ChevronDown.svg
1144
- var ChevronDown_default = "./ChevronDown-XSALXCW4.svg";
1145
-
1146
- // src/components/SideRadioAccordion/RadioSelected.svg
1147
- var RadioSelected_default = "./RadioSelected-DOLVV7ZM.svg";
1148
-
1149
- // src/components/SideRadioAccordion/RadioUnselected.svg
1150
- var RadioUnselected_default = "./RadioUnselected-QN74EU46.svg";
1151
-
1152
1242
  // src/components/SideRadioAccordion/SideRadioAccordion.tsx
1153
1243
  import { jsx as jsx33, jsxs as jsxs18 } from "react/jsx-runtime";
1154
1244
  var printColorBgClass = {
@@ -1239,14 +1329,7 @@ var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
1239
1329
  className: cn(base, "cursor-pointer hover:bg-gray00 active:bg-gray01", className),
1240
1330
  children: [
1241
1331
  label,
1242
- /* @__PURE__ */ jsx33(
1243
- "img",
1244
- {
1245
- src: ChevronDown_default,
1246
- alt: "",
1247
- className: cn("transition-transform", isOpen && "rotate-180")
1248
- }
1249
- )
1332
+ /* @__PURE__ */ jsx33(IconChevronDownXS, { className: cn("transition-transform", isOpen && "rotate-180") })
1250
1333
  ]
1251
1334
  }
1252
1335
  );
@@ -1273,8 +1356,9 @@ var RadioToggleItem = ({
1273
1356
  onClick: onSelect,
1274
1357
  style,
1275
1358
  className: cn(
1276
- "w-full flex items-center gap-1.5 p-3",
1277
- "text-body1-regular text-secondary text-left cursor-pointer",
1359
+ "group w-full flex items-center gap-1.5 p-3",
1360
+ "text-body1-regular text-left cursor-pointer",
1361
+ open ? "text-strong" : "text-secondary",
1278
1362
  rowBg,
1279
1363
  className
1280
1364
  ),
@@ -1286,7 +1370,7 @@ var RadioToggleItem = ({
1286
1370
  ),
1287
1371
  open && /* @__PURE__ */ jsxs18("div", { className: "flex flex-col gap-2 px-3 py-3 bg-white", children: [
1288
1372
  /* @__PURE__ */ jsx33("p", { className: "text-caption-regular text-secondary", children: content }),
1289
- badges && badges.length > 0 && /* @__PURE__ */ jsx33("div", { className: "flex gap-1", children: badges.map((badge) => /* @__PURE__ */ jsx33(Badge, { label: badge }, badge)) }),
1373
+ badges && badges.length > 0 && /* @__PURE__ */ jsx33("div", { className: "flex flex-wrap gap-1", children: badges.map((badge) => /* @__PURE__ */ jsx33(Badge, { label: badge }, badge)) }),
1290
1374
  labelTextButton && /* @__PURE__ */ jsx33(
1291
1375
  TextButton2,
1292
1376
  {
@@ -1300,13 +1384,21 @@ var RadioToggleItem = ({
1300
1384
  ] });
1301
1385
  };
1302
1386
  var Radio = ({ selected = false, className }) => {
1303
- return /* @__PURE__ */ jsx33(
1304
- "img",
1305
- {
1306
- src: selected ? RadioSelected_default : RadioUnselected_default,
1307
- alt: "",
1308
- className: cn("w-6 h-6", className)
1309
- }
1387
+ const Icon = selected ? IconRadioSelected : IconRadioUnselected;
1388
+ return (
1389
+ // 디자인 스펙(Figma "radio" 5:781): 아이콘 자체 색은 고정, hover/pressed 시
1390
+ // 24px 원형 배경 칩만 나타난다(gray00/gray01). 부모 버튼의 group-hover/active로 동기화.
1391
+ /* @__PURE__ */ jsx33(
1392
+ "span",
1393
+ {
1394
+ className: cn(
1395
+ "inline-flex size-6 shrink-0 items-center justify-center rounded-full transition-colors",
1396
+ "group-hover:bg-gray00 group-active:bg-gray01",
1397
+ className
1398
+ ),
1399
+ children: /* @__PURE__ */ jsx33(Icon, { className: "size-6" })
1400
+ }
1401
+ )
1310
1402
  );
1311
1403
  };
1312
1404
  var TextButton2 = ({ label, onClick, showIcon = false, className }) => {
@@ -1323,7 +1415,7 @@ var TextButton2 = ({ label, onClick, showIcon = false, className }) => {
1323
1415
  className
1324
1416
  ),
1325
1417
  children: [
1326
- showIcon && /* @__PURE__ */ jsx33("img", { src: Exclamation_default, alt: "" }),
1418
+ showIcon && /* @__PURE__ */ jsx33(IconExclamation, {}),
1327
1419
  label
1328
1420
  ]
1329
1421
  }
@@ -1334,7 +1426,7 @@ var Badge = ({ label, className }) => {
1334
1426
  "div",
1335
1427
  {
1336
1428
  className: cn(
1337
- "w-fit h-fit px-2 py-0.5 border border-gray02",
1429
+ "w-fit h-fit px-2 py-0.5 border border-gray02 shrink-0 whitespace-nowrap",
1338
1430
  "text-tertiary text-caption-book",
1339
1431
  className
1340
1432
  ),
@@ -1744,14 +1836,10 @@ var UpperPart = ({
1744
1836
  ] }),
1745
1837
  /* @__PURE__ */ jsxs21("div", { className: "flex items-stretch", children: [
1746
1838
  /* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" }),
1747
- upperPartIconList.map((icon, index) => /* @__PURE__ */ jsx37(
1748
- NavIconButton,
1749
- {
1750
- ...icon,
1751
- linkComponent
1752
- },
1753
- icon.id ?? icon.src ?? icon.label ?? index
1754
- ))
1839
+ upperPartIconList.map((icon, index) => /* @__PURE__ */ jsxs21(Fragment2, { children: [
1840
+ /* @__PURE__ */ jsx37(NavIconButton, { ...icon, linkComponent }),
1841
+ /* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" })
1842
+ ] }, icon.id ?? icon.src ?? icon.label ?? index))
1755
1843
  ] })
1756
1844
  ]
1757
1845
  }
@@ -1773,7 +1861,9 @@ var UpperPartTab = ({
1773
1861
  linkComponent,
1774
1862
  current: selected,
1775
1863
  className: cn(
1776
- "inline-flex min-h-13 flex-col items-center gap-2 pt-2.5 cursor-pointer no-underline",
1864
+ // 헤더 바닥 border-b와 언더라인이 겹치도록 높이를 52px로 고정하고
1865
+ // justify-between으로 라벨/언더라인을 위-아래 끝에 붙인다.
1866
+ "inline-flex h-13 flex-col items-center justify-between pt-2.5 cursor-pointer no-underline",
1777
1867
  "transition-colors hover:bg-gray00 active:bg-gray01",
1778
1868
  className
1779
1869
  ),
@@ -1964,8 +2054,12 @@ export {
1964
2054
  FormTextArea,
1965
2055
  IconCheck,
1966
2056
  IconChevronDownXS,
2057
+ IconClose,
1967
2058
  IconCompass,
2059
+ IconExclamation,
1968
2060
  IconInfo,
2061
+ IconRadioSelected,
2062
+ IconRadioUnselected,
1969
2063
  List,
1970
2064
  Modal,
1971
2065
  ModalText,