@iccandle/vuejs-widget 0.1.0 → 0.1.1
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/index.d.ts +2 -6
- package/dist/widget-iccandle.cjs +2 -2
- package/dist/widget-iccandle.js +468 -525
- package/package.json +1 -1
package/dist/widget-iccandle.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import { Fragment as e, Teleport as t, TransitionGroup as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createStaticVNode as c, createTextVNode as l, createVNode as u, defineComponent as d, inject as f, isRef as p, mergeModels as m, nextTick as h, normalizeClass as g, normalizeStyle as _, onBeforeUnmount as v, onMounted as y, onWatcherCleanup as b, openBlock as x, provide as S, reactive as C, ref as w, renderList as T, renderSlot as E, resolveDynamicComponent as D, shallowRef as O, toDisplayString as k, unref as A, useModel as j, vModelText as M, watch as N, withCtx as P, withDirectives as F, withModifiers as I } from "vue";
|
|
3
3
|
import L, { isAxiosError as R } from "axios";
|
|
4
4
|
//#region src/constants/app.constant.ts
|
|
5
|
-
var
|
|
6
|
-
function
|
|
7
|
-
let t =
|
|
8
|
-
t && (clearTimeout(t),
|
|
5
|
+
var z = "An unknown error occurred", B = "https://embed-iccandle-app.iccandle.ai", V = "tv:clicked-news-event", ee = "tv:selected-news-events", H = (e) => e === "1" ? 120 : e === "5" ? 480 : e === "1D" ? 20 * 3600 : parseInt(e, 10) * 60, U = (e) => e === "1" ? 60 : e === "5" ? 300 : e === "1D" ? 1440 * 3600 : parseInt(e, 10) * 60, W = 5e3, G = 1, K = /* @__PURE__ */ new Map(), q = w([]);
|
|
6
|
+
function J(e) {
|
|
7
|
+
let t = K.get(e);
|
|
8
|
+
t && (clearTimeout(t), K.delete(e)), q.value = q.value.filter((t) => t.id !== e);
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
let o =
|
|
10
|
+
function Y({ title: e, description: t, action: n, dismiss: r = { label: "Dismiss" }, variant: i = "info", duration: a = W }) {
|
|
11
|
+
let o = G++, s = {
|
|
12
12
|
id: o,
|
|
13
13
|
title: e,
|
|
14
14
|
description: t,
|
|
@@ -16,15 +16,15 @@ function G({ title: e, description: t, action: n, dismiss: r = { label: "Dismiss
|
|
|
16
16
|
dismiss: r,
|
|
17
17
|
variant: i
|
|
18
18
|
};
|
|
19
|
-
if (
|
|
20
|
-
let e = setTimeout(() =>
|
|
21
|
-
|
|
19
|
+
if (q.value = [...q.value, s], a > 0) {
|
|
20
|
+
let e = setTimeout(() => J(o), a);
|
|
21
|
+
K.set(o, e);
|
|
22
22
|
}
|
|
23
23
|
return o;
|
|
24
24
|
}
|
|
25
25
|
//#endregion
|
|
26
26
|
//#region src/constants/language.constant.ts
|
|
27
|
-
var
|
|
27
|
+
var X = [
|
|
28
28
|
"en",
|
|
29
29
|
"zh",
|
|
30
30
|
"vi",
|
|
@@ -34,12 +34,12 @@ var ae = [
|
|
|
34
34
|
"mn",
|
|
35
35
|
"ru"
|
|
36
36
|
];
|
|
37
|
-
function
|
|
38
|
-
return e &&
|
|
37
|
+
function te(e) {
|
|
38
|
+
return e && X.includes(e) ? e : "en";
|
|
39
39
|
}
|
|
40
40
|
//#endregion
|
|
41
41
|
//#region src/i18n/widget-messages.ts
|
|
42
|
-
var
|
|
42
|
+
var ne = {
|
|
43
43
|
en: {
|
|
44
44
|
Common: {
|
|
45
45
|
or: "OR",
|
|
@@ -7402,7 +7402,7 @@ var se = {
|
|
|
7402
7402
|
Legal: /* @__PURE__ */ JSON.parse("{\"Page\":{\"title\":{\"terms\":\"Условия обслуживания\",\"privacy\":\"Политика конфиденциальности\",\"refund\":\"Политика возврата средств и отмены\",\"cookie\":\"Политика использования файлов куки\"},\"tabs\":{\"terms\":\"Условия обслуживания\",\"privacy\":\"Политика конфиденциальности\",\"refund\":\"Политика возврата средств и отмены\",\"cookie\":\"Политика использования файлов куки\"},\"nav\":{\"terms\":\"Условия обслуживания\",\"privacy\":\"Политика конфиденциальности\",\"refund\":\"Политика возврата средств и отмены\",\"cookie\":\"Политика использования файлов куки\"}},\"Terms\":{\"title\":\"Условия обслуживания, TOS, условия, положения, отказ от ответственности, договор, соглашение\",\"intro\":{\"p1\":\"Настоящее соглашение заключается между Pixel Nexus Global, сингапурской компанией с ограниченной ответственностью, осуществляющей деятельность через сайт www.iccandle.ai («Pixel Nexus Global», «мы», «нас» или «наш»), и физическим или юридическим лицом, приобретающим или использующим услуги, предлагаемые через Платформу («Клиент», «вы» или «ваш»). Если вы приобретаете Услуги от имени третьей стороны, вы подтверждаете, что обладаете законными полномочиями обязать такую сторону соблюдать настоящие Условия обслуживания и несёте ответственность за их использование Услуг.\",\"p2\":\"Получая доступ к Платформе и Услугам, описанным в настоящем документе и размещённым на www.iccandle.ai, либо оформляя подписку через сайт iccandle.ai, вы подтверждаете, что прочитали, поняли и согласились с настоящими Условиями, Положениями и отказами от ответственности. Вы также соглашаетесь, что ваши отношения с нами регулируются положениями настоящих Условий обслуживания.\",\"p2Emphasis\":\"Если вы не принимаете данные условия, вы обязаны немедленно прекратить использование iccandle.ai и любых связанных услуг или платформ.\"},\"sections\":[{\"title\":\"1. Услуги\",\"paragraphs\":[\"Pixel Nexus Global will provide active customers in good standing with access to its AI-powered analytical tool (the “Platform”). As used in this Agreement, the term “Services” refers to Pixel Nexus Global’s provision of your access to the Platform. The Services will be provided to you under one or more subscriptions, account activations, sign-ups, or orders placed by you on the iccandle.ai website and accepted by Pixel Nexus Global (an “Order”).\",\"In case of any conflict between these TOS and an Order, the terms of these TOS shall take precedence. By accepting the Services, you acknowledge and agree that any different or additional terms proposed by you in an Order or otherwise are expressly rejected by Pixel Nexus Global, unless we have agreed to such terms in a written document signed by an authorized representative.\"]},{\"title\":\"2. Ваши обязательства\",\"subsections\":[{\"title\":\"Информация о клиенте и ответственность за аккаунт\",\"paragraphs\":[\"You agree to provide Pixel Nexus Global with accurate information when creating your account, throughout our business relationship, and in all correspondence with us. We may occasionally need to contact you via email or telephone regarding the Services. You agree to maintain a valid email address that you check daily and to promptly notify us of any changes to your contact information.\",\"Pixel Nexus Global shall not be responsible for any service interruptions, damages, or consequences resulting from misdirected communications due to your failure to provide current contact details. You also agree to complete all data entitlement surveys within the platform completely and truthfully to maintain compliance with exchange regulations.\"]},{\"title\":\"Разрешённое использование платформы\",\"paragraphs\":[\"Your use of the Platform must comply with these TOS and any accompanying documentation we provide. If you permit third parties to access the Platform, you agree to: (i) restrict their use in accordance with these terms; (ii) ensure their compliance with these TOS and our Privacy Policy; and (iii) remain fully liable for any violations of these TOS or the Privacy Policy by such third parties.\"]},{\"title\":\"Интеллектуальная собственность и соблюдение закона\",\"paragraphs\":[\"You agree not to alter, obscure, or remove any trademark or proprietary notices. You may only use the Platform in accordance with: (i) the laws governing these TOS; and (ii) all applicable laws in your jurisdiction.\",\"Несанкционированное использование строго запрещено.\"]}]},{\"title\":\"3. Срок действия\",\"subsections\":[{\"title\":\"Дата вступления в силу\",\"paragraphs\":[\"These Terms of Service (TOS) become effective (\\\"Effective Date\\\") on the earlier of: (i) the date you click \\\"I accept\\\" as recorded by our servers; or (ii) the date you first access or use the Platform.\",\"These TOS remain in effect for the duration of any active Order.\"]},{\"title\":\"Подписка и продление\",\"paragraphs\":[\"The Services will automatically renew for successive periods (monthly, quarterly, or annually) as specified in your Order. If unspecified, the default initial subscription period (\\\"Initial Term\\\") is one month. Subsequent renewal periods (\\\"Renewal Terms\\\") will match the Initial Term’s duration.\"]},{\"title\":\"Пробный период\",\"paragraphs\":[\"Pixel Nexus Global may offer trial periods (paid or free) as indicated on the iccandle.ai trial signup page. During any trial period:\"],\"listOrdered\":[\"применяются все условия как для платной подписки\",\"вы можете отменить подписку до автоматического продления\",\"условия могут изменяться без уведомления\"]},{\"title\":\"Управление подпиской\",\"paragraphs\":[\"You are solely responsible for managing your subscription, including:\"],\"listDisc\":[\"контроль дат продления\",\"обновление платёжных данных\",\"отмена подписки\",\"актуальность контактных данных\"],\"paragraphsAfter\":[\"Pixel Nexus Global is not responsible for any charges due to failure to manage your subscription.\"]}]},{\"title\":\"4. Прекращение\",\"subsections\":[{\"title\":\"Отмена и возвраты\",\"paragraphs\":[\"Details about cancellation and refund policies are available on our Refund and Cancellation Policy page at iccandle.ai. Terminating your account disables automatic renewals but does not cancel past invoices or make prior payments refundable unless stated otherwise in our Refund and Cancellation Policy.\",\"Any currently due invoices must be paid in full to settle your account. Your access to Pixel Nexus Global services will continue until the expiration of your prepaid period or trial term.\"]},{\"title\":\"Расторжение по инициативе сторон\",\"paragraphs\":[\"Either party may terminate any Order by providing written notice at least one (1) day before the expiration of the Initial Term or any Renewal Term. For purposes of this provision, “written notice” includes communication through email, live chat, telephone, or via the Online Portal, indicating a desire not to continue service with Pixel Nexus Global in the future.\"]},{\"title\":\"Нарушения\",\"paragraphs\":[\"Pixel Nexus Global reserve the right to immediately suspend Services and/or terminate any Order in cases of violation of these TOS, breach of our Privacy Policy, or use of Services in a manner contrary to law or generally accepted internet standards. Such termination may occur without prior notice, dispute resolution process, or refund of any fees.\"]},{\"title\":\"Последствия\",\"paragraphs\":[\"The expiration or termination of any Order does not affect any rights or obligations that either (i) came into effect upon or after such expiration/termination, or (ii) survive the termination and were incurred by the parties prior to termination. Upon termination, you must promptly settle any outstanding balance. Pixel Nexus Global is not obligated to return any paid fees for terminations occurring prior to completion of a full term, except as may be expressly provided in our Refund and Cancellation Policy.\",\"All termination matters are governed by the complete terms set forth in this agreement, and Pixel Nexus Global maintains full discretion in enforcing these provisions.\"]}]},{\"title\":\"5. Лицензия и ограничения\",\"paragraphs\":[\"Pixel Nexus Global grants you a limited, revocable, non-exclusive, non-transferable, worldwide license to utilize our proprietary technology (\\\"Pixel Nexus Technology\\\") solely for accessing and employing our analytical engines as part of the Services, including any generated reports (\\\"Reports\\\"). This license is restricted to your account's registered users and automatically terminates upon expiration or termination of these TOS.\",\"No rights beyond this limited license are conferred. All ownership rights in the Pixel Nexus Technology remain exclusively with Pixel Nexus Global or its licensors. You are expressly prohibited from: transferring, leasing, lending, sublicensing, reselling, or distributing the technology; using it for timesharing or service bureau purposes; or permitting unauthorized third-party access. You may not circumvent any protective measures safeguarding our proprietary interests, nor modify, reproduce, decompile, reverse engineer, or create derivative works from the Pixel Nexus Technology or Platform components. Upon termination, you must immediately cease using and permanently delete all Pixel Nexus Technology in your possession, ensuring any third parties with access do likewise.\"],\"subsections\":[{\"title\":\"Права собственности\",\"paragraphs\":[\"Pixel Nexus Global retains all rights, title, and interest in the Pixel Nexus Technology and Platform, including but not limited to all derivative works, improvements, enhancements, and associated intellectual property rights such as trademarks and copyrights.\"]},{\"title\":\"Положения об обратной связи\",\"paragraphs\":[\"You may voluntarily provide, or we may solicit, input regarding the Platform or Services (\\\"Feedback\\\"), including suggestions for modifications or improvements. You acknowledge such Feedback constitutes Pixel Nexus Global's confidential proprietary information and irrevocably assign all related rights and interests to us. Pixel Nexus Global may utilize Feedback for any purpose without limitation or compensation obligation. This assignment applies globally and survives termination of these TOS.\",\"All rights not expressly granted herein are reserved by Pixel Nexus Global. Any unauthorized use constitutes breach of these TOS and may result in immediate termination of your access rights.\"]}]},{\"title\":\"6. Использование данных и ИС\",\"paragraphs\":[\"Pixel Nexus Global may utilize information you provide or data collected from your use of the Platform and Services (\\\"Operational Information\\\") to deliver technical support and facilitate the implementation, operation, and administration of the Services. By using our Services, you grant us a perpetual, irrevocable license to process and analyze this Operational Information. We may combine this data with aggregate information from our general business operations to enhance existing Services or develop new products and offerings.\",\"Pixel Nexus Global shall retain exclusive ownership of all intellectual property derived from such analysis and improvements. You hereby irrevocably waive any potential rights to this intellectual property and assign all rights, title, and interest therein to Pixel Nexus Global. You further agree to provide reasonable cooperation in securing and protecting these rights. We reserve the right to commercialize this Operational Information through sale, monetization, or incorporation into other products and services, without obligation to compensate you or grant you any ownership interest.\",\"This license shall terminate upon expiration or cancellation of these Terms of Service, except with respect to historical data that has been aggregated and anonymized such that it cannot be identified as originating from your organization. Pixel Nexus Global may retain and continue to use such anonymized, aggregated data indefinitely for any lawful business purpose.\",\"All intellectual property rights not expressly granted herein remain the exclusive property of Pixel Nexus Global. Your continued use of the Services constitutes acceptance of these terms regarding data usage and intellectual property rights.\"]},{\"title\":\"7. Отказ от ответственности за точность информации\",\"paragraphs\":[\"Pixel Nexus Global relies on third-party data feeds to power its platform and therefore cannot guarantee the absolute accuracy of the information displayed. Different features within our system (such as scanners, automated analysis tools, charting functions, and back testing capabilities) may utilize separate data providers, which can result in variances between datasets across different platform features. Users should always verify analysis results and scanner conditions to ensure data consistency.\",\"The platform's analytical outputs are inherently dependent on the quality of underlying third-party data, and Pixel Nexus Global makes no representations or warranties regarding the accuracy of these analyses. The iccandle.ai website, Services, and Platform are designed solely for informational and research purposes - they should never serve as the sole basis for investment decisions. Pixel Nexus Global disclaims all liability for any financial losses resulting from reliance on potentially inaccurate data or analysis within the Platform.\",\"The Pixel Nexus Global system is provided strictly on an \\\"as-is\\\" basis without guarantees or warranties of any kind, as its functionality depends on unverified third- party data sources. The platform is intended exclusively for educational, entertainment, and general informational use - not as professional financial advice or a substitute for independent investment research. Users assume all risk associated with interpreting and acting upon any information displayed within the system.\",\"By accessing and using the Platform, you acknowledge these inherent limitations and agree that Pixel Nexus Global shall not be held responsible for any consequences arising from data inaccuracies, analysis errors, or investment decisions made based on platform content.\"]},{\"title\":\"8. Отказ от инвестиционных рекомендаций и ограничения платформы\",\"paragraphs\":[\"The analytical tools and outputs provided by Pixel Nexus Global's iccandle.ai platform are strictly for informational and research purposes only and should not be construed as investment advice. The platform relies on third-party data sources that may contain inaccuracies, and different features may produce varying results due to separate data providers. All analysis, including results from our Pattern Selector, Pattern Tracker, and News Impact Intelligence, is provided \\\"AS-IS\\\" without any guarantees of accuracy. These tools demonstrate historical patterns, probabilities, and market behavior under past conditions and cannot predict future results, as actual market outcomes may differ due to liquidity, execution, and other variables. You must never rely solely on platform analysis when making investment decisions.\"]},{\"title\":\"9. Признание рисков и ответственность пользователя\",\"paragraphs\":[\"By using Pixel Nexus Global's platform (iccandle.ai), you expressly acknowledge and accept full responsibility for all risks associated with any investment decisions made based on information or analysis obtained from our Platform. You understand that our services rely on third-party data sources that may contain inaccuracies, and that our analytical models employ mathematical formulas and sequences that have not been independently verified for predictive accuracy. Pixel Nexus Global cannot and does not guarantee the reliability of any market data, technical indicators, or analytical outputs generated by the Platform.\",\"Prior to executing any trades, you agree to either: (i) consult with a qualified, licensed financial professional; or (ii) conduct comprehensive independent research using multiple verified information sources.\",\"Pixel Nexus Global expressly disclaims all liability for any trading losses, missed opportunities, or other financial consequences resulting from your reliance on Platform content. By continuing to use iccandle.ai, you confirm your understanding that our tools are designed for informational purposes only and that you alone bear complete responsibility for all investment choices and outcomes. This warning constitutes an essential term of our agreement, and your use of the Platform signifies your unconditional acceptance of these risk disclosures.\"]},{\"title\":\"10. Отказ от гарантий и ограничения сервиса\",\"paragraphs\":[\"The Pixel Nexus Global platform (iccandle.ai), including all Services, scripts, reports, analytical engines, and related technology, is provided strictly on an \\\"AS-IS\\\" and \\\"AS- AVAILABLE\\\" basis. Pixel Nexus Global makes no representations or warranties of any kind, whether express or implied. This includes, but is not limited to, all implied warranties of non-infringement, merchantability, fitness for a particular purpose, accuracy, quality, or achievement of specific results. No warranties arise from any course of dealing, performance, or trade usage.\",\"Pixel Nexus Global does not guarantee that the Service will meet your requirements, operate without interruption, remain error-free, or be secure from viruses or other harmful components. Compatibility with all websites or browsers is not assured, and Pixel Nexus Global disclaims all liability for issues arising from browser incompatibility or third-party services, even if such services appear integrated with our Platform. Any data transmitted via our Services remains your sole responsibility, and Pixel Nexus Global expressly disclaims liability for such content. No warranties provided by third- party vendors to Pixel Nexus Global extend to you, and you are not a third-party beneficiary of such agreements.\"],\"subsections\":[{\"title\":\"Функции оповещений и бета-функции\",\"paragraphs\":[\"The Platform includes alert features (e.g., \\\"Dynamic Price Alerts\\\" and \\\"Multi-Factor Alerts\\\"), which are provided without warranty or guarantee of reliability. Technical delays or failures may occur due to cellular networks, email services, system errors, or other factors. You acknowledge that alerts may not function as intended and agree that Pixel Nexus Global bears no liability for trading losses resulting from reliance on these features, regardless of whether they were used correctly.\",\"Certain features labeled as 'Beta' are under active development and may exhibit unstable or unreliable performance, including inconsistent data or incorrect information due to software bugs or programming errors. These Beta features carry additional risks and should be used with extreme caution.\"]},{\"title\":\"Общие положения\",\"paragraphs\":[\"This warranty disclaimer applies to all oral or written information provided by Pixel Nexus Global, its employees, affiliates, or third-party vendors. You may not rely on any such statements or representations.\",\"Some jurisdictions may not permit the exclusion of certain warranties. If applicable to you, any warranty claim must be filed within ninety (90) days of the Service provision that gave rise to the claim. Failure to submit a claim within this period constitutes an irrevocable waiver of your right to pursue such claims thereafter.\",\"Third-party websites linked through the Pixel Nexus Global platform are not under our control, and we assume no responsibility for their content or functionality. Accessing these external sites is entirely at your own risk. Such links are provided for convenience only and do not constitute an endorsement or recommendation by Pixel Nexus Global.\",\"By using the Platform, you acknowledge and accept these limitations and disclaimers in full.\"]}]},{\"title\":\"11. Ограничение ответственности\",\"paragraphs\":[\"Pixel Nexus Global's total liability under this Agreement shall not exceed the aggregate fees actually paid by you to Pixel Nexus Global during the one (1) month period immediately preceding the event giving rise to such liability. For purposes of this limitation, \\\"Pixel Nexus Global\\\" includes its employees, agents, owners, directors, officers, affiliates, and any third-party service providers facilitating the Services.\",\"To the maximum extent permitted by law, you agree that under no circumstances - including negligence - shall Pixel Nexus Global or its licensors, agents, employees, officers, or third-party vendors be liable for any indirect, incidental, special, consequential, or punitive damages. This exclusion applies to, but is not limited to, damages for:\"],\"listOrdered\":[\"Упущенная прибыль или доход\",\"Прерывание бизнеса\",\"Потеря или повреждение данных\",\"Потеря сбережений\",\"Любые другие финансовые потери, понесённые вами, конечными пользователями или третьими лицами\"],\"paragraphsAfter\":[\"These limitations apply regardless of whether the action arises in contract, tort (including negligence), or any other legal theory, and shall remain in effect even if Pixel Nexus Global has been advised of the possibility of such damages. While some jurisdictions may not allow limitations on certain liabilities, you agree that, where such restrictions apply, Pixel Nexus Global's liability shall be limited to the maximum extent permitted by applicable law.\",\"This limitation of liability constitutes an essential basis of the bargain between you and Pixel Nexus Global and shall survive termination of this Agreement. By using the Services, you acknowledge that these limitations are reasonable and reflect the risk allocation between both parties.\"]},{\"title\":\"12. Уведомления\",\"paragraphs\":[\"All official notices will be sent to your account’s listed contact information. You are responsible for maintaining current and accurate contact details in our records at all times.\",\"For most inquiries, including technical support and billing matters, please visit our website at www.iccandle.ai for contact information and support options.\",\"However, any legal notices regarding these Terms of Service or other Pixel Nexus Global policies must be sent exclusively via postal mail to our designated address:\"],\"address\":{\"company\":\"Pixel Nexus Global PTE. LTD.\",\"lines\":[\"160 Robinson Road, #14-04\",\"Singapore Business Federation Center\",\"Singapore 068914\"]}},{\"title\":\"13. Форс-мажор\",\"paragraphs\":[\"Neither party shall be liable for any failure or delay in performance (except for payment obligations) due to events beyond their reasonable control, including, but not limited to, acts of God, natural disasters, war, civil unrest, epidemics, labor disputes, utility failures, telecommunication outages, supply chain disruptions, government actions, or other unforeseeable catastrophic events; provided that: (i) the affected party notifies the other in writing within ten (10) days of the event’s commencement; (ii) all payment obligations remain unaffected; (iii) the time for performance shall be extended day-for-day to match the duration of the disruption; and (iv) both parties use commercially reasonable efforts to mitigate the impact.\",\"It is understood that this clause does not permit termination of the Agreement solely due to force majeure conditions, nor does it extend the Agreement term beyond its original expiration date without mutual written agreement.\"]},{\"title\":\"14. Отказ от прав\",\"paragraphs\":[\"No failure or delay by Pixel Nexus Global in exercising any right under these Terms shall operate as a waiver of that right, nor shall any single or partial exercise of any right preclude the further or full exercise of that right or any other right under these Terms.\"]},{\"title\":\"15. Уступка\",\"paragraphs\":[\"Pixel Nexus Global may assign these Terms, or any rights hereunder, without your consent. You may not assign these Terms without our prior written approval. These Terms shall be binding upon, and inure to the benefit of, the parties' respective successors and permitted assigns.\"]},{\"title\":\"16. Разделимость\",\"paragraphs\":[\"If any provision of these Terms is held to be invalid or unenforceable by a court of competent jurisdiction, that provision shall be modified to the minimum extent necessary to make it valid and enforceable while preserving its original intent. All other provisions shall remain in full force and effect.\"]},{\"title\":\"17. Отсутствие агентских отношений\",\"paragraphs\":[\"Nothing in these Terms creates an agency, partnership, joint venture or employment relationship between the parties. Neither party has authority to bind the other or incur obligations on the other's behalf.\"]},{\"title\":\"18. Конфиденциальность и конфликты\",\"paragraphs\":[\"Our Privacy Policy is incorporated herein by reference. In the event of a conflict between agreements: (i) these Terms prevail over the Privacy Policy; (ii) any separate service agreement shall prevail over conflicting provisions of these Terms, but only with respect to those specific provisions; and (iii) in all other cases, these Terms shall govern.\"]},{\"title\":\"19. Юрисдикция и ограничения\",\"paragraphs\":[\"The services and information provided on iccandle.ai are not intended for use in jurisdictions where such services would be contrary to local laws or regulations. Access to and use of this website are strictly prohibited for citizens of the following jurisdictions: United States of America, Canada, Russian Federation, Iran, North Korea, Myanmar, Syria, Cuba, Crimea, Donetsk, and Luhansk regions of Ukraine, Afghanistan, Belarus, and Venezuela. This list may be updated at any time without prior notice. Users are solely responsible for ensuring that their access to and use of this website comply with all applicable laws and regulations in their country. iccandle.ai accepts no responsibility or liability for any non-compliance by users with their local regulatory requirements and reserves the right to restrict, block, or terminate access at its sole discretion.\"]}],\"content\":\"Условия обслуживания, TOS, условия, положения, отказ от ответственности, договор, соглашение\\nНастоящее соглашение заключается между Pixel Nexus Global, сингапурской компанией с ограниченной ответственностью, осуществляющей деятельность через сайт www.iccandle.ai («Pixel Nexus Global», «мы», «нас» или «наш»), и физическим или юридическим лицом, приобретающим или использующим услуги, предлагаемые через Платформу («Клиент», «вы» или «ваш»). Если вы приобретаете Услуги от имени третьей стороны, вы подтверждаете, что обладаете законными полномочиями обязать такую сторону соблюдать настоящие Условия обслуживания и несёте ответственность за их использование Услуг.\\n\\nУсловия обслуживания, TOS, условия, положения, отказ от ответственности, договор, соглашение Настоящее соглашение заключается между Pixel Nexus Global, сингапурской компанией с ограниченной ответственностью, осуществляющей деятельность через сайт www.iccandle.ai («Pixel Nexus Global», «мы», «нас» или «наш»), и физическим или юридическим лицом, приобретающим или использующим услуги, предлагаемые через Платформу («Клиент», «вы» или «ваш»). Если вы приобретаете Услуги от имени третьей стороны, вы подтверждаете, что обладаете законными полномочиями обязать такую сторону соблюдать настоящие Условия обслуживания и несёте ответственность за их использование Услуг.\\n\\nПолучая доступ к Платформе и Услугам, описанным в настоящем документе и размещённым на www.iccandle.ai, либо оформляя подписку через сайт iccandle.ai, вы подтверждаете, что прочитали, поняли и согласились с настоящими Условиями, Положениями и отказами от ответственности. Вы также соглашаетесь, что ваши отношения с нами регулируются положениями настоящих TOS.\\nЕсли вы не принимаете данные условия, вы обязаны немедленно прекратить использование iccandle.ai и любых связанных услуг или платформ.\\n\\n1. Услуги\\n\\nPixel Nexus Global предоставляет действующим клиентам, находящимся в надлежащем статусе, доступ к своему аналитическому инструменту на базе искусственного интеллекта («Платформа»).\\nВ рамках настоящего соглашения термин «Услуги» означает предоставление Pixel Nexus Global доступа к Платформе.\\nУслуги предоставляются в рамках одной или нескольких подписок, активаций аккаунта, регистраций или заказов, оформленных вами на сайте iccandle.ai и принятых Pixel Nexus Global («Заказ»).\\n\\nPixel Nexus Global предоставляет действующим клиентам, находящимся в надлежащем статусе, доступ к своему аналитическому инструменту на базе искусственного интеллекта («Платформа»). В рамках настоящего соглашения термин «Услуги» означает предоставление Pixel Nexus Global доступа к Платформе. Услуги предоставляются в рамках одной или нескольких подписок, активаций аккаунта, регистраций или заказов, оформленных вами на сайте iccandle.ai и принятых Pixel Nexus Global («Заказ»).\\n\\nВ случае противоречий между настоящими TOS и Заказом, приоритет имеют положения настоящих TOS.\\nПринимая Услуги, вы соглашаетесь, что любые иные или дополнительные условия, предложенные вами в Заказе или иным образом, прямо отклоняются Pixel Nexus Global, если только мы не согласовали их в письменной форме, подписанной уполномоченным представителем.\\n\\n2. Ваши обязательства\\nИнформация о клиенте и ответственность за аккаунт\\n\\nВы соглашаетесь предоставлять Pixel Nexus Global точную информацию при создании аккаунта, в течение всего периода взаимодействия и во всей переписке. Мы можем периодически связываться с вами по электронной почте или телефону. Вы обязуетесь поддерживать действующий e-mail, проверяемый ежедневно, и своевременно сообщать об изменениях контактных данных.\\n\\nВы соглашаетесь предоставлять Pixel Nexus Global точную информацию при создании аккаунта, в течение всего периода взаимодействия и во всей переписке.\\nМы можем периодически связываться с вами по электронной почте или телефону.\\nВы обязуетесь поддерживать действующий e-mail, проверяемый ежедневно, и своевременно сообщать об изменениях контактных данных.\\n\\nPixel Nexus Global не несёт ответственности за перебои в обслуживании, ущерб или последствия, вызванные некорректной доставкой сообщений из-за устаревших контактных данных. Вы также соглашаетесь полностью и добросовестно заполнять все анкеты на платформе для соблюдения требований регуляторов бирж.\\n\\nРазрешённое использование платформы\\nРазрешённое использование платформы\\n\\nИспользование Платформы должно соответствовать настоящим TOS и сопутствующей документации.\\nЕсли вы предоставляете доступ третьим лицам, вы обязуетесь: (i) ограничивать их использование в соответствии с условиями; (ii) обеспечивать соблюдение ими TOS и Политики конфиденциальности; (iii) нести полную ответственность за любые их нарушения.\\n\\nИспользование Платформы должно соответствовать настоящим TOS и сопутствующей документации.\\nЕсли вы предоставляете доступ третьим лицам,\\nвы обязуетесь: (i) ограничивать их использование в соответствии с условиями;\\n(ii) обеспечивать соблюдение ими TOS и Политики конфиденциальности;\\n(iii) нести полную ответственность за любые их нарушения.\\n\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\n\\nВы не имеете права изменять или удалять уведомления о товарных знаках и собственности. Использование Платформы допускается только в рамках:\\n(i) законодательства, регулирующего настоящие TOS;\\n(ii) всех применимых законов вашей юрисдикции.\\n\\nНесанкционированное использование строго запрещено.\\n\\nНесанкционированное испол\\nьзование строго запрещено.\\n\\n3. Срок действия\\nДата вступления в силу\\n\\nНастоящие Условия вступают в силу («Дата вступления в силу») с момента: (i) нажатия «Я принимаю» (фиксируется сервером),\\nили (ii) первого доступа или использования Платформы.\\n\\nУсловия действуют на протяжении любого активного Заказа.\\n\\nУсловия действуют на протяже\\nнии любого активного Заказа.\\n\\nПодписка и продление\\n\\nУслуги автоматически продлеваются (ежемесячно, ежеквартально или ежегодно) согласно Заказу.\\nПо умолчанию срок подписки — 1 месяц.\\n\\nПробный период\\nПробный период\\n\\nПробный период\\n\\nPixel Nexus Global может предоставлять пробные периоды (платные или бесплатные).\\nВ течение пробного периода:\\n\\nприменяются все условия как для платной подписки; вы можете отменить подписку до автоматического продления; условия могут изменяться без уведомления. Управление подпиской\\n\\nВы самостоятельно отвечаете за:\\n\\nВы самостоятельно отвечаете за:\\n\\nконтроль дат продления; обновление платёжных данных;\\nотмену подписки; актуальность контактных данных.\\n\\nPixel Nexus Global не несёт ответственности за списания из-за вашего несоблюдения этих обязанностей.\\n\\n4. Прекращение Отмена и возвраты\\n\\n4. Прекращение Отмена и возвраты\\n\\nИнформация о возвратах размещена на странице Refund and Cancellation Policy на iccandle.ai.\\nОтмена аккаунта отключает автопродление, но не аннулирует уже выставленные счета.\\n\\nРасторжение по инициативе сторон\\nРасторжение по инициативе сторон\\n\\nЛюбая сторона может расторгнуть Заказ, уведомив другую сторону минимум за 1 день до окончания срока.\\n\\nЛюбая сторона может расторгнуть Заказ, уведомив другую сторону минимум за 1 день до окончания срока.\\n\\nНарушения\\nНарушения\\n\\nPixel Nexus Global может немедленно приостановить или прекратить доступ без уведомления и возврата средств при нарушении условий или законодательства.\\n\\nПоследствия\\nПоследствия\\n\\nПоследствия\\n\\nОбязательства, возникшие до прекращения, сохраняются. Все задолженности должны быть оплачены.\\nВозврат средств не гарантируется.\\n\\n5. Лицензия и ограничения\\n\\nPixel Nexus Global предоставляет ограниченную, отзывную, неисключительную и непередаваемую лицензию на использование технологии («Pixel Nexus Technology») исключительно для доступа к аналитическим инструментам.\\n\\nPixel Nexus Global предоставляет ограниченную, отзывную, неисключительную и непередаваемую лицензию на использование технологии («Pixel Nexus Technology») исключительно для доступа к аналитическим инструментам.\\n\\nЗапрещено:\\nЗапрещено:\\n\\nпередача, продажа, аренда, сублицензирование; обратная разработка, декомпиляция; обход защитных механизмов; предоставление доступа третьим лицам.\\n\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\n\\nВсе права принадлежат Pixel Nexus Global.\\n\\n6.\\nИспользование данных и ИС\\n\\nКомпания может использовать данные пользователя («Operational Information») для поддержки и улучшения услуг. Вы предоставляете бессрочную лицензию на обработку данных.\\n\\nPixel Nexus Global сохраняет исключительные права на результаты анализа и может коммерциализировать их без компенсации пользователю.\\n\\nPixel Nexus Global сохраняет исключительные права на результаты ан\\nализа и может коммерциализировать их без компенсации пользователю.\\n\\n7–9. Отказ от ответственности и риски\\n\\nПлатформа использует сторонние данные и предоставляется «как есть». Информация может быть неточной и не является инвестиционной рекомендацией. Пользователь полностью принимает риски финансовых потерь и обязан проводить самостоятельный анализ.\\n\\n10.\\nОтсутствие гарантий\\n\\n10. Отсутствие гарантий\\n\\nНет гарантий работоспособности, точности, отсутствия ошибок или бесперебойности.\\nБета-функции могут быть нестабильными.\\n\\n11.\\nОграничение ответственности\\n\\nМаксимальная ответственность ограничивается суммой, уплаченной за последний месяц.\\nКомпания не несёт ответственности за косвенные или случайные убытки.\\n\\nМаксимальная ответственность ограничивается суммой, уплаченной за последний месяц.\\nКомпания не несёт ответственности за косвенные или случайные убытки.\\n\\n12–19.\\nПрочие условия\\n\\nВключают уведомления, форс-мажор, отказ от прав, уступку прав,\\nразделимость положений, отсутствие агентских отношений, приоритет документов, юрисдикционные ограничения и запреты на использование в определённых странах.\"},\"Refund\":{\"title\":\"Политика возврата и отмены\",\"intro\":\"Настоящая Политика возврата и отмены («Политика») регулирует условия возврата и отмены услуг, предоставляемых компанией Pixel Nexus Global Pte. Ltd. («мы», «нас») через платформу iccandle.ai («Сервис»). Данная Политика является частью Условий обслуживания и должна рассматриваться совместно с ними.\",\"sections\":[{\"title\":\"1. Определения\",\"definitions\":[{\"term\":\"Подписка\",\"text\":\"A recurring paid access to the Services for a specified period (e.g., monthly or annually).\"},{\"term\":\"Биллинг-период\",\"text\":\"The recurring time interval for which a Subscription fee is charged.\"},{\"term\":\"Изменение подписки\",\"text\":\"Any upgrade or downgrade to a different Subscription plan.\"}]},{\"title\":\"2. Условия отмены\",\"subsections\":[{\"title\":\"Отмена подписки\",\"listDisc\":[\"You may cancel your Subscription at any time through your account dashboard or by contacting support.\",\"Cancellation will take effect at the end of the current billing period; you will retain access to the Services through the end of that period.\",\"Cancelling your Subscription does not automatically entitle you to a refund of fees already paid.\"]}]},{\"title\":\"3. Условия возврата\",\"subsections\":[{\"title\":\"3.1 Общие положения\",\"paragraphs\":[\"Except as expressly provided in this Policy or required by applicable law, all fees paid for Subscriptions are non‑refundable once charged.\"]},{\"title\":\"3.2 Случаи возможного возврата\",\"paragraphs\":[\"We may issue a refund at our sole discretion only in limited circumstances, including but not limited to:\"],\"listDisc\":[\"Duplicate payments (verified duplicate charges will be refunded).\",\"Technical errors that demonstrably prevented access to Services, where the error was not caused by user actions and is verified by us.\",\"Applicable statutory rights under consumer protection law where these rights apply and cannot be waived.\"],\"paragraphsAfter\":[\"Refunds, if approved, will be processed to the original payment method within a commercially reasonable timeframe determined by payment processors and banking partners.\"]},{\"title\":\"3.3 Отсутствие возврата за частичное использование\",\"paragraphs\":[\"Refunds will not be issued for:\"],\"listDisc\":[\"Partial use of the Services during a billing period.\",\"Downgrades of Subscription plans.\",\"Change of mind or business decisions after payment.\",\"Subscription cancellations submitted after a billing cycle has renewed.\"]}]},{\"title\":\"4. Изменение подписки\",\"paragraphs\":[\"We provide two options when changing your Subscription plan:\"],\"subsections\":[{\"title\":\"4.1 Немедленное изменение\",\"paragraphs\":[\"If you select \\\"Change Now,\\\" your new plan will take effect immediately, and the associated charge will be applied.\",\"Please note that no refunds, credits, or prorated adjustments will be provided for any unused portion of your current plan.\"]},{\"title\":\"4.2 Изменение со следующего периода\",\"paragraphs\":[\"If you choose \\\"Change on Next Billing,\\\" your current plan will remain active until the end of the current Billing Period.\",\"The new plan will take effect at the start of the next Billing Period.\",\"No refunds or credits apply to the current Billing Period.\"]}]},{\"title\":\"5. Отмена после продления\",\"paragraphs\":[\"If an automatic renewal has already occurred before you submit a cancellation request: The renewal fee is non-refundable. The cancellation will apply to the next Billing Period.\"]},{\"title\":\"6. Чарджбэки и споры\",\"paragraphs\":[\"We maintain a strict no-tolerance policy toward unjustified chargebacks.\",\"Initiating a chargeback or payment dispute without first contacting us to seek resolution is considered a breach of this Refund and Cancellation Policy and our Terms of Service. Such actions may result in immediate suspension or permanent termination of your account, without notice, and forfeiture of access to the Services.\",\"We reserve the right to challenge and dispute any chargeback that we deem unauthorized, abusive, or inconsistent with this Policy. This includes providing payment processors, banks, and financial institutions with all relevant evidence, including but not limited to:\"],\"listDisc\":[\"Подтверждение оказания услуг и журналы доступа\",\"Записи активности аккаунта\",\"Принятие наших Условий обслуживания и политик\",\"История переписки с клиентом\"],\"paragraphsAfter\":[\"Customers are strongly encouraged to contact our support team first to resolve any billing concerns. We are committed to addressing legitimate issues in good faith; however, chargebacks used as a substitute for cancellation or refund requests will not be tolerated.\"]},{\"title\":\"7. Изменение Политики\",\"paragraphs\":[\"We may update this Policy from time to time. Material changes will be posted on our website or communicated via email prior to taking effect. Continued use of the Services after such updates constitutes acceptance of the revised Policy.\"]},{\"title\":\"8. Контакты\",\"paragraphs\":[\"For all cancellation and refund requests, please contact our support team via our help center.\"]}],\"content\":\"Политика возврата и отмены\\n\\nНастоящая Политика возврата и отмены («Политика») регулирует условия возврата и отмены услуг, предоставляемых компанией Pixel Nexus Global Pte. Ltd. («мы», «нас») через платформу iccandle.ai («Сервис»). Данная Политика является частью Условий обслуживания и должна рассматриваться совместно с ними.\\n\\n1. Определения\\n\\nПодписка (Subscription): платный доступ к Сервису на определённый период (ежемесячно или ежегодно).\\n\\nБиллинг-период (Billing Period): повторяющийся интервал списания оплаты.\\n\\nИзменение подписки (Subscription Change): переход на другой тариф (повышение или понижение).\\n\\n2. Условия отмены\\nОтмена подписки\\nПодписку можно отменить в любое время через личный кабинет или поддержку\\nОтмена вступает в силу в конце текущего биллингового периода\\nДоступ к сервису сохраняется до конца оплаченного периода\\nУже оплаченные средства не подлежат автоматическому возврату\\n3. Условия возврата\\n3.1 Общие положения\\n\\nЕсли иное не предусмотрено настоящей Политикой или законом, все оплаченные суммы не подлежат возврату после списания.\\n\\n3.2 Случаи возможного возврата\\n\\nВозврат может быть произведён по нашему усмотрению в ограниченных случаях:\\n\\nДвойное списание (подтверждённое)\\nТехническая ошибка, полностью препятствующая доступу к сервису (не по вине пользователя)\\nПрава, предусмотренные законодательством о защите прав потребителей\\n\\nОдобренные возвраты обрабатываются через исходный платёжный метод в разумные сроки.\\n\\n3.3 Отсутствие возврата за частичное использование\\n\\nВозврат не предоставляется за:\\n\\nЧастичное использование периода\\nПонижение тарифа\\nИзменение решения после оплаты\\nОтмену после автоматического продления\\n4. Изменение подписки\\n4.1 Немедленное изменение\\n\\nНовый тариф вступает в силу сразу, соответствующая сумма списывается немедленно. Возвраты за неиспользованный период не предоставляются.\\n\\n4.2 Изменение со следующего периода\\n\\nТекущий тариф действует до конца периода, новый тариф вступает в силу со следующего биллинга.\\n\\n5. Отмена после продления\\n\\nЕсли подписка уже была автоматически продлена, возврат за текущий период не предоставляется, отмена применяется со следующего периода.\\n\\n6. Чарджбэки и споры\\n\\nМы не допускаем необоснованные чарджбэки.\\n\\nИнициирование спора без предварительного обращения в поддержку считается нарушением Политики и может привести к блокировке или удалению аккаунта.\\n\\n7. Изменение Политики\\n\\nМы можем периодически обновлять Политику. Существенные изменения будут заранее опубликованы или отправлены по электронной почте.\\n\\n8. Контакты\\n\\nВсе запросы на возврат и отмену направляйте через службу поддержки.\"},\"Privacy\":{\"title\":\"Политика конфиденциальности\",\"intro\":\"Настоящая Политика конфиденциальности объясняет, как Pixel Nexus Global Pte. Ltd. («мы», «нас») собирает, использует, раскрывает и защищает персональные данные при использовании веб-сайта, приложений и сервисов (далее — «Сервисы»).\",\"sections\":[{\"title\":\"1. Собираемая информация\",\"paragraphs\":[\"We collect the following information:\"],\"listDisc\":[\"Адрес электронной почты, предоставленный при регистрации\",\"Service usage information, including interactions with features, pages viewed, session activity, and general usage patterns, collected to improve the functionality, performance, and user experience of our Services\"],\"paragraphsAfter\":[\"Мы не собираем, не храним и не обрабатываем данные банковских карт или другую чувствительную платёжную информацию.\"]},{\"title\":\"2. Платежи и Stripe\",\"paragraphs\":[\"All payment transactions are processed by our third-party payment service provider, Stripe.\",\"When you make a payment, Stripe collects and processes payment-related information (such as card details, billing information, and transaction data) directly. This information is handled in accordance with Stripe’s Privacy Policy and security standards, including PCI-DSS compliance.\",\"We only receive limited information from Stripe necessary to operate our Services, including:\"],\"listDisc\":[\"подтверждение платежа\",\"статус подписки\",\"идентификаторы транзакций\"],\"paragraphsAfter\":[\"Мы не имеем доступа к полным платёжным данным.\",\"You can review Stripe’s Privacy Policy here:\"],\"stripePrivacyUrl\":\"https://stripe.com/privacy\"},{\"title\":\"3. Использование информации\",\"paragraphs\":[\"We use the email addresses we collect to:\"],\"listDisc\":[\"Provide, operate, and maintain our Services\",\"Analyze service usage and improve product functionality, performance, and user experience\",\"Communicate with you regarding technical notices, updates, and support\",\"Inform you about products, services, features, and events\"]},{\"title\":\"4. Передача данных\",\"paragraphs\":[\"We do not sell your personal information.\",\"We may share your information only with:\"],\"listDisc\":[\"Service providers who support our operations (including hosting, analytics, and payment processing via Stripe)\",\"Professional advisors, such as legal, accounting, or compliance consultants\",\"Law enforcement or regulatory authorities, when required by law or to protect our legal rights\"],\"paragraphsAfter\":[\"All third-party service providers are required to process personal data in accordance with applicable data protection laws.\"]},{\"title\":\"5. Ваши права\",\"paragraphs\":[\"Depending on your location, you may have the right to:\"],\"listDisc\":[\"получить доступ к данным\",\"исправить email\",\"удалить данные\",\"ограничить или возразить против обработки\"],\"paragraphsAfter\":[\"Requests related to payment data should be directed to Stripe, as they act as the data controller for payment information.\"]},{\"title\":\"6. Сторонние сервисы\",\"paragraphs\":[\"Our Services rely on third-party providers such as Stripe. Their handling of personal data is governed by their own privacy policies, and we encourage you to review them.\"]},{\"title\":\"7. Контакты\",\"paragraphs\":[\"If you have any questions about this Privacy Policy or our data practices, please contact us at:\",\"support@iccandle.ai\"]}],\"content\":\"Политика конфиденциальности\\n\\nНастоящая Политика конфиденциальности объясняет, как Pixel Nexus Global Pte. Ltd. («мы», «нас») собирает, использует, раскрывает и защищает персональные данные при использовании веб-сайта, приложений и сервисов (далее — «Сервисы»).\\n\\n1. Собираемая информация\\n\\nМы собираем следующие данные:\\n\\nАдрес электронной почты, предоставленный при регистрации\\nДанные об использовании сервиса (взаимодействие с функциями, просмотренные страницы, сессии и модели использования)\\n\\nЭти данные используются для улучшения функциональности, производительности и пользовательского опыта.\\n\\nМы не собираем, не храним и не обрабатываем данные банковских карт или другую чувствительную платёжную информацию.\\n\\n2. Платежи и Stripe\\n\\nВсе платежи обрабатываются сторонним провайдером Stripe.\\n\\nПри оплате Stripe напрямую собирает и обрабатывает платёжные данные (данные карты, биллинг-информация и транзакции) в соответствии со своей политикой конфиденциальности и стандартом PCI-DSS.\\n\\nМы получаем от Stripe только ограниченную информацию:\\n\\nподтверждение платежа\\nстатус подписки\\nидентификаторы транзакций\\n\\nМы не имеем доступа к полным платёжным данным.\\n\\nПолитика конфиденциальности Stripe: https://stripe.com/privacy\\n\\n3. Использование информации\\n\\nМы используем email для:\\n\\nпредоставления и поддержки сервиса\\nанализа и улучшения продукта\\nтехнических уведомлений и поддержки\\nинформирования о функциях и обновлениях\\n4. Передача данных\\n\\nМы не продаём персональные данные.\\n\\nМы можем передавать данные только:\\n\\nпоставщикам услуг (хостинг, аналитика, Stripe)\\nюридическим, бухгалтерским и комплаенс-консультантам\\nгосударственным органам при необходимости по закону\\n\\nВсе третьи стороны обязаны соблюдать законы о защите данных.\\n\\n5. Ваши права\\n\\nВ зависимости от юрисдикции вы можете иметь право:\\n\\nполучить доступ к данным\\nисправить email\\nудалить данные\\nограничить или возразить против обработки\\n\\nЗапросы по платёжным данным следует направлять напрямую в Stripe.\\n\\n6. Сторонние сервисы\\n\\nНаши сервисы используют сторонние платформы (например, Stripe), которые обрабатывают данные по своим политикам.\\n\\n7. Контакты\\n\\nsupport@iccandle.ai\"},\"Cookie\":{\"title\":\"Политика использования файлов куки\",\"intro\":[\"This Cookie Policy explains how Pixel Nexus Global Pte. Ltd. (\\\"we\\\", \\\"us\\\", or \\\"our\\\") uses cookies and similar technologies when you visit or use iccandle.ai and related services (collectively, the \\\"Services\\\").\",\"Эта Политика должна рассматриваться совместно с Политикой конфиденциальности.\"],\"sections\":[{\"title\":\"1. Что такое куки\",\"paragraphs\":[\"Cookies — это небольшие текстовые файлы, которые сохраняются на вашем устройстве при посещении веб-сайта. Они используются для:\",\"обеспечения работы сайта\"],\"listDisc\":[\"Сессионные куки (удаляются при закрытии браузера)\",\"Постоянные куки (хранятся определённый срок или до удаления).\"]},{\"title\":\"2. Типы используемых куки\",\"subsections\":[{\"title\":\"2.1 Строго необходимые куки\",\"paragraphs\":[\"Постоянные cookies (хранятся определённый срок или до удаления)\"],\"listDisc\":[\"безопасный вход и аутентификация\",\"поддержание пользовательских сессий\",\"защита от мошенничества и злоупотреблений\"],\"paragraphsAfter\":[\"Без этих куки сервис не может работать должным образом.\"]},{\"title\":\"2.2 Функциональные куки\",\"paragraphs\":[\"защита от мошенничества и злоупотреблений\"],\"listDisc\":[\"язык и регион\",\"настройки аккаунта\"],\"paragraphsAfter\":[\"Они улучшают удобство, но не являются строго необходимыми.\"]},{\"title\":\"2.3 Аналитические и производительные куки\",\"paragraphs\":[\"2.3 Аналитические и производительные cookies\"],\"listDisc\":[\"посещённые страницы\",\"продолжительность сессий\",\"данные об ошибках и производительности\"],\"paragraphsAfter\":[\"данные об ошибках и производительности\"]},{\"title\":\"2.4 Сторонние куки\",\"paragraphs\":[\"2.4 Сторонние cookies\"],\"listDisc\":[\"Некоторые cookies устанавливаются сторонними поставщиками:\",\"платёжные системы (например, Stripe)\"],\"paragraphsAfter\":[\"аналитические и инфраструктурные провайдеры\"]}]},{\"title\":\"3. Для чего мы НЕ используем куки\",\"listDisc\":[\"реклама и поведенческий таргетинг\",\"продажа cookie-данных\",\"сбор чувствительной персональной информации\"]},{\"title\":\"4. Управление куки\",\"paragraphs\":[\"4. Управление cookies\"],\"listDisc\":[\"просмотр куки\",\"удаление куки\",\"блокировка куки\"],\"paragraphsAfter\":[\"Отключение некоторых куки может повлиять на работу сервиса.\"]},{\"title\":\"5. Изменения политики\",\"paragraphs\":[\"5. Изменения политики\"]},{\"title\":\"6. Контакты\",\"paragraphs\":[\"6. Контакты\",\"support@iccandle.ai\"]}],\"content\":\"Политика использования файлов cookie\\n\\nНастоящая Политика использования файлов cookie объясняет, как Pixel Nexus Global Pte. Ltd. («мы», «нас») использует файлы cookie и аналогичные технологии при посещении или использовании iccandle.ai и связанных сервисов (далее — «Сервисы»).\\n\\nЭта Политика должна рассматриваться совместно с Политикой конфиденциальности.\\n\\n1. Что такое cookies\\n\\nCookies — это небольшие текстовые файлы, которые сохраняются на вашем устройстве при посещении веб-сайта. Они используются для:\\n\\nобеспечения работы сайта\\nулучшения пользовательского опыта\\nпредоставления информации владельцам сайта\\n\\nCookies бывают:\\n\\nСессионные cookies (удаляются при закрытии браузера)\\nПостоянные cookies (хранятся определённый срок или до удаления)\\n2. Типы используемых cookies\\n2.1 Строго необходимые cookies\\n\\nЭти cookies необходимы для работы сервиса и не могут быть отключены.\\n\\nбезопасный вход и аутентификация\\nподдержание пользовательских сессий\\nзащита от мошенничества и злоупотреблений\\n2.2 Функциональные cookies\\n\\nИспользуются для запоминания ваших настроек:\\n\\nязык и регион\\nнастройки аккаунта\\n2.3 Аналитические и производительные cookies\\n\\nИспользуются для анализа того, как пользователи взаимодействуют с сервисом:\\n\\nпосещённые страницы\\nпродолжительность сессий\\nданные об ошибках и производительности\\n\\nЭти данные используются только для улучшения сервиса и не идентифицируют пользователей напрямую.\\n\\n2.4 Сторонние cookies\\n\\nНекоторые cookies устанавливаются сторонними поставщиками:\\n\\nплатёжные системы (например, Stripe)\\nаналитические и инфраструктурные провайдеры\\n\\nЭти третьи стороны используют cookies в соответствии со своими политиками.\\n\\n3. Для чего мы НЕ используем cookies\\nреклама и поведенческий таргетинг\\nпродажа cookie-данных\\nсбор чувствительной персональной информации\\n4. Управление cookies\\n\\nВы можете управлять cookies через настройки браузера:\\n\\nпросмотр cookies\\nудаление cookies\\nблокировка cookies\\n\\nОтключение некоторых cookies может повлиять на работу сервиса.\\n\\n5. Изменения политики\\n\\nМы можем обновлять эту Политику. Существенные изменения будут опубликованы на сайте. Продолжение использования сервиса означает согласие с обновлениями.\\n\\n6. Контакты\\n\\nsupport@iccandle.ai\"}}")
|
|
7403
7403
|
}
|
|
7404
7404
|
};
|
|
7405
|
-
function
|
|
7405
|
+
function re(e, t) {
|
|
7406
7406
|
let n = t.split("."), r = e;
|
|
7407
7407
|
for (let e of n) {
|
|
7408
7408
|
if (!r || typeof r != "object" || !(e in r)) return;
|
|
@@ -7410,38 +7410,38 @@ function ce(e, t) {
|
|
|
7410
7410
|
}
|
|
7411
7411
|
return typeof r == "string" ? r : void 0;
|
|
7412
7412
|
}
|
|
7413
|
-
function
|
|
7413
|
+
function ie(e, t) {
|
|
7414
7414
|
return t ? e.replace(/\{(\w+)\}/g, (e, n) => t[n] == null ? `{${n}}` : String(t[n])) : e;
|
|
7415
7415
|
}
|
|
7416
|
-
function
|
|
7417
|
-
return
|
|
7416
|
+
function ae(e, t, n) {
|
|
7417
|
+
return ie(re(ne[e], t) ?? re(ne.en, t) ?? t, n);
|
|
7418
7418
|
}
|
|
7419
7419
|
//#endregion
|
|
7420
7420
|
//#region src/context/widget-language.ts
|
|
7421
|
-
var
|
|
7422
|
-
function
|
|
7421
|
+
var oe = Symbol("widget-language");
|
|
7422
|
+
function se(e) {
|
|
7423
7423
|
let t = {
|
|
7424
7424
|
language: e,
|
|
7425
|
-
t: (t, n) =>
|
|
7425
|
+
t: (t, n) => ae(e.value, t, n)
|
|
7426
7426
|
};
|
|
7427
|
-
return S(
|
|
7427
|
+
return S(oe, t), t;
|
|
7428
7428
|
}
|
|
7429
|
-
function
|
|
7430
|
-
return f(
|
|
7429
|
+
function Z() {
|
|
7430
|
+
return f(oe) || {
|
|
7431
7431
|
language: r(() => "en"),
|
|
7432
|
-
t: ((e, t) =>
|
|
7432
|
+
t: ((e, t) => ae("en", e, t))
|
|
7433
7433
|
};
|
|
7434
7434
|
}
|
|
7435
7435
|
//#endregion
|
|
7436
7436
|
//#region src/lib/search-filter-storage.ts
|
|
7437
|
-
var
|
|
7438
|
-
function
|
|
7439
|
-
return typeof window > "u" ? !1 : localStorage.getItem(
|
|
7437
|
+
var ce = "search-filter", le = "search-filter-session", ue = "scanner-always-show";
|
|
7438
|
+
function de() {
|
|
7439
|
+
return typeof window > "u" ? !1 : localStorage.getItem(ue) === "true";
|
|
7440
7440
|
}
|
|
7441
|
-
function
|
|
7442
|
-
typeof window > "u" || localStorage.setItem(
|
|
7441
|
+
function fe(e) {
|
|
7442
|
+
typeof window > "u" || localStorage.setItem(ue, String(e));
|
|
7443
7443
|
}
|
|
7444
|
-
function
|
|
7444
|
+
function pe(e) {
|
|
7445
7445
|
if (!e) return {};
|
|
7446
7446
|
try {
|
|
7447
7447
|
return JSON.parse(e);
|
|
@@ -7450,7 +7450,7 @@ function Z(e) {
|
|
|
7450
7450
|
}
|
|
7451
7451
|
}
|
|
7452
7452
|
function me() {
|
|
7453
|
-
return typeof window > "u" ? {} :
|
|
7453
|
+
return typeof window > "u" ? {} : pe(localStorage.getItem(ce));
|
|
7454
7454
|
}
|
|
7455
7455
|
function he() {
|
|
7456
7456
|
let e = me();
|
|
@@ -7459,15 +7459,15 @@ function he() {
|
|
|
7459
7459
|
function ge(e, t) {
|
|
7460
7460
|
if (typeof window > "u") return;
|
|
7461
7461
|
let n = JSON.stringify(e);
|
|
7462
|
-
t ? (localStorage.setItem(
|
|
7462
|
+
t ? (localStorage.setItem(ce, n), sessionStorage.removeItem(le)) : (sessionStorage.setItem(le, n), ve());
|
|
7463
7463
|
}
|
|
7464
7464
|
function _e() {
|
|
7465
7465
|
if (typeof window > "u") return {};
|
|
7466
|
-
let e =
|
|
7466
|
+
let e = pe(sessionStorage.getItem(le));
|
|
7467
7467
|
return Object.keys(e).length > 0 ? e : me();
|
|
7468
7468
|
}
|
|
7469
7469
|
function ve() {
|
|
7470
|
-
typeof window > "u" || localStorage.removeItem(
|
|
7470
|
+
typeof window > "u" || localStorage.removeItem(ce);
|
|
7471
7471
|
}
|
|
7472
7472
|
//#endregion
|
|
7473
7473
|
//#region src/components/common/SimpleTooltip.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -7740,7 +7740,7 @@ var ye = { class: "iccandle-simple-tooltip-trigger" }, be = {
|
|
|
7740
7740
|
}
|
|
7741
7741
|
},
|
|
7742
7742
|
setup(t) {
|
|
7743
|
-
let n = t, { t: c } =
|
|
7743
|
+
let n = t, { t: c } = Z(), l = w(!0), d = w(null), f = w({
|
|
7744
7744
|
x: 0,
|
|
7745
7745
|
y: 0
|
|
7746
7746
|
}), p = r(() => !n.iframeLoaded || n.isLoading), m = r(() => p.value ? "#9ca3af" : "#ffb84d"), h = r(() => p.value ? "text-theme-color" : "iccandle-scanner-popup__label"), y = r(() => ({ transform: `translate(${f.value.x}px, ${f.value.y}px)` })), b = null;
|
|
@@ -7778,7 +7778,7 @@ var ye = { class: "iccandle-simple-tooltip-trigger" }, be = {
|
|
|
7778
7778
|
});
|
|
7779
7779
|
async function D() {
|
|
7780
7780
|
if (n.selectedCandles?.length) {
|
|
7781
|
-
|
|
7781
|
+
Y({
|
|
7782
7782
|
title: c("Common.error"),
|
|
7783
7783
|
description: c("Selector.clearReplayFirst"),
|
|
7784
7784
|
variant: "error"
|
|
@@ -7826,19 +7826,19 @@ var ye = { class: "iccandle-simple-tooltip-trigger" }, be = {
|
|
|
7826
7826
|
let e = i - o.period * 365.25 * 24 * 60 * 60;
|
|
7827
7827
|
l.filter ||= {}, l.filter.period = e;
|
|
7828
7828
|
}
|
|
7829
|
-
let u = `${
|
|
7829
|
+
let u = `${B}/${n.language}?symbol=${l.symbol}&ref_res=${l.reference_resolution}&tk=${l.top_k}&res=${l.resolution}&cid=${l.candle_id}&from=${l.start_timestamp * 1e3}&to=${l.end_timestamp * 1e3}` + (l.filter?.symbols?.length ? `&fs=${l.filter.symbols}` : "") + (l.filter?.period == null ? "" : `&period=${l.filter.period}`) + (o.model ? `&model=${o.model}` : "") + (o.temperature == null ? "" : `&temp=${o.temperature}`) + (n.theme === "dark" ? "&theme=dark" : "&theme=light");
|
|
7830
7830
|
n.clearScannerNewsMarks(), n.submitCallback(u);
|
|
7831
7831
|
}
|
|
7832
7832
|
function O() {
|
|
7833
7833
|
if (n.selectedCandles?.length) {
|
|
7834
|
-
|
|
7834
|
+
Y({
|
|
7835
7835
|
title: c("Common.error"),
|
|
7836
7836
|
description: c("Selector.clearReplayFirst"),
|
|
7837
7837
|
variant: "error"
|
|
7838
7838
|
});
|
|
7839
7839
|
return;
|
|
7840
7840
|
}
|
|
7841
|
-
if (he() && !
|
|
7841
|
+
if (he() && !de()) {
|
|
7842
7842
|
let e = me().timeframe;
|
|
7843
7843
|
e && n.onApplySavedTimeframe?.(e), D();
|
|
7844
7844
|
return;
|
|
@@ -8417,7 +8417,7 @@ var et = (e, t) => {
|
|
|
8417
8417
|
}),
|
|
8418
8418
|
emits: /*@__PURE__*/ m(["temperatureChange"], ["update:modelValue"]),
|
|
8419
8419
|
setup(t, { emit: n }) {
|
|
8420
|
-
let r = j(t, "modelValue"), i = n, { t: a } =
|
|
8420
|
+
let r = j(t, "modelValue"), i = n, { t: a } = Z(), c = [
|
|
8421
8421
|
{
|
|
8422
8422
|
label: "15M",
|
|
8423
8423
|
value: "15"
|
|
@@ -8544,7 +8544,7 @@ var et = (e, t) => {
|
|
|
8544
8544
|
100,
|
|
8545
8545
|
150,
|
|
8546
8546
|
200
|
|
8547
|
-
], i = j(t, "topK"), a = n, { t: c } =
|
|
8547
|
+
], i = j(t, "topK"), a = n, { t: c } = Z();
|
|
8548
8548
|
return (n, d) => (x(), o("div", Ct, [s("div", wt, [s("label", Tt, [l(k(A(c)("Selector.result")) + " ", 1), u(xe, { text: A(c)("Selector.topResultsTooltip") }, null, 8, ["text"])]), s("div", Et, [s("select", {
|
|
8549
8549
|
class: "iccandle-scanner-ai-settings__select",
|
|
8550
8550
|
value: String(i.value ?? 30),
|
|
@@ -8771,17 +8771,17 @@ var et = (e, t) => {
|
|
|
8771
8771
|
crypto: "Layout.helperBar.groupCrypto",
|
|
8772
8772
|
indices: "Layout.helperBar.groupIndices",
|
|
8773
8773
|
stock: "Layout.helperBar.groupStock"
|
|
8774
|
-
}, f = n, p = c, { t: m } =
|
|
8774
|
+
}, f = n, p = c, { t: m } = Z(), y = r(() => f.selectedCount ?? Object.values(f.selectedSymbols).filter(Boolean).length), b = w(null), S = w(null), C = w(null), E = w(null), D = w(!1), O = w("body"), j = r(() => !!((typeof O.value == "string" ? null : O.value)?.closest(".iccandle-dark") || b.value?.closest(".iccandle-dark"))), M = w(null), P = w({});
|
|
8775
8775
|
function F(e) {
|
|
8776
8776
|
b.value = e;
|
|
8777
8777
|
let t = e?.closest(".iccandle-theme-scope, .iccandle-selector-widget") ?? document.body;
|
|
8778
8778
|
O.value = t;
|
|
8779
8779
|
}
|
|
8780
|
-
let L = r(() => (f.allSymbols ?? f.filteredSymbols ?? []).filter((e) => f.selectedSymbols[e.ticker])), R = r(() => L.value.slice(0, vn)),
|
|
8780
|
+
let L = r(() => (f.allSymbols ?? f.filteredSymbols ?? []).filter((e) => f.selectedSymbols[e.ticker])), R = r(() => L.value.slice(0, vn)), z = r(() => L.value.length - R.value.length), B = r(() => {
|
|
8781
8781
|
let e = /* @__PURE__ */ new Set();
|
|
8782
8782
|
for (let t of L.value) e.add(t.type);
|
|
8783
8783
|
return e;
|
|
8784
|
-
}),
|
|
8784
|
+
}), V = r(() => {
|
|
8785
8785
|
let e = /* @__PURE__ */ new Map();
|
|
8786
8786
|
for (let t of l) e.set(t, []);
|
|
8787
8787
|
return f.filteredSymbols?.forEach((t) => {
|
|
@@ -8791,14 +8791,14 @@ var et = (e, t) => {
|
|
|
8791
8791
|
type: t,
|
|
8792
8792
|
symbols: e.get(t) ?? []
|
|
8793
8793
|
})).filter((e) => e.symbols.length > 0);
|
|
8794
|
-
}),
|
|
8794
|
+
}), ee = r(() => V.value.flatMap((e) => e.symbols));
|
|
8795
8795
|
function H(e) {
|
|
8796
8796
|
if (e.length === 0) return "none";
|
|
8797
8797
|
let t = e.filter((e) => f.selectedSymbols[e.ticker]).length;
|
|
8798
8798
|
return t === 0 ? "none" : t === e.length ? "all" : "some";
|
|
8799
8799
|
}
|
|
8800
8800
|
function U(e) {
|
|
8801
|
-
return f.searchTerm.trim().length > 0 ? !0 : Object.prototype.hasOwnProperty.call(P.value, e) ? P.value[e] === !0 :
|
|
8801
|
+
return f.searchTerm.trim().length > 0 ? !0 : Object.prototype.hasOwnProperty.call(P.value, e) ? P.value[e] === !0 : B.value.has(e);
|
|
8802
8802
|
}
|
|
8803
8803
|
function W(e) {
|
|
8804
8804
|
let t = U(e);
|
|
@@ -8807,31 +8807,31 @@ var et = (e, t) => {
|
|
|
8807
8807
|
[e]: !t
|
|
8808
8808
|
};
|
|
8809
8809
|
}
|
|
8810
|
-
function
|
|
8810
|
+
function G(e) {
|
|
8811
8811
|
p("symbolChange", e, !f.selectedSymbols[e]);
|
|
8812
8812
|
}
|
|
8813
|
-
function
|
|
8813
|
+
function K(e) {
|
|
8814
8814
|
let t = e.map((e) => e.ticker), n = H(e) !== "all";
|
|
8815
8815
|
p("groupChange", t, n);
|
|
8816
8816
|
}
|
|
8817
|
-
function
|
|
8818
|
-
let e =
|
|
8817
|
+
function q() {
|
|
8818
|
+
let e = ee.value.map((e) => e.ticker), t = H(ee.value) !== "all";
|
|
8819
8819
|
p("groupChange", e, t);
|
|
8820
8820
|
}
|
|
8821
|
-
function
|
|
8821
|
+
function J(e, t) {
|
|
8822
8822
|
t.preventDefault(), t.stopPropagation(), p("symbolChange", e, !1);
|
|
8823
8823
|
}
|
|
8824
|
-
function
|
|
8824
|
+
function Y() {
|
|
8825
8825
|
D.value = !1, M.value = null, p("searchChange", "");
|
|
8826
8826
|
}
|
|
8827
|
-
function
|
|
8827
|
+
function X(e) {
|
|
8828
8828
|
if (e) {
|
|
8829
8829
|
D.value = !0;
|
|
8830
8830
|
return;
|
|
8831
8831
|
}
|
|
8832
|
-
|
|
8832
|
+
Y();
|
|
8833
8833
|
}
|
|
8834
|
-
function
|
|
8834
|
+
function te() {
|
|
8835
8835
|
let e = S.value;
|
|
8836
8836
|
if (!e) return;
|
|
8837
8837
|
let t = e.getBoundingClientRect(), n = window.innerHeight - t.bottom - 4 - 8, r = t.top - 8, i = n < 240 && r > n, a = Math.max(160, Math.min(384, i ? r : n)), o = i ? Math.max(8, t.top - 4 - a) : t.bottom + 4;
|
|
@@ -8842,24 +8842,24 @@ var et = (e, t) => {
|
|
|
8842
8842
|
maxHeight: a
|
|
8843
8843
|
};
|
|
8844
8844
|
}
|
|
8845
|
-
function
|
|
8845
|
+
function ne(e) {
|
|
8846
8846
|
let t = e.target;
|
|
8847
|
-
t && (b.value?.contains(t) || C.value?.contains(t) ||
|
|
8847
|
+
t && (b.value?.contains(t) || C.value?.contains(t) || Y());
|
|
8848
8848
|
}
|
|
8849
|
-
function
|
|
8850
|
-
e.key === "Escape" &&
|
|
8849
|
+
function re(e) {
|
|
8850
|
+
e.key === "Escape" && Y();
|
|
8851
8851
|
}
|
|
8852
|
-
function
|
|
8853
|
-
|
|
8852
|
+
function ie() {
|
|
8853
|
+
te();
|
|
8854
8854
|
}
|
|
8855
8855
|
N(D, async (e) => {
|
|
8856
|
-
window.removeEventListener("resize",
|
|
8856
|
+
window.removeEventListener("resize", ie), window.removeEventListener("scroll", ie, !0), document.removeEventListener("mousedown", ne), document.removeEventListener("keydown", re), e && (te(), window.addEventListener("resize", ie), window.addEventListener("scroll", ie, !0), document.addEventListener("mousedown", ne), document.addEventListener("keydown", re), await h(), requestAnimationFrame(() => {
|
|
8857
8857
|
E.value?.focus();
|
|
8858
8858
|
}));
|
|
8859
8859
|
}), v(() => {
|
|
8860
|
-
window.removeEventListener("resize",
|
|
8860
|
+
window.removeEventListener("resize", ie), window.removeEventListener("scroll", ie, !0), document.removeEventListener("mousedown", ne), document.removeEventListener("keydown", re);
|
|
8861
8861
|
});
|
|
8862
|
-
let
|
|
8862
|
+
let ae = r(() => H(ee.value)), oe = r(() => y.value <= 1 ? m("Pattern.symbolSelected", { count: y.value }) : m("Pattern.symbolsSelected", { count: y.value })), se = r(() => M.value ? Math.max(120, M.value.maxHeight - 48) : 120);
|
|
8863
8863
|
return (r, c) => (x(), o("div", {
|
|
8864
8864
|
ref: (e) => F(e),
|
|
8865
8865
|
class: "iccandle-scanner-symbol-search iccandle-scanner-symbol-search--combobox"
|
|
@@ -8871,7 +8871,7 @@ var et = (e, t) => {
|
|
|
8871
8871
|
"aria-expanded": D.value,
|
|
8872
8872
|
"aria-haspopup": "listbox",
|
|
8873
8873
|
class: "iccandle-scanner-symbol-search__trigger",
|
|
8874
|
-
onClick: c[0] ||= (e) =>
|
|
8874
|
+
onClick: c[0] ||= (e) => X(!D.value)
|
|
8875
8875
|
}, [s("div", Jt, [L.value.length === 0 ? (x(), o("span", Yt, k(A(m)("Selector.searchSymbol")), 1)) : (x(), o(e, { key: 1 }, [(x(!0), o(e, null, T(R.value, (e) => (x(), o("span", {
|
|
8876
8876
|
key: e.ticker,
|
|
8877
8877
|
class: "iccandle-scanner-symbol-search__chip"
|
|
@@ -8883,12 +8883,12 @@ var et = (e, t) => {
|
|
|
8883
8883
|
tabindex: "0",
|
|
8884
8884
|
"aria-label": `Remove ${e.display_name}`,
|
|
8885
8885
|
class: "iccandle-scanner-symbol-search__chip-remove",
|
|
8886
|
-
onClick: (t) =>
|
|
8886
|
+
onClick: (t) => J(e.ticker, t),
|
|
8887
8887
|
onKeydown: (t) => {
|
|
8888
8888
|
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), t.stopPropagation(), p("symbolChange", e.ticker, !1));
|
|
8889
8889
|
}
|
|
8890
8890
|
}, [u(rt, { size: 10 })], 40, Qt)
|
|
8891
|
-
]))), 128)),
|
|
8891
|
+
]))), 128)), z.value > 0 ? (x(), o("span", $t, " +" + k(z.value), 1)) : a("", !0)], 64))]), s("div", en, [s("span", null, k(oe.value), 1), u(Ht, {
|
|
8892
8892
|
size: 16,
|
|
8893
8893
|
"class-name": "iccandle-scanner-symbol-search__trigger-meta-icon"
|
|
8894
8894
|
})])], 8, qt), D.value && M.value ? (x(), i(t, {
|
|
@@ -8920,27 +8920,27 @@ var et = (e, t) => {
|
|
|
8920
8920
|
onInput: c[1] ||= (e) => p("searchChange", e.target.value.toUpperCase())
|
|
8921
8921
|
}, null, 40, nn)]), s("div", {
|
|
8922
8922
|
class: "iccandle-scanner-symbol-search__command-list",
|
|
8923
|
-
style: _({ maxHeight: `${
|
|
8923
|
+
style: _({ maxHeight: `${se.value}px` })
|
|
8924
8924
|
}, [
|
|
8925
|
-
n.searchTerm.trim() &&
|
|
8926
|
-
|
|
8925
|
+
n.searchTerm.trim() && ee.value.length === 0 ? (x(), o("div", rn, k(A(m)("Selector.noResultsFound")), 1)) : a("", !0),
|
|
8926
|
+
ee.value.length > 0 ? (x(), o("div", an, [s("button", {
|
|
8927
8927
|
type: "button",
|
|
8928
8928
|
class: "iccandle-scanner-symbol-search__group-check-btn",
|
|
8929
8929
|
"aria-label": A(m)("Selector.selectAll"),
|
|
8930
|
-
onClick:
|
|
8931
|
-
}, [
|
|
8930
|
+
onClick: q
|
|
8931
|
+
}, [ae.value === "all" ? (x(), o("div", sn, [u(Bt, { size: 12 })])) : ae.value === "some" ? (x(), o("div", cn, [u(Wt, { size: 12 })])) : (x(), o("div", ln))], 8, on), s("button", {
|
|
8932
8932
|
type: "button",
|
|
8933
8933
|
class: "iccandle-scanner-symbol-search__group-label-btn",
|
|
8934
|
-
onClick:
|
|
8934
|
+
onClick: q
|
|
8935
8935
|
}, k(A(m)("Selector.selectAll")), 1)])) : a("", !0),
|
|
8936
|
-
(x(!0), o(e, null, T(
|
|
8936
|
+
(x(!0), o(e, null, T(V.value, (t) => (x(), o("div", {
|
|
8937
8937
|
key: t.type,
|
|
8938
8938
|
class: "iccandle-scanner-symbol-search__group"
|
|
8939
8939
|
}, [s("div", un, [s("button", {
|
|
8940
8940
|
type: "button",
|
|
8941
8941
|
class: "iccandle-scanner-symbol-search__group-check-btn",
|
|
8942
8942
|
"aria-label": `${A(m)("Selector.selectAll")} ${A(m)(d[t.type])}`,
|
|
8943
|
-
onClick: I((e) =>
|
|
8943
|
+
onClick: I((e) => K(t.symbols), ["stop", "prevent"])
|
|
8944
8944
|
}, [H(t.symbols) === "all" ? (x(), o("div", fn, [u(Bt, { size: 12 })])) : H(t.symbols) === "some" ? (x(), o("div", pn, [u(Wt, { size: 12 })])) : (x(), o("div", mn))], 8, dn), s("button", {
|
|
8945
8945
|
type: "button",
|
|
8946
8946
|
class: "iccandle-scanner-symbol-search__group-expand-btn",
|
|
@@ -8955,7 +8955,7 @@ var et = (e, t) => {
|
|
|
8955
8955
|
role: "option",
|
|
8956
8956
|
"aria-selected": !!n.selectedSymbols[e.ticker],
|
|
8957
8957
|
class: "iccandle-scanner-symbol-search__item",
|
|
8958
|
-
onClick: (t) =>
|
|
8958
|
+
onClick: (t) => G(e.ticker)
|
|
8959
8959
|
}, [
|
|
8960
8960
|
s("div", { class: g(A(Qe)("iccandle-scanner-symbol-search__check", n.selectedSymbols[e.ticker] && "iccandle-scanner-symbol-search__check--on")) }, [n.selectedSymbols[e.ticker] ? (x(), i(Bt, {
|
|
8961
8961
|
key: 0,
|
|
@@ -8985,7 +8985,7 @@ var et = (e, t) => {
|
|
|
8985
8985
|
},
|
|
8986
8986
|
emits: ["cancel", "scanConfigSaved"],
|
|
8987
8987
|
setup(e, { emit: t }) {
|
|
8988
|
-
let n = e, c = t, { t: d } =
|
|
8988
|
+
let n = e, c = t, { t: d } = Z();
|
|
8989
8989
|
function f() {
|
|
8990
8990
|
let e = me();
|
|
8991
8991
|
return Object.keys(e).length > 0 ? e : null;
|
|
@@ -8996,7 +8996,7 @@ var et = (e, t) => {
|
|
|
8996
8996
|
function h(e, t) {
|
|
8997
8997
|
return e?.symbols?.length ? e.symbols : t ? [t] : [];
|
|
8998
8998
|
}
|
|
8999
|
-
let _ = w(
|
|
8999
|
+
let _ = w(de()), b = f(), S = w(""), T = w(""), E = null, D = w(!1), O = w(b?.model ?? "light"), j = w(b?.temperature ?? 1), M = w(m(b, n.currentSymbol)), P = w(null), F = null, I = C({
|
|
9000
9000
|
probability: 0,
|
|
9001
9001
|
top_k: Math.min(Bn, b?.top_k || 30),
|
|
9002
9002
|
timeframe: n.timeframe === "1" || n.timeframe === "5" ? "60" : n.timeframe || "60",
|
|
@@ -9012,7 +9012,7 @@ var et = (e, t) => {
|
|
|
9012
9012
|
let e = T.value.toLowerCase();
|
|
9013
9013
|
return Q.filter((t) => t.display_name.toLowerCase().includes(e));
|
|
9014
9014
|
}), R = r(() => Object.values(M.value).filter(Boolean).length);
|
|
9015
|
-
function
|
|
9015
|
+
function z(e) {
|
|
9016
9016
|
let t = Object.entries(e).filter(([, e]) => e).map(([e]) => e);
|
|
9017
9017
|
I.symbols = t;
|
|
9018
9018
|
}
|
|
@@ -9021,19 +9021,19 @@ var et = (e, t) => {
|
|
|
9021
9021
|
}), N(() => I.symbols.length, (e) => {
|
|
9022
9022
|
e > 0 && (P.value = null);
|
|
9023
9023
|
});
|
|
9024
|
-
function
|
|
9024
|
+
function B(e, t) {
|
|
9025
9025
|
let n = {
|
|
9026
9026
|
...M.value,
|
|
9027
9027
|
[e]: t
|
|
9028
9028
|
};
|
|
9029
|
-
M.value = n,
|
|
9029
|
+
M.value = n, z(n);
|
|
9030
9030
|
}
|
|
9031
|
-
function
|
|
9031
|
+
function V(e, t) {
|
|
9032
9032
|
let n = { ...M.value };
|
|
9033
9033
|
for (let r of e) n[r] = t;
|
|
9034
|
-
M.value = n,
|
|
9034
|
+
M.value = n, z(n);
|
|
9035
9035
|
}
|
|
9036
|
-
function
|
|
9036
|
+
function ee() {
|
|
9037
9037
|
let e = I.symbols ?? [];
|
|
9038
9038
|
if (e.length === 0) {
|
|
9039
9039
|
P.value = d("Pattern.signalDialog.selectOneSymbol"), F && clearTimeout(F), F = setTimeout(() => {
|
|
@@ -9052,28 +9052,28 @@ var et = (e, t) => {
|
|
|
9052
9052
|
isAllSelected: r,
|
|
9053
9053
|
model: O.value,
|
|
9054
9054
|
temperature: j.value
|
|
9055
|
-
}, !0),
|
|
9055
|
+
}, !0), fe(_.value), n.setResolution(I.timeframe), c("cancel"), n.intent === "settings" ? Y({
|
|
9056
9056
|
title: d("Common.success"),
|
|
9057
9057
|
description: d("Selector.searchFilterSaved"),
|
|
9058
9058
|
variant: "success"
|
|
9059
9059
|
}) : c("scanConfigSaved");
|
|
9060
9060
|
}
|
|
9061
9061
|
function H(e) {
|
|
9062
|
-
e.preventDefault(),
|
|
9062
|
+
e.preventDefault(), ee();
|
|
9063
9063
|
}
|
|
9064
9064
|
function U(e) {
|
|
9065
|
-
_.value = e,
|
|
9065
|
+
_.value = e, fe(e);
|
|
9066
9066
|
}
|
|
9067
9067
|
function W() {
|
|
9068
9068
|
c("cancel");
|
|
9069
9069
|
}
|
|
9070
|
-
function
|
|
9070
|
+
function G(e) {
|
|
9071
9071
|
e.key === "Escape" && W();
|
|
9072
9072
|
}
|
|
9073
|
-
y(() => window.addEventListener("keydown",
|
|
9074
|
-
window.removeEventListener("keydown",
|
|
9073
|
+
y(() => window.addEventListener("keydown", G)), v(() => {
|
|
9074
|
+
window.removeEventListener("keydown", G), E && clearTimeout(E), F && clearTimeout(F);
|
|
9075
9075
|
});
|
|
9076
|
-
let
|
|
9076
|
+
let K = r(() => n.intent === "scan" ? d("Selector.scan") : d("Selector.saveOptions"));
|
|
9077
9077
|
return (t, n) => (x(), o("div", bn, [
|
|
9078
9078
|
s("div", xn, [s("div", Sn, [s("div", Cn, k(A(d)("Selector.scannerOptions")), 1), s("div", wn, k(A(d)("Selector.scannerOptionsDescription")), 1)]), s("button", {
|
|
9079
9079
|
type: "button",
|
|
@@ -9093,8 +9093,8 @@ var et = (e, t) => {
|
|
|
9093
9093
|
"selected-count": R.value,
|
|
9094
9094
|
"all-symbols": A(Q),
|
|
9095
9095
|
onSearchChange: n[0] ||= (e) => S.value = e,
|
|
9096
|
-
onSymbolChange:
|
|
9097
|
-
onGroupChange:
|
|
9096
|
+
onSymbolChange: B,
|
|
9097
|
+
onGroupChange: V
|
|
9098
9098
|
}, null, 8, [
|
|
9099
9099
|
"search-term",
|
|
9100
9100
|
"selected-symbols",
|
|
@@ -9138,7 +9138,7 @@ var et = (e, t) => {
|
|
|
9138
9138
|
key: 0,
|
|
9139
9139
|
size: 14,
|
|
9140
9140
|
color: "#ffb84d"
|
|
9141
|
-
})) : a("", !0), l(" " + k(
|
|
9141
|
+
})) : a("", !0), l(" " + k(K.value), 1)], 2)])])])
|
|
9142
9142
|
]));
|
|
9143
9143
|
}
|
|
9144
9144
|
}), Hn = /* @__PURE__ */ d({
|
|
@@ -9254,7 +9254,7 @@ var et = (e, t) => {
|
|
|
9254
9254
|
},
|
|
9255
9255
|
emits: ["patternNameChange"],
|
|
9256
9256
|
setup(e, { emit: t }) {
|
|
9257
|
-
let n = t, { t: r } =
|
|
9257
|
+
let n = t, { t: r } = Z();
|
|
9258
9258
|
function i(e) {
|
|
9259
9259
|
let t = e.target.value.slice(0, 20);
|
|
9260
9260
|
n("patternNameChange", t);
|
|
@@ -9375,7 +9375,7 @@ var et = (e, t) => {
|
|
|
9375
9375
|
"groupChange"
|
|
9376
9376
|
],
|
|
9377
9377
|
setup(n, { emit: c }) {
|
|
9378
|
-
let l = n, d = c, { t: f } =
|
|
9378
|
+
let l = n, d = c, { t: f } = Z(), p = w(null), m = w(null), y = w(null), b = w(null), S = w(!1), C = w("body"), E = r(() => !!((typeof C.value == "string" ? null : C.value)?.closest(".iccandle-dark") || p.value?.closest(".iccandle-dark"))), D = w(null);
|
|
9379
9379
|
function O(e) {
|
|
9380
9380
|
p.value = e;
|
|
9381
9381
|
let t = e?.closest(".iccandle-theme-scope, .iccandle-selector-widget") ?? document.body;
|
|
@@ -9396,22 +9396,22 @@ var et = (e, t) => {
|
|
|
9396
9396
|
function R(e) {
|
|
9397
9397
|
d("timeframeChange", e, !l.selectedTimeframes[e]);
|
|
9398
9398
|
}
|
|
9399
|
-
function
|
|
9399
|
+
function z() {
|
|
9400
9400
|
let e = M.value.map((e) => e.value), t = F(M.value) !== "all";
|
|
9401
9401
|
d("groupChange", e, t);
|
|
9402
9402
|
}
|
|
9403
|
-
function
|
|
9403
|
+
function B(e, t) {
|
|
9404
9404
|
t.preventDefault(), t.stopPropagation(), d("timeframeChange", e, !1);
|
|
9405
9405
|
}
|
|
9406
|
-
function
|
|
9406
|
+
function V() {
|
|
9407
9407
|
S.value = !1, D.value = null, d("searchChange", "");
|
|
9408
9408
|
}
|
|
9409
|
-
function
|
|
9409
|
+
function ee(e) {
|
|
9410
9410
|
if (e) {
|
|
9411
9411
|
S.value = !0;
|
|
9412
9412
|
return;
|
|
9413
9413
|
}
|
|
9414
|
-
|
|
9414
|
+
V();
|
|
9415
9415
|
}
|
|
9416
9416
|
function H() {
|
|
9417
9417
|
let e = m.value;
|
|
@@ -9426,10 +9426,10 @@ var et = (e, t) => {
|
|
|
9426
9426
|
}
|
|
9427
9427
|
function U(e) {
|
|
9428
9428
|
let t = e.target;
|
|
9429
|
-
t && (p.value?.contains(t) || y.value?.contains(t) ||
|
|
9429
|
+
t && (p.value?.contains(t) || y.value?.contains(t) || V());
|
|
9430
9430
|
}
|
|
9431
9431
|
function W(e) {
|
|
9432
|
-
e.key === "Escape" &&
|
|
9432
|
+
e.key === "Escape" && V();
|
|
9433
9433
|
}
|
|
9434
9434
|
N(S, async (e) => {
|
|
9435
9435
|
window.removeEventListener("resize", H), window.removeEventListener("scroll", H, !0), document.removeEventListener("mousedown", U), document.removeEventListener("keydown", W), e && (H(), window.addEventListener("resize", H), window.addEventListener("scroll", H, !0), document.addEventListener("mousedown", U), document.addEventListener("keydown", W), await h(), requestAnimationFrame(() => {
|
|
@@ -9438,7 +9438,7 @@ var et = (e, t) => {
|
|
|
9438
9438
|
}), v(() => {
|
|
9439
9439
|
window.removeEventListener("resize", H), window.removeEventListener("scroll", H, !0), document.removeEventListener("mousedown", U), document.removeEventListener("keydown", W);
|
|
9440
9440
|
});
|
|
9441
|
-
let
|
|
9441
|
+
let G = r(() => F(M.value)), K = r(() => l.selectedCount <= 1 ? f("Pattern.timeframeSelected", { count: l.selectedCount }) : f("Pattern.timeframesSelected", { count: l.selectedCount })), q = r(() => D.value ? Math.max(120, D.value.maxHeight - 48) : 120);
|
|
9442
9442
|
return (r, c) => (x(), o("div", {
|
|
9443
9443
|
ref: (e) => O(e),
|
|
9444
9444
|
class: "iccandle-scanner-timeframe-search iccandle-scanner-timeframe-search--combobox"
|
|
@@ -9450,7 +9450,7 @@ var et = (e, t) => {
|
|
|
9450
9450
|
"aria-expanded": S.value,
|
|
9451
9451
|
"aria-haspopup": "listbox",
|
|
9452
9452
|
class: "iccandle-scanner-timeframe-search__trigger",
|
|
9453
|
-
onClick: c[0] ||= (e) =>
|
|
9453
|
+
onClick: c[0] ||= (e) => ee(!S.value)
|
|
9454
9454
|
}, [s("div", mr, [P.value.length === 0 ? (x(), o("span", hr, k(A(f)("Selector.searchTimeframe")), 1)) : (x(!0), o(e, { key: 1 }, T(P.value, (e) => (x(), o("span", {
|
|
9455
9455
|
key: e.value,
|
|
9456
9456
|
class: "iccandle-scanner-timeframe-search__chip"
|
|
@@ -9459,11 +9459,11 @@ var et = (e, t) => {
|
|
|
9459
9459
|
tabindex: "0",
|
|
9460
9460
|
"aria-label": `Remove ${e.label}`,
|
|
9461
9461
|
class: "iccandle-scanner-timeframe-search__chip-remove",
|
|
9462
|
-
onClick: (t) =>
|
|
9462
|
+
onClick: (t) => B(e.value, t),
|
|
9463
9463
|
onKeydown: (t) => {
|
|
9464
9464
|
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), t.stopPropagation(), d("timeframeChange", e.value, !1));
|
|
9465
9465
|
}
|
|
9466
|
-
}, [u(rt, { size: 10 })], 40, _r)]))), 128))]), s("div", vr, [s("span", null, k(
|
|
9466
|
+
}, [u(rt, { size: 10 })], 40, _r)]))), 128))]), s("div", vr, [s("span", null, k(K.value), 1), u(Ht, {
|
|
9467
9467
|
size: 16,
|
|
9468
9468
|
style: { opacity: .6 }
|
|
9469
9469
|
})])], 8, pr), (x(), i(t, { to: C.value }, [S.value && D.value ? (x(), o("div", {
|
|
@@ -9493,18 +9493,18 @@ var et = (e, t) => {
|
|
|
9493
9493
|
onInput: c[1] ||= (e) => d("searchChange", e.target.value.toUpperCase())
|
|
9494
9494
|
}, null, 40, br)]), s("div", {
|
|
9495
9495
|
class: "iccandle-scanner-timeframe-search__command-list",
|
|
9496
|
-
style: _({ maxHeight: `${
|
|
9496
|
+
style: _({ maxHeight: `${q.value}px` })
|
|
9497
9497
|
}, [
|
|
9498
9498
|
n.searchTerm.trim() && M.value.length === 0 ? (x(), o("div", xr, k(A(f)("Selector.noResultsFound")), 1)) : a("", !0),
|
|
9499
9499
|
M.value.length > 0 ? (x(), o("div", Sr, [s("button", {
|
|
9500
9500
|
type: "button",
|
|
9501
9501
|
class: "iccandle-scanner-timeframe-search__group-check-btn",
|
|
9502
9502
|
"aria-label": A(f)("Selector.selectAllTimeframes"),
|
|
9503
|
-
onClick:
|
|
9504
|
-
}, [
|
|
9503
|
+
onClick: z
|
|
9504
|
+
}, [G.value === "all" ? (x(), o("div", wr, [u(Bt, { size: 12 })])) : G.value === "some" ? (x(), o("div", Tr, [u(Wt, { size: 12 })])) : (x(), o("div", Er))], 8, Cr), s("button", {
|
|
9505
9505
|
type: "button",
|
|
9506
9506
|
class: "iccandle-scanner-timeframe-search__group-label-btn",
|
|
9507
|
-
onClick:
|
|
9507
|
+
onClick: z
|
|
9508
9508
|
}, k(A(f)("Selector.selectAllTimeframes")), 1)])) : a("", !0),
|
|
9509
9509
|
(x(!0), o(e, null, T(M.value, (e) => (x(), o("button", {
|
|
9510
9510
|
key: e.value,
|
|
@@ -9527,7 +9527,7 @@ var et = (e, t) => {
|
|
|
9527
9527
|
__name: "TimeframesTab",
|
|
9528
9528
|
props: { form: {} },
|
|
9529
9529
|
setup(e) {
|
|
9530
|
-
let t = e, { t: n } =
|
|
9530
|
+
let t = e, { t: n } = Z(), i = w(""), a = w(""), c = 0;
|
|
9531
9531
|
N(i, (e) => {
|
|
9532
9532
|
cancelAnimationFrame(c), c = requestAnimationFrame(() => {
|
|
9533
9533
|
a.value = e;
|
|
@@ -9575,7 +9575,7 @@ var et = (e, t) => {
|
|
|
9575
9575
|
__name: "SymbolsTab",
|
|
9576
9576
|
props: { form: {} },
|
|
9577
9577
|
setup(e) {
|
|
9578
|
-
let t = e, { t: n } =
|
|
9578
|
+
let t = e, { t: n } = Z(), i = w(""), a = w(""), c = 0;
|
|
9579
9579
|
N(i, (e) => {
|
|
9580
9580
|
cancelAnimationFrame(c), c = requestAnimationFrame(() => {
|
|
9581
9581
|
a.value = e;
|
|
@@ -9740,17 +9740,17 @@ var et = (e, t) => {
|
|
|
9740
9740
|
}, d = n, f = (e, t) => {
|
|
9741
9741
|
let n = t.trim().toLowerCase();
|
|
9742
9742
|
return n ? e.filter((e) => e.toLowerCase().includes(n)) : e;
|
|
9743
|
-
}, { t: p } =
|
|
9744
|
-
function
|
|
9743
|
+
}, { t: p } = Z(), m = w(null), y = w(null), b = w(null), S = w(null), C = w(null), E = w("body"), D = r(() => !!((typeof E.value == "string" ? null : E.value)?.closest(".iccandle-dark") || m.value?.closest(".iccandle-dark"))), O = w(!1), j = w(!1), P = w(""), I = w(""), L = w(null), R = w(null);
|
|
9744
|
+
function z(e) {
|
|
9745
9745
|
m.value = e;
|
|
9746
9746
|
let t = e?.closest(".iccandle-theme-scope, .iccandle-selector-widget") ?? document.body;
|
|
9747
9747
|
E.value = t;
|
|
9748
9748
|
}
|
|
9749
|
-
let
|
|
9749
|
+
let B = Intl.DateTimeFormat().resolvedOptions().timeZone, V = r(() => Gr(d.timeconfig, B)), ee = (e) => p(c[e]), H = r(() => d.timeconfig?.timezone?.trim() || B || "UTC"), U = r(() => V.value === "all_time" ? p("TimeConfig.yourTimezone") : H.value), W = r(() => Kr(B)), G = r(() => {
|
|
9750
9750
|
let e = P.value.trim().toLowerCase();
|
|
9751
|
-
return e ? Br.filter((t) =>
|
|
9752
|
-
}),
|
|
9753
|
-
function
|
|
9751
|
+
return e ? Br.filter((t) => ee(t.value).toLowerCase().includes(e) || t.value.toLowerCase().includes(e)) : Br;
|
|
9752
|
+
}), K = r(() => f(W.value, I.value)), q = r(() => `iccandle-time-config-section ${d.containerClassName}`.trim());
|
|
9753
|
+
function J(e, t) {
|
|
9754
9754
|
if (!e) return;
|
|
9755
9755
|
let n = e.getBoundingClientRect(), r = window.innerHeight - n.bottom - 4 - 8, i = n.top - 8, a = r < 180 && i > r, o = Math.max(160, Math.min(320, a ? i : r));
|
|
9756
9756
|
t({
|
|
@@ -9760,23 +9760,23 @@ var et = (e, t) => {
|
|
|
9760
9760
|
maxHeight: o
|
|
9761
9761
|
});
|
|
9762
9762
|
}
|
|
9763
|
-
function
|
|
9763
|
+
function Y() {
|
|
9764
9764
|
j.value = !1, P.value = "", L.value = null;
|
|
9765
9765
|
}
|
|
9766
|
-
function
|
|
9766
|
+
function X() {
|
|
9767
9767
|
O.value = !1, I.value = "", R.value = null;
|
|
9768
9768
|
}
|
|
9769
|
-
function
|
|
9770
|
-
let n = d.timeconfig || { timezone:
|
|
9769
|
+
function te(e, t) {
|
|
9770
|
+
let n = d.timeconfig || { timezone: B };
|
|
9771
9771
|
d.onTimeConfigChange({
|
|
9772
9772
|
...n,
|
|
9773
9773
|
[e]: t,
|
|
9774
9774
|
preset_session: "customize"
|
|
9775
9775
|
}, { shouldDirty: !0 });
|
|
9776
9776
|
}
|
|
9777
|
-
function
|
|
9778
|
-
if (
|
|
9779
|
-
d.timeconfig && d.onTimeConfigChange(void 0, { shouldDirty: !0 }),
|
|
9777
|
+
function ne(e) {
|
|
9778
|
+
if (Y(), e === "all_time") {
|
|
9779
|
+
d.timeconfig && d.onTimeConfigChange(void 0, { shouldDirty: !0 }), X();
|
|
9780
9780
|
return;
|
|
9781
9781
|
}
|
|
9782
9782
|
if (e === "customize") {
|
|
@@ -9786,65 +9786,65 @@ var et = (e, t) => {
|
|
|
9786
9786
|
}, { shouldDirty: !0 }) : d.onTimeConfigChange({
|
|
9787
9787
|
start_time: "08:00",
|
|
9788
9788
|
end_time: "23:00",
|
|
9789
|
-
timezone:
|
|
9789
|
+
timezone: B,
|
|
9790
9790
|
preset_session: "customize"
|
|
9791
9791
|
}, { shouldDirty: !0 });
|
|
9792
9792
|
return;
|
|
9793
9793
|
}
|
|
9794
|
-
let t = Wr(e, d.timeconfig?.timezone ||
|
|
9794
|
+
let t = Wr(e, d.timeconfig?.timezone || B);
|
|
9795
9795
|
t && d.onTimeConfigChange({
|
|
9796
9796
|
...t,
|
|
9797
9797
|
preset_session: e
|
|
9798
9798
|
}, { shouldDirty: !0 });
|
|
9799
9799
|
}
|
|
9800
|
-
function
|
|
9801
|
-
if (
|
|
9802
|
-
let t = Wr(
|
|
9800
|
+
function re(e) {
|
|
9801
|
+
if (V.value !== "all_time" && V.value !== "customize") {
|
|
9802
|
+
let t = Wr(V.value, e);
|
|
9803
9803
|
t && d.onTimeConfigChange({
|
|
9804
9804
|
...t,
|
|
9805
|
-
preset_session:
|
|
9805
|
+
preset_session: V.value
|
|
9806
9806
|
}, { shouldDirty: !0 });
|
|
9807
9807
|
} else d.onTimeConfigChange({
|
|
9808
9808
|
...d.timeconfig || {},
|
|
9809
9809
|
timezone: e
|
|
9810
9810
|
}, { shouldDirty: !0 });
|
|
9811
|
-
|
|
9811
|
+
X();
|
|
9812
9812
|
}
|
|
9813
|
-
function
|
|
9814
|
-
if (
|
|
9813
|
+
function ie(e) {
|
|
9814
|
+
if (V.value !== "customize") return;
|
|
9815
9815
|
let t = e.currentTarget;
|
|
9816
9816
|
try {
|
|
9817
9817
|
t.showPicker?.();
|
|
9818
9818
|
} catch {}
|
|
9819
9819
|
}
|
|
9820
|
-
function
|
|
9821
|
-
j.value &&
|
|
9820
|
+
function ae() {
|
|
9821
|
+
j.value && J(y.value, (e) => {
|
|
9822
9822
|
L.value = e;
|
|
9823
|
-
}), O.value &&
|
|
9823
|
+
}), O.value && J(b.value, (e) => {
|
|
9824
9824
|
R.value = e;
|
|
9825
9825
|
});
|
|
9826
9826
|
}
|
|
9827
|
-
function
|
|
9827
|
+
function oe(e) {
|
|
9828
9828
|
let t = e.target;
|
|
9829
|
-
t && (m.value?.contains(t) || S.value?.contains(t) || C.value?.contains(t) || (j.value &&
|
|
9829
|
+
t && (m.value?.contains(t) || S.value?.contains(t) || C.value?.contains(t) || (j.value && Y(), O.value && X()));
|
|
9830
9830
|
}
|
|
9831
|
-
function
|
|
9832
|
-
e.key === "Escape" && (j.value &&
|
|
9831
|
+
function se(e) {
|
|
9832
|
+
e.key === "Escape" && (j.value && Y(), O.value && X());
|
|
9833
9833
|
}
|
|
9834
|
-
N(() => [d.timeconfig,
|
|
9835
|
-
!d.timeconfig ||
|
|
9834
|
+
N(() => [d.timeconfig, V.value], () => {
|
|
9835
|
+
!d.timeconfig || V.value === "all_time" || d.timeconfig.timezone || d.onTimeConfigChange({
|
|
9836
9836
|
...d.timeconfig,
|
|
9837
|
-
timezone:
|
|
9837
|
+
timezone: B
|
|
9838
9838
|
}, { shouldDirty: !1 });
|
|
9839
9839
|
}, { immediate: !0 }), N([j, O], async ([e, t]) => {
|
|
9840
|
-
window.removeEventListener("resize",
|
|
9840
|
+
window.removeEventListener("resize", ae), window.removeEventListener("scroll", ae, !0), document.removeEventListener("mousedown", oe), document.removeEventListener("keydown", se), !(!e && !t) && (await h(), ae(), window.addEventListener("resize", ae), window.addEventListener("scroll", ae, !0), document.addEventListener("mousedown", oe), document.addEventListener("keydown", se));
|
|
9841
9841
|
}), v(() => {
|
|
9842
|
-
window.removeEventListener("resize",
|
|
9842
|
+
window.removeEventListener("resize", ae), window.removeEventListener("scroll", ae, !0), document.removeEventListener("mousedown", oe), document.removeEventListener("keydown", se);
|
|
9843
9843
|
});
|
|
9844
|
-
let
|
|
9844
|
+
let ce = r(() => L.value ? Math.max(120, L.value.maxHeight - 52) : 120), le = r(() => R.value ? Math.max(120, R.value.maxHeight - 96) : 120);
|
|
9845
9845
|
return (r, c) => (x(), o("div", {
|
|
9846
|
-
ref: (e) =>
|
|
9847
|
-
class: g(
|
|
9846
|
+
ref: (e) => z(e),
|
|
9847
|
+
class: g(q.value)
|
|
9848
9848
|
}, [
|
|
9849
9849
|
s("div", qr, [s("h3", Jr, k(A(p)("TimeConfig.title")), 1)]),
|
|
9850
9850
|
s("div", Yr, [s("div", Xr, [s("div", Zr, [s("label", Qr, k(A(p)("TimeConfig.session")), 1), s("div", { class: g(["iccandle-time-config-section__select-wrap", j.value && "iccandle-time-config-section__select-wrap--open"]) }, [s("button", {
|
|
@@ -9856,40 +9856,40 @@ var et = (e, t) => {
|
|
|
9856
9856
|
"aria-expanded": j.value,
|
|
9857
9857
|
onClick: c[0] ||= () => {
|
|
9858
9858
|
if (j.value) {
|
|
9859
|
-
|
|
9859
|
+
Y();
|
|
9860
9860
|
return;
|
|
9861
9861
|
}
|
|
9862
|
-
|
|
9862
|
+
X(), j.value = !0;
|
|
9863
9863
|
}
|
|
9864
|
-
}, [s("span", ei, k(V
|
|
9864
|
+
}, [s("span", ei, k(ee(V.value) || A(p)("TimeConfig.selectSession")), 1)], 8, $r)], 2)]), s("div", ti, [s("label", ni, k(A(p)("TimeConfig.timezone")), 1), s("div", { class: g(["iccandle-time-config-section__select-wrap", O.value && "iccandle-time-config-section__select-wrap--open"]) }, [s("button", {
|
|
9865
9865
|
ref_key: "timezoneTriggerRef",
|
|
9866
9866
|
ref: b,
|
|
9867
9867
|
type: "button",
|
|
9868
9868
|
class: "iccandle-time-config-section__select-btn",
|
|
9869
9869
|
"aria-haspopup": "listbox",
|
|
9870
9870
|
"aria-expanded": O.value,
|
|
9871
|
-
disabled:
|
|
9871
|
+
disabled: V.value === "all_time",
|
|
9872
9872
|
onClick: c[1] ||= () => {
|
|
9873
9873
|
if (O.value) {
|
|
9874
|
-
|
|
9874
|
+
X();
|
|
9875
9875
|
return;
|
|
9876
9876
|
}
|
|
9877
|
-
|
|
9877
|
+
Y(), O.value = !0;
|
|
9878
9878
|
}
|
|
9879
9879
|
}, [s("span", ii, k(U.value), 1)], 8, ri)], 2)])]), s("div", ai, [s("div", oi, [s("label", si, k(A(p)("TimeConfig.startTime")), 1), s("input", {
|
|
9880
9880
|
type: "time",
|
|
9881
|
-
disabled:
|
|
9881
|
+
disabled: V.value !== "customize",
|
|
9882
9882
|
value: n.timeconfig?.start_time ?? "",
|
|
9883
9883
|
class: "iccandle-time-config-section__input",
|
|
9884
|
-
onInput: c[2] ||= (e) =>
|
|
9885
|
-
onClick:
|
|
9884
|
+
onInput: c[2] ||= (e) => te("start_time", e.target.value),
|
|
9885
|
+
onClick: ie
|
|
9886
9886
|
}, null, 40, ci)]), s("div", li, [s("label", ui, k(A(p)("TimeConfig.endTime")), 1), s("input", {
|
|
9887
9887
|
type: "time",
|
|
9888
|
-
disabled:
|
|
9888
|
+
disabled: V.value !== "customize",
|
|
9889
9889
|
value: n.timeconfig?.end_time ?? "",
|
|
9890
9890
|
class: "iccandle-time-config-section__input",
|
|
9891
|
-
onInput: c[3] ||= (e) =>
|
|
9892
|
-
onClick:
|
|
9891
|
+
onInput: c[3] ||= (e) => te("end_time", e.target.value),
|
|
9892
|
+
onClick: ie
|
|
9893
9893
|
}, null, 40, di)])])]),
|
|
9894
9894
|
(x(), i(t, { to: E.value }, [j.value && L.value ? (x(), o("div", {
|
|
9895
9895
|
key: 0,
|
|
@@ -9911,14 +9911,14 @@ var et = (e, t) => {
|
|
|
9911
9911
|
autofocus: ""
|
|
9912
9912
|
}, null, 8, pi), [[M, P.value]])]), s("ul", {
|
|
9913
9913
|
class: "iccandle-time-config-section__dropdown-list",
|
|
9914
|
-
style: _({ maxHeight: `${
|
|
9915
|
-
}, [s("li", mi, k(A(p)("TimeConfig.sessionsHeading")), 1),
|
|
9914
|
+
style: _({ maxHeight: `${ce.value}px` })
|
|
9915
|
+
}, [s("li", mi, k(A(p)("TimeConfig.sessionsHeading")), 1), G.value.length === 0 ? (x(), o("li", hi, k(A(p)("TimeConfig.noSessionFound")), 1)) : (x(!0), o(e, { key: 1 }, T(G.value, (e) => (x(), o("li", { key: e.value }, [s("button", {
|
|
9916
9916
|
type: "button",
|
|
9917
9917
|
role: "option",
|
|
9918
|
-
"aria-selected":
|
|
9919
|
-
class: g(["iccandle-time-config-section__dropdown-item",
|
|
9920
|
-
onClick: (t) =>
|
|
9921
|
-
}, [u(Bt, { "class-name": ["iccandle-time-config-section__check",
|
|
9918
|
+
"aria-selected": V.value === e.value,
|
|
9919
|
+
class: g(["iccandle-time-config-section__dropdown-item", V.value === e.value && "iccandle-time-config-section__dropdown-item--selected"]),
|
|
9920
|
+
onClick: (t) => ne(e.value)
|
|
9921
|
+
}, [u(Bt, { "class-name": ["iccandle-time-config-section__check", V.value === e.value && "iccandle-time-config-section__check--visible"].filter(Boolean).join(" ") }, null, 8, ["class-name"]), l(" " + k(ee(e.value)), 1)], 10, gi)]))), 128))], 4)], 6)) : a("", !0)], 8, ["to"])),
|
|
9922
9922
|
(x(), i(t, { to: E.value }, [O.value && R.value ? (x(), o("div", {
|
|
9923
9923
|
key: 0,
|
|
9924
9924
|
ref_key: "timezonePopoverRef",
|
|
@@ -9942,13 +9942,13 @@ var et = (e, t) => {
|
|
|
9942
9942
|
}, null, 8, xi), [[M, I.value]])]),
|
|
9943
9943
|
s("ul", {
|
|
9944
9944
|
class: "iccandle-time-config-section__dropdown-list",
|
|
9945
|
-
style: _({ maxHeight: `${
|
|
9946
|
-
}, [s("li", Si, k(A(p)("TimeConfig.timezonesHeading")), 1),
|
|
9945
|
+
style: _({ maxHeight: `${le.value}px` })
|
|
9946
|
+
}, [s("li", Si, k(A(p)("TimeConfig.timezonesHeading")), 1), K.value.length === 0 ? (x(), o("li", Ci, k(A(p)("TimeConfig.noTimezoneFound")), 1)) : (x(!0), o(e, { key: 1 }, T(K.value, (e) => (x(), o("li", { key: e }, [s("button", {
|
|
9947
9947
|
type: "button",
|
|
9948
9948
|
role: "option",
|
|
9949
9949
|
"aria-selected": H.value === e,
|
|
9950
9950
|
class: g(["iccandle-time-config-section__dropdown-item", H.value === e && "iccandle-time-config-section__dropdown-item--selected"]),
|
|
9951
|
-
onClick: (t) =>
|
|
9951
|
+
onClick: (t) => re(e)
|
|
9952
9952
|
}, [u(Bt, { "class-name": ["iccandle-time-config-section__check", H.value === e && "iccandle-time-config-section__check--visible"].filter(Boolean).join(" ") }, null, 8, ["class-name"]), l(" " + k(e), 1)], 10, wi)]))), 128))], 4)
|
|
9953
9953
|
], 6)) : a("", !0)], 8, ["to"]))
|
|
9954
9954
|
], 2));
|
|
@@ -9967,7 +9967,7 @@ var et = (e, t) => {
|
|
|
9967
9967
|
errorMessage: {}
|
|
9968
9968
|
},
|
|
9969
9969
|
setup(e) {
|
|
9970
|
-
let t = e, { t: n } =
|
|
9970
|
+
let t = e, { t: n } = Z(), i = w(null), c = r(() => n("Pattern.signalDialog.selectOneTimeframe")), l = r(() => n("Pattern.signalDialog.selectOneSymbol")), d = r(() => i.value === c.value && (t.form.timeframes?.length ?? 0) > 0 || i.value === l.value && (t.form.symbols?.length ?? 0) > 0 ? null : i.value), f = r(() => d.value || t.errorMessage);
|
|
9971
9971
|
N(() => t.form.timeframes?.length ?? 0, (e) => {
|
|
9972
9972
|
e > 0 && i.value === c.value && (i.value = null);
|
|
9973
9973
|
}), N(() => t.form.symbols?.length ?? 0, (e) => {
|
|
@@ -10039,12 +10039,12 @@ async function Vi(e) {
|
|
|
10039
10039
|
//#region src/lib/find-error-message.ts
|
|
10040
10040
|
var Hi = (e) => {
|
|
10041
10041
|
if (typeof e == "string") return e;
|
|
10042
|
-
if (typeof e != "object" || !e) return
|
|
10042
|
+
if (typeof e != "object" || !e) return z;
|
|
10043
10043
|
for (let t in e) if (Object.prototype.hasOwnProperty.call(e, t)) {
|
|
10044
10044
|
let n = Hi(e[t]);
|
|
10045
10045
|
if (n) return n;
|
|
10046
10046
|
}
|
|
10047
|
-
return
|
|
10047
|
+
return z;
|
|
10048
10048
|
}, Ui = (e) => R(e) ? Hi(e.response?.data) : e.message, Wi = ["aria-label"], Gi = /* @__PURE__ */ d({
|
|
10049
10049
|
__name: "PatternTrackerSubscriptionModal",
|
|
10050
10050
|
props: {
|
|
@@ -10064,7 +10064,7 @@ var Hi = (e) => {
|
|
|
10064
10064
|
function l(e) {
|
|
10065
10065
|
r.onOpenChange?.(e), c("update:open", e);
|
|
10066
10066
|
}
|
|
10067
|
-
let { t: u } =
|
|
10067
|
+
let { t: u } = Z(), d = w(""), f = w(!1), p = w(null), m = w(!1), h = C({
|
|
10068
10068
|
timeframes: [],
|
|
10069
10069
|
symbols: []
|
|
10070
10070
|
});
|
|
@@ -10127,14 +10127,14 @@ var Hi = (e) => {
|
|
|
10127
10127
|
};
|
|
10128
10128
|
m.value = !0;
|
|
10129
10129
|
try {
|
|
10130
|
-
await Vi(a),
|
|
10130
|
+
await Vi(a), Y({
|
|
10131
10131
|
title: u("Pattern.patternSubscribed"),
|
|
10132
10132
|
description: u("Pattern.patternSubscribedDesc", { name: d.value }),
|
|
10133
10133
|
variant: "success"
|
|
10134
10134
|
}), l(!1);
|
|
10135
10135
|
} catch (e) {
|
|
10136
10136
|
let t = Ui(e);
|
|
10137
|
-
p.value = t,
|
|
10137
|
+
p.value = t, Y({
|
|
10138
10138
|
title: u("Pattern.patternSubscriptionError"),
|
|
10139
10139
|
description: t,
|
|
10140
10140
|
variant: "error"
|
|
@@ -10196,7 +10196,7 @@ var Hi = (e) => {
|
|
|
10196
10196
|
},
|
|
10197
10197
|
emits: ["close", "goToEventDetail"],
|
|
10198
10198
|
setup(e, { emit: t }) {
|
|
10199
|
-
let n = e, r = t, { t: i, language: c } =
|
|
10199
|
+
let n = e, r = t, { t: i, language: c } = Z(), l = w(null), d = w(null);
|
|
10200
10200
|
function f(e, t) {
|
|
10201
10201
|
try {
|
|
10202
10202
|
return new Intl.DateTimeFormat(t, {
|
|
@@ -10402,11 +10402,11 @@ var Hi = (e) => {
|
|
|
10402
10402
|
}
|
|
10403
10403
|
});
|
|
10404
10404
|
function c() {
|
|
10405
|
-
t.toast.action?.onClick(),
|
|
10405
|
+
t.toast.action?.onClick(), J(t.toast.id);
|
|
10406
10406
|
}
|
|
10407
10407
|
function l() {
|
|
10408
10408
|
let e = t.toast.dismiss;
|
|
10409
|
-
e && typeof e == "object" && e.onClick?.(),
|
|
10409
|
+
e && typeof e == "object" && e.onClick?.(), J(t.toast.id);
|
|
10410
10410
|
}
|
|
10411
10411
|
return (t, r) => (x(), o("div", ba, [s("div", xa, [(x(), i(D(n.value), { class: "custom-toast__icon" }))]), s("div", Sa, [
|
|
10412
10412
|
s("div", Ca, [s("p", wa, k(e.toast.title), 1)]),
|
|
@@ -10446,7 +10446,7 @@ var Hi = (e) => {
|
|
|
10446
10446
|
tag: "div",
|
|
10447
10447
|
class: "iccandle-toast-list"
|
|
10448
10448
|
}, {
|
|
10449
|
-
default: P(() => [(x(!0), o(e, null, T(A(
|
|
10449
|
+
default: P(() => [(x(!0), o(e, null, T(A(q), (e) => (x(), i(Da, {
|
|
10450
10450
|
key: e.id,
|
|
10451
10451
|
toast: e
|
|
10452
10452
|
}, null, 8, ["toast"]))), 128))]),
|
|
@@ -10509,7 +10509,7 @@ function Pa(e, t) {
|
|
|
10509
10509
|
setTimeout(() => {
|
|
10510
10510
|
c?.clearMarks(2), e(!0);
|
|
10511
10511
|
}, 150);
|
|
10512
|
-
}), localStorage.setItem(
|
|
10512
|
+
}), localStorage.setItem(ee, JSON.stringify(a)), c?.refreshMarks();
|
|
10513
10513
|
try {
|
|
10514
10514
|
if (t.current && t.current.length > 0 && (t.current.forEach((e) => {
|
|
10515
10515
|
try {
|
|
@@ -11210,7 +11210,7 @@ var jo = (e, t) => {
|
|
|
11210
11210
|
}
|
|
11211
11211
|
}, Mo = (e) => {
|
|
11212
11212
|
try {
|
|
11213
|
-
localStorage.removeItem(
|
|
11213
|
+
localStorage.removeItem(V);
|
|
11214
11214
|
} catch {}
|
|
11215
11215
|
try {
|
|
11216
11216
|
let t = e?.activeChart?.();
|
|
@@ -11219,7 +11219,7 @@ var jo = (e, t) => {
|
|
|
11219
11219
|
} catch {}
|
|
11220
11220
|
}, No = (e, t) => {
|
|
11221
11221
|
try {
|
|
11222
|
-
localStorage.setItem(
|
|
11222
|
+
localStorage.setItem(V, JSON.stringify(t));
|
|
11223
11223
|
} catch {}
|
|
11224
11224
|
try {
|
|
11225
11225
|
(e?.activeChart?.())?.refreshMarks();
|
|
@@ -11509,35 +11509,15 @@ function Wo(e, t, n, r, i, a, o) {
|
|
|
11509
11509
|
});
|
|
11510
11510
|
}
|
|
11511
11511
|
//#endregion
|
|
11512
|
-
//#region src/tradingview/
|
|
11513
|
-
var Go =
|
|
11514
|
-
let t = e?.contentWindow;
|
|
11515
|
-
if (!t || !e?.src) return;
|
|
11516
|
-
let n = new URL(e.src).origin;
|
|
11517
|
-
if (t.postMessage(JSON.stringify({
|
|
11518
|
-
type: "parent-origin",
|
|
11519
|
-
origin: window.location.origin
|
|
11520
|
-
}), n), new URLSearchParams(window.location.search).get("payment") === "success") {
|
|
11521
|
-
let e = () => t.postMessage(JSON.stringify({ type: "payment-success" }), n);
|
|
11522
|
-
[
|
|
11523
|
-
0,
|
|
11524
|
-
600,
|
|
11525
|
-
1500
|
|
11526
|
-
].forEach((t) => window.setTimeout(e, t));
|
|
11527
|
-
let r = new URL(window.location.href);
|
|
11528
|
-
[
|
|
11529
|
-
"payment",
|
|
11530
|
-
"session_id",
|
|
11531
|
-
"lookup_key"
|
|
11532
|
-
].forEach((e) => r.searchParams.delete(e)), window.history.replaceState({}, "", r);
|
|
11533
|
-
}
|
|
11534
|
-
}, Ko = ["lang"], qo = {
|
|
11512
|
+
//#region src/tradingview/WidgetIccandle.vue?vue&type=script&setup=true&lang.ts
|
|
11513
|
+
var Go = ["lang"], Ko = {
|
|
11535
11514
|
key: 4,
|
|
11536
11515
|
class: "iccandle-selector-widget__overlay"
|
|
11537
|
-
},
|
|
11516
|
+
}, qo = /* @__PURE__ */ d({
|
|
11538
11517
|
__name: "WidgetIccandle",
|
|
11539
11518
|
props: {
|
|
11540
11519
|
chartWidget: {},
|
|
11520
|
+
submitCallback: {},
|
|
11541
11521
|
theme: { default: "light" },
|
|
11542
11522
|
language: {},
|
|
11543
11523
|
onCloseResult: {},
|
|
@@ -11548,9 +11528,6 @@ var Go = (e) => {
|
|
|
11548
11528
|
},
|
|
11549
11529
|
setup(e, { expose: t }) {
|
|
11550
11530
|
function n(e) {
|
|
11551
|
-
return Math.min(Zo, Math.max(Xo, e));
|
|
11552
|
-
}
|
|
11553
|
-
function c(e) {
|
|
11554
11531
|
return {
|
|
11555
11532
|
o: e[1],
|
|
11556
11533
|
h: e[2],
|
|
@@ -11559,7 +11536,7 @@ var Go = (e) => {
|
|
|
11559
11536
|
timestamp: e[0]
|
|
11560
11537
|
};
|
|
11561
11538
|
}
|
|
11562
|
-
function
|
|
11539
|
+
function s(e) {
|
|
11563
11540
|
try {
|
|
11564
11541
|
let t = JSON.parse(localStorage.getItem("tv:clicked-news-event") || "null");
|
|
11565
11542
|
if (t && String(t.id) === String(e)) return t;
|
|
@@ -11570,32 +11547,30 @@ var Go = (e) => {
|
|
|
11570
11547
|
return null;
|
|
11571
11548
|
}
|
|
11572
11549
|
}
|
|
11573
|
-
function
|
|
11550
|
+
function c(e) {
|
|
11574
11551
|
return !(!e?.event_name || !e.currency || e.event_name === "Holiday" || e.status === "early");
|
|
11575
11552
|
}
|
|
11576
|
-
let
|
|
11577
|
-
|
|
11578
|
-
let
|
|
11553
|
+
let l = e, d = r(() => te(l.language));
|
|
11554
|
+
se(d);
|
|
11555
|
+
let f = {
|
|
11579
11556
|
highlightBarsRef: { current: [] },
|
|
11580
11557
|
generatedCandlesBackgroundStudyIdRef: { current: null },
|
|
11581
11558
|
generatedCandlesStudyIdRef: { current: null }
|
|
11582
11559
|
};
|
|
11583
|
-
t({ chartRefs:
|
|
11584
|
-
let
|
|
11585
|
-
N(
|
|
11586
|
-
|
|
11560
|
+
t({ chartRefs: f });
|
|
11561
|
+
let p = { current: null }, m = { current: null }, h = { current: !1 }, y = w(null), S = { current: [] }, C = w(null), T = qa(), D = w(!1), k = w(null), A = w(!1), j = w(null), M = w(null), P = w(!0), F = () => C.value && getComputedStyle(C.value).getPropertyValue("--iccandle-primary").trim() || void 0, I = { current: F };
|
|
11562
|
+
N(C, () => {
|
|
11563
|
+
I.current = F;
|
|
11587
11564
|
}, { immediate: !0 });
|
|
11588
|
-
let
|
|
11589
|
-
ae.value !== e && (ae.value = e);
|
|
11590
|
-
}, ce = r(() => ({ zIndex: 9999999999 })), K = w(!1), q = w(!1), J = w(!1), Y = w(25), X = w([]), ue = w(null), de = w(!1), fe = w("60"), pe = w(Ma.interval || "60"), Z = w(""), me = () => {
|
|
11565
|
+
let L = r(() => l.theme === "system" ? window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : l.theme), R = r(() => ({ zIndex: 9999999999 })), z = w(!1), H = w(!1), U = w(!1), W = w(25), G = w([]), K = w(null), q = w(!1), J = w("60"), Y = w(Ma.interval || "60"), X = w(""), ne = () => {
|
|
11591
11566
|
try {
|
|
11592
|
-
let e =
|
|
11567
|
+
let e = l.chartWidget?.activeChart?.();
|
|
11593
11568
|
if (e) {
|
|
11594
|
-
if (
|
|
11569
|
+
if (p.current) {
|
|
11595
11570
|
try {
|
|
11596
|
-
e.removeEntity(
|
|
11571
|
+
e.removeEntity(p.current);
|
|
11597
11572
|
} catch {}
|
|
11598
|
-
|
|
11573
|
+
p.current = null;
|
|
11599
11574
|
}
|
|
11600
11575
|
e.getAllShapes().filter((e) => e.name === "date_range").forEach((t) => {
|
|
11601
11576
|
try {
|
|
@@ -11604,46 +11579,34 @@ var Go = (e) => {
|
|
|
11604
11579
|
});
|
|
11605
11580
|
}
|
|
11606
11581
|
} catch {}
|
|
11607
|
-
|
|
11608
|
-
},
|
|
11609
|
-
|
|
11610
|
-
},
|
|
11611
|
-
|
|
11612
|
-
},
|
|
11582
|
+
U.value = !1, G.value = [], T.setTargetCandles([]);
|
|
11583
|
+
}, re = (e) => {
|
|
11584
|
+
P.value = e !== "/news", e === "/news" && ne(), k.value?.length && (T.setPlayEndTimestamp(null), T.setGapCount(0), k.value = null, no(!1), Ro(ye.value));
|
|
11585
|
+
}, ie = () => {
|
|
11586
|
+
H.value = !0;
|
|
11587
|
+
}, ae = () => {
|
|
11588
|
+
H.value = !1;
|
|
11589
|
+
}, oe = () => {
|
|
11590
|
+
T.setPlayEndTimestamp(null), T.setGapCount(0);
|
|
11591
|
+
let e = !!k.value?.length;
|
|
11592
|
+
k.value = null, no(!1), e && Ro(ye.value), y.value?.();
|
|
11593
|
+
}, Z = () => {
|
|
11594
|
+
K.value = "settings";
|
|
11595
|
+
}, ce = () => {
|
|
11596
|
+
K.value = "scan";
|
|
11597
|
+
}, le = () => {
|
|
11598
|
+
K.value = null;
|
|
11599
|
+
}, ue = () => {
|
|
11613
11600
|
q.value = !1;
|
|
11614
|
-
},
|
|
11615
|
-
|
|
11616
|
-
|
|
11617
|
-
|
|
11618
|
-
},
|
|
11619
|
-
|
|
11620
|
-
|
|
11621
|
-
|
|
11622
|
-
|
|
11623
|
-
M.current && (M.current = !1, I.value = !1, e.currentTarget?.releasePointerCapture(e.pointerId));
|
|
11624
|
-
}, xe = () => {
|
|
11625
|
-
R.setPlayEndTimestamp(null), R.setGapCount(0);
|
|
11626
|
-
let e = !!H.value?.length;
|
|
11627
|
-
H.value = null, no(!1), e && Ro(Ie.value), T.value?.();
|
|
11628
|
-
}, Se = () => {
|
|
11629
|
-
ue.value = "settings";
|
|
11630
|
-
}, Ce = () => {
|
|
11631
|
-
ue.value = "scan";
|
|
11632
|
-
}, we = () => {
|
|
11633
|
-
ue.value = null;
|
|
11634
|
-
}, Te = () => {
|
|
11635
|
-
de.value = !1;
|
|
11636
|
-
}, Ee = () => {
|
|
11637
|
-
de.value = !0;
|
|
11638
|
-
}, De = () => {
|
|
11639
|
-
U.value = !1, W.value = null, te.value = null;
|
|
11640
|
-
}, Oe = () => {
|
|
11641
|
-
K.value = !0;
|
|
11642
|
-
}, ke = w(null), Ae = () => {
|
|
11643
|
-
Go(ke.value);
|
|
11644
|
-
}, je = (e) => {
|
|
11645
|
-
let t = e.default_symbol || Z.value, n = G.value === "dark" ? "dark" : "light", r = Ie.value;
|
|
11646
|
-
ne.value = !1, me(), H.value = null, R.setPlayEndTimestamp(null);
|
|
11601
|
+
}, de = () => {
|
|
11602
|
+
q.value = !0;
|
|
11603
|
+
}, fe = () => {
|
|
11604
|
+
A.value = !1, j.value = null, M.value = null;
|
|
11605
|
+
}, pe = () => {
|
|
11606
|
+
z.value = !0;
|
|
11607
|
+
}, me = (e) => {
|
|
11608
|
+
let t = e.default_symbol || X.value, n = L.value === "dark" ? "dark" : "light", r = ye.value;
|
|
11609
|
+
P.value = !1, ne(), k.value = null, T.setPlayEndTimestamp(null);
|
|
11647
11610
|
let i = {
|
|
11648
11611
|
id: e.id,
|
|
11649
11612
|
event_name: e.event_name,
|
|
@@ -11657,44 +11620,44 @@ var Go = (e) => {
|
|
|
11657
11620
|
status: e.status
|
|
11658
11621
|
};
|
|
11659
11622
|
try {
|
|
11660
|
-
localStorage.setItem(
|
|
11623
|
+
localStorage.setItem(V, JSON.stringify(i));
|
|
11661
11624
|
} catch {}
|
|
11662
11625
|
try {
|
|
11663
11626
|
r?.activeChart?.()?.refreshMarks();
|
|
11664
11627
|
} catch {}
|
|
11665
11628
|
(async () => {
|
|
11666
11629
|
await Lo(r, e.timestamp, {
|
|
11667
|
-
lastEntity:
|
|
11668
|
-
applyingPatternRef:
|
|
11630
|
+
lastEntity: p,
|
|
11631
|
+
applyingPatternRef: h,
|
|
11669
11632
|
setHasActiveShape: (e) => {
|
|
11670
|
-
|
|
11633
|
+
U.value = e;
|
|
11671
11634
|
},
|
|
11672
11635
|
setCandles: (e) => {
|
|
11673
|
-
|
|
11636
|
+
G.value = e;
|
|
11674
11637
|
},
|
|
11675
11638
|
setWindowSize: (e) => {
|
|
11676
|
-
|
|
11639
|
+
W.value = e;
|
|
11677
11640
|
},
|
|
11678
11641
|
setSymbol: (e) => {
|
|
11679
|
-
|
|
11642
|
+
X.value = e;
|
|
11680
11643
|
},
|
|
11681
11644
|
setResolution: (e) => {
|
|
11682
|
-
|
|
11645
|
+
Y.value = e;
|
|
11683
11646
|
},
|
|
11684
11647
|
setTimeframe: (e) => {
|
|
11685
|
-
|
|
11648
|
+
J.value = e;
|
|
11686
11649
|
},
|
|
11687
11650
|
setTargetCandles: (e) => {
|
|
11688
|
-
|
|
11651
|
+
T.setTargetCandles(e);
|
|
11689
11652
|
},
|
|
11690
11653
|
clearSelectedCandles: () => {
|
|
11691
|
-
|
|
11654
|
+
k.value = null;
|
|
11692
11655
|
}
|
|
11693
|
-
}), await Fo(r, e.timestamp,
|
|
11694
|
-
})(),
|
|
11695
|
-
},
|
|
11656
|
+
}), await Fo(r, e.timestamp, m);
|
|
11657
|
+
})(), l.submitCallback(`${B}/${d.value}/news/similar-events/${e.id}?symbol=${encodeURIComponent(t)}&theme=${n}`);
|
|
11658
|
+
}, he = (e) => {
|
|
11696
11659
|
if (!e) return;
|
|
11697
|
-
let t =
|
|
11660
|
+
let t = ye.value;
|
|
11698
11661
|
if (!t) return;
|
|
11699
11662
|
let n;
|
|
11700
11663
|
try {
|
|
@@ -11706,72 +11669,72 @@ var Go = (e) => {
|
|
|
11706
11669
|
if (!n) return;
|
|
11707
11670
|
let r = n.getTimeScale(), i = n.getVisibleRange();
|
|
11708
11671
|
if (!i?.from || !i?.to) return;
|
|
11709
|
-
let a =
|
|
11672
|
+
let a = C.value?.firstElementChild || C.value;
|
|
11710
11673
|
if (!a) return;
|
|
11711
|
-
let o = a.getBoundingClientRect(),
|
|
11712
|
-
let t = 0, n =
|
|
11674
|
+
let o = a.getBoundingClientRect(), l = r.width(), u = (e) => {
|
|
11675
|
+
let t = 0, n = l, a = l / 2;
|
|
11713
11676
|
for (let o = 0; o < 30; o++) {
|
|
11714
|
-
let o = (t + n) / 2,
|
|
11715
|
-
if (
|
|
11677
|
+
let o = (t + n) / 2, s = r.coordinateToTime(o);
|
|
11678
|
+
if (s === null) {
|
|
11716
11679
|
let t = (e - i.from) / (i.to - i.from);
|
|
11717
|
-
a = Math.max(0, Math.min(
|
|
11680
|
+
a = Math.max(0, Math.min(l, t * l));
|
|
11718
11681
|
break;
|
|
11719
11682
|
}
|
|
11720
|
-
let
|
|
11721
|
-
if (Math.abs(
|
|
11683
|
+
let c = s - e;
|
|
11684
|
+
if (Math.abs(c) < .1) {
|
|
11722
11685
|
a = o;
|
|
11723
11686
|
break;
|
|
11724
11687
|
}
|
|
11725
|
-
|
|
11688
|
+
c > 0 ? n = o : t = o, a = o;
|
|
11726
11689
|
}
|
|
11727
11690
|
return {
|
|
11728
11691
|
x: o.left + a + 53,
|
|
11729
11692
|
y: o.bottom - 103
|
|
11730
11693
|
};
|
|
11731
|
-
},
|
|
11732
|
-
if (!d
|
|
11733
|
-
let f =
|
|
11734
|
-
m && (
|
|
11735
|
-
},
|
|
11736
|
-
|
|
11737
|
-
},
|
|
11738
|
-
e === "1" || e === "5" ?
|
|
11739
|
-
},
|
|
11740
|
-
|
|
11741
|
-
},
|
|
11742
|
-
N(() =>
|
|
11743
|
-
|
|
11744
|
-
}), N(
|
|
11745
|
-
let t,
|
|
11694
|
+
}, d = s(e);
|
|
11695
|
+
if (!c(d)) return;
|
|
11696
|
+
let f = d.timestamp ? d.timestamp / 1e3 : null, p = i.to - i.from, m = u(f ?? i.from + p * .5);
|
|
11697
|
+
m && (M.value = m), j.value = d, A.value = !0;
|
|
11698
|
+
}, ge = () => {
|
|
11699
|
+
h.current || (p.current = null, U.value = !1);
|
|
11700
|
+
}, _e = (e) => {
|
|
11701
|
+
e === "1" || e === "5" ? J.value = "60" : J.value = e, Y.value = e, ge();
|
|
11702
|
+
}, ve = (e) => {
|
|
11703
|
+
X.value = e.library_custom_fields?.ticker || e.ticker || e.name || e.base_name + "" || "", ge();
|
|
11704
|
+
}, ye = O(l.chartWidget);
|
|
11705
|
+
N(() => l.chartWidget, (e) => {
|
|
11706
|
+
ye.value = e;
|
|
11707
|
+
}), N(ye, (e) => {
|
|
11708
|
+
let t, r, i;
|
|
11746
11709
|
b(() => {
|
|
11747
|
-
|
|
11710
|
+
U.value = !1, p.current = null, y.value = null;
|
|
11748
11711
|
try {
|
|
11749
|
-
if (
|
|
11712
|
+
if (r && clearTimeout(r), e) {
|
|
11750
11713
|
let n = e.activeChart();
|
|
11751
|
-
n && (
|
|
11714
|
+
n && (i && n.onVisibleRangeChanged().unsubscribe(null, i), n.onIntervalChanged().unsubscribe(null, _e), n.onSymbolChanged().unsubscribe(null, ve)), t && e.unsubscribe("drawing_event", t);
|
|
11752
11715
|
}
|
|
11753
11716
|
} catch (e) {
|
|
11754
11717
|
console.log(e);
|
|
11755
11718
|
}
|
|
11756
11719
|
}), e && e.onChartReady(() => {
|
|
11757
|
-
let
|
|
11758
|
-
if (
|
|
11759
|
-
let
|
|
11760
|
-
|
|
11761
|
-
let
|
|
11762
|
-
|
|
11763
|
-
let
|
|
11764
|
-
if (((
|
|
11765
|
-
|
|
11720
|
+
let a = e.activeChart();
|
|
11721
|
+
if (a) {
|
|
11722
|
+
let o = a.resolution();
|
|
11723
|
+
J.value = o, Y.value = o;
|
|
11724
|
+
let s = Q?.find((e) => e.display_name === a.symbol());
|
|
11725
|
+
X.value = s?.ticker || a.symbol();
|
|
11726
|
+
let c = async (e, t) => {
|
|
11727
|
+
if (((a?.getAllShapes())?.filter((e) => e.name === "date_range"))?.forEach((e) => {
|
|
11728
|
+
a?.removeEntity(e.id);
|
|
11766
11729
|
}), t) {
|
|
11767
|
-
let { data:
|
|
11768
|
-
|
|
11769
|
-
let
|
|
11770
|
-
|
|
11771
|
-
let u =
|
|
11730
|
+
let { data: r } = await a.exportData(), i = r.findIndex((e) => e[0] === t);
|
|
11731
|
+
i === -1 && (i = r.length - 1);
|
|
11732
|
+
let o = r.findIndex((t) => t[0] === e), s = Math.floor((o + i) / 2), c = r.slice(s - 13, s + 12), l = r.slice(s + 12 - 49, s + 12);
|
|
11733
|
+
W.value = c.length, G.value = c.map(n), T.setTargetCandles(l.map(n)), U.value = !0;
|
|
11734
|
+
let u = c[0], d = c[c.length - 1];
|
|
11772
11735
|
if (!u || !d) return;
|
|
11773
|
-
if (
|
|
11774
|
-
let e =
|
|
11736
|
+
if (p.current = await a.createMultipointShape([{ time: u[0] }, { time: d[0] }], Aa(I.current())), p.current) {
|
|
11737
|
+
let e = a.getShapeById(p.current);
|
|
11775
11738
|
e && e.setSavingEnabled && (e.setProperties({ customText: {
|
|
11776
11739
|
visible: !0,
|
|
11777
11740
|
text: ja
|
|
@@ -11779,281 +11742,261 @@ var Go = (e) => {
|
|
|
11779
11742
|
}
|
|
11780
11743
|
}
|
|
11781
11744
|
};
|
|
11782
|
-
t = $e(async (t,
|
|
11783
|
-
if (!
|
|
11784
|
-
let e =
|
|
11745
|
+
t = $e(async (t, r) => {
|
|
11746
|
+
if (!h.current && (r === "remove" && (p.current === t && (p.current = null), U.value = !1), r === "points_changed" && a.getAllShapes().filter((e) => e.name === "date_range").some((e) => e.id === t) && e)) {
|
|
11747
|
+
let e = a.getShapeById(t);
|
|
11785
11748
|
if (!e) return;
|
|
11786
|
-
let
|
|
11787
|
-
|
|
11788
|
-
let u =
|
|
11789
|
-
u > tt.max ? (u = Math.round(u / 10) * 10 - 1, u > tt.custom[tt.custom.length - 1] && (u = tt.custom[tt.custom.length - 1] - 1)) : u <= tt.min && (u = tt.min - 1),
|
|
11790
|
-
|
|
11749
|
+
let r = e.getPoints(), i = r[0].time, o = r[1].time, { data: s } = await a.exportData(), c = s.findIndex((e) => e[0] === o), l = s.findIndex((e) => e[0] === i);
|
|
11750
|
+
c === -1 && (c = s.length - 2, l = s.length - 1 - 25);
|
|
11751
|
+
let u = s.slice(l, c + 1).length - 1;
|
|
11752
|
+
u > tt.max ? (u = Math.round(u / 10) * 10 - 1, u > tt.custom[tt.custom.length - 1] && (u = tt.custom[tt.custom.length - 1] - 1)) : u <= tt.min && (u = tt.min - 1), p.current && a.removeEntity(p.current), a.getAllShapes().filter((e) => e.name === "date_range").forEach((e) => {
|
|
11753
|
+
a.removeEntity(e.id);
|
|
11791
11754
|
});
|
|
11792
|
-
let d =
|
|
11793
|
-
if (!
|
|
11794
|
-
if (
|
|
11795
|
-
let e =
|
|
11755
|
+
let d = s.slice(c - u, c + 1), f = s.slice(c - 49, c + 1), m = d[0], h = d[d.length - 1];
|
|
11756
|
+
if (!m || !h) return;
|
|
11757
|
+
if (p.current = await a.createMultipointShape([{ time: m[0] }, { time: h[0] }], Aa(I.current())), W.value = d.length, G.value = d.map(n), T.setTargetCandles(f.map(n)), U.value = !0, p.current) {
|
|
11758
|
+
let e = a.getShapeById(p.current);
|
|
11796
11759
|
e && e.setSavingEnabled && (e.setProperties({ customText: {
|
|
11797
11760
|
visible: !0,
|
|
11798
11761
|
text: ja
|
|
11799
11762
|
} }), e.setSavingEnabled(!1));
|
|
11800
11763
|
}
|
|
11801
11764
|
}
|
|
11802
|
-
}, 500),
|
|
11803
|
-
|
|
11804
|
-
let e =
|
|
11805
|
-
e?.from && e?.to &&
|
|
11765
|
+
}, 500), y.value = () => {
|
|
11766
|
+
U.value = !0;
|
|
11767
|
+
let e = a.getVisibleRange();
|
|
11768
|
+
e?.from && e?.to && c(e.from, e.to);
|
|
11806
11769
|
};
|
|
11807
11770
|
let l = (e) => {
|
|
11808
|
-
if (!
|
|
11771
|
+
if (!p.current || !e) return !1;
|
|
11809
11772
|
try {
|
|
11810
|
-
let t =
|
|
11773
|
+
let t = a?.getShapeById(p.current);
|
|
11811
11774
|
if (!t) return !1;
|
|
11812
11775
|
let n = t.getPoints();
|
|
11813
11776
|
if (n.length === 0) return !1;
|
|
11814
11777
|
let r = n.map((e) => e.time).filter((e) => typeof e == "number");
|
|
11815
11778
|
if (r.length === 0) return !1;
|
|
11816
|
-
let
|
|
11817
|
-
return Math.max(...r) < e.from ||
|
|
11779
|
+
let i = Math.min(...r);
|
|
11780
|
+
return Math.max(...r) < e.from || i > e.to;
|
|
11818
11781
|
} catch {
|
|
11819
11782
|
return !1;
|
|
11820
11783
|
}
|
|
11821
11784
|
};
|
|
11822
|
-
|
|
11823
|
-
|
|
11824
|
-
l(e) ?
|
|
11785
|
+
i = (e) => {
|
|
11786
|
+
r && clearTimeout(r), r = setTimeout(() => {
|
|
11787
|
+
l(e) ? U.value = !1 : p.current && (U.value = !0);
|
|
11825
11788
|
}, 150);
|
|
11826
|
-
},
|
|
11789
|
+
}, a.onIntervalChanged().subscribe(null, _e), a.onSymbolChanged().subscribe(null, ve), a.onVisibleRangeChanged().subscribe(null, i), e.subscribe?.("drawing_event", t);
|
|
11827
11790
|
}
|
|
11828
11791
|
});
|
|
11829
11792
|
}, { immediate: !0 });
|
|
11830
|
-
let
|
|
11831
|
-
Pa(
|
|
11832
|
-
let
|
|
11833
|
-
lastEntity:
|
|
11834
|
-
applyingPatternRef:
|
|
11793
|
+
let be = r(() => G.value[G.value.length - 1]?.timestamp ?? null);
|
|
11794
|
+
Pa(ye, S);
|
|
11795
|
+
let xe = {
|
|
11796
|
+
lastEntity: p,
|
|
11797
|
+
applyingPatternRef: h,
|
|
11835
11798
|
setHasActiveShape: (e) => {
|
|
11836
|
-
|
|
11799
|
+
U.value = e;
|
|
11837
11800
|
},
|
|
11838
11801
|
setCandles: (e) => {
|
|
11839
|
-
|
|
11802
|
+
G.value = e;
|
|
11840
11803
|
},
|
|
11841
11804
|
setWindowSize: (e) => {
|
|
11842
|
-
|
|
11805
|
+
W.value = e;
|
|
11843
11806
|
},
|
|
11844
11807
|
setSymbol: (e) => {
|
|
11845
|
-
|
|
11808
|
+
X.value = e;
|
|
11846
11809
|
},
|
|
11847
11810
|
setResolution: (e) => {
|
|
11848
|
-
|
|
11811
|
+
Y.value = e;
|
|
11849
11812
|
},
|
|
11850
11813
|
setTimeframe: (e) => {
|
|
11851
|
-
|
|
11814
|
+
J.value = e;
|
|
11852
11815
|
},
|
|
11853
11816
|
setTargetCandles: (e) => {
|
|
11854
|
-
|
|
11817
|
+
T.setTargetCandles(e);
|
|
11855
11818
|
},
|
|
11856
11819
|
clearSelectedCandles: () => {
|
|
11857
|
-
|
|
11820
|
+
k.value = null;
|
|
11858
11821
|
}
|
|
11859
11822
|
};
|
|
11860
|
-
Wo(
|
|
11861
|
-
|
|
11862
|
-
},
|
|
11863
|
-
|
|
11864
|
-
},
|
|
11823
|
+
Wo(ye, (e) => {
|
|
11824
|
+
k.value = e;
|
|
11825
|
+
}, be, (e) => {
|
|
11826
|
+
D.value = e;
|
|
11827
|
+
}, l.onCloseResult, xe, re), N(ye, (e) => {
|
|
11865
11828
|
if (!e) return;
|
|
11866
11829
|
let t = !1;
|
|
11867
11830
|
b(() => {
|
|
11868
11831
|
t = !0;
|
|
11869
11832
|
try {
|
|
11870
|
-
e.unsubscribe("onTimescaleMarkClick",
|
|
11833
|
+
e.unsubscribe("onTimescaleMarkClick", he);
|
|
11871
11834
|
} catch {}
|
|
11872
11835
|
}), e.onChartReady(async () => {
|
|
11873
11836
|
if (!t) {
|
|
11874
11837
|
try {
|
|
11875
|
-
await Do(e.activeChart(),
|
|
11838
|
+
await Do(e.activeChart(), f, L.value);
|
|
11876
11839
|
} catch (e) {
|
|
11877
11840
|
console.error("Failed to create generated candle studies:", e);
|
|
11878
11841
|
}
|
|
11879
11842
|
try {
|
|
11880
|
-
e.subscribe("onTimescaleMarkClick",
|
|
11843
|
+
e.subscribe("onTimescaleMarkClick", he);
|
|
11881
11844
|
} catch {}
|
|
11882
11845
|
}
|
|
11883
11846
|
});
|
|
11884
|
-
}, { immediate: !0 }), N(
|
|
11885
|
-
let t =
|
|
11847
|
+
}, { immediate: !0 }), N(L, (e) => {
|
|
11848
|
+
let t = ye.value;
|
|
11886
11849
|
if (t) try {
|
|
11887
11850
|
t.onChartReady(() => {
|
|
11888
11851
|
try {
|
|
11889
|
-
Eo(t.activeChart(),
|
|
11852
|
+
Eo(t.activeChart(), f, e);
|
|
11890
11853
|
} catch {}
|
|
11891
11854
|
});
|
|
11892
11855
|
} catch {}
|
|
11893
|
-
}), ko(
|
|
11894
|
-
let
|
|
11856
|
+
}), ko(ye, f, Y, X, k);
|
|
11857
|
+
let Se = () => {
|
|
11895
11858
|
try {
|
|
11896
|
-
localStorage.removeItem(
|
|
11859
|
+
localStorage.removeItem(ee), localStorage.removeItem(V);
|
|
11897
11860
|
} catch {}
|
|
11898
|
-
let e =
|
|
11861
|
+
let e = l.chartWidget?.activeChart?.();
|
|
11899
11862
|
if (e) {
|
|
11900
|
-
|
|
11863
|
+
S.current && S.current.length > 0 && (S.current.forEach((t) => {
|
|
11901
11864
|
try {
|
|
11902
11865
|
e.removeEntity(t);
|
|
11903
11866
|
} catch {}
|
|
11904
|
-
}),
|
|
11867
|
+
}), S.current = []);
|
|
11905
11868
|
try {
|
|
11906
11869
|
e.clearMarks(2);
|
|
11907
11870
|
} catch {}
|
|
11908
11871
|
}
|
|
11909
|
-
},
|
|
11910
|
-
|
|
11911
|
-
},
|
|
11912
|
-
|
|
11913
|
-
},
|
|
11914
|
-
return
|
|
11915
|
-
|
|
11916
|
-
e && (t = new ResizeObserver(() => {
|
|
11917
|
-
window.dispatchEvent(new Event("resize"));
|
|
11918
|
-
}), t.observe(e));
|
|
11919
|
-
let n = window.matchMedia($o), r = () => {
|
|
11920
|
-
L.value = n.matches;
|
|
11921
|
-
};
|
|
11922
|
-
n.addEventListener("change", r), v(() => {
|
|
11923
|
-
t?.disconnect(), n.removeEventListener("change", r);
|
|
11924
|
-
});
|
|
11925
|
-
}), v(() => {
|
|
11926
|
-
J.value = !1, h.current = null, T.value = null;
|
|
11872
|
+
}, Ce = (e) => {
|
|
11873
|
+
J.value = e;
|
|
11874
|
+
}, we = (e) => {
|
|
11875
|
+
z.value = e;
|
|
11876
|
+
}, Te = r(() => Q.find((e) => e.ticker === X.value)?.type ?? "forex"), Ee = r(() => X.value || localStorage.getItem("tv:latest-symbol") || "XAU_USD");
|
|
11877
|
+
return v(() => {
|
|
11878
|
+
U.value = !1, p.current = null, y.value = null;
|
|
11927
11879
|
}), (t, n) => (x(), o("div", {
|
|
11928
|
-
ref_key: "
|
|
11929
|
-
ref:
|
|
11930
|
-
|
|
11931
|
-
|
|
11880
|
+
ref_key: "rootEl",
|
|
11881
|
+
ref: C,
|
|
11882
|
+
lang: d.value,
|
|
11883
|
+
class: g(["iccandle-selector-widget", L.value === "dark" ? "iccandle-dark" : ""])
|
|
11932
11884
|
}, [
|
|
11933
|
-
|
|
11934
|
-
|
|
11935
|
-
|
|
11936
|
-
|
|
11937
|
-
|
|
11938
|
-
|
|
11939
|
-
|
|
11940
|
-
|
|
11941
|
-
|
|
11942
|
-
|
|
11943
|
-
|
|
11944
|
-
|
|
11945
|
-
|
|
11946
|
-
|
|
11947
|
-
|
|
11948
|
-
|
|
11949
|
-
|
|
11950
|
-
|
|
11951
|
-
|
|
11952
|
-
|
|
11953
|
-
|
|
11954
|
-
|
|
11955
|
-
|
|
11956
|
-
|
|
11957
|
-
|
|
11958
|
-
|
|
11959
|
-
|
|
11960
|
-
|
|
11961
|
-
|
|
11962
|
-
|
|
11963
|
-
|
|
11964
|
-
|
|
11965
|
-
|
|
11966
|
-
|
|
11967
|
-
|
|
11968
|
-
|
|
11969
|
-
|
|
11970
|
-
|
|
11971
|
-
|
|
11972
|
-
|
|
11973
|
-
|
|
11974
|
-
|
|
11975
|
-
|
|
11976
|
-
|
|
11977
|
-
|
|
11978
|
-
|
|
11979
|
-
|
|
11980
|
-
|
|
11981
|
-
|
|
11982
|
-
|
|
11983
|
-
|
|
11984
|
-
|
|
11985
|
-
|
|
11986
|
-
|
|
11987
|
-
|
|
11988
|
-
|
|
11989
|
-
|
|
11990
|
-
|
|
11991
|
-
|
|
11992
|
-
|
|
11993
|
-
|
|
11994
|
-
|
|
11995
|
-
|
|
11996
|
-
|
|
11997
|
-
|
|
11998
|
-
|
|
11999
|
-
|
|
12000
|
-
|
|
12001
|
-
|
|
12002
|
-
|
|
12003
|
-
|
|
12004
|
-
|
|
12005
|
-
|
|
12006
|
-
|
|
12007
|
-
|
|
12008
|
-
|
|
12009
|
-
|
|
12010
|
-
|
|
12011
|
-
|
|
12012
|
-
|
|
12013
|
-
|
|
12014
|
-
|
|
12015
|
-
|
|
12016
|
-
|
|
12017
|
-
|
|
12018
|
-
|
|
12019
|
-
|
|
12020
|
-
|
|
12021
|
-
|
|
12022
|
-
|
|
12023
|
-
|
|
12024
|
-
|
|
12025
|
-
|
|
12026
|
-
"symbol",
|
|
12027
|
-
"position"
|
|
12028
|
-
])) : a("", !0),
|
|
12029
|
-
q.value || I.value ? (x(), o("div", qo)) : a("", !0),
|
|
12030
|
-
u(Oa, {
|
|
12031
|
-
theme: G.value,
|
|
12032
|
-
style: _(ce.value)
|
|
12033
|
-
}, null, 8, ["theme", "style"])
|
|
12034
|
-
], 10, Ko)], 512),
|
|
12035
|
-
s("div", {
|
|
12036
|
-
class: g(["iccandle-selector-widget__resize-handle", L.value ? "iccandle-selector-widget__resize-handle--stacked" : ""]),
|
|
12037
|
-
role: "separator",
|
|
12038
|
-
"aria-orientation": L.value ? "horizontal" : "vertical",
|
|
12039
|
-
"aria-valuenow": F.value,
|
|
12040
|
-
"aria-valuemin": Xo,
|
|
12041
|
-
"aria-valuemax": Zo,
|
|
12042
|
-
onPointerdown: ve,
|
|
12043
|
-
onPointermove: ye,
|
|
12044
|
-
onPointerup: be,
|
|
12045
|
-
onPointercancel: be
|
|
12046
|
-
}, null, 42, Jo),
|
|
12047
|
-
s("iframe", {
|
|
12048
|
-
ref_key: "resultIframeRef",
|
|
12049
|
-
ref: ke,
|
|
12050
|
-
src: ae.value,
|
|
12051
|
-
class: "iccandle-selector-widget__iframe",
|
|
12052
|
-
title: "ICCandle results",
|
|
12053
|
-
onLoad: Ae
|
|
12054
|
-
}, null, 40, Yo)
|
|
12055
|
-
], 4));
|
|
11885
|
+
E(t.$slots, "default", { chartRefs: f }),
|
|
11886
|
+
P.value ? (x(), i(Ze, {
|
|
11887
|
+
key: 0,
|
|
11888
|
+
"submit-callback": e.submitCallback,
|
|
11889
|
+
"handle-show-dialog": Z,
|
|
11890
|
+
"on-open-scan-config": ce,
|
|
11891
|
+
"on-apply-saved-timeframe": Ce,
|
|
11892
|
+
"pending-scan-after-config": q.value,
|
|
11893
|
+
"on-pending-scan-handled": ue,
|
|
11894
|
+
"trigger-scanner": oe,
|
|
11895
|
+
window_size: W.value,
|
|
11896
|
+
"current-symbol": X.value,
|
|
11897
|
+
resolution: Y.value,
|
|
11898
|
+
timeframe: J.value,
|
|
11899
|
+
"chart-widget": e.chartWidget,
|
|
11900
|
+
candles: G.value,
|
|
11901
|
+
"handle-start-drag": ie,
|
|
11902
|
+
"handle-stop-drag": ae,
|
|
11903
|
+
"has-active-shape": U.value,
|
|
11904
|
+
theme: L.value,
|
|
11905
|
+
language: d.value,
|
|
11906
|
+
"clear-scanner-news-marks": Se,
|
|
11907
|
+
"selected-candles": k.value,
|
|
11908
|
+
"iframe-loaded": e.iframeLoaded,
|
|
11909
|
+
"is-loading": D.value,
|
|
11910
|
+
"handle-track-pattern-click": pe
|
|
11911
|
+
}, null, 8, [
|
|
11912
|
+
"submit-callback",
|
|
11913
|
+
"pending-scan-after-config",
|
|
11914
|
+
"window_size",
|
|
11915
|
+
"current-symbol",
|
|
11916
|
+
"resolution",
|
|
11917
|
+
"timeframe",
|
|
11918
|
+
"chart-widget",
|
|
11919
|
+
"candles",
|
|
11920
|
+
"has-active-shape",
|
|
11921
|
+
"theme",
|
|
11922
|
+
"language",
|
|
11923
|
+
"selected-candles",
|
|
11924
|
+
"iframe-loaded",
|
|
11925
|
+
"is-loading"
|
|
11926
|
+
])) : a("", !0),
|
|
11927
|
+
z.value ? (x(), i(Gi, {
|
|
11928
|
+
key: 1,
|
|
11929
|
+
open: z.value,
|
|
11930
|
+
"onUpdate:open": we,
|
|
11931
|
+
resolution: Y.value,
|
|
11932
|
+
type: Te.value,
|
|
11933
|
+
symbol: X.value,
|
|
11934
|
+
candles: G.value,
|
|
11935
|
+
percent: 90,
|
|
11936
|
+
theme: L.value
|
|
11937
|
+
}, null, 8, [
|
|
11938
|
+
"open",
|
|
11939
|
+
"resolution",
|
|
11940
|
+
"type",
|
|
11941
|
+
"symbol",
|
|
11942
|
+
"candles",
|
|
11943
|
+
"theme"
|
|
11944
|
+
])) : a("", !0),
|
|
11945
|
+
K.value ? (x(), i(Hn, {
|
|
11946
|
+
key: 2,
|
|
11947
|
+
intent: K.value,
|
|
11948
|
+
"set-resolution": Ce,
|
|
11949
|
+
timeframe: J.value,
|
|
11950
|
+
"handle-close-dialog": le,
|
|
11951
|
+
"current-symbol": X.value,
|
|
11952
|
+
theme: L.value,
|
|
11953
|
+
onScanConfigSaved: de
|
|
11954
|
+
}, null, 8, [
|
|
11955
|
+
"intent",
|
|
11956
|
+
"timeframe",
|
|
11957
|
+
"current-symbol",
|
|
11958
|
+
"theme"
|
|
11959
|
+
])) : a("", !0),
|
|
11960
|
+
A.value && j.value ? (x(), i(ua, {
|
|
11961
|
+
key: 3,
|
|
11962
|
+
event: j.value,
|
|
11963
|
+
symbol: Ee.value,
|
|
11964
|
+
position: M.value,
|
|
11965
|
+
onClose: fe,
|
|
11966
|
+
onGoToEventDetail: me
|
|
11967
|
+
}, null, 8, [
|
|
11968
|
+
"event",
|
|
11969
|
+
"symbol",
|
|
11970
|
+
"position"
|
|
11971
|
+
])) : a("", !0),
|
|
11972
|
+
H.value ? (x(), o("div", Ko)) : a("", !0),
|
|
11973
|
+
u(Oa, {
|
|
11974
|
+
theme: L.value,
|
|
11975
|
+
style: _(R.value)
|
|
11976
|
+
}, null, 8, ["theme", "style"])
|
|
11977
|
+
], 10, Go));
|
|
12056
11978
|
}
|
|
12057
|
-
})
|
|
11979
|
+
}), Jo = (e) => {
|
|
11980
|
+
let t = e?.contentWindow;
|
|
11981
|
+
if (!t || !e?.src) return;
|
|
11982
|
+
let n = new URL(e.src).origin;
|
|
11983
|
+
if (t.postMessage(JSON.stringify({
|
|
11984
|
+
type: "parent-origin",
|
|
11985
|
+
origin: window.location.origin
|
|
11986
|
+
}), n), new URLSearchParams(window.location.search).get("payment") === "success") {
|
|
11987
|
+
let e = () => t.postMessage(JSON.stringify({ type: "payment-success" }), n);
|
|
11988
|
+
[
|
|
11989
|
+
0,
|
|
11990
|
+
600,
|
|
11991
|
+
1500
|
|
11992
|
+
].forEach((t) => window.setTimeout(e, t));
|
|
11993
|
+
let r = new URL(window.location.href);
|
|
11994
|
+
[
|
|
11995
|
+
"payment",
|
|
11996
|
+
"session_id",
|
|
11997
|
+
"lookup_key"
|
|
11998
|
+
].forEach((e) => r.searchParams.delete(e)), window.history.replaceState({}, "", r);
|
|
11999
|
+
}
|
|
12000
|
+
};
|
|
12058
12001
|
//#endregion
|
|
12059
|
-
export {
|
|
12002
|
+
export { B as WIDGET_RESULT_URL, qo as WidgetIccandle, xo as getCustomIndicators, Jo as handleResultIframeLoad, to as withPlayChart };
|