@363045841yyt/klinechart 0.4.0 → 0.4.2
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/README.md +6 -0
- package/dist/index.cjs +9 -9
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2212 -1654
- package/dist/klinechart.css +1 -1
- package/dist/src/api/data/baostock.d.ts +1 -1
- package/dist/src/api/data/kLine.d.ts +1 -1
- package/dist/src/api/data/types.d.ts +1 -1
- package/dist/src/api/data/unified.d.ts +1 -1
- package/dist/src/components/IndicatorSelector.vue.d.ts +2 -0
- package/dist/src/components/KLineChart.vue.d.ts +2 -2
- package/dist/src/components/KLineTooltip.vue.d.ts +1 -1
- package/dist/src/components/MarkerTooltip.vue.d.ts +1 -1
- package/dist/src/core/chart.d.ts +39 -13
- package/dist/src/core/controller/interaction.d.ts +12 -6
- package/dist/src/core/layout/pane.d.ts +12 -5
- package/dist/src/core/paneRenderer.d.ts +0 -4
- package/dist/src/core/renderers/Indicator/boll.d.ts +2 -2
- package/dist/src/core/renderers/Indicator/cci.d.ts +7 -3
- package/dist/src/core/renderers/Indicator/ene.d.ts +2 -2
- package/dist/src/core/renderers/Indicator/expma.d.ts +2 -2
- package/dist/src/core/renderers/Indicator/fastk.d.ts +7 -3
- package/dist/src/core/renderers/Indicator/index.d.ts +1 -1
- package/dist/src/core/renderers/Indicator/kst.d.ts +7 -3
- package/dist/src/core/renderers/Indicator/ma.d.ts +1 -1
- package/dist/src/core/renderers/Indicator/macd.d.ts +2 -2
- package/dist/src/core/renderers/Indicator/macdLegend.d.ts +1 -1
- package/dist/src/core/renderers/Indicator/mainIndicatorLegend.d.ts +1 -1
- package/dist/src/core/renderers/Indicator/mom.d.ts +7 -3
- package/dist/src/core/renderers/Indicator/rsi.d.ts +7 -3
- package/dist/src/core/renderers/Indicator/scale/cci_scale.d.ts +5 -0
- package/dist/src/core/renderers/Indicator/scale/fastk_scale.d.ts +5 -0
- package/dist/src/core/renderers/Indicator/scale/indicator_scale.d.ts +23 -0
- package/dist/src/core/renderers/Indicator/scale/kst_scale.d.ts +5 -0
- package/dist/src/core/renderers/Indicator/scale/macd_scale.d.ts +1 -1
- package/dist/src/core/renderers/Indicator/scale/mom_scale.d.ts +5 -0
- package/dist/src/core/renderers/Indicator/scale/rsi_scale.d.ts +5 -0
- package/dist/src/core/renderers/Indicator/scale/stoch_scale.d.ts +5 -0
- package/dist/src/core/renderers/Indicator/scale/wmsr_scale.d.ts +5 -0
- package/dist/src/core/renderers/Indicator/stoch.d.ts +7 -3
- package/dist/src/core/renderers/Indicator/wmsr.d.ts +7 -3
- package/dist/src/core/renderers/candle.d.ts +3 -3
- package/dist/src/core/renderers/crosshair.d.ts +1 -1
- package/dist/src/core/renderers/customMarkers.d.ts +1 -1
- package/dist/src/core/renderers/extremaMarkers.d.ts +1 -1
- package/dist/src/core/renderers/gridLines.d.ts +1 -1
- package/dist/src/core/renderers/lastPrice.d.ts +1 -1
- package/dist/src/core/renderers/paneTitle.d.ts +1 -1
- package/dist/src/core/renderers/subVolume.d.ts +1 -1
- package/dist/src/core/renderers/timeAxis.d.ts +1 -1
- package/dist/src/core/renderers/yAxis.d.ts +3 -2
- package/dist/src/core/viewport/viewport.d.ts +2 -2
- package/dist/src/plugin/HookSystem.d.ts +3 -3
- package/dist/src/plugin/PluginHost.d.ts +6 -5
- package/dist/src/plugin/rendererPluginManager.d.ts +6 -2
- package/dist/src/plugin/types.d.ts +25 -2
- package/dist/src/semantic/controller.d.ts +1 -1
- package/dist/src/utils/kLineDraw/MA.d.ts +1 -1
- package/dist/src/utils/kLineDraw/axis.d.ts +5 -1
- package/dist/src/utils/kLineDraw/grid.d.ts +1 -1
- package/dist/src/utils/kLineDraw/kLine.d.ts +1 -1
- package/dist/src/utils/kline/format.d.ts +2 -2
- package/dist/src/utils/kline/ma.d.ts +1 -1
- package/dist/src/utils/kline/viewport.d.ts +1 -1
- package/dist/src/utils/mock/genRandomPriceData.d.ts +1 -1
- package/dist/src/utils/volumePrice.d.ts +2 -2
- package/package.json +1 -1
- /package/dist/{semantic → src/semantic}/schema.json.d.ts +0 -0
package/dist/klinechart.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.kline-tooltip[data-v-95daa55c]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:200px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.kline-tooltip__title[data-v-95daa55c]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-95daa55c]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-95daa55c]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-95daa55c]:first-child{color:#0000008f}.marker-tooltip[data-v-dd43da4f]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:180px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.marker-tooltip__title[data-v-dd43da4f]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-dd43da4f]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-dd43da4f]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-dd43da4f]:first-child{color:#0000008f}.params-overlay[data-v-c14eedcc]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.indicator-params[data-v-c14eedcc]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.params-header[data-v-c14eedcc]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-c14eedcc]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-c14eedcc]{align-items:center;gap:8px;display:flex}.params-title[data-v-c14eedcc]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-c14eedcc]{color:#999;font-size:11px}.toggle-desc-btn[data-v-c14eedcc]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:all .2s;display:flex}.toggle-desc-btn[data-v-c14eedcc]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-c14eedcc]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-c14eedcc]{width:14px;height:14px}.params-close[data-v-c14eedcc]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-c14eedcc]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-c14eedcc]{width:14px;height:14px}.indicator-description[data-v-c14eedcc]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-c14eedcc]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-c14eedcc]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-c14eedcc]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-c14eedcc]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-c14eedcc]{padding:10px 14px 8px}.param-header[data-v-c14eedcc]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-c14eedcc]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-c14eedcc]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-c14eedcc]{color:#999;font-size:11px}.param-description[data-v-c14eedcc]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-c14eedcc]{background:#fff;border:1px solid #d0d0d0;border-radius:7px;align-items:stretch;height:32px;transition:border-color .2s;display:flex;overflow:hidden}.input-wrapper[data-v-c14eedcc]:focus-within{border-color:#999}.stepper-btn[data-v-c14eedcc]{cursor:pointer;color:#666;background:#f0f0f0;border:none;flex-shrink:0;justify-content:center;align-items:center;width:28px;font-size:15px;font-weight:400;line-height:1;transition:background .15s,color .15s;display:flex}.stepper-btn[data-v-c14eedcc]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-c14eedcc]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-c14eedcc]{text-align:center;color:#1a1a1a;appearance:textfield;background:0 0;border:none;border-left:1px solid #e8e8e8;border-right:1px solid #e8e8e8;width:60px;font-size:13px;font-weight:600}.param-input[data-v-c14eedcc]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-c14eedcc]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-c14eedcc]:focus{outline:none}.params-footer[data-v-c14eedcc]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-c14eedcc]{gap:8px;display:flex}.params-btn[data-v-c14eedcc]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.params-btn svg[data-v-c14eedcc]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-c14eedcc]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-c14eedcc]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-c14eedcc]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-c14eedcc]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-c14eedcc]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-c14eedcc]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-c14eedcc]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-c14eedcc],.overlay-leave-active[data-v-c14eedcc]{transition:opacity .2s}.overlay-enter-from[data-v-c14eedcc],.overlay-leave-to[data-v-c14eedcc]{opacity:0}.modal-enter-active[data-v-c14eedcc]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-c14eedcc]{transition:all .16s ease-in}.modal-enter-from[data-v-c14eedcc]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-c14eedcc]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-c14eedcc],.slide-leave-active[data-v-c14eedcc]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-c14eedcc],.slide-leave-to[data-v-c14eedcc]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-aad3b750]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-aad3b750]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-aad3b750]::-webkit-scrollbar{display:none}.indicator-list[data-v-aad3b750]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-item[data-v-aad3b750]{align-items:center;gap:4px;display:flex}.indicator-btn-wrapper[data-v-aad3b750]{position:relative}.indicator-btn[data-v-aad3b750]{color:#666;cursor:pointer;white-space:nowrap;background:#fff;border:1px solid #e0e0e0;border-radius:16px;flex-shrink:0;justify-content:center;align-items:center;gap:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .3s;display:flex;position:relative;overflow:hidden}.indicator-btn[data-v-aad3b750]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-aad3b750]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-aad3b750]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-aad3b750]{z-index:1;position:relative}.param-hint[data-v-aad3b750]{opacity:.85;font-size:11px}.hover-overlay[data-v-aad3b750]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2;background:#ffffffd9;border-radius:16px;justify-content:center;align-items:center;gap:4px;display:flex;position:absolute;inset:0}.action-btn[data-v-aad3b750]{color:#666;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:all .2s;display:flex}.action-btn[data-v-aad3b750]:hover{color:#333;background:#0000000f}.settings-btn[data-v-aad3b750]:hover{color:#1a1a1a}.remove-btn[data-v-aad3b750]:hover{color:#ff4d4f}.divider[data-v-aad3b750]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-aad3b750]{color:#999;cursor:pointer;background:0 0;border:1px dashed #d9d9d9;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;transition:all .3s;display:flex}.add-btn[data-v-aad3b750]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-aad3b750]{white-space:nowrap;z-index:9999;background:#fff;border-radius:8px;padding:8px 0;position:fixed;transform:translate(-50%);box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d}.menu-section[data-v-aad3b750]{padding:4px 0}.menu-section[data-v-aad3b750]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-aad3b750]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-aad3b750]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-aad3b750]{text-align:left;color:#333;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:8px 16px;font-size:13px;transition:background .2s;display:flex}.menu-item[data-v-aad3b750]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-aad3b750]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-aad3b750]{color:#999;font-size:11px}.active-tag[data-v-aad3b750]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-aad3b750],.fade-leave-active[data-v-aad3b750]{transition:opacity .2s}.fade-enter-from[data-v-aad3b750],.fade-leave-to[data-v-aad3b750]{opacity:0}.slide-enter-active[data-v-aad3b750],.slide-leave-active[data-v-aad3b750]{transition:all .2s}.slide-enter-from[data-v-aad3b750],.slide-leave-to[data-v-aad3b750]{opacity:0;transform:translate(-50%)translateY(8px)}.chart-wrapper[data-v-d57ed432]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-container[data-v-d57ed432]{scrollbar-width:none;-ms-overflow-style:none;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;border:1px solid #e0e0e0;width:95%;height:85%;min-height:255px;position:relative;overflow:auto hidden}.chart-container[data-v-d57ed432]::-webkit-scrollbar{display:none}.chart-container[data-v-d57ed432]:hover{cursor:grab}.chart-container[data-v-d57ed432]:active{cursor:grabbing}.scroll-content[data-v-d57ed432]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-d57ed432]{pointer-events:none;position:sticky;top:0;left:0}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;right:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.main,.sub{border-bottom:1px solid #e0e0e0;border-right:1px solid #e0e0e0}.x-axis-canvas{border-right:1px solid #e0e0e0}.right-axis{border-bottom:1px solid #e0e0e0}
|
|
1
|
+
.kline-tooltip[data-v-95daa55c]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:200px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.kline-tooltip__title[data-v-95daa55c]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-95daa55c]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-95daa55c]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-95daa55c]:first-child{color:#0000008f}.marker-tooltip[data-v-dd43da4f]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:180px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.marker-tooltip__title[data-v-dd43da4f]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-dd43da4f]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-dd43da4f]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-dd43da4f]:first-child{color:#0000008f}.params-overlay[data-v-c14eedcc]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.indicator-params[data-v-c14eedcc]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.params-header[data-v-c14eedcc]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-c14eedcc]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-c14eedcc]{align-items:center;gap:8px;display:flex}.params-title[data-v-c14eedcc]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-c14eedcc]{color:#999;font-size:11px}.toggle-desc-btn[data-v-c14eedcc]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:all .2s;display:flex}.toggle-desc-btn[data-v-c14eedcc]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-c14eedcc]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-c14eedcc]{width:14px;height:14px}.params-close[data-v-c14eedcc]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-c14eedcc]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-c14eedcc]{width:14px;height:14px}.indicator-description[data-v-c14eedcc]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-c14eedcc]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-c14eedcc]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-c14eedcc]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-c14eedcc]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-c14eedcc]{padding:10px 14px 8px}.param-header[data-v-c14eedcc]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-c14eedcc]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-c14eedcc]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-c14eedcc]{color:#999;font-size:11px}.param-description[data-v-c14eedcc]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-c14eedcc]{background:#fff;border:1px solid #d0d0d0;border-radius:7px;align-items:stretch;height:32px;transition:border-color .2s;display:flex;overflow:hidden}.input-wrapper[data-v-c14eedcc]:focus-within{border-color:#999}.stepper-btn[data-v-c14eedcc]{cursor:pointer;color:#666;background:#f0f0f0;border:none;flex-shrink:0;justify-content:center;align-items:center;width:28px;font-size:15px;font-weight:400;line-height:1;transition:background .15s,color .15s;display:flex}.stepper-btn[data-v-c14eedcc]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-c14eedcc]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-c14eedcc]{text-align:center;color:#1a1a1a;appearance:textfield;background:0 0;border:none;border-left:1px solid #e8e8e8;border-right:1px solid #e8e8e8;width:60px;font-size:13px;font-weight:600}.param-input[data-v-c14eedcc]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-c14eedcc]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-c14eedcc]:focus{outline:none}.params-footer[data-v-c14eedcc]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-c14eedcc]{gap:8px;display:flex}.params-btn[data-v-c14eedcc]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.params-btn svg[data-v-c14eedcc]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-c14eedcc]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-c14eedcc]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-c14eedcc]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-c14eedcc]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-c14eedcc]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-c14eedcc]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-c14eedcc]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-c14eedcc],.overlay-leave-active[data-v-c14eedcc]{transition:opacity .2s}.overlay-enter-from[data-v-c14eedcc],.overlay-leave-to[data-v-c14eedcc]{opacity:0}.modal-enter-active[data-v-c14eedcc]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-c14eedcc]{transition:all .16s ease-in}.modal-enter-from[data-v-c14eedcc]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-c14eedcc]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-c14eedcc],.slide-leave-active[data-v-c14eedcc]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-c14eedcc],.slide-leave-to[data-v-c14eedcc]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-061fa6d4]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-061fa6d4]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-061fa6d4]::-webkit-scrollbar{display:none}.indicator-list[data-v-061fa6d4]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-061fa6d4]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-061fa6d4]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-061fa6d4],.indicator-item.draggable .indicator-btn[data-v-061fa6d4],.indicator-item.draggable[data-v-061fa6d4]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-061fa6d4]{cursor:move}.indicator-item.is-dragging[data-v-061fa6d4]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-061fa6d4]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-061fa6d4]{position:relative}.indicator-btn[data-v-061fa6d4]{color:#666;cursor:pointer;white-space:nowrap;background:#fff;border:1px solid #e0e0e0;border-radius:16px;flex-shrink:0;justify-content:center;align-items:center;gap:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .3s;display:flex;position:relative;overflow:hidden}.indicator-btn[data-v-061fa6d4]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-061fa6d4]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-061fa6d4]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-061fa6d4]{z-index:1;position:relative}.param-hint[data-v-061fa6d4]{opacity:.85;font-size:11px}.hover-overlay[data-v-061fa6d4]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2;background:#ffffffd9;border-radius:16px;justify-content:center;align-items:center;gap:4px;display:flex;position:absolute;inset:0}.action-btn[data-v-061fa6d4]{color:#666;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:all .2s;display:flex}.action-btn[data-v-061fa6d4]:hover{color:#333;background:#0000000f}.settings-btn[data-v-061fa6d4]:hover{color:#1a1a1a}.remove-btn[data-v-061fa6d4]:hover{color:#ff4d4f}.divider[data-v-061fa6d4]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-061fa6d4]{color:#999;cursor:pointer;background:0 0;border:1px dashed #d9d9d9;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;transition:all .3s;display:flex}.add-btn[data-v-061fa6d4]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-061fa6d4]{white-space:nowrap;z-index:9999;background:#fff;border-radius:8px;padding:8px 0;position:fixed;transform:translate(-50%);box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d}.menu-section[data-v-061fa6d4]{padding:4px 0}.menu-section[data-v-061fa6d4]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-061fa6d4]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-061fa6d4]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-061fa6d4]{text-align:left;color:#333;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:8px 16px;font-size:13px;transition:background .2s;display:flex}.menu-item[data-v-061fa6d4]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-061fa6d4]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-061fa6d4]{color:#999;font-size:11px}.active-tag[data-v-061fa6d4]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-061fa6d4],.fade-leave-active[data-v-061fa6d4]{transition:opacity .2s}.fade-enter-from[data-v-061fa6d4],.fade-leave-to[data-v-061fa6d4]{opacity:0}.slide-enter-active[data-v-061fa6d4],.slide-leave-active[data-v-061fa6d4]{transition:all .2s}.slide-enter-from[data-v-061fa6d4],.slide-leave-to[data-v-061fa6d4]{opacity:0;transform:translate(-50%)translateY(8px)}.chart-wrapper[data-v-fe7804fa]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-container[data-v-fe7804fa]{scrollbar-width:none;-ms-overflow-style:none;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;border:1px solid #e0e0e0;width:95%;height:85%;min-height:255px;position:relative;overflow:auto hidden}.chart-container[data-v-fe7804fa]::-webkit-scrollbar{display:none}.chart-container[data-v-fe7804fa]:hover{cursor:grab}.chart-container.is-resizing-pane[data-v-fe7804fa],.chart-container.is-hovering-pane-separator[data-v-fe7804fa]{cursor:row-resize}.scroll-content[data-v-fe7804fa]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-fe7804fa]{pointer-events:none;position:sticky;top:0;left:0}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;right:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.main,.sub{border-bottom:1px solid #e0e0e0;border-right:1px solid #e0e0e0}.x-axis-canvas{border-right:1px solid #e0e0e0}.right-axis{border-bottom:1px solid #e0e0e0}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -14,9 +14,11 @@ type __VLS_Props = {
|
|
|
14
14
|
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
15
15
|
toggle: (indicatorId: string, active: boolean) => any;
|
|
16
16
|
updateParams: (indicatorId: string, params: Record<string, number>) => any;
|
|
17
|
+
reorderSubIndicators: (orderedIndicatorIds: string[]) => any;
|
|
17
18
|
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
18
19
|
onToggle?: ((indicatorId: string, active: boolean) => any) | undefined;
|
|
19
20
|
onUpdateParams?: ((indicatorId: string, params: Record<string, number>) => any) | undefined;
|
|
21
|
+
onReorderSubIndicators?: ((orderedIndicatorIds: string[]) => any) | undefined;
|
|
20
22
|
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
21
23
|
addBtnRef: HTMLButtonElement;
|
|
22
24
|
addMenuRef: HTMLDivElement;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SemanticChartConfig } from '
|
|
2
|
-
import { SubIndicatorType } from '
|
|
1
|
+
import { SemanticChartConfig } from '../semantic';
|
|
2
|
+
import { SubIndicatorType } from '../core/renderers/Indicator';
|
|
3
3
|
type __VLS_Props = {
|
|
4
4
|
/** 语义化配置(必需,唯一控制源) */
|
|
5
5
|
semanticConfig: SemanticChartConfig;
|
package/dist/src/core/chart.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { KLineData } from '
|
|
2
|
-
import { VisibleRange } from '
|
|
3
|
-
import { InteractionController } from '
|
|
4
|
-
import { PaneRenderer } from '
|
|
1
|
+
import { KLineData } from '../types/price';
|
|
2
|
+
import { VisibleRange } from './layout/pane';
|
|
3
|
+
import { InteractionController } from './controller/interaction';
|
|
4
|
+
import { PaneRenderer } from './paneRenderer';
|
|
5
5
|
import { MarkerManager, CustomMarkerEntity } from './marker/registry';
|
|
6
|
-
import { getPhysicalKLineConfig, calcKWidthPx } from '
|
|
7
|
-
import { PluginHostImpl, RendererPlugin, RendererPluginWithHost } from '
|
|
8
|
-
import { SubIndicatorType } from '
|
|
6
|
+
import { getPhysicalKLineConfig, calcKWidthPx } from './utils/klineConfig';
|
|
7
|
+
import { PluginHostImpl, RendererPlugin, RendererPluginWithHost, PaneRole, PaneCapabilities } from '../plugin';
|
|
8
|
+
import { SubIndicatorType } from './renderers/Indicator';
|
|
9
9
|
export { getPhysicalKLineConfig, calcKWidthPx };
|
|
10
10
|
/**
|
|
11
11
|
* 图表 DOM 元素引用
|
|
@@ -28,6 +28,9 @@ export type PaneSpec = {
|
|
|
28
28
|
id: string;
|
|
29
29
|
ratio: number;
|
|
30
30
|
visible?: boolean;
|
|
31
|
+
minHeightPx?: number;
|
|
32
|
+
role?: PaneRole;
|
|
33
|
+
capabilities?: Partial<PaneCapabilities>;
|
|
31
34
|
};
|
|
32
35
|
export type PaneRendererDom = {
|
|
33
36
|
plotCanvas: HTMLCanvasElement;
|
|
@@ -46,6 +49,8 @@ export type ChartOptions = {
|
|
|
46
49
|
paneGap?: number;
|
|
47
50
|
/** 价格标签额外宽度(用于显示涨跌幅,默认 60px) */
|
|
48
51
|
priceLabelWidth?: number;
|
|
52
|
+
/** pane 最小高度(逻辑像素,默认 60) */
|
|
53
|
+
defaultPaneMinHeightPx?: number;
|
|
49
54
|
};
|
|
50
55
|
/** K 线起始 x 坐标数组,positions[i] 表示第 i 根 K 线的起始 x 坐标(逻辑像素) */
|
|
51
56
|
export type KLinePositions = number[];
|
|
@@ -76,8 +81,12 @@ export declare class Chart {
|
|
|
76
81
|
private resizeObserver?;
|
|
77
82
|
/** 最近一次观测到的容器尺寸 */
|
|
78
83
|
private observedSize;
|
|
84
|
+
/** pane ratio 状态(按 paneId 维护,sum=1 仅对可见 pane) */
|
|
85
|
+
private paneRatios;
|
|
79
86
|
/** 视口变化回调(供外部同步 DPR/尺寸) */
|
|
80
87
|
private onViewportChange?;
|
|
88
|
+
/** pane 布局回流回调(Chart -> UI 单向) */
|
|
89
|
+
private onPaneLayoutChange?;
|
|
81
90
|
/**
|
|
82
91
|
* 创建图表实例
|
|
83
92
|
* @param dom 由 Vue 组件传入的 DOM 句柄
|
|
@@ -128,6 +137,8 @@ export declare class Chart {
|
|
|
128
137
|
setOnZoomChange(cb: (kWidth: number, kGap: number, targetScrollLeft: number) => void): void;
|
|
129
138
|
/** 注册视口变化回调 */
|
|
130
139
|
setOnViewportChange(cb: (viewport: Viewport) => void): void;
|
|
140
|
+
/** 注册 pane 布局回流回调 */
|
|
141
|
+
setOnPaneLayoutChange(cb: (panes: PaneSpec[]) => void): void;
|
|
131
142
|
/** 获取所有 PaneRenderer */
|
|
132
143
|
getPaneRenderers(): PaneRenderer[];
|
|
133
144
|
/** 获取 MarkerManager(供 InteractionController 使用) */
|
|
@@ -151,15 +162,25 @@ export declare class Chart {
|
|
|
151
162
|
* @param partial 部分配置项
|
|
152
163
|
*/
|
|
153
164
|
updateOptions(partial: Partial<ChartOptions>): void;
|
|
154
|
-
/**
|
|
155
|
-
* 更新 pane 布局配置
|
|
165
|
+
/** 更新 pane 布局配置
|
|
156
166
|
* @param panes 新的 pane 配置数组
|
|
157
167
|
*/
|
|
158
168
|
updatePaneLayout(panes: PaneSpec[]): void;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
169
|
+
setPaneDefinitions(defs: PaneSpec[]): void;
|
|
170
|
+
upsertPane(def: PaneSpec): void;
|
|
171
|
+
removePaneDefinition(paneId: string): void;
|
|
172
|
+
bindIndicatorToPane(paneId: string, indicatorId: SubIndicatorType, params?: Record<string, number>): void;
|
|
173
|
+
/** 获取当前 pane 布局快照(含 ratio) */
|
|
174
|
+
getPaneLayoutSpecs(): PaneSpec[];
|
|
175
|
+
private emitPaneLayoutChange;
|
|
176
|
+
private applyPaneLayoutSpecs;
|
|
177
|
+
/**
|
|
178
|
+
* 调整相邻 pane 边界(支持连锁挤压)
|
|
179
|
+
* @param upperPaneId 上方 pane ID(边界位于此 pane 与其下方邻居之间)
|
|
180
|
+
* @param deltaY Y 方向位移(逻辑像素,正数表示边界向下,upper 增大;负数表示向上,upper 减小)
|
|
181
|
+
*/
|
|
182
|
+
resizePaneBoundary(upperPaneId: string, deltaY: number): boolean;
|
|
183
|
+
private resolvePaneRole;
|
|
163
184
|
addPane(paneId: string): void;
|
|
164
185
|
/**
|
|
165
186
|
* 动态移除 pane
|
|
@@ -216,6 +237,11 @@ export declare class Chart {
|
|
|
216
237
|
destroy(): Promise<void>;
|
|
217
238
|
/** 初始化所有 pane */
|
|
218
239
|
private initPanes;
|
|
240
|
+
private syncPaneRatiosFromSpecs;
|
|
241
|
+
private syncPaneRatiosToSpecs;
|
|
242
|
+
private normalizeVisiblePaneRatios;
|
|
243
|
+
private getPaneMinHeight;
|
|
244
|
+
private computePaneHeightsByRatio;
|
|
219
245
|
/** 计算每个 pane 的布局(top 和 height) */
|
|
220
246
|
private layoutPanes;
|
|
221
247
|
private computeViewport;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Chart } from '../chart';
|
|
2
|
-
import { MarkerEntity, CustomMarkerEntity } from '
|
|
2
|
+
import { MarkerEntity, CustomMarkerEntity } from '../marker/registry';
|
|
3
3
|
/** 标记 hover 事件数据 */
|
|
4
4
|
export interface MarkerHoverEvent {
|
|
5
5
|
type: 'volume-price' | 'custom';
|
|
@@ -11,11 +11,15 @@ export interface MarkerHoverEvent {
|
|
|
11
11
|
export declare class InteractionController {
|
|
12
12
|
private chart;
|
|
13
13
|
private isDragging;
|
|
14
|
+
private dragMode;
|
|
14
15
|
private dragStartX;
|
|
15
16
|
private scrollStartX;
|
|
16
17
|
/** 垂直拖动相关 */
|
|
17
18
|
private dragStartY;
|
|
18
19
|
private activePaneIdOnDrag;
|
|
20
|
+
/** 分隔线拖拽相关 */
|
|
21
|
+
private activeSeparatorUpperPaneId;
|
|
22
|
+
private hoveredSeparatorUpperPaneId;
|
|
19
23
|
/** [触屏]:触摸会话标记,避免触摸触发的模拟 mouse 事件干扰 */
|
|
20
24
|
private isTouchSession;
|
|
21
25
|
/** 十字线位置 */
|
|
@@ -127,6 +131,10 @@ export declare class InteractionController {
|
|
|
127
131
|
} | null, kWidthPx?: number): void;
|
|
128
132
|
/** 检查是否正在拖拽 */
|
|
129
133
|
isDraggingState(): boolean;
|
|
134
|
+
/** 是否处于分隔线拖拽状态 */
|
|
135
|
+
isResizingPaneBoundaryState(): boolean;
|
|
136
|
+
/** 是否悬停在可拖拽分隔线上 */
|
|
137
|
+
isHoveringPaneBoundaryState(): boolean;
|
|
130
138
|
/** 设置 marker hover 回调 */
|
|
131
139
|
setOnMarkerHover(callback: (marker: MarkerEntity | null) => void): void;
|
|
132
140
|
/** 设置 marker click 回调 */
|
|
@@ -135,13 +143,11 @@ export declare class InteractionController {
|
|
|
135
143
|
setOnCustomMarkerHover(callback: (marker: CustomMarkerEntity | null) => void): void;
|
|
136
144
|
/** 设置自定义标记 click 回调 */
|
|
137
145
|
setOnCustomMarkerClick(callback: (marker: CustomMarkerEntity) => void): void;
|
|
146
|
+
/** 命中可拖拽分隔线(返回上方 paneId) */
|
|
147
|
+
private hitTestPaneSeparator;
|
|
138
148
|
/** 清除 hover 状态 */
|
|
139
149
|
private clearHover;
|
|
140
|
-
|
|
141
|
-
* 从鼠标事件更新 hover 状态
|
|
142
|
-
* @param e MouseEvent
|
|
143
|
-
*/
|
|
144
|
-
private updateHover;
|
|
150
|
+
private clearSeparatorState;
|
|
145
151
|
/**
|
|
146
152
|
* 从屏幕坐标更新 hover 状态
|
|
147
153
|
* @param clientX 屏幕 x 坐标
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { KLineData } from '
|
|
2
|
-
import { PriceRange } from '
|
|
3
|
-
import { PriceScale } from '
|
|
4
|
-
import { MarkerManager } from '
|
|
1
|
+
import { KLineData } from '../../types/price';
|
|
2
|
+
import { PriceRange } from '../scale/price';
|
|
3
|
+
import { PriceScale } from '../scale/priceScale';
|
|
4
|
+
import { MarkerManager } from '../marker/registry';
|
|
5
|
+
import { PaneCapabilities, PaneRole } from '../../plugin';
|
|
5
6
|
export type VisibleRange = {
|
|
6
7
|
start: number;
|
|
7
8
|
end: number;
|
|
8
9
|
};
|
|
10
|
+
export interface PaneInitOptions {
|
|
11
|
+
role?: PaneRole;
|
|
12
|
+
capabilities?: Partial<PaneCapabilities>;
|
|
13
|
+
}
|
|
9
14
|
/**
|
|
10
15
|
* Pane 级渲染器接口:在单个 pane 的坐标系中绘制内容
|
|
11
16
|
*/
|
|
@@ -42,6 +47,8 @@ export interface PaneRenderer {
|
|
|
42
47
|
*/
|
|
43
48
|
export declare class Pane {
|
|
44
49
|
readonly id: string;
|
|
50
|
+
readonly role: PaneRole;
|
|
51
|
+
readonly capabilities: PaneCapabilities;
|
|
45
52
|
top: number;
|
|
46
53
|
height: number;
|
|
47
54
|
/** 当前 pane 的可视价格范围(用于右侧轴、以及渲染器内部) */
|
|
@@ -54,7 +61,7 @@ export declare class Pane {
|
|
|
54
61
|
* 创建 pane 实例
|
|
55
62
|
* @param id pane 标识符(例如 'main'、'sub'),用于在 Chart/Interaction 中识别 pane
|
|
56
63
|
*/
|
|
57
|
-
constructor(id: string);
|
|
64
|
+
constructor(id: string, options?: PaneInitOptions);
|
|
58
65
|
/**
|
|
59
66
|
* 设置 pane 的垂直布局
|
|
60
67
|
* @param top 相对 plotCanvas 顶部的偏移(逻辑像素)
|
|
@@ -7,10 +7,6 @@ export type PaneRendererOptions = {
|
|
|
7
7
|
yPaddingPx: number;
|
|
8
8
|
priceLabelWidth?: number;
|
|
9
9
|
};
|
|
10
|
-
/**
|
|
11
|
-
* PaneRenderer:负责单个 Pane 的 Canvas 管理
|
|
12
|
-
* 渲染逻辑由 Chart 通过 RendererPluginManager 统一调度
|
|
13
|
-
*/
|
|
14
10
|
export declare class PaneRenderer {
|
|
15
11
|
private dom;
|
|
16
12
|
private pane;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RendererPlugin } from '
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPlugin } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface BOLLConfig {
|
|
4
4
|
/** 周期(默认20) */
|
|
5
5
|
period?: number;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPluginWithHost, BaseIndicatorState } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface CCIConfig {
|
|
4
4
|
/** 周期(默认 14) */
|
|
5
5
|
period?: number;
|
|
6
6
|
/** 是否显示 CCI 线 */
|
|
7
7
|
showCCI?: boolean;
|
|
8
8
|
}
|
|
9
|
+
export interface CCIRenderState extends BaseIndicatorState {
|
|
10
|
+
valueMin: number;
|
|
11
|
+
valueMax: number;
|
|
12
|
+
}
|
|
9
13
|
export interface CCIRendererOptions {
|
|
10
14
|
/** 目标 pane ID(默认 'sub') */
|
|
11
15
|
paneId?: string;
|
|
@@ -15,7 +19,7 @@ export interface CCIRendererOptions {
|
|
|
15
19
|
/**
|
|
16
20
|
* 创建 CCI 渲染器插件
|
|
17
21
|
*/
|
|
18
|
-
export declare function createCCIRendererPlugin(options?: CCIRendererOptions):
|
|
22
|
+
export declare function createCCIRendererPlugin(options?: CCIRendererOptions): RendererPluginWithHost;
|
|
19
23
|
/**
|
|
20
24
|
* 计算指定索引处的 CCI 值
|
|
21
25
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RendererPlugin } from '
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPlugin } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface ENEConfig {
|
|
4
4
|
/** 周期(默认10) */
|
|
5
5
|
period?: number;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RendererPlugin } from '
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPlugin } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface EXPMAConfig {
|
|
4
4
|
/** 快线周期(默认12) */
|
|
5
5
|
fastPeriod?: number;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPluginWithHost, BaseIndicatorState } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface FASTKConfig {
|
|
4
4
|
/** 周期(默认 9) */
|
|
5
5
|
period?: number;
|
|
6
6
|
/** 是否显示 FASTK 线 */
|
|
7
7
|
showFASTK?: boolean;
|
|
8
8
|
}
|
|
9
|
+
export interface FASTKRenderState extends BaseIndicatorState {
|
|
10
|
+
valueMin: number;
|
|
11
|
+
valueMax: number;
|
|
12
|
+
}
|
|
9
13
|
export interface FASTKRendererOptions {
|
|
10
14
|
/** 目标 pane ID(默认 'sub') */
|
|
11
15
|
paneId?: string;
|
|
@@ -15,7 +19,7 @@ export interface FASTKRendererOptions {
|
|
|
15
19
|
/**
|
|
16
20
|
* 创建 FASTK 渲染器插件
|
|
17
21
|
*/
|
|
18
|
-
export declare function createFASTKRendererPlugin(options?: FASTKRendererOptions):
|
|
22
|
+
export declare function createFASTKRendererPlugin(options?: FASTKRendererOptions): RendererPluginWithHost;
|
|
19
23
|
/**
|
|
20
24
|
* 计算指定索引处的 FASTK 值
|
|
21
25
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RendererPlugin } from '
|
|
1
|
+
import { RendererPlugin } from '../../../plugin';
|
|
2
2
|
export { createMARendererPlugin, type MAFlags } from './ma';
|
|
3
3
|
export { createBOLLRendererPlugin, calcBOLLAtIndex, type BOLLConfig } from './boll';
|
|
4
4
|
export { createEXPMARendererPlugin, calcEXPMAAtIndex, type EXPMAConfig } from './expma';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPluginWithHost, BaseIndicatorState } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface KSTConfig {
|
|
4
4
|
/** ROC1 周期(默认 10) */
|
|
5
5
|
roc1?: number;
|
|
@@ -20,6 +20,10 @@ interface KSTPoint {
|
|
|
20
20
|
kst: number;
|
|
21
21
|
signal: number;
|
|
22
22
|
}
|
|
23
|
+
export interface KSTRenderState extends BaseIndicatorState {
|
|
24
|
+
valueMin: number;
|
|
25
|
+
valueMax: number;
|
|
26
|
+
}
|
|
23
27
|
export interface KSTRendererOptions {
|
|
24
28
|
/** 目标 pane ID(默认 'sub') */
|
|
25
29
|
paneId?: string;
|
|
@@ -29,7 +33,7 @@ export interface KSTRendererOptions {
|
|
|
29
33
|
/**
|
|
30
34
|
* 创建 KST 渲染器插件
|
|
31
35
|
*/
|
|
32
|
-
export declare function createKSTRendererPlugin(options?: KSTRendererOptions):
|
|
36
|
+
export declare function createKSTRendererPlugin(options?: KSTRendererOptions): RendererPluginWithHost;
|
|
33
37
|
/**
|
|
34
38
|
* 计算指定索引处的 KST 值
|
|
35
39
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RendererPluginWithHost, BaseIndicatorState } from '
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPluginWithHost, BaseIndicatorState } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface MACDConfig {
|
|
4
4
|
/** 快线周期(默认 12) */
|
|
5
5
|
fastPeriod?: number;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPluginWithHost, BaseIndicatorState } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface MOMConfig {
|
|
4
4
|
/** 周期(默认 10) */
|
|
5
5
|
period?: number;
|
|
6
6
|
/** 是否显示 MOM 线 */
|
|
7
7
|
showMOM?: boolean;
|
|
8
8
|
}
|
|
9
|
+
export interface MOMRenderState extends BaseIndicatorState {
|
|
10
|
+
valueMin: number;
|
|
11
|
+
valueMax: number;
|
|
12
|
+
}
|
|
9
13
|
export interface MOMRendererOptions {
|
|
10
14
|
/** 目标 pane ID(默认 'sub') */
|
|
11
15
|
paneId?: string;
|
|
@@ -15,7 +19,7 @@ export interface MOMRendererOptions {
|
|
|
15
19
|
/**
|
|
16
20
|
* 创建 MOM 渲染器插件
|
|
17
21
|
*/
|
|
18
|
-
export declare function createMOMRendererPlugin(options?: MOMRendererOptions):
|
|
22
|
+
export declare function createMOMRendererPlugin(options?: MOMRendererOptions): RendererPluginWithHost;
|
|
19
23
|
/**
|
|
20
24
|
* 计算指定索引处的 MOM 值
|
|
21
25
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { KLineData } from '
|
|
1
|
+
import { RendererPluginWithHost, BaseIndicatorState } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
3
|
export interface RSIConfig {
|
|
4
4
|
/** 第一条 RSI 周期(默认 6) */
|
|
5
5
|
period1?: number;
|
|
@@ -14,6 +14,10 @@ export interface RSIConfig {
|
|
|
14
14
|
/** 是否显示 RSI3 */
|
|
15
15
|
showRSI3?: boolean;
|
|
16
16
|
}
|
|
17
|
+
export interface RSIRenderState extends BaseIndicatorState {
|
|
18
|
+
valueMin: number;
|
|
19
|
+
valueMax: number;
|
|
20
|
+
}
|
|
17
21
|
export interface RSIRendererOptions {
|
|
18
22
|
/** 目标 pane ID(默认 'sub') */
|
|
19
23
|
paneId?: string;
|
|
@@ -23,7 +27,7 @@ export interface RSIRendererOptions {
|
|
|
23
27
|
/**
|
|
24
28
|
* 创建 RSI 渲染器插件
|
|
25
29
|
*/
|
|
26
|
-
export declare function createRSIRendererPlugin(options?: RSIRendererOptions):
|
|
30
|
+
export declare function createRSIRendererPlugin(options?: RSIRendererOptions): RendererPluginWithHost;
|
|
27
31
|
/**
|
|
28
32
|
* 计算指定索引处的 RSI 值
|
|
29
33
|
*/
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { RendererPluginWithHost } from '../../../../plugin';
|
|
2
|
+
export interface IndicatorScaleRendererOptions {
|
|
3
|
+
axisWidth: number;
|
|
4
|
+
paneId: string;
|
|
5
|
+
indicatorKey: string;
|
|
6
|
+
label: string;
|
|
7
|
+
decimals?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface DrawScaleTicksOptions {
|
|
10
|
+
ctx: CanvasRenderingContext2D;
|
|
11
|
+
dpr: number;
|
|
12
|
+
axisWidth: number;
|
|
13
|
+
height: number;
|
|
14
|
+
paddingTop: number;
|
|
15
|
+
paddingBottom: number;
|
|
16
|
+
valueMin: number;
|
|
17
|
+
valueMax: number;
|
|
18
|
+
isMain: boolean;
|
|
19
|
+
decimals?: number;
|
|
20
|
+
hideEdgeTicks?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function drawScaleTicks(options: DrawScaleTicksOptions): void;
|
|
23
|
+
export declare function createIndicatorScaleRendererPlugin(options: IndicatorScaleRendererOptions): RendererPluginWithHost;
|