@bigtablet/design-system 3.14.2 → 3.15.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/dist/index.css CHANGED
@@ -5708,8 +5708,8 @@ body:has(.bottom_nav) {
5708
5708
  }
5709
5709
  .drawer_close {
5710
5710
  position: absolute;
5711
- top: 12px;
5712
- right: 12px;
5711
+ top: 16px;
5712
+ right: 16px;
5713
5713
  width: 32px;
5714
5714
  height: 32px;
5715
5715
  display: inline-flex;
@@ -5794,6 +5794,7 @@ body:has(.bottom_nav) {
5794
5794
  bottom: 0;
5795
5795
  left: 0;
5796
5796
  display: grid;
5797
+ grid-template-columns: minmax(0, 1fr);
5797
5798
  place-items: center;
5798
5799
  background: var(--bt-color-bg-overlay);
5799
5800
  z-index: 100;
@@ -5821,8 +5822,8 @@ body:has(.bottom_nav) {
5821
5822
  }
5822
5823
  .modal_close {
5823
5824
  position: absolute;
5824
- top: 12px;
5825
- right: 12px;
5825
+ top: 16px;
5826
+ right: 16px;
5826
5827
  width: 32px;
5827
5828
  height: 32px;
5828
5829
  display: inline-flex;
@@ -5843,9 +5844,15 @@ body:has(.bottom_nav) {
5843
5844
  outline: none;
5844
5845
  box-shadow: var(--bt-focus-ring);
5845
5846
  }
5847
+ @media (min-width: 600px) {
5848
+ .modal_close {
5849
+ top: 24px;
5850
+ right: 24px;
5851
+ }
5852
+ }
5846
5853
  .modal_title {
5847
5854
  margin: 0;
5848
- padding-right: 32px;
5855
+ padding-right: 24px;
5849
5856
  color: var(--bt-color-text-heading);
5850
5857
  font-size: 28px;
5851
5858
  font-weight: 700;
package/dist/index.d.ts CHANGED
@@ -866,6 +866,7 @@ declare const spacing: {
866
866
  readonly "4": "4px";
867
867
  readonly "6": "6px";
868
868
  readonly "8": "8px";
869
+ readonly "10": "10px";
869
870
  readonly "12": "12px";
870
871
  readonly "16": "16px";
871
872
  readonly "20": "20px";
@@ -873,6 +874,9 @@ declare const spacing: {
873
874
  readonly "32": "32px";
874
875
  readonly "40": "40px";
875
876
  readonly "48": "48px";
877
+ readonly "64": "64px";
878
+ readonly "96": "96px";
879
+ readonly "128": "128px";
876
880
  };
877
881
 
878
882
  declare const baseTypography: {
@@ -880,6 +884,7 @@ declare const baseTypography: {
880
884
  readonly primary: "Pretendard";
881
885
  };
882
886
  readonly fontSize: {
887
+ readonly "10": "10px";
883
888
  readonly "12": "12px";
884
889
  readonly "13": "13px";
885
890
  readonly "14": "14px";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import './index.css';
3
- import * as React16 from 'react';
3
+ import * as React11 from 'react';
4
4
  import { createContext, useRef, useState, useId, useEffect, useContext, useCallback, useMemo, Fragment, useImperativeHandle, useLayoutEffect } from 'react';
5
5
  import { useSpring, animated } from '@react-spring/web';
6
6
  import { ChevronDown, ChevronRight, Globe, ChevronLeft, ArrowUp, ArrowDown, ArrowUpDown, XCircle, AlertTriangle, CheckCircle2, Info, Bell, Search, Check, Image, X, EyeOff, Eye, TriangleAlert } from 'lucide-react';
@@ -58,11 +58,11 @@ function registerOverlay(onEscape) {
58
58
  };
59
59
  }
60
60
  function useOverlayEscape(active, onEscape) {
61
- const handlerRef = React16.useRef(onEscape);
62
- React16.useEffect(() => {
61
+ const handlerRef = React11.useRef(onEscape);
62
+ React11.useEffect(() => {
63
63
  handlerRef.current = onEscape;
64
64
  });
65
- React16.useEffect(() => {
65
+ React11.useEffect(() => {
66
66
  if (!active) return;
67
67
  return registerOverlay(() => handlerRef.current());
68
68
  }, [active]);
@@ -203,7 +203,7 @@ function useAnchoredPosition({
203
203
  gap,
204
204
  padding
205
205
  }) {
206
- const [state, setState] = React16.useState({
206
+ const [state, setState] = React11.useState({
207
207
  x: 0,
208
208
  y: 0,
209
209
  placement,
@@ -262,8 +262,8 @@ var FOCUSABLE_SELECTORS = [
262
262
  '[tabindex]:not([tabindex="-1"])'
263
263
  ].join(", ");
264
264
  function useFocusTrap(containerRef, isActive) {
265
- const previousActiveElement = React16.useRef(null);
266
- React16.useEffect(() => {
265
+ const previousActiveElement = React11.useRef(null);
266
+ React11.useEffect(() => {
267
267
  if (!isActive) return;
268
268
  const container = containerRef.current;
269
269
  if (!container) return;
@@ -313,8 +313,8 @@ function useFocusTrap(containerRef, isActive) {
313
313
  }, [isActive, containerRef]);
314
314
  }
315
315
  function useIsMounted() {
316
- const [mounted, setMounted] = React16.useState(false);
317
- React16.useEffect(() => {
316
+ const [mounted, setMounted] = React11.useState(false);
317
+ React11.useEffect(() => {
318
318
  setMounted(true);
319
319
  }, []);
320
320
  return mounted;
@@ -348,13 +348,13 @@ function getServerSnapshot() {
348
348
  return false;
349
349
  }
350
350
  function useReducedMotion() {
351
- return React16.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
351
+ return React11.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
352
352
  }
353
353
  function useSpringHover({
354
354
  scale = 1.02,
355
355
  lift = -2
356
356
  } = {}) {
357
- const [hovered, setHovered] = React16.useState(false);
357
+ const [hovered, setHovered] = React11.useState(false);
358
358
  const reduced = useReducedMotion();
359
359
  const style = useSpring({
360
360
  transform: hovered ? `translateY(${lift}px) scale(${scale})` : "translateY(0px) scale(1)",
@@ -421,9 +421,9 @@ var Accordion = ({
421
421
  ...props
422
422
  }) => {
423
423
  const isControlled = controlledKeys !== void 0;
424
- const [internalKeys, setInternalKeys] = React16.useState(defaultOpenKeys);
424
+ const [internalKeys, setInternalKeys] = React11.useState(defaultOpenKeys);
425
425
  const open = isControlled ? controlledKeys ?? [] : internalKeys;
426
- const idPrefix = React16.useId();
426
+ const idPrefix = React11.useId();
427
427
  const toggle = (key) => {
428
428
  const isOpen = open.includes(key);
429
429
  const next = isOpen ? open.filter((k) => k !== key) : multiple ? [...open, key] : [key];
@@ -489,7 +489,7 @@ var Avatar = ({
489
489
  style,
490
490
  ...props
491
491
  }) => {
492
- const [imgFailed, setImgFailed] = React16.useState(false);
492
+ const [imgFailed, setImgFailed] = React11.useState(false);
493
493
  const showImage = src && !imgFailed;
494
494
  const initials = getInitials(name);
495
495
  return /* @__PURE__ */ jsx(
@@ -503,15 +503,7 @@ var Avatar = ({
503
503
  ...props,
504
504
  children: showImage ? (
505
505
  // biome-ignore lint/performance/noImgElement: DS is framework-agnostic - consumers wrap with next/image
506
- /* @__PURE__ */ jsx(
507
- "img",
508
- {
509
- src,
510
- alt: name,
511
- onError: () => setImgFailed(true),
512
- className: "avatar_image"
513
- }
514
- )
506
+ /* @__PURE__ */ jsx("img", { src, alt: name, onError: () => setImgFailed(true), className: "avatar_image" })
515
507
  ) : /* @__PURE__ */ jsx("span", { className: "avatar_initials", "aria-hidden": "true", children: initials })
516
508
  }
517
509
  );
@@ -614,27 +606,10 @@ var BottomNav = ({
614
606
  children,
615
607
  ...props
616
608
  }) => {
617
- return /* @__PURE__ */ jsx(
618
- "nav",
619
- {
620
- className: cn("bottom_nav", className),
621
- "aria-label": ariaLabel,
622
- ...props,
623
- children
624
- }
625
- );
609
+ return /* @__PURE__ */ jsx("nav", { className: cn("bottom_nav", className), "aria-label": ariaLabel, ...props, children });
626
610
  };
627
611
  var BottomNavItem = (props) => {
628
- const {
629
- icon,
630
- label,
631
- active,
632
- badge,
633
- as = "button",
634
- className,
635
- disabled,
636
- ...rest
637
- } = props;
612
+ const { icon, label, active, badge, as = "button", className, disabled, ...rest } = props;
638
613
  const classes = cn(
639
614
  "bottom_nav_item",
640
615
  active && "bottom_nav_item_active",
@@ -651,27 +626,24 @@ var BottomNavItem = (props) => {
651
626
  ] });
652
627
  if (as === "a") {
653
628
  const { href, onClick: onClick2, ...anchorRest } = rest;
654
- return (
655
- // biome-ignore lint/a11y/useValidAnchor: navigation link with optional active state
656
- /* @__PURE__ */ jsx(
657
- "a",
658
- {
659
- className: classes,
660
- href,
661
- "aria-current": ariaCurrent,
662
- "aria-disabled": disabled ? "true" : void 0,
663
- tabIndex: disabled ? -1 : void 0,
664
- onClick: (e) => {
665
- if (disabled) {
666
- e.preventDefault();
667
- return;
668
- }
669
- onClick2?.(e);
670
- },
671
- ...anchorRest,
672
- children: content
673
- }
674
- )
629
+ return /* @__PURE__ */ jsx(
630
+ "a",
631
+ {
632
+ className: classes,
633
+ href,
634
+ "aria-current": ariaCurrent,
635
+ "aria-disabled": disabled ? "true" : void 0,
636
+ tabIndex: disabled ? -1 : void 0,
637
+ onClick: (e) => {
638
+ if (disabled) {
639
+ e.preventDefault();
640
+ return;
641
+ }
642
+ onClick2?.(e);
643
+ },
644
+ ...anchorRest,
645
+ children: content
646
+ }
675
647
  );
676
648
  }
677
649
  const { type, onClick, ...buttonRest } = rest;
@@ -704,30 +676,19 @@ var Breadcrumb = ({
704
676
  return (
705
677
  // biome-ignore lint/suspicious/noArrayIndexKey: breadcrumb items have stable order
706
678
  /* @__PURE__ */ jsxs("li", { className: "breadcrumb_item", children: [
707
- isLast ? /* @__PURE__ */ jsx("span", { className: "breadcrumb_current", "aria-current": "page", children: item.label }) : item.href ? (
708
- // biome-ignore lint/a11y/useValidAnchor: navigation link
709
- /* @__PURE__ */ jsx("a", { className: "breadcrumb_link", href: item.href, onClick: item.onClick, children: item.label })
710
- ) : /* @__PURE__ */ jsx(
711
- "button",
712
- {
713
- type: "button",
714
- className: "breadcrumb_link",
715
- onClick: item.onClick,
716
- children: item.label
717
- }
718
- ),
679
+ isLast ? /* @__PURE__ */ jsx("span", { className: "breadcrumb_current", "aria-current": "page", children: item.label }) : item.href ? /* @__PURE__ */ jsx("a", { className: "breadcrumb_link", href: item.href, onClick: item.onClick, children: item.label }) : /* @__PURE__ */ jsx("button", { type: "button", className: "breadcrumb_link", onClick: item.onClick, children: item.label }),
719
680
  !isLast && /* @__PURE__ */ jsx("span", { className: "breadcrumb_separator", "aria-hidden": "true", children: sep })
720
681
  ] }, idx)
721
682
  );
722
683
  }) }) });
723
684
  };
724
685
  var Menu = ({ items, trigger, align = "start" }) => {
725
- const [open, setOpen] = React16.useState(false);
726
- const wrapperRef = React16.useRef(null);
727
- const itemRefs = React16.useRef([]);
728
- const menuId = React16.useId();
686
+ const [open, setOpen] = React11.useState(false);
687
+ const wrapperRef = React11.useRef(null);
688
+ const itemRefs = React11.useRef([]);
689
+ const menuId = React11.useId();
729
690
  const style = useSpringPresence({ visible: open, from: "translateY(-4px)" });
730
- React16.useEffect(() => {
691
+ React11.useEffect(() => {
731
692
  if (!open) return;
732
693
  const handleClick = (e) => {
733
694
  if (!wrapperRef.current?.contains(e.target)) setOpen(false);
@@ -742,7 +703,7 @@ var Menu = ({ items, trigger, align = "start" }) => {
742
703
  document.removeEventListener("keydown", handleEsc);
743
704
  };
744
705
  }, [open]);
745
- React16.useEffect(() => {
706
+ React11.useEffect(() => {
746
707
  const active = document.activeElement;
747
708
  if (!open || active && itemRefs.current.includes(active)) return;
748
709
  const first = items.findIndex((it) => !it.disabled);
@@ -788,7 +749,7 @@ var Menu = ({ items, trigger, align = "start" }) => {
788
749
  break;
789
750
  }
790
751
  };
791
- const triggerWithProps = React16.cloneElement(
752
+ const triggerWithProps = React11.cloneElement(
792
753
  trigger,
793
754
  {
794
755
  onClick: () => setOpen((o) => !o),
@@ -905,10 +866,7 @@ var NavBar = ({
905
866
  "span",
906
867
  {
907
868
  "aria-hidden": "true",
908
- className: cn(
909
- "nav_bar_indicator",
910
- hasMounted && "nav_bar_indicator_animated"
911
- ),
869
+ className: cn("nav_bar_indicator", hasMounted && "nav_bar_indicator_animated"),
912
870
  style: { left: indicator.left, width: indicator.width }
913
871
  }
914
872
  )
@@ -1009,58 +967,39 @@ var LocaleSwitcher = ({ locale }) => {
1009
967
  children: [
1010
968
  /* @__PURE__ */ jsx(Globe, { size: iconSize.sm, "aria-hidden": "true" }),
1011
969
  !locale.hideLabel && /* @__PURE__ */ jsx("span", { className: "nav_bar_locale_label", children: currentLabel }),
1012
- /* @__PURE__ */ jsx(
1013
- ChevronDown,
1014
- {
1015
- size: iconSize.xs,
1016
- "aria-hidden": "true",
1017
- className: "nav_bar_locale_chevron"
1018
- }
1019
- )
970
+ /* @__PURE__ */ jsx(ChevronDown, { size: iconSize.xs, "aria-hidden": "true", className: "nav_bar_locale_chevron" })
1020
971
  ]
1021
972
  }
1022
973
  ),
1023
- open && /* @__PURE__ */ jsx(
1024
- "ul",
974
+ open && /* @__PURE__ */ jsx("ul", { id: menuId, role: "menu", className: "nav_bar_locale_menu", onKeyDown: handleMenuKeyDown, children: locale.options.map((opt, index) => /* @__PURE__ */ jsx("li", { role: "none", children: /* @__PURE__ */ jsx(
975
+ "button",
1025
976
  {
1026
- id: menuId,
1027
- role: "menu",
1028
- className: "nav_bar_locale_menu",
1029
- onKeyDown: handleMenuKeyDown,
1030
- children: locale.options.map((opt, index) => /* @__PURE__ */ jsx("li", { role: "none", children: /* @__PURE__ */ jsx(
1031
- "button",
1032
- {
1033
- ref: (el) => {
1034
- itemRefs.current[index] = el;
1035
- },
1036
- type: "button",
1037
- role: "menuitemradio",
1038
- "aria-checked": opt.value === locale.current,
1039
- tabIndex: -1,
1040
- className: cn(
1041
- "nav_bar_locale_item",
1042
- opt.value === locale.current && "nav_bar_locale_item_active"
1043
- ),
1044
- onClick: () => handleSelect(opt.value),
1045
- children: opt.label
1046
- }
1047
- ) }, opt.value))
977
+ ref: (el) => {
978
+ itemRefs.current[index] = el;
979
+ },
980
+ type: "button",
981
+ role: "menuitemradio",
982
+ "aria-checked": opt.value === locale.current,
983
+ tabIndex: -1,
984
+ className: cn(
985
+ "nav_bar_locale_item",
986
+ opt.value === locale.current && "nav_bar_locale_item_active"
987
+ ),
988
+ onClick: () => handleSelect(opt.value),
989
+ children: opt.label
1048
990
  }
1049
- )
991
+ ) }, opt.value)) })
1050
992
  ] });
1051
993
  };
1052
994
  var NavLink = ({ active, className, children, ...props }) => {
1053
- return (
1054
- // biome-ignore lint/a11y/useValidAnchor: navigation link
1055
- /* @__PURE__ */ jsx(
1056
- "a",
1057
- {
1058
- className: cn("nav_bar_link", active && "nav_bar_link_active"),
1059
- "aria-current": active ? "page" : void 0,
1060
- ...props,
1061
- children
1062
- }
1063
- )
995
+ return /* @__PURE__ */ jsx(
996
+ "a",
997
+ {
998
+ className: cn("nav_bar_link", active && "nav_bar_link_active"),
999
+ "aria-current": active ? "page" : void 0,
1000
+ ...props,
1001
+ children
1002
+ }
1064
1003
  );
1065
1004
  };
1066
1005
  var Sidebar = ({
@@ -1081,9 +1020,9 @@ var Sidebar = ({
1081
1020
  ...props
1082
1021
  }) => {
1083
1022
  const isControlled = collapsedProp !== void 0;
1084
- const [internalCollapsed, setInternalCollapsed] = React16.useState(defaultCollapsed);
1023
+ const [internalCollapsed, setInternalCollapsed] = React11.useState(defaultCollapsed);
1085
1024
  const collapsed = isControlled ? collapsedProp : internalCollapsed;
1086
- const toggle = React16.useCallback(() => {
1025
+ const toggle = React11.useCallback(() => {
1087
1026
  const next = !collapsed;
1088
1027
  if (!isControlled) setInternalCollapsed(next);
1089
1028
  onCollapsedChange?.(next);
@@ -1133,22 +1072,10 @@ var SidebarItem = (props) => {
1133
1072
  ] });
1134
1073
  if (as === "a") {
1135
1074
  const { href, ...anchorRest } = rest;
1136
- return (
1137
- // biome-ignore lint/a11y/useValidAnchor: navigation link with optional active state
1138
- /* @__PURE__ */ jsx("a", { className: classes, href, "aria-current": ariaCurrent, ...anchorRest, children: inner })
1139
- );
1075
+ return /* @__PURE__ */ jsx("a", { className: classes, href, "aria-current": ariaCurrent, ...anchorRest, children: inner });
1140
1076
  }
1141
1077
  const { type, ...buttonRest } = rest;
1142
- return /* @__PURE__ */ jsx(
1143
- "button",
1144
- {
1145
- type: type ?? "button",
1146
- className: classes,
1147
- "aria-current": ariaCurrent,
1148
- ...buttonRest,
1149
- children: inner
1150
- }
1151
- );
1078
+ return /* @__PURE__ */ jsx("button", { type: type ?? "button", className: classes, "aria-current": ariaCurrent, ...buttonRest, children: inner });
1152
1079
  };
1153
1080
  var SidebarSection = ({ label, className, children, ...props }) => {
1154
1081
  return /* @__PURE__ */ jsxs("div", { className: cn("sidebar_section", className), ...props, children: [
@@ -1156,9 +1083,9 @@ var SidebarSection = ({ label, className, children, ...props }) => {
1156
1083
  children
1157
1084
  ] });
1158
1085
  };
1159
- var TabsContext = React16.createContext(null);
1086
+ var TabsContext = React11.createContext(null);
1160
1087
  function useTabsContext() {
1161
- const ctx = React16.useContext(TabsContext);
1088
+ const ctx = React11.useContext(TabsContext);
1162
1089
  if (!ctx) {
1163
1090
  throw new Error(
1164
1091
  '[Bigtablet DS] <Tab>, <TabList>, <TabPanel>\uC740 \uBC18\uB4DC\uC2DC <Tabs> \uC548\uC5D0 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n\n\uC62C\uBC14\uB978 \uC0AC\uC6A9 \uC608:\n <Tabs defaultValue="a">\n <TabList>\n <Tab value="a">A</Tab>\n </TabList>\n <TabPanel value="a">...</TabPanel>\n </Tabs>'
@@ -1177,18 +1104,18 @@ var Tabs = ({
1177
1104
  ...props
1178
1105
  }) => {
1179
1106
  const isControlled = controlledValue !== void 0;
1180
- const [internalValue, setInternalValue] = React16.useState(defaultValue);
1107
+ const [internalValue, setInternalValue] = React11.useState(defaultValue);
1181
1108
  const value = isControlled ? controlledValue : internalValue;
1182
- const setValue = React16.useCallback(
1109
+ const setValue = React11.useCallback(
1183
1110
  (v) => {
1184
1111
  if (!isControlled) setInternalValue(v);
1185
1112
  onValueChange?.(v);
1186
1113
  },
1187
1114
  [isControlled, onValueChange]
1188
1115
  );
1189
- const orderRef = React16.useRef([]);
1190
- const [firstTabValue, setFirstTabValue] = React16.useState();
1191
- const registerTab = React16.useCallback((v) => {
1116
+ const orderRef = React11.useRef([]);
1117
+ const [firstTabValue, setFirstTabValue] = React11.useState();
1118
+ const registerTab = React11.useCallback((v) => {
1192
1119
  if (!orderRef.current.includes(v)) {
1193
1120
  orderRef.current = [...orderRef.current, v];
1194
1121
  setFirstTabValue(orderRef.current[0]);
@@ -1198,18 +1125,25 @@ var Tabs = ({
1198
1125
  setFirstTabValue(orderRef.current[0]);
1199
1126
  };
1200
1127
  }, []);
1201
- const idPrefix = React16.useId();
1202
- const ctx = React16.useMemo(
1128
+ const idPrefix = React11.useId();
1129
+ const ctx = React11.useMemo(
1203
1130
  () => ({ value, setValue, variant, size, idPrefix, registerTab, firstTabValue }),
1204
1131
  [value, setValue, variant, size, idPrefix, registerTab, firstTabValue]
1205
1132
  );
1206
- return /* @__PURE__ */ jsx(TabsContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx("div", { className: cn("tabs", `tabs_variant_${variant}`, `tabs_size_${size}`, className), ...props, children }) });
1133
+ return /* @__PURE__ */ jsx(TabsContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
1134
+ "div",
1135
+ {
1136
+ className: cn("tabs", `tabs_variant_${variant}`, `tabs_size_${size}`, className),
1137
+ ...props,
1138
+ children
1139
+ }
1140
+ ) });
1207
1141
  };
1208
1142
  var TabList = ({ ariaLabel, className, children, ...props }) => {
1209
1143
  const { variant } = useTabsContext();
1210
- const listRef = React16.useRef(null);
1211
- const [indicator, setIndicator] = React16.useState(null);
1212
- const [hasMounted, setHasMounted] = React16.useState(false);
1144
+ const listRef = React11.useRef(null);
1145
+ const [indicator, setIndicator] = React11.useState(null);
1146
+ const [hasMounted, setHasMounted] = React11.useState(false);
1213
1147
  useSafeLayoutEffect(() => {
1214
1148
  const list = listRef.current;
1215
1149
  if (!list) return;
@@ -1272,7 +1206,7 @@ var Tab = ({ value, className, children, onClick, onKeyDown, ...props }) => {
1272
1206
  const panelId = `${ctx.idPrefix}-panel-${value}`;
1273
1207
  const tabId = `${ctx.idPrefix}-tab-${value}`;
1274
1208
  const { registerTab } = ctx;
1275
- React16.useEffect(() => registerTab(value), [registerTab, value]);
1209
+ React11.useEffect(() => registerTab(value), [registerTab, value]);
1276
1210
  const handleClick = (e) => {
1277
1211
  ctx.setValue(value);
1278
1212
  onClick?.(e);
@@ -1280,10 +1214,13 @@ var Tab = ({ value, className, children, onClick, onKeyDown, ...props }) => {
1280
1214
  const handleKeyDown2 = (e) => {
1281
1215
  onKeyDown?.(e);
1282
1216
  if (e.defaultPrevented) return;
1283
- if (e.key !== "ArrowLeft" && e.key !== "ArrowRight" && e.key !== "Home" && e.key !== "End") return;
1217
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight" && e.key !== "Home" && e.key !== "End")
1218
+ return;
1284
1219
  const list = e.currentTarget.closest('[role="tablist"]');
1285
1220
  if (!list) return;
1286
- const tabs = Array.from(list.querySelectorAll('[role="tab"]:not([disabled])'));
1221
+ const tabs = Array.from(
1222
+ list.querySelectorAll('[role="tab"]:not([disabled])')
1223
+ );
1287
1224
  const currentIndex = tabs.indexOf(e.currentTarget);
1288
1225
  if (currentIndex < 0) return;
1289
1226
  e.preventDefault();
@@ -1355,15 +1292,15 @@ var Popover = ({
1355
1292
  className
1356
1293
  }) => {
1357
1294
  const isControlled = openProp !== void 0;
1358
- const [internalOpen, setInternalOpen] = React16.useState(defaultOpen);
1295
+ const [internalOpen, setInternalOpen] = React11.useState(defaultOpen);
1359
1296
  const open = isControlled ? openProp : internalOpen;
1360
- const [shouldRender, setShouldRender] = React16.useState(open ?? false);
1297
+ const [shouldRender, setShouldRender] = React11.useState(open ?? false);
1361
1298
  if (open && !shouldRender) setShouldRender(true);
1362
- const wrapperRef = React16.useRef(null);
1363
- const positionRef = React16.useRef(null);
1364
- const popoverRef = React16.useRef(null);
1365
- const popoverId = React16.useId();
1366
- const setOpen = React16.useCallback(
1299
+ const wrapperRef = React11.useRef(null);
1300
+ const positionRef = React11.useRef(null);
1301
+ const popoverRef = React11.useRef(null);
1302
+ const popoverId = React11.useId();
1303
+ const setOpen = React11.useCallback(
1367
1304
  (next) => {
1368
1305
  if (!isControlled) setInternalOpen(next);
1369
1306
  onOpenChange?.(next);
@@ -1396,7 +1333,7 @@ var Popover = ({
1396
1333
  onExitComplete: () => setShouldRender(false)
1397
1334
  });
1398
1335
  useFocusTrap(popoverRef, open);
1399
- React16.useEffect(() => {
1336
+ React11.useEffect(() => {
1400
1337
  if (!open) return;
1401
1338
  const handleClick = (e) => {
1402
1339
  const target = e.target;
@@ -1410,7 +1347,7 @@ var Popover = ({
1410
1347
  useOverlayEscape(open, () => {
1411
1348
  setOpen(false);
1412
1349
  });
1413
- const triggerWithProps = React16.cloneElement(
1350
+ const triggerWithProps = React11.cloneElement(
1414
1351
  trigger,
1415
1352
  {
1416
1353
  onClick: (e) => {
@@ -1469,30 +1406,30 @@ var Tooltip = ({
1469
1406
  disabled = false,
1470
1407
  children
1471
1408
  }) => {
1472
- const [open, setOpen] = React16.useState(false);
1473
- const [shouldRender, setShouldRender] = React16.useState(false);
1409
+ const [open, setOpen] = React11.useState(false);
1410
+ const [shouldRender, setShouldRender] = React11.useState(false);
1474
1411
  if (open && !shouldRender) setShouldRender(true);
1475
- const timerRef = React16.useRef(null);
1476
- const tooltipId = React16.useId();
1477
- const wrapperRef = React16.useRef(null);
1478
- const positionRef = React16.useRef(null);
1412
+ const timerRef = React11.useRef(null);
1413
+ const tooltipId = React11.useId();
1414
+ const wrapperRef = React11.useRef(null);
1415
+ const positionRef = React11.useRef(null);
1479
1416
  const HIDE_DELAY = 120;
1480
- const show = React16.useCallback(() => {
1417
+ const show = React11.useCallback(() => {
1481
1418
  if (timerRef.current) clearTimeout(timerRef.current);
1482
1419
  timerRef.current = setTimeout(() => setOpen(true), delay);
1483
1420
  }, [delay]);
1484
- const hideNow = React16.useCallback(() => {
1421
+ const hideNow = React11.useCallback(() => {
1485
1422
  if (timerRef.current) clearTimeout(timerRef.current);
1486
1423
  setOpen(false);
1487
1424
  }, []);
1488
- const hide = React16.useCallback(() => {
1425
+ const hide = React11.useCallback(() => {
1489
1426
  if (timerRef.current) clearTimeout(timerRef.current);
1490
1427
  timerRef.current = setTimeout(() => setOpen(false), HIDE_DELAY);
1491
1428
  }, []);
1492
- const cancelHide = React16.useCallback(() => {
1429
+ const cancelHide = React11.useCallback(() => {
1493
1430
  if (timerRef.current) clearTimeout(timerRef.current);
1494
1431
  }, []);
1495
- React16.useEffect(() => {
1432
+ React11.useEffect(() => {
1496
1433
  return () => {
1497
1434
  if (timerRef.current) clearTimeout(timerRef.current);
1498
1435
  };
@@ -1525,7 +1462,7 @@ var Tooltip = ({
1525
1462
  });
1526
1463
  const child = children;
1527
1464
  const childProps = child.props;
1528
- const trigger = React16.cloneElement(child, {
1465
+ const trigger = React11.cloneElement(child, {
1529
1466
  onMouseEnter: (e) => {
1530
1467
  childProps.onMouseEnter?.(e);
1531
1468
  show();
@@ -1762,13 +1699,17 @@ var spacing = {
1762
1699
  "4": "4px",
1763
1700
  "6": "6px",
1764
1701
  "8": "8px",
1702
+ "10": "10px",
1765
1703
  "12": "12px",
1766
1704
  "16": "16px",
1767
1705
  "20": "20px",
1768
1706
  "24": "24px",
1769
1707
  "32": "32px",
1770
1708
  "40": "40px",
1771
- "48": "48px"
1709
+ "48": "48px",
1710
+ "64": "64px",
1711
+ "96": "96px",
1712
+ "128": "128px"
1772
1713
  };
1773
1714
 
1774
1715
  // src/styles/skeleton/index.ts
@@ -1803,6 +1744,7 @@ var baseTypography = {
1803
1744
  primary: "Pretendard"
1804
1745
  },
1805
1746
  fontSize: {
1747
+ "10": "10px",
1806
1748
  "12": "12px",
1807
1749
  "13": "13px",
1808
1750
  "14": "14px",
@@ -2474,8 +2416,8 @@ var MediaCard = ({
2474
2416
  ] });
2475
2417
  };
2476
2418
  var Prose = ({ size = "md", className, children, ref, ...props }) => {
2477
- const rootRef = React16.useRef(null);
2478
- React16.useImperativeHandle(ref, () => rootRef.current, []);
2419
+ const rootRef = React11.useRef(null);
2420
+ React11.useImperativeHandle(ref, () => rootRef.current, []);
2479
2421
  useSafeLayoutEffect(() => {
2480
2422
  const root = rootRef.current;
2481
2423
  if (!root) return;
@@ -2531,12 +2473,12 @@ var Checkbox = ({
2531
2473
  ref,
2532
2474
  ...props
2533
2475
  }) => {
2534
- const inputRef = React16.useRef(null);
2535
- React16.useImperativeHandle(
2476
+ const inputRef = React11.useRef(null);
2477
+ React11.useImperativeHandle(
2536
2478
  ref,
2537
2479
  () => inputRef.current
2538
2480
  );
2539
- React16.useEffect(() => {
2481
+ React11.useEffect(() => {
2540
2482
  if (!inputRef.current) return;
2541
2483
  inputRef.current.indeterminate = Boolean(indeterminate);
2542
2484
  }, [indeterminate]);
@@ -2594,8 +2536,8 @@ var Table = ({
2594
2536
  const isEmpty = !isLoading && data.length === 0;
2595
2537
  const getRowKey = (item, index) => rowKey?.(item) ?? String(index);
2596
2538
  const allRowKeys = selectable ? data.map((item, index) => getRowKey(item, index)) : [];
2597
- const rowClickHintId = React16.useId();
2598
- const selectedSet = React16.useMemo(() => new Set(selectedKeys ?? []), [selectedKeys]);
2539
+ const rowClickHintId = React11.useId();
2540
+ const selectedSet = React11.useMemo(() => new Set(selectedKeys ?? []), [selectedKeys]);
2599
2541
  const selectedCount = allRowKeys.filter((key) => selectedSet.has(key)).length;
2600
2542
  const isAllSelected = allRowKeys.length > 0 && selectedCount === allRowKeys.length;
2601
2543
  const isSomeSelected = selectedCount > 0 && !isAllSelected;
@@ -2818,9 +2760,9 @@ var AlertModal = ({
2818
2760
  onClose
2819
2761
  }) => {
2820
2762
  const dismiss = onCancel ?? onClose;
2821
- const panelRef = React16.useRef(null);
2822
- const titleId = React16.useId();
2823
- const messageId = React16.useId();
2763
+ const panelRef = React11.useRef(null);
2764
+ const titleId = React11.useId();
2765
+ const messageId = React11.useId();
2824
2766
  const [shouldRender, setShouldRender] = useState(isOpen);
2825
2767
  useFocusTrap(panelRef, isOpen);
2826
2768
  useOverlayEscape(isOpen, () => dismiss());
@@ -2844,7 +2786,7 @@ var AlertModal = ({
2844
2786
  immediate: reduced,
2845
2787
  config: OVERLAY_SPRING_CONFIG
2846
2788
  });
2847
- React16.useEffect(() => {
2789
+ React11.useEffect(() => {
2848
2790
  if (!shouldRender) return;
2849
2791
  lockBodyScroll();
2850
2792
  return unlockBodyScroll;
@@ -2927,10 +2869,7 @@ var LinearProgress = ({
2927
2869
  Array.from({ length: dotCount }, (_, i) => /* @__PURE__ */ jsx(
2928
2870
  "span",
2929
2871
  {
2930
- className: cn(
2931
- "linear_progress_step",
2932
- i <= clampedStep && "linear_progress_step_done"
2933
- ),
2872
+ className: cn("linear_progress_step", i <= clampedStep && "linear_progress_step_done"),
2934
2873
  "aria-hidden": "true"
2935
2874
  },
2936
2875
  i
@@ -2954,7 +2893,7 @@ var Spinner = ({ size = 24, ariaLabel = "\uB85C\uB529 \uC911" }) => {
2954
2893
  }
2955
2894
  );
2956
2895
  };
2957
- var ToastContext = React16.createContext(null);
2896
+ var ToastContext = React11.createContext(null);
2958
2897
  var VARIANT_ICONS = {
2959
2898
  success: /* @__PURE__ */ jsx(CheckCircle2, { size: iconSize.md }),
2960
2899
  error: /* @__PURE__ */ jsx(XCircle, { size: iconSize.md }),
@@ -2963,9 +2902,9 @@ var VARIANT_ICONS = {
2963
2902
  default: /* @__PURE__ */ jsx(Bell, { size: iconSize.md })
2964
2903
  };
2965
2904
  var ToastItemComponent = ({ item, onRemove, closeAriaLabel }) => {
2966
- const [visible, setVisible] = React16.useState(true);
2967
- const closingRef = React16.useRef(false);
2968
- const rootRef = React16.useRef(null);
2905
+ const [visible, setVisible] = React11.useState(true);
2906
+ const closingRef = React11.useRef(false);
2907
+ const rootRef = React11.useRef(null);
2969
2908
  const style = useSpringPresence({
2970
2909
  visible,
2971
2910
  from: "translateX(20px)",
@@ -2985,7 +2924,7 @@ var ToastItemComponent = ({ item, onRemove, closeAriaLabel }) => {
2985
2924
  onRemove(item.id);
2986
2925
  }
2987
2926
  });
2988
- const close = React16.useCallback(() => {
2927
+ const close = React11.useCallback(() => {
2989
2928
  if (closingRef.current) return;
2990
2929
  closingRef.current = true;
2991
2930
  setVisible(false);
@@ -3020,19 +2959,19 @@ var ToastProvider = ({
3020
2959
  closeAriaLabel = "\uB2EB\uAE30",
3021
2960
  regionLabel = "\uC54C\uB9BC"
3022
2961
  }) => {
3023
- const [toasts, setToasts] = React16.useState([]);
2962
+ const [toasts, setToasts] = React11.useState([]);
3024
2963
  const isMounted = useIsMounted();
3025
- const addToast = React16.useCallback(
2964
+ const addToast = React11.useCallback(
3026
2965
  (message, variant, duration = 3e3) => {
3027
2966
  const id = crypto.randomUUID();
3028
2967
  setToasts((prev) => [{ id, message, variant, duration }, ...prev].slice(0, maxCount));
3029
2968
  },
3030
2969
  [maxCount]
3031
2970
  );
3032
- const removeToast = React16.useCallback((id) => {
2971
+ const removeToast = React11.useCallback((id) => {
3033
2972
  setToasts((prev) => prev.filter((t) => t.id !== id));
3034
2973
  }, []);
3035
- const contextValue = React16.useMemo(() => ({ addToast }), [addToast]);
2974
+ const contextValue = React11.useMemo(() => ({ addToast }), [addToast]);
3036
2975
  return /* @__PURE__ */ jsxs(ToastContext.Provider, { value: contextValue, children: [
3037
2976
  children,
3038
2977
  isMounted && createPortal(
@@ -3472,9 +3411,9 @@ var DatePicker = ({
3472
3411
  minDateSrFormat = "\uCD5C\uC18C \uB0A0\uC9DC: {date}",
3473
3412
  selectableRangeUntilTodaySrText = "\uC624\uB298\uAE4C\uC9C0 \uC120\uD0DD \uAC00\uB2A5"
3474
3413
  }) => {
3475
- const groupId = React16.useId();
3476
- const constraintId = React16.useId();
3477
- const { todayYear, todayMonth, todayDay } = React16.useMemo(() => {
3414
+ const groupId = React11.useId();
3415
+ const constraintId = React11.useId();
3416
+ const { todayYear, todayMonth, todayDay } = React11.useMemo(() => {
3478
3417
  const now = /* @__PURE__ */ new Date();
3479
3418
  return {
3480
3419
  todayYear: now.getFullYear(),
@@ -3483,7 +3422,7 @@ var DatePicker = ({
3483
3422
  };
3484
3423
  }, []);
3485
3424
  const endYear = endYearProp ?? todayYear + 10;
3486
- const parsed = React16.useMemo(() => {
3425
+ const parsed = React11.useMemo(() => {
3487
3426
  if (!value) return { year: 0, month: 0, day: 0 };
3488
3427
  const [y, m, d] = value.split("-").map(Number);
3489
3428
  return {
@@ -3492,7 +3431,7 @@ var DatePicker = ({
3492
3431
  day: d || 0
3493
3432
  };
3494
3433
  }, [value]);
3495
- const min = React16.useMemo(() => {
3434
+ const min = React11.useMemo(() => {
3496
3435
  if (!minDate) return { year: 0, month: 0, day: 0 };
3497
3436
  const [y, m, d] = minDate.split("-").map(Number);
3498
3437
  return {
@@ -3512,7 +3451,7 @@ var DatePicker = ({
3512
3451
  min.year > 0 && min.month > 0 && year === min.year && month === min.month ? min.day : 1
3513
3452
  )
3514
3453
  );
3515
- const maxDay = React16.useMemo(() => {
3454
+ const maxDay = React11.useMemo(() => {
3516
3455
  if (!year || !month) return 31;
3517
3456
  const daysInMonth = getDaysInMonth(year, month);
3518
3457
  if (selectableRange === "until-today" && year === todayYear && month === todayMonth) {
@@ -3520,28 +3459,28 @@ var DatePicker = ({
3520
3459
  }
3521
3460
  return daysInMonth;
3522
3461
  }, [year, month, selectableRange, todayYear, todayMonth, todayDay]);
3523
- const yearOptions = React16.useMemo(
3462
+ const yearOptions = React11.useMemo(
3524
3463
  () => range(startYear, maxYear).map((y) => ({
3525
3464
  value: String(y),
3526
3465
  label: String(y)
3527
3466
  })),
3528
3467
  [startYear, maxYear]
3529
3468
  );
3530
- const monthOptions = React16.useMemo(
3469
+ const monthOptions = React11.useMemo(
3531
3470
  () => range(minMonth, Math.max(minMonth, maxMonth)).map((m) => ({
3532
3471
  value: String(m),
3533
3472
  label: pad(m)
3534
3473
  })),
3535
3474
  [minMonth, maxMonth]
3536
3475
  );
3537
- const dayOptions = React16.useMemo(
3476
+ const dayOptions = React11.useMemo(
3538
3477
  () => range(minDay, Math.max(minDay, maxDay)).map((d) => ({
3539
3478
  value: String(d),
3540
3479
  label: pad(d)
3541
3480
  })),
3542
3481
  [minDay, maxDay]
3543
3482
  );
3544
- const emit = React16.useCallback(
3483
+ const emit = React11.useCallback(
3545
3484
  (yy, mm, dd) => {
3546
3485
  const cb = onValueChange ?? onChange;
3547
3486
  if (mode === "year-month") {
@@ -3553,7 +3492,7 @@ var DatePicker = ({
3553
3492
  },
3554
3493
  [mode, onValueChange, onChange]
3555
3494
  );
3556
- const handleYearChange = React16.useCallback(
3495
+ const handleYearChange = React11.useCallback(
3557
3496
  (raw) => {
3558
3497
  if (!raw) return;
3559
3498
  const newYear = Number(raw);
@@ -3570,14 +3509,14 @@ var DatePicker = ({
3570
3509
  },
3571
3510
  [month, day, min.year, min.month, selectableRange, todayYear, todayMonth, emit]
3572
3511
  );
3573
- const handleMonthChange = React16.useCallback(
3512
+ const handleMonthChange = React11.useCallback(
3574
3513
  (raw) => {
3575
3514
  if (!raw || !year) return;
3576
3515
  emit(year, Number(raw), day || void 0);
3577
3516
  },
3578
3517
  [year, day, emit]
3579
3518
  );
3580
- const handleDayChange = React16.useCallback(
3519
+ const handleDayChange = React11.useCallback(
3581
3520
  (raw) => {
3582
3521
  if (!raw || !year || !month) return;
3583
3522
  emit(year, month, Number(raw));
@@ -3661,11 +3600,11 @@ var FileInput = ({
3661
3600
  onChange,
3662
3601
  ...props
3663
3602
  }) => {
3664
- const inputId = React16.useId();
3665
- const helperId = React16.useId();
3666
- const inputRef = React16.useRef(null);
3667
- const [previewUrls, setPreviewUrls] = React16.useState([]);
3668
- const previewUrlsRef = React16.useRef([]);
3603
+ const inputId = React11.useId();
3604
+ const helperId = React11.useId();
3605
+ const inputRef = React11.useRef(null);
3606
+ const [previewUrls, setPreviewUrls] = React11.useState([]);
3607
+ const previewUrlsRef = React11.useRef([]);
3669
3608
  const isPreviewVariant = variant === "preview";
3670
3609
  const showPreview = isPreviewVariant || preview;
3671
3610
  const handleChange = (e) => {
@@ -3706,7 +3645,7 @@ var FileInput = ({
3706
3645
  }
3707
3646
  onFiles?.(null);
3708
3647
  };
3709
- React16.useEffect(() => {
3648
+ React11.useEffect(() => {
3710
3649
  return () => {
3711
3650
  for (const url of previewUrlsRef.current) {
3712
3651
  URL.revokeObjectURL(url);
@@ -3744,14 +3683,7 @@ var FileInput = ({
3744
3683
  style: { width: previewSize, height: previewSize },
3745
3684
  children: hasImage ? (
3746
3685
  // biome-ignore lint/performance/noImgElement: framework-agnostic DS - host app should swap with next/image if needed
3747
- /* @__PURE__ */ jsx(
3748
- "img",
3749
- {
3750
- src: previewUrls[0],
3751
- alt: "",
3752
- className: "file_input_preview_image"
3753
- }
3754
- )
3686
+ /* @__PURE__ */ jsx("img", { src: previewUrls[0], alt: "", className: "file_input_preview_image" })
3755
3687
  ) : /* @__PURE__ */ jsxs("span", { className: "file_input_preview_empty", children: [
3756
3688
  /* @__PURE__ */ jsx(Image, { size: iconSize.xl, "aria-hidden": "true" }),
3757
3689
  /* @__PURE__ */ jsx("span", { className: "file_input_preview_empty_text", children: label })
@@ -3771,15 +3703,7 @@ var FileInput = ({
3771
3703
  supportingText && /* @__PURE__ */ jsx("span", { id: helperId, className: "file_input_helper", children: supportingText }),
3772
3704
  !isPreviewVariant && previewUrls.length > 0 && /* @__PURE__ */ jsx("div", { className: "file_input_preview", children: previewUrls.map((url) => (
3773
3705
  // biome-ignore lint/performance/noImgElement: framework-agnostic DS - host app should swap with next/image if needed
3774
- /* @__PURE__ */ jsx(
3775
- "img",
3776
- {
3777
- src: url,
3778
- alt: "",
3779
- className: "file_input_preview_img"
3780
- },
3781
- url
3782
- )
3706
+ /* @__PURE__ */ jsx("img", { src: url, alt: "", className: "file_input_preview_img" }, url)
3783
3707
  )) })
3784
3708
  ] });
3785
3709
  };
@@ -4115,12 +4039,12 @@ var OtpInput = ({
4115
4039
  ariaLabel = "OTP \uC785\uB825",
4116
4040
  className
4117
4041
  }) => {
4118
- const inputsRef = React16.useRef([]);
4119
- const isTypingRef = React16.useRef(false);
4120
- React16.useEffect(() => {
4042
+ const inputsRef = React11.useRef([]);
4043
+ const isTypingRef = React11.useRef(false);
4044
+ React11.useEffect(() => {
4121
4045
  if (autoFocus) inputsRef.current[0]?.focus();
4122
4046
  }, [autoFocus]);
4123
- const digits = React16.useMemo(() => {
4047
+ const digits = React11.useMemo(() => {
4124
4048
  const chars = value.split("").slice(0, length);
4125
4049
  while (chars.length < length) chars.push("");
4126
4050
  return chars;
@@ -4197,7 +4121,7 @@ var OtpInput = ({
4197
4121
  focusInput(nextIndex);
4198
4122
  };
4199
4123
  const rootClassName = cn("otp_input", className);
4200
- const supportingId = React16.useId();
4124
+ const supportingId = React11.useId();
4201
4125
  return (
4202
4126
  // biome-ignore lint/a11y/useSemanticElements: <fieldset> would force border/legend styles; role=group is the WAI-ARIA equivalent for OTP grouping
4203
4127
  /* @__PURE__ */ jsxs("div", { className: rootClassName, role: "group", "aria-label": ariaLabel, children: [
@@ -4241,9 +4165,9 @@ var OtpInput = ({
4241
4165
  );
4242
4166
  };
4243
4167
  OtpInput.displayName = "OtpInput";
4244
- var RadioGroupContext = React16.createContext(null);
4168
+ var RadioGroupContext = React11.createContext(null);
4245
4169
  function useRadioGroupContext() {
4246
- return React16.useContext(RadioGroupContext);
4170
+ return React11.useContext(RadioGroupContext);
4247
4171
  }
4248
4172
  var RadioGroup = ({
4249
4173
  value: controlledValue,
@@ -4261,21 +4185,21 @@ var RadioGroup = ({
4261
4185
  ...props
4262
4186
  }) => {
4263
4187
  const isControlled = controlledValue !== void 0;
4264
- const [internalValue, setInternalValue] = React16.useState(defaultValue);
4188
+ const [internalValue, setInternalValue] = React11.useState(defaultValue);
4265
4189
  const value = isControlled ? controlledValue : internalValue;
4266
- const generatedName = React16.useId();
4190
+ const generatedName = React11.useId();
4267
4191
  const name = nameProp ?? generatedName;
4268
- const idPrefix = React16.useId();
4192
+ const idPrefix = React11.useId();
4269
4193
  const labelId = label ? `${idPrefix}-label` : void 0;
4270
4194
  const helperId = supportingText ? `${idPrefix}-help` : void 0;
4271
- const onChange = React16.useCallback(
4195
+ const onChange = React11.useCallback(
4272
4196
  (next) => {
4273
4197
  if (!isControlled) setInternalValue(next);
4274
4198
  onValueChange?.(next);
4275
4199
  },
4276
4200
  [isControlled, onValueChange]
4277
4201
  );
4278
- const ctx = React16.useMemo(
4202
+ const ctx = React11.useMemo(
4279
4203
  () => ({ name, value, onChange, size, disabled }),
4280
4204
  [name, value, onChange, size, disabled]
4281
4205
  );
@@ -4384,9 +4308,7 @@ var Textarea = ({
4384
4308
  const helperId = supportingText ? `${inputId}-help` : void 0;
4385
4309
  const isControlled = value !== void 0;
4386
4310
  const applyTransform = (nextValue) => transformValue ? transformValue(nextValue) : nextValue;
4387
- const [innerValue, setInnerValue] = useState(
4388
- () => applyTransform(value ?? defaultValue ?? "")
4389
- );
4311
+ const [innerValue, setInnerValue] = useState(() => applyTransform(value ?? defaultValue ?? ""));
4390
4312
  const isComposingRef = useRef(false);
4391
4313
  const innerRef = useRef(null);
4392
4314
  const lastEmittedValueRef = useRef(innerValue);
@@ -4647,7 +4569,7 @@ var Toggle = ({
4647
4569
  ...props
4648
4570
  }) => {
4649
4571
  const isControlled = checked !== void 0;
4650
- const [innerChecked, setInnerChecked] = React16.useState(!!defaultChecked);
4572
+ const [innerChecked, setInnerChecked] = React11.useState(!!defaultChecked);
4651
4573
  const isOn = isControlled ? !!checked : innerChecked;
4652
4574
  const handleToggle = (e) => {
4653
4575
  props.onClick?.(e);
@@ -4737,7 +4659,7 @@ var Pagination = ({
4737
4659
  const emit = onPageChange ?? onChange;
4738
4660
  const prevDisabled = page <= 1;
4739
4661
  const nextDisabled = page >= totalPages;
4740
- const items = React16.useMemo(() => getPaginationItems(page, totalPages), [page, totalPages]);
4662
+ const items = React11.useMemo(() => getPaginationItems(page, totalPages), [page, totalPages]);
4741
4663
  return /* @__PURE__ */ jsxs("nav", { className: "pagination", "aria-label": navLabel, children: [
4742
4664
  /* @__PURE__ */ jsx(
4743
4665
  "button",
@@ -4804,15 +4726,15 @@ var Drawer = ({
4804
4726
  className,
4805
4727
  ...props
4806
4728
  }) => {
4807
- const lastContentRef = React16.useRef({ children, title, footer });
4729
+ const lastContentRef = React11.useRef({ children, title, footer });
4808
4730
  if (open) lastContentRef.current = { children, title, footer };
4809
4731
  const content = open ? { children, title, footer } : lastContentRef.current;
4810
4732
  const overlayDismissible = dismissible ?? closeOnOverlay;
4811
4733
  const escapeDismissible = dismissible ?? true;
4812
- const panelRef = React16.useRef(null);
4813
- const pressedOverlayRef = React16.useRef(false);
4814
- const titleId = React16.useId();
4815
- const [shouldRender, setShouldRender] = React16.useState(open);
4734
+ const panelRef = React11.useRef(null);
4735
+ const pressedOverlayRef = React11.useRef(false);
4736
+ const titleId = React11.useId();
4737
+ const [shouldRender, setShouldRender] = React11.useState(open);
4816
4738
  const reduced = useReducedMotion();
4817
4739
  const isMounted = useIsMounted();
4818
4740
  useFocusTrap(panelRef, open && isMounted);
@@ -4836,7 +4758,7 @@ var Drawer = ({
4836
4758
  immediate: reduced,
4837
4759
  config: { tension: 280, friction: 28, clamp: !open }
4838
4760
  });
4839
- React16.useEffect(() => {
4761
+ React11.useEffect(() => {
4840
4762
  if (!open) return;
4841
4763
  lockBodyScroll();
4842
4764
  return unlockBodyScroll;
@@ -4876,16 +4798,7 @@ var Drawer = ({
4876
4798
  if (e.key !== "Escape") e.stopPropagation();
4877
4799
  },
4878
4800
  children: [
4879
- showCloseIcon && onClose && /* @__PURE__ */ jsx(
4880
- "button",
4881
- {
4882
- type: "button",
4883
- className: "drawer_close",
4884
- onClick: onClose,
4885
- "aria-label": closeLabel,
4886
- children: /* @__PURE__ */ jsx(X, { size: iconSize.md, "aria-hidden": "true" })
4887
- }
4888
- ),
4801
+ showCloseIcon && onClose && /* @__PURE__ */ jsx("button", { type: "button", className: "drawer_close", onClick: onClose, "aria-label": closeLabel, children: /* @__PURE__ */ jsx(X, { size: iconSize.md, "aria-hidden": "true" }) }),
4889
4802
  content.title && /* @__PURE__ */ jsx("div", { className: "drawer_header", children: /* @__PURE__ */ jsx("h2", { id: titleId, className: "drawer_title", children: content.title }) }),
4890
4803
  content.children && // 본문이 스크롤 컨테이너라 키보드로도 스크롤할 수 있어야 한다(axe
4891
4804
  // `scrollable-region-focusable`). 다만 초기 포커스 대상에서는 제외한다 - 안쪽에
@@ -4919,15 +4832,15 @@ var Modal = ({
4919
4832
  onExited,
4920
4833
  ...props
4921
4834
  }) => {
4922
- const lastContentRef = React16.useRef({ children, title, description, footer });
4835
+ const lastContentRef = React11.useRef({ children, title, description, footer });
4923
4836
  if (open) lastContentRef.current = { children, title, description, footer };
4924
4837
  const content = open ? { children, title, description, footer } : lastContentRef.current;
4925
4838
  const overlayDismissible = dismissible ?? closeOnOverlay;
4926
4839
  const escapeDismissible = dismissible ?? true;
4927
- const panelRef = React16.useRef(null);
4928
- const pressedOverlayRef = React16.useRef(false);
4929
- const titleId = React16.useId();
4930
- const [shouldRender, setShouldRender] = React16.useState(open);
4840
+ const panelRef = React11.useRef(null);
4841
+ const pressedOverlayRef = React11.useRef(false);
4842
+ const titleId = React11.useId();
4843
+ const [shouldRender, setShouldRender] = React11.useState(open);
4931
4844
  const isMounted = useIsMounted();
4932
4845
  useFocusTrap(panelRef, open && isMounted);
4933
4846
  useOverlayEscape(open && isMounted, () => {
@@ -4955,7 +4868,7 @@ var Modal = ({
4955
4868
  immediate: reduced,
4956
4869
  config: OVERLAY_SPRING_CONFIG
4957
4870
  });
4958
- React16.useEffect(() => {
4871
+ React11.useEffect(() => {
4959
4872
  if (!open) return;
4960
4873
  lockBodyScroll();
4961
4874
  return unlockBodyScroll;
@@ -5015,9 +4928,9 @@ var Modal = ({
5015
4928
  document.body
5016
4929
  );
5017
4930
  };
5018
- var ThemeContext = React16.createContext(null);
4931
+ var ThemeContext = React11.createContext(null);
5019
4932
  var useTheme = () => {
5020
- const ctx = React16.useContext(ThemeContext);
4933
+ const ctx = React11.useContext(ThemeContext);
5021
4934
  if (!ctx) {
5022
4935
  throw new Error(
5023
4936
  '[Bigtablet DS] useTheme\uB294 <ThemeProvider> \uC548\uC5D0\uC11C\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.\n\n\uC571 \uCD5C\uC0C1\uB2E8\uC5D0 <ThemeProvider>\uB85C \uAC10\uC2F8\uC8FC\uC138\uC694:\n <ThemeProvider mode="system">\n <YourApp />\n </ThemeProvider>'
@@ -5041,15 +4954,15 @@ var ThemeProvider = ({
5041
4954
  targetSelector,
5042
4955
  children
5043
4956
  }) => {
5044
- const [mode, setModeState] = React16.useState(defaultMode);
5045
- const [systemDark, setSystemDark] = React16.useState(false);
5046
- React16.useEffect(() => {
4957
+ const [mode, setModeState] = React11.useState(defaultMode);
4958
+ const [systemDark, setSystemDark] = React11.useState(false);
4959
+ React11.useEffect(() => {
5047
4960
  setModeState(readStored(storageKey) ?? defaultMode);
5048
4961
  if (isClient) {
5049
4962
  setSystemDark(window.matchMedia("(prefers-color-scheme: dark)").matches);
5050
4963
  }
5051
4964
  }, [storageKey, defaultMode]);
5052
- React16.useEffect(() => {
4965
+ React11.useEffect(() => {
5053
4966
  if (!isClient) return;
5054
4967
  const mq = window.matchMedia("(prefers-color-scheme: dark)");
5055
4968
  const handler = (e) => setSystemDark(e.matches);
@@ -5057,7 +4970,7 @@ var ThemeProvider = ({
5057
4970
  return () => mq.removeEventListener("change", handler);
5058
4971
  }, []);
5059
4972
  const resolved = mode === "system" ? systemDark ? "dark" : "light" : mode;
5060
- React16.useEffect(() => {
4973
+ React11.useEffect(() => {
5061
4974
  if (!isClient) return;
5062
4975
  const target = targetSelector ? document.querySelector(targetSelector) : document.documentElement;
5063
4976
  if (!target) return;
@@ -5067,7 +4980,7 @@ var ThemeProvider = ({
5067
4980
  target.setAttribute("data-theme", mode);
5068
4981
  }
5069
4982
  }, [mode, targetSelector]);
5070
- const setMode = React16.useCallback(
4983
+ const setMode = React11.useCallback(
5071
4984
  (next) => {
5072
4985
  setModeState(next);
5073
4986
  if (storageKey && isClient) {
@@ -5079,7 +4992,7 @@ var ThemeProvider = ({
5079
4992
  },
5080
4993
  [storageKey]
5081
4994
  );
5082
- const value = React16.useMemo(
4995
+ const value = React11.useMemo(
5083
4996
  () => ({ mode, resolved, setMode }),
5084
4997
  [mode, resolved, setMode]
5085
4998
  );
@@ -5149,12 +5062,7 @@ var Section = ({
5149
5062
  Tag,
5150
5063
  {
5151
5064
  ref,
5152
- className: cn(
5153
- "section",
5154
- `section_spacing_${spacing2}`,
5155
- `section_bg_${bg}`,
5156
- className
5157
- ),
5065
+ className: cn("section", `section_spacing_${spacing2}`, `section_bg_${bg}`, className),
5158
5066
  ...props,
5159
5067
  children
5160
5068
  }
@@ -5,6 +5,7 @@ $spacing_3: 3px;
5
5
  $spacing_4: 4px;
6
6
  $spacing_6: 6px;
7
7
  $spacing_8: 8px;
8
+ $spacing_10: 10px;
8
9
  $spacing_12: 12px;
9
10
  $spacing_16: 16px;
10
11
  $spacing_20: 20px;
@@ -12,3 +13,8 @@ $spacing_24: 24px;
12
13
  $spacing_32: 32px;
13
14
  $spacing_40: 40px;
14
15
  $spacing_48: 48px;
16
+ // 레이아웃 리듬 - 컴포넌트 내부 여백이 아니라 Section 처럼 화면 단위 블록의 상하 여백에 쓴다.
17
+ // 48 에서 스케일이 끝나 Section 이 raw 64/96/128 을 적고 있었다.
18
+ $spacing_64: 64px;
19
+ $spacing_96: 96px;
20
+ $spacing_128: 128px;
@@ -4,6 +4,9 @@ $font_family_primary: "Pretendard", sans-serif;
4
4
 
5
5
  // ── Base: Font size ───────────────────────────────────────────────────────────
6
6
 
7
+ // 10px - 본문에는 쓰지 않는다. avatar xs(24px 원) 이니셜과 badge count 처럼 장식적인 숫자·글자
8
+ // 전용이다. 그 자리에 12px 을 넣으면 16px 카운트 뱃지를 넘친다.
9
+ $font_size_10: 10px;
7
10
  $font_size_12: 12px;
8
11
  $font_size_13: 13px;
9
12
  $font_size_14: 14px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigtablet/design-system",
3
- "version": "3.14.2",
3
+ "version": "3.15.0",
4
4
  "description": "Bigtablet Design System UI Components",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
@@ -50,6 +50,7 @@
50
50
  "check:css-vars": "scripts/check-css-vars.sh",
51
51
  "check:prose": "scripts/check-prose-headings.sh",
52
52
  "check:defaults": "python3 scripts/check-prop-defaults.py",
53
+ "check:geometry": "python3 scripts/check-overlay-geometry.py",
53
54
  "size": "size-limit",
54
55
  "prepare": "husky"
55
56
  },