@designbasekorea/ui 0.2.27 → 0.2.28
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.esm.js +23 -21
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +23 -21
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +23 -21
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -5477,12 +5477,14 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5477
5477
|
return; const t = e.touches[0]; updateFromArea(t.clientX, t.clientY); };
|
|
5478
5478
|
const onAreaTouchEnd = () => { dragging.current = false; };
|
|
5479
5479
|
/** 슬라이더 */
|
|
5480
|
-
const onHueChange = (e) =>
|
|
5481
|
-
|
|
5480
|
+
const onHueChange = useCallback((e) => {
|
|
5481
|
+
setH(parseInt(e.target.value, 10));
|
|
5482
|
+
}, []);
|
|
5483
|
+
const onAlphaChange = useCallback((e) => {
|
|
5482
5484
|
const newAlpha = parseInt(e.target.value, 10);
|
|
5483
5485
|
setA(newAlpha);
|
|
5484
5486
|
setAlphaInput(String(newAlpha)); // 실시간 동기화
|
|
5485
|
-
};
|
|
5487
|
+
}, []);
|
|
5486
5488
|
/** 컬러 인풋: 엔터로만 확정 */
|
|
5487
5489
|
const tryCommitColorInput = () => {
|
|
5488
5490
|
const str = colorInput.trim();
|
|
@@ -5551,7 +5553,7 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5551
5553
|
setAlphaInput(String(a));
|
|
5552
5554
|
};
|
|
5553
5555
|
/** 복사 */
|
|
5554
|
-
const onCopy = async () => {
|
|
5556
|
+
const onCopy = useCallback(async () => {
|
|
5555
5557
|
try {
|
|
5556
5558
|
await navigator.clipboard.writeText(formatted);
|
|
5557
5559
|
setIsCopied(true);
|
|
@@ -5560,9 +5562,9 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5560
5562
|
catch (e) {
|
|
5561
5563
|
console.error(e);
|
|
5562
5564
|
}
|
|
5563
|
-
};
|
|
5565
|
+
}, [formatted]);
|
|
5564
5566
|
/** EyeDropper */
|
|
5565
|
-
const onEyedrop = async () => {
|
|
5567
|
+
const onEyedrop = useCallback(async () => {
|
|
5566
5568
|
try {
|
|
5567
5569
|
if ('EyeDropper' in window) {
|
|
5568
5570
|
const eye = new window.EyeDropper();
|
|
@@ -5580,21 +5582,21 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5580
5582
|
catch (e) {
|
|
5581
5583
|
console.error(e);
|
|
5582
5584
|
}
|
|
5583
|
-
};
|
|
5585
|
+
}, []);
|
|
5584
5586
|
/** 모달용 핸들러 */
|
|
5585
|
-
const handleModalOpen = () => {
|
|
5587
|
+
const handleModalOpen = useCallback(() => {
|
|
5586
5588
|
if (type === 'modal') {
|
|
5587
5589
|
setTempColor(formatted);
|
|
5588
5590
|
}
|
|
5589
5591
|
setIsOpen(true);
|
|
5590
|
-
};
|
|
5591
|
-
const handleModalApply = () => {
|
|
5592
|
+
}, [type, formatted]);
|
|
5593
|
+
const handleModalApply = useCallback(() => {
|
|
5592
5594
|
if (type === 'modal') {
|
|
5593
5595
|
onApply?.(formatted);
|
|
5594
5596
|
setIsOpen(false);
|
|
5595
5597
|
}
|
|
5596
|
-
};
|
|
5597
|
-
const handleModalCancel = () => {
|
|
5598
|
+
}, [type, formatted, onApply]);
|
|
5599
|
+
const handleModalCancel = useCallback(() => {
|
|
5598
5600
|
if (type === 'modal') {
|
|
5599
5601
|
// 원래 색상으로 복원
|
|
5600
5602
|
const rgb = hexToRgb(tempColor);
|
|
@@ -5607,9 +5609,9 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5607
5609
|
onCancel?.();
|
|
5608
5610
|
setIsOpen(false);
|
|
5609
5611
|
}
|
|
5610
|
-
};
|
|
5612
|
+
}, [type, tempColor, onCancel]);
|
|
5611
5613
|
/** 배경 스타일 */
|
|
5612
|
-
const hueTrackStyle = {
|
|
5614
|
+
const hueTrackStyle = useMemo(() => ({
|
|
5613
5615
|
background: `linear-gradient(to right,
|
|
5614
5616
|
hsl(0,100%,50%),
|
|
5615
5617
|
hsl(60,100%,50%),
|
|
@@ -5618,15 +5620,15 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5618
5620
|
hsl(240,100%,50%),
|
|
5619
5621
|
hsl(300,100%,50%),
|
|
5620
5622
|
hsl(360,100%,50%))`,
|
|
5621
|
-
};
|
|
5622
|
-
const areaBackground = {
|
|
5623
|
+
}), []);
|
|
5624
|
+
const areaBackground = useMemo(() => ({
|
|
5623
5625
|
backgroundImage: `
|
|
5624
5626
|
linear-gradient(to top, rgba(0,0,0,1), rgba(0,0,0,0)),
|
|
5625
5627
|
linear-gradient(to right, #ffffff, hsl(${h}, 100%, 50%))
|
|
5626
5628
|
`,
|
|
5627
|
-
};
|
|
5629
|
+
}), [h]);
|
|
5628
5630
|
/** ✔︎ 알파 트랙: 색상 무관, 고정 흑백 그라디언트 */
|
|
5629
|
-
const alphaTrackStyle = {
|
|
5631
|
+
const alphaTrackStyle = useMemo(() => ({
|
|
5630
5632
|
backgroundImage: `
|
|
5631
5633
|
linear-gradient(45deg, var(--db-border-base) 25%, transparent 25%),
|
|
5632
5634
|
linear-gradient(-45deg, var(--db-border-base) 25%, transparent 25%),
|
|
@@ -5637,7 +5639,7 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5637
5639
|
backgroundSize: '8px 8px,8px 8px,8px 8px,8px 8px,100% 100%',
|
|
5638
5640
|
backgroundPosition: '0 0,0 4px,4px -4px,-4px 0,0 0',
|
|
5639
5641
|
backgroundColor: 'var(--db-surface-base)',
|
|
5640
|
-
};
|
|
5642
|
+
}), []);
|
|
5641
5643
|
const classes = clsx('designbase-color-picker', `designbase-color-picker--${size}`, `designbase-color-picker--${position}`, {
|
|
5642
5644
|
'designbase-color-picker--disabled': disabled,
|
|
5643
5645
|
'designbase-color-picker--readonly': readonly,
|
|
@@ -5645,13 +5647,13 @@ const ColorPicker = ({ size = 'm', type = 'dropdown', position = 'bottom-left',
|
|
|
5645
5647
|
'designbase-color-picker--no-input': !showInput,
|
|
5646
5648
|
}, className);
|
|
5647
5649
|
const Trigger = (jsxs("div", { className: "designbase-color-picker__trigger", onClick: () => !disabled && !readonly && handleModalOpen(), children: [jsx("div", { className: "designbase-color-picker__color-display", children: jsx("div", { className: "designbase-color-picker__color-box", style: { backgroundColor: showAlpha ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${a / 100})` : hex } }) }), showInput && (jsx("input", { type: "text", value: colorInput, onChange: (e) => setColorInput(e.target.value), onKeyDown: onColorKeyDown, onBlur: onColorBlur, onClick: (e) => e.stopPropagation(), disabled: disabled, readOnly: readonly, className: "designbase-color-picker__input", placeholder: "#000000" })), showInput && showCopyButton && (jsx("button", { type: "button", className: "designbase-color-picker__copy-button-inline", onClick: (e) => { e.stopPropagation(); onCopy(); }, disabled: disabled, "aria-label": "Copy color value", children: isCopied ? jsx(DoneIcon$1, { size: 14 }) : jsx(CopyIcon, { size: 14 }) })), jsx("button", { type: "button", className: "designbase-color-picker__toggle", disabled: disabled, "aria-label": "Toggle color picker", children: jsx(ChevronDownIcon, { size: 16 }) })] }));
|
|
5648
|
-
const Selector = (jsxs("div", { className: "designbase-color-picker__selector", children: [jsx("div", { className: "designbase-color-picker__color-area", children: jsx("div", { ref: areaRef, className: "designbase-color-picker__color-field", style: areaBackground, onMouseDown: onAreaMouseDown, onMouseMove: onAreaMouseMove, onMouseUp: onAreaMouseUp, onMouseLeave: onAreaLeave, onTouchStart: onAreaTouchStart, onTouchMove: onAreaTouchMove, onTouchEnd: onAreaTouchEnd, children: jsx("div", { className: "designbase-color-picker__color-pointer", style: { left: `${s}%`, top: `${100 - v}%`, backgroundColor: `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})` } }) }) }), jsxs("div", { className: "designbase-color-picker__controls", children: [jsx(Button, { variant: "tertiary", size: "m", iconOnly: true, onClick: onEyedrop, "aria-label": "Eyedropper tool", children: jsx(EyedropperIcon, {}) }), jsxs("div", { className: "designbase-color-picker__slider-container", children: [jsx("div", { className: "designbase-color-picker__hue-slider", children: jsx("input", { type: "range", min: 0, max: 360, value: h, onChange: onHueChange, className: "designbase-color-picker__slider designbase-color-picker__slider--hue", style: hueTrackStyle }) }), showAlpha && (jsx("div", { className: "designbase-color-picker__alpha-slider", children: jsx("input", { type: "range", min: 0, max: 100, value: a, onChange: onAlphaChange, className: "designbase-color-picker__slider designbase-color-picker__slider--alpha", style: alphaTrackStyle }) }))] })] }), jsxs("div", { className: "designbase-color-picker__value-display", children: [showFormatSelector && (jsx(Select, { value: format, onChange: (v) => setFormat(v), showClearButton: false,
|
|
5650
|
+
const Selector = (jsxs("div", { className: "designbase-color-picker__selector", children: [jsx("div", { className: "designbase-color-picker__color-area", children: jsx("div", { ref: areaRef, className: "designbase-color-picker__color-field", style: areaBackground, onMouseDown: onAreaMouseDown, onMouseMove: onAreaMouseMove, onMouseUp: onAreaMouseUp, onMouseLeave: onAreaLeave, onTouchStart: onAreaTouchStart, onTouchMove: onAreaTouchMove, onTouchEnd: onAreaTouchEnd, children: jsx("div", { className: "designbase-color-picker__color-pointer", style: { left: `${s}%`, top: `${100 - v}%`, backgroundColor: `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})` } }) }) }), jsxs("div", { className: "designbase-color-picker__controls", children: [jsx(Button, { variant: "tertiary", size: "m", iconOnly: true, onClick: onEyedrop, "aria-label": "Eyedropper tool", children: jsx(EyedropperIcon, {}) }), jsxs("div", { className: "designbase-color-picker__slider-container", children: [jsx("div", { className: "designbase-color-picker__hue-slider", children: jsx("input", { type: "range", min: 0, max: 360, value: h, onChange: onHueChange, className: "designbase-color-picker__slider designbase-color-picker__slider--hue", style: hueTrackStyle }) }), showAlpha && (jsx("div", { className: "designbase-color-picker__alpha-slider", children: jsx("input", { type: "range", min: 0, max: 100, value: a, onChange: onAlphaChange, className: "designbase-color-picker__slider designbase-color-picker__slider--alpha", style: alphaTrackStyle }) }))] })] }), jsxs("div", { className: "designbase-color-picker__value-display", children: [showFormatSelector && (jsx(Select, { value: format, onChange: (v) => setFormat(v), showClearButton: false, options: [
|
|
5649
5651
|
{ label: 'HEX', value: 'hex' },
|
|
5650
5652
|
{ label: 'RGB', value: 'rgb' },
|
|
5651
5653
|
{ label: 'RGBA', value: 'rgba' },
|
|
5652
5654
|
{ label: 'HSL', value: 'hsl' },
|
|
5653
5655
|
{ label: 'HSLA', value: 'hsla' },
|
|
5654
|
-
], size: "s" })), jsx(Input, { type: "text", value: colorInput, onChange: setColorInput, onKeyDown: onColorKeyDown, onBlur: onColorBlur, placeholder: "#000000", size: "s", className: "designbase-color-picker__value-input" }), showAlpha && (jsxs("div", { className: "designbase-color-picker__alpha-input-wrap", children: [jsx(Input, { type: "text", inputMode: "numeric", value: alphaInput, onChange: (value) => setAlphaInput(value.replace(/[^\d]/g, '').slice(0, 3)), onKeyDown: onAlphaInputKeyDown, onBlur: onAlphaInputBlur, placeholder: "100", size: "s", className: "designbase-color-picker__alpha-input", "aria-label": "Alpha percent" }), jsx("span", { className: "designbase-color-picker__alpha-suffix", children: "%" })] })), showCopyButton && (jsx(Button, { variant: "tertiary", size: "m", iconOnly: true, onClick: onCopy, "aria-label": "Copy color value", children: isCopied ? jsx(DoneIcon$1, {}) : jsx(CopyIcon, {}) }))] })] }));
|
|
5656
|
+
], size: "s", position: "top" })), jsx(Input, { type: "text", value: colorInput, onChange: setColorInput, onKeyDown: onColorKeyDown, onBlur: onColorBlur, placeholder: "#000000", size: "s", className: "designbase-color-picker__value-input" }), showAlpha && (jsxs("div", { className: "designbase-color-picker__alpha-input-wrap", children: [jsx(Input, { type: "text", inputMode: "numeric", value: alphaInput, onChange: (value) => setAlphaInput(value.replace(/[^\d]/g, '').slice(0, 3)), onKeyDown: onAlphaInputKeyDown, onBlur: onAlphaInputBlur, placeholder: "100", size: "s", className: "designbase-color-picker__alpha-input", "aria-label": "Alpha percent" }), jsx("span", { className: "designbase-color-picker__alpha-suffix", children: "%" })] })), showCopyButton && (jsx(Button, { variant: "tertiary", size: "m", iconOnly: true, onClick: onCopy, "aria-label": "Copy color value", children: isCopied ? jsx(DoneIcon$1, {}) : jsx(CopyIcon, {}) }))] })] }));
|
|
5655
5657
|
return (jsxs("div", { ref: pickerRef, className: classes, children: [Trigger, type === 'dropdown' && isOpen && (jsx("div", { className: "designbase-color-picker__dropdown", onClick: (e) => e.stopPropagation(), children: Selector })), type === 'modal' && (jsxs(Modal, { isOpen: isOpen, onClose: handleModalCancel, title: "\uC0C9\uC0C1 \uC120\uD0DD", size: "s", children: [jsx(ModalBody, { children: Selector }), jsx(ModalFooter, { children: jsxs("div", { style: { display: 'flex', gap: '8px', justifyContent: 'flex-end' }, children: [jsx(Button, { variant: "tertiary", size: "s", onClick: handleModalCancel, children: "\uCDE8\uC18C" }), jsx(Button, { variant: "primary", size: "s", onClick: handleModalApply, children: "\uC801\uC6A9" })] }) })] }))] }));
|
|
5656
5658
|
};
|
|
5657
5659
|
ColorPicker.displayName = 'ColorPicker';
|