@363045841yyt/klinechart 0.6.5 → 0.6.8

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.
@@ -1,2 +1,2 @@
1
- .kline-tooltip[data-v-d0fe85e6]{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-d0fe85e6]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-d0fe85e6]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-d0fe85e6]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-d0fe85e6]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-d0fe85e6]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-d0fe85e6]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-d0fe85e6]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-5574cc25]{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-5574cc25]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-5574cc25]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-5574cc25]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-5574cc25]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-5574cc25]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-5574cc25]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-5574cc25]{transform:translate(calc(-100% - 12px),12px)}}.params-overlay[data-v-bb1d1eb3]{-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-bb1d1eb3]{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-bb1d1eb3]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-bb1d1eb3]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-bb1d1eb3]{align-items:center;gap:8px;display:flex}.params-title[data-v-bb1d1eb3]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-bb1d1eb3]{color:#999;font-size:11px}.toggle-desc-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-bb1d1eb3]{width:14px;height:14px}.params-close[data-v-bb1d1eb3]{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-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-bb1d1eb3]{width:14px;height:14px}.indicator-description[data-v-bb1d1eb3]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-bb1d1eb3]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-bb1d1eb3]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-bb1d1eb3]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-bb1d1eb3]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-bb1d1eb3]{padding:10px 14px 8px}.param-header[data-v-bb1d1eb3]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-bb1d1eb3]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-bb1d1eb3]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-bb1d1eb3]{color:#999;font-size:11px}.param-description[data-v-bb1d1eb3]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-bb1d1eb3]{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-bb1d1eb3]:focus-within{border-color:#999}.stepper-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-bb1d1eb3]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-bb1d1eb3]{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-bb1d1eb3]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]:focus{outline:none}.params-footer[data-v-bb1d1eb3]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-bb1d1eb3]{gap:8px;display:flex}.params-btn[data-v-bb1d1eb3]{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-bb1d1eb3]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-bb1d1eb3]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-bb1d1eb3]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-bb1d1eb3]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-bb1d1eb3],.overlay-leave-active[data-v-bb1d1eb3]{transition:opacity .2s}.overlay-enter-from[data-v-bb1d1eb3],.overlay-leave-to[data-v-bb1d1eb3]{opacity:0}.modal-enter-active[data-v-bb1d1eb3]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-bb1d1eb3]{transition:all .16s ease-in}.modal-enter-from[data-v-bb1d1eb3]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-bb1d1eb3]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-bb1d1eb3],.slide-leave-active[data-v-bb1d1eb3]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-bb1d1eb3],.slide-leave-to[data-v-bb1d1eb3]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-f3fbebbd]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-f3fbebbd]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-f3fbebbd]::-webkit-scrollbar{display:none}.indicator-list[data-v-f3fbebbd]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-f3fbebbd]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-f3fbebbd]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-f3fbebbd],.indicator-item.draggable .indicator-btn[data-v-f3fbebbd],.indicator-item.draggable[data-v-f3fbebbd]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-f3fbebbd]{cursor:move}.indicator-item.is-dragging[data-v-f3fbebbd]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-f3fbebbd]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-f3fbebbd]{position:relative}.indicator-btn[data-v-f3fbebbd]{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-f3fbebbd]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-f3fbebbd]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-f3fbebbd]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-f3fbebbd]{z-index:1;position:relative}.param-hint[data-v-f3fbebbd]{opacity:.85;font-size:11px}.hover-overlay[data-v-f3fbebbd]{-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-f3fbebbd]{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-f3fbebbd]:hover{color:#333;background:#0000000f}.settings-btn[data-v-f3fbebbd]:hover{color:#1a1a1a}.remove-btn[data-v-f3fbebbd]:hover{color:#ff4d4f}.divider[data-v-f3fbebbd]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-f3fbebbd]{anchor-name:--indicator-add-btn;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-f3fbebbd]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-f3fbebbd]{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}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.add-menu.use-anchor[data-v-f3fbebbd]{position-anchor:--indicator-add-btn;left:anchor(center);top:anchor(top);max-width:calc(100vw - 16px);position:fixed;transform:translate(-50%,calc(-100% - 8px))}}.menu-section[data-v-f3fbebbd]{padding:4px 0}.menu-section[data-v-f3fbebbd]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-f3fbebbd]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-f3fbebbd]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-f3fbebbd]{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-f3fbebbd]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-f3fbebbd]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-f3fbebbd]{color:#999;font-size:11px}.active-tag[data-v-f3fbebbd]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-f3fbebbd],.fade-leave-active[data-v-f3fbebbd]{transition:opacity .2s}.fade-enter-from[data-v-f3fbebbd],.fade-leave-to[data-v-f3fbebbd]{opacity:0}.slide-enter-active[data-v-f3fbebbd],.slide-leave-active[data-v-f3fbebbd]{transition:all .2s}.slide-enter-from[data-v-f3fbebbd],.slide-leave-to[data-v-f3fbebbd]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-92699cb2]{-webkit-backdrop-filter:blur(8px);z-index:100;-webkit-user-select:none;user-select:none;pointer-events:auto;background:#fafbfce0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:6px;height:32px;padding:4px 8px;display:flex;position:absolute;top:8px;left:50%;transform:translate(-50%);box-shadow:0 1px 3px #0000000f}.toolbar-item[data-v-92699cb2]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-92699cb2]{width:24px;height:24px;position:relative}.color-swatch[data-v-92699cb2]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-92699cb2]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-92699cb2]{color:#374151;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:4px;outline:none;height:24px;padding:0 4px;font-size:12px}.toolbar-select[data-v-92699cb2]:hover{border-color:#9ca3af}.toolbar-btn[data-v-92699cb2]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex}.toolbar-btn[data-v-92699cb2]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-92699cb2]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-92699cb2]{width:14px;height:14px}.left-toolbar[data-v-3bc8355a]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background:#fafbfc;border:1px solid #e5e7eb;border-radius:6px;flex-direction:column;flex:0 0 40px;align-items:center;gap:6px;padding:8px 5px;display:flex;box-shadow:0 1px 3px #0000000f}.left-toolbar__group[data-v-3bc8355a]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-3bc8355a]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-3bc8355a]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex;position:relative}.left-toolbar__button[data-v-3bc8355a]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-3bc8355a]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-3bc8355a]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-3bc8355a]{width:16px;height:16px}.corner-indicator[data-v-3bc8355a]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-3bc8355a]:after{content:"";opacity:.45;border-bottom:5px solid;border-left:5px solid #0000;width:0;height:0;transition:opacity .15s;position:absolute;bottom:0;right:0}.left-toolbar__button:hover .corner-indicator[data-v-3bc8355a]:after,.left-toolbar__button.active .corner-indicator[data-v-3bc8355a]:after{opacity:.7}.corner-indicator.open[data-v-3bc8355a]:after{opacity:.8}.tool-dropdown[data-v-3bc8355a]{-webkit-backdrop-filter:blur(8px);box-sizing:border-box;z-index:100;background:#fafbfcd1;border:1px solid #e5e7eb;border-radius:6px;flex-direction:row;align-items:center;gap:4px;height:40px;padding:0 5px;display:flex;position:absolute;top:50%;left:calc(100% + 13px);transform:translateY(-50%);box-shadow:0 1px 3px #0000000f}.tool-item[data-v-3bc8355a]{position:relative}.dropdown-enter-active[data-v-3bc8355a],.dropdown-leave-active[data-v-3bc8355a]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-3bc8355a],.dropdown-leave-to[data-v-3bc8355a]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-3bc8355a]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-3bc8355a]{gap:3px}.left-toolbar__button[data-v-3bc8355a]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-3bc8355a]{width:16px}.corner-indicator[data-v-3bc8355a]{width:7px;height:7px}.corner-indicator[data-v-3bc8355a]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-3bc8355a]{height:36px}}.settings-overlay[data-v-3bc8355a]{-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}.settings-modal[data-v-3bc8355a]{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}.settings-header[data-v-3bc8355a]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-3bc8355a]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-3bc8355a]{align-items:center;gap:8px;display:flex}.settings-title[data-v-3bc8355a]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-3bc8355a]{color:#999;font-size:11px}.settings-close[data-v-3bc8355a]{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}.settings-close[data-v-3bc8355a]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-3bc8355a]{width:14px;height:14px}.settings-body[data-v-3bc8355a]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-3bc8355a]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-3bc8355a]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-3bc8355a]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-section-divider[data-v-3bc8355a]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-3bc8355a]:before,.settings-section-divider[data-v-3bc8355a]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-3bc8355a]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-3bc8355a]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-3bc8355a]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-3bc8355a]{gap:8px;display:flex}.settings-btn[data-v-3bc8355a]{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}.settings-btn svg[data-v-3bc8355a]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-3bc8355a]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-3bc8355a]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-3bc8355a]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-3bc8355a]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-3bc8355a]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-3bc8355a]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-3bc8355a]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-e5d29a39]{--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-stage[data-v-e5d29a39]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-e5d29a39]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-e5d29a39]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-e5d29a39]{opacity:1;box-sizing:border-box;border-top:1px solid #e5e7eb;height:0;transition:border-top-color .12s,border-top-width .12s,margin-top .12s,opacity .12s;position:absolute;left:0;right:0}.pane-separator-line.is-active[data-v-e5d29a39]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-e5d29a39],.chart-stage.is-hovering-pane-separator[data-v-e5d29a39]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-e5d29a39]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-e5d29a39]{cursor:ns-resize}.chart-stage.is-dragging[data-v-e5d29a39]{cursor:grabbing}.chart-container[data-v-e5d29a39]{height:100%;min-height:inherit;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;background:#fff;border:1px solid #e5e7eb;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-e5d29a39]::-webkit-scrollbar{display:none}.chart-container[data-v-e5d29a39]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-e5d29a39],.chart-stage.is-hovering-pane-separator .chart-container[data-v-e5d29a39]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-e5d29a39]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-e5d29a39]{cursor:grabbing}.right-axis-host[data-v-e5d29a39]{height:100%;min-height:inherit;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-e5d29a39]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-e5d29a39]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-e5d29a39]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-e5d29a39]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-e5d29a39]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-e5d29a39]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-e5d29a39]{gap:6px}}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;left:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.right-axis{z-index:15}
1
+ .kline-tooltip[data-v-d0fe85e6]{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-d0fe85e6]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-d0fe85e6]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-d0fe85e6]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-d0fe85e6]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-d0fe85e6]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-d0fe85e6]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-d0fe85e6]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-5574cc25]{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-5574cc25]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-5574cc25]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-5574cc25]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-5574cc25]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-5574cc25]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-5574cc25]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-5574cc25]{transform:translate(calc(-100% - 12px),12px)}}.params-overlay[data-v-bb1d1eb3]{-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-bb1d1eb3]{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-bb1d1eb3]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-bb1d1eb3]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-bb1d1eb3]{align-items:center;gap:8px;display:flex}.params-title[data-v-bb1d1eb3]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-bb1d1eb3]{color:#999;font-size:11px}.toggle-desc-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-bb1d1eb3]{width:14px;height:14px}.params-close[data-v-bb1d1eb3]{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-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-bb1d1eb3]{width:14px;height:14px}.indicator-description[data-v-bb1d1eb3]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-bb1d1eb3]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-bb1d1eb3]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-bb1d1eb3]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-bb1d1eb3]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-bb1d1eb3]{padding:10px 14px 8px}.param-header[data-v-bb1d1eb3]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-bb1d1eb3]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-bb1d1eb3]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-bb1d1eb3]{color:#999;font-size:11px}.param-description[data-v-bb1d1eb3]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-bb1d1eb3]{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-bb1d1eb3]:focus-within{border-color:#999}.stepper-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-bb1d1eb3]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-bb1d1eb3]{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-bb1d1eb3]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]:focus{outline:none}.params-footer[data-v-bb1d1eb3]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-bb1d1eb3]{gap:8px;display:flex}.params-btn[data-v-bb1d1eb3]{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-bb1d1eb3]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-bb1d1eb3]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-bb1d1eb3]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-bb1d1eb3]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-bb1d1eb3],.overlay-leave-active[data-v-bb1d1eb3]{transition:opacity .2s}.overlay-enter-from[data-v-bb1d1eb3],.overlay-leave-to[data-v-bb1d1eb3]{opacity:0}.modal-enter-active[data-v-bb1d1eb3]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-bb1d1eb3]{transition:all .16s ease-in}.modal-enter-from[data-v-bb1d1eb3]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-bb1d1eb3]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-bb1d1eb3],.slide-leave-active[data-v-bb1d1eb3]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-bb1d1eb3],.slide-leave-to[data-v-bb1d1eb3]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-f3fbebbd]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-f3fbebbd]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-f3fbebbd]::-webkit-scrollbar{display:none}.indicator-list[data-v-f3fbebbd]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-f3fbebbd]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-f3fbebbd]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-f3fbebbd],.indicator-item.draggable .indicator-btn[data-v-f3fbebbd],.indicator-item.draggable[data-v-f3fbebbd]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-f3fbebbd]{cursor:move}.indicator-item.is-dragging[data-v-f3fbebbd]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-f3fbebbd]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-f3fbebbd]{position:relative}.indicator-btn[data-v-f3fbebbd]{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-f3fbebbd]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-f3fbebbd]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-f3fbebbd]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-f3fbebbd]{z-index:1;position:relative}.param-hint[data-v-f3fbebbd]{opacity:.85;font-size:11px}.hover-overlay[data-v-f3fbebbd]{-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-f3fbebbd]{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-f3fbebbd]:hover{color:#333;background:#0000000f}.settings-btn[data-v-f3fbebbd]:hover{color:#1a1a1a}.remove-btn[data-v-f3fbebbd]:hover{color:#ff4d4f}.divider[data-v-f3fbebbd]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-f3fbebbd]{anchor-name:--indicator-add-btn;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-f3fbebbd]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-f3fbebbd]{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}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.add-menu.use-anchor[data-v-f3fbebbd]{position-anchor:--indicator-add-btn;left:anchor(center);top:anchor(top);max-width:calc(100vw - 16px);position:fixed;transform:translate(-50%,calc(-100% - 8px))}}.menu-section[data-v-f3fbebbd]{padding:4px 0}.menu-section[data-v-f3fbebbd]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-f3fbebbd]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-f3fbebbd]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-f3fbebbd]{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-f3fbebbd]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-f3fbebbd]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-f3fbebbd]{color:#999;font-size:11px}.active-tag[data-v-f3fbebbd]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-f3fbebbd],.fade-leave-active[data-v-f3fbebbd]{transition:opacity .2s}.fade-enter-from[data-v-f3fbebbd],.fade-leave-to[data-v-f3fbebbd]{opacity:0}.slide-enter-active[data-v-f3fbebbd],.slide-leave-active[data-v-f3fbebbd]{transition:all .2s}.slide-enter-from[data-v-f3fbebbd],.slide-leave-to[data-v-f3fbebbd]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-92699cb2]{-webkit-backdrop-filter:blur(8px);z-index:100;-webkit-user-select:none;user-select:none;pointer-events:auto;background:#fafbfce0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:6px;height:32px;padding:4px 8px;display:flex;position:absolute;top:8px;left:50%;transform:translate(-50%);box-shadow:0 1px 3px #0000000f}.toolbar-item[data-v-92699cb2]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-92699cb2]{width:24px;height:24px;position:relative}.color-swatch[data-v-92699cb2]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-92699cb2]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-92699cb2]{color:#374151;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:4px;outline:none;height:24px;padding:0 4px;font-size:12px}.toolbar-select[data-v-92699cb2]:hover{border-color:#9ca3af}.toolbar-btn[data-v-92699cb2]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex}.toolbar-btn[data-v-92699cb2]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-92699cb2]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-92699cb2]{width:14px;height:14px}.left-toolbar[data-v-c2895763]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background:#fafbfc;border:1px solid #e5e7eb;border-radius:6px;flex-direction:column;flex:0 0 40px;align-items:center;gap:6px;padding:8px 5px;display:flex;box-shadow:0 1px 3px #0000000f}.left-toolbar__group[data-v-c2895763]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-c2895763]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-c2895763]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex;position:relative}.left-toolbar__button[data-v-c2895763]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-c2895763]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-c2895763]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-c2895763]{width:16px;height:16px}.corner-indicator[data-v-c2895763]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-c2895763]:after{content:"";opacity:.45;border-bottom:5px solid;border-left:5px solid #0000;width:0;height:0;transition:opacity .15s;position:absolute;bottom:0;right:0}.left-toolbar__button:hover .corner-indicator[data-v-c2895763]:after,.left-toolbar__button.active .corner-indicator[data-v-c2895763]:after{opacity:.7}.corner-indicator.open[data-v-c2895763]:after{opacity:.8}.tool-dropdown[data-v-c2895763]{-webkit-backdrop-filter:blur(8px);box-sizing:border-box;z-index:100;background:#fafbfcd1;border:1px solid #e5e7eb;border-radius:6px;flex-direction:row;align-items:center;gap:4px;height:40px;padding:0 5px;display:flex;position:absolute;top:50%;left:calc(100% + 13px);transform:translateY(-50%);box-shadow:0 1px 3px #0000000f}.tool-item[data-v-c2895763]{position:relative}.dropdown-enter-active[data-v-c2895763],.dropdown-leave-active[data-v-c2895763]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-c2895763],.dropdown-leave-to[data-v-c2895763]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-c2895763]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-c2895763]{gap:3px}.left-toolbar__button[data-v-c2895763]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-c2895763]{width:16px}.corner-indicator[data-v-c2895763]{width:7px;height:7px}.corner-indicator[data-v-c2895763]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-c2895763]{height:36px}}.settings-overlay[data-v-c2895763]{-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}.settings-modal[data-v-c2895763]{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}.settings-header[data-v-c2895763]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-c2895763]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-c2895763]{align-items:center;gap:8px;display:flex}.settings-title[data-v-c2895763]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-c2895763]{color:#999;font-size:11px}.settings-close[data-v-c2895763]{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}.settings-close[data-v-c2895763]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-c2895763]{width:14px;height:14px}.settings-body[data-v-c2895763]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-c2895763]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-c2895763]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-c2895763]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-section-divider[data-v-c2895763]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-c2895763]:before,.settings-section-divider[data-v-c2895763]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-c2895763]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-c2895763]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-c2895763]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-c2895763]{gap:8px;display:flex}.settings-btn[data-v-c2895763]{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}.settings-btn svg[data-v-c2895763]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-c2895763]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-c2895763]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-c2895763]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-c2895763]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-c2895763]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-c2895763]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-c2895763]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-c0f19dd6]{--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-stage[data-v-c0f19dd6]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-c0f19dd6]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-c0f19dd6]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-c0f19dd6]{opacity:1;box-sizing:border-box;border-top:1px solid #e5e7eb;height:0;transition:border-top-color .12s,border-top-width .12s,margin-top .12s,opacity .12s;position:absolute;left:0;right:0}.pane-separator-line.is-active[data-v-c0f19dd6]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-c0f19dd6],.chart-stage.is-hovering-pane-separator[data-v-c0f19dd6]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-c0f19dd6]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-c0f19dd6]{cursor:ns-resize}.chart-stage.is-dragging[data-v-c0f19dd6]{cursor:grabbing}.chart-container[data-v-c0f19dd6]{height:100%;min-height:inherit;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;background:#fff;border:1px solid #e5e7eb;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-c0f19dd6]::-webkit-scrollbar{display:none}.chart-container[data-v-c0f19dd6]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-c0f19dd6],.chart-stage.is-hovering-pane-separator .chart-container[data-v-c0f19dd6]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-c0f19dd6]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-c0f19dd6]{cursor:grabbing}.right-axis-host[data-v-c0f19dd6]{height:100%;min-height:inherit;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-c0f19dd6]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-c0f19dd6]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-c0f19dd6]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-c0f19dd6]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-c0f19dd6]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-c0f19dd6]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-c0f19dd6]{gap:6px}}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;left:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.right-axis{z-index:15}
2
2
  /*$vite$:1*/
@@ -36,13 +36,19 @@ export declare const DEFAULT_SETTINGS: readonly [{
36
36
  readonly label: "主图纵轴刻度自适应调整";
37
37
  readonly type: "boolean";
38
38
  readonly default: true;
39
- readonly group: "experimental";
39
+ readonly group: "main";
40
40
  }, {
41
41
  readonly key: "performanceTest10kKlines";
42
42
  readonly label: "万条K线性能测试";
43
43
  readonly type: "boolean";
44
44
  readonly default: false;
45
45
  readonly group: "experimental";
46
+ }, {
47
+ readonly key: "enableCanvasProfiler";
48
+ readonly label: "Canvas 性能分析插桩";
49
+ readonly type: "boolean";
50
+ readonly default: false;
51
+ readonly group: "experimental";
46
52
  }];
47
53
  /** 图表设置类型(从 DEFAULT_SETTINGS 自动推导,同时兼容扩展) */
48
54
  export type ChartSettings = {
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Indicator Worker 入口
3
+ * 运行在独立线程,负责指标计算
4
+ */
5
+ export {};
@@ -0,0 +1,71 @@
1
+ import { KLineData } from '../../types/price';
2
+ import { IndicatorConfigSnapshot, IndicatorSeriesBundle } from './workerProtocol';
3
+ /**
4
+ * 计算运行时
5
+ * 管理数据、配置、缓存和脏标记
6
+ */
7
+ export declare class IndicatorRuntime {
8
+ private currentData;
9
+ private dataVersion;
10
+ private config;
11
+ private configVersion;
12
+ private cachedSeries;
13
+ private cachedBollSeries;
14
+ private cachedExpmaSeries;
15
+ private cachedEneSeries;
16
+ private cachedRsiSeries;
17
+ private cachedCciSeries;
18
+ private cachedStochSeries;
19
+ private cachedMomSeries;
20
+ private cachedWmsrSeries;
21
+ private cachedKstSeries;
22
+ private cachedFastkSeries;
23
+ private cachedMacdSeries;
24
+ private dirtyData;
25
+ private dirtyMAConfig;
26
+ private dirtyBollConfig;
27
+ private dirtyExpmaConfig;
28
+ private dirtyEneConfig;
29
+ private dirtyRsiConfig;
30
+ private dirtyCciConfig;
31
+ private dirtyStochConfig;
32
+ private dirtyMomConfig;
33
+ private dirtyWmsrConfig;
34
+ private dirtyKstConfig;
35
+ private dirtyFastkConfig;
36
+ private dirtyMacdConfig;
37
+ private getDefaultConfig;
38
+ /**
39
+ * 更新数据
40
+ */
41
+ setData(data: KLineData[], version: number): void;
42
+ /**
43
+ * 更新配置
44
+ */
45
+ private shallowEqual;
46
+ /**
47
+ * 更新配置(仅值变更时才设置脏标记)
48
+ */
49
+ setConfig(config: Partial<IndicatorConfigSnapshot>, version: number): void;
50
+ /**
51
+ * 强制所有指标标记为脏(用于 recompute)
52
+ */
53
+ forceDirty(): void;
54
+ /**
55
+ * 获取当前数据版本
56
+ */
57
+ getDataVersion(): number;
58
+ /**
59
+ * 获取当前配置版本
60
+ */
61
+ getConfigVersion(): number;
62
+ /**
63
+ * 计算所有指标的 series(如果脏了)
64
+ * 返回结果包,供主线程组装成 render states
65
+ */
66
+ computeSeries(): IndicatorSeriesBundle;
67
+ /**
68
+ * 获取缓存的 series(用于 visibleRange 变更时扫描极值)
69
+ */
70
+ getCachedSeries(): IndicatorSeriesBundle;
71
+ }
@@ -1,7 +1,7 @@
1
1
  import { PluginHost } from '../../plugin';
2
2
  import { KLineData } from '../../types/price';
3
+ import { BOLLSchedulerConfig, EXPMASchedulerConfig, ENESchedulerConfig, RSISchedulerConfig, CCISchedulerConfig, STOCHSchedulerConfig, MOMSchedulerConfig, WMSRSchedulerConfig, KSTSchedulerConfig, FASTKSchedulerConfig, MACDSchedulerConfig } from './workerProtocol';
3
4
  import { MAFlags } from './calculators';
4
- import { MACDSchedulerConfig } from './macdState';
5
5
  /**
6
6
  * 可见范围
7
7
  */
@@ -9,270 +9,123 @@ interface VisibleRange {
9
9
  start: number;
10
10
  end: number;
11
11
  }
12
+ export type { BOLLSchedulerConfig, EXPMASchedulerConfig, ENESchedulerConfig, RSISchedulerConfig, CCISchedulerConfig, STOCHSchedulerConfig, MOMSchedulerConfig, WMSRSchedulerConfig, KSTSchedulerConfig, FASTKSchedulerConfig, MACDSchedulerConfig, };
12
13
  /**
13
- * BOLL 调度器配置
14
- */
15
- export interface BOLLSchedulerConfig {
16
- period: number;
17
- multiplier: number;
18
- showUpper: boolean;
19
- showMiddle: boolean;
20
- showLower: boolean;
21
- showBand: boolean;
22
- }
23
- /**
24
- * EXPMA 调度器配置
25
- */
26
- export interface EXPMASchedulerConfig {
27
- fastPeriod: number;
28
- slowPeriod: number;
29
- }
30
- /**
31
- * ENE 调度器配置
32
- */
33
- export interface ENESchedulerConfig {
34
- period: number;
35
- deviation: number;
36
- }
37
- /**
38
- * RSI 调度器配置
39
- */
40
- export interface RSISchedulerConfig {
41
- period1: number;
42
- period2: number;
43
- period3: number;
44
- showRSI1: boolean;
45
- showRSI2: boolean;
46
- showRSI3: boolean;
47
- }
48
- /**
49
- * CCI 调度器配置
50
- */
51
- export interface CCISchedulerConfig {
52
- period: number;
53
- showCCI: boolean;
54
- }
55
- /**
56
- * STOCH 调度器配置
57
- */
58
- export interface STOCHSchedulerConfig {
59
- n: number;
60
- m: number;
61
- showK: boolean;
62
- showD: boolean;
63
- }
64
- /**
65
- * MOM 调度器配置
66
- */
67
- export interface MOMSchedulerConfig {
68
- period: number;
69
- showMOM: boolean;
70
- }
71
- /**
72
- * WMSR 调度器配置
73
- */
74
- export interface WMSRSchedulerConfig {
75
- period: number;
76
- showWMSR: boolean;
77
- }
78
- /**
79
- * KST 调度器配置
80
- */
81
- export interface KSTSchedulerConfig {
82
- roc1: number;
83
- roc2: number;
84
- roc3: number;
85
- roc4: number;
86
- signalPeriod: number;
87
- showKST: boolean;
88
- showSignal: boolean;
89
- }
90
- /**
91
- * FASTK 调度器配置
92
- */
93
- export interface FASTKSchedulerConfig {
94
- period: number;
95
- showFASTK: boolean;
96
- }
97
- /**
98
- * 指标调度器
99
- *
100
- * 职责:
101
- * 1. 维护当前图表激活的指标配置
102
- * 2. 在数据/视口/配置变更时触发计算
103
- * 3. 将计算结果写入 StateStore,供渲染器消费
104
- *
105
- * 优化策略:
106
- * - 双脏标记(dirtyData/dirtyRange):数据变更重算 series + 极值,视口变更仅重算极值
107
- * - cachedSeries 缓存:视口变更时复用已计算的 series,避免 O(n) 重算
14
+ * IndicatorScheduler - 主线程 facade
108
15
  */
109
16
  export declare class IndicatorScheduler {
110
17
  private pluginHost;
111
- private currentData;
112
- private maConfig;
113
18
  private visibleRange;
114
- private cachedSeries;
115
- private bollConfig;
116
- private cachedBollSeries;
117
- private expmaConfig;
118
- private cachedExpmaSeries;
119
- private eneConfig;
120
- private cachedEneSeries;
121
- private rsiConfig;
122
- private rsiPaneId;
123
- private cachedRsiSeries;
124
- private cciConfig;
125
- private cciPaneId;
126
- private cachedCciSeries;
127
- private stochConfig;
128
- private stochPaneId;
129
- private cachedStochSeries;
130
- private momConfig;
131
- private momPaneId;
132
- private cachedMomSeries;
133
- private wmsrConfig;
134
- private wmsrPaneId;
135
- private cachedWmsrSeries;
136
- private kstConfig;
137
- private kstPaneId;
138
- private cachedKstSeries;
139
- private fastkConfig;
140
- private fastkPaneId;
141
- private cachedFastkSeries;
142
- private macdConfig;
143
- private macdPaneId;
144
- private cachedMacdSeries;
145
- private dirtyData;
146
- private dirtyRange;
147
- private dirtyBollConfig;
148
- private dirtyExpmaConfig;
149
- private dirtyEneConfig;
150
- private dirtyRsiConfig;
151
- private dirtyCciConfig;
152
- private dirtyStochConfig;
153
- private dirtyMomConfig;
154
- private dirtyWmsrConfig;
155
- private dirtyKstConfig;
156
- private dirtyFastkConfig;
157
- private dirtyMacdConfig;
158
- private dirtyRsiState;
159
- private dirtyCciState;
160
- private dirtyStochState;
161
- private dirtyMomState;
162
- private dirtyWmsrState;
163
- private dirtyKstState;
164
- private dirtyFastkState;
165
- private dirtyMacdState;
166
- /** 当前激活的主图指标列表 */
167
19
  private activeMainIndicators;
168
- /**
169
- * 设置 PluginHost,用于读写 StateStore
20
+ private dataVersion;
21
+ private configVersion;
22
+ private requestId;
23
+ private lastAppliedRequestId;
24
+ private currentData;
25
+ private configSnapshot;
26
+ private worker;
27
+ private workerReady;
28
+ private useWorker;
29
+ private pendingRequest;
30
+ private inlineRuntime;
31
+ private latestResult;
32
+ private invalidateCallback;
33
+ constructor();
34
+ /**
35
+ * 设置 PluginHost
170
36
  */
171
37
  setPluginHost(host: PluginHost): void;
172
38
  /**
173
- * 设置当前激活的主图指标(用于极值计算过滤)
174
- * @param indicators 激活的指标ID列表,如 ['ma', 'boll', 'expma', 'ene']
39
+ * 设置重绘回调
175
40
  */
176
- setActiveMainIndicators(indicators: string[]): void;
41
+ setInvalidateCallback(callback: () => void): void;
42
+ /**
43
+ * 销毁调度器
44
+ */
45
+ destroy(): void;
46
+ private getDefaultConfig;
47
+ private initBackend;
48
+ private tryInitWorker;
49
+ private initInlineRuntime;
50
+ private fallbackToInline;
51
+ private terminateWorker;
52
+ private handleWorkerMessage;
53
+ private handleSeriesResult;
54
+ private applyResults;
55
+ private updateVisibleStatesOnly;
56
+ private getVisibleSubIndicatorMask;
177
57
  /**
178
58
  * 数据变更时调用
179
- * @param data 新的 K 线数据
180
- * @param visibleRange 当前可见范围
181
59
  */
182
60
  update(data: KLineData[], visibleRange: VisibleRange): void;
183
61
  /**
184
- * MA 配置变更时调用
185
- * @param config 新的 MA 配置(哪些周期启用)
62
+ * 视口变更时调用 - 同步处理,不走 Worker
63
+ */
64
+ updateVisibleRange(visibleRange: VisibleRange): void;
65
+ /**
66
+ * MA 配置变更
186
67
  */
187
68
  updateMAConfig(config: MAFlags): void;
188
69
  /**
189
- * BOLL 配置变更时调用
190
- * @param config 新的 BOLL 配置
70
+ * BOLL 配置变更
191
71
  */
192
72
  updateBOLLConfig(config: Partial<BOLLSchedulerConfig>): void;
193
73
  /**
194
- * EXPMA 配置变更时调用
195
- * @param config 新的 EXPMA 配置
74
+ * EXPMA 配置变更
196
75
  */
197
76
  updateEXPMAConfig(config: Partial<EXPMASchedulerConfig>): void;
198
77
  /**
199
- * ENE 配置变更时调用
200
- * @param config 新的 ENE 配置
78
+ * ENE 配置变更
201
79
  */
202
80
  updateENEConfig(config: Partial<ENESchedulerConfig>): void;
203
81
  /**
204
- * RSI 配置变更时调用
205
- * @param config 新的 RSI 配置
206
- * @param paneId RSI pane ID(可选,默认 'sub_RSI')
82
+ * RSI 配置变更
207
83
  */
208
84
  updateRSIConfig(config: Partial<RSISchedulerConfig>, paneId?: string): void;
209
85
  /**
210
- * CCI 配置变更时调用
211
- * @param config 新的 CCI 配置
212
- * @param paneId CCI pane ID(可选,默认 'sub_CCI')
86
+ * CCI 配置变更
213
87
  */
214
88
  updateCCIConfig(config: Partial<CCISchedulerConfig>, paneId?: string): void;
215
89
  /**
216
- * STOCH 配置变更时调用
217
- * @param config 新的 STOCH 配置
218
- * @param paneId STOCH pane ID(可选,默认 'sub_STOCH')
90
+ * STOCH 配置变更
219
91
  */
220
92
  updateSTOCHConfig(config: Partial<STOCHSchedulerConfig>, paneId?: string): void;
221
93
  /**
222
- * MOM 配置变更时调用
223
- * @param config 新的 MOM 配置
224
- * @param paneId MOM pane ID(可选,默认 'sub_MOM')
94
+ * MOM 配置变更
225
95
  */
226
96
  updateMOMConfig(config: Partial<MOMSchedulerConfig>, paneId?: string): void;
227
97
  /**
228
- * WMSR 配置变更时调用
229
- * @param config 新的 WMSR 配置
230
- * @param paneId WMSR pane ID(可选,默认 'sub_WMSR')
98
+ * WMSR 配置变更
231
99
  */
232
100
  updateWMSRConfig(config: Partial<WMSRSchedulerConfig>, paneId?: string): void;
233
101
  /**
234
- * KST 配置变更时调用
235
- * @param config 新的 KST 配置
236
- * @param paneId KST pane ID(可选,默认 'sub_KST')
102
+ * KST 配置变更
237
103
  */
238
104
  updateKSTConfig(config: Partial<KSTSchedulerConfig>, paneId?: string): void;
239
105
  /**
240
- * FASTK 配置变更时调用
241
- * @param config 新的 FASTK 配置
242
- * @param paneId FASTK pane ID(可选,默认 'sub_FASTK')
106
+ * FASTK 配置变更
243
107
  */
244
108
  updateFASTKConfig(config: Partial<FASTKSchedulerConfig>, paneId?: string): void;
245
109
  /**
246
- * MACD 配置变更时调用
247
- * @param config 新的 MACD 配置
248
- * @param paneId MACD pane ID(可选,默认 'sub_MACD')
110
+ * MACD 配置变更
249
111
  */
250
112
  updateMACDConfig(config: Partial<MACDSchedulerConfig>, paneId?: string): void;
251
113
  /**
252
- * 视口变更时调用
253
- * @param visibleRange 新的可见范围
114
+ * 设置当前激活的主图指标
254
115
  */
255
- updateVisibleRange(visibleRange: VisibleRange): void;
256
- /**
257
- * 强制全部重算
258
- */
259
- recompute(): void;
260
- /**
261
- * 根据脏标记执行计算
262
- *
263
- * 计算流程:
264
- * 1. 若 dirtyData 或指标配置脏标记,重算对应 series
265
- * 2. 若任一 series 重算或 dirtyRange,重算所有指标在视口内的极值
266
- * 3. 写入所有指标的 StateStore
267
- */
268
- private computeIfDirty;
116
+ setActiveMainIndicators(indicators: string[]): void;
269
117
  /**
270
- * 获取主图指标极值(用于与K线极值合并计算价格轴范围)
271
- * @returns 主图指标的价格范围,无指标时返回 null
118
+ * 获取主图指标价格范围
272
119
  */
273
120
  getMainIndicatorPriceRange(): {
274
121
  min: number;
275
122
  max: number;
276
123
  } | null;
124
+ /**
125
+ * 强制全部重算
126
+ */
127
+ recompute(): void;
128
+ private triggerRecompute;
129
+ private computeWithWorker;
130
+ private computeWithInline;
277
131
  }
278
- export {};
@@ -0,0 +1,65 @@
1
+ import { MARenderState } from './maState';
2
+ import { BOLLRenderState } from './bollState';
3
+ import { EXPMARenderState } from './expmaState';
4
+ import { ENERenderState } from './eneState';
5
+ import { RSIRenderState } from './rsiState';
6
+ import { CCIRenderState } from './cciState';
7
+ import { STOCHRenderState } from './stochState';
8
+ import { MOMRenderState } from './momState';
9
+ import { WMSRRenderState } from './wmsrState';
10
+ import { KSTRenderState } from './kstState';
11
+ import { FASTKRenderState } from './fastkState';
12
+ import { MACDRenderState } from './macdState';
13
+ import { IndicatorSeriesBundle } from './workerProtocol';
14
+ /**
15
+ * 可见范围
16
+ */
17
+ interface VisibleRange {
18
+ start: number;
19
+ end: number;
20
+ }
21
+ type VisibleSubIndicatorStates = {
22
+ rsi: RSIRenderState;
23
+ cci: CCIRenderState;
24
+ stoch: STOCHRenderState;
25
+ mom: MOMRenderState;
26
+ wmsr: WMSRRenderState;
27
+ kst: KSTRenderState;
28
+ fastk: FASTKRenderState;
29
+ macd: MACDRenderState;
30
+ };
31
+ type VisibleSubIndicatorMask = {
32
+ rsi?: boolean;
33
+ cci?: boolean;
34
+ stoch?: boolean;
35
+ mom?: boolean;
36
+ wmsr?: boolean;
37
+ kst?: boolean;
38
+ fastk?: boolean;
39
+ macd?: boolean;
40
+ };
41
+ type ComposedRenderStates = VisibleSubIndicatorStates & {
42
+ ma: MARenderState;
43
+ boll: BOLLRenderState;
44
+ expma: EXPMARenderState;
45
+ ene: ENERenderState;
46
+ };
47
+ /**
48
+ * 仅计算副图指标的 visible-only states
49
+ * 用于滚动时的轻量更新,避免重复计算主图指标
50
+ */
51
+ export declare function composeVisibleSubIndicatorStates(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, timestamp: number, activeMask?: VisibleSubIndicatorMask): VisibleSubIndicatorStates;
52
+ /**
53
+ * 从 series bundle 组装所有 render states
54
+ * 同时计算 visibleMin/visibleMax 等派生字段
55
+ */
56
+ export declare function composeRenderStates(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, timestamp: number): ComposedRenderStates;
57
+ /**
58
+ * 计算主图指标价格范围
59
+ * 用于 Chart.draw() 中的 pane.updateRange
60
+ */
61
+ export declare function computeMainIndicatorPriceRange(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, activeMainIndicators: Set<string>): {
62
+ min: number;
63
+ max: number;
64
+ } | null;
65
+ export {};