@363045841yyt/klinechart 0.4.3 → 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-061fa6d4]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-061fa6d4]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-061fa6d4]::-webkit-scrollbar{display:none}.indicator-list[data-v-061fa6d4]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-061fa6d4]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-061fa6d4]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-061fa6d4],.indicator-item.draggable .indicator-btn[data-v-061fa6d4],.indicator-item.draggable[data-v-061fa6d4]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-061fa6d4]{cursor:move}.indicator-item.is-dragging[data-v-061fa6d4]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-061fa6d4]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-061fa6d4]{position:relative}.indicator-btn[data-v-061fa6d4]{color:#666;cursor:pointer;white-space:nowrap;background:#fff;border:1px solid #e0e0e0;border-radius:16px;flex-shrink:0;justify-content:center;align-items:center;gap:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .3s;display:flex;position:relative;overflow:hidden}.indicator-btn[data-v-061fa6d4]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-061fa6d4]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-061fa6d4]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-061fa6d4]{z-index:1;position:relative}.param-hint[data-v-061fa6d4]{opacity:.85;font-size:11px}.hover-overlay[data-v-061fa6d4]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2;background:#ffffffd9;border-radius:16px;justify-content:center;align-items:center;gap:4px;display:flex;position:absolute;inset:0}.action-btn[data-v-061fa6d4]{color:#666;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:all .2s;display:flex}.action-btn[data-v-061fa6d4]:hover{color:#333;background:#0000000f}.settings-btn[data-v-061fa6d4]:hover{color:#1a1a1a}.remove-btn[data-v-061fa6d4]:hover{color:#ff4d4f}.divider[data-v-061fa6d4]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-061fa6d4]{color:#999;cursor:pointer;background:0 0;border:1px dashed #d9d9d9;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;transition:all .3s;display:flex}.add-btn[data-v-061fa6d4]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-061fa6d4]{white-space:nowrap;z-index:9999;background:#fff;border-radius:8px;padding:8px 0;position:fixed;transform:translate(-50%);box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d}.menu-section[data-v-061fa6d4]{padding:4px 0}.menu-section[data-v-061fa6d4]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-061fa6d4]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-061fa6d4]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-061fa6d4]{text-align:left;color:#333;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:8px 16px;font-size:13px;transition:background .2s;display:flex}.menu-item[data-v-061fa6d4]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-061fa6d4]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-061fa6d4]{color:#999;font-size:11px}.active-tag[data-v-061fa6d4]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-061fa6d4],.fade-leave-active[data-v-061fa6d4]{transition:opacity .2s}.fade-enter-from[data-v-061fa6d4],.fade-leave-to[data-v-061fa6d4]{opacity:0}.slide-enter-active[data-v-061fa6d4],.slide-leave-active[data-v-061fa6d4]{transition:all .2s}.slide-enter-from[data-v-061fa6d4],.slide-leave-to[data-v-061fa6d4]{opacity:0;transform:translate(-50%)translateY(8px)}.chart-wrapper[data-v-15fe4683]{--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-15fe4683]{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-15fe4683]::-webkit-scrollbar{display:none}.chart-container[data-v-15fe4683]:hover{cursor:grab}.chart-container.is-resizing-pane[data-v-15fe4683],.chart-container.is-hovering-pane-separator[data-v-15fe4683]{cursor:row-resize}.scroll-content[data-v-15fe4683]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-15fe4683]{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 布局回流回调 */
@@ -215,11 +275,17 @@ export declare class Chart {
215
275
  */
216
276
  getSubPaneIndicators(): SubIndicatorType[];
217
277
  /**
218
- * 平移价格轴(用于上下拖动)
278
+ * 平移价格轴(用于主图区域上下拖动)
219
279
  * @param paneId 目标 pane ID
220
280
  * @param deltaY Y轴像素偏移(正数向下拖动)
221
281
  */
222
282
  translatePrice(paneId: string, deltaY: number): void;
283
+ /**
284
+ * 缩放价格轴(用于右侧刻度栏上下拖动)
285
+ * @param paneId 目标 pane ID
286
+ * @param deltaY Y轴像素偏移(向上拖动放大,向下拖动缩小)
287
+ */
288
+ scalePrice(paneId: string, deltaY: number): void;
223
289
  /**
224
290
  * 更新数据并请求重绘
225
291
  * @param data K 线数据数组
@@ -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
@@ -158,4 +163,6 @@ export declare class InteractionController {
158
163
  * 重置所有交互状态(数据更新时调用)
159
164
  */
160
165
  reset(): void;
166
+ /** 获取十字线指向的 K 线索引 */
167
+ getCrosshairIndex(): number | null;
161
168
  }
@@ -2,4 +2,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
2
2
  export declare function createCciScaleRendererPlugin(options: {
3
3
  axisWidth: number;
4
4
  paneId: string;
5
+ yPaddingPx?: number;
6
+ getCrosshair?: () => {
7
+ y: number;
8
+ price: number;
9
+ activePaneId: string | null;
10
+ } | null;
5
11
  }): RendererPluginWithHost;
@@ -2,4 +2,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
2
2
  export declare function createFastkScaleRendererPlugin(options: {
3
3
  axisWidth: number;
4
4
  paneId: string;
5
+ yPaddingPx?: number;
6
+ getCrosshair?: () => {
7
+ y: number;
8
+ price: number;
9
+ activePaneId: string | null;
10
+ } | null;
5
11
  }): RendererPluginWithHost;
@@ -5,6 +5,12 @@ export interface IndicatorScaleRendererOptions {
5
5
  indicatorKey: string;
6
6
  label: string;
7
7
  decimals?: number;
8
+ yPaddingPx?: number;
9
+ getCrosshair?: () => {
10
+ y: number;
11
+ price: number;
12
+ activePaneId: string | null;
13
+ } | null;
8
14
  }
9
15
  export interface DrawScaleTicksOptions {
10
16
  ctx: CanvasRenderingContext2D;
@@ -2,4 +2,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
2
2
  export declare function createKstScaleRendererPlugin(options: {
3
3
  axisWidth: number;
4
4
  paneId: string;
5
+ yPaddingPx?: number;
6
+ getCrosshair?: () => {
7
+ y: number;
8
+ price: number;
9
+ activePaneId: string | null;
10
+ } | null;
5
11
  }): RendererPluginWithHost;
@@ -5,4 +5,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
5
5
  export declare function createMacdScaleRendererPlugin(options: {
6
6
  axisWidth: number;
7
7
  paneId: string;
8
+ yPaddingPx?: number;
9
+ getCrosshair?: () => {
10
+ y: number;
11
+ price: number;
12
+ activePaneId: string | null;
13
+ } | null;
8
14
  }): RendererPluginWithHost;
@@ -2,4 +2,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
2
2
  export declare function createMomScaleRendererPlugin(options: {
3
3
  axisWidth: number;
4
4
  paneId: string;
5
+ yPaddingPx?: number;
6
+ getCrosshair?: () => {
7
+ y: number;
8
+ price: number;
9
+ activePaneId: string | null;
10
+ } | null;
5
11
  }): RendererPluginWithHost;
@@ -2,4 +2,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
2
2
  export declare function createRsiScaleRendererPlugin(options: {
3
3
  axisWidth: number;
4
4
  paneId: string;
5
+ yPaddingPx?: number;
6
+ getCrosshair?: () => {
7
+ y: number;
8
+ price: number;
9
+ activePaneId: string | null;
10
+ } | null;
5
11
  }): RendererPluginWithHost;
@@ -2,4 +2,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
2
2
  export declare function createStochScaleRendererPlugin(options: {
3
3
  axisWidth: number;
4
4
  paneId: string;
5
+ yPaddingPx?: number;
6
+ getCrosshair?: () => {
7
+ y: number;
8
+ price: number;
9
+ activePaneId: string | null;
10
+ } | null;
5
11
  }): RendererPluginWithHost;
@@ -2,4 +2,10 @@ import { RendererPluginWithHost } from '../../../../plugin';
2
2
  export declare function createWmsrScaleRendererPlugin(options: {
3
3
  axisWidth: number;
4
4
  paneId: string;
5
+ yPaddingPx?: number;
6
+ getCrosshair?: () => {
7
+ y: number;
8
+ price: number;
9
+ activePaneId: string | null;
10
+ } | null;
5
11
  }): RendererPluginWithHost;
@@ -10,6 +10,8 @@ export declare class PriceScale {
10
10
  private paddingBottom;
11
11
  /** 价格偏移量(用于上下拖动平移价格轴) */
12
12
  private priceOffset;
13
+ /** 垂直缩放系数(1=默认,>1 放大,<1 缩小) */
14
+ private verticalScale;
13
15
  setRange(r: PriceRange): void;
14
16
  setHeight(h: number): void;
15
17
  setPadding(top: number, bottom: number): void;
@@ -29,6 +31,12 @@ export declare class PriceScale {
29
31
  * 重置价格偏移量
30
32
  */
31
33
  resetPriceOffset(): void;
34
+ /**
35
+ * 按拖拽位移缩放 Y 轴(deltaY < 0 放大,deltaY > 0 缩小)
36
+ */
37
+ scaleByDelta(deltaY: number): void;
38
+ getVerticalScale(): number;
39
+ getDisplayRange(baseRange?: PriceRange): PriceRange;
32
40
  priceToY(price: number): number;
33
41
  yToPrice(y: number): number;
34
42
  /**
@@ -111,6 +111,13 @@ export interface PaneInfo {
111
111
  getPaddingTop(): number;
112
112
  getPaddingBottom(): number;
113
113
  getPriceOffset(): number;
114
+ getDisplayRange(baseRange?: {
115
+ maxPrice: number;
116
+ minPrice: number;
117
+ }): {
118
+ maxPrice: number;
119
+ minPrice: number;
120
+ };
114
121
  };
115
122
  priceRange: {
116
123
  maxPrice: number;
@@ -155,9 +162,15 @@ export interface RenderContext {
155
162
  paneWidth: number;
156
163
  kLinePositions: number[];
157
164
  markerManager?: MarkerManagerLike;
165
+ /** 十字线指向的 K 线索引(无十字线时为 null) */
166
+ crosshairIndex?: number | null;
158
167
  yAxisCtx?: CanvasRenderingContext2D;
159
168
  xAxisCtx?: CanvasRenderingContext2D;
160
169
  borderCtx?: CanvasRenderingContext2D;
170
+ /** 当前缩放级别(1 ~ zoomLevels) */
171
+ zoomLevel?: number;
172
+ /** 总缩放级别数 */
173
+ zoomLevelCount?: number;
161
174
  }
162
175
  /** 全局 Pane ID(渲染到所有 pane) */
163
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.3",
3
+ "version": "0.4.5",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": "^20.19.0 || >=22.12.0"
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "ajv": "^8.20.0",
41
- "axios": "^1.15.2"
41
+ "axios": "^1.16.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@tsconfig/node24": "^24.0.4",
@@ -57,6 +57,6 @@
57
57
  "vite-plugin-dts": "^4.5.4",
58
58
  "vite-plugin-vue-devtools": "^8.1.1",
59
59
  "vitest": "^4.1.5",
60
- "vue-tsc": "^3.2.7"
60
+ "vue-tsc": "^3.2.8"
61
61
  }
62
- }
62
+ }