@363045841yyt/klinechart 0.4.4 → 0.4.5

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-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-acace457]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-acace457]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-acace457]::-webkit-scrollbar{display:none}.indicator-list[data-v-acace457]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-acace457]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-acace457]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-acace457],.indicator-item.draggable .indicator-btn[data-v-acace457],.indicator-item.draggable[data-v-acace457]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-acace457]{cursor:move}.indicator-item.is-dragging[data-v-acace457]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-acace457]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-acace457]{position:relative}.indicator-btn[data-v-acace457]{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-acace457]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-acace457]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-acace457]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-acace457]{z-index:1;position:relative}.param-hint[data-v-acace457]{opacity:.85;font-size:11px}.hover-overlay[data-v-acace457]{-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-acace457]{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-acace457]:hover{color:#333;background:#0000000f}.settings-btn[data-v-acace457]:hover{color:#1a1a1a}.remove-btn[data-v-acace457]:hover{color:#ff4d4f}.divider[data-v-acace457]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-acace457]{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-acace457]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-acace457]{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-acace457]{padding:4px 0}.menu-section[data-v-acace457]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-acace457]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-acace457]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-acace457]{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-acace457]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-acace457]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-acace457]{color:#999;font-size:11px}.active-tag[data-v-acace457]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-acace457],.fade-leave-active[data-v-acace457]{transition:opacity .2s}.fade-enter-from[data-v-acace457],.fade-leave-to[data-v-acace457]{opacity:0}.slide-enter-active[data-v-acace457],.slide-leave-active[data-v-acace457]{transition:all .2s}.slide-enter-from[data-v-acace457],.slide-leave-to[data-v-acace457]{opacity:0;transform:translate(-50%)translateY(8px)}.chart-wrapper[data-v-e5297864]{--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-e5297864]{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-e5297864]::-webkit-scrollbar{display:none}.chart-container[data-v-e5297864]:hover{cursor:grab}.chart-container.is-resizing-pane[data-v-e5297864],.chart-container.is-hovering-pane-separator[data-v-e5297864]{cursor:row-resize}.scroll-content[data-v-e5297864]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-e5297864]{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}.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;border-right:1px solid #e0e0e0}
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-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-0ddb3f15]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-0ddb3f15]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-0ddb3f15]::-webkit-scrollbar{display:none}.indicator-list[data-v-0ddb3f15]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-0ddb3f15]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-0ddb3f15]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-0ddb3f15],.indicator-item.draggable .indicator-btn[data-v-0ddb3f15],.indicator-item.draggable[data-v-0ddb3f15]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-0ddb3f15]{cursor:move}.indicator-item.is-dragging[data-v-0ddb3f15]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-0ddb3f15]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-0ddb3f15]{position:relative}.indicator-btn[data-v-0ddb3f15]{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-0ddb3f15]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-0ddb3f15]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-0ddb3f15]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-0ddb3f15]{z-index:1;position:relative}.param-hint[data-v-0ddb3f15]{opacity:.85;font-size:11px}.hover-overlay[data-v-0ddb3f15]{-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-0ddb3f15]{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-0ddb3f15]:hover{color:#333;background:#0000000f}.settings-btn[data-v-0ddb3f15]:hover{color:#1a1a1a}.remove-btn[data-v-0ddb3f15]:hover{color:#ff4d4f}.divider[data-v-0ddb3f15]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-0ddb3f15]{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-0ddb3f15]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-0ddb3f15]{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-0ddb3f15]{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-0ddb3f15]{padding:4px 0}.menu-section[data-v-0ddb3f15]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-0ddb3f15]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-0ddb3f15]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-0ddb3f15]{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-0ddb3f15]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-0ddb3f15]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-0ddb3f15]{color:#999;font-size:11px}.active-tag[data-v-0ddb3f15]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-0ddb3f15],.fade-leave-active[data-v-0ddb3f15]{transition:opacity .2s}.fade-enter-from[data-v-0ddb3f15],.fade-leave-to[data-v-0ddb3f15]{opacity:0}.slide-enter-active[data-v-0ddb3f15],.slide-leave-active[data-v-0ddb3f15]{transition:all .2s}.slide-enter-from[data-v-0ddb3f15],.slide-leave-to[data-v-0ddb3f15]{opacity:0;transform:translate(-50%)translateY(8px)}.chart-wrapper[data-v-288af50a]{--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-288af50a]{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-288af50a]::-webkit-scrollbar{display:none}.chart-container[data-v-288af50a]:hover{cursor:grab}.chart-container.is-resizing-pane[data-v-288af50a],.chart-container.is-hovering-pane-separator[data-v-288af50a]{cursor:row-resize}.scroll-content[data-v-288af50a]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-288af50a]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-anchor[data-v-288af50a]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-288af50a]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-288af50a]{anchor-name:--marker-tooltip-anchor}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute}.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;border-right:1px solid #e0e0e0}
2
2
  /*$vite$:1*/
@@ -14,6 +14,10 @@ type __VLS_Props = {
14
14
  bottomAxisHeight?: number;
15
15
  /** 价格标签额外宽度(用于显示涨跌幅,默认 60px) */
16
16
  priceLabelWidth?: number;
17
+ /** 缩放级别数量(默认 10) */
18
+ zoomLevels?: number;
19
+ /** 初始缩放级别(1 ~ zoomLevels,默认居中) */
20
+ initialZoomLevel?: number;
17
21
  };
18
22
  declare function scheduleRender(): void;
19
23
  declare function addSubPane(indicatorId?: SubIndicatorType, params?: Record<string, number>): boolean;
@@ -29,7 +33,16 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {
29
33
  switchSubIndicator: typeof switchSubIndicator;
30
34
  clearAllSubPanes: typeof clearAllSubPanes;
31
35
  plugin: import('..').PluginHostImpl | undefined;
32
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
36
+ zoomToLevel: (level: number, anchorX?: number) => void | undefined;
37
+ zoomIn: (anchorX?: number) => void | undefined;
38
+ zoomOut: (anchorX?: number) => void | undefined;
39
+ getZoomLevel: () => number;
40
+ getZoomLevelCount: () => number;
41
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
42
+ zoomLevelChange: (level: number, kWidth: number) => any;
43
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
44
+ onZoomLevelChange?: ((level: number, kWidth: number) => any) | undefined;
45
+ }>, {
33
46
  kWidth: number;
34
47
  kGap: number;
35
48
  yPaddingPx: number;
@@ -38,6 +51,8 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {
38
51
  minKWidth: number;
39
52
  maxKWidth: number;
40
53
  priceLabelWidth: number;
54
+ zoomLevels: number;
55
+ initialZoomLevel: number;
41
56
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
42
57
  containerRef: HTMLDivElement;
43
58
  canvasLayerRef: HTMLDivElement;
@@ -8,6 +8,8 @@ type __VLS_Props = {
8
8
  x: number;
9
9
  y: number;
10
10
  };
11
+ useAnchor?: boolean;
12
+ anchorPlacement?: 'right-bottom' | 'left-bottom';
11
13
  /** 把 tooltip 根元素回传给父组件(用于测量宽高) */
12
14
  setEl?: (el: HTMLDivElement | null) => void;
13
15
  };
@@ -5,6 +5,9 @@ type __VLS_Props = {
5
5
  x: number;
6
6
  y: number;
7
7
  };
8
+ useAnchor?: boolean;
9
+ anchorPlacement?: 'right-bottom' | 'left-bottom';
10
+ setEl?: (el: HTMLDivElement | null) => void;
8
11
  };
9
12
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
10
13
  export default _default;
@@ -51,6 +51,17 @@ export type ChartOptions = {
51
51
  priceLabelWidth?: number;
52
52
  /** pane 最小高度(逻辑像素,默认 60) */
53
53
  defaultPaneMinHeightPx?: number;
54
+ /**
55
+ * 缩放级别数量(默认 10)
56
+ * - 将 minKWidth ~ maxKWidth 划分为多少个离散级别
57
+ * - 例如 10 表示有 10 个缩放级别(1-10)
58
+ */
59
+ zoomLevels?: number;
60
+ /**
61
+ * 初始缩放级别(1 ~ zoomLevels,默认居中)
62
+ * 未指定时自动计算为中间级别
63
+ */
64
+ initialZoomLevel?: number;
54
65
  };
55
66
  /** K 线起始 x 坐标数组,positions[i] 表示第 i 根 K 线的起始 x 坐标(逻辑像素) */
56
67
  export type KLinePositions = number[];
@@ -87,6 +98,12 @@ export declare class Chart {
87
98
  private onViewportChange?;
88
99
  /** pane 布局回流回调(Chart -> UI 单向) */
89
100
  private onPaneLayoutChange?;
101
+ /** 缩放级别变化回调 */
102
+ private onZoomLevelChange?;
103
+ /** 当前缩放级别(1 ~ zoomLevelCount) */
104
+ private currentZoomLevel;
105
+ /** 缩放级别总数 */
106
+ private readonly zoomLevelCount;
90
107
  /**
91
108
  * 创建图表实例
92
109
  * @param dom 由 Vue 组件传入的 DOM 句柄
@@ -135,6 +152,49 @@ export declare class Chart {
135
152
  * @param cb 缩放回调函数
136
153
  */
137
154
  setOnZoomChange(cb: (kWidth: number, kGap: number, targetScrollLeft: number) => void): void;
155
+ /**
156
+ * 将缩放级别转换为 K 线宽度
157
+ * @param level 缩放级别(1 ~ zoomLevels)
158
+ * @returns K 线宽度(逻辑像素)
159
+ */
160
+ private zoomLevelToKWidth;
161
+ /**
162
+ * 将 K 线宽度转换为缩放级别
163
+ * @param kWidth K 线宽度
164
+ * @returns 缩放级别(1 ~ zoomLevels)
165
+ */
166
+ private kWidthToZoomLevel;
167
+ /**
168
+ * 缩放到指定级别
169
+ * @param level 目标级别(1 ~ zoomLevels)
170
+ * @param anchorX 缩放中心点(相对 container 左侧的 x 坐标,默认为中心)
171
+ */
172
+ zoomToLevel(level: number, anchorX?: number): void;
173
+ /**
174
+ * 获取当前缩放级别
175
+ * @returns 当前级别(1 ~ zoomLevels)
176
+ */
177
+ getZoomLevel(): number;
178
+ /**
179
+ * 获取总缩放级别数
180
+ * @returns 级别总数
181
+ */
182
+ getZoomLevelCount(): number;
183
+ /**
184
+ * 放大一级
185
+ * @param anchorX 缩放中心点(默认为中心)
186
+ */
187
+ zoomIn(anchorX?: number): void;
188
+ /**
189
+ * 缩小一级
190
+ * @param anchorX 缩放中心点(默认为中心)
191
+ */
192
+ zoomOut(anchorX?: number): void;
193
+ /**
194
+ * 注册缩放级别变化回调
195
+ * @param cb 回调函数,参数为 (level, kWidth)
196
+ */
197
+ setOnZoomLevelChange(cb: (level: number, kWidth: number) => void): void;
138
198
  /** 注册视口变化回调 */
139
199
  setOnViewportChange(cb: (viewport: Viewport) => void): void;
140
200
  /** 注册 pane 布局回流回调 */
@@ -45,6 +45,10 @@ export declare class InteractionController {
45
45
  width: number;
46
46
  height: number;
47
47
  };
48
+ /** tooltip 锚定位放置方向 */
49
+ tooltipAnchorPlacement: 'right-bottom' | 'left-bottom';
50
+ /** 是否使用 CSS 锚定位 */
51
+ private useTooltipAnchorPositioning;
48
52
  /** 当前 hover 的 marker ID */
49
53
  hoveredMarkerId: string | null;
50
54
  /** 当前点击的 marker ID */
@@ -88,6 +92,7 @@ export declare class InteractionController {
88
92
  width: number;
89
93
  height: number;
90
94
  }): void;
95
+ setTooltipAnchorPositioning(enabled: boolean): void;
91
96
  /**
92
97
  * 处理 Pointer 抬起事件
93
98
  * @param e PointerEvent
@@ -167,6 +167,10 @@ export interface RenderContext {
167
167
  yAxisCtx?: CanvasRenderingContext2D;
168
168
  xAxisCtx?: CanvasRenderingContext2D;
169
169
  borderCtx?: CanvasRenderingContext2D;
170
+ /** 当前缩放级别(1 ~ zoomLevels) */
171
+ zoomLevel?: number;
172
+ /** 总缩放级别数 */
173
+ zoomLevelCount?: number;
170
174
  }
171
175
  /** 全局 Pane ID(渲染到所有 pane) */
172
176
  export declare const GLOBAL_PANE_ID: unique symbol;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@363045841yyt/klinechart",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": "^20.19.0 || >=22.12.0"