@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 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) => setH(parseInt(e.target.value, 10));
5481
- const onAlphaChange = (e) => {
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, position: "top", options: [
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';