ranranrunforit commited on
Commit
d0f868c
·
verified ·
1 Parent(s): 96021ac

Delete _ds_bundle.js

Browse files
Files changed (1) hide show
  1. _ds_bundle.js +0 -1535
_ds_bundle.js DELETED
@@ -1,1535 +0,0 @@
1
- /* @ds-bundle: {"format":3,"namespace":"ChanCompassSpectrum2DesignSystem_b52b37","components":[{"name":"Button","sourcePath":"components/actions/Button.jsx"},{"name":"Card","sourcePath":"components/containers/Card.jsx"},{"name":"InlineAlert","sourcePath":"components/containers/InlineAlert.jsx"},{"name":"Checkbox","sourcePath":"components/forms/Checkbox.jsx"},{"name":"Field","sourcePath":"components/forms/Field.jsx"},{"name":"Switch","sourcePath":"components/forms/Switch.jsx"},{"name":"Tabs","sourcePath":"components/navigation/Tabs.jsx"},{"name":"Badge","sourcePath":"components/status/Badge.jsx"},{"name":"SignalBadge","sourcePath":"components/status/SignalBadge.jsx"},{"name":"StatusLight","sourcePath":"components/status/StatusLight.jsx"}],"sourceHashes":{"components/actions/Button.jsx":"c9f7501c202c","components/containers/Card.jsx":"9316d0c88d32","components/containers/InlineAlert.jsx":"5ceb8bdaac5f","components/forms/Checkbox.jsx":"59c34e791a76","components/forms/Field.jsx":"39157a609b42","components/forms/Switch.jsx":"38f4684e0ef2","components/navigation/Tabs.jsx":"5488bca491fa","components/status/Badge.jsx":"3e62358e3a0b","components/status/SignalBadge.jsx":"df7989e74422","components/status/StatusLight.jsx":"f7d206a1642b","ui_kits/chan-compass/app.jsx":"4b80024bd468","ui_kits/chan-compass/data.js":"5821344b625c","ui_kits/chan-compass/views.jsx":"c9ec2aee076f"},"inlinedExternals":[],"unexposedExports":[]} */
2
-
3
- (() => {
4
-
5
- const __ds_ns = (window.ChanCompassSpectrum2DesignSystem_b52b37 = window.ChanCompassSpectrum2DesignSystem_b52b37 || {});
6
-
7
- const __ds_scope = {};
8
-
9
- (__ds_ns.__errors = __ds_ns.__errors || []);
10
-
11
- // components/actions/Button.jsx
12
- try { (() => {
13
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
14
- /* Inject component CSS once. Spectrum 2 buttons: fully-rounded "pill" by
15
- default, medium height 32px, 600 weight, soft state transitions. */
16
- const CSS = `
17
- .s2-btn{
18
- --_bg: var(--accent); --_bgh: var(--accent-hover); --_bgd: var(--accent-down);
19
- --_fg: var(--text-on-accent); --_bd: transparent;
20
- display:inline-flex; align-items:center; justify-content:center; gap:var(--space-100);
21
- font:var(--font-weight-semibold) var(--font-size-100)/1 var(--font-sans);
22
- height:var(--control-height-md); padding:0 var(--space-250);
23
- border-radius:var(--radius-full); border:var(--border-width-200) solid var(--_bd);
24
- background:var(--_bg); color:var(--_fg); cursor:pointer; white-space:nowrap;
25
- transition:var(--transition-colors), transform var(--duration-fast) var(--ease-out);
26
- user-select:none;
27
- }
28
- .s2-btn:hover{ background:var(--_bgh); }
29
- .s2-btn:active{ background:var(--_bgd); transform:scale(.98); }
30
- .s2-btn:focus-visible{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:var(--focus-ring-offset); }
31
- .s2-btn[disabled]{ background:var(--surface-subtle); color:var(--text-disabled); border-color:transparent; cursor:default; transform:none; }
32
- .s2-btn--square{ border-radius:var(--radius-default); }
33
- .s2-btn--sm{ height:var(--control-height-sm); padding:0 var(--space-200); font-size:var(--font-size-75); }
34
- .s2-btn--lg{ height:var(--control-height-lg); padding:0 var(--space-300); font-size:var(--font-size-200); }
35
- /* secondary — outline */
36
- .s2-btn--secondary{ --_bg:var(--surface-card); --_fg:var(--text-body); --_bd:var(--border-strong); }
37
- .s2-btn--secondary:hover{ --_bg:var(--surface-subtle); --_bd:var(--text-secondary); }
38
- .s2-btn--secondary:active{ --_bg:var(--s2-gray-100); }
39
- /* negative */
40
- .s2-btn--negative{ --_bg:var(--negative); --_bgh:var(--negative-hover); --_bgd:var(--s2-red-1100); }
41
- /* quiet — no chrome until hover */
42
- .s2-btn--quiet{ --_bg:transparent; --_fg:var(--text-body); --_bd:transparent; }
43
- .s2-btn--quiet:hover{ --_bg:var(--surface-subtle); }
44
- .s2-btn--quiet:active{ --_bg:var(--s2-gray-100); }
45
- `;
46
- let injected = false;
47
- function useCSS() {
48
- if (typeof document !== 'undefined' && !injected) {
49
- const el = document.createElement('style');
50
- el.textContent = CSS;
51
- el.dataset.s2 = 'button';
52
- document.head.appendChild(el);
53
- injected = true;
54
- }
55
- }
56
- function Button({
57
- variant = 'accent',
58
- size = 'md',
59
- shape = 'pill',
60
- icon,
61
- children,
62
- className = '',
63
- ...rest
64
- }) {
65
- useCSS();
66
- const cls = ['s2-btn', variant !== 'accent' && `s2-btn--${variant}`, size !== 'md' && `s2-btn--${size}`, shape === 'square' && 's2-btn--square', className].filter(Boolean).join(' ');
67
- return /*#__PURE__*/React.createElement("button", _extends({
68
- className: cls
69
- }, rest), icon, children);
70
- }
71
- Object.assign(__ds_scope, { Button });
72
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/actions/Button.jsx", error: String((e && e.message) || e) }); }
73
-
74
- // components/containers/Card.jsx
75
- try { (() => {
76
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
77
- const CSS = `
78
- .s2-card{
79
- background:var(--surface-card); border:var(--border-width-100) solid var(--border-hairline);
80
- border-radius:var(--card-radius); box-shadow:var(--shadow-raised);
81
- overflow:clip;
82
- }
83
- .s2-card--elevated{ box-shadow:var(--shadow-elevated); }
84
- .s2-card--flat{ box-shadow:none; }
85
- .s2-card--quiet{ background:transparent; border:none; box-shadow:none; }
86
- .s2-card__head{ display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-200); padding:var(--space-250) var(--space-300) 0; }
87
- .s2-card__titles{ display:flex; flex-direction:column; gap:2px; }
88
- .s2-card__title{ font:var(--type-h3); color:var(--text-heading); }
89
- .s2-card__subtitle{ font:var(--type-detail); color:var(--text-muted); }
90
- .s2-card__body{ padding:var(--space-250) var(--space-300) var(--space-300); }
91
- .s2-card__head + .s2-card__body{ padding-top:var(--space-200); }
92
- `;
93
- let injected = false;
94
- function useCSS() {
95
- if (typeof document !== 'undefined' && !injected) {
96
- const e = document.createElement('style');
97
- e.textContent = CSS;
98
- e.dataset.s2 = 'card';
99
- document.head.appendChild(e);
100
- injected = true;
101
- }
102
- }
103
- function Card({
104
- title,
105
- subtitle,
106
- action,
107
- elevation = 'raised',
108
- children,
109
- className = '',
110
- ...rest
111
- }) {
112
- useCSS();
113
- const cls = ['s2-card', elevation !== 'raised' && `s2-card--${elevation}`, className].filter(Boolean).join(' ');
114
- const hasHead = title || subtitle || action;
115
- return /*#__PURE__*/React.createElement("section", _extends({
116
- className: cls
117
- }, rest), hasHead && /*#__PURE__*/React.createElement("header", {
118
- className: "s2-card__head"
119
- }, /*#__PURE__*/React.createElement("div", {
120
- className: "s2-card__titles"
121
- }, title && /*#__PURE__*/React.createElement("span", {
122
- className: "s2-card__title"
123
- }, title), subtitle && /*#__PURE__*/React.createElement("span", {
124
- className: "s2-card__subtitle"
125
- }, subtitle)), action), /*#__PURE__*/React.createElement("div", {
126
- className: "s2-card__body"
127
- }, children));
128
- }
129
- Object.assign(__ds_scope, { Card });
130
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/containers/Card.jsx", error: String((e && e.message) || e) }); }
131
-
132
- // components/containers/InlineAlert.jsx
133
- try { (() => {
134
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
135
- /* Spectrum 2 in-line message. A framed notice tied to a region of the page.
136
- `ai` variant is the signature accent-framed panel used for local-LLM output. */
137
- const CSS = `
138
- .s2-alert{
139
- display:flex; gap:var(--space-150); padding:var(--space-200) var(--space-250);
140
- border-radius:var(--radius-lg); border:var(--border-width-100) solid var(--border-default);
141
- background:var(--surface-card); font:var(--type-body); color:var(--text-body);
142
- }
143
- .s2-alert__icon{ flex:none; width:18px; height:18px; display:grid; place-items:center; margin-top:1px; }
144
- .s2-alert__body{ display:flex; flex-direction:column; gap:2px; min-width:0; }
145
- .s2-alert__title{ font:var(--type-ui-bold); color:var(--text-heading); }
146
- .s2-alert--informative{ border-color:var(--accent); background:var(--informative-subtle); }
147
- .s2-alert--informative .s2-alert__icon{ color:var(--accent); }
148
- .s2-alert--positive{ border-color:var(--positive); background:var(--positive-subtle); }
149
- .s2-alert--positive .s2-alert__icon{ color:var(--positive); }
150
- .s2-alert--negative{ border-color:var(--negative); background:var(--negative-subtle); }
151
- .s2-alert--negative .s2-alert__icon{ color:var(--negative); }
152
- .s2-alert--notice{ border-color:var(--notice); background:var(--notice-subtle); }
153
- .s2-alert--notice .s2-alert__icon{ color:var(--notice); }
154
- .s2-alert--ai{
155
- border:var(--border-width-200) solid var(--accent); border-inline-start-width:6px;
156
- border-radius:var(--radius-lg); background:var(--surface-card); box-shadow:var(--shadow-accent);
157
- }
158
- .s2-alert--ai .s2-alert__title{ color:var(--accent-text); }
159
- `;
160
- let injected = false;
161
- function useCSS() {
162
- if (typeof document !== 'undefined' && !injected) {
163
- const e = document.createElement('style');
164
- e.textContent = CSS;
165
- e.dataset.s2 = 'alert';
166
- document.head.appendChild(e);
167
- injected = true;
168
- }
169
- }
170
- const ICONS = {
171
- informative: 'M9 1a8 8 0 100 16A8 8 0 009 1zm0 3.2a1.1 1.1 0 110 2.2 1.1 1.1 0 010-2.2zM10.2 14H7.8v-.9l.9-.2V9.1l-.9-.2V8h2.4v4.9l.9.2v.9z',
172
- positive: 'M9 1a8 8 0 100 16A8 8 0 009 1zm4.2 5.4l-5 5.2a.7.7 0 01-1 0L4.8 9a.7.7 0 011-1l1.9 1.9 4.5-4.6a.7.7 0 011 1z',
173
- negative: 'M9 1a8 8 0 100 16A8 8 0 009 1zm1.1 11.8H7.9v-2.2h2.2v2.2zm0-3.6H7.9V4.2h2.2v5z',
174
- notice: 'M9.9 1.6l7 12.1a1 1 0 01-.9 1.5H2a1 1 0 01-.9-1.5l7-12.1a1 1 0 011.8 0zM7.9 6.2v3.8h2.2V6.2H7.9zm0 5.2v2h2.2v-2H7.9z',
175
- ai: 'M9 1l1.8 4.3L15 7l-4.2 1.7L9 13 7.2 8.7 3 7l4.2-1.7L9 1z'
176
- };
177
- function InlineAlert({
178
- variant = 'informative',
179
- title,
180
- icon,
181
- children,
182
- className = '',
183
- ...rest
184
- }) {
185
- useCSS();
186
- const path = ICONS[variant] || ICONS.informative;
187
- return /*#__PURE__*/React.createElement("div", _extends({
188
- className: ['s2-alert', `s2-alert--${variant}`, className].filter(Boolean).join(' ')
189
- }, rest), /*#__PURE__*/React.createElement("span", {
190
- className: "s2-alert__icon"
191
- }, icon || /*#__PURE__*/React.createElement("svg", {
192
- width: "18",
193
- height: "18",
194
- viewBox: "0 0 18 18",
195
- fill: "currentColor"
196
- }, /*#__PURE__*/React.createElement("path", {
197
- d: path
198
- }))), /*#__PURE__*/React.createElement("div", {
199
- className: "s2-alert__body"
200
- }, title && /*#__PURE__*/React.createElement("span", {
201
- className: "s2-alert__title"
202
- }, title), children && /*#__PURE__*/React.createElement("div", null, children)));
203
- }
204
- Object.assign(__ds_scope, { InlineAlert });
205
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/containers/InlineAlert.jsx", error: String((e && e.message) || e) }); }
206
-
207
- // components/forms/Checkbox.jsx
208
- try { (() => {
209
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
210
- const CSS = `
211
- .s2-check{ display:inline-flex; align-items:center; gap:var(--space-100); cursor:pointer; font:var(--type-ui); color:var(--text-body); user-select:none; }
212
- .s2-check input{ position:absolute; opacity:0; width:0; height:0; }
213
- .s2-check__box{
214
- width:16px; height:16px; flex:none; border-radius:var(--radius-sm);
215
- border:var(--border-width-200) solid var(--border-field); background:var(--surface-card);
216
- display:grid; place-items:center; transition:var(--transition-colors);
217
- }
218
- .s2-check:hover .s2-check__box{ border-color:var(--text-secondary); }
219
- .s2-check__box svg{ width:11px; height:11px; opacity:0; color:#fff; }
220
- .s2-check input:checked + .s2-check__box{ background:var(--accent); border-color:var(--accent); }
221
- .s2-check input:checked + .s2-check__box svg{ opacity:1; }
222
- .s2-check input:focus-visible + .s2-check__box{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:var(--focus-ring-offset); }
223
- .s2-check input:disabled + .s2-check__box{ background:var(--surface-subtle); border-color:var(--border-default); }
224
- `;
225
- let injected = false;
226
- function useCSS() {
227
- if (typeof document !== 'undefined' && !injected) {
228
- const e = document.createElement('style');
229
- e.textContent = CSS;
230
- e.dataset.s2 = 'checkbox';
231
- document.head.appendChild(e);
232
- injected = true;
233
- }
234
- }
235
- function Checkbox({
236
- checked,
237
- onChange,
238
- children,
239
- disabled = false,
240
- ...rest
241
- }) {
242
- useCSS();
243
- return /*#__PURE__*/React.createElement("label", {
244
- className: "s2-check"
245
- }, /*#__PURE__*/React.createElement("input", _extends({
246
- type: "checkbox",
247
- checked: checked,
248
- onChange: onChange,
249
- disabled: disabled
250
- }, rest)), /*#__PURE__*/React.createElement("span", {
251
- className: "s2-check__box"
252
- }, /*#__PURE__*/React.createElement("svg", {
253
- viewBox: "0 0 12 12",
254
- fill: "none"
255
- }, /*#__PURE__*/React.createElement("path", {
256
- d: "M1 6l3.2 3.5L11 2.5",
257
- stroke: "currentColor",
258
- strokeWidth: "2",
259
- strokeLinecap: "round",
260
- strokeLinejoin: "round"
261
- }))), children && /*#__PURE__*/React.createElement("span", null, children));
262
- }
263
- Object.assign(__ds_scope, { Checkbox });
264
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Checkbox.jsx", error: String((e && e.message) || e) }); }
265
-
266
- // components/forms/Field.jsx
267
- try { (() => {
268
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
269
- const CSS = `
270
- .s2-field{ display:flex; flex-direction:column; gap:var(--space-75); }
271
- .s2-field__label{ font:var(--type-ui-bold); color:var(--text-heading); }
272
- .s2-field__req{ color:var(--negative); margin-inline-start:2px; }
273
- .s2-field__input{
274
- height:var(--control-height-md); padding:0 var(--space-150);
275
- font:var(--type-ui); color:var(--text-body);
276
- background:var(--surface-card);
277
- border:var(--border-width-200) solid var(--border-field);
278
- border-radius:var(--field-radius); outline:none;
279
- transition:var(--transition-colors), box-shadow var(--duration-fast) var(--ease-out);
280
- }
281
- .s2-field__input::placeholder{ color:var(--text-muted); }
282
- .s2-field__input:hover{ border-color:var(--text-secondary); }
283
- .s2-field__input:focus{ border-color:var(--accent); box-shadow:0 0 0 1px var(--accent); }
284
- .s2-field--textarea .s2-field__input{ height:auto; padding:var(--space-150); resize:vertical; line-height:var(--line-height-body); font-family:var(--font-sans); }
285
- .s2-field--mono .s2-field__input{ font-family:var(--font-code); font-size:var(--font-size-75); }
286
- .s2-field--invalid .s2-field__input{ border-color:var(--negative); }
287
- .s2-field--invalid .s2-field__input:focus{ box-shadow:0 0 0 1px var(--negative); }
288
- .s2-field__help{ font:var(--type-detail); color:var(--text-muted); }
289
- .s2-field--invalid .s2-field__help{ color:var(--negative); }
290
- .s2-field__input:disabled{ background:var(--surface-subtle); color:var(--text-disabled); border-color:var(--border-default); cursor:default; }
291
- `;
292
- let injected = false;
293
- function useCSS() {
294
- if (typeof document !== 'undefined' && !injected) {
295
- const el = document.createElement('style');
296
- el.textContent = CSS;
297
- el.dataset.s2 = 'field';
298
- document.head.appendChild(el);
299
- injected = true;
300
- }
301
- }
302
- function Field({
303
- label,
304
- value,
305
- onChange,
306
- placeholder,
307
- type = 'text',
308
- multiline = false,
309
- rows = 4,
310
- mono = false,
311
- required = false,
312
- invalid = false,
313
- help,
314
- disabled = false,
315
- className = '',
316
- ...rest
317
- }) {
318
- useCSS();
319
- const cls = ['s2-field', multiline && 's2-field--textarea', mono && 's2-field--mono', invalid && 's2-field--invalid', className].filter(Boolean).join(' ');
320
- const inputProps = {
321
- className: 's2-field__input',
322
- value,
323
- onChange,
324
- placeholder,
325
- disabled,
326
- ...rest
327
- };
328
- return /*#__PURE__*/React.createElement("label", {
329
- className: cls
330
- }, label && /*#__PURE__*/React.createElement("span", {
331
- className: "s2-field__label"
332
- }, label, required && /*#__PURE__*/React.createElement("span", {
333
- className: "s2-field__req"
334
- }, "*")), multiline ? /*#__PURE__*/React.createElement("textarea", _extends({
335
- rows: rows
336
- }, inputProps)) : /*#__PURE__*/React.createElement("input", _extends({
337
- type: type
338
- }, inputProps)), help && /*#__PURE__*/React.createElement("span", {
339
- className: "s2-field__help"
340
- }, help));
341
- }
342
- Object.assign(__ds_scope, { Field });
343
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Field.jsx", error: String((e && e.message) || e) }); }
344
-
345
- // components/forms/Switch.jsx
346
- try { (() => {
347
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
348
- const CSS = `
349
- .s2-switch{ display:inline-flex; align-items:center; gap:var(--space-150); cursor:pointer; font:var(--type-ui); color:var(--text-body); user-select:none; }
350
- .s2-switch input{ position:absolute; opacity:0; width:0; height:0; }
351
- .s2-switch__track{
352
- width:32px; height:18px; flex:none; border-radius:var(--radius-full);
353
- background:var(--s2-gray-300); position:relative; transition:background var(--duration-fast) var(--ease-out);
354
- }
355
- .s2-switch__track::after{
356
- content:''; position:absolute; top:2px; left:2px; width:14px; height:14px;
357
- border-radius:var(--radius-full); background:#fff; box-shadow:var(--shadow-raised);
358
- transition:transform var(--duration-default) var(--ease-out);
359
- }
360
- .s2-switch:hover .s2-switch__track{ background:var(--s2-gray-400); }
361
- .s2-switch input:checked + .s2-switch__track{ background:var(--accent); }
362
- .s2-switch input:checked + .s2-switch__track::after{ transform:translateX(14px); }
363
- .s2-switch input:focus-visible + .s2-switch__track{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:var(--focus-ring-offset); }
364
- .s2-switch input:disabled + .s2-switch__track{ background:var(--border-default); }
365
- `;
366
- let injected = false;
367
- function useCSS() {
368
- if (typeof document !== 'undefined' && !injected) {
369
- const e = document.createElement('style');
370
- e.textContent = CSS;
371
- e.dataset.s2 = 'switch';
372
- document.head.appendChild(e);
373
- injected = true;
374
- }
375
- }
376
- function Switch({
377
- checked,
378
- onChange,
379
- children,
380
- disabled = false,
381
- ...rest
382
- }) {
383
- useCSS();
384
- return /*#__PURE__*/React.createElement("label", {
385
- className: "s2-switch"
386
- }, /*#__PURE__*/React.createElement("input", _extends({
387
- type: "checkbox",
388
- role: "switch",
389
- checked: checked,
390
- onChange: onChange,
391
- disabled: disabled
392
- }, rest)), /*#__PURE__*/React.createElement("span", {
393
- className: "s2-switch__track"
394
- }), children && /*#__PURE__*/React.createElement("span", null, children));
395
- }
396
- Object.assign(__ds_scope, { Switch });
397
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Switch.jsx", error: String((e && e.message) || e) }); }
398
-
399
- // components/navigation/Tabs.jsx
400
- try { (() => {
401
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
402
- /* Spectrum 2 quiet tabs with an accent underline — the primary navigation in
403
- Chan Compass (Signals / Rotation / News / Research / Automation / Model). */
404
- const CSS = `
405
- .s2-tabs{ display:flex; gap:var(--space-300); border-bottom:var(--border-width-200) solid var(--border-default); }
406
- .s2-tab{
407
- appearance:none; background:none; border:none; cursor:pointer;
408
- padding:var(--space-150) 2px; margin-bottom:-2px;
409
- font:var(--font-weight-semibold) var(--font-size-200)/1.2 var(--font-sans);
410
- color:var(--text-muted); border-bottom:var(--border-width-200) solid transparent;
411
- display:inline-flex; align-items:center; gap:var(--space-100);
412
- transition:var(--transition-colors);
413
- }
414
- .s2-tab:hover{ color:var(--text-body); }
415
- .s2-tab--selected{ color:var(--accent); border-bottom-color:var(--accent); }
416
- .s2-tab:focus-visible{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:2px; border-radius:var(--radius-sm); }
417
- .s2-tab__count{
418
- font:var(--font-weight-semibold) var(--font-size-50)/1 var(--font-sans);
419
- background:var(--surface-subtle); color:var(--text-secondary);
420
- padding:2px 6px; border-radius:var(--radius-full);
421
- }
422
- .s2-tab--selected .s2-tab__count{ background:var(--accent-subtle); color:var(--accent-text); }
423
- `;
424
- let injected = false;
425
- function useCSS() {
426
- if (typeof document !== 'undefined' && !injected) {
427
- const e = document.createElement('style');
428
- e.textContent = CSS;
429
- e.dataset.s2 = 'tabs';
430
- document.head.appendChild(e);
431
- injected = true;
432
- }
433
- }
434
- function Tabs({
435
- items = [],
436
- value,
437
- onChange,
438
- className = '',
439
- ...rest
440
- }) {
441
- useCSS();
442
- return /*#__PURE__*/React.createElement("div", _extends({
443
- className: ['s2-tabs', className].filter(Boolean).join(' '),
444
- role: "tablist"
445
- }, rest), items.map(it => {
446
- const id = typeof it === 'string' ? it : it.id;
447
- const label = typeof it === 'string' ? it : it.label;
448
- const selected = id === value;
449
- return /*#__PURE__*/React.createElement("button", {
450
- key: id,
451
- role: "tab",
452
- "aria-selected": selected,
453
- className: ['s2-tab', selected && 's2-tab--selected'].filter(Boolean).join(' '),
454
- onClick: () => onChange && onChange(id)
455
- }, typeof it === 'object' && it.icon, label, typeof it === 'object' && it.count != null && /*#__PURE__*/React.createElement("span", {
456
- className: "s2-tab__count"
457
- }, it.count));
458
- }));
459
- }
460
- Object.assign(__ds_scope, { Tabs });
461
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/navigation/Tabs.jsx", error: String((e && e.message) || e) }); }
462
-
463
- // components/status/Badge.jsx
464
- try { (() => {
465
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
466
- const CSS = `
467
- .s2-badge{
468
- display:inline-flex; align-items:center; gap:var(--space-75);
469
- height:20px; padding:0 var(--space-150); border-radius:var(--radius-full);
470
- font:var(--font-weight-semibold) var(--font-size-75)/1 var(--font-sans);
471
- white-space:nowrap;
472
- }
473
- .s2-badge--neutral{ background:var(--surface-subtle); color:var(--text-secondary); }
474
- .s2-badge--accent{ background:var(--accent-subtle); color:var(--accent-text); }
475
- .s2-badge--positive{ background:var(--positive-subtle); color:var(--positive-hover); }
476
- .s2-badge--negative{ background:var(--negative-subtle); color:var(--negative-hover); }
477
- .s2-badge--notice{ background:var(--notice-subtle); color:var(--notice); }
478
- .s2-badge--bold{ color:#fff; }
479
- .s2-badge--bold.s2-badge--accent{ background:var(--accent); }
480
- .s2-badge--bold.s2-badge--positive{ background:var(--positive); }
481
- .s2-badge--bold.s2-badge--negative{ background:var(--negative); }
482
- .s2-badge--bold.s2-badge--neutral{ background:var(--text-secondary); }
483
- `;
484
- let injected = false;
485
- function useCSS() {
486
- if (typeof document !== 'undefined' && !injected) {
487
- const e = document.createElement('style');
488
- e.textContent = CSS;
489
- e.dataset.s2 = 'badge';
490
- document.head.appendChild(e);
491
- injected = true;
492
- }
493
- }
494
- function Badge({
495
- variant = 'neutral',
496
- bold = false,
497
- children,
498
- className = '',
499
- ...rest
500
- }) {
501
- useCSS();
502
- const cls = ['s2-badge', `s2-badge--${variant}`, bold && 's2-badge--bold', className].filter(Boolean).join(' ');
503
- return /*#__PURE__*/React.createElement("span", _extends({
504
- className: cls
505
- }, rest), children);
506
- }
507
- Object.assign(__ds_scope, { Badge });
508
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/status/Badge.jsx", error: String((e && e.message) || e) }); }
509
-
510
- // components/status/SignalBadge.jsx
511
- try { (() => {
512
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
513
- /* Domain component: the BUY / SELL / HOLD / WAIT signal pill that drives the
514
- Signals table. Maps a Chan-engine action to a Spectrum 2 semantic color. */
515
- const CSS = `
516
- .s2-signal{
517
- display:inline-flex; align-items:center; gap:6px;
518
- height:24px; padding:0 var(--space-150); border-radius:var(--radius-full);
519
- font:var(--font-weight-bold) var(--font-size-75)/1 var(--font-sans);
520
- letter-spacing:.04em; text-transform:uppercase; white-space:nowrap; color:#fff;
521
- }
522
- .s2-signal__glyph{ width:7px; height:7px; border-radius:var(--radius-full); background:currentColor; opacity:.9; }
523
- .s2-signal--buy{ background:var(--positive); }
524
- .s2-signal--sell{ background:var(--negative); }
525
- .s2-signal--hold{ background:var(--accent); }
526
- .s2-signal--wait{ background:var(--surface-subtle); color:var(--text-secondary); }
527
- .s2-signal--watch{ background:var(--notice); }
528
- `;
529
- let injected = false;
530
- function useCSS() {
531
- if (typeof document !== 'undefined' && !injected) {
532
- const e = document.createElement('style');
533
- e.textContent = CSS;
534
- e.dataset.s2 = 'signal';
535
- document.head.appendChild(e);
536
- injected = true;
537
- }
538
- }
539
- const MAP = {
540
- BUY: 'buy',
541
- SELL: 'sell',
542
- HOLD: 'hold',
543
- WAIT: 'wait',
544
- WATCH: 'watch'
545
- };
546
- function SignalBadge({
547
- action = 'WAIT',
548
- className = '',
549
- ...rest
550
- }) {
551
- useCSS();
552
- const key = String(action).toUpperCase();
553
- const kind = MAP[key] || 'wait';
554
- return /*#__PURE__*/React.createElement("span", _extends({
555
- className: ['s2-signal', `s2-signal--${kind}`, className].filter(Boolean).join(' ')
556
- }, rest), /*#__PURE__*/React.createElement("span", {
557
- className: "s2-signal__glyph"
558
- }), key);
559
- }
560
- Object.assign(__ds_scope, { SignalBadge });
561
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/status/SignalBadge.jsx", error: String((e && e.message) || e) }); }
562
-
563
- // components/status/StatusLight.jsx
564
- try { (() => {
565
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
566
- const CSS = `
567
- .s2-status{ display:inline-flex; align-items:center; gap:var(--space-100); font:var(--type-ui); color:var(--text-body); }
568
- .s2-status__dot{ width:9px; height:9px; flex:none; border-radius:var(--radius-full); background:var(--flat); }
569
- .s2-status--positive .s2-status__dot{ background:var(--positive); }
570
- .s2-status--negative .s2-status__dot{ background:var(--negative); }
571
- .s2-status--notice .s2-status__dot{ background:var(--notice); }
572
- .s2-status--accent .s2-status__dot{ background:var(--accent); }
573
- .s2-status--neutral .s2-status__dot{ background:var(--text-muted); }
574
- .s2-status--live .s2-status__dot{ box-shadow:0 0 0 0 currentColor; animation:s2-pulse 1.8s var(--ease-out) infinite; color:var(--positive); }
575
- @keyframes s2-pulse{ 0%{ box-shadow:0 0 0 0 rgba(0,122,57,.35);} 70%{ box-shadow:0 0 0 6px rgba(0,122,57,0);} 100%{ box-shadow:0 0 0 0 rgba(0,122,57,0);} }
576
- `;
577
- let injected = false;
578
- function useCSS() {
579
- if (typeof document !== 'undefined' && !injected) {
580
- const e = document.createElement('style');
581
- e.textContent = CSS;
582
- e.dataset.s2 = 'status';
583
- document.head.appendChild(e);
584
- injected = true;
585
- }
586
- }
587
- function StatusLight({
588
- variant = 'neutral',
589
- live = false,
590
- children,
591
- className = '',
592
- ...rest
593
- }) {
594
- useCSS();
595
- const cls = ['s2-status', `s2-status--${variant}`, live && 's2-status--live', className].filter(Boolean).join(' ');
596
- return /*#__PURE__*/React.createElement("span", _extends({
597
- className: cls
598
- }, rest), /*#__PURE__*/React.createElement("span", {
599
- className: "s2-status__dot"
600
- }), children);
601
- }
602
- Object.assign(__ds_scope, { StatusLight });
603
- })(); } catch (e) { __ds_ns.__errors.push({ path: "components/status/StatusLight.jsx", error: String((e && e.message) || e) }); }
604
-
605
- // ui_kits/chan-compass/app.jsx
606
- try { (() => {
607
- /* Chan Compass UI kit — app shell. Header + Tabs + routed content + footer. */
608
- const _DS = window.ChanCompassSpectrum2DesignSystem_b52b37;
609
- const {
610
- Tabs: CCTabs,
611
- StatusLight: CCStatus,
612
- Badge: CCBadge
613
- } = _DS;
614
- const {
615
- useState: useS,
616
- useEffect: useE
617
- } = React;
618
- function Glyph({
619
- name,
620
- size = 18,
621
- color,
622
- style
623
- }) {
624
- useE(() => {
625
- if (window.lucide) window.lucide.createIcons();
626
- });
627
- return /*#__PURE__*/React.createElement("i", {
628
- "data-lucide": name,
629
- style: {
630
- width: size,
631
- height: size,
632
- color,
633
- display: 'inline-flex',
634
- ...style
635
- }
636
- });
637
- }
638
- function App() {
639
- const [tab, setTab] = useS('signals');
640
- const items = [{
641
- id: 'signals',
642
- label: 'Signals',
643
- icon: /*#__PURE__*/React.createElement(Glyph, {
644
- name: "trending-up",
645
- size: 16
646
- })
647
- }, {
648
- id: 'rotation',
649
- label: 'Sector Rotation',
650
- icon: /*#__PURE__*/React.createElement(Glyph, {
651
- name: "refresh-cw",
652
- size: 16
653
- })
654
- }, {
655
- id: 'news',
656
- label: 'Watchlist News',
657
- icon: /*#__PURE__*/React.createElement(Glyph, {
658
- name: "newspaper",
659
- size: 16
660
- }),
661
- count: 2
662
- }, {
663
- id: 'research',
664
- label: 'Auto Research',
665
- icon: /*#__PURE__*/React.createElement(Glyph, {
666
- name: "flask-conical",
667
- size: 16
668
- })
669
- }, {
670
- id: 'model',
671
- label: 'Model',
672
- icon: /*#__PURE__*/React.createElement(Glyph, {
673
- name: "cpu",
674
- size: 16
675
- })
676
- }];
677
- const View = {
678
- signals: window.SignalsView,
679
- rotation: window.RotationView,
680
- news: window.NewsView,
681
- research: window.ResearchView,
682
- model: window.ModelView
683
- }[tab];
684
- return /*#__PURE__*/React.createElement("div", {
685
- className: "cc-app"
686
- }, /*#__PURE__*/React.createElement("header", {
687
- className: "cc-header"
688
- }, /*#__PURE__*/React.createElement("div", {
689
- className: "cc-brand"
690
- }, /*#__PURE__*/React.createElement("div", {
691
- className: "cc-mark"
692
- }, /*#__PURE__*/React.createElement(Glyph, {
693
- name: "compass",
694
- size: 22,
695
- color: "#fff"
696
- })), /*#__PURE__*/React.createElement("div", {
697
- className: "cc-brand-text"
698
- }, /*#__PURE__*/React.createElement("div", {
699
- className: "cc-wordmark"
700
- }, "Chan Compass ", /*#__PURE__*/React.createElement("span", null, "\xB7 US Markets")), /*#__PURE__*/React.createElement("div", {
701
- className: "cc-tagline"
702
- }, "Multi-timeframe \u7F20\u8BBA signal engine \xB7 fully local"))), /*#__PURE__*/React.createElement("div", {
703
- className: "cc-header-right"
704
- }, /*#__PURE__*/React.createElement(CCBadge, {
705
- variant: "accent"
706
- }, /*#__PURE__*/React.createElement(Glyph, {
707
- name: "cpu",
708
- size: 12,
709
- style: {
710
- marginRight: 4
711
- }
712
- }), " Local \xB7 llama.cpp"), /*#__PURE__*/React.createElement(CCStatus, {
713
- variant: "positive",
714
- live: true
715
- }, "Market open"))), /*#__PURE__*/React.createElement("div", {
716
- className: "cc-navbar"
717
- }, /*#__PURE__*/React.createElement(CCTabs, {
718
- value: tab,
719
- onChange: setTab,
720
- items: items
721
- })), /*#__PURE__*/React.createElement("main", {
722
- className: "cc-main"
723
- }, View ? /*#__PURE__*/React.createElement(View, null) : null), /*#__PURE__*/React.createElement("footer", {
724
- className: "cc-footer"
725
- }, /*#__PURE__*/React.createElement("span", null, "Chan Compass \xB7 educational tool, not investment advice"), /*#__PURE__*/React.createElement("span", {
726
- className: "cc-foot-sep"
727
- }, "\xB7"), /*#__PURE__*/React.createElement("span", null, "data: Yahoo Finance"), /*#__PURE__*/React.createElement("span", {
728
- className: "cc-foot-sep"
729
- }, "\xB7"), /*#__PURE__*/React.createElement("span", null, "design language: Adobe Spectrum 2")));
730
- }
731
- ReactDOM.createRoot(document.getElementById('root')).render(/*#__PURE__*/React.createElement(App, null));
732
- })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/chan-compass/app.jsx", error: String((e && e.message) || e) }); }
733
-
734
- // ui_kits/chan-compass/data.js
735
- try { (() => {
736
- // Fake data for the Chan Compass UI kit — shapes mirror the real signal_runner /
737
- // rotation engine output, values are illustrative.
738
- window.CC_DATA = {
739
- asof: 'Jun 12, 2026 · 18:10 ET',
740
- signals: [{
741
- t: 'NVDA',
742
- action: 'BUY',
743
- price: 178.42,
744
- chg: +2.43,
745
- conf: 0.82,
746
- weight: 8,
747
- stop: 172.40,
748
- zone: '176.9 – 179.2',
749
- note: 'Weekly pivot uplift confirmed; daily B1 armed off divergence low.'
750
- }, {
751
- t: 'MSFT',
752
- action: 'BUY',
753
- price: 472.10,
754
- chg: +0.91,
755
- conf: 0.74,
756
- weight: 6,
757
- stop: 458.00,
758
- zone: '468 – 474',
759
- note: '30m/15m nested-interval bottom confirms weekly hold-and-add.'
760
- }, {
761
- t: 'AMD',
762
- action: 'HOLD',
763
- price: 142.88,
764
- chg: +1.12,
765
- conf: 0.61,
766
- weight: 5,
767
- stop: 133.50,
768
- zone: '—',
769
- note: 'Unconfirmed daily sell inside weekly uptrend → hold (armed).'
770
- }, {
771
- t: 'AAPL',
772
- action: 'HOLD',
773
- price: 214.55,
774
- chg: -0.34,
775
- conf: 0.58,
776
- weight: 5,
777
- stop: 205.10,
778
- zone: '—',
779
- note: 'Riding pivot; no sublevel sell confirmation yet.'
780
- }, {
781
- t: 'TSLA',
782
- action: 'SELL',
783
- price: 243.17,
784
- chg: -3.08,
785
- conf: 0.69,
786
- weight: 0,
787
- stop: 251.00,
788
- zone: '242 – 246',
789
- note: 'Daily S3 pivot breakdown; nested-interval top confirmed.'
790
- }, {
791
- t: 'META',
792
- action: 'WATCH',
793
- price: 611.40,
794
- chg: +0.22,
795
- conf: 0.44,
796
- weight: 0,
797
- stop: '—',
798
- zone: '—',
799
- note: 'Approaching weekly pivot edge; no signal armed.'
800
- }, {
801
- t: 'AMZN',
802
- action: 'WAIT',
803
- price: 201.66,
804
- chg: -0.51,
805
- conf: 0.39,
806
- weight: 0,
807
- stop: '—',
808
- zone: '—',
809
- note: 'Inside consolidation; wait for level resolution.'
810
- }, {
811
- t: 'GOOGL',
812
- action: 'WAIT',
813
- price: 182.03,
814
- chg: +0.08,
815
- conf: 0.35,
816
- weight: 0,
817
- stop: '—',
818
- zone: '—',
819
- note: 'No multi-timeframe alignment.'
820
- }],
821
- rotation: [{
822
- s: 'Technology',
823
- sym: 'XLK',
824
- d1: +1.84,
825
- d5: +3.2,
826
- d20: +6.1,
827
- rs: +2.4
828
- }, {
829
- s: 'Comm. Services',
830
- sym: 'XLC',
831
- d1: +1.12,
832
- d5: +2.1,
833
- d20: +4.4,
834
- rs: +1.6
835
- }, {
836
- s: 'Financials',
837
- sym: 'XLF',
838
- d1: +0.64,
839
- d5: +1.0,
840
- d20: +2.2,
841
- rs: +0.5
842
- }, {
843
- s: 'Energy',
844
- sym: 'XLE',
845
- d1: +0.41,
846
- d5: -0.8,
847
- d20: -1.9,
848
- rs: -1.1
849
- }, {
850
- s: 'Industrials',
851
- sym: 'XLI',
852
- d1: +0.18,
853
- d5: +0.6,
854
- d20: +1.1,
855
- rs: +0.2
856
- }, {
857
- s: 'Health Care',
858
- sym: 'XLV',
859
- d1: -0.22,
860
- d5: -0.4,
861
- d20: +0.3,
862
- rs: -0.4
863
- }, {
864
- s: 'Cons. Staples',
865
- sym: 'XLP',
866
- d1: -0.38,
867
- d5: -0.9,
868
- d20: -1.2,
869
- rs: -0.9
870
- }, {
871
- s: 'Utilities',
872
- sym: 'XLU',
873
- d1: -0.51,
874
- d5: -1.3,
875
- d20: -2.0,
876
- rs: -1.3
877
- }, {
878
- s: 'Real Estate',
879
- sym: 'XLRE',
880
- d1: -0.74,
881
- d5: -1.6,
882
- d20: -2.8,
883
- rs: -1.7
884
- }, {
885
- s: 'Materials',
886
- sym: 'XLB',
887
- d1: -0.88,
888
- d5: -1.1,
889
- d20: -1.5,
890
- rs: -0.8
891
- }, {
892
- s: 'Cons. Disc.',
893
- sym: 'XLY',
894
- d1: -1.06,
895
- d5: -2.0,
896
- d20: -3.4,
897
- rs: -2.1
898
- }],
899
- reports: ['NVDA · 2026-06-12', 'TSLA · 2026-06-11', 'MSFT · 2026-06-10', 'AMD · 2026-06-09']
900
- };
901
- })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/chan-compass/data.js", error: String((e && e.message) || e) }); }
902
-
903
- // ui_kits/chan-compass/views.jsx
904
- try { (() => {
905
- /* Chan Compass UI kit — view components. Each consumes the design-system
906
- primitives from the bundle namespace + Lucide line icons. Exported to window
907
- for app.jsx to compose. */
908
- const DS = window.ChanCompassSpectrum2DesignSystem_b52b37;
909
- const {
910
- Button,
911
- Field,
912
- Checkbox,
913
- Switch,
914
- Card,
915
- InlineAlert,
916
- Badge,
917
- StatusLight,
918
- SignalBadge,
919
- Tabs
920
- } = DS;
921
- const {
922
- useState,
923
- useEffect
924
- } = React;
925
- function Icon({
926
- name,
927
- size = 18,
928
- color,
929
- style
930
- }) {
931
- // Lucide renders by replacing <i data-lucide>. Re-run after mount.
932
- useEffect(() => {
933
- if (window.lucide) window.lucide.createIcons();
934
- });
935
- return /*#__PURE__*/React.createElement("i", {
936
- "data-lucide": name,
937
- style: {
938
- width: size,
939
- height: size,
940
- color,
941
- display: 'inline-flex',
942
- ...style
943
- }
944
- });
945
- }
946
- const fmtPct = v => typeof v === 'number' ? (v > 0 ? '+' : '') + v.toFixed(2) + '%' : v;
947
- const dirColor = v => v > 0 ? 'var(--up)' : v < 0 ? 'var(--down)' : 'var(--flat)';
948
-
949
- /* ─────────────────────────── KPI strip ─────────────────────────── */
950
- function Kpi({
951
- label,
952
- value,
953
- tone
954
- }) {
955
- return /*#__PURE__*/React.createElement("div", {
956
- style: {
957
- flex: 1,
958
- padding: '14px 18px',
959
- background: 'var(--surface-card)',
960
- border: '1px solid var(--border-hairline)',
961
- borderRadius: 'var(--radius-lg)',
962
- boxShadow: 'var(--shadow-raised)'
963
- }
964
- }, /*#__PURE__*/React.createElement("div", {
965
- style: {
966
- font: 'var(--font-weight-bold) 28px/1 var(--font-sans)',
967
- color: tone || 'var(--text-heading)'
968
- }
969
- }, value), /*#__PURE__*/React.createElement("div", {
970
- style: {
971
- font: 'var(--type-detail)',
972
- color: 'var(--text-muted)',
973
- marginTop: 4
974
- }
975
- }, label));
976
- }
977
-
978
- /* ─────────────────────────── Signals ─────────────────────────── */
979
- function SignalsView() {
980
- const D = window.CC_DATA;
981
- const [pool, setPool] = useState('AAPL, MSFT, NVDA, TSLA, AMZN, GOOGL, META, AMD');
982
- const [force, setForce] = useState(false);
983
- const [running, setRunning] = useState(false);
984
- const [ran, setRan] = useState(true);
985
- const [sel, setSel] = useState('NVDA');
986
- const [explained, setExplained] = useState(false);
987
- const rows = D.signals;
988
- const counts = rows.reduce((a, r) => {
989
- a[r.action] = (a[r.action] || 0) + 1;
990
- return a;
991
- }, {});
992
- const cur = rows.find(r => r.t === sel) || rows[0];
993
- const run = () => {
994
- setRunning(true);
995
- setRan(false);
996
- setExplained(false);
997
- setTimeout(() => {
998
- setRunning(false);
999
- setRan(true);
1000
- }, 1100);
1001
- };
1002
- return /*#__PURE__*/React.createElement("div", {
1003
- style: {
1004
- display: 'flex',
1005
- flexDirection: 'column',
1006
- gap: 'var(--space-300)'
1007
- }
1008
- }, /*#__PURE__*/React.createElement("div", {
1009
- style: {
1010
- display: 'flex',
1011
- gap: 'var(--space-200)'
1012
- }
1013
- }, /*#__PURE__*/React.createElement(Kpi, {
1014
- label: "BUY signals",
1015
- value: counts.BUY || 0,
1016
- tone: "var(--up)"
1017
- }), /*#__PURE__*/React.createElement(Kpi, {
1018
- label: "SELL signals",
1019
- value: counts.SELL || 0,
1020
- tone: "var(--down)"
1021
- }), /*#__PURE__*/React.createElement(Kpi, {
1022
- label: "Holding",
1023
- value: counts.HOLD || 0,
1024
- tone: "var(--accent)"
1025
- }), /*#__PURE__*/React.createElement(Kpi, {
1026
- label: "Watch / wait",
1027
- value: (counts.WATCH || 0) + (counts.WAIT || 0)
1028
- })), /*#__PURE__*/React.createElement(Card, {
1029
- title: "Tomorrow's plan",
1030
- subtitle: "Long-hold mode \xB7 sorted BUY \u2192 SELL \u2192 HOLD \u2192 WAIT",
1031
- action: /*#__PURE__*/React.createElement(Badge, {
1032
- variant: "neutral"
1033
- }, D.asof)
1034
- }, /*#__PURE__*/React.createElement("div", {
1035
- style: {
1036
- display: 'flex',
1037
- gap: 'var(--space-200)',
1038
- alignItems: 'flex-end',
1039
- marginBottom: 'var(--space-250)'
1040
- }
1041
- }, /*#__PURE__*/React.createElement(Field, {
1042
- label: "Ticker pool",
1043
- mono: true,
1044
- value: pool,
1045
- onChange: e => setPool(e.target.value),
1046
- className: "grow",
1047
- help: "Comma separated \xB7 the unchanged Chan engine runs over each"
1048
- }), /*#__PURE__*/React.createElement(Checkbox, {
1049
- checked: force,
1050
- onChange: e => setForce(e.target.checked)
1051
- }, "Force fresh download"), /*#__PURE__*/React.createElement(Button, {
1052
- variant: "accent",
1053
- onClick: run,
1054
- disabled: running
1055
- }, running ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Icon, {
1056
- name: "loader",
1057
- size: 15
1058
- }), " Running\u2026") : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Icon, {
1059
- name: "play",
1060
- size: 15
1061
- }), " Run analysis"))), /*#__PURE__*/React.createElement("div", {
1062
- className: "cc-table"
1063
- }, /*#__PURE__*/React.createElement("table", null, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", null, "Ticker"), /*#__PURE__*/React.createElement("th", null, "Signal"), /*#__PURE__*/React.createElement("th", {
1064
- className: "num"
1065
- }, "Price"), /*#__PURE__*/React.createElement("th", {
1066
- className: "num"
1067
- }, "\u0394 Day"), /*#__PURE__*/React.createElement("th", null, "Buy/sell zone"), /*#__PURE__*/React.createElement("th", {
1068
- className: "num"
1069
- }, "Conf."), /*#__PURE__*/React.createElement("th", {
1070
- className: "num"
1071
- }, "Stop"), /*#__PURE__*/React.createElement("th", {
1072
- className: "num"
1073
- }, "Wt %"))), /*#__PURE__*/React.createElement("tbody", null, rows.map(r => /*#__PURE__*/React.createElement("tr", {
1074
- key: r.t,
1075
- className: r.t === sel ? 'sel' : '',
1076
- onClick: () => {
1077
- setSel(r.t);
1078
- setExplained(false);
1079
- }
1080
- }, /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("span", {
1081
- className: "mono bold"
1082
- }, r.t)), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(SignalBadge, {
1083
- action: r.action
1084
- })), /*#__PURE__*/React.createElement("td", {
1085
- className: "num mono"
1086
- }, r.price.toFixed(2)), /*#__PURE__*/React.createElement("td", {
1087
- className: "num mono",
1088
- style: {
1089
- color: dirColor(r.chg)
1090
- }
1091
- }, fmtPct(r.chg)), /*#__PURE__*/React.createElement("td", {
1092
- className: "mono dim"
1093
- }, r.zone), /*#__PURE__*/React.createElement("td", {
1094
- className: "num"
1095
- }, /*#__PURE__*/React.createElement(ConfBar, {
1096
- v: r.conf
1097
- })), /*#__PURE__*/React.createElement("td", {
1098
- className: "num mono dim"
1099
- }, r.stop === '—' ? '—' : typeof r.stop === 'number' ? r.stop.toFixed(2) : r.stop), /*#__PURE__*/React.createElement("td", {
1100
- className: "num mono"
1101
- }, r.weight ? r.weight : '—'))))))), /*#__PURE__*/React.createElement("div", {
1102
- style: {
1103
- display: 'grid',
1104
- gridTemplateColumns: '1fr 1fr',
1105
- gap: 'var(--space-300)',
1106
- alignItems: 'start'
1107
- }
1108
- }, /*#__PURE__*/React.createElement(Card, {
1109
- title: `Decision log · ${cur.t}`,
1110
- subtitle: "The engine's full multi-timeframe ruling chain"
1111
- }, /*#__PURE__*/React.createElement("div", {
1112
- className: "cc-log"
1113
- }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
1114
- className: "mono dim"
1115
- }, "\u6708\u7EBF monthly"), " \u4E0A\u6DA8\u8D8B\u52BF \xB7 \u4E2D\u67A2\u4E0A\u79FB \u2713"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
1116
- className: "mono dim"
1117
- }, "\u5468\u7EBF weekly"), " \u7B2C\u4E09\u7C7B\u4E70\u70B9 B3 \xB7 \u64CD\u4F5C\u7EA7\u522B \u2713"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
1118
- className: "mono dim"
1119
- }, "\u65E5\u7EBF daily"), " ", cur.action === 'SELL' ? 'S3 中枢破位 · 确认顶背驰' : 'B1 背驰 · 已武装 (armed)', " "), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
1120
- className: "mono dim"
1121
- }, "60m / 30m"), " \u533A\u95F4\u5957\u786E\u8BA4 nested-interval \u2713"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
1122
- className: "mono dim"
1123
- }, "15m / 5m"), " \u6B21\u7EA7\u522B", cur.action === 'SELL' ? '卖点确认' : '买点未确认 → 持有'), /*#__PURE__*/React.createElement("div", {
1124
- className: "cc-log-note"
1125
- }, cur.note)), /*#__PURE__*/React.createElement("div", {
1126
- style: {
1127
- marginTop: 'var(--space-200)'
1128
- }
1129
- }, /*#__PURE__*/React.createElement(Button, {
1130
- variant: "secondary",
1131
- size: "sm",
1132
- onClick: () => setExplained(true)
1133
- }, /*#__PURE__*/React.createElement(Icon, {
1134
- name: "languages",
1135
- size: 14
1136
- }), " Explain in English (local LLM)"))), explained ? /*#__PURE__*/React.createElement(InlineAlert, {
1137
- variant: "ai",
1138
- title: "Translator sub-agent \xB7 Qwen3-1.7B \xB7 llama.cpp"
1139
- }, /*#__PURE__*/React.createElement("div", {
1140
- style: {
1141
- display: 'flex',
1142
- flexDirection: 'column',
1143
- gap: 6,
1144
- marginTop: 4
1145
- }
1146
- }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("b", null, "Action:"), " ", cur.action, cur.action === 'BUY' ? ' — add on weekly pivot uplift' : cur.action === 'SELL' ? ' — exit, top confirmed' : ' — hold the position', "."), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("b", null, "Why:"), " Monthly & weekly gates passed; daily ", cur.action === 'SELL' ? 'broke the pivot (S3)' : 'B1 armed off the divergence low', "; intraday ", cur.action === 'SELL' ? 'confirmed the top' : 'has not confirmed a sell', "."), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("b", null, "Invalidation:"), " ", cur.stop === '—' ? 'no active stop' : `flips below ${typeof cur.stop === 'number' ? cur.stop.toFixed(2) : cur.stop}`, "."))) : /*#__PURE__*/React.createElement("div", {
1147
- className: "cc-empty"
1148
- }, /*#__PURE__*/React.createElement(Icon, {
1149
- name: "sparkles",
1150
- size: 22,
1151
- color: "var(--text-disabled)"
1152
- }), /*#__PURE__*/React.createElement("div", null, "AI explanation appears here.", /*#__PURE__*/React.createElement("br", null), "Select a ticker, then \u201CExplain in English\u201D."))));
1153
- }
1154
- function ConfBar({
1155
- v
1156
- }) {
1157
- return /*#__PURE__*/React.createElement("span", {
1158
- style: {
1159
- display: 'inline-flex',
1160
- alignItems: 'center',
1161
- gap: 6,
1162
- justifyContent: 'flex-end'
1163
- }
1164
- }, /*#__PURE__*/React.createElement("span", {
1165
- style: {
1166
- width: 46,
1167
- height: 6,
1168
- borderRadius: 'var(--radius-full)',
1169
- background: 'var(--surface-subtle)',
1170
- overflow: 'hidden'
1171
- }
1172
- }, /*#__PURE__*/React.createElement("span", {
1173
- style: {
1174
- display: 'block',
1175
- height: '100%',
1176
- width: `${v * 100}%`,
1177
- background: v > 0.7 ? 'var(--positive)' : v > 0.5 ? 'var(--accent)' : 'var(--s2-gray-400)'
1178
- }
1179
- })), /*#__PURE__*/React.createElement("span", {
1180
- className: "mono dim",
1181
- style: {
1182
- fontSize: 11
1183
- }
1184
- }, Math.round(v * 100)));
1185
- }
1186
-
1187
- /* ─────────────────────────── Rotation ─────────────────────────── */
1188
- function RotationView() {
1189
- const D = window.CC_DATA;
1190
- const [ai, setAi] = useState(false);
1191
- const max = Math.max(...D.rotation.map(r => Math.abs(r.d1)));
1192
- return /*#__PURE__*/React.createElement("div", {
1193
- style: {
1194
- display: 'flex',
1195
- flexDirection: 'column',
1196
- gap: 'var(--space-300)'
1197
- }
1198
- }, /*#__PURE__*/React.createElement(InlineAlert, {
1199
- variant: "informative",
1200
- title: "Where capital is flowing"
1201
- }, "11 SPDR sector ETFs (full S&P 500). Flow proxy = change % \xD7 dollar volume; RS = return minus SPY."), /*#__PURE__*/React.createElement("div", {
1202
- style: {
1203
- display: 'grid',
1204
- gridTemplateColumns: '1.4fr 1fr',
1205
- gap: 'var(--space-300)',
1206
- alignItems: 'start'
1207
- }
1208
- }, /*#__PURE__*/React.createElement(Card, {
1209
- title: "Sector rotation",
1210
- subtitle: "1-day flow \xB7 today",
1211
- action: /*#__PURE__*/React.createElement(Button, {
1212
- variant: "secondary",
1213
- size: "sm"
1214
- }, /*#__PURE__*/React.createElement(Icon, {
1215
- name: "refresh-cw",
1216
- size: 14
1217
- }), " Refresh")
1218
- }, /*#__PURE__*/React.createElement("div", {
1219
- className: "cc-flow"
1220
- }, D.rotation.map(r => /*#__PURE__*/React.createElement("div", {
1221
- key: r.sym,
1222
- className: "cc-flow-row"
1223
- }, /*#__PURE__*/React.createElement("span", {
1224
- className: "cc-flow-name"
1225
- }, /*#__PURE__*/React.createElement("span", {
1226
- className: "mono bold"
1227
- }, r.sym), " ", /*#__PURE__*/React.createElement("span", {
1228
- className: "dim"
1229
- }, r.s)), /*#__PURE__*/React.createElement("span", {
1230
- className: "cc-flow-track"
1231
- }, /*#__PURE__*/React.createElement("span", {
1232
- className: "cc-flow-bar",
1233
- style: {
1234
- width: `${Math.abs(r.d1) / max * 50}%`,
1235
- marginLeft: r.d1 < 0 ? `${50 - Math.abs(r.d1) / max * 50}%` : '50%',
1236
- background: dirColor(r.d1)
1237
- }
1238
- }), /*#__PURE__*/React.createElement("span", {
1239
- className: "cc-flow-mid"
1240
- })), /*#__PURE__*/React.createElement("span", {
1241
- className: "num mono",
1242
- style: {
1243
- color: dirColor(r.d1),
1244
- width: 54
1245
- }
1246
- }, fmtPct(r.d1)))))), /*#__PURE__*/React.createElement("div", {
1247
- style: {
1248
- display: 'flex',
1249
- flexDirection: 'column',
1250
- gap: 'var(--space-200)'
1251
- }
1252
- }, /*#__PURE__*/React.createElement(Card, {
1253
- title: "Multi-window trend",
1254
- elevation: "raised"
1255
- }, /*#__PURE__*/React.createElement("div", {
1256
- className: "cc-table compact"
1257
- }, /*#__PURE__*/React.createElement("table", null, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", null, "ETF"), /*#__PURE__*/React.createElement("th", {
1258
- className: "num"
1259
- }, "5-day"), /*#__PURE__*/React.createElement("th", {
1260
- className: "num"
1261
- }, "20-day"), /*#__PURE__*/React.createElement("th", {
1262
- className: "num"
1263
- }, "RS vs SPY"))), /*#__PURE__*/React.createElement("tbody", null, D.rotation.slice(0, 6).map(r => /*#__PURE__*/React.createElement("tr", {
1264
- key: r.sym
1265
- }, /*#__PURE__*/React.createElement("td", {
1266
- className: "mono bold"
1267
- }, r.sym), /*#__PURE__*/React.createElement("td", {
1268
- className: "num mono",
1269
- style: {
1270
- color: dirColor(r.d5)
1271
- }
1272
- }, fmtPct(r.d5)), /*#__PURE__*/React.createElement("td", {
1273
- className: "num mono",
1274
- style: {
1275
- color: dirColor(r.d20)
1276
- }
1277
- }, fmtPct(r.d20)), /*#__PURE__*/React.createElement("td", {
1278
- className: "num mono",
1279
- style: {
1280
- color: dirColor(r.rs)
1281
- }
1282
- }, fmtPct(r.rs)))))))), /*#__PURE__*/React.createElement(Button, {
1283
- variant: "accent",
1284
- onClick: () => setAi(true)
1285
- }, /*#__PURE__*/React.createElement(Icon, {
1286
- name: "bot",
1287
- size: 15
1288
- }), " AI narrative (local LLM)"), ai && /*#__PURE__*/React.createElement(InlineAlert, {
1289
- variant: "ai",
1290
- title: "Narrator sub-agent \xB7 Qwen3-1.7B"
1291
- }, "Capital is rotating ", /*#__PURE__*/React.createElement("b", null, "into Technology & Comm. Services"), " (XLK +1.84%, leading on both 5- and 20-day) and", /*#__PURE__*/React.createElement("b", null, " out of Consumer Discretionary & Real Estate"), ". Today's moves agree with the monthly trend \u2014 risk-on persists. ", /*#__PURE__*/React.createElement("b", null, "Watch:"), " Energy's 1-day pop diverges from its negative 20-day; likely a bounce, not a turn."))));
1292
- }
1293
-
1294
- /* ─────────────────────────── Research ─────────────────────────── */
1295
- function ResearchView() {
1296
- const D = window.CC_DATA;
1297
- const [tic, setTic] = useState('');
1298
- const [step, setStep] = useState(0); // 0 idle, 1..5 running, 6 done
1299
- const steps = ['PLAN', 'Fundamentals', 'Quarterly financials', 'Price action + Chan engine', 'News', 'Report'];
1300
- const run = () => {
1301
- setStep(1);
1302
- let i = 1;
1303
- const tick = () => {
1304
- i++;
1305
- setStep(i);
1306
- if (i < 6) setTimeout(tick, 650);
1307
- };
1308
- setTimeout(tick, 650);
1309
- };
1310
- return /*#__PURE__*/React.createElement("div", {
1311
- style: {
1312
- display: 'grid',
1313
- gridTemplateColumns: '1fr 300px',
1314
- gap: 'var(--space-300)',
1315
- alignItems: 'start'
1316
- }
1317
- }, /*#__PURE__*/React.createElement(Card, {
1318
- title: "Auto research agent",
1319
- subtitle: "Fully local \xB7 PLAN \u2192 5 evidence tools \u2192 sectioned report"
1320
- }, /*#__PURE__*/React.createElement("div", {
1321
- style: {
1322
- display: 'flex',
1323
- gap: 'var(--space-150)',
1324
- alignItems: 'flex-end',
1325
- marginBottom: 'var(--space-250)'
1326
- }
1327
- }, /*#__PURE__*/React.createElement(Field, {
1328
- label: "Ticker",
1329
- placeholder: "e.g. NVDA",
1330
- value: tic,
1331
- onChange: e => setTic(e.target.value),
1332
- className: "grow"
1333
- }), /*#__PURE__*/React.createElement(Button, {
1334
- variant: "accent",
1335
- onClick: run,
1336
- disabled: step > 0 && step < 6
1337
- }, /*#__PURE__*/React.createElement(Icon, {
1338
- name: "bot",
1339
- size: 15
1340
- }), " Run research agent")), step === 0 ? /*#__PURE__*/React.createElement("div", {
1341
- className: "cc-empty tall"
1342
- }, /*#__PURE__*/React.createElement(Icon, {
1343
- name: "file-search",
1344
- size: 24,
1345
- color: "var(--text-disabled)"
1346
- }), /*#__PURE__*/React.createElement("div", null, "Agent trace + sectioned report appear here.")) : /*#__PURE__*/React.createElement("div", {
1347
- style: {
1348
- display: 'flex',
1349
- flexDirection: 'column',
1350
- gap: 10
1351
- }
1352
- }, steps.map((s, idx) => /*#__PURE__*/React.createElement("div", {
1353
- key: s,
1354
- className: "cc-step"
1355
- }, /*#__PURE__*/React.createElement("span", {
1356
- className: `cc-step-dot ${step > idx ? 'done' : step === idx + 1 ? 'active' : ''}`
1357
- }, step > idx + 1 ? /*#__PURE__*/React.createElement(Icon, {
1358
- name: "check",
1359
- size: 12,
1360
- color: "#fff"
1361
- }) : idx + 1), /*#__PURE__*/React.createElement("span", {
1362
- style: {
1363
- color: step > idx ? 'var(--text-body)' : 'var(--text-muted)'
1364
- }
1365
- }, s))), step >= 6 && /*#__PURE__*/React.createElement(InlineAlert, {
1366
- variant: "ai",
1367
- title: `Analyst · ${tic || 'NVDA'} · Qwen3-4B`
1368
- }, /*#__PURE__*/React.createElement("b", null, "Valuation:"), " rich vs 5-yr median but justified by datacenter demand.", /*#__PURE__*/React.createElement("b", null, " Moat:"), " CUDA lock-in + supply-chain priority. ", /*#__PURE__*/React.createElement("b", null, "Chan timing:"), " weekly B3 active, daily B1 armed \u2014 accumulation favorable. ", /*#__PURE__*/React.createElement("b", null, "Risks:"), " export controls, hyperscaler capex digestion."))), /*#__PURE__*/React.createElement(Card, {
1369
- title: "Report library",
1370
- subtitle: "Auto + manual \xB7 /data",
1371
- elevation: "raised"
1372
- }, /*#__PURE__*/React.createElement("div", {
1373
- className: "cc-list"
1374
- }, D.reports.map((r, i) => /*#__PURE__*/React.createElement("button", {
1375
- key: r,
1376
- className: `cc-list-item ${i === 0 ? 'sel' : ''}`
1377
- }, /*#__PURE__*/React.createElement(Icon, {
1378
- name: "file-text",
1379
- size: 15,
1380
- color: "var(--text-muted)"
1381
- }), /*#__PURE__*/React.createElement("span", {
1382
- className: "mono"
1383
- }, r))))));
1384
- }
1385
-
1386
- /* ─────────────────────────── News ─────────────────────────── */
1387
- function NewsView() {
1388
- const [hold, setHold] = useState('NVDA, TSLA, AAPL');
1389
- const [checked, setChecked] = useState(false);
1390
- return /*#__PURE__*/React.createElement("div", {
1391
- style: {
1392
- display: 'flex',
1393
- flexDirection: 'column',
1394
- gap: 'var(--space-300)',
1395
- maxWidth: 760
1396
- }
1397
- }, /*#__PURE__*/React.createElement(Card, {
1398
- title: "Watchlist news",
1399
- subtitle: "For each holding, only today's news is checked"
1400
- }, /*#__PURE__*/React.createElement("div", {
1401
- style: {
1402
- display: 'flex',
1403
- gap: 'var(--space-150)',
1404
- alignItems: 'flex-end',
1405
- marginBottom: 'var(--space-200)'
1406
- }
1407
- }, /*#__PURE__*/React.createElement(Field, {
1408
- label: "My holdings",
1409
- mono: true,
1410
- value: hold,
1411
- onChange: e => setHold(e.target.value),
1412
- className: "grow"
1413
- }), /*#__PURE__*/React.createElement(Button, {
1414
- variant: "secondary"
1415
- }, /*#__PURE__*/React.createElement(Icon, {
1416
- name: "save",
1417
- size: 14
1418
- }), " Save"), /*#__PURE__*/React.createElement(Button, {
1419
- variant: "accent",
1420
- onClick: () => setChecked(true)
1421
- }, /*#__PURE__*/React.createElement(Icon, {
1422
- name: "search",
1423
- size: 15
1424
- }), " Check today's news")), !checked ? /*#__PURE__*/React.createElement("div", {
1425
- className: "cc-empty"
1426
- }, /*#__PURE__*/React.createElement(Icon, {
1427
- name: "newspaper",
1428
- size: 22,
1429
- color: "var(--text-disabled)"
1430
- }), /*#__PURE__*/React.createElement("div", null, "News briefs appear here.")) : /*#__PURE__*/React.createElement("div", {
1431
- style: {
1432
- display: 'flex',
1433
- flexDirection: 'column',
1434
- gap: 'var(--space-150)'
1435
- }
1436
- }, /*#__PURE__*/React.createElement(InlineAlert, {
1437
- variant: "ai",
1438
- title: "NVDA \xB7 AI brief"
1439
- }, "New datacenter GPU order from a hyperscaler reported pre-market; reinforces the active weekly B3 buy structure."), /*#__PURE__*/React.createElement(InlineAlert, {
1440
- variant: "ai",
1441
- title: "TSLA \xB7 AI brief"
1442
- }, "Delivery-miss headline; aligns with today's daily S3 breakdown \u2014 confirms the SELL."), /*#__PURE__*/React.createElement("div", {
1443
- className: "cc-quiet"
1444
- }, /*#__PURE__*/React.createElement(StatusLight, {
1445
- variant: "neutral"
1446
- }, "Quiet today \xB7 AAPL")))));
1447
- }
1448
-
1449
- /* ─────────────────────────── Model ─────────────────────────── */
1450
- function ModelView() {
1451
- const models = ['Qwen3-1.7B', 'Qwen3-4B', 'Qwen3-8B', 'Qwen3-14B'];
1452
- const [pick, setPick] = useState('Qwen3-4B');
1453
- const [loaded, setLoaded] = useState('Qwen3-4B');
1454
- return /*#__PURE__*/React.createElement("div", {
1455
- style: {
1456
- display: 'flex',
1457
- flexDirection: 'column',
1458
- gap: 'var(--space-300)',
1459
- maxWidth: 680
1460
- }
1461
- }, /*#__PURE__*/React.createElement(InlineAlert, {
1462
- variant: "informative",
1463
- title: "Everything runs locally through llama.cpp"
1464
- }, "Qwen3 GGUF weights, all below the 32B cap. Nothing leaves the machine. Signals, rotation & news never depend on it."), /*#__PURE__*/React.createElement(Card, {
1465
- title: "Analyst (deep) model",
1466
- subtitle: "Sub-agent pool \xB7 fast 1.7B fixed + this deep model"
1467
- }, /*#__PURE__*/React.createElement("div", {
1468
- className: "cc-radios"
1469
- }, models.map(m => /*#__PURE__*/React.createElement("label", {
1470
- key: m,
1471
- className: `cc-radio ${pick === m ? 'sel' : ''}`,
1472
- onClick: () => setPick(m)
1473
- }, /*#__PURE__*/React.createElement("span", {
1474
- className: "cc-radio-dot"
1475
- }), /*#__PURE__*/React.createElement("span", {
1476
- className: "mono"
1477
- }, m), loaded === m && /*#__PURE__*/React.createElement(Badge, {
1478
- variant: "positive"
1479
- }, "loaded")))), /*#__PURE__*/React.createElement("div", {
1480
- style: {
1481
- display: 'flex',
1482
- gap: 'var(--space-150)',
1483
- marginTop: 'var(--space-250)',
1484
- alignItems: 'center'
1485
- }
1486
- }, /*#__PURE__*/React.createElement(Button, {
1487
- variant: "accent",
1488
- onClick: () => setLoaded(pick)
1489
- }, /*#__PURE__*/React.createElement(Icon, {
1490
- name: "download",
1491
- size: 15
1492
- }), " Load model"), /*#__PURE__*/React.createElement(Button, {
1493
- variant: "quiet"
1494
- }, /*#__PURE__*/React.createElement(Icon, {
1495
- name: "refresh-cw",
1496
- size: 14
1497
- }), " Refresh status"), /*#__PURE__*/React.createElement("span", {
1498
- style: {
1499
- marginLeft: 'auto'
1500
- }
1501
- }, /*#__PURE__*/React.createElement(StatusLight, {
1502
- variant: "positive",
1503
- live: true
1504
- }, loaded, " ready")))));
1505
- }
1506
- Object.assign(window, {
1507
- SignalsView,
1508
- RotationView,
1509
- ResearchView,
1510
- NewsView,
1511
- ModelView
1512
- });
1513
- })(); } catch (e) { __ds_ns.__errors.push({ path: "ui_kits/chan-compass/views.jsx", error: String((e && e.message) || e) }); }
1514
-
1515
- __ds_ns.Button = __ds_scope.Button;
1516
-
1517
- __ds_ns.Card = __ds_scope.Card;
1518
-
1519
- __ds_ns.InlineAlert = __ds_scope.InlineAlert;
1520
-
1521
- __ds_ns.Checkbox = __ds_scope.Checkbox;
1522
-
1523
- __ds_ns.Field = __ds_scope.Field;
1524
-
1525
- __ds_ns.Switch = __ds_scope.Switch;
1526
-
1527
- __ds_ns.Tabs = __ds_scope.Tabs;
1528
-
1529
- __ds_ns.Badge = __ds_scope.Badge;
1530
-
1531
- __ds_ns.SignalBadge = __ds_scope.SignalBadge;
1532
-
1533
- __ds_ns.StatusLight = __ds_scope.StatusLight;
1534
-
1535
- })();