@363045841yyt/klinechart 0.7.5-alpha.2 → 0.7.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.
- package/dist/components/IndicatorSelector.vue.d.ts.map +1 -1
- package/dist/components/KLineChart.vue.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +22 -1
- package/dist/index.d.ts +22 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +649 -625
- package/dist/klinechart.css +1 -1
- package/package.json +1 -1
- package/src/components/IndicatorSelector.vue +63 -61
- package/src/components/KLineChart.vue +73 -141
- package/src/index.ts +72 -0
package/dist/klinechart.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.drawing-style-toolbar[data-v-4c26f819]{-webkit-backdrop-filter:blur(8px);z-index:100;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-4c26f819]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-4c26f819]{width:24px;height:24px;position:relative}.color-swatch[data-v-4c26f819]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-4c26f819]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-4c26f819]{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-4c26f819]:hover{border-color:#9ca3af}.toolbar-btn[data-v-4c26f819]{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-4c26f819]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-4c26f819]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-4c26f819]{width:14px;height:14px}.params-overlay[data-v-b82e9094]{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-b82e9094]{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-b82e9094]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-b82e9094]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-b82e9094]{align-items:center;gap:8px;display:flex}.params-title[data-v-b82e9094]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-b82e9094]{color:#999;font-size:11px}.toggle-desc-btn[data-v-b82e9094]{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-b82e9094]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-b82e9094]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-b82e9094]{width:14px;height:14px}.params-close[data-v-b82e9094]{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-b82e9094]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-b82e9094]{width:14px;height:14px}.indicator-description[data-v-b82e9094]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-b82e9094]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-b82e9094]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-b82e9094]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-b82e9094]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-b82e9094]{padding:10px 14px 8px}.param-header[data-v-b82e9094]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-b82e9094]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-b82e9094]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-b82e9094]{color:#999;font-size:11px}.param-description[data-v-b82e9094]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-b82e9094]{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-b82e9094]:focus-within{border-color:#999}.stepper-btn[data-v-b82e9094]{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-b82e9094]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-b82e9094]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-b82e9094]{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-b82e9094]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-b82e9094]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-b82e9094]:focus{outline:none}.params-footer[data-v-b82e9094]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-b82e9094]{gap:8px;display:flex}.params-btn[data-v-b82e9094]{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-b82e9094]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-b82e9094]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-b82e9094]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-b82e9094]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-b82e9094]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-b82e9094]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-b82e9094]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-b82e9094]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-b82e9094],.overlay-leave-active[data-v-b82e9094]{transition:opacity .2s}.overlay-enter-from[data-v-b82e9094],.overlay-leave-to[data-v-b82e9094]{opacity:0}.modal-enter-active[data-v-b82e9094]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-b82e9094]{transition:all .16s ease-in}.modal-enter-from[data-v-b82e9094]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-b82e9094]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-b82e9094],.slide-leave-active[data-v-b82e9094]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-b82e9094],.slide-leave-to[data-v-b82e9094]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-73fe46e7]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-73fe46e7]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-73fe46e7]::-webkit-scrollbar{display:none}.indicator-list[data-v-73fe46e7]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-73fe46e7]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-73fe46e7]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-73fe46e7],.indicator-item.draggable .indicator-btn[data-v-73fe46e7],.indicator-item.draggable[data-v-73fe46e7]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-73fe46e7]{cursor:move}.indicator-item.is-dragging[data-v-73fe46e7]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-73fe46e7]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-73fe46e7]{position:relative}.indicator-btn[data-v-73fe46e7]{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-73fe46e7]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-73fe46e7]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-73fe46e7]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-73fe46e7]{z-index:1;position:relative}.param-hint[data-v-73fe46e7]{opacity:.85;font-size:11px}.hover-overlay[data-v-73fe46e7]{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-73fe46e7]{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-73fe46e7]:hover{color:#333;background:#0000000f}.settings-btn[data-v-73fe46e7]:hover{color:#1a1a1a}.remove-btn[data-v-73fe46e7]:hover{color:#ff4d4f}.divider[data-v-73fe46e7]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-73fe46e7]{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-73fe46e7]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.selector-overlay[data-v-73fe46e7]{backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.selector-modal[data-v-73fe46e7]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;flex-direction:column;width:90vw;max-width:860px;max-height:85vh;display:flex;overflow:hidden;box-shadow:0 8px 40px #00000026}.modal-header[data-v-73fe46e7]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;flex-shrink:0;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-title[data-v-73fe46e7]{flex-direction:column;gap:2px;display:flex}.title-text[data-v-73fe46e7]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.title-sub[data-v-73fe46e7]{color:#999;font-size:11px}.modal-close[data-v-73fe46e7]{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 .15s;display:flex}.modal-close[data-v-73fe46e7]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.modal-close svg[data-v-73fe46e7]{width:14px;height:14px}.header-actions[data-v-73fe46e7]{align-items:center;gap:8px;display:flex}.view-toggle-btn[data-v-73fe46e7]{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 .15s;display:flex}.view-toggle-btn[data-v-73fe46e7]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.view-toggle-btn.active[data-v-73fe46e7]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.modal-body[data-v-73fe46e7]{flex-direction:column;flex:1;gap:20px;padding:20px;display:flex;overflow-y:auto}.search-box[data-v-73fe46e7]{border:1px solid #e0e0e0;border-radius:8px;align-items:center;gap:10px;padding:10px 14px;transition:all .2s;display:flex}.search-box[data-v-73fe46e7]:focus-within{background:#fff;border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a14}.search-icon[data-v-73fe46e7]{color:#999;flex-shrink:0}.search-input[data-v-73fe46e7]{color:#333;background:0 0;border:none;outline:none;flex:1;font-size:13px}.search-input[data-v-73fe46e7]::placeholder{color:#aaa}.no-results[data-v-73fe46e7]{color:#ccc;flex-direction:column;justify-content:center;align-items:center;gap:12px;padding:48px 20px;display:flex}.no-results svg[data-v-73fe46e7]{opacity:.5}.no-results p[data-v-73fe46e7]{color:#999;margin:0;font-size:14px;font-weight:500}.no-results-hint[data-v-73fe46e7]{color:#bbb;font-size:12px}.indicator-section[data-v-73fe46e7]{flex-direction:column;gap:12px;display:flex}.section-header[data-v-73fe46e7]{align-items:center;gap:8px;display:flex}.section-title[data-v-73fe46e7]{color:#1a1a1a;font-size:13px;font-weight:600}.section-count[data-v-73fe46e7]{color:#999;background:#f0f0f0;border-radius:10px;padding:2px 8px;font-size:11px}.indicator-grid[data-v-73fe46e7]{grid-template-columns:repeat(auto-fill,minmax(195px,1fr));gap:10px;display:grid}.indicator-grid.compact[data-v-73fe46e7]{flex-wrap:wrap;gap:8px;display:flex}.indicator-grid.compact .indicator-card[data-v-73fe46e7]{white-space:nowrap;border-radius:16px;justify-content:center;align-items:center;min-height:32px;padding:6px 14px;display:inline-flex;position:relative}.indicator-grid.compact .indicator-card .card-tooltip[data-v-73fe46e7]{color:#fff;white-space:nowrap;pointer-events:none;opacity:0;z-index:10;background:#333;border-radius:6px;padding:4px 10px;font-size:12px;transition:opacity .15s;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}.indicator-grid.compact .indicator-card:hover .card-tooltip[data-v-73fe46e7]{opacity:1}.indicator-grid.compact .indicator-card .card-label[data-v-73fe46e7]{font-size:12px;font-weight:500}.indicator-card[data-v-73fe46e7]{cursor:pointer;text-align:left;background:#fff;border:1px solid #e8e8e8;border-radius:8px;flex-direction:column;gap:4px;padding:12px 14px;transition:all .15s;display:flex}.indicator-card[data-v-73fe46e7]:hover:not(.disabled){background:#fafafa;border-color:#1a1a1a;transform:translateY(-1px);box-shadow:0 2px 8px #0000000f}.indicator-card.active[data-v-73fe46e7]{background:#f8f8f8;border-color:#1a1a1a}.card-header[data-v-73fe46e7]{justify-content:space-between;align-items:center;gap:8px;display:flex}.card-label[data-v-73fe46e7]{color:#1a1a1a;font-size:13px;font-weight:600}.card-header-actions[data-v-73fe46e7]{align-items:center;gap:4px;display:flex}.card-settings-btn[data-v-73fe46e7]{color:#bbb;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;width:20px;height:20px;padding:0;transition:all .15s;display:flex}.card-settings-btn[data-v-73fe46e7]:hover{color:#555;background:#f0f0f0}.card-name[data-v-73fe46e7]{color:#666;font-size:11px;line-height:1.4}.card-params[data-v-73fe46e7]{color:#999;margin-top:2px;font-size:10px}.section-divider[data-v-73fe46e7]{background:linear-gradient(90deg,#0000,#e0e0e0,#0000);height:1px;margin:4px 0}.modal-footer[data-v-73fe46e7]{background:#f8f8f8;border-top:1px solid #e8e8e8;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-info[data-v-73fe46e7]{color:#666;font-size:12px}.info-text[data-v-73fe46e7]{color:#999}.btn[data-v-73fe46e7]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 16px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.btn-confirm[data-v-73fe46e7]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.btn-confirm[data-v-73fe46e7]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.fade-enter-active[data-v-73fe46e7],.fade-leave-active[data-v-73fe46e7]{transition:opacity .2s}.fade-enter-from[data-v-73fe46e7],.fade-leave-to[data-v-73fe46e7]{opacity:0}.overlay-enter-active[data-v-73fe46e7],.overlay-leave-active[data-v-73fe46e7]{transition:opacity .2s}.overlay-enter-from[data-v-73fe46e7],.overlay-leave-to[data-v-73fe46e7]{opacity:0}.modal-enter-active[data-v-73fe46e7]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-73fe46e7]{transition:all .16s ease-in}.modal-enter-from[data-v-73fe46e7]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-73fe46e7]{opacity:0;transform:scale(.94)translateY(8px)}@media (width<=640px){.selector-modal[data-v-73fe46e7]{width:95vw;max-height:90vh}.indicator-grid[data-v-73fe46e7]{grid-template-columns:1fr}.modal-body[data-v-73fe46e7]{padding:16px}}.kline-tooltip[data-v-93207d24]{z-index:10;color:#000000c7;pointer-events:none;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-93207d24]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-93207d24]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-93207d24]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-93207d24]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-93207d24]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-93207d24]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-93207d24]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-f56bc484]{z-index:10;color:#000000c7;pointer-events:none;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-f56bc484]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-f56bc484]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-f56bc484]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-f56bc484]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-f56bc484]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-f56bc484]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-f56bc484]{transform:translate(calc(-100% - 12px),12px)}}.left-toolbar[data-v-3e3ffb4f]{box-sizing:border-box;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-3e3ffb4f]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-3e3ffb4f]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-3e3ffb4f]{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-3e3ffb4f]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-3e3ffb4f]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-3e3ffb4f]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-3e3ffb4f]{width:16px;height:16px}.corner-indicator[data-v-3e3ffb4f]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-3e3ffb4f]: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-3e3ffb4f]:after,.left-toolbar__button.active .corner-indicator[data-v-3e3ffb4f]:after{opacity:.7}.corner-indicator.open[data-v-3e3ffb4f]:after{opacity:.8}.tool-dropdown[data-v-3e3ffb4f]{-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-3e3ffb4f]{position:relative}.dropdown-enter-active[data-v-3e3ffb4f],.dropdown-leave-active[data-v-3e3ffb4f]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-3e3ffb4f],.dropdown-leave-to[data-v-3e3ffb4f]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-3e3ffb4f]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-3e3ffb4f]{gap:3px}.left-toolbar__button[data-v-3e3ffb4f]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-3e3ffb4f]{width:16px}.corner-indicator[data-v-3e3ffb4f]{width:7px;height:7px}.corner-indicator[data-v-3e3ffb4f]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-3e3ffb4f]{height:36px}}.settings-overlay[data-v-3e3ffb4f]{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-3e3ffb4f]{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-3e3ffb4f]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-3e3ffb4f]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-3e3ffb4f]{align-items:center;gap:8px;display:flex}.settings-title[data-v-3e3ffb4f]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-3e3ffb4f]{color:#999;font-size:11px}.settings-close[data-v-3e3ffb4f]{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-3e3ffb4f]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-3e3ffb4f]{width:14px;height:14px}.settings-body[data-v-3e3ffb4f]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-3e3ffb4f]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-3e3ffb4f]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-3e3ffb4f]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-select[data-v-3e3ffb4f]{color:#333;cursor:pointer;background:#fff;border:1px solid #d0d0d0;border-radius:6px;outline:none;min-width:140px;padding:4px 8px;font-size:12px}.settings-select[data-v-3e3ffb4f]:hover{border-color:#9ca3af}.settings-select[data-v-3e3ffb4f]:focus{border-color:#6b7280;box-shadow:0 0 0 2px #6b728026}.settings-section-divider[data-v-3e3ffb4f]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-3e3ffb4f]:before,.settings-section-divider[data-v-3e3ffb4f]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-3e3ffb4f]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-3e3ffb4f]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-3e3ffb4f]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-3e3ffb4f]{gap:8px;display:flex}.settings-btn[data-v-3e3ffb4f]{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-3e3ffb4f]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-3e3ffb4f]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-3e3ffb4f]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-3e3ffb4f]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-3e3ffb4f]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-3e3ffb4f]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-3e3ffb4f]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-3e3ffb4f]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-85be3652]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);--chart-bg:#fff;--chart-bg-secondary:#f8f9fa;--chart-border:#e5e7eb;--chart-border-active:#3b82f6;--chart-text:#374151;--chart-text-secondary:#6b7280;width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-wrapper[data-theme=dark][data-v-85be3652]{--chart-bg:#1a1a2e;--chart-bg-secondary:#16162a;--chart-border:#2d2d44;--chart-border-active:#60a5fa;--chart-text:#e5e7eb;--chart-text-secondary:#9ca3af}.chart-stage[data-v-85be3652]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-85be3652]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-85be3652]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-85be3652]{border-top:1px solid var(--chart-border);opacity:1;box-sizing:border-box;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-85be3652]{border-top-color:var(--chart-border-active);border-top-width:2px;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-85be3652],.chart-stage.is-hovering-pane-separator[data-v-85be3652]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-85be3652]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-85be3652]{cursor:ns-resize}.chart-stage.is-dragging[data-v-85be3652]{cursor:grabbing}.chart-container[data-v-85be3652]{height:100%;min-height:inherit;scrollbar-width:none;-ms-overflow-style:none;border:1px solid var(--chart-border);box-sizing:border-box;background:var(--chart-bg);-webkit-touch-callout:none;user-select:none;touch-action:none;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-85be3652]::-webkit-scrollbar{display:none}.right-axis-host[data-v-85be3652]{height:100%;min-height:inherit;box-sizing:border-box;background:var(--chart-bg);border:1px solid var(--chart-border);-webkit-touch-callout:none;user-select:none;touch-action:none;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-85be3652]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-85be3652]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-85be3652]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-85be3652]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-85be3652]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-85be3652]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-85be3652]{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
|
+
.drawing-style-toolbar[data-v-4c26f819]{-webkit-backdrop-filter:blur(8px);z-index:100;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-4c26f819]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-4c26f819]{width:24px;height:24px;position:relative}.color-swatch[data-v-4c26f819]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-4c26f819]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-4c26f819]{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-4c26f819]:hover{border-color:#9ca3af}.toolbar-btn[data-v-4c26f819]{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-4c26f819]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-4c26f819]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-4c26f819]{width:14px;height:14px}.params-overlay[data-v-b82e9094]{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-b82e9094]{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-b82e9094]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-b82e9094]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-b82e9094]{align-items:center;gap:8px;display:flex}.params-title[data-v-b82e9094]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-b82e9094]{color:#999;font-size:11px}.toggle-desc-btn[data-v-b82e9094]{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-b82e9094]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-b82e9094]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-b82e9094]{width:14px;height:14px}.params-close[data-v-b82e9094]{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-b82e9094]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-b82e9094]{width:14px;height:14px}.indicator-description[data-v-b82e9094]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-b82e9094]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-b82e9094]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-b82e9094]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-b82e9094]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-b82e9094]{padding:10px 14px 8px}.param-header[data-v-b82e9094]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-b82e9094]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-b82e9094]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-b82e9094]{color:#999;font-size:11px}.param-description[data-v-b82e9094]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-b82e9094]{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-b82e9094]:focus-within{border-color:#999}.stepper-btn[data-v-b82e9094]{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-b82e9094]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-b82e9094]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-b82e9094]{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-b82e9094]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-b82e9094]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-b82e9094]:focus{outline:none}.params-footer[data-v-b82e9094]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-b82e9094]{gap:8px;display:flex}.params-btn[data-v-b82e9094]{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-b82e9094]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-b82e9094]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-b82e9094]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-b82e9094]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-b82e9094]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-b82e9094]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-b82e9094]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-b82e9094]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-b82e9094],.overlay-leave-active[data-v-b82e9094]{transition:opacity .2s}.overlay-enter-from[data-v-b82e9094],.overlay-leave-to[data-v-b82e9094]{opacity:0}.modal-enter-active[data-v-b82e9094]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-b82e9094]{transition:all .16s ease-in}.modal-enter-from[data-v-b82e9094]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-b82e9094]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-b82e9094],.slide-leave-active[data-v-b82e9094]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-b82e9094],.slide-leave-to[data-v-b82e9094]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-6eb58214]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-6eb58214]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-6eb58214]::-webkit-scrollbar{display:none}.indicator-list[data-v-6eb58214]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-6eb58214]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-6eb58214]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-6eb58214],.indicator-item.draggable .indicator-btn[data-v-6eb58214],.indicator-item.draggable[data-v-6eb58214]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-6eb58214]{cursor:move}.indicator-item.is-dragging[data-v-6eb58214]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-6eb58214]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-6eb58214]{position:relative}.indicator-btn[data-v-6eb58214]{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-6eb58214]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-6eb58214]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-6eb58214]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-6eb58214]{z-index:1;position:relative}.param-hint[data-v-6eb58214]{opacity:.85;font-size:11px}.hover-overlay[data-v-6eb58214]{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-6eb58214]{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-6eb58214]:hover{color:#333;background:#0000000f}.settings-btn[data-v-6eb58214]:hover{color:#1a1a1a}.remove-btn[data-v-6eb58214]:hover{color:#ff4d4f}.divider[data-v-6eb58214]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-6eb58214]{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-6eb58214]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.selector-overlay[data-v-6eb58214]{backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.selector-modal[data-v-6eb58214]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;flex-direction:column;width:90vw;max-width:860px;max-height:85vh;display:flex;overflow:hidden;box-shadow:0 8px 40px #00000026}.modal-header[data-v-6eb58214]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;flex-shrink:0;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-title[data-v-6eb58214]{flex-direction:column;gap:2px;display:flex}.title-text[data-v-6eb58214]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.title-sub[data-v-6eb58214]{color:#999;font-size:11px}.modal-close[data-v-6eb58214]{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 .15s;display:flex}.modal-close[data-v-6eb58214]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.modal-close svg[data-v-6eb58214]{width:14px;height:14px}.header-actions[data-v-6eb58214]{align-items:center;gap:8px;display:flex}.view-toggle-btn[data-v-6eb58214]{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 .15s;display:flex}.view-toggle-btn[data-v-6eb58214]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.view-toggle-btn.active[data-v-6eb58214]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.modal-body[data-v-6eb58214]{flex-direction:column;flex:1;gap:20px;padding:20px;display:flex;overflow-y:auto}.search-box[data-v-6eb58214]{border:1px solid #e0e0e0;border-radius:8px;align-items:center;gap:10px;padding:10px 14px;transition:all .2s;display:flex}.search-box[data-v-6eb58214]:focus-within{background:#fff;border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a14}.search-icon[data-v-6eb58214]{color:#999;flex-shrink:0}.search-input[data-v-6eb58214]{color:#333;background:0 0;border:none;outline:none;flex:1;font-size:13px}.search-input[data-v-6eb58214]::placeholder{color:#aaa}.no-results[data-v-6eb58214]{color:#ccc;flex-direction:column;justify-content:center;align-items:center;gap:12px;padding:48px 20px;display:flex}.no-results svg[data-v-6eb58214]{opacity:.5}.no-results p[data-v-6eb58214]{color:#999;margin:0;font-size:14px;font-weight:500}.no-results-hint[data-v-6eb58214]{color:#bbb;font-size:12px}.indicator-section[data-v-6eb58214]{flex-direction:column;gap:12px;display:flex}.section-header[data-v-6eb58214]{align-items:center;gap:8px;display:flex}.section-title[data-v-6eb58214]{color:#1a1a1a;font-size:13px;font-weight:600}.section-count[data-v-6eb58214]{color:#999;background:#f0f0f0;border-radius:10px;padding:2px 8px;font-size:11px}.indicator-grid[data-v-6eb58214]{grid-template-columns:repeat(auto-fill,minmax(195px,1fr));gap:10px;display:grid}.indicator-grid.compact[data-v-6eb58214]{flex-wrap:wrap;gap:8px;display:flex}.indicator-grid.compact .indicator-card[data-v-6eb58214]{white-space:nowrap;border-radius:16px;justify-content:center;align-items:center;min-height:32px;padding:6px 14px;display:inline-flex;position:relative}.indicator-grid.compact .indicator-card .card-tooltip[data-v-6eb58214]{color:#fff;white-space:nowrap;pointer-events:none;opacity:0;z-index:10;background:#333;border-radius:6px;padding:4px 10px;font-size:12px;transition:opacity .15s;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}.indicator-grid.compact .indicator-card:hover .card-tooltip[data-v-6eb58214]{opacity:1}.indicator-grid.compact .indicator-card .card-label[data-v-6eb58214]{font-size:12px;font-weight:500}.indicator-card[data-v-6eb58214]{cursor:pointer;text-align:left;background:#fff;border:1px solid #e8e8e8;border-radius:8px;flex-direction:column;gap:4px;padding:12px 14px;transition:all .15s;display:flex}.indicator-card[data-v-6eb58214]:hover:not(.disabled){background:#fafafa;border-color:#1a1a1a;transform:translateY(-1px);box-shadow:0 2px 8px #0000000f}.indicator-card.active[data-v-6eb58214]{background:#f8f8f8;border-color:#1a1a1a}.card-header[data-v-6eb58214]{justify-content:space-between;align-items:center;gap:8px;display:flex}.card-label[data-v-6eb58214]{color:#1a1a1a;font-size:13px;font-weight:600}.card-header-actions[data-v-6eb58214]{align-items:center;gap:4px;display:flex}.card-settings-btn[data-v-6eb58214]{color:#bbb;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;width:20px;height:20px;padding:0;transition:all .15s;display:flex}.card-settings-btn[data-v-6eb58214]:hover{color:#555;background:#f0f0f0}.card-name[data-v-6eb58214]{color:#666;font-size:11px;line-height:1.4}.card-params[data-v-6eb58214]{color:#999;margin-top:2px;font-size:10px}.section-divider[data-v-6eb58214]{background:linear-gradient(90deg,#0000,#e0e0e0,#0000);height:1px;margin:4px 0}.modal-footer[data-v-6eb58214]{background:#f8f8f8;border-top:1px solid #e8e8e8;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-info[data-v-6eb58214]{color:#666;font-size:12px}.info-text[data-v-6eb58214]{color:#999}.btn[data-v-6eb58214]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 16px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.btn-confirm[data-v-6eb58214]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.btn-confirm[data-v-6eb58214]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.fade-enter-active[data-v-6eb58214],.fade-leave-active[data-v-6eb58214]{transition:opacity .2s}.fade-enter-from[data-v-6eb58214],.fade-leave-to[data-v-6eb58214]{opacity:0}.overlay-enter-active[data-v-6eb58214],.overlay-leave-active[data-v-6eb58214]{transition:opacity .2s}.overlay-enter-from[data-v-6eb58214],.overlay-leave-to[data-v-6eb58214]{opacity:0}.modal-enter-active[data-v-6eb58214]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-6eb58214]{transition:all .16s ease-in}.modal-enter-from[data-v-6eb58214]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-6eb58214]{opacity:0;transform:scale(.94)translateY(8px)}@media (width<=640px){.selector-modal[data-v-6eb58214]{width:95vw;max-height:90vh}.indicator-grid[data-v-6eb58214]{grid-template-columns:1fr}.modal-body[data-v-6eb58214]{padding:16px}}.kline-tooltip[data-v-93207d24]{z-index:10;color:#000000c7;pointer-events:none;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-93207d24]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-93207d24]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-93207d24]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-93207d24]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-93207d24]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-93207d24]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-93207d24]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-f56bc484]{z-index:10;color:#000000c7;pointer-events:none;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-f56bc484]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-f56bc484]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-f56bc484]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-f56bc484]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-f56bc484]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-f56bc484]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-f56bc484]{transform:translate(calc(-100% - 12px),12px)}}.left-toolbar[data-v-3e3ffb4f]{box-sizing:border-box;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-3e3ffb4f]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-3e3ffb4f]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-3e3ffb4f]{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-3e3ffb4f]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-3e3ffb4f]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-3e3ffb4f]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-3e3ffb4f]{width:16px;height:16px}.corner-indicator[data-v-3e3ffb4f]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-3e3ffb4f]: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-3e3ffb4f]:after,.left-toolbar__button.active .corner-indicator[data-v-3e3ffb4f]:after{opacity:.7}.corner-indicator.open[data-v-3e3ffb4f]:after{opacity:.8}.tool-dropdown[data-v-3e3ffb4f]{-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-3e3ffb4f]{position:relative}.dropdown-enter-active[data-v-3e3ffb4f],.dropdown-leave-active[data-v-3e3ffb4f]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-3e3ffb4f],.dropdown-leave-to[data-v-3e3ffb4f]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-3e3ffb4f]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-3e3ffb4f]{gap:3px}.left-toolbar__button[data-v-3e3ffb4f]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-3e3ffb4f]{width:16px}.corner-indicator[data-v-3e3ffb4f]{width:7px;height:7px}.corner-indicator[data-v-3e3ffb4f]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-3e3ffb4f]{height:36px}}.settings-overlay[data-v-3e3ffb4f]{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-3e3ffb4f]{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-3e3ffb4f]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-3e3ffb4f]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-3e3ffb4f]{align-items:center;gap:8px;display:flex}.settings-title[data-v-3e3ffb4f]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-3e3ffb4f]{color:#999;font-size:11px}.settings-close[data-v-3e3ffb4f]{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-3e3ffb4f]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-3e3ffb4f]{width:14px;height:14px}.settings-body[data-v-3e3ffb4f]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-3e3ffb4f]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-3e3ffb4f]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-3e3ffb4f]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-select[data-v-3e3ffb4f]{color:#333;cursor:pointer;background:#fff;border:1px solid #d0d0d0;border-radius:6px;outline:none;min-width:140px;padding:4px 8px;font-size:12px}.settings-select[data-v-3e3ffb4f]:hover{border-color:#9ca3af}.settings-select[data-v-3e3ffb4f]:focus{border-color:#6b7280;box-shadow:0 0 0 2px #6b728026}.settings-section-divider[data-v-3e3ffb4f]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-3e3ffb4f]:before,.settings-section-divider[data-v-3e3ffb4f]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-3e3ffb4f]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-3e3ffb4f]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-3e3ffb4f]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-3e3ffb4f]{gap:8px;display:flex}.settings-btn[data-v-3e3ffb4f]{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-3e3ffb4f]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-3e3ffb4f]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-3e3ffb4f]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-3e3ffb4f]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-3e3ffb4f]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-3e3ffb4f]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-3e3ffb4f]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-3e3ffb4f]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-b0cae9be]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);--chart-bg:#fff;--chart-bg-secondary:#f8f9fa;--chart-border:#e5e7eb;--chart-border-active:#3b82f6;--chart-text:#374151;--chart-text-secondary:#6b7280;width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-wrapper[data-theme=dark][data-v-b0cae9be]{--chart-bg:#1a1a2e;--chart-bg-secondary:#16162a;--chart-border:#2d2d44;--chart-border-active:#60a5fa;--chart-text:#e5e7eb;--chart-text-secondary:#9ca3af}.chart-stage[data-v-b0cae9be]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-b0cae9be]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-b0cae9be]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-b0cae9be]{border-top:1px solid var(--chart-border);opacity:1;box-sizing:border-box;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-b0cae9be]{border-top-color:var(--chart-border-active);border-top-width:2px;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-b0cae9be],.chart-stage.is-hovering-pane-separator[data-v-b0cae9be]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-b0cae9be]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-b0cae9be]{cursor:ns-resize}.chart-stage.is-dragging[data-v-b0cae9be]{cursor:grabbing}.chart-container[data-v-b0cae9be]{height:100%;min-height:inherit;scrollbar-width:none;-ms-overflow-style:none;border:1px solid var(--chart-border);box-sizing:border-box;background:var(--chart-bg);-webkit-touch-callout:none;user-select:none;touch-action:none;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-b0cae9be]::-webkit-scrollbar{display:none}.right-axis-host[data-v-b0cae9be]{height:100%;min-height:inherit;box-sizing:border-box;background:var(--chart-bg);border:1px solid var(--chart-border);-webkit-touch-callout:none;user-select:none;touch-action:none;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-b0cae9be]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-b0cae9be]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-b0cae9be]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-b0cae9be]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-b0cae9be]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-b0cae9be]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-b0cae9be]{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*/
|
package/package.json
CHANGED
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
|
|
75
75
|
<!-- 添加按钮 -->
|
|
76
76
|
<div class="indicator-item">
|
|
77
|
-
<button ref="addBtnRef" class="add-btn" @click="
|
|
77
|
+
<button ref="addBtnRef" class="add-btn" @click.stop="controller.toggleMenu()" title="添加指标">
|
|
78
78
|
<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
|
|
79
79
|
<path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" />
|
|
80
80
|
</svg>
|
|
@@ -86,14 +86,14 @@
|
|
|
86
86
|
<!-- 添加指标弹窗 -->
|
|
87
87
|
<Teleport :to="teleportTarget">
|
|
88
88
|
<Transition name="overlay">
|
|
89
|
-
<div v-if="
|
|
89
|
+
<div v-if="menuOpen" class="selector-overlay" @click="controller.closeMenu()">
|
|
90
90
|
<Transition name="modal">
|
|
91
|
-
<div v-if="
|
|
91
|
+
<div v-if="menuOpen" class="selector-modal" @click.stop>
|
|
92
92
|
<!-- 弹窗头部 -->
|
|
93
93
|
<div class="modal-header">
|
|
94
94
|
<div class="header-title">
|
|
95
95
|
<span class="title-text">添加指标</span>
|
|
96
|
-
<span class="title-sub">{{
|
|
96
|
+
<span class="title-sub">{{ catalogLen }} 个可用指标</span>
|
|
97
97
|
</div>
|
|
98
98
|
<div class="header-actions">
|
|
99
99
|
<button
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
/>
|
|
118
118
|
</svg>
|
|
119
119
|
</button>
|
|
120
|
-
<button class="modal-close" @click="
|
|
120
|
+
<button class="modal-close" @click="controller.closeMenu()" title="关闭">
|
|
121
121
|
<svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor">
|
|
122
122
|
<path
|
|
123
123
|
d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"
|
|
@@ -143,21 +143,21 @@
|
|
|
143
143
|
/>
|
|
144
144
|
</svg>
|
|
145
145
|
<input
|
|
146
|
-
|
|
146
|
+
:value="searchQuery" @input="controller.setSearchQuery(($event.target as HTMLInputElement).value)"
|
|
147
147
|
type="text"
|
|
148
148
|
class="search-input"
|
|
149
149
|
placeholder="搜索指标名称..."
|
|
150
150
|
/>
|
|
151
151
|
</div>
|
|
152
152
|
<!-- 主图指标区域 -->
|
|
153
|
-
<div v-if="
|
|
153
|
+
<div v-if="filteredMain.length > 0" class="indicator-section">
|
|
154
154
|
<div class="section-header">
|
|
155
155
|
<span class="section-title">主图指标</span>
|
|
156
|
-
<span class="section-count">{{
|
|
156
|
+
<span class="section-count">{{ filteredMain.length }}</span>
|
|
157
157
|
</div>
|
|
158
158
|
<div class="indicator-grid" :class="{ compact: isCompactView }">
|
|
159
159
|
<button
|
|
160
|
-
v-for="indicator in
|
|
160
|
+
v-for="indicator in filteredMain"
|
|
161
161
|
:key="indicator.id"
|
|
162
162
|
class="indicator-card"
|
|
163
163
|
:class="{ active: isActive(indicator.id), compact: isCompactView }"
|
|
@@ -197,7 +197,7 @@
|
|
|
197
197
|
|
|
198
198
|
<!-- 分隔线 -->
|
|
199
199
|
<div
|
|
200
|
-
v-if="
|
|
200
|
+
v-if="filteredMain.length > 0 && filteredSub.length > 0"
|
|
201
201
|
class="section-divider"
|
|
202
202
|
></div>
|
|
203
203
|
|
|
@@ -213,14 +213,14 @@
|
|
|
213
213
|
</div>
|
|
214
214
|
|
|
215
215
|
<!-- 副图指标区域 -->
|
|
216
|
-
<div v-if="
|
|
216
|
+
<div v-if="filteredSub.length > 0" class="indicator-section">
|
|
217
217
|
<div class="section-header">
|
|
218
218
|
<span class="section-title">副图指标</span>
|
|
219
|
-
<span class="section-count">{{
|
|
219
|
+
<span class="section-count">{{ filteredSub.length }}</span>
|
|
220
220
|
</div>
|
|
221
221
|
<div class="indicator-grid" :class="{ compact: isCompactView }">
|
|
222
222
|
<button
|
|
223
|
-
v-for="indicator in
|
|
223
|
+
v-for="indicator in filteredSub"
|
|
224
224
|
:key="indicator.id"
|
|
225
225
|
class="indicator-card"
|
|
226
226
|
:class="{ active: isActive(indicator.id), compact: isCompactView }"
|
|
@@ -264,7 +264,7 @@
|
|
|
264
264
|
<div class="footer-info">
|
|
265
265
|
<span class="info-text">已激活 {{ activeCount }} 个指标</span>
|
|
266
266
|
</div>
|
|
267
|
-
<button class="btn btn-confirm" @click="
|
|
267
|
+
<button class="btn btn-confirm" @click="controller.closeMenu()">确认</button>
|
|
268
268
|
</div>
|
|
269
269
|
</div>
|
|
270
270
|
</Transition>
|
|
@@ -291,13 +291,17 @@
|
|
|
291
291
|
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
|
292
292
|
import IndicatorParams from './IndicatorParams.vue'
|
|
293
293
|
import { useFullscreenTeleportTarget } from '../composables/useFullscreenTeleportTarget'
|
|
294
|
+
import { coreSignalToVueRef } from '../index'
|
|
294
295
|
import {
|
|
295
|
-
|
|
296
|
-
subIndicators,
|
|
296
|
+
allIndicators,
|
|
297
297
|
findIndicator,
|
|
298
298
|
isSubIndicatorId,
|
|
299
299
|
} from '@363045841yyt/klinechart-core/engine/renderers/Indicator/indicatorData'
|
|
300
300
|
import type { Indicator } from '@363045841yyt/klinechart-core/engine/renderers/Indicator/indicatorData'
|
|
301
|
+
import {
|
|
302
|
+
createIndicatorSelectorController,
|
|
303
|
+
type IndicatorDefinition,
|
|
304
|
+
} from '@363045841yyt/klinechart-core/controllers'
|
|
301
305
|
|
|
302
306
|
const props = defineProps<{
|
|
303
307
|
activeIndicators?: string[]
|
|
@@ -310,15 +314,51 @@ const emit = defineEmits<{
|
|
|
310
314
|
reorderSubIndicators: [orderedIndicatorIds: string[]]
|
|
311
315
|
}>()
|
|
312
316
|
|
|
317
|
+
// ── 将 Indicator[] 转换为 IndicatorDefinition[] ──
|
|
318
|
+
function toIndicatorDefinitions(source: typeof allIndicators): IndicatorDefinition[] {
|
|
319
|
+
return source.map((i) => ({
|
|
320
|
+
id: i.id,
|
|
321
|
+
label: i.label,
|
|
322
|
+
name: i.name,
|
|
323
|
+
description: i.description,
|
|
324
|
+
role: i.pane,
|
|
325
|
+
params: (i.params ?? []).map((p) => ({
|
|
326
|
+
key: p.key,
|
|
327
|
+
label: p.label,
|
|
328
|
+
type: p.type,
|
|
329
|
+
default: p.default ?? (p.type === 'number' ? 0 : ''),
|
|
330
|
+
min: p.min,
|
|
331
|
+
max: p.max,
|
|
332
|
+
step: p.step,
|
|
333
|
+
})),
|
|
334
|
+
}))
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// ── Controller ──
|
|
338
|
+
const controller = createIndicatorSelectorController({
|
|
339
|
+
catalog: toIndicatorDefinitions(allIndicators),
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
// ── 从 Controller Signal 桥接的 Vue 响应式状态 ──
|
|
343
|
+
const menuOpen = coreSignalToVueRef(controller.menuOpen)
|
|
344
|
+
const searchQuery = coreSignalToVueRef(controller.searchQuery)
|
|
345
|
+
const filteredMain = coreSignalToVueRef(controller.filteredMain)
|
|
346
|
+
const filteredSub = coreSignalToVueRef(controller.filteredSub)
|
|
347
|
+
|
|
348
|
+
const hasSearchResults = computed(
|
|
349
|
+
() => filteredMain.value.length > 0 || filteredSub.value.length > 0,
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
const catalogLen = controller.catalog.peek().length
|
|
353
|
+
|
|
354
|
+
// ── 本地 UI 状态(非 Controller 管理的纯 UI 状态) ──
|
|
313
355
|
const addBtnRef = ref<HTMLButtonElement | null>(null)
|
|
314
356
|
const paramsVisible = ref(false)
|
|
315
357
|
const currentIndicatorId = ref<string | null>(null)
|
|
316
358
|
const hoveredIndicator = ref<string | null>(null)
|
|
317
|
-
const showAddMenu = ref(false)
|
|
318
359
|
const dragOverIndicatorId = ref<string | null>(null)
|
|
319
360
|
const draggingIndicatorId = ref<string | null>(null)
|
|
320
361
|
const isCompactView = ref(false)
|
|
321
|
-
const searchQuery = ref('')
|
|
322
362
|
|
|
323
363
|
// Teleport target for fullscreen modal visibility
|
|
324
364
|
const teleportTarget = useFullscreenTeleportTarget()
|
|
@@ -346,39 +386,8 @@ const currentIndicator = computed(() => {
|
|
|
346
386
|
return findIndicator(currentIndicatorId.value)
|
|
347
387
|
})
|
|
348
388
|
|
|
349
|
-
const totalIndicatorsCount = computed(() => mainIndicators.length + subIndicators.length)
|
|
350
|
-
|
|
351
389
|
const activeCount = computed(() => props.activeIndicators?.length ?? 0)
|
|
352
390
|
|
|
353
|
-
// 过滤后的主图指标
|
|
354
|
-
const filteredMainIndicators = computed(() => {
|
|
355
|
-
if (!searchQuery.value.trim()) return mainIndicators
|
|
356
|
-
const query = searchQuery.value.toLowerCase().trim()
|
|
357
|
-
return mainIndicators.filter(
|
|
358
|
-
(i) =>
|
|
359
|
-
i.label.toLowerCase().includes(query) ||
|
|
360
|
-
i.name.toLowerCase().includes(query) ||
|
|
361
|
-
i.id.toLowerCase().includes(query),
|
|
362
|
-
)
|
|
363
|
-
})
|
|
364
|
-
|
|
365
|
-
// 过滤后的副图指标
|
|
366
|
-
const filteredSubIndicators = computed(() => {
|
|
367
|
-
if (!searchQuery.value.trim()) return subIndicators
|
|
368
|
-
const query = searchQuery.value.toLowerCase().trim()
|
|
369
|
-
return subIndicators.filter(
|
|
370
|
-
(i) =>
|
|
371
|
-
i.label.toLowerCase().includes(query) ||
|
|
372
|
-
i.name.toLowerCase().includes(query) ||
|
|
373
|
-
i.id.toLowerCase().includes(query),
|
|
374
|
-
)
|
|
375
|
-
})
|
|
376
|
-
|
|
377
|
-
// 是否有搜索结果
|
|
378
|
-
const hasSearchResults = computed(
|
|
379
|
-
() => filteredMainIndicators.value.length > 0 || filteredSubIndicators.value.length > 0,
|
|
380
|
-
)
|
|
381
|
-
|
|
382
391
|
function isActive(indicatorId: string): boolean {
|
|
383
392
|
return props.activeIndicators?.includes(indicatorId) ?? false
|
|
384
393
|
}
|
|
@@ -390,8 +399,9 @@ function addIndicator(indicatorId: string) {
|
|
|
390
399
|
if (!indicator) return
|
|
391
400
|
|
|
392
401
|
if (indicator.pane === 'main') {
|
|
393
|
-
|
|
394
|
-
|
|
402
|
+
const allItems = allIndicators
|
|
403
|
+
allItems
|
|
404
|
+
.filter((i) => i.id !== indicatorId && isActive(i.id) && i.pane === 'main')
|
|
395
405
|
.forEach((i) => emit('toggle', i.id, false))
|
|
396
406
|
}
|
|
397
407
|
|
|
@@ -407,10 +417,6 @@ function showParams(indicatorId: string) {
|
|
|
407
417
|
paramsVisible.value = true
|
|
408
418
|
}
|
|
409
419
|
|
|
410
|
-
function closeAddMenu() {
|
|
411
|
-
showAddMenu.value = false
|
|
412
|
-
}
|
|
413
|
-
|
|
414
420
|
function getParamValues(indicatorId: string): Record<string, number> {
|
|
415
421
|
const indicator = findIndicator(indicatorId)
|
|
416
422
|
if (!indicator?.params) return {}
|
|
@@ -510,13 +516,9 @@ function onDragEnd() {
|
|
|
510
516
|
draggingIndicatorId.value = null
|
|
511
517
|
}
|
|
512
518
|
|
|
513
|
-
function toggleAddMenu() {
|
|
514
|
-
showAddMenu.value = !showAddMenu.value
|
|
515
|
-
}
|
|
516
|
-
|
|
517
519
|
function handleKeydown(event: KeyboardEvent) {
|
|
518
|
-
if (event.key === 'Escape' &&
|
|
519
|
-
|
|
520
|
+
if (event.key === 'Escape' && controller.menuOpen.peek()) {
|
|
521
|
+
controller.closeMenu()
|
|
520
522
|
}
|
|
521
523
|
}
|
|
522
524
|
|