@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 +12 -5
- package/dist/index.d.ts +5 -0
- package/dist/index.js +206 -298
- package/dist/styles/spacing/_index.scss +6 -0
- package/dist/styles/typography/_index.scss +3 -0
- package/package.json +2 -1
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:
|
|
5712
|
-
right:
|
|
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:
|
|
5825
|
-
right:
|
|
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:
|
|
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
|
|
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 =
|
|
62
|
-
|
|
61
|
+
const handlerRef = React11.useRef(onEscape);
|
|
62
|
+
React11.useEffect(() => {
|
|
63
63
|
handlerRef.current = onEscape;
|
|
64
64
|
});
|
|
65
|
-
|
|
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] =
|
|
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 =
|
|
266
|
-
|
|
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] =
|
|
317
|
-
|
|
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
|
|
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] =
|
|
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] =
|
|
424
|
+
const [internalKeys, setInternalKeys] = React11.useState(defaultOpenKeys);
|
|
425
425
|
const open = isControlled ? controlledKeys ?? [] : internalKeys;
|
|
426
|
-
const idPrefix =
|
|
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] =
|
|
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
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
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] =
|
|
726
|
-
const wrapperRef =
|
|
727
|
-
const itemRefs =
|
|
728
|
-
const menuId =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
"
|
|
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
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
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
|
-
|
|
1055
|
-
|
|
1056
|
-
"
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
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] =
|
|
1023
|
+
const [internalCollapsed, setInternalCollapsed] = React11.useState(defaultCollapsed);
|
|
1085
1024
|
const collapsed = isControlled ? collapsedProp : internalCollapsed;
|
|
1086
|
-
const toggle =
|
|
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 =
|
|
1086
|
+
var TabsContext = React11.createContext(null);
|
|
1160
1087
|
function useTabsContext() {
|
|
1161
|
-
const ctx =
|
|
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] =
|
|
1107
|
+
const [internalValue, setInternalValue] = React11.useState(defaultValue);
|
|
1181
1108
|
const value = isControlled ? controlledValue : internalValue;
|
|
1182
|
-
const setValue =
|
|
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 =
|
|
1190
|
-
const [firstTabValue, setFirstTabValue] =
|
|
1191
|
-
const registerTab =
|
|
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 =
|
|
1202
|
-
const ctx =
|
|
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(
|
|
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 =
|
|
1211
|
-
const [indicator, setIndicator] =
|
|
1212
|
-
const [hasMounted, setHasMounted] =
|
|
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
|
-
|
|
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")
|
|
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(
|
|
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] =
|
|
1295
|
+
const [internalOpen, setInternalOpen] = React11.useState(defaultOpen);
|
|
1359
1296
|
const open = isControlled ? openProp : internalOpen;
|
|
1360
|
-
const [shouldRender, setShouldRender] =
|
|
1297
|
+
const [shouldRender, setShouldRender] = React11.useState(open ?? false);
|
|
1361
1298
|
if (open && !shouldRender) setShouldRender(true);
|
|
1362
|
-
const wrapperRef =
|
|
1363
|
-
const positionRef =
|
|
1364
|
-
const popoverRef =
|
|
1365
|
-
const popoverId =
|
|
1366
|
-
const setOpen =
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
1473
|
-
const [shouldRender, setShouldRender] =
|
|
1409
|
+
const [open, setOpen] = React11.useState(false);
|
|
1410
|
+
const [shouldRender, setShouldRender] = React11.useState(false);
|
|
1474
1411
|
if (open && !shouldRender) setShouldRender(true);
|
|
1475
|
-
const timerRef =
|
|
1476
|
-
const tooltipId =
|
|
1477
|
-
const wrapperRef =
|
|
1478
|
-
const positionRef =
|
|
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 =
|
|
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 =
|
|
1421
|
+
const hideNow = React11.useCallback(() => {
|
|
1485
1422
|
if (timerRef.current) clearTimeout(timerRef.current);
|
|
1486
1423
|
setOpen(false);
|
|
1487
1424
|
}, []);
|
|
1488
|
-
const hide =
|
|
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 =
|
|
1429
|
+
const cancelHide = React11.useCallback(() => {
|
|
1493
1430
|
if (timerRef.current) clearTimeout(timerRef.current);
|
|
1494
1431
|
}, []);
|
|
1495
|
-
|
|
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 =
|
|
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 =
|
|
2478
|
-
|
|
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 =
|
|
2535
|
-
|
|
2476
|
+
const inputRef = React11.useRef(null);
|
|
2477
|
+
React11.useImperativeHandle(
|
|
2536
2478
|
ref,
|
|
2537
2479
|
() => inputRef.current
|
|
2538
2480
|
);
|
|
2539
|
-
|
|
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 =
|
|
2598
|
-
const selectedSet =
|
|
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 =
|
|
2822
|
-
const titleId =
|
|
2823
|
-
const messageId =
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
2967
|
-
const closingRef =
|
|
2968
|
-
const rootRef =
|
|
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 =
|
|
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] =
|
|
2962
|
+
const [toasts, setToasts] = React11.useState([]);
|
|
3024
2963
|
const isMounted = useIsMounted();
|
|
3025
|
-
const addToast =
|
|
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 =
|
|
2971
|
+
const removeToast = React11.useCallback((id) => {
|
|
3033
2972
|
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
3034
2973
|
}, []);
|
|
3035
|
-
const contextValue =
|
|
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 =
|
|
3476
|
-
const constraintId =
|
|
3477
|
-
const { todayYear, todayMonth, todayDay } =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3665
|
-
const helperId =
|
|
3666
|
-
const inputRef =
|
|
3667
|
-
const [previewUrls, setPreviewUrls] =
|
|
3668
|
-
const previewUrlsRef =
|
|
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
|
-
|
|
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 =
|
|
4119
|
-
const isTypingRef =
|
|
4120
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
4168
|
+
var RadioGroupContext = React11.createContext(null);
|
|
4245
4169
|
function useRadioGroupContext() {
|
|
4246
|
-
return
|
|
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] =
|
|
4188
|
+
const [internalValue, setInternalValue] = React11.useState(defaultValue);
|
|
4265
4189
|
const value = isControlled ? controlledValue : internalValue;
|
|
4266
|
-
const generatedName =
|
|
4190
|
+
const generatedName = React11.useId();
|
|
4267
4191
|
const name = nameProp ?? generatedName;
|
|
4268
|
-
const idPrefix =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
4813
|
-
const pressedOverlayRef =
|
|
4814
|
-
const titleId =
|
|
4815
|
-
const [shouldRender, setShouldRender] =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
4928
|
-
const pressedOverlayRef =
|
|
4929
|
-
const titleId =
|
|
4930
|
-
const [shouldRender, setShouldRender] =
|
|
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
|
-
|
|
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 =
|
|
4931
|
+
var ThemeContext = React11.createContext(null);
|
|
5019
4932
|
var useTheme = () => {
|
|
5020
|
-
const ctx =
|
|
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] =
|
|
5045
|
-
const [systemDark, setSystemDark] =
|
|
5046
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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.
|
|
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
|
},
|