@363045841yyt/klinechart 0.5.5 → 0.5.6

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-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-4b90c954]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-4b90c954]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-4b90c954]::-webkit-scrollbar{display:none}.indicator-list[data-v-4b90c954]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-4b90c954]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-4b90c954]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-4b90c954],.indicator-item.draggable .indicator-btn[data-v-4b90c954],.indicator-item.draggable[data-v-4b90c954]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-4b90c954]{cursor:move}.indicator-item.is-dragging[data-v-4b90c954]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-4b90c954]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-4b90c954]{position:relative}.indicator-btn[data-v-4b90c954]{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-4b90c954]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-4b90c954]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-4b90c954]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-4b90c954]{z-index:1;position:relative}.param-hint[data-v-4b90c954]{opacity:.85;font-size:11px}.hover-overlay[data-v-4b90c954]{-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-4b90c954]{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-4b90c954]:hover{color:#333;background:#0000000f}.settings-btn[data-v-4b90c954]:hover{color:#1a1a1a}.remove-btn[data-v-4b90c954]:hover{color:#ff4d4f}.divider[data-v-4b90c954]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-4b90c954]{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-4b90c954]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-4b90c954]{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-4b90c954]{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-4b90c954]{padding:4px 0}.menu-section[data-v-4b90c954]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-4b90c954]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-4b90c954]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-4b90c954]{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-4b90c954]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-4b90c954]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-4b90c954]{color:#999;font-size:11px}.active-tag[data-v-4b90c954]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-4b90c954],.fade-leave-active[data-v-4b90c954]{transition:opacity .2s}.fade-enter-from[data-v-4b90c954],.fade-leave-to[data-v-4b90c954]{opacity:0}.slide-enter-active[data-v-4b90c954],.slide-leave-active[data-v-4b90c954]{transition:all .2s}.slide-enter-from[data-v-4b90c954],.slide-leave-to[data-v-4b90c954]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-088ccef5]{-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-088ccef5]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-088ccef5]{width:24px;height:24px;position:relative}.color-swatch[data-v-088ccef5]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-088ccef5]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-088ccef5]{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-088ccef5]:hover{border-color:#9ca3af}.toolbar-btn[data-v-088ccef5]{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-088ccef5]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-088ccef5]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-088ccef5]{width:14px;height:14px}.left-toolbar[data-v-d272c54d]{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-d272c54d]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-d272c54d]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-d272c54d]{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-d272c54d]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-d272c54d]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-d272c54d]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-d272c54d]{width:16px;height:16px}.corner-indicator[data-v-d272c54d]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-d272c54d]: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-d272c54d]:after,.left-toolbar__button.active .corner-indicator[data-v-d272c54d]:after{opacity:.7}.corner-indicator.open[data-v-d272c54d]:after{opacity:.8}.tool-dropdown[data-v-d272c54d]{-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-d272c54d]{position:relative}.dropdown-enter-active[data-v-d272c54d],.dropdown-leave-active[data-v-d272c54d]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-d272c54d],.dropdown-leave-to[data-v-d272c54d]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-d272c54d]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-d272c54d]{gap:3px}.left-toolbar__button[data-v-d272c54d]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-d272c54d]{width:16px}.corner-indicator[data-v-d272c54d]{width:7px;height:7px}.corner-indicator[data-v-d272c54d]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-d272c54d]{height:36px}}.settings-overlay[data-v-d272c54d]{-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-d272c54d]{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-d272c54d]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-d272c54d]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-d272c54d]{align-items:center;gap:8px;display:flex}.settings-title[data-v-d272c54d]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-d272c54d]{color:#999;font-size:11px}.settings-close[data-v-d272c54d]{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-d272c54d]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-d272c54d]{width:14px;height:14px}.settings-body[data-v-d272c54d]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-d272c54d]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-d272c54d]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-d272c54d]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-footer[data-v-d272c54d]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-d272c54d]{gap:8px;display:flex}.settings-btn[data-v-d272c54d]{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-d272c54d]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-d272c54d]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-d272c54d]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-d272c54d]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-d272c54d]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-d272c54d]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-d272c54d]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-d272c54d]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-fff9d345]{--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-fff9d345]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-fff9d345]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-fff9d345]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-fff9d345]{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-fff9d345]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-fff9d345],.chart-stage.is-hovering-pane-separator[data-v-fff9d345]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-fff9d345]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-fff9d345]{cursor:ns-resize}.chart-stage.is-dragging[data-v-fff9d345]{cursor:grabbing}.chart-container[data-v-fff9d345]{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-fff9d345]::-webkit-scrollbar{display:none}.chart-container[data-v-fff9d345]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-fff9d345],.chart-stage.is-hovering-pane-separator .chart-container[data-v-fff9d345]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-fff9d345]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-fff9d345]{cursor:grabbing}.right-axis-host[data-v-fff9d345]{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-fff9d345]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-fff9d345]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-fff9d345]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-fff9d345]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-fff9d345]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-fff9d345]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-fff9d345]{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-0f3a76b5]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-0f3a76b5]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-0f3a76b5]::-webkit-scrollbar{display:none}.indicator-list[data-v-0f3a76b5]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-0f3a76b5]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-0f3a76b5]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-0f3a76b5],.indicator-item.draggable .indicator-btn[data-v-0f3a76b5],.indicator-item.draggable[data-v-0f3a76b5]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-0f3a76b5]{cursor:move}.indicator-item.is-dragging[data-v-0f3a76b5]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-0f3a76b5]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-0f3a76b5]{position:relative}.indicator-btn[data-v-0f3a76b5]{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-0f3a76b5]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-0f3a76b5]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-0f3a76b5]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-0f3a76b5]{z-index:1;position:relative}.param-hint[data-v-0f3a76b5]{opacity:.85;font-size:11px}.hover-overlay[data-v-0f3a76b5]{-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-0f3a76b5]{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-0f3a76b5]:hover{color:#333;background:#0000000f}.settings-btn[data-v-0f3a76b5]:hover{color:#1a1a1a}.remove-btn[data-v-0f3a76b5]:hover{color:#ff4d4f}.divider[data-v-0f3a76b5]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-0f3a76b5]{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-0f3a76b5]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-0f3a76b5]{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-0f3a76b5]{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-0f3a76b5]{padding:4px 0}.menu-section[data-v-0f3a76b5]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-0f3a76b5]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-0f3a76b5]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-0f3a76b5]{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-0f3a76b5]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-0f3a76b5]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-0f3a76b5]{color:#999;font-size:11px}.active-tag[data-v-0f3a76b5]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-0f3a76b5],.fade-leave-active[data-v-0f3a76b5]{transition:opacity .2s}.fade-enter-from[data-v-0f3a76b5],.fade-leave-to[data-v-0f3a76b5]{opacity:0}.slide-enter-active[data-v-0f3a76b5],.slide-leave-active[data-v-0f3a76b5]{transition:all .2s}.slide-enter-from[data-v-0f3a76b5],.slide-leave-to[data-v-0f3a76b5]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-088ccef5]{-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-088ccef5]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-088ccef5]{width:24px;height:24px;position:relative}.color-swatch[data-v-088ccef5]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-088ccef5]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-088ccef5]{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-088ccef5]:hover{border-color:#9ca3af}.toolbar-btn[data-v-088ccef5]{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-088ccef5]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-088ccef5]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-088ccef5]{width:14px;height:14px}.left-toolbar[data-v-1f5465f7]{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-1f5465f7]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-1f5465f7]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-1f5465f7]{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-1f5465f7]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-1f5465f7]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-1f5465f7]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-1f5465f7]{width:16px;height:16px}.corner-indicator[data-v-1f5465f7]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-1f5465f7]: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-1f5465f7]:after,.left-toolbar__button.active .corner-indicator[data-v-1f5465f7]:after{opacity:.7}.corner-indicator.open[data-v-1f5465f7]:after{opacity:.8}.tool-dropdown[data-v-1f5465f7]{-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-1f5465f7]{position:relative}.dropdown-enter-active[data-v-1f5465f7],.dropdown-leave-active[data-v-1f5465f7]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-1f5465f7],.dropdown-leave-to[data-v-1f5465f7]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-1f5465f7]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-1f5465f7]{gap:3px}.left-toolbar__button[data-v-1f5465f7]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-1f5465f7]{width:16px}.corner-indicator[data-v-1f5465f7]{width:7px;height:7px}.corner-indicator[data-v-1f5465f7]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-1f5465f7]{height:36px}}.settings-overlay[data-v-1f5465f7]{-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-1f5465f7]{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-1f5465f7]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-1f5465f7]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-1f5465f7]{align-items:center;gap:8px;display:flex}.settings-title[data-v-1f5465f7]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-1f5465f7]{color:#999;font-size:11px}.settings-close[data-v-1f5465f7]{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-1f5465f7]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-1f5465f7]{width:14px;height:14px}.settings-body[data-v-1f5465f7]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-1f5465f7]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-1f5465f7]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-1f5465f7]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-footer[data-v-1f5465f7]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-1f5465f7]{gap:8px;display:flex}.settings-btn[data-v-1f5465f7]{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-1f5465f7]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-1f5465f7]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-1f5465f7]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-1f5465f7]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-1f5465f7]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-1f5465f7]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-1f5465f7]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-1f5465f7]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-fff9d345]{--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-fff9d345]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-fff9d345]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-fff9d345]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-fff9d345]{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-fff9d345]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-fff9d345],.chart-stage.is-hovering-pane-separator[data-v-fff9d345]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-fff9d345]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-fff9d345]{cursor:ns-resize}.chart-stage.is-dragging[data-v-fff9d345]{cursor:grabbing}.chart-container[data-v-fff9d345]{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-fff9d345]::-webkit-scrollbar{display:none}.chart-container[data-v-fff9d345]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-fff9d345],.chart-stage.is-hovering-pane-separator .chart-container[data-v-fff9d345]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-fff9d345]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-fff9d345]{cursor:grabbing}.right-axis-host[data-v-fff9d345]{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-fff9d345]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-fff9d345]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-fff9d345]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-fff9d345]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-fff9d345]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-fff9d345]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-fff9d345]{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*/
@@ -0,0 +1,3 @@
1
+ import { Ref } from 'vue';
2
+ export declare function provideFullscreenTeleportTarget(targetRef: Ref<HTMLElement | null>): void;
3
+ export declare function useFullscreenTeleportTarget(): import('vue').ComputedRef<string | HTMLElement>;
@@ -1,4 +1,5 @@
1
1
  import { RendererPluginWithHost } from '../../../../plugin';
2
+ import { ScaleType } from '../../../utils/tickPosition';
2
3
  export interface IndicatorScaleRendererOptions {
3
4
  axisWidth: number;
4
5
  paneId: string;
@@ -6,6 +7,7 @@ export interface IndicatorScaleRendererOptions {
6
7
  label: string;
7
8
  decimals?: number;
8
9
  yPaddingPx?: number;
10
+ scaleType?: ScaleType;
9
11
  getCrosshair?: () => {
10
12
  y: number;
11
13
  price: number;
@@ -26,6 +28,7 @@ export interface DrawScaleTicksOptions {
26
28
  isMain: boolean;
27
29
  decimals?: number;
28
30
  hideEdgeTicks?: boolean;
31
+ scaleType?: ScaleType;
29
32
  formatLabel?: (value: number) => string;
30
33
  }
31
34
  export declare function drawScaleTicks(options: DrawScaleTicksOptions): void;
@@ -0,0 +1,66 @@
1
+ import { PriceRange } from './price';
2
+ /**
3
+ * LogFormula 接口
4
+ * 用于对数变换的动态偏移,保证极小值下的精度
5
+ *
6
+ * - logicalOffset: 逻辑偏移,使输出值落在合理范围
7
+ * - coordOffset: 坐标偏移,避免 log10(0) 并提升精度
8
+ */
9
+ export interface LogFormula {
10
+ logicalOffset: number;
11
+ coordOffset: number;
12
+ }
13
+ /**
14
+ * 真实价格 → log 逻辑空间
15
+ * 公式: sign(price) * (log10(|price| + coordOffset) + logicalOffset)
16
+ *
17
+ * @param price 真实价格(可为负数)
18
+ * @param f LogFormula
19
+ * @returns log 逻辑空间值
20
+ */
21
+ export declare function toLog(price: number, f: LogFormula): number;
22
+ /**
23
+ * log 逻辑空间 → 真实价格
24
+ * 公式: sign(logical) * (10^(|logical| - logicalOffset) - coordOffset)
25
+ *
26
+ * @param logical log 逻辑空间值
27
+ * @param f LogFormula
28
+ * @returns 真实价格
29
+ */
30
+ export declare function fromLog(logical: number, f: LogFormula): number;
31
+ /**
32
+ * 根据价格范围动态计算 LogFormula
33
+ *
34
+ * 对于常规价格范围 (diff >= 1),使用默认值。
35
+ * 对于极小价格范围 (diff < 1),自动增大 logicalOffset 以维持精度。
36
+ *
37
+ * @param range 价格范围,可为 null
38
+ * @returns 最优的 LogFormula
39
+ */
40
+ export declare function logFormulaForPriceRange(range: PriceRange | null): LogFormula;
41
+ /**
42
+ * 范围转 log 空间
43
+ * 将价格的 min/max 都转换到 log 空间
44
+ *
45
+ * @param range 真实价格范围
46
+ * @param f LogFormula
47
+ * @returns log 空间的价格范围
48
+ */
49
+ export declare function convertPriceRangeToLog(range: PriceRange, f: LogFormula): PriceRange;
50
+ /**
51
+ * 范围从 log 空间转回
52
+ * 将 log 空间的 min/max 转换回真实价格
53
+ *
54
+ * @param range log 空间的价格范围
55
+ * @param f LogFormula
56
+ * @returns 真实价格范围
57
+ */
58
+ export declare function convertPriceRangeFromLog(range: PriceRange, f: LogFormula): PriceRange;
59
+ /**
60
+ * 判断两个 LogFormula 是否相同
61
+ *
62
+ * @param a LogFormula A
63
+ * @param b LogFormula B
64
+ * @returns 是否相同
65
+ */
66
+ export declare function logFormulasAreSame(a: LogFormula, b: LogFormula): boolean;
@@ -1,4 +1,5 @@
1
1
  import { PriceRange } from './price';
2
+ import { ScaleType } from '../utils/tickPosition';
2
3
  /**
3
4
  * Pane 级别的价格坐标系(价格 -> pane 内 Y)
4
5
  * - y=0 在 pane 顶部,y=height 在 pane 底部
@@ -8,10 +9,15 @@ export declare class PriceScale {
8
9
  private height;
9
10
  private paddingTop;
10
11
  private paddingBottom;
11
- /** 价格偏移量(用于上下拖动平移价格轴) */
12
+ /** 价格偏移量(用于上下拖动平移价格轴)
13
+ * 在对数模式下,此偏移量为 log 空间偏移 */
12
14
  private priceOffset;
13
15
  /** 垂直缩放系数(1=默认,>1 放大,<1 缩小) */
14
16
  private verticalScale;
17
+ /** 刻度类型:线性或对数 */
18
+ private scaleType;
19
+ /** 对数变换公式(动态计算,适配极小价格) */
20
+ private logFormula;
15
21
  setRange(r: PriceRange): void;
16
22
  setHeight(h: number): void;
17
23
  setPadding(top: number, bottom: number): void;
@@ -20,7 +26,9 @@ export declare class PriceScale {
20
26
  getPaddingBottom(): number;
21
27
  /**
22
28
  * 设置价格偏移量
23
- * @param offset 价格偏移(正数向上平移,负数向下平移)
29
+ * @param offset 价格偏移
30
+ * - 线性模式:真实价格的线性偏移
31
+ * - 对数模式:log 空间的偏移量
24
32
  */
25
33
  setPriceOffset(offset: number): void;
26
34
  /**
@@ -41,13 +49,39 @@ export declare class PriceScale {
41
49
  */
42
50
  scaleByDelta(deltaY: number): void;
43
51
  getVerticalScale(): number;
52
+ /**
53
+ * 设置刻度类型
54
+ * 切换时会自动转换 priceOffset 以保持视口位置
55
+ */
56
+ setScaleType(type: ScaleType): void;
57
+ /**
58
+ * 获取当前刻度类型
59
+ */
60
+ getScaleType(): ScaleType;
61
+ /**
62
+ * 获取显示范围(考虑 priceOffset 和 verticalScale)
63
+ *
64
+ * 对数模式下:
65
+ * - 内部计算在 log 空间进行
66
+ * - 返回的价格为真实价格
67
+ */
44
68
  getDisplayRange(baseRange?: PriceRange): PriceRange;
69
+ /**
70
+ * 价格 → Y 坐标
71
+ * 统一使用 getDisplayRange 的结果进行映射
72
+ */
45
73
  priceToY(price: number): number;
74
+ /**
75
+ * Y 坐标 → 价格
76
+ * 统一使用 getDisplayRange 的结果进行映射
77
+ */
46
78
  yToPrice(y: number): number;
47
79
  /**
48
80
  * 根据像素偏移计算价格偏移
49
81
  * @param deltaY Y轴像素偏移(正数向下拖动)
50
82
  * @returns 对应的价格偏移量
83
+ * - 线性模式:真实价格的偏移
84
+ * - 对数模式:log 空间的偏移
51
85
  */
52
86
  deltaYToPriceOffset(deltaY: number): number;
53
87
  }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 图表字体配置
3
+ * 字体栈:Trebuchet MS (Windows系统字体) -> Roboto -> Ubuntu -> 通用无衬线字体
4
+ * 通过 Google Fonts CDN 加载 Roboto 和 Ubuntu
5
+ */
6
+ /** 数字和文本的标准字体栈 */
7
+ export declare const FONT_FAMILY = "\"Trebuchet MS\", Roboto, Ubuntu, sans-serif";
8
+ /** 获取指定字号的字体字符串,用于 Canvas ctx.font */
9
+ export declare function getFont(size: number, options?: {
10
+ bold?: boolean;
11
+ }): string;
@@ -0,0 +1,24 @@
1
+ export interface TickPosition {
2
+ index: number;
3
+ t: number;
4
+ y: number;
5
+ }
6
+ export type ScaleType = 'linear' | 'log';
7
+ export interface CalculateTickPositionsOptions {
8
+ height: number;
9
+ paddingTop: number;
10
+ paddingBottom: number;
11
+ isMain?: boolean;
12
+ hideEdgeTicks?: boolean;
13
+ scaleType?: ScaleType;
14
+ }
15
+ export declare function calculateTickPositions(options: CalculateTickPositionsOptions): TickPosition[];
16
+ export interface TickPositionWithValue extends TickPosition {
17
+ value: number;
18
+ }
19
+ export interface CalculateValueTickPositionsOptions extends CalculateTickPositionsOptions {
20
+ valueMin: number;
21
+ valueMax: number;
22
+ logBase?: number;
23
+ }
24
+ export declare function calculateValueTickPositions(options: CalculateValueTickPositionsOptions): TickPositionWithValue[];
@@ -116,6 +116,7 @@ export interface PaneInfo {
116
116
  maxPrice: number;
117
117
  minPrice: number;
118
118
  };
119
+ getScaleType(): 'linear' | 'log';
119
120
  };
120
121
  priceRange: {
121
122
  maxPrice: number;
@@ -147,6 +148,8 @@ export interface YAxisLabel {
147
148
  price: number;
148
149
  /** 标签在轴上的Y坐标(世界坐标,相对pane) */
149
150
  y: number;
151
+ /** 标签类型,用于区分不同渲染外观 */
152
+ type?: 'lastPrice' | 'extrema' | 'anchor' | string;
150
153
  /** 标签样式覆盖 */
151
154
  style?: {
152
155
  bgColor?: string;
@@ -350,6 +353,7 @@ export interface DrawingDefinition<TParams = Record<string, unknown>> {
350
353
  export declare const GLOBAL_PANE_ID: unique symbol;
351
354
  /** 优先级推荐范围 */
352
355
  export declare const RENDERER_PRIORITY: {
356
+ readonly LAST_PRICE_LABEL: -25;
353
357
  readonly SYSTEM_YAXIS: -20;
354
358
  readonly SYSTEM_XAXIS: -20;
355
359
  readonly BACKGROUND: 0;
package/package.json CHANGED
@@ -1,7 +1,15 @@
1
1
  {
2
2
  "name": "@363045841yyt/klinechart",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
+ "description": "A lightweight financial K-line charting library with first-class AI Agent support, crisp ResizeObserver-driven rendering, and plugin-based architecture. Focused on quantitative trading scenarios with TradingView-level interaction experience.",
5
+ "author": "363045841 <slslswbsy@qq.com>",
4
6
  "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/363045841/KLineChartQuant.git"
10
+ },
11
+ "bugs": "https://github.com/363045841/KLineChartQuant/issues",
12
+ "homepage": "https://363045841.github.io/KLineChartQuant/",
5
13
  "keywords": [
6
14
  "kline-chart",
7
15
  "candlestick-chart",
@@ -1,259 +0,0 @@
1
- declare const _default: {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://kmap.dev/schemas/semantic-chart-config/1.0.0",
4
- "title": "SemanticChartConfig",
5
- "description": "Agent 语义化图表配置",
6
- "type": "object",
7
- "required": ["version", "data"],
8
- "additionalProperties": false,
9
- "properties": {
10
- "version": {
11
- "type": "string",
12
- "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
13
- "description": "semver 版本号"
14
- },
15
- "data": { "$ref": "#/$defs/DataConfig" },
16
- "indicators": { "$ref": "#/$defs/IndicatorsConfig" },
17
- "markers": { "$ref": "#/$defs/MarkersConfig" },
18
- "chart": { "$ref": "#/$defs/ChartOptions" },
19
- "theme": { "$ref": "#/$defs/ThemeConfig" }
20
- },
21
- "$defs": {
22
- "DataConfig": {
23
- "type": "object",
24
- "required": ["source", "symbol", "startDate", "endDate", "period", "adjust"],
25
- "additionalProperties": false,
26
- "properties": {
27
- "source": { "type": "string", "enum": ["baostock", "dongcai"] },
28
- "symbol": { "type": "string", "pattern": "^[0-9]{6}$" },
29
- "exchange": { "type": "string", "enum": ["SH", "SZ", "BJ"] },
30
- "startDate": { "type": "string", "format": "date" },
31
- "endDate": { "type": "string", "format": "date" },
32
- "period": {
33
- "type": "string",
34
- "enum": ["daily", "weekly", "monthly", "5min", "15min", "30min", "60min"]
35
- },
36
- "adjust": { "type": "string", "enum": ["qfq", "hfq", "none"] }
37
- }
38
- },
39
- "IndicatorsConfig": {
40
- "type": "object",
41
- "additionalProperties": false,
42
- "properties": {
43
- "main": {
44
- "type": "array",
45
- "items": { "$ref": "#/$defs/MainIndicatorConfig" },
46
- "maxItems": 5
47
- },
48
- "sub": {
49
- "type": "array",
50
- "items": { "$ref": "#/$defs/SubIndicatorConfig" },
51
- "maxItems": 5
52
- }
53
- }
54
- },
55
- "MainIndicatorConfig": {
56
- "type": "object",
57
- "required": ["type", "enabled"],
58
- "additionalProperties": false,
59
- "properties": {
60
- "type": { "type": "string", "enum": ["MA", "BOLL"] },
61
- "enabled": { "type": "boolean" },
62
- "params": { "type": "object" }
63
- },
64
- "allOf": [
65
- {
66
- "if": {
67
- "properties": { "type": { "const": "MA" } },
68
- "required": ["type"]
69
- },
70
- "then": {
71
- "properties": {
72
- "params": {
73
- "type": "object",
74
- "additionalProperties": false,
75
- "properties": {
76
- "periods": {
77
- "type": "array",
78
- "items": { "type": "integer", "minimum": 1, "maximum": 250 },
79
- "minItems": 1,
80
- "maxItems": 5
81
- }
82
- }
83
- }
84
- }
85
- },
86
- "else": {
87
- "properties": {
88
- "params": {
89
- "type": "object",
90
- "additionalProperties": false,
91
- "properties": {
92
- "period": { "type": "integer", "minimum": 1, "maximum": 100 },
93
- "multiplier": { "type": "number", "minimum": 0.1, "maximum": 5 }
94
- }
95
- }
96
- }
97
- }
98
- }
99
- ]
100
- },
101
- "SubIndicatorConfig": {
102
- "type": "object",
103
- "required": ["type", "enabled"],
104
- "additionalProperties": false,
105
- "properties": {
106
- "type": {
107
- "type": "string",
108
- "enum": ["VOLUME", "MACD", "RSI", "CCI", "STOCH", "MOM", "WMSR", "KST", "FASTK"]
109
- },
110
- "enabled": { "type": "boolean" },
111
- "params": { "type": "object" }
112
- },
113
- "allOf": [
114
- {
115
- "if": { "properties": { "type": { "const": "MACD" } } },
116
- "then": {
117
- "properties": {
118
- "params": {
119
- "type": "object",
120
- "additionalProperties": false,
121
- "properties": {
122
- "fast": { "type": "integer", "minimum": 1, "maximum": 50 },
123
- "slow": { "type": "integer", "minimum": 1, "maximum": 100 },
124
- "signal": { "type": "integer", "minimum": 1, "maximum": 50 }
125
- }
126
- }
127
- }
128
- }
129
- },
130
- {
131
- "if": { "properties": { "type": { "const": "RSI" } } },
132
- "then": {
133
- "properties": {
134
- "params": {
135
- "type": "object",
136
- "additionalProperties": false,
137
- "properties": {
138
- "period1": { "type": "integer", "minimum": 1, "maximum": 100 },
139
- "period2": { "type": "integer", "minimum": 1, "maximum": 100 },
140
- "period3": { "type": "integer", "minimum": 1, "maximum": 100 }
141
- }
142
- }
143
- }
144
- }
145
- }
146
- ]
147
- },
148
- "MarkersConfig": {
149
- "type": "object",
150
- "additionalProperties": false,
151
- "properties": {
152
- "showVolumePriceMarkers": { "type": "boolean" },
153
- "showExtremaMarkers": { "type": "boolean" },
154
- "customMarkers": {
155
- "type": "array",
156
- "items": { "$ref": "#/$defs/CustomMarker" },
157
- "maxItems": 100
158
- },
159
- "legend": { "$ref": "#/$defs/LegendConfig" }
160
- }
161
- },
162
- "CustomMarker": {
163
- "type": "object",
164
- "required": ["id", "date", "shape"],
165
- "additionalProperties": false,
166
- "properties": {
167
- "id": { "type": "string", "maxLength": 64 },
168
- "date": {
169
- "type": "string",
170
- "description": "日期时间字符串,日K用 YYYY-MM-DD,分钟K用 YYYY-MM-DD HH:mm",
171
- "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}( [0-9]{2}:[0-9]{2})?$"
172
- },
173
- "shape": {
174
- "type": "string",
175
- "enum": ["arrow_up", "arrow_down", "flag", "circle", "rectangle", "diamond"]
176
- },
177
- "groupKey": { "type": "string", "maxLength": 32 },
178
- "offset": {
179
- "type": "object",
180
- "additionalProperties": false,
181
- "properties": {
182
- "x": { "type": "number", "minimum": -500, "maximum": 500 },
183
- "y": { "type": "number", "minimum": -500, "maximum": 500 }
184
- }
185
- },
186
- "style": { "$ref": "#/$defs/MarkerStyle" },
187
- "label": { "$ref": "#/$defs/MarkerLabel" },
188
- "metadata": {
189
- "type": "object",
190
- "maxProperties": 20,
191
- "additionalProperties": {
192
- "type": ["string", "number", "boolean", "null"],
193
- "maxLength": 200
194
- }
195
- }
196
- }
197
- },
198
- "MarkerStyle": {
199
- "type": "object",
200
- "additionalProperties": false,
201
- "properties": {
202
- "fillColor": { "type": "string", "pattern": "^(#[0-9a-fA-F]{3,8}|rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)|rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\))$" },
203
- "strokeColor": { "type": "string", "pattern": "^(#[0-9a-fA-F]{3,8}|rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)|rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\))$" },
204
- "textColor": { "type": "string", "pattern": "^(#[0-9a-fA-F]{3,8}|rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)|rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\))$" },
205
- "size": { "type": "number", "minimum": 4, "maximum": 50 },
206
- "lineWidth": { "type": "number", "minimum": 0.5, "maximum": 10 },
207
- "opacity": { "type": "number", "minimum": 0, "maximum": 1 }
208
- }
209
- },
210
- "MarkerLabel": {
211
- "type": "object",
212
- "required": ["text"],
213
- "additionalProperties": false,
214
- "properties": {
215
- "text": { "type": "string", "maxLength": 50 },
216
- "position": { "type": "string", "enum": ["left", "right", "top", "bottom", "inside"] },
217
- "align": { "type": "string", "enum": ["start", "center", "end"] },
218
- "fontSize": { "type": "number", "minimum": 8, "maximum": 24 },
219
- "offset": {
220
- "type": "object",
221
- "additionalProperties": false,
222
- "properties": {
223
- "x": { "type": "number", "minimum": -500, "maximum": 500 },
224
- "y": { "type": "number", "minimum": -500, "maximum": 500 }
225
- }
226
- }
227
- }
228
- },
229
- "LegendConfig": {
230
- "type": "object",
231
- "additionalProperties": false,
232
- "properties": {
233
- "enabled": { "type": "boolean" },
234
- "position": { "type": "string", "enum": ["bottom-right", "bottom-left", "top-right", "top-left"] },
235
- "onClick": { "type": "string", "enum": ["highlight", "toggle", "none"] }
236
- }
237
- },
238
- "ChartOptions": {
239
- "type": "object",
240
- "additionalProperties": false,
241
- "properties": {
242
- "kWidth": { "type": "number", "minimum": 2, "maximum": 50 },
243
- "kGap": { "type": "number", "minimum": 0, "maximum": 20 },
244
- "autoScrollToRight": { "type": "boolean" }
245
- }
246
- },
247
- "ThemeConfig": {
248
- "type": "object",
249
- "additionalProperties": false,
250
- "properties": {
251
- "priceUpColor": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
252
- "priceDownColor": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }
253
- }
254
- }
255
- }
256
- }
257
- ;
258
-
259
- export default _default;