dipping-charts 0.1.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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -0
  3. package/dist/__tests__/FullFeaturedChart.test.d.ts +2 -0
  4. package/dist/__tests__/FullFeaturedChart.test.d.ts.map +1 -0
  5. package/dist/__tests__/indicators-accuracy.test.d.ts +2 -0
  6. package/dist/__tests__/indicators-accuracy.test.d.ts.map +1 -0
  7. package/dist/__tests__/indicators.test.d.ts +2 -0
  8. package/dist/__tests__/indicators.test.d.ts.map +1 -0
  9. package/dist/__tests__/setup.d.ts +1 -0
  10. package/dist/__tests__/setup.d.ts.map +1 -0
  11. package/dist/__tests__/validateCandle.test.d.ts +2 -0
  12. package/dist/__tests__/validateCandle.test.d.ts.map +1 -0
  13. package/dist/chart/index.d.ts +2 -0
  14. package/dist/chart/index.js +5 -0
  15. package/dist/chart/index.js.map +1 -0
  16. package/dist/components/TradingChart.d.ts +24 -0
  17. package/dist/components/TradingChart.d.ts.map +1 -0
  18. package/dist/components/TradingChart.js +100 -0
  19. package/dist/components/TradingChart.js.map +1 -0
  20. package/dist/components/index.d.ts +3 -0
  21. package/dist/components/index.d.ts.map +1 -0
  22. package/dist/dipping-charts.css +1 -0
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +28 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/indicators/atr.d.ts +15 -0
  28. package/dist/indicators/atr.d.ts.map +1 -0
  29. package/dist/indicators/atr.js +30 -0
  30. package/dist/indicators/atr.js.map +1 -0
  31. package/dist/indicators/bollingerBands.d.ts +11 -0
  32. package/dist/indicators/bollingerBands.d.ts.map +1 -0
  33. package/dist/indicators/bollingerBands.js +39 -0
  34. package/dist/indicators/bollingerBands.js.map +1 -0
  35. package/dist/indicators/currencyStrength.d.ts +43 -0
  36. package/dist/indicators/currencyStrength.d.ts.map +1 -0
  37. package/dist/indicators/currencyStrength.js +53 -0
  38. package/dist/indicators/currencyStrength.js.map +1 -0
  39. package/dist/indicators/ema.d.ts +11 -0
  40. package/dist/indicators/ema.d.ts.map +1 -0
  41. package/dist/indicators/ema.js +24 -0
  42. package/dist/indicators/ema.js.map +1 -0
  43. package/dist/indicators/index.d.ts +19 -0
  44. package/dist/indicators/index.d.ts.map +1 -0
  45. package/dist/indicators/index.js +23 -0
  46. package/dist/indicators/index.js.map +1 -0
  47. package/dist/indicators/macd.d.ts +11 -0
  48. package/dist/indicators/macd.d.ts.map +1 -0
  49. package/dist/indicators/macd.js +52 -0
  50. package/dist/indicators/macd.js.map +1 -0
  51. package/dist/indicators/rsi.d.ts +11 -0
  52. package/dist/indicators/rsi.d.ts.map +1 -0
  53. package/dist/indicators/rsi.js +29 -0
  54. package/dist/indicators/rsi.js.map +1 -0
  55. package/dist/indicators/sma.d.ts +13 -0
  56. package/dist/indicators/sma.d.ts.map +1 -0
  57. package/dist/indicators/sma.js +22 -0
  58. package/dist/indicators/sma.js.map +1 -0
  59. package/dist/indicators/stochastic.d.ts +15 -0
  60. package/dist/indicators/stochastic.d.ts.map +1 -0
  61. package/dist/indicators/stochastic.js +34 -0
  62. package/dist/indicators/stochastic.js.map +1 -0
  63. package/dist/indicators/types.d.ts +102 -0
  64. package/dist/indicators/types.d.ts.map +1 -0
  65. package/dist/indicators/vwap.d.ts +14 -0
  66. package/dist/indicators/vwap.d.ts.map +1 -0
  67. package/dist/indicators/vwap.js +17 -0
  68. package/dist/indicators/vwap.js.map +1 -0
  69. package/dist/indicators/williamsR.d.ts +17 -0
  70. package/dist/indicators/williamsR.d.ts.map +1 -0
  71. package/dist/indicators/williamsR.js +19 -0
  72. package/dist/indicators/williamsR.js.map +1 -0
  73. package/dist/react/FullFeaturedChart.d.ts +3 -0
  74. package/dist/react/FullFeaturedChart.d.ts.map +1 -0
  75. package/dist/react/FullFeaturedChart.js +640 -0
  76. package/dist/react/FullFeaturedChart.js.map +1 -0
  77. package/dist/react/components/IndicatorSettings.d.ts +20 -0
  78. package/dist/react/components/IndicatorSettings.d.ts.map +1 -0
  79. package/dist/react/components/IndicatorSettings.js +748 -0
  80. package/dist/react/components/IndicatorSettings.js.map +1 -0
  81. package/dist/react/hooks/useChart.d.ts +15 -0
  82. package/dist/react/hooks/useChart.d.ts.map +1 -0
  83. package/dist/react/hooks/useChart.js +155 -0
  84. package/dist/react/hooks/useChart.js.map +1 -0
  85. package/dist/react/hooks/useIndicators.d.ts +10 -0
  86. package/dist/react/hooks/useIndicators.d.ts.map +1 -0
  87. package/dist/react/hooks/useIndicators.js +264 -0
  88. package/dist/react/hooks/useIndicators.js.map +1 -0
  89. package/dist/react/hooks/useLineTools.d.ts +26 -0
  90. package/dist/react/hooks/useLineTools.d.ts.map +1 -0
  91. package/dist/react/hooks/useLineTools.js +189 -0
  92. package/dist/react/hooks/useLineTools.js.map +1 -0
  93. package/dist/react/hooks/useShiftSnap.d.ts +12 -0
  94. package/dist/react/hooks/useShiftSnap.d.ts.map +1 -0
  95. package/dist/react/hooks/useShiftSnap.js +54 -0
  96. package/dist/react/hooks/useShiftSnap.js.map +1 -0
  97. package/dist/react/index.d.ts +14 -0
  98. package/dist/react/index.d.ts.map +1 -0
  99. package/dist/react/index.js +18 -0
  100. package/dist/react/index.js.map +1 -0
  101. package/dist/react/loadLightweightCharts.d.ts +18 -0
  102. package/dist/react/loadLightweightCharts.d.ts.map +1 -0
  103. package/dist/react/loadLightweightCharts.js +32 -0
  104. package/dist/react/loadLightweightCharts.js.map +1 -0
  105. package/dist/react/locale.d.ts +79 -0
  106. package/dist/react/locale.d.ts.map +1 -0
  107. package/dist/react/locale.js +158 -0
  108. package/dist/react/locale.js.map +1 -0
  109. package/dist/react/types.d.ts +130 -0
  110. package/dist/react/types.d.ts.map +1 -0
  111. package/dist/types/index.d.ts +24 -0
  112. package/dist/types/index.d.ts.map +1 -0
  113. package/dist/utils/getToolId.d.ts +9 -0
  114. package/dist/utils/getToolId.d.ts.map +1 -0
  115. package/dist/utils/getToolId.js +12 -0
  116. package/dist/utils/getToolId.js.map +1 -0
  117. package/dist/utils/mockData.d.ts +10 -0
  118. package/dist/utils/mockData.d.ts.map +1 -0
  119. package/dist/utils/mockData.js +61 -0
  120. package/dist/utils/mockData.js.map +1 -0
  121. package/dist/utils/snapCrosshair.d.ts +25 -0
  122. package/dist/utils/snapCrosshair.d.ts.map +1 -0
  123. package/dist/utils/validateCandle.d.ts +30 -0
  124. package/dist/utils/validateCandle.d.ts.map +1 -0
  125. package/dist/utils/validateCandle.js +21 -0
  126. package/dist/utils/validateCandle.js.map +1 -0
  127. package/examples/css/base.css +209 -0
  128. package/examples/css/chart.css +282 -0
  129. package/examples/css/indicators.css +255 -0
  130. package/examples/index.html +163 -0
  131. package/examples/js/chart.js +370 -0
  132. package/examples/js/indicators.js +27 -0
  133. package/examples/js/main.js +6 -0
  134. package/examples/js/ui.js +1641 -0
  135. package/lib/lightweight-charts.standalone.production.js +7 -0
  136. package/package.json +106 -0
  137. package/src/react/FullFeaturedChart.css +1007 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FullFeaturedChart.js","sources":["../../src/react/FullFeaturedChart.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { useChart } from './hooks/useChart';\nimport { useIndicators } from './hooks/useIndicators';\nimport { useLineTools } from './hooks/useLineTools';\nimport { useShiftSnap } from './hooks/useShiftSnap';\nimport { IndicatorSettings } from './components/IndicatorSettings';\nimport type { CandleData } from '../types';\nimport type { FullFeaturedChartProps, TimeFrame, IndicatorConfigs, IndicatorType, TimeframeAvailability } from './types';\nimport { isValidCandle, filterValidCandles } from '../utils/validateCandle';\nimport { getLocaleStrings } from './locale';\nimport type { LocaleStrings } from './locale';\nimport './FullFeaturedChart.css';\n\nconst DEFAULT_COLORS = ['#26a69a', '#ef5350', '#2196f3', '#ff6f00', '#ab47bc', '#66bb6a', '#ffa726', '#42a5f5'];\n\nconst TIMEFRAME_KEYS: { value: TimeFrame; key: keyof LocaleStrings }[] = [\n { value: '1m', key: 'tf_1m' },\n { value: '5m', key: 'tf_5m' },\n { value: '15m', key: 'tf_15m' },\n { value: '30m', key: 'tf_30m' },\n { value: '1h', key: 'tf_1h' },\n { value: '1d', key: 'tf_1d' },\n { value: '1w', key: 'tf_1w' },\n { value: '1M', key: 'tf_1M' },\n];\n\nconst DEFAULT_TIMEFRAME_AVAILABILITY: TimeframeAvailability = {\n enabled: ['1m', '5m', '15m', '30m', '1h', '1d', '1w', '1M'],\n disabled: [],\n currentSession: 'regular',\n};\n\nfunction getToolLabel(t: LocaleStrings, toolType: string): string {\n const key = `tool_${toolType}` as keyof LocaleStrings;\n const val = t[key];\n return typeof val === 'string' ? val : toolType;\n}\n\n// localStorage 지표 설정 저장/복원\nfunction saveIndicatorState(key: string, configs: IndicatorConfigs, checked: Set<IndicatorType>, macdColors: { line: string; signal: string }) {\n try {\n localStorage.setItem(key, JSON.stringify({\n configs,\n checked: Array.from(checked),\n macdColors,\n }));\n } catch (e) {\n // localStorage 오류 무시\n }\n}\n\nfunction loadIndicatorState(key: string): { configs: IndicatorConfigs; checked: Set<IndicatorType>; macdColors: { line: string; signal: string } } | null {\n try {\n const saved = localStorage.getItem(key);\n if (!saved) return null;\n const parsed = JSON.parse(saved);\n return {\n configs: parsed.configs,\n checked: new Set(parsed.checked),\n macdColors: parsed.macdColors,\n };\n } catch (e) {\n return null;\n }\n}\n\n// 컨텍스트 메뉴 위치를 뷰포트 내에 고정\nfunction clampToViewport(x: number, y: number, menuWidth = 280, menuHeight = 50): { x: number; y: number } {\n const pad = 8;\n return {\n x: Math.max(pad, Math.min(x, window.innerWidth - menuWidth - pad)),\n y: Math.max(pad, Math.min(y, window.innerHeight - menuHeight - pad)),\n };\n}\n\nexport function FullFeaturedChart({\n locale: localeProp = 'en',\n data,\n width,\n height = 600,\n className = '',\n enableTimeframes = true,\n enableIndicators = true,\n enableDrawingTools = true,\n defaultTimeframe = '5m',\n timeframeAvailability = DEFAULT_TIMEFRAME_AVAILABILITY,\n onTimeframeChange,\n realtimeCandle,\n loading = false,\n error = null,\n symbol: _symbol,\n statusBadge,\n priceLines,\n initialLineTools,\n onLineToolsChange,\n onDrawingToolClick,\n showVolume = true,\n indicatorStorageKey,\n initialIndicatorState,\n onIndicatorStateChange,\n}: FullFeaturedChartProps) {\n const t = getLocaleStrings(localeProp);\n const [timeFrame, setTimeFrame] = useState<TimeFrame>(defaultTimeframe);\n const [candleData, setCandleData] = useState<CandleData[]>([]);\n const [indicatorDropdownOpen, setIndicatorDropdownOpen] = useState(false);\n const [drawingDropdownOpen, setDrawingDropdownOpen] = useState(false);\n const [textModalOpen, setTextModalOpen] = useState(false);\n const [textModalValue, setTextModalValue] = useState('');\n const [textModalMode, setTextModalMode] = useState<'add' | 'edit'>('add');\n const [contextMenuOpen, setContextMenuOpen] = useState(false);\n const [contextMenuPos, setContextMenuPos] = useState({ x: 0, y: 0 });\n const [contextMenuDragging, setContextMenuDragging] = useState(false);\n const [contextMenuDragOffset, setContextMenuDragOffset] = useState({ x: 0, y: 0 });\n const [colorPaletteOpen, setColorPaletteOpen] = useState(false);\n\n // 지표 설정 (우선순위: initialIndicatorState > localStorage > 기본값)\n const localState = indicatorStorageKey ? loadIndicatorState(indicatorStorageKey) : null;\n // 항상 모든 키가 존재하도록 기본값과 병합 (이전 버전 localStorage/외부 상태 호환)\n const DEFAULT_CONFIGS: IndicatorConfigs = { sma: [], ema: [], rsi: [], macd: [], bbands: [], stochastic: [], atr: [], vwap: [], williamsR: [] };\n const restoredConfigs: IndicatorConfigs = { ...DEFAULT_CONFIGS, ...(initialIndicatorState?.configs || localState?.configs || {}) };\n const restoredChecked = initialIndicatorState?.checked\n ? new Set(initialIndicatorState.checked)\n : localState?.checked || new Set<IndicatorType>();\n const restoredMacdColors = initialIndicatorState?.macdColors || localState?.macdColors || { line: '#2962FF', signal: '#FF6D00' };\n\n const [indicatorConfigs, setIndicatorConfigs] = useState<IndicatorConfigs>(restoredConfigs);\n const [checkedIndicators, setCheckedIndicators] = useState<Set<IndicatorType>>(restoredChecked);\n const [selectedIndicator, setSelectedIndicator] = useState<IndicatorType | null>(null);\n const [macdColors, setMacdColors] = useState(restoredMacdColors);\n\n const { chartRef, chart, candleSeries, volumeSeries, setData: setChartData } = useChart({ width, height });\n const { applyIndicators } = useIndicators(chart, candleData);\n\n // 볼륨 시리즈 표시/숨김\n useEffect(() => {\n if (volumeSeries) {\n try {\n volumeSeries.applyOptions({\n visible: showVolume,\n });\n } catch (e) {\n // 차트 파괴 시 무시\n }\n }\n }, [volumeSeries, showVolume]);\n\n // Line tools with auto context menu (뷰포트 바운더리 적용)\n const handleToolFinished = useCallback((_tool: any) => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const pos = clampToViewport(rect.left + rect.width / 2, rect.top + rect.height / 2);\n setContextMenuPos(pos);\n setContextMenuOpen(true);\n }\n }, []);\n\n const lineTools = useLineTools(chart, {\n onToolFinished: handleToolFinished,\n onToolsChange: onLineToolsChange,\n initialTools: initialLineTools,\n });\n useShiftSnap(chart, candleSeries, candleData);\n\n // Undo 히스토리 (도구 삭제 복원용)\n const undoStackRef = useRef<{ toolType: string; points: any[]; options: any }[]>([]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 타임프레임 변경 핸들러\n const handleTimeframeChange = useCallback((tf: TimeFrame) => {\n if (timeframeAvailability.disabled.includes(tf)) {\n return;\n }\n setTimeFrame(tf);\n onTimeframeChange?.(tf);\n }, [timeframeAvailability.disabled, onTimeframeChange]);\n\n // 외부 데이터 사용 (null/NaN 값 필터링)\n useEffect(() => {\n if (data && data.length > 0) {\n const validData = filterValidCandles(data, 'FullFeaturedChart');\n setCandleData(validData);\n }\n }, [data]);\n\n // 실시간 캔들 업데이트\n useEffect(() => {\n if (realtimeCandle && candleData.length > 0) {\n if (!isValidCandle(realtimeCandle)) {\n console.warn('[FullFeaturedChart] Skipping realtime candle with invalid values:', realtimeCandle);\n return;\n }\n\n setCandleData(prev => {\n const lastCandle = prev[prev.length - 1];\n const newData = lastCandle && lastCandle.time === realtimeCandle.time\n ? [...prev.slice(0, -1), realtimeCandle]\n : [...prev, realtimeCandle];\n return newData.filter(isValidCandle);\n });\n }\n }, [realtimeCandle]);\n\n // 차트에 데이터 설정 (초기 로드 또는 타임프레임 변경 시에만 fitContent)\n const isInitialLoad = useRef(true);\n const prevTimeFrameRef = useRef(timeFrame);\n useEffect(() => {\n if (candleData.length > 0) {\n const shouldFit = isInitialLoad.current || prevTimeFrameRef.current !== timeFrame;\n try {\n const validatedData = candleData.filter(isValidCandle);\n if (validatedData.length > 0) {\n setChartData(validatedData, shouldFit);\n } else {\n console.warn('[FullFeaturedChart] No valid data to display after final validation');\n }\n } catch (err) {\n console.error('[FullFeaturedChart] Error setting chart data:', err);\n }\n isInitialLoad.current = false;\n prevTimeFrameRef.current = timeFrame;\n }\n }, [candleData, setChartData, timeFrame]);\n\n // 지표 적용\n useEffect(() => {\n applyIndicators(indicatorConfigs, macdColors);\n }, [indicatorConfigs, candleData, applyIndicators, macdColors]);\n\n // 지표 설정 자동 저장 (localStorage + 외부 콜백)\n const indicatorInitRef = useRef(false);\n useEffect(() => {\n // 초기 마운트 시에는 콜백 호출 안 함 (로드한 값을 다시 저장하지 않도록)\n if (!indicatorInitRef.current) {\n indicatorInitRef.current = true;\n return;\n }\n if (indicatorStorageKey) {\n saveIndicatorState(indicatorStorageKey, indicatorConfigs, checkedIndicators, macdColors);\n }\n if (onIndicatorStateChange) {\n onIndicatorStateChange({\n configs: indicatorConfigs,\n checked: Array.from(checkedIndicators) as IndicatorType[],\n macdColors,\n });\n }\n }, [indicatorConfigs, checkedIndicators, macdColors, indicatorStorageKey, onIndicatorStateChange]);\n\n // 가격 라인 (평단가 등) 적용\n const priceLineRefsRef = useRef<any[]>([]);\n useEffect(() => {\n if (!candleSeries) return;\n\n // 기존 가격 라인 제거\n priceLineRefsRef.current.forEach((line) => {\n try {\n candleSeries.removePriceLine(line);\n } catch (e) {\n // 이미 제거된 경우 무시\n }\n });\n priceLineRefsRef.current = [];\n\n // 새 가격 라인 추가\n if (priceLines && priceLines.length > 0) {\n priceLines.forEach((priceLine) => {\n const lineStyleMap: Record<string, number> = {\n solid: 0, // LineStyle.Solid\n dashed: 1, // LineStyle.Dashed\n dotted: 3, // LineStyle.Dotted\n };\n\n const line = candleSeries.createPriceLine({\n price: priceLine.price,\n color: priceLine.color || '#FF9800',\n lineWidth: (priceLine.lineWidth || 2) as 1 | 2 | 3 | 4,\n lineStyle: lineStyleMap[priceLine.lineStyle || 'dashed'] || 1,\n lineVisible: true,\n axisLabelVisible: priceLine.axisLabelVisible !== false,\n title: priceLine.label || '',\n });\n priceLineRefsRef.current.push(line);\n });\n }\n\n return () => {\n const linesToRemove = [...priceLineRefsRef.current];\n priceLineRefsRef.current = [];\n\n linesToRemove.forEach((line) => {\n try {\n if (candleSeries && typeof candleSeries.options === 'function') {\n candleSeries.removePriceLine(line);\n }\n } catch (e) {\n // 차트가 이미 파괴된 경우 무시\n }\n });\n };\n }, [candleSeries, priceLines]);\n\n // 지표 체크박스 토글\n const toggleIndicator = useCallback((indicator: IndicatorType) => {\n const newChecked = new Set(checkedIndicators);\n\n if (newChecked.has(indicator)) {\n newChecked.delete(indicator);\n setIndicatorConfigs(prev => ({ ...prev, [indicator]: [] }));\n } else {\n newChecked.add(indicator);\n\n // 기본 설정 추가\n if (indicator === 'sma' || indicator === 'ema') {\n const periods = [5, 20, 60, 120];\n const thicknesses = [2, 2, 1, 1];\n const configs = periods.map((period, idx) => ({\n color: DEFAULT_COLORS[idx % DEFAULT_COLORS.length],\n thickness: thicknesses[idx] || 1,\n source: 'close' as const,\n value: period\n }));\n setIndicatorConfigs(prev => ({ ...prev, [indicator]: configs }));\n } else if (indicator === 'bbands') {\n setIndicatorConfigs(prev => ({\n ...prev,\n bbands: [{\n color: DEFAULT_COLORS[0],\n thickness: 2,\n source: 'close' as const,\n value: 20,\n upperColor: '#F23645',\n middleColor: '#2962FF',\n lowerColor: '#089981',\n stdDev: 2\n }]\n }));\n } else if (indicator === 'macd') {\n setIndicatorConfigs(prev => ({\n ...prev,\n macd: [{\n fastPeriod: 12,\n slowPeriod: 26,\n signalPeriod: 9,\n thickness: 2\n }]\n }));\n } else if (indicator === 'stochastic') {\n setIndicatorConfigs(prev => ({\n ...prev,\n stochastic: [{\n kPeriod: 14,\n dPeriod: 3,\n smooth: 3,\n kColor: '#2962FF',\n dColor: '#FF6D00',\n thickness: 2,\n }]\n }));\n } else if (indicator === 'vwap') {\n setIndicatorConfigs(prev => ({\n ...prev,\n vwap: [{\n color: '#E040FB',\n thickness: 2,\n }]\n }));\n } else if (indicator === 'atr') {\n setIndicatorConfigs(prev => ({\n ...prev,\n atr: [{\n color: DEFAULT_COLORS[0],\n thickness: 2,\n source: 'close' as const,\n value: 14,\n }]\n }));\n } else if (indicator === 'williamsR') {\n setIndicatorConfigs(prev => ({\n ...prev,\n williamsR: [{\n color: DEFAULT_COLORS[0],\n thickness: 2,\n source: 'close' as const,\n value: 14,\n }]\n }));\n } else {\n // RSI\n setIndicatorConfigs(prev => ({\n ...prev,\n [indicator]: [{\n color: DEFAULT_COLORS[0],\n thickness: 2,\n source: 'close' as const,\n value: 14\n }]\n }));\n }\n }\n\n setCheckedIndicators(newChecked);\n }, [checkedIndicators]);\n\n // 컨텍스트 메뉴 표시 (뷰포트 바운더리 적용)\n const showContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n if (lineTools.selectedToolId) {\n const pos = clampToViewport(e.clientX, e.clientY);\n setContextMenuPos(pos);\n setContextMenuOpen(true);\n }\n }, [lineTools.selectedToolId]);\n\n // 키보드 핸들러 (ESC + Ctrl+Z undo)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // input/textarea 내부에서는 무시\n const tag = (e.target as HTMLElement).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n\n if (e.key === 'Escape') {\n if (textModalOpen) {\n setTextModalOpen(false);\n return;\n }\n if (contextMenuOpen && lineTools.selectedToolId) {\n lineTools.removeSelectedTool();\n setContextMenuOpen(false);\n } else if (lineTools.activeToolType) {\n lineTools.activateTool(lineTools.activeToolType);\n }\n }\n\n // Ctrl+Z: 마지막 삭제된 도구 복원\n if ((e.ctrlKey || e.metaKey) && e.key === 'z' && !e.shiftKey) {\n const lastDeleted = undoStackRef.current.pop();\n if (lastDeleted && chart) {\n (chart as any).addLineTool(lastDeleted.toolType, lastDeleted.points, lastDeleted.options);\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [contextMenuOpen, lineTools, textModalOpen, chart]);\n\n // 텍스트 도구 활성화\n const handleTextToolClick = () => {\n setTextModalValue('Label');\n setTextModalMode('add');\n setTextModalOpen(true);\n };\n\n // 텍스트 모달 확인\n const handleTextModalConfirm = () => {\n if (textModalValue) {\n if (textModalMode === 'edit') {\n lineTools.updateText(textModalValue);\n } else {\n lineTools.addTextTool(textModalValue);\n }\n }\n setTextModalOpen(false);\n setTextModalValue('');\n };\n\n // 텍스트 편집 (모달 사용 - prompt() 대체)\n const openTextEditModal = useCallback(() => {\n if (lineTools.selectedTool?.toolType === 'Text') {\n setTextModalValue(lineTools.selectedTool.options.text?.value || '');\n setTextModalMode('edit');\n setTextModalOpen(true);\n }\n }, [lineTools.selectedTool]);\n\n // 컨텍스트 메뉴 드래그 시작\n const handleContextMenuMouseDown = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.context-menu-btn') ||\n (e.target as HTMLElement).closest('.color-picker-dropdown')) {\n return;\n }\n\n setContextMenuDragging(true);\n setContextMenuDragOffset({\n x: e.clientX - contextMenuPos.x,\n y: e.clientY - contextMenuPos.y\n });\n e.preventDefault();\n };\n\n // 컨텍스트 메뉴 드래그\n useEffect(() => {\n if (!contextMenuDragging) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n setContextMenuPos({\n x: e.clientX - contextMenuDragOffset.x,\n y: e.clientY - contextMenuDragOffset.y\n });\n };\n\n const handleMouseUp = () => {\n setContextMenuDragging(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [contextMenuDragging, contextMenuDragOffset]);\n\n // 더블클릭으로 텍스트 편집 (모달 사용)\n const handleChartDoubleClick = useCallback((_e: React.MouseEvent) => {\n if (lineTools.selectedTool && lineTools.selectedTool.toolType === 'Text') {\n setTextModalValue(lineTools.selectedTool.options.text?.value || '');\n setTextModalMode('edit');\n setTextModalOpen(true);\n }\n }, [lineTools]);\n\n // 도구 삭제 시 undo 스택에 저장\n const handleRemoveSelectedTool = useCallback(() => {\n if (lineTools.selectedTool) {\n undoStackRef.current.push({\n toolType: lineTools.selectedTool.toolType,\n points: lineTools.selectedTool.points,\n options: lineTools.selectedTool.options,\n });\n }\n lineTools.removeSelectedTool();\n setContextMenuOpen(false);\n }, [lineTools]);\n\n // Outside click 핸들러 (드롭다운 및 컨텍스트 메뉴 닫기)\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // 색상 팔레트 내부 클릭은 무시\n if (target.closest('.color-palette-popup')) {\n return;\n }\n\n // 지표 드롭다운 닫기\n if (indicatorDropdownOpen && !target.closest('.dropdown')) {\n setIndicatorDropdownOpen(false);\n }\n\n // 그리기 드롭다운 닫기\n if (drawingDropdownOpen && !target.closest('.dropdown')) {\n setDrawingDropdownOpen(false);\n }\n\n // 컨텍스트 메뉴 닫기\n if (contextMenuOpen && !target.closest('.context-menu')) {\n setContextMenuOpen(false);\n setColorPaletteOpen(false);\n }\n\n // 색상 팔레트 닫기\n if (colorPaletteOpen && !target.closest('.color-picker-dropdown')) {\n setColorPaletteOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [indicatorDropdownOpen, drawingDropdownOpen, contextMenuOpen, colorPaletteOpen]);\n\n return (\n <div\n className={`container ${className}`}\n ref={containerRef}\n style={{ display: 'flex', flexDirection: 'column', height: '100%' }}\n >\n {/* 헤더 */}\n <div className=\"header\">\n <div className=\"header-left\">\n {enableTimeframes && (\n <div className=\"timeframe-group\">\n {TIMEFRAME_KEYS.map(({ value: tf, key }) => {\n const isDisabled = timeframeAvailability.disabled.includes(tf);\n const isActive = timeFrame === tf;\n return (\n <button\n key={tf}\n className={`btn-timeframe ${isActive ? 'active' : ''} ${isDisabled ? 'disabled' : ''}`}\n onClick={() => handleTimeframeChange(tf)}\n disabled={isDisabled}\n title={isDisabled ? t.tf_unavailable : undefined}\n >\n {t[key] as string}\n </button>\n );\n })}\n </div>\n )}\n {statusBadge}\n </div>\n\n <div className=\"header-right\">\n {/* 활성 그리기 도구 피드백 배지 */}\n {enableDrawingTools && lineTools.activeToolType && (\n <div className=\"active-tool-badge\">\n {getToolLabel(t, lineTools.activeToolType)} {t.tool_drawing}\n </div>\n )}\n\n {enableIndicators && (\n <div className=\"dropdown\">\n <button className=\"btn-text\" onClick={() => {\n setIndicatorDropdownOpen(!indicatorDropdownOpen);\n setDrawingDropdownOpen(false);\n }}>\n {t.btn_indicators}\n </button>\n {indicatorDropdownOpen && (\n <div className=\"dropdown-menu show\" id=\"indicatorMenu\">\n <div className=\"indicator-menu-layout\">\n <div className=\"indicator-list-side\">\n <div className=\"indicator-category\">{t.cat_overlay}</div>\n <div\n className={`indicator-item ${checkedIndicators.has('sma') ? 'checked' : ''} ${selectedIndicator === 'sma' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('sma')}\n >\n <span>{t.ind_sma}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('sma'); setSelectedIndicator('sma'); }}></div>\n </div>\n <div\n className={`indicator-item ${checkedIndicators.has('ema') ? 'checked' : ''} ${selectedIndicator === 'ema' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('ema')}\n >\n <span>{t.ind_ema}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('ema'); setSelectedIndicator('ema'); }}></div>\n </div>\n <div\n className={`indicator-item ${checkedIndicators.has('bbands') ? 'checked' : ''} ${selectedIndicator === 'bbands' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('bbands')}\n >\n <span>{t.ind_bbands}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('bbands'); setSelectedIndicator('bbands'); }}></div>\n </div>\n <div\n className={`indicator-item ${checkedIndicators.has('vwap') ? 'checked' : ''} ${selectedIndicator === 'vwap' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('vwap')}\n >\n <span>{t.ind_vwap}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('vwap'); setSelectedIndicator('vwap'); }}></div>\n </div>\n <div className=\"indicator-category\">{t.cat_oscillator}</div>\n <div\n className={`indicator-item ${checkedIndicators.has('rsi') ? 'checked' : ''} ${selectedIndicator === 'rsi' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('rsi')}\n >\n <span>{t.ind_rsi}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('rsi'); setSelectedIndicator('rsi'); }}></div>\n </div>\n <div\n className={`indicator-item ${checkedIndicators.has('macd') ? 'checked' : ''} ${selectedIndicator === 'macd' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('macd')}\n >\n <span>{t.ind_macd}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('macd'); setSelectedIndicator('macd'); }}></div>\n </div>\n <div\n className={`indicator-item ${checkedIndicators.has('stochastic') ? 'checked' : ''} ${selectedIndicator === 'stochastic' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('stochastic')}\n >\n <span>{t.ind_stochastic}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('stochastic'); setSelectedIndicator('stochastic'); }}></div>\n </div>\n <div\n className={`indicator-item ${checkedIndicators.has('atr') ? 'checked' : ''} ${selectedIndicator === 'atr' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('atr')}\n >\n <span>{t.ind_atr}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('atr'); setSelectedIndicator('atr'); }}></div>\n </div>\n <div\n className={`indicator-item ${checkedIndicators.has('williamsR') ? 'checked' : ''} ${selectedIndicator === 'williamsR' ? 'selected' : ''}`}\n onClick={() => setSelectedIndicator('williamsR')}\n >\n <span>{t.ind_williamsR}</span>\n <div className=\"indicator-checkbox\" onClick={(e) => { e.stopPropagation(); toggleIndicator('williamsR'); setSelectedIndicator('williamsR'); }}></div>\n </div>\n </div>\n <div className=\"indicator-settings-side\">\n {selectedIndicator ? (\n <IndicatorSettings\n indicator={selectedIndicator}\n configs={indicatorConfigs}\n isChecked={checkedIndicators.has(selectedIndicator)}\n onConfigChange={(indicator, configs) => {\n setIndicatorConfigs(prev => ({ ...prev, [indicator]: configs }));\n }}\n macdColors={macdColors}\n onMacdColorsChange={setMacdColors}\n locale={localeProp}\n />\n ) : (\n <div className=\"indicator-empty-state\">{t.selectIndicator}</div>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n\n {enableDrawingTools && (\n <div className=\"dropdown\">\n <button className=\"btn-text\" onClick={() => {\n if (onDrawingToolClick && !onDrawingToolClick()) {\n return;\n }\n setDrawingDropdownOpen(!drawingDropdownOpen);\n setIndicatorDropdownOpen(false);\n }}>\n {t.btn_draw}\n </button>\n {drawingDropdownOpen && (\n <div className=\"dropdown-menu show\">\n <button className=\"dropdown-item\" onClick={() => { lineTools.activateTool('TrendLine'); setDrawingDropdownOpen(false); }}>\n <span className=\"item-icon tossface\">📏</span>\n <span>{t.tool_TrendLine}</span>\n </button>\n <button className=\"dropdown-item\" onClick={() => { lineTools.activateTool('HorizontalLine'); setDrawingDropdownOpen(false); }}>\n <span className=\"item-icon tossface\">➖</span>\n <span>{t.tool_HorizontalLine}</span>\n </button>\n <button className=\"dropdown-item\" onClick={() => { lineTools.activateTool('VerticalLine'); setDrawingDropdownOpen(false); }}>\n <span className=\"item-icon\">|</span>\n <span>{t.tool_VerticalLine}</span>\n </button>\n <button className=\"dropdown-item\" onClick={() => { lineTools.activateTool('Rectangle'); setDrawingDropdownOpen(false); }}>\n <span className=\"item-icon tossface\">▭</span>\n <span>{t.tool_Rectangle}</span>\n </button>\n <button className=\"dropdown-item\" onClick={() => { lineTools.activateTool('FibRetracement'); setDrawingDropdownOpen(false); }}>\n <span className=\"item-icon\">Φ</span>\n <span>{t.tool_FibRetracement}</span>\n </button>\n <button className=\"dropdown-item\" onClick={() => { handleTextToolClick(); setDrawingDropdownOpen(false); }}>\n <span className=\"item-icon\">T</span>\n <span>{t.tool_Text}</span>\n </button>\n </div>\n )}\n </div>\n )}\n\n {enableDrawingTools && (\n <>\n <div className=\"separator\"></div>\n <button className=\"btn-delete\" onClick={lineTools.removeAllTools}>{t.btn_clearAll}</button>\n </>\n )}\n </div>\n </div>\n\n {/* 차트 */}\n <div className=\"chart-wrapper\" style={{ position: 'relative', flex: 1, minHeight: 0 }}>\n <div\n ref={chartRef}\n style={{ width: '100%', height: '100%' }}\n onContextMenu={showContextMenu}\n onDoubleClick={handleChartDoubleClick}\n />\n\n {loading && (\n <div className=\"chart-overlay loading-overlay\">\n <div className=\"loading-spinner\"></div>\n <span>{t.loading}</span>\n </div>\n )}\n\n {error && (\n <div className=\"chart-overlay error-overlay\">\n <span className=\"error-icon\">⚠️</span>\n <span>{error}</span>\n </div>\n )}\n\n {!loading && !error && candleData.length === 0 && (\n <div className=\"chart-overlay empty-overlay\">\n <span>{t.noData}</span>\n </div>\n )}\n </div>\n\n {textModalOpen && (\n <div className=\"modal-overlay show\" onClick={() => setTextModalOpen(false)}>\n <div className=\"modal-content\" onClick={(e) => e.stopPropagation()}>\n <div className=\"modal-title\">{textModalMode === 'edit' ? t.textEdit : t.textAdd}</div>\n <input\n type=\"text\"\n className=\"modal-input\"\n value={textModalValue}\n onChange={(e) => setTextModalValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleTextModalConfirm();\n if (e.key === 'Escape') setTextModalOpen(false);\n }}\n placeholder={t.textPlaceholder}\n autoFocus\n />\n <div className=\"modal-buttons\">\n <button className=\"modal-btn modal-btn-cancel\" onClick={() => setTextModalOpen(false)}>{t.cancel}</button>\n <button className=\"modal-btn modal-btn-confirm\" onClick={handleTextModalConfirm}>{t.confirm}</button>\n </div>\n </div>\n </div>\n )}\n\n {/* 컨텍스트 메뉴 */}\n {contextMenuOpen && lineTools.selectedTool && (\n <div\n className=\"context-menu show\"\n style={{\n left: contextMenuPos.x,\n top: contextMenuPos.y,\n cursor: contextMenuDragging ? 'grabbing' : 'grab'\n }}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={handleContextMenuMouseDown}\n >\n <button className=\"context-menu-btn\" onClick={() => lineTools.updateLineWidth(Math.max(1, lineTools.currentWidth - 1))}>−</button>\n <div className=\"width-display\">{lineTools.currentWidth}</div>\n <button className=\"context-menu-btn\" onClick={() => lineTools.updateLineWidth(Math.min(10, lineTools.currentWidth + 1))}>+</button>\n <div className=\"context-menu-separator\"></div>\n <div className=\"color-picker-dropdown\">\n <button className=\"color-current-btn\" onClick={() => setColorPaletteOpen(!colorPaletteOpen)}>\n <div className=\"color-current-display\" style={{ background: lineTools.currentColor }}></div>\n </button>\n {colorPaletteOpen && (\n <div className=\"color-palette show\">\n {['#000000', '#ef4444', '#2962FF', '#22c55e', '#eab308', '#a855f7', '#f97316'].map(color => (\n <button\n key={color}\n className=\"color-option\"\n style={{ background: color }}\n onClick={() => {\n lineTools.updateColor(color);\n setColorPaletteOpen(false);\n }}\n />\n ))}\n </div>\n )}\n </div>\n {lineTools.selectedTool.toolType === 'Text' && (\n <>\n <div className=\"context-menu-separator\"></div>\n <button className=\"context-menu-btn\" onClick={openTextEditModal}>T</button>\n </>\n )}\n <div className=\"context-menu-separator\"></div>\n <button className=\"context-menu-btn danger\" onClick={handleRemoveSelectedTool}>🗑️</button>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DEFAULT_COLORS","TIMEFRAME_KEYS","DEFAULT_TIMEFRAME_AVAILABILITY","getToolLabel","t","toolType","key","val","saveIndicatorState","configs","checked","macdColors","loadIndicatorState","saved","parsed","clampToViewport","x","y","menuWidth","menuHeight","FullFeaturedChart","localeProp","data","width","height","className","enableTimeframes","enableIndicators","enableDrawingTools","defaultTimeframe","timeframeAvailability","onTimeframeChange","realtimeCandle","loading","error","_symbol","statusBadge","priceLines","initialLineTools","onLineToolsChange","onDrawingToolClick","showVolume","indicatorStorageKey","initialIndicatorState","onIndicatorStateChange","getLocaleStrings","timeFrame","setTimeFrame","useState","candleData","setCandleData","indicatorDropdownOpen","setIndicatorDropdownOpen","drawingDropdownOpen","setDrawingDropdownOpen","textModalOpen","setTextModalOpen","textModalValue","setTextModalValue","textModalMode","setTextModalMode","contextMenuOpen","setContextMenuOpen","contextMenuPos","setContextMenuPos","contextMenuDragging","setContextMenuDragging","contextMenuDragOffset","setContextMenuDragOffset","colorPaletteOpen","setColorPaletteOpen","localState","restoredConfigs","restoredChecked","restoredMacdColors","indicatorConfigs","setIndicatorConfigs","checkedIndicators","setCheckedIndicators","selectedIndicator","setSelectedIndicator","setMacdColors","chartRef","chart","candleSeries","volumeSeries","setChartData","useChart","applyIndicators","useIndicators","useEffect","handleToolFinished","useCallback","_tool","containerRef","rect","pos","lineTools","useLineTools","useShiftSnap","undoStackRef","useRef","handleTimeframeChange","tf","validData","filterValidCandles","isValidCandle","prev","lastCandle","isInitialLoad","prevTimeFrameRef","shouldFit","validatedData","err","indicatorInitRef","priceLineRefsRef","line","priceLine","lineStyleMap","linesToRemove","toggleIndicator","indicator","newChecked","periods","thicknesses","period","idx","showContextMenu","handleKeyDown","e","tag","lastDeleted","handleTextToolClick","handleTextModalConfirm","openTextEditModal","_a","_b","handleContextMenuMouseDown","handleMouseMove","handleMouseUp","handleChartDoubleClick","_e","handleRemoveSelectedTool","handleClickOutside","target","jsxs","jsx","isDisabled","IndicatorSettings","Fragment","color"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { IndicatorType, IndicatorConfigs } from '../types';
2
+ import { Locale } from '../locale';
3
+ interface IndicatorSettingsProps {
4
+ indicator: IndicatorType | null;
5
+ configs: IndicatorConfigs;
6
+ isChecked: boolean;
7
+ onConfigChange: (indicator: IndicatorType, configs: any[]) => void;
8
+ macdColors: {
9
+ line: string;
10
+ signal: string;
11
+ };
12
+ onMacdColorsChange: (colors: {
13
+ line: string;
14
+ signal: string;
15
+ }) => void;
16
+ locale?: Locale;
17
+ }
18
+ export declare function IndicatorSettings({ indicator, configs, isChecked, onConfigChange, macdColors, onMacdColorsChange, locale: localeProp, }: IndicatorSettingsProps): import("react/jsx-runtime").JSX.Element;
19
+ export {};
20
+ //# sourceMappingURL=IndicatorSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndicatorSettings.d.ts","sourceRoot":"","sources":["../../../src/react/components/IndicatorSettings.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAmF,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjJ,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,WAAW,CAAC;AAuFvD,UAAU,sBAAsB;IAC9B,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACnE,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,kBAAkB,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,OAAO,EACP,SAAS,EACT,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,MAAM,EAAE,UAAiB,GAC1B,EAAE,sBAAsB,2CAqkBxB"}