sveltekit-ui 1.1.51 → 1.1.52

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.
Files changed (44) hide show
  1. package/.vercel/output/config.json +4 -0
  2. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/chunks/environment.js +1 -1
  3. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/chunks/internal.js +1 -1
  4. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/entries/pages/trader/_page.server.js +295 -0
  5. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/entries/pages/trader/_page.svelte.js +237 -0
  6. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/0.js +1 -1
  7. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/1.js +1 -1
  8. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/2.js +1 -1
  9. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/3.js +1 -1
  10. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/4.js +1 -1
  11. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/5.js +1 -1
  12. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/6.js +1 -1
  13. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/output/server/nodes/7.js +10 -0
  14. package/.vercel/output/functions/![-]/catchall.func/.svelte-kit/vercel-tmp/manifest.js +10 -2
  15. package/.vercel/output/static/_app/immutable/assets/7.P3YGQ1pf.css +1 -0
  16. package/.vercel/output/static/_app/immutable/chunks/BAahZk91.js +1 -0
  17. package/.vercel/output/static/_app/immutable/chunks/{BaSFXs5z.js → BPT8hUnt.js} +1 -1
  18. package/.vercel/output/static/_app/immutable/chunks/{DKfpOMDq.js → BwSlGzN3.js} +1 -1
  19. package/.vercel/output/static/_app/immutable/chunks/{D8m9gmGa.js → C1JBm0c-.js} +1 -1
  20. package/.vercel/output/static/_app/immutable/chunks/{CQTdHLj4.js → C7ic0CC_.js} +1 -1
  21. package/.vercel/output/static/_app/immutable/chunks/{BfPYA_4B.js → DthNgRcX.js} +1 -1
  22. package/.vercel/output/static/_app/immutable/chunks/{DvUP28x7.js → dNI4qYWa.js} +1 -1
  23. package/.vercel/output/static/_app/immutable/chunks/{CC40hui0.js → k2CTozZP.js} +1 -1
  24. package/.vercel/output/static/_app/immutable/chunks/{BRwVkVgU.js → reUr01i3.js} +1 -1
  25. package/.vercel/output/static/_app/immutable/entry/app.BmAvfs9y.js +2 -0
  26. package/.vercel/output/static/_app/immutable/entry/start.BjMIYpc9.js +1 -0
  27. package/.vercel/output/static/_app/immutable/nodes/{0.BAbruZLL.js → 0.Ny4VwAhi.js} +1 -1
  28. package/.vercel/output/static/_app/immutable/nodes/1.DPmv3j1s.js +1 -0
  29. package/.vercel/output/static/_app/immutable/nodes/{2.C0Y_lheo.js → 2.WACi8m_j.js} +1 -1
  30. package/.vercel/output/static/_app/immutable/nodes/{3.3Sc3Vvf1.js → 3.BR0VfEGG.js} +1 -1
  31. package/.vercel/output/static/_app/immutable/nodes/{4.DDQjOUe-.js → 4.CaKMIjEy.js} +1 -1
  32. package/.vercel/output/static/_app/immutable/nodes/{5.BM8tLMpn.js → 5.CBcmyemr.js} +1 -1
  33. package/.vercel/output/static/_app/immutable/nodes/{6.BALEMktT.js → 6.DBqG0cc_.js} +1 -1
  34. package/.vercel/output/static/_app/immutable/nodes/7.B7MLhsUA.js +1 -0
  35. package/.vercel/output/static/_app/version.json +1 -1
  36. package/package.json +4 -4
  37. package/.vercel/output/static/_app/immutable/chunks/B9qOyoM5.js +0 -1
  38. package/.vercel/output/static/_app/immutable/entry/app.6badXRGb.js +0 -2
  39. package/.vercel/output/static/_app/immutable/entry/start.BW_l5bbx.js +0 -1
  40. package/.vercel/output/static/_app/immutable/nodes/1.CHVDBae8.js +0 -1
  41. /package/.vercel/output/static/_app/immutable/chunks/{RHnEm7HE.js → C_Pzoflo.js} +0 -0
  42. /package/.vercel/output/static/_app/immutable/chunks/{C7Ex2Xh-.js → Du1izqHO.js} +0 -0
  43. /package/.vercel/output/static/_app/immutable/chunks/{B0BvW1x3.js → DxLN9Q9A.js} +0 -0
  44. /package/.vercel/output/static/_app/immutable/chunks/{Cfug8aQt.js → v_jBEYI6.js} +0 -0
@@ -52,6 +52,10 @@
52
52
  "src": "^/test/?(?:/__data.json)?$",
53
53
  "dest": "/test"
54
54
  },
55
+ {
56
+ "src": "^/trader/?(?:/__data.json)?$",
57
+ "dest": "/trader"
58
+ },
55
59
  {
56
60
  "src": "/.*",
57
61
  "dest": "/![-]/catchall"
@@ -37,7 +37,7 @@ function set_public_env(environment) {
37
37
  }
38
38
  //#endregion
39
39
  //#region \0virtual:__sveltekit/environment
40
- var version = "1774225576254";
40
+ var version = "1774227794535";
41
41
  var prerendering = false;
42
42
  function set_building() {}
43
43
  function set_prerendering() {
@@ -773,7 +773,7 @@ var options = {
773
773
  app: ({ head, body, assets, nonce, env }) => "<!DOCTYPE html>\n<html lang=\"en\" data-theme=\"\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" sizes=\"any\" href=\"" + assets + "/favicon.svg\" />\n <link rel=\"icon\" type=\"image/png\" href=\"" + assets + "/favicon.png\" />\n <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"" + assets + "/apple-touch-icon.png\" />\n <link rel=\"manifest\" href=\"" + assets + "/site.webmanifest\" />\n <meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"oklch(97% 0.01 261)\" />\n <meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"oklch(3% 0.01 261)\" />\n <meta name=\"viewport\" content=\"width=device-width\" />\n " + head + "\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">" + body + "</div>\n </body>\n</html>\n",
774
774
  error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>" + message + "</title>\n\n <style>\n body {\n --bg: white;\n --fg: #222;\n --divider: #ccc;\n background: var(--bg);\n color: var(--fg);\n font-family:\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n 'Open Sans',\n 'Helvetica Neue',\n sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100vh;\n margin: 0;\n }\n\n .error {\n display: flex;\n align-items: center;\n max-width: 32rem;\n margin: 0 1rem;\n }\n\n .status {\n font-weight: 200;\n font-size: 3rem;\n line-height: 1;\n position: relative;\n top: -0.05rem;\n }\n\n .message {\n border-left: 1px solid var(--divider);\n padding: 0 0 0 1rem;\n margin: 0 0 0 1rem;\n min-height: 2.5rem;\n display: flex;\n align-items: center;\n }\n\n .message h1 {\n font-weight: 400;\n font-size: 1em;\n margin: 0;\n }\n\n @media (prefers-color-scheme: dark) {\n body {\n --bg: #222;\n --fg: #ddd;\n --divider: #666;\n }\n }\n </style>\n </head>\n <body>\n <div class=\"error\">\n <span class=\"status\">" + status + "</span>\n <div class=\"message\">\n <h1>" + message + "</h1>\n </div>\n </div>\n </body>\n</html>\n"
775
775
  },
776
- version_hash: "g0oktu"
776
+ version_hash: "os530e"
777
777
  };
778
778
  async function get_hooks() {
779
779
  let handle;
@@ -0,0 +1,295 @@
1
+ //#region src/lib/server/trader_data.js
2
+ var PERIOD_TO_SEC = {
3
+ "5m": 300,
4
+ "1h": 3600,
5
+ "1d": 86400,
6
+ "1w": 604800
7
+ };
8
+ var COINBASE_MAX_WINDOW_BARS = 290;
9
+ var TRADER_MARKETS = [
10
+ {
11
+ key: "btc_usd",
12
+ label: "BTC / USD",
13
+ description: "Coinbase execution charts plus an Aster weekly context chart."
14
+ },
15
+ {
16
+ key: "doge_usd",
17
+ label: "DOGE / USD",
18
+ description: "DOGE spot structure across fast, medium, and higher timeframes."
19
+ },
20
+ {
21
+ key: "doge_btc",
22
+ label: "DOGE / BTC",
23
+ description: "Relative-strength anchor chart for sizing ideas."
24
+ }
25
+ ];
26
+ var TRADER_CHART_SPECS = [
27
+ {
28
+ id: "btc_usd_coinbase_5m",
29
+ market_key: "btc_usd",
30
+ pair_label: "BTC / USD",
31
+ title: "BTC / USD 5m",
32
+ source_key: "coinbase",
33
+ source_label: "Coinbase",
34
+ source_symbol: "BTC-USD",
35
+ period: "5m",
36
+ target_bars: 350
37
+ },
38
+ {
39
+ id: "btc_usd_coinbase_1h",
40
+ market_key: "btc_usd",
41
+ pair_label: "BTC / USD",
42
+ title: "BTC / USD 1h",
43
+ source_key: "coinbase",
44
+ source_label: "Coinbase",
45
+ source_symbol: "BTC-USD",
46
+ period: "1h",
47
+ target_bars: 350
48
+ },
49
+ {
50
+ id: "btc_usd_coinbase_1d",
51
+ market_key: "btc_usd",
52
+ pair_label: "BTC / USD",
53
+ title: "BTC / USD 1d",
54
+ source_key: "coinbase",
55
+ source_label: "Coinbase",
56
+ source_symbol: "BTC-USD",
57
+ period: "1d",
58
+ target_bars: 350
59
+ },
60
+ {
61
+ id: "btc_usd_aster_1w",
62
+ market_key: "btc_usd",
63
+ pair_label: "BTC / USD",
64
+ title: "BTC / USD 1w",
65
+ source_key: "aster",
66
+ source_label: "Aster",
67
+ source_symbol: "BTCUSDT",
68
+ period: "1w",
69
+ target_bars: 240,
70
+ source_note: "Weekly context uses Aster perpetual BTCUSDT candles."
71
+ },
72
+ {
73
+ id: "doge_usd_coinbase_5m",
74
+ market_key: "doge_usd",
75
+ pair_label: "DOGE / USD",
76
+ title: "DOGE / USD 5m",
77
+ source_key: "coinbase",
78
+ source_label: "Coinbase",
79
+ source_symbol: "DOGE-USD",
80
+ period: "5m",
81
+ target_bars: 350
82
+ },
83
+ {
84
+ id: "doge_usd_coinbase_1h",
85
+ market_key: "doge_usd",
86
+ pair_label: "DOGE / USD",
87
+ title: "DOGE / USD 1h",
88
+ source_key: "coinbase",
89
+ source_label: "Coinbase",
90
+ source_symbol: "DOGE-USD",
91
+ period: "1h",
92
+ target_bars: 350
93
+ },
94
+ {
95
+ id: "doge_usd_coinbase_1d",
96
+ market_key: "doge_usd",
97
+ pair_label: "DOGE / USD",
98
+ title: "DOGE / USD 1d",
99
+ source_key: "coinbase",
100
+ source_label: "Coinbase",
101
+ source_symbol: "DOGE-USD",
102
+ period: "1d",
103
+ target_bars: 350
104
+ },
105
+ {
106
+ id: "doge_usd_aster_1w",
107
+ market_key: "doge_usd",
108
+ pair_label: "DOGE / USD",
109
+ title: "DOGE / USD 1w",
110
+ source_key: "aster",
111
+ source_label: "Aster",
112
+ source_symbol: "DOGEUSDT",
113
+ period: "1w",
114
+ target_bars: 240,
115
+ source_note: "Weekly context uses Aster perpetual DOGEUSDT candles."
116
+ },
117
+ {
118
+ id: "doge_btc_coinbase_1d",
119
+ market_key: "doge_btc",
120
+ pair_label: "DOGE / BTC",
121
+ title: "DOGE / BTC 1d",
122
+ source_key: "coinbase",
123
+ source_label: "Coinbase",
124
+ source_symbol: "DOGE-BTC",
125
+ period: "1d",
126
+ target_bars: 900,
127
+ source_note: "Fetched in multiple Coinbase windows to get deeper daily history."
128
+ }
129
+ ];
130
+ function create_fetch_error(response, body) {
131
+ const body_message = typeof body?.message === "string" ? body.message : null;
132
+ const fallback = `Request failed with status ${response.status}`;
133
+ return new Error(body_message || fallback);
134
+ }
135
+ async function fetch_json(fetcher, url) {
136
+ const response = await fetcher(url, { headers: { accept: "application/json" } });
137
+ const body = await response.json();
138
+ if (!response.ok) throw create_fetch_error(response, body);
139
+ if (body?.message && !Array.isArray(body)) throw new Error(body.message);
140
+ return body;
141
+ }
142
+ function dedupe_klines(klines) {
143
+ const by_open_time = /* @__PURE__ */ new Map();
144
+ for (let kline of klines || []) {
145
+ if (!Number.isFinite(kline?.open_time)) continue;
146
+ by_open_time.set(kline.open_time, kline);
147
+ }
148
+ return [...by_open_time.values()].sort((a, b) => a.open_time - b.open_time);
149
+ }
150
+ function normalize_coinbase_klines(raw_klines) {
151
+ if (!Array.isArray(raw_klines)) throw new Error("Coinbase candles response was not an array.");
152
+ return dedupe_klines(raw_klines.map((kline) => {
153
+ return {
154
+ open_time: Number(kline?.[0]),
155
+ l: Number(kline?.[1]),
156
+ h: Number(kline?.[2]),
157
+ o: Number(kline?.[3]),
158
+ c: Number(kline?.[4]),
159
+ v: Number(kline?.[5])
160
+ };
161
+ }));
162
+ }
163
+ function normalize_aster_klines(raw_klines) {
164
+ if (!Array.isArray(raw_klines)) throw new Error("Aster klines response was not an array.");
165
+ return dedupe_klines(raw_klines.map((kline) => {
166
+ return {
167
+ open_time: Math.floor(Number(kline?.[0]) / 1e3),
168
+ o: Number(kline?.[1]),
169
+ h: Number(kline?.[2]),
170
+ l: Number(kline?.[3]),
171
+ c: Number(kline?.[4]),
172
+ v: Number(kline?.[5])
173
+ };
174
+ }));
175
+ }
176
+ async function fetch_coinbase_recent_klines(fetcher, product_id, period) {
177
+ return normalize_coinbase_klines(await fetch_json(fetcher, `https://api.exchange.coinbase.com/products/${product_id}/candles?granularity=${PERIOD_TO_SEC[period]}`));
178
+ }
179
+ async function fetch_coinbase_paged_klines(fetcher, product_id, period, target_bars) {
180
+ const granularity_sec = PERIOD_TO_SEC[period];
181
+ let remaining_bars = target_bars;
182
+ let end_time_ms = Date.now();
183
+ let combined_klines = [];
184
+ let safety = 0;
185
+ while (remaining_bars > 0 && safety < 12) {
186
+ const bars_this_call = Math.min(remaining_bars, COINBASE_MAX_WINDOW_BARS);
187
+ const window_ms = bars_this_call * granularity_sec * 1e3;
188
+ const start_time_iso = new Date(end_time_ms - window_ms).toISOString();
189
+ const end_time_iso = new Date(end_time_ms).toISOString();
190
+ const next_klines = normalize_coinbase_klines(await fetch_json(fetcher, `https://api.exchange.coinbase.com/products/${product_id}/candles?${new URLSearchParams({
191
+ granularity: String(granularity_sec),
192
+ start: start_time_iso,
193
+ end: end_time_iso
194
+ }).toString()}`));
195
+ if (next_klines.length === 0) break;
196
+ combined_klines = dedupe_klines([...next_klines, ...combined_klines]);
197
+ remaining_bars = target_bars - combined_klines.length;
198
+ end_time_ms = (next_klines[0].open_time - granularity_sec) * 1e3;
199
+ safety += 1;
200
+ if (next_klines.length < bars_this_call * .75) break;
201
+ }
202
+ return combined_klines.slice(-target_bars);
203
+ }
204
+ async function fetch_coinbase_klines(fetcher, product_id, period, target_bars = 350) {
205
+ if ((target_bars ?? 0) > 350) return fetch_coinbase_paged_klines(fetcher, product_id, period, target_bars);
206
+ return (await fetch_coinbase_recent_klines(fetcher, product_id, period)).slice(-target_bars);
207
+ }
208
+ async function fetch_aster_klines(fetcher, symbol, period, target_bars = 240) {
209
+ return normalize_aster_klines(await fetch_json(fetcher, `https://fapi.asterdex.com/fapi/v1/klines?${new URLSearchParams({
210
+ symbol,
211
+ interval: period,
212
+ limit: String(target_bars)
213
+ }).toString()}`));
214
+ }
215
+ async function fetch_chart_klines(fetcher, chart_spec) {
216
+ if (chart_spec.source_key === "coinbase") return fetch_coinbase_klines(fetcher, chart_spec.source_symbol, chart_spec.period, chart_spec.target_bars);
217
+ if (chart_spec.source_key === "aster") return fetch_aster_klines(fetcher, chart_spec.source_symbol, chart_spec.period, chart_spec.target_bars);
218
+ throw new Error(`Unsupported chart source: ${chart_spec.source_key}`);
219
+ }
220
+ function get_chart_result_summary(chart_spec, klines) {
221
+ return {
222
+ ...chart_spec,
223
+ status: "ready",
224
+ error: null,
225
+ klines,
226
+ trendlines: [],
227
+ bar_count: klines.length,
228
+ first_open_time: klines?.[0]?.open_time ?? null,
229
+ last_open_time: klines?.[klines.length - 1]?.open_time ?? null
230
+ };
231
+ }
232
+ function get_chart_error_summary(chart_spec, error) {
233
+ return {
234
+ ...chart_spec,
235
+ status: "error",
236
+ error: error?.message ?? "Failed to load chart data.",
237
+ klines: [],
238
+ trendlines: [],
239
+ bar_count: 0,
240
+ first_open_time: null,
241
+ last_open_time: null
242
+ };
243
+ }
244
+ function build_markets(chart_results) {
245
+ return TRADER_MARKETS.map((market) => {
246
+ return {
247
+ ...market,
248
+ charts: chart_results.filter((chart_result) => chart_result.market_key === market.key)
249
+ };
250
+ });
251
+ }
252
+ async function load_trader_data(fetcher = fetch) {
253
+ const chart_results = await Promise.all(TRADER_CHART_SPECS.map(async (chart_spec) => {
254
+ try {
255
+ return get_chart_result_summary(chart_spec, await fetch_chart_klines(fetcher, chart_spec));
256
+ } catch (error) {
257
+ return get_chart_error_summary(chart_spec, error);
258
+ }
259
+ }));
260
+ return {
261
+ title: "Trader Lab",
262
+ loaded_at_iso: (/* @__PURE__ */ new Date()).toISOString(),
263
+ markets: build_markets(chart_results),
264
+ strategy_seed: {
265
+ total_budget_usd: 1e5,
266
+ leverage_allowed: true,
267
+ rebalance_cadence: "hourly",
268
+ top_trendlines_per_chart: 15,
269
+ notional_by_period_usd: {
270
+ "5m": 1e3,
271
+ "1h": 5e3,
272
+ "1d": 1e4,
273
+ "1w": 15e3
274
+ },
275
+ sizing_signal_chart_id: "doge_btc_coinbase_1d"
276
+ },
277
+ notes: [
278
+ "Step 1 focuses on loading and charting the main BTC, DOGE, and DOGE/BTC structures.",
279
+ "Trendline generation and backtesting hooks are intentionally left for the next pass.",
280
+ "Aster weekly charts use USDT perpetual symbols because that is the available market format there."
281
+ ],
282
+ errors: chart_results.filter((chart_result) => chart_result.status === "error").map((chart_result) => ({
283
+ id: chart_result.id,
284
+ title: chart_result.title,
285
+ error: chart_result.error
286
+ }))
287
+ };
288
+ }
289
+ //#endregion
290
+ //#region src/routes/trader/+page.server.js
291
+ async function load({ fetch }) {
292
+ return { trader: await load_trader_data(fetch) };
293
+ }
294
+ //#endregion
295
+ export { load };
@@ -0,0 +1,237 @@
1
+ import { S as escape_html, a as ensure_array_like, i as derived } from "../../../chunks/server.js";
2
+ import "../../../chunks/client2.js";
3
+ import { n as Chart, t as create_chart_manager } from "../../../chunks/index4.svelte.js";
4
+ //#region src/lib/Components/Trader/index.svelte
5
+ function Trader($$renderer, $$props) {
6
+ $$renderer.component(($$renderer) => {
7
+ let { manager } = $$props;
8
+ $$renderer.push(`<div class="page svelte-1qdu0bh"><header class="hero svelte-1qdu0bh"><div><p class="eyebrow svelte-1qdu0bh">Trading Workspace</p> <h1 class="svelte-1qdu0bh">${escape_html(manager?.title)}</h1> <p class="subtitle svelte-1qdu0bh">Multi-timeframe BTC, DOGE, and DOGE/BTC charts with a seeded strategy profile for the next backtest pass.</p></div> <div class="hero_meta svelte-1qdu0bh"><p class="svelte-1qdu0bh"><strong>Loaded:</strong> ${escape_html(manager?.loaded_at_label)}</p> <p class="svelte-1qdu0bh"><strong>Markets:</strong> ${escape_html(manager?.markets?.length ?? 0)}</p> <p class="svelte-1qdu0bh"><strong>Cadence:</strong> ${escape_html(manager?.strategy_seed?.rebalance_cadence ?? "-")}</p></div></header> <section class="strategy_card svelte-1qdu0bh"><div><p class="eyebrow svelte-1qdu0bh">Strategy Seed</p> <h2 class="svelte-1qdu0bh">Starting assumptions</h2></div> <div class="strategy_grid svelte-1qdu0bh"><div class="strategy_item svelte-1qdu0bh"><p class="label svelte-1qdu0bh">Budget</p> <p class="value svelte-1qdu0bh">${escape_html(manager?.strategy_seed?.total_budget_label)}</p></div> <div class="strategy_item svelte-1qdu0bh"><p class="label svelte-1qdu0bh">Trendlines / chart</p> <p class="value svelte-1qdu0bh">${escape_html(manager?.strategy_seed?.top_trendlines_per_chart ?? "-")}</p></div> <div class="strategy_item svelte-1qdu0bh"><p class="label svelte-1qdu0bh">Leverage</p> <p class="value svelte-1qdu0bh">${escape_html(manager?.strategy_seed?.leverage_allowed ? "Allowed" : "Off")}</p></div> <div class="strategy_item svelte-1qdu0bh"><p class="label svelte-1qdu0bh">Sizing signal</p> <p class="value svelte-1qdu0bh">${escape_html(manager?.strategy_seed?.sizing_signal_chart_id ?? "-")}</p></div></div> `);
9
+ if (manager?.strategy_seed?.notional_entries?.length) {
10
+ $$renderer.push("<!--[0-->");
11
+ $$renderer.push(`<div class="notional_strip svelte-1qdu0bh"><!--[-->`);
12
+ const each_array = ensure_array_like(manager?.strategy_seed?.notional_entries);
13
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
14
+ let notional = each_array[$$index];
15
+ $$renderer.push(`<div class="notional_chip svelte-1qdu0bh"><p class="svelte-1qdu0bh">${escape_html(notional.period)}</p> <strong class="svelte-1qdu0bh">${escape_html(notional.amount_label)}</strong></div>`);
16
+ }
17
+ $$renderer.push(`<!--]--></div>`);
18
+ } else $$renderer.push("<!--[-1-->");
19
+ $$renderer.push(`<!--]--></section> `);
20
+ if (manager?.notes?.length) {
21
+ $$renderer.push("<!--[0-->");
22
+ $$renderer.push(`<section class="notes_card svelte-1qdu0bh"><p class="eyebrow svelte-1qdu0bh">Notes</p> <ul class="svelte-1qdu0bh"><!--[-->`);
23
+ const each_array_1 = ensure_array_like(manager?.notes);
24
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
25
+ let note = each_array_1[$$index_1];
26
+ $$renderer.push(`<li class="svelte-1qdu0bh">${escape_html(note)}</li>`);
27
+ }
28
+ $$renderer.push(`<!--]--></ul></section>`);
29
+ } else $$renderer.push("<!--[-1-->");
30
+ $$renderer.push(`<!--]--> `);
31
+ if (manager?.has_errors) {
32
+ $$renderer.push("<!--[0-->");
33
+ $$renderer.push(`<section class="errors_card svelte-1qdu0bh"><p class="eyebrow svelte-1qdu0bh">Load Issues</p> <!--[-->`);
34
+ const each_array_2 = ensure_array_like(manager?.errors);
35
+ for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
36
+ let error_item = each_array_2[$$index_2];
37
+ $$renderer.push(`<p class="svelte-1qdu0bh"><strong>${escape_html(error_item.title)}:</strong> ${escape_html(error_item.error)}</p>`);
38
+ }
39
+ $$renderer.push(`<!--]--></section>`);
40
+ } else $$renderer.push("<!--[-1-->");
41
+ $$renderer.push(`<!--]--> <!--[-->`);
42
+ const each_array_3 = ensure_array_like(manager?.markets);
43
+ for (let $$index_4 = 0, $$length = each_array_3.length; $$index_4 < $$length; $$index_4++) {
44
+ let market = each_array_3[$$index_4];
45
+ $$renderer.push(`<section class="market_section svelte-1qdu0bh"><div class="market_header svelte-1qdu0bh"><div><p class="eyebrow svelte-1qdu0bh">${escape_html(market?.key)}</p> <h2 class="svelte-1qdu0bh">${escape_html(market?.label)}</h2></div> <p class="market_description svelte-1qdu0bh">${escape_html(market?.description)}</p></div> <div class="chart_grid svelte-1qdu0bh"><!--[-->`);
46
+ const each_array_4 = ensure_array_like(market?.charts);
47
+ for (let $$index_3 = 0, $$length = each_array_4.length; $$index_3 < $$length; $$index_3++) {
48
+ let chart_item = each_array_4[$$index_3];
49
+ $$renderer.push(`<article class="chart_card svelte-1qdu0bh"><div class="chart_card_header svelte-1qdu0bh"><div><h3 class="svelte-1qdu0bh">${escape_html(chart_item?.title)}</h3> <p class="chart_meta svelte-1qdu0bh">${escape_html(chart_item?.meta_label)}</p></div> <p class="chart_range svelte-1qdu0bh">${escape_html(chart_item?.range_label)}</p></div> `);
50
+ if (chart_item?.source_note) {
51
+ $$renderer.push("<!--[0-->");
52
+ $$renderer.push(`<p class="chart_note svelte-1qdu0bh">${escape_html(chart_item?.source_note)}</p>`);
53
+ } else $$renderer.push("<!--[-1-->");
54
+ $$renderer.push(`<!--]--> `);
55
+ if (chart_item?.status === "error") {
56
+ $$renderer.push("<!--[0-->");
57
+ $$renderer.push(`<p class="chart_error svelte-1qdu0bh">${escape_html(chart_item?.error)}</p>`);
58
+ } else if (chart_item?.chart_manager) {
59
+ $$renderer.push("<!--[1-->");
60
+ Chart($$renderer, { manager: chart_item?.chart_manager });
61
+ } else {
62
+ $$renderer.push("<!--[-1-->");
63
+ $$renderer.push(`<p class="chart_error svelte-1qdu0bh">No chart data available yet.</p>`);
64
+ }
65
+ $$renderer.push(`<!--]--></article>`);
66
+ }
67
+ $$renderer.push(`<!--]--></div></section>`);
68
+ }
69
+ $$renderer.push(`<!--]--></div>`);
70
+ });
71
+ }
72
+ //#endregion
73
+ //#region src/lib/Components/Trader/index.svelte.js
74
+ var PERIOD_TO_SEC = {
75
+ "5m": 300,
76
+ "1h": 3600,
77
+ "1d": 86400,
78
+ "1w": 604800
79
+ };
80
+ var PERIOD_TO_INITIAL_VISIBLE_BARS = {
81
+ "5m": 144,
82
+ "1h": 168,
83
+ "1d": 180,
84
+ "1w": 104
85
+ };
86
+ var PERIOD_TO_MIN_VISIBLE_BARS = {
87
+ "5m": 8,
88
+ "1h": 8,
89
+ "1d": 6,
90
+ "1w": 4
91
+ };
92
+ function format_timestamp_seconds(timestamp_seconds) {
93
+ if (!Number.isFinite(timestamp_seconds)) return "-";
94
+ return (/* @__PURE__ */ new Date(timestamp_seconds * 1e3)).toLocaleString();
95
+ }
96
+ function format_iso_timestamp(timestamp_iso) {
97
+ if (!timestamp_iso) return "-";
98
+ return new Date(timestamp_iso).toLocaleString();
99
+ }
100
+ function format_number(number_to_format) {
101
+ if (!Number.isFinite(number_to_format)) return "-";
102
+ return new Intl.NumberFormat("en-US").format(number_to_format);
103
+ }
104
+ function create_chart_card_manager(chart_input) {
105
+ if (!Array.isArray(chart_input?.klines) || chart_input.klines.length === 0) return null;
106
+ const price_dataset_id = `${chart_input.id}_klines`;
107
+ const trendline_dataset_id = `${chart_input.id}_trendlines`;
108
+ const datasets = { [price_dataset_id]: {
109
+ source: chart_input.source_key,
110
+ data: chart_input.klines
111
+ } };
112
+ const displayed_datasets = [{
113
+ type: "klines",
114
+ name: chart_input.title,
115
+ dataset_id: price_dataset_id,
116
+ keys: [
117
+ "open_time",
118
+ "o",
119
+ "l",
120
+ "h",
121
+ "c"
122
+ ],
123
+ period_x: PERIOD_TO_SEC[chart_input.period],
124
+ colors: [{
125
+ l: 3,
126
+ c: 1,
127
+ h: 16,
128
+ o: 14,
129
+ is_theme_based: true
130
+ }]
131
+ }];
132
+ if (Array.isArray(chart_input?.trendlines) && chart_input.trendlines.length > 0) {
133
+ datasets[trendline_dataset_id] = {
134
+ source: "derived",
135
+ data: chart_input.trendlines
136
+ };
137
+ displayed_datasets.push({
138
+ type: "lines",
139
+ name: `${chart_input.title} trendlines`,
140
+ dataset_id: trendline_dataset_id,
141
+ keys: [
142
+ "m",
143
+ "b",
144
+ "score"
145
+ ],
146
+ period_x: null,
147
+ affects_y_scale: false,
148
+ colors: [{
149
+ l: 7,
150
+ c: 16,
151
+ h: 16,
152
+ o: 15,
153
+ is_theme_based: true
154
+ }]
155
+ });
156
+ }
157
+ return create_chart_manager({
158
+ chart: {
159
+ id: `${chart_input.id}_chart`,
160
+ x_axis_type: "time",
161
+ x_axis_title: null,
162
+ frames: [{
163
+ aspect_ratio: 1.4,
164
+ shown_y_axis_index: 0,
165
+ shared_y_axiss: [{
166
+ y_axis_type: null,
167
+ y_axis_title: null,
168
+ bottom_padding_pd: .08,
169
+ top_padding_pd: .08,
170
+ datasets: displayed_datasets
171
+ }]
172
+ }]
173
+ },
174
+ datasets,
175
+ range_to_show_default: PERIOD_TO_INITIAL_VISIBLE_BARS[chart_input.period] ?? 180,
176
+ min_visible_bars: PERIOD_TO_MIN_VISIBLE_BARS[chart_input.period] ?? 8,
177
+ x_edge_padding_ratio: .5
178
+ });
179
+ }
180
+ function prep_chart_card(chart_input) {
181
+ return {
182
+ ...chart_input,
183
+ meta_label: `${chart_input.source_label} · ${chart_input.period} · ${format_number(chart_input.bar_count)} bars`,
184
+ range_label: chart_input.first_open_time && chart_input.last_open_time ? `${format_timestamp_seconds(chart_input.first_open_time)} to ${format_timestamp_seconds(chart_input.last_open_time)}` : "No loaded range",
185
+ chart_manager: create_chart_card_manager(chart_input)
186
+ };
187
+ }
188
+ function create_trader_manager(config) {
189
+ const trader_data = config?.data?.trader ?? config?.data ?? {};
190
+ const markets = (trader_data?.markets ?? []).map((market) => {
191
+ return {
192
+ ...market,
193
+ charts: (market?.charts ?? []).map((chart_input) => prep_chart_card(chart_input))
194
+ };
195
+ });
196
+ const notional_entries = Object.entries(trader_data?.strategy_seed?.notional_by_period_usd ?? {});
197
+ return {
198
+ get title() {
199
+ return trader_data?.title ?? "Trader Lab";
200
+ },
201
+ get loaded_at_label() {
202
+ return format_iso_timestamp(trader_data?.loaded_at_iso);
203
+ },
204
+ get markets() {
205
+ return markets;
206
+ },
207
+ get notes() {
208
+ return trader_data?.notes ?? [];
209
+ },
210
+ get errors() {
211
+ return trader_data?.errors ?? [];
212
+ },
213
+ get has_errors() {
214
+ return (trader_data?.errors?.length ?? 0) > 0;
215
+ },
216
+ get strategy_seed() {
217
+ return {
218
+ ...trader_data?.strategy_seed ?? {},
219
+ total_budget_label: `$${format_number(trader_data?.strategy_seed?.total_budget_usd)}`,
220
+ notional_entries: notional_entries.map(([period, amount]) => ({
221
+ period,
222
+ amount_label: `$${format_number(amount)}`
223
+ }))
224
+ };
225
+ }
226
+ };
227
+ }
228
+ //#endregion
229
+ //#region src/routes/trader/+page.svelte
230
+ function _page($$renderer, $$props) {
231
+ $$renderer.component(($$renderer) => {
232
+ let { data } = $$props;
233
+ Trader($$renderer, { manager: derived(() => create_trader_manager({ data }))() });
234
+ });
235
+ }
236
+ //#endregion
237
+ export { _page as default };
@@ -5,6 +5,6 @@ let component_cache;
5
5
  export const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;
6
6
  export { universal };
7
7
  export const universal_id = "src/routes/+layout.js";
8
- export const imports = ["_app/immutable/nodes/0.BAbruZLL.js","_app/immutable/chunks/RHnEm7HE.js","_app/immutable/chunks/CC40hui0.js","_app/immutable/chunks/BfPYA_4B.js","_app/immutable/chunks/BRwVkVgU.js","_app/immutable/chunks/C7Ex2Xh-.js","_app/immutable/chunks/BaSFXs5z.js","_app/immutable/chunks/Cfug8aQt.js","_app/immutable/chunks/CQTdHLj4.js"];
8
+ export const imports = ["_app/immutable/nodes/0.Ny4VwAhi.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/k2CTozZP.js","_app/immutable/chunks/DthNgRcX.js","_app/immutable/chunks/reUr01i3.js","_app/immutable/chunks/Du1izqHO.js","_app/immutable/chunks/BPT8hUnt.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/C7ic0CC_.js"];
9
9
  export const stylesheets = ["_app/immutable/assets/index.DBQY-LKn.css","_app/immutable/assets/Checkbox.CJEZNdbe.css","_app/immutable/assets/index.CYJKF3O7.css","_app/immutable/assets/0.DtiXXF0F.css"];
10
10
  export const fonts = [];
@@ -3,6 +3,6 @@
3
3
  export const index = 1;
4
4
  let component_cache;
5
5
  export const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;
6
- export const imports = ["_app/immutable/nodes/1.CHVDBae8.js","_app/immutable/chunks/RHnEm7HE.js","_app/immutable/chunks/CC40hui0.js","_app/immutable/chunks/BaSFXs5z.js","_app/immutable/chunks/Cfug8aQt.js","_app/immutable/chunks/B9qOyoM5.js"];
6
+ export const imports = ["_app/immutable/nodes/1.DPmv3j1s.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/k2CTozZP.js","_app/immutable/chunks/BPT8hUnt.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/BAahZk91.js"];
7
7
  export const stylesheets = [];
8
8
  export const fonts = [];
@@ -3,6 +3,6 @@
3
3
  export const index = 2;
4
4
  let component_cache;
5
5
  export const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js')).default;
6
- export const imports = ["_app/immutable/nodes/2.C0Y_lheo.js","_app/immutable/chunks/RHnEm7HE.js","_app/immutable/chunks/CC40hui0.js","_app/immutable/chunks/BfPYA_4B.js","_app/immutable/chunks/BRwVkVgU.js","_app/immutable/chunks/C7Ex2Xh-.js","_app/immutable/chunks/D8m9gmGa.js","_app/immutable/chunks/DKfpOMDq.js","_app/immutable/chunks/Cfug8aQt.js","_app/immutable/chunks/B9qOyoM5.js"];
6
+ export const imports = ["_app/immutable/nodes/2.WACi8m_j.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/k2CTozZP.js","_app/immutable/chunks/DthNgRcX.js","_app/immutable/chunks/reUr01i3.js","_app/immutable/chunks/Du1izqHO.js","_app/immutable/chunks/C1JBm0c-.js","_app/immutable/chunks/BwSlGzN3.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/BAahZk91.js"];
7
7
  export const stylesheets = ["_app/immutable/assets/index.DBQY-LKn.css","_app/immutable/assets/Checkbox.CJEZNdbe.css","_app/immutable/assets/index.DatXVBdh.css","_app/immutable/assets/docs.Cdcj3UDW.css","_app/immutable/assets/2.BBwSLYu9.css"];
8
8
  export const fonts = [];
@@ -3,6 +3,6 @@
3
3
  export const index = 3;
4
4
  let component_cache;
5
5
  export const component = async () => component_cache ??= (await import('../entries/pages/components/_component_/_page.svelte.js')).default;
6
- export const imports = ["_app/immutable/nodes/3.3Sc3Vvf1.js","_app/immutable/chunks/RHnEm7HE.js","_app/immutable/chunks/CC40hui0.js","_app/immutable/chunks/BfPYA_4B.js","_app/immutable/chunks/BRwVkVgU.js","_app/immutable/chunks/C7Ex2Xh-.js","_app/immutable/chunks/BaSFXs5z.js","_app/immutable/chunks/D8m9gmGa.js","_app/immutable/chunks/DKfpOMDq.js","_app/immutable/chunks/Cfug8aQt.js","_app/immutable/chunks/B9qOyoM5.js","_app/immutable/chunks/CQTdHLj4.js","_app/immutable/chunks/DvUP28x7.js"];
6
+ export const imports = ["_app/immutable/nodes/3.BR0VfEGG.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/k2CTozZP.js","_app/immutable/chunks/DthNgRcX.js","_app/immutable/chunks/reUr01i3.js","_app/immutable/chunks/Du1izqHO.js","_app/immutable/chunks/BPT8hUnt.js","_app/immutable/chunks/C1JBm0c-.js","_app/immutable/chunks/BwSlGzN3.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/BAahZk91.js","_app/immutable/chunks/C7ic0CC_.js","_app/immutable/chunks/dNI4qYWa.js"];
7
7
  export const stylesheets = ["_app/immutable/assets/index.DBQY-LKn.css","_app/immutable/assets/Checkbox.CJEZNdbe.css","_app/immutable/assets/index.DatXVBdh.css","_app/immutable/assets/docs.Cdcj3UDW.css","_app/immutable/assets/index.CYJKF3O7.css","_app/immutable/assets/index.DKFmCUgV.css","_app/immutable/assets/3.DK3uvf0v.css"];
8
8
  export const fonts = [];
@@ -3,6 +3,6 @@
3
3
  export const index = 4;
4
4
  let component_cache;
5
5
  export const component = async () => component_cache ??= (await import('../entries/pages/test/_page.svelte.js')).default;
6
- export const imports = ["_app/immutable/nodes/4.DDQjOUe-.js","_app/immutable/chunks/RHnEm7HE.js","_app/immutable/chunks/Cfug8aQt.js","_app/immutable/chunks/BRwVkVgU.js","_app/immutable/chunks/C7Ex2Xh-.js","_app/immutable/chunks/DKfpOMDq.js"];
6
+ export const imports = ["_app/immutable/nodes/4.CaKMIjEy.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/reUr01i3.js","_app/immutable/chunks/Du1izqHO.js","_app/immutable/chunks/BwSlGzN3.js"];
7
7
  export const stylesheets = ["_app/immutable/assets/index.DBQY-LKn.css","_app/immutable/assets/index.DatXVBdh.css"];
8
8
  export const fonts = [];
@@ -3,6 +3,6 @@
3
3
  export const index = 5;
4
4
  let component_cache;
5
5
  export const component = async () => component_cache ??= (await import('../entries/pages/test2/_page.svelte.js')).default;
6
- export const imports = ["_app/immutable/nodes/5.BM8tLMpn.js","_app/immutable/chunks/RHnEm7HE.js","_app/immutable/chunks/Cfug8aQt.js","_app/immutable/chunks/B9qOyoM5.js","_app/immutable/chunks/DvUP28x7.js","_app/immutable/chunks/C7Ex2Xh-.js"];
6
+ export const imports = ["_app/immutable/nodes/5.CBcmyemr.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/BAahZk91.js","_app/immutable/chunks/dNI4qYWa.js","_app/immutable/chunks/Du1izqHO.js"];
7
7
  export const stylesheets = ["_app/immutable/assets/index.DKFmCUgV.css"];
8
8
  export const fonts = [];
@@ -5,6 +5,6 @@ let component_cache;
5
5
  export const component = async () => component_cache ??= (await import('../entries/pages/test3/_page.svelte.js')).default;
6
6
  export { server };
7
7
  export const server_id = "src/routes/test3/+page.server.js";
8
- export const imports = ["_app/immutable/nodes/6.BALEMktT.js","_app/immutable/chunks/RHnEm7HE.js","_app/immutable/chunks/Cfug8aQt.js","_app/immutable/chunks/DvUP28x7.js","_app/immutable/chunks/C7Ex2Xh-.js"];
8
+ export const imports = ["_app/immutable/nodes/6.DBqG0cc_.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/dNI4qYWa.js","_app/immutable/chunks/Du1izqHO.js"];
9
9
  export const stylesheets = ["_app/immutable/assets/index.DKFmCUgV.css","_app/immutable/assets/6.BnjxUmH7.css"];
10
10
  export const fonts = [];
@@ -0,0 +1,10 @@
1
+ import * as server from '../entries/pages/trader/_page.server.js';
2
+
3
+ export const index = 7;
4
+ let component_cache;
5
+ export const component = async () => component_cache ??= (await import('../entries/pages/trader/_page.svelte.js')).default;
6
+ export { server };
7
+ export const server_id = "src/routes/trader/+page.server.js";
8
+ export const imports = ["_app/immutable/nodes/7.B7MLhsUA.js","_app/immutable/chunks/C_Pzoflo.js","_app/immutable/chunks/v_jBEYI6.js","_app/immutable/chunks/dNI4qYWa.js","_app/immutable/chunks/Du1izqHO.js"];
9
+ export const stylesheets = ["_app/immutable/assets/index.DKFmCUgV.css","_app/immutable/assets/7.P3YGQ1pf.css"];
10
+ export const fonts = [];