{"version":3,"sources":["../src/utils.ts","../src/hooks.ts","../src/layout.ts","../src/defaults.ts","../src/ReactWordcloud.tsx"],"names":["range","scaleOrdinal","schemeCategory10","min","max","scaleLog","scaleSqrt","scaleLinear","rotate","useRef","useState","useEffect","select","width","height","ResizeObserver","descending","seedrandom","d3Cloud","tippy","enter","useMemo","debounce","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import { max, min, range } from 'd3-array';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, ScaleLinear } from 'd3-scale';\nimport { schemeCategory10 } from 'd3-scale-chromatic';\nimport type { Word, MinMaxPair, Scale } from './types.js';\n\n/**\n * Extended Word interface with layout properties\n * These properties are added by d3-cloud during layout calculation\n */\nexport interface LayoutWord extends Word {\n  size?: number;\n  x?: number;\n  y?: number;\n  rotate?: number;\n}\n\n/**\n * Random number generator function type\n */\ntype RandomFunction = () => number;\n\n/**\n * Choose a random element from an array\n * @param array - Array to choose from\n * @param random - Random number generator function\n * @returns Randomly selected element\n */\nexport function choose<T>(array: T[], random: RandomFunction): T {\n  return array[Math.floor(random() * array.length)];\n}\n\n/**\n * Get default color scheme (D3 Category10 with 20 colors)\n * @returns Array of 20 colors\n */\nexport function getDefaultColors(): string[] {\n  return range(20)\n    .map((number) => number.toString())\n    .map(scaleOrdinal(schemeCategory10));\n}\n\n/**\n * Create a D3 scale function for font sizes based on word values\n * @param words - Array of words\n * @param fontSizes - Min and max font sizes [min, max]\n * @param scale - Scale type ('linear', 'log', or 'sqrt')\n * @returns D3 scale function\n */\nexport function getFontScale(\n  words: Word[],\n  fontSizes: MinMaxPair,\n  scale: Scale\n): ScaleLinear<number, number> {\n  const minSize = min(words, (word) => Number(word.value)) ?? 0;\n  const maxSize = max(words, (word) => Number(word.value)) ?? 0;\n\n  let fontScale: ScaleLinear<number, number>;\n\n  switch (scale) {\n    case 'log':\n      fontScale = scaleLog().domain([minSize, maxSize]).range(fontSizes);\n      break;\n    case 'sqrt':\n      fontScale = scaleSqrt().domain([minSize, maxSize]).range(fontSizes);\n      break;\n    case 'linear':\n    default:\n      fontScale = scaleLinear().domain([minSize, maxSize]).range(fontSizes);\n      break;\n  }\n\n  return fontScale;\n}\n\n/**\n * Get font size CSS string from word\n * @param word - Word with size property set by layout\n * @returns Font size string (e.g., \"24px\")\n */\nexport function getFontSize(word: LayoutWord): string {\n  return `${word.size ?? 0}px`;\n}\n\n/**\n * Get text content from word\n * @param word - Word object\n * @returns Text content\n */\nexport function getText(word: Word): string {\n  return word.text;\n}\n\n/**\n * Get SVG transform attribute value for word positioning\n * @param word - Word with x, y, and rotate properties set by layout\n * @returns Transform string (e.g., \"translate(100, 50)rotate(45)\")\n */\nexport function getTransform(word: LayoutWord): string {\n  const translate = `translate(${word.x ?? 0}, ${word.y ?? 0})`;\n  const rotate = typeof word.rotate === 'number' ? `rotate(${word.rotate})` : '';\n  return translate + rotate;\n}\n\n/**\n * Calculate rotation angle for a word\n * @param rotations - Number of rotation angles to generate\n * @param rotationAngles - Min and max rotation angles [min, max]\n * @param random - Random number generator function\n * @returns Rotation angle in degrees\n */\nexport function rotate(\n  rotations: number,\n  rotationAngles: MinMaxPair,\n  random: RandomFunction\n): number {\n  if (rotations < 1) {\n    return 0;\n  }\n\n  let angles: number[] = [];\n\n  if (rotations === 1) {\n    angles = [rotationAngles[0]];\n  } else {\n    angles = [...rotationAngles];\n    const increment = (rotationAngles[1] - rotationAngles[0]) / (rotations - 1);\n    let angle = rotationAngles[0] + increment;\n    while (angle < rotationAngles[1]) {\n      angles.push(angle);\n      angle += increment;\n    }\n  }\n\n  return choose(angles, random);\n}\n","import { select } from 'd3-selection';\nimport { useEffect, useRef, useState } from 'react';\nimport ResizeObserver from 'resize-observer-polyfill';\nimport type { MinMaxPair, Selection } from './types.js';\nimport type { AttributeValue } from './types.js';\n\n/**\n * Custom hook for creating a responsive SVG with D3 selection\n * Handles SVG creation, responsive resizing, and cleanup\n *\n * @param minSize - Minimum [width, height] for the SVG\n * @param initialSize - Optional fixed [width, height]. If undefined, SVG is responsive\n * @param svgAttributes - Optional SVG attributes to apply\n * @returns Tuple of [elementRef, d3Selection, currentSize]\n *          elementRef.current는 마운트 전 null이므로 React 19 타입 규칙에 맞춰 null을 포함한다\n */\nexport function useResponsiveSvgSelection(\n  minSize: MinMaxPair,\n  initialSize: MinMaxPair | undefined,\n  svgAttributes: Record<string, AttributeValue> | undefined\n): [React.RefObject<HTMLDivElement | null>, Selection | null, MinMaxPair] {\n  const elementRef = useRef<HTMLDivElement>(null);\n  const [size, setSize] = useState<MinMaxPair>(initialSize ?? [0, 0]);\n  const [selection, setSelection] = useState<Selection | null>(null);\n\n  useEffect(() => {\n    const element = elementRef.current;\n    if (!element) {\n      return;\n    }\n\n    // Create SVG element with D3\n    let svg = select(element).append('svg').style('display', 'block'); // Native inline svg leaves undesired white space\n\n    // Apply custom SVG attributes if provided\n    if (typeof svgAttributes === 'object' && svgAttributes !== null) {\n      Object.keys(svgAttributes).forEach((key) => {\n        const value = svgAttributes[key];\n        if (typeof value === 'string') {\n          svg = svg.attr(key, value);\n        } else if (typeof value === 'function') {\n          // AttributeValue can be a callback, but for SVG attributes we expect strings\n          // This maintains compatibility with the original API\n          svg = svg.attr(key, value as unknown as string);\n        }\n      });\n    }\n\n    // Create group element for word cloud content\n    const selectionGroup = svg.append('g');\n    setSelection(selectionGroup as unknown as Selection);\n\n    /**\n     * Update SVG and group dimensions\n     */\n    function updateSize(width: number, height: number): void {\n      svg.attr('height', height).attr('width', width);\n      selectionGroup.attr('transform', `translate(${width / 2}, ${height / 2})`);\n      setSize([width, height]);\n    }\n\n    // Calculate initial size\n    let width = 0;\n    let height = 0;\n\n    if (initialSize === undefined) {\n      // Use parent element size for responsive mode\n      const parent = element.parentElement;\n      if (parent) {\n        width = parent.offsetWidth;\n        height = parent.offsetHeight;\n      }\n    } else {\n      // Use fixed size if provided\n      [width, height] = initialSize;\n    }\n\n    // Apply minimum size constraints\n    width = Math.max(width, minSize[0]);\n    height = Math.max(height, minSize[1]);\n    updateSize(width, height);\n\n    // Set up ResizeObserver for responsive sizing\n    const resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n      if (!entries || entries.length === 0) {\n        return;\n      }\n\n      // Only update size if in responsive mode (no initialSize provided)\n      if (initialSize === undefined) {\n        const { width: newWidth, height: newHeight } = entries[0].contentRect;\n        const constrainedWidth = Math.max(newWidth, minSize[0]);\n        const constrainedHeight = Math.max(newHeight, minSize[1]);\n        updateSize(constrainedWidth, constrainedHeight);\n      }\n    });\n\n    resizeObserver.observe(element);\n\n    // Cleanup function\n    return () => {\n      resizeObserver.unobserve(element);\n      select(element).selectAll('*').remove();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return [elementRef, selection, size];\n}\n","import 'd3-transition';\nimport { descending } from 'd3-array';\nimport d3Cloud from 'd3-cloud';\nimport seedrandom from 'seedrandom';\nimport tippy, { Instance as TippyInstance } from 'tippy.js';\nimport type { Word, MinMaxPair, Options, CallbacksProp, Selection } from './types.js';\nimport type { LayoutWord } from './utils.js';\nimport { choose, getFontScale, getFontSize, getText, getTransform, rotate } from './utils.js';\n\n/**\n * Layout function parameters\n */\nexport interface LayoutParams {\n  callbacks: CallbacksProp;\n  maxWords: number;\n  options: Required<Options>;\n  selection: Selection;\n  size: MinMaxPair;\n  words: Word[];\n}\n\n/**\n * Layout function - configures and executes d3-cloud word layout\n * Implements recursive font scaling to fit all words\n *\n * @param params - Layout parameters\n */\nexport function layout(params: LayoutParams): void {\n  const MAX_LAYOUT_ATTEMPTS = 10;\n  const SHRINK_FACTOR = 0.95;\n\n  const { callbacks, maxWords, options, selection, size, words } = params;\n  const {\n    deterministic,\n    fontFamily,\n    fontStyle,\n    fontSizes,\n    fontWeight,\n    padding,\n    randomSeed,\n    rotations,\n    rotationAngles,\n    spiral,\n    scale,\n  } = options;\n\n  // Sort words by value (descending) and limit to maxWords\n  const sortedWords = words\n    .concat()\n    .sort((x, y) => descending(x.value, y.value))\n    .slice(0, maxWords);\n\n  // Initialize random number generator\n  const random = seedrandom(deterministic ? randomSeed || 'deterministic' : undefined);\n\n  // Create d3-cloud instance\n  const cloud = d3Cloud<Word>();\n\n  // Configure cloud layout\n  cloud\n    .size(size)\n    .padding(padding)\n    .words(sortedWords.map((word) => ({ ...word }))) // Clone words to avoid mutation\n    .rotate(() => {\n      if (rotations === undefined) {\n        // Default rotation algorithm: -90, -60, -30, 0, 30, 60, 90 degrees\n        return (~~(random() * 6) - 3) * 30;\n      }\n      return rotate(rotations, rotationAngles, random);\n    })\n    .spiral(spiral)\n    .random(random)\n    .text(getText)\n    .font(fontFamily)\n    .fontStyle(fontStyle)\n    .fontWeight(fontWeight);\n\n  /**\n   * Recursive draw function with font size adjustment\n   * If not all words fit, shrink font sizes and retry\n   */\n  function draw(currentFontSizes: MinMaxPair, attempts = 1): void {\n    cloud\n      .fontSize((word) => {\n        const fontScale = getFontScale(sortedWords, currentFontSizes, scale);\n        return fontScale(word.value);\n      })\n      .on('end', (computedWords: LayoutWord[]) => {\n        /**\n         * KNOWN ISSUE: https://github.com/jasondavies/d3-cloud/issues/36\n         * d3-cloud may fail to layout all words due to space constraints\n         * Recursively layout and decrease font-sizes by SHRINK_FACTOR\n         * Bail out with warning after MAX_LAYOUT_ATTEMPTS\n         */\n        const missingWords = sortedWords.length - computedWords.length;\n\n        if (missingWords > 0 && attempts <= MAX_LAYOUT_ATTEMPTS) {\n          if (attempts === MAX_LAYOUT_ATTEMPTS) {\n            console.warn(\n              `Unable to layout ${missingWords} word(s) after ${attempts} attempts. ` +\n                `Consider: (1) Increasing container size, ` +\n                `(2) Lowering max font size, ` +\n                `(3) Limiting rotation angles.`\n            );\n          }\n\n          // Shrink font sizes and retry\n          const minFontSize = Math.max(currentFontSizes[0] * SHRINK_FACTOR, 1);\n          const maxFontSize = Math.max(currentFontSizes[1] * SHRINK_FACTOR, minFontSize);\n\n          draw([minFontSize, maxFontSize], attempts + 1);\n        } else {\n          // Layout successful or max attempts reached - render words\n          render({\n            callbacks,\n            options,\n            random,\n            selection,\n            words: computedWords,\n          });\n        }\n      })\n      .start();\n  }\n\n  // Start layout with initial font sizes\n  draw(fontSizes);\n}\n\n/**\n * Render function parameters\n */\nexport interface RenderParams {\n  callbacks: CallbacksProp;\n  options: Required<Options>;\n  random: seedrandom.PRNG;\n  selection: Selection;\n  words: LayoutWord[];\n}\n\n/**\n * Render function - renders words using D3 selection with enter-update-exit pattern\n * Handles SVG text elements, transitions, tooltips, and event handlers\n *\n * @param params - Render parameters\n */\nexport function render(params: RenderParams): void {\n  const { callbacks, options, random, selection, words } = params;\n  const { getWordColor, getWordTooltip, onWordClick, onWordMouseOver, onWordMouseOut } = callbacks;\n  const { colors, enableTooltip, fontStyle, fontWeight, textAttributes, tooltipOptions } = options;\n  const { fontFamily, transitionDuration } = options;\n\n  /**\n   * Get fill color for a word\n   */\n  function getFill(word: LayoutWord): string {\n    return getWordColor ? getWordColor(word) : choose(colors, random);\n  }\n\n  // Tooltip instance tracking\n  let tooltipInstance: TippyInstance | null = null;\n\n  // Select all text elements and bind data\n  const vizWords = selection.selectAll<SVGTextElement, LayoutWord>('text').data(words);\n\n  // Enter-update-exit pattern\n  vizWords.join(\n    // Enter: create new text elements\n    (enter) => {\n      let text = enter\n        .append('text')\n        .on('click', function (event: MouseEvent, word: LayoutWord) {\n          if (onWordClick) {\n            onWordClick(word, event);\n          }\n        })\n        .on('mouseover', function (event: MouseEvent, word: LayoutWord) {\n          if (enableTooltip && (!tooltipInstance || tooltipInstance.state.isDestroyed)) {\n            tooltipInstance = tippy(event.target as Element, {\n              animation: 'scale',\n              arrow: true,\n              content: () => (getWordTooltip ? getWordTooltip(word) : word.text),\n              onHidden: (instance) => {\n                instance.destroy();\n                tooltipInstance = null;\n              },\n              ...tooltipOptions,\n            });\n          }\n\n          if (onWordMouseOver) {\n            onWordMouseOver(word, event);\n          }\n        })\n        .on('mouseout', function (event: MouseEvent, word: LayoutWord) {\n          if (tooltipInstance && !tooltipInstance.state.isVisible) {\n            tooltipInstance.destroy();\n            tooltipInstance = null;\n          }\n\n          if (onWordMouseOut) {\n            onWordMouseOut(word, event);\n          }\n        })\n        .attr('cursor', onWordClick ? 'pointer' : 'default')\n        .attr('fill', getFill)\n        .attr('font-family', fontFamily)\n        .attr('font-style', fontStyle)\n        .attr('font-weight', fontWeight)\n        .attr('text-anchor', 'middle')\n        .attr('transform', 'translate(0, 0) rotate(0)');\n\n      // Apply custom text attributes if provided\n      if (typeof textAttributes === 'object' && textAttributes !== null) {\n        Object.keys(textAttributes).forEach((key) => {\n          const value = textAttributes[key];\n          if (typeof value === 'string') {\n            text = text.attr(key, value);\n          } else if (typeof value === 'function') {\n            // AttributeValue는 콜백일 수 있으며, typeof 검사로 이미 좁혀져 별도 단언이 필요 없다\n            text = text.attr(key, value);\n          }\n        });\n      }\n\n      // Transition to final state\n      text.call((enter) =>\n        enter\n          .transition()\n          .duration(transitionDuration)\n          .attr('font-size', getFontSize)\n          .attr('transform', getTransform)\n          .text(getText)\n      );\n\n      return text;\n    },\n    // Update: update existing text elements\n    (update) => {\n      update\n        .transition()\n        .duration(transitionDuration)\n        .attr('fill', getFill)\n        .attr('font-family', fontFamily)\n        .attr('font-size', getFontSize)\n        .attr('transform', getTransform)\n        .text(getText);\n\n      return update;\n    },\n    // Exit: remove text elements with fade out\n    (exit) => {\n      exit.transition().duration(transitionDuration).attr('fill-opacity', 0).remove();\n\n      return exit;\n    }\n  );\n}\n","import type { Callbacks, Options, Word } from './types.js';\nimport { getDefaultColors } from './utils.js';\n\n/**\n * Default callback functions\n */\nexport const defaultCallbacks: Callbacks = {\n  getWordTooltip: (word: Word) => `${word.text} (${word.value})`,\n};\n\n/**\n * Default options for wordcloud\n */\nexport const defaultOptions: Options = {\n  colors: getDefaultColors(),\n  deterministic: false,\n  enableOptimizations: false,\n  enableTooltip: true,\n  fontFamily: 'times new roman',\n  fontSizes: [4, 32],\n  fontStyle: 'normal',\n  fontWeight: 'normal',\n  padding: 1,\n  rotationAngles: [-90, 90],\n  scale: 'sqrt',\n  spiral: 'rectangular',\n  svgAttributes: {},\n  textAttributes: {},\n  tooltipOptions: {},\n  transitionDuration: 600,\n};\n","import React, { useEffect, useMemo } from 'react';\nimport debounce from 'lodash.debounce';\nimport type { Props, Callbacks, Options } from './types.js';\nimport { useResponsiveSvgSelection } from './hooks.js';\nimport { layout, type LayoutParams } from './layout.js';\nimport { defaultCallbacks, defaultOptions } from './defaults.js';\n\n/**\n * ReactWordcloud component\n * Renders an interactive word cloud visualization using D3\n */\nexport function ReactWordcloud({\n  callbacks = {},\n  maxWords = 100,\n  minSize = [300, 300],\n  options = {},\n  size,\n  style,\n  words,\n}: Props): React.JSX.Element {\n  // Merge user-provided callbacks and options with defaults\n  const mergedCallbacks: Callbacks = useMemo(\n    () => ({\n      ...defaultCallbacks,\n      ...callbacks,\n    }),\n    [callbacks]\n  );\n\n  const mergedOptions: Options = useMemo(\n    () => ({\n      ...defaultOptions,\n      ...options,\n    }),\n    [options]\n  );\n\n  // Memoize svgAttributes separately to prevent unnecessary re-renders\n  const svgAttributes = useMemo(() => mergedOptions.svgAttributes, [mergedOptions.svgAttributes]);\n\n  // Get responsive SVG selection and size\n  const [ref, selection, calculatedSize] = useResponsiveSvgSelection(minSize, size, svgAttributes);\n\n  // 렌더링 중 ref.current 접근을 피하기 위해 useMemo로 debounce 함수를 1회만 생성한다\n  // (react-hooks/refs 규칙: 렌더 단계에서 ref 값을 읽을 수 없음)\n  const debouncedLayout = useMemo(\n    () =>\n      debounce((params: LayoutParams) => {\n        layout(params);\n      }, 100),\n    []\n  );\n\n  // 언마운트 시 대기 중인 debounce 호출 취소\n  useEffect(() => {\n    return () => {\n      debouncedLayout.cancel();\n    };\n  }, [debouncedLayout]);\n\n  // Trigger layout when dependencies change\n  useEffect(() => {\n    if (selection && words.length > 0) {\n      debouncedLayout({\n        callbacks: mergedCallbacks,\n        maxWords,\n        options: mergedOptions as Required<Options>,\n        selection,\n        size: calculatedSize,\n        words,\n      });\n    }\n  }, [selection, words, maxWords, calculatedSize, mergedCallbacks, mergedOptions, debouncedLayout]);\n\n  return <div ref={ref} style={style} />;\n}\n\nexport default ReactWordcloud;\n"]}