@newyorkcompute/kalshi-tui 0.1.0 → 0.2.0

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 (97) hide show
  1. package/README.md +35 -0
  2. package/dist/App.d.ts +2 -1
  3. package/dist/App.d.ts.map +1 -1
  4. package/dist/App.js +38 -36
  5. package/dist/App.js.map +1 -1
  6. package/dist/cli.d.ts +2 -2
  7. package/dist/cli.js +28 -33
  8. package/dist/cli.js.map +1 -1
  9. package/dist/components/Footer.d.ts +6 -0
  10. package/dist/components/Footer.d.ts.map +1 -0
  11. package/dist/components/Footer.js +10 -0
  12. package/dist/components/Footer.js.map +1 -0
  13. package/dist/components/Header.d.ts +9 -2
  14. package/dist/components/Header.d.ts.map +1 -1
  15. package/dist/components/Header.js +7 -9
  16. package/dist/components/Header.js.map +1 -1
  17. package/dist/components/Markets.d.ts +21 -0
  18. package/dist/components/Markets.d.ts.map +1 -0
  19. package/dist/components/Markets.js +24 -0
  20. package/dist/components/Markets.js.map +1 -0
  21. package/dist/components/Orderbook.d.ts +18 -5
  22. package/dist/components/Orderbook.d.ts.map +1 -1
  23. package/dist/components/Orderbook.js +25 -36
  24. package/dist/components/Orderbook.js.map +1 -1
  25. package/dist/components/Positions.d.ts +13 -2
  26. package/dist/components/Positions.d.ts.map +1 -1
  27. package/dist/components/Positions.js +10 -17
  28. package/dist/components/Positions.js.map +1 -1
  29. package/dist/components/index.d.ts +8 -10
  30. package/dist/components/index.d.ts.map +1 -1
  31. package/dist/components/index.js +8 -11
  32. package/dist/components/index.js.map +1 -1
  33. package/dist/hooks/index.d.ts +4 -4
  34. package/dist/hooks/index.d.ts.map +1 -1
  35. package/dist/hooks/index.js +4 -4
  36. package/dist/hooks/index.js.map +1 -1
  37. package/dist/hooks/useKalshi.d.ts +21 -12
  38. package/dist/hooks/useKalshi.d.ts.map +1 -1
  39. package/dist/hooks/useKalshi.js +139 -19
  40. package/dist/hooks/useKalshi.js.map +1 -1
  41. package/dist/utils.d.ts +32 -0
  42. package/dist/utils.d.ts.map +1 -0
  43. package/dist/utils.js +74 -0
  44. package/dist/utils.js.map +1 -0
  45. package/dist/utils.test.d.ts +2 -0
  46. package/dist/utils.test.d.ts.map +1 -0
  47. package/dist/utils.test.js +101 -0
  48. package/dist/utils.test.js.map +1 -0
  49. package/package.json +6 -8
  50. package/dist/components/HelpModal.d.ts +0 -5
  51. package/dist/components/HelpModal.d.ts.map +0 -1
  52. package/dist/components/HelpModal.js +0 -19
  53. package/dist/components/HelpModal.js.map +0 -1
  54. package/dist/components/MarketList.d.ts +0 -5
  55. package/dist/components/MarketList.d.ts.map +0 -1
  56. package/dist/components/MarketList.js +0 -68
  57. package/dist/components/MarketList.js.map +0 -1
  58. package/dist/components/OrderEntry.d.ts +0 -9
  59. package/dist/components/OrderEntry.d.ts.map +0 -1
  60. package/dist/components/OrderEntry.js +0 -77
  61. package/dist/components/OrderEntry.js.map +0 -1
  62. package/dist/components/SearchBar.d.ts +0 -5
  63. package/dist/components/SearchBar.d.ts.map +0 -1
  64. package/dist/components/SearchBar.js +0 -27
  65. package/dist/components/SearchBar.js.map +0 -1
  66. package/dist/components/StatusBar.d.ts +0 -5
  67. package/dist/components/StatusBar.d.ts.map +0 -1
  68. package/dist/components/StatusBar.js +0 -9
  69. package/dist/components/StatusBar.js.map +0 -1
  70. package/dist/components/ui/Box.d.ts +0 -14
  71. package/dist/components/ui/Box.d.ts.map +0 -1
  72. package/dist/components/ui/Box.js +0 -9
  73. package/dist/components/ui/Box.js.map +0 -1
  74. package/dist/components/ui/Sparkline.d.ts +0 -11
  75. package/dist/components/ui/Sparkline.d.ts.map +0 -1
  76. package/dist/components/ui/Sparkline.js +0 -32
  77. package/dist/components/ui/Sparkline.js.map +0 -1
  78. package/dist/hooks/useMarkets.d.ts +0 -13
  79. package/dist/hooks/useMarkets.d.ts.map +0 -1
  80. package/dist/hooks/useMarkets.js +0 -89
  81. package/dist/hooks/useMarkets.js.map +0 -1
  82. package/dist/hooks/useOrderbook.d.ts +0 -13
  83. package/dist/hooks/useOrderbook.d.ts.map +0 -1
  84. package/dist/hooks/useOrderbook.js +0 -81
  85. package/dist/hooks/useOrderbook.js.map +0 -1
  86. package/dist/hooks/usePortfolio.d.ts +0 -18
  87. package/dist/hooks/usePortfolio.d.ts.map +0 -1
  88. package/dist/hooks/usePortfolio.js +0 -84
  89. package/dist/hooks/usePortfolio.js.map +0 -1
  90. package/dist/stores/app-store.d.ts +0 -17
  91. package/dist/stores/app-store.d.ts.map +0 -1
  92. package/dist/stores/app-store.js +0 -21
  93. package/dist/stores/app-store.js.map +0 -1
  94. package/dist/theme.d.ts +0 -31
  95. package/dist/theme.d.ts.map +0 -1
  96. package/dist/theme.js +0 -37
  97. package/dist/theme.js.map +0 -1
package/README.md CHANGED
@@ -93,6 +93,41 @@ kalshi-tui
93
93
  3. Generate a new API key (you'll create an RSA key pair)
94
94
  4. Save your API Key ID and private key securely
95
95
 
96
+ ## Development
97
+
98
+ ```bash
99
+ # Install dependencies
100
+ npm install
101
+
102
+ # Build the TUI
103
+ npx nx run @newyorkcompute/kalshi-tui:build
104
+
105
+ # Run the TUI (loads .env.local)
106
+ npx dotenv -e .env.local -- node packages/tui/dist/cli.js
107
+ ```
108
+
109
+ ### Watch Mode
110
+
111
+ For active development, run the build in watch mode in one terminal:
112
+
113
+ ```bash
114
+ # Terminal 1: Watch for changes
115
+ npx nx run @newyorkcompute/kalshi-tui:dev
116
+ ```
117
+
118
+ Then run the TUI in another terminal:
119
+
120
+ ```bash
121
+ # Terminal 2: Run the app (re-run after changes compile)
122
+ npx dotenv -e .env.local -- node packages/tui/dist/cli.js
123
+ ```
124
+
125
+ ### Tech Stack
126
+
127
+ - **[Ink](https://github.com/vadimdemedes/ink)** - React for the terminal
128
+ - **[@inkjs/ui](https://github.com/vadimdemedes/ink-ui)** - Polished UI components
129
+ - **React 18** - Declarative UI with hooks
130
+
96
131
  ## Built By
97
132
 
98
133
  **New York Compute** — Command-native tools for quantitative research, execution, and market intelligence.
package/dist/App.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Main application component
2
+ * Kalshi TUI - Main Application
3
+ * Clean, minimal, beautiful terminal trading
3
4
  */
4
5
  export declare function App(): import("react/jsx-runtime").JSX.Element;
5
6
  //# sourceMappingURL=App.d.ts.map
package/dist/App.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAaA;;GAEG;AACH,wBAAgB,GAAG,4CA0FlB"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,wBAAgB,GAAG,4CA0FlB"}
package/dist/App.js CHANGED
@@ -1,49 +1,51 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useState } from "react";
3
- import { Box, Text, useApp, useInput } from "ink";
4
- import { Header } from "./components/Header.js";
5
- import { MarketList } from "./components/MarketList.js";
6
- import { Orderbook } from "./components/Orderbook.js";
7
- import { Positions } from "./components/Positions.js";
8
- import { OrderEntry } from "./components/OrderEntry.js";
9
- import { StatusBar } from "./components/StatusBar.js";
10
- import { HelpModal } from "./components/HelpModal.js";
11
- import { SearchBar } from "./components/SearchBar.js";
12
- import { useAppStore } from "./stores/app-store.js";
13
- import { useKalshi } from "./hooks/useKalshi.js";
14
2
  /**
15
- * Main application component
3
+ * Kalshi TUI - Main Application
4
+ * Clean, minimal, beautiful terminal trading
16
5
  */
6
+ import { Box, useApp, useInput, useStdout } from 'ink';
7
+ import { useState, useEffect } from 'react';
8
+ import { Header } from './components/Header.js';
9
+ import { Markets } from './components/Markets.js';
10
+ import { Orderbook } from './components/Orderbook.js';
11
+ import { Positions } from './components/Positions.js';
12
+ import { Footer } from './components/Footer.js';
13
+ import { useKalshi } from './hooks/useKalshi.js';
17
14
  export function App() {
18
15
  const { exit } = useApp();
19
- const [error, setError] = useState(null);
20
- const { isConfigured, configError } = useKalshi();
21
- const selectedMarket = useAppStore((state) => state.selectedMarket);
16
+ const { stdout } = useStdout();
17
+ const [selectedIndex, setSelectedIndex] = useState(0);
18
+ // Get terminal dimensions
19
+ const width = stdout?.columns ?? 120;
20
+ const height = stdout?.rows ?? 40;
21
+ // Fetch data from Kalshi
22
+ const { markets, orderbook, balance, positions, isConnected, error, selectMarket } = useKalshi();
23
+ // Update orderbook when selection changes
24
+ useEffect(() => {
25
+ const ticker = markets[selectedIndex]?.ticker;
26
+ if (ticker) {
27
+ selectMarket(ticker);
28
+ }
29
+ }, [selectedIndex, markets, selectMarket]);
22
30
  // Handle keyboard input
23
31
  useInput((input, key) => {
24
- // Quit on 'q' or Ctrl+C
25
- if (input === "q" || (key.ctrl && input === "c")) {
32
+ if (input === 'q') {
26
33
  exit();
27
34
  }
28
- // Help on '?'
29
- if (input === "?") {
30
- useAppStore.getState().toggleHelp();
35
+ if (key.upArrow) {
36
+ setSelectedIndex(i => Math.max(0, i - 1));
31
37
  }
32
- });
33
- // Check configuration on mount
34
- useEffect(() => {
35
- if (configError) {
36
- setError(configError);
38
+ if (key.downArrow) {
39
+ setSelectedIndex(i => Math.min(markets.length - 1, i + 1));
37
40
  }
38
- }, [configError]);
39
- // Show error screen if not configured
40
- if (error) {
41
- return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "red", bold: true, children: "Configuration Error" }) }), _jsx(Text, { color: "gray", children: error }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Set KALSHI_API_KEY and KALSHI_PRIVATE_KEY environment variables." }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Run `kalshi-tui --help` for more information." }) })] }));
42
- }
43
- // Loading state
44
- if (!isConfigured) {
45
- return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { color: "green", children: "\u2593" }), _jsx(Text, { children: " Connecting to Kalshi..." })] }));
46
- }
47
- return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(Header, {}), _jsx(SearchBar, {}), _jsxs(Box, { flexDirection: "row", flexGrow: 1, children: [_jsxs(Box, { flexDirection: "column", width: "50%", children: [_jsx(MarketList, {}), _jsx(Positions, {})] }), _jsxs(Box, { flexDirection: "column", width: "50%", children: [_jsx(Orderbook, { ticker: selectedMarket }), _jsx(OrderEntry, { ticker: selectedMarket })] })] }), _jsx(StatusBar, {}), _jsx(HelpModal, {})] }));
41
+ });
42
+ // Layout calculations
43
+ const leftWidth = Math.floor(width / 2);
44
+ const contentHeight = height - 6; // Header (3) + Footer (3)
45
+ const marketsHeight = Math.floor(contentHeight * 0.65);
46
+ const positionsHeight = contentHeight - marketsHeight;
47
+ // Get selected market for orderbook
48
+ const selectedMarket = markets[selectedIndex] ?? null;
49
+ return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Header, { balance: balance, isConnected: isConnected, error: error }), _jsxs(Box, { flexDirection: "row", height: contentHeight, children: [_jsxs(Box, { flexDirection: "column", width: leftWidth, children: [_jsx(Markets, { markets: markets, selectedIndex: selectedIndex, height: marketsHeight }), _jsx(Positions, { positions: positions, height: positionsHeight })] }), _jsx(Box, { flexGrow: 1, children: _jsx(Orderbook, { market: selectedMarket, orderbook: orderbook, height: contentHeight }) })] }), _jsx(Footer, {})] }));
48
50
  }
49
51
  //# sourceMappingURL=App.js.map
package/dist/App.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * Kalshi TUI - Terminal Trading Dashboard
4
+ * Built with Ink for buttery-smooth rendering
4
5
  *
5
- * A beautiful terminal interface for Kalshi prediction markets.
6
- * Built by New York Compute.
6
+ * Built by New York Compute
7
7
  */
8
8
  export {};
9
9
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.js CHANGED
@@ -1,10 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { render } from "ink";
4
- import { App } from "./App.js";
3
+ /**
4
+ * Kalshi TUI - Terminal Trading Dashboard
5
+ * Built with Ink for buttery-smooth rendering
6
+ *
7
+ * Built by New York Compute
8
+ */
9
+ import { render } from 'ink';
10
+ import { App } from './App.js';
5
11
  // Handle --help and --version flags
6
12
  const args = process.argv.slice(2);
7
- if (args.includes("--help") || args.includes("-h")) {
13
+ if (args.includes('--help') || args.includes('-h')) {
8
14
  console.log(`
9
15
  Kalshi TUI - Terminal Trading Dashboard
10
16
 
@@ -14,50 +20,39 @@ if (args.includes("--help") || args.includes("-h")) {
14
20
  Options:
15
21
  --help, -h Show this help message
16
22
  --version, -v Show version number
17
- --about Show about information
18
23
 
19
24
  Environment Variables:
20
25
  KALSHI_API_KEY Your Kalshi API key ID (required)
21
26
  KALSHI_PRIVATE_KEY RSA private key in PEM format (required)
22
- KALSHI_BASE_PATH API base URL (optional, defaults to production)
23
27
 
24
- Examples:
25
- $ kalshi-tui
26
- $ KALSHI_API_KEY=xxx KALSHI_PRIVATE_KEY="..." kalshi-tui
28
+ Controls:
29
+ ↑/↓ Navigate markets
30
+ q Quit
27
31
 
28
32
  Built by New York Compute
29
33
  https://newyorkcompute.xyz
30
34
  `);
31
35
  process.exit(0);
32
36
  }
33
- if (args.includes("--version") || args.includes("-v")) {
34
- console.log("0.1.0");
37
+ if (args.includes('--version') || args.includes('-v')) {
38
+ console.log('0.1.0');
35
39
  process.exit(0);
36
40
  }
37
- if (args.includes("--about")) {
38
- console.log(`
39
- ┌──────────────────────────────────────────────────────────┐
40
- │ │
41
- │ ▓ KALSHI TUI
42
- │ NEW YORK COMPUTE │
43
- │ │
44
- │ Free. Open source. Beautiful. │
45
- │ │
46
- │ A terminal so polished that the screenshot alone │
47
- │ is the pitch. No AI. No gimmicks. Pure craft. │
48
- │ │
49
- │ Version: 0.1.0 │
50
- │ License: MIT │
51
- │ │
52
- │ GitHub: github.com/newyorkcompute/kalshi │
53
- │ Website: newyorkcompute.xyz │
54
- │ │
55
- │ Want this for equities? Request early access: │
56
- │ → newyorkcompute.xyz │
57
- │ │
58
- └──────────────────────────────────────────────────────────┘
41
+ // Check if stdin supports raw mode (required for keyboard input)
42
+ const isRawModeSupported = process.stdin.isTTY;
43
+ if (!isRawModeSupported) {
44
+ console.error(`
45
+ Error: Kalshi TUI requires an interactive terminal.
46
+
47
+ This usually happens when running through a task runner or piped input.
48
+
49
+ Try running directly:
50
+ node dist/cli.js
51
+
52
+ Or:
53
+ npx @newyorkcompute/kalshi-tui
59
54
  `);
60
- process.exit(0);
55
+ process.exit(1);
61
56
  }
62
57
  // Render the app
63
58
  render(_jsx(App, {}));
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AASA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,oCAAoC;AACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AACA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,oCAAoC;AACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;CAoBb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iEAAiE;AACjE,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAE/C,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACxB,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;CAUf,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Footer Component
3
+ * Branding and keyboard shortcuts
4
+ */
5
+ export declare function Footer(): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=Footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,MAAM,4CAiBrB"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Footer Component
4
+ * Branding and keyboard shortcuts
5
+ */
6
+ import { Box, Text } from 'ink';
7
+ export function Footer() {
8
+ return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", borderStyle: "single", borderColor: "gray", paddingX: 1, height: 3, width: "100%", children: [_jsxs(Text, { children: ["Built by ", _jsx(Text, { bold: true, children: "New York Compute" }), " \u2022 ", _jsx(Text, { color: "green", children: "newyorkcompute.xyz" })] }), _jsx(Text, { color: "gray", children: "[?] Help [q] Quit" })] }));
9
+ }
10
+ //# sourceMappingURL=Footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,MAAM;IACpB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,cAAc,EAAC,eAAe,EAC9B,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,EACT,KAAK,EAAC,MAAM,aAEZ,MAAC,IAAI,4BACM,KAAC,IAAI,IAAC,IAAI,uCAAwB,cAAG,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,mCAA0B,IACtF,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kCAAyB,IACvC,CACP,CAAC;AACJ,CAAC"}
@@ -1,5 +1,12 @@
1
1
  /**
2
- * Header component with branding and balance
2
+ * Header Component
3
+ * Displays branding, balance, and connection status
3
4
  */
4
- export declare function Header(): import("react/jsx-runtime").JSX.Element;
5
+ interface HeaderProps {
6
+ balance: number | null;
7
+ isConnected: boolean;
8
+ error: string | null;
9
+ }
10
+ export declare function Header({ balance, isConnected, error }: HeaderProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
5
12
  //# sourceMappingURL=Header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,MAAM,4CA4CrB"}
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,WAAW,2CAqClE"}
@@ -1,14 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { formatCurrency } from "@newyorkcompute/kalshi-core";
4
- import { usePortfolio } from "../hooks/usePortfolio.js";
5
- import { useAppStore } from "../stores/app-store.js";
6
2
  /**
7
- * Header component with branding and balance
3
+ * Header Component
4
+ * Displays branding, balance, and connection status
8
5
  */
9
- export function Header() {
10
- const { balance } = usePortfolio();
11
- const isConnected = useAppStore((state) => state.isConnected);
12
- return (_jsxs(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "green", bold: true, children: "\u2593" }), _jsx(Text, { bold: true, children: " KALSHI" })] }), _jsx(Text, { color: "gray", dimColor: true, children: "NEW YORK COMPUTE" })] }), _jsxs(Box, { flexDirection: "column", alignItems: "flex-end", children: [_jsxs(Box, { children: [_jsx(Text, { children: "Balance: " }), _jsx(Text, { color: "white", bold: true, children: balance ? formatCurrency(balance.balance) : "" })] }), _jsxs(Box, { children: [_jsx(Text, { color: isConnected ? "green" : "red", children: isConnected ? "◉" : "○" }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", isConnected ? "connected" : "disconnected"] })] })] })] }));
6
+ import { Box, Text } from 'ink';
7
+ export function Header({ balance, isConnected, error }) {
8
+ const formatCurrency = (cents) => `$${(cents / 100).toFixed(2)}`;
9
+ const balanceText = balance !== null ? formatCurrency(balance) : '';
10
+ return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", borderStyle: "single", borderColor: "gray", paddingX: 1, height: 3, width: "100%", children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "green", bold: true, children: "\u2588 KALSHI" }), _jsx(Text, { color: "gray", children: "NEW YORK COMPUTE" })] }), _jsxs(Box, { flexDirection: "column", alignItems: "flex-end", children: [_jsxs(Text, { children: ["Balance: ", _jsx(Text, { bold: true, children: balanceText })] }), _jsxs(Box, { children: [_jsx(Text, { color: isConnected ? 'green' : 'red', children: isConnected ? '●' : '○' }), _jsxs(Text, { color: "gray", children: [" ", isConnected ? 'connected' : 'disconnected'] })] }), error && (_jsx(Text, { color: "red", dimColor: true, children: error }))] })] }));
13
11
  }
14
12
  //# sourceMappingURL=Header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE9D,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAG9B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,6BAEjB,EACP,KAAC,IAAI,IAAC,IAAI,8BAAe,IACrB,EACN,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,uCAEpB,IACH,EAGN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,aAC/C,MAAC,GAAG,eACF,KAAC,IAAI,4BAAiB,EACtB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,kBACrB,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAC3C,IACH,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YACvC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GACnB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,mBACxB,GAAG,EACH,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,IACtC,IACH,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC,MAAM,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAe;IACjE,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,WAAW,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAErE,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,cAAc,EAAC,eAAe,EAC9B,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,EACT,KAAK,EAAC,MAAM,aAGZ,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,oCAAgB,EACxC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,iCAAwB,IACtC,EAGN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,aAC/C,MAAC,IAAI,4BACM,KAAC,IAAI,IAAC,IAAI,kBAAE,WAAW,GAAQ,IACnC,EACP,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YACvC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GACnB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,IAAQ,IACnE,EACL,KAAK,IAAI,CACR,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,kBAAE,KAAK,GAAQ,CAC1C,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Markets Component
3
+ * Displays a scrollable list of markets with selection
4
+ */
5
+ interface Market {
6
+ ticker: string;
7
+ title: string;
8
+ yes_bid?: number;
9
+ yes_ask?: number;
10
+ volume?: number;
11
+ close_time?: string;
12
+ previousYesBid?: number;
13
+ }
14
+ interface MarketsProps {
15
+ markets: Market[];
16
+ selectedIndex: number;
17
+ height: number;
18
+ }
19
+ export declare function Markets({ markets, selectedIndex, height }: MarketsProps): import("react/jsx-runtime").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=Markets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markets.d.ts","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,YAAY,2CA8EvE"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Markets Component
4
+ * Displays a scrollable list of markets with selection
5
+ */
6
+ import { Box, Text } from 'ink';
7
+ import { formatExpiry, getPriceChange, formatPrice } from '../utils.js';
8
+ export function Markets({ markets, selectedIndex, height }) {
9
+ // Calculate visible window (scroll with selection)
10
+ const visibleRows = height - 4; // Border + title + padding
11
+ const halfWindow = Math.floor(visibleRows / 2);
12
+ let startIndex = Math.max(0, selectedIndex - halfWindow);
13
+ const maxStart = Math.max(0, markets.length - visibleRows);
14
+ startIndex = Math.min(startIndex, maxStart);
15
+ const visibleMarkets = markets.slice(startIndex, startIndex + visibleRows);
16
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "green", height: height, width: "100%", children: [_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "green", bold: true, children: " MARKETS " }) }), _jsx(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: markets.length === 0 ? (_jsx(Text, { color: "gray", children: "Loading markets..." })) : (visibleMarkets.map((market, i) => {
17
+ const actualIndex = startIndex + i;
18
+ const isSelected = actualIndex === selectedIndex;
19
+ const priceChange = getPriceChange(market.yes_bid, market.previousYesBid);
20
+ const expiry = formatExpiry(market.close_time);
21
+ return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'green' : 'gray', children: isSelected ? '▶ ' : ' ' }), _jsx(Text, { color: isSelected ? 'green' : 'white', bold: isSelected, children: market.ticker.slice(0, 20) })] }), _jsxs(Box, { children: [expiry && (_jsx(Text, { color: "gray", dimColor: true, children: expiry.padStart(7) })), _jsx(Text, { color: isSelected ? 'green' : 'white', children: formatPrice(market.yes_bid).padStart(5) }), _jsxs(Text, { color: priceChange.color, children: [" ", priceChange.text] })] })] }, market.ticker));
22
+ })) }), markets.length > 0 && (_jsx(Box, { justifyContent: "center", paddingX: 1, children: _jsxs(Text, { color: "gray", children: [selectedIndex + 1, " of ", markets.length] }) }))] }));
23
+ }
24
+ //# sourceMappingURL=Markets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markets.js","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,22 @@
1
- interface OrderbookProps {
2
- ticker: string | null;
3
- }
4
1
  /**
5
- * Orderbook visualization with depth bars
2
+ * Orderbook Component
3
+ * Visual depth chart showing bids and asks with spread indicator
6
4
  */
7
- export declare function Orderbook({ ticker }: OrderbookProps): import("react/jsx-runtime").JSX.Element;
5
+ interface OrderbookData {
6
+ yes: [number, number][];
7
+ no: [number, number][];
8
+ }
9
+ interface SelectedMarket {
10
+ ticker: string;
11
+ title: string;
12
+ close_time?: string;
13
+ volume?: number;
14
+ }
15
+ interface OrderbookProps {
16
+ market: SelectedMarket | null;
17
+ orderbook: OrderbookData | null;
18
+ height: number;
19
+ }
20
+ export declare function Orderbook({ market, orderbook, height }: OrderbookProps): import("react/jsx-runtime").JSX.Element;
8
21
  export {};
9
22
  //# sourceMappingURL=Orderbook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Orderbook.d.ts","sourceRoot":"","sources":["../../src/components/Orderbook.tsx"],"names":[],"mappings":"AAMA,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,2CA0HnD"}
1
+ {"version":3,"file":"Orderbook.d.ts","sourceRoot":"","sources":["../../src/components/Orderbook.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,UAAU,aAAa;IACrB,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACxB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CACxB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,cAAc,2CAiHtE"}
@@ -1,43 +1,32 @@
1
- import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { formatPrice } from "@newyorkcompute/kalshi-core";
4
- import { useOrderbook } from "../hooks/useOrderbook.js";
5
- import { useAppStore } from "../stores/app-store.js";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
6
2
  /**
7
- * Orderbook visualization with depth bars
3
+ * Orderbook Component
4
+ * Visual depth chart showing bids and asks with spread indicator
8
5
  */
9
- export function Orderbook({ ticker }) {
10
- const { orderbook, isLoading, error } = useOrderbook(ticker);
11
- const activePanel = useAppStore((state) => state.activePanel);
12
- const isActive = activePanel === "orderbook";
13
- // Calculate max quantity for bar scaling
14
- const yesQtys = orderbook?.yes?.map((level) => level[1]) || [];
15
- const noQtys = orderbook?.no?.map((level) => level[1]) || [];
16
- const allQuantities = [...yesQtys, ...noQtys];
17
- const maxQty = Math.max(...allQuantities, 1);
18
- // Render a depth bar
19
- const renderBar = (quantity, side, maxWidth = 20) => {
20
- const barWidth = Math.round((quantity / maxQty) * maxWidth);
21
- const bar = "█".repeat(barWidth);
22
- const padding = " ".repeat(maxWidth - barWidth);
23
- if (side === "ask") {
24
- return (_jsxs(Text, { color: "red", children: [padding, bar] }));
25
- }
26
- else {
27
- return _jsx(Text, { color: "green", children: bar });
28
- }
29
- };
30
- // Get asks (sorted high to low) and bids (sorted high to low)
31
- const asks = (orderbook?.no || [])
6
+ import { Box, Text } from 'ink';
7
+ import { formatExpiry, formatVolume, formatPriceDecimal, calculateSpread } from '../utils.js';
8
+ export function Orderbook({ market, orderbook, height }) {
9
+ // Parse orderbook into asks (no side, converted to YES equivalent) and bids (yes side)
10
+ const asks = (orderbook?.no ?? [])
32
11
  .slice(0, 5)
33
- .sort((a, b) => b[0] - a[0]);
34
- const bids = (orderbook?.yes || [])
12
+ .map(([price, qty]) => ({ price: 100 - price, quantity: qty }))
13
+ .sort((a, b) => b.price - a.price);
14
+ const bids = (orderbook?.yes ?? [])
35
15
  .slice(0, 5)
36
- .sort((a, b) => b[0] - a[0]);
16
+ .map(([price, qty]) => ({ price, quantity: qty }))
17
+ .sort((a, b) => b.price - a.price);
37
18
  // Calculate spread
38
- const bestAsk = asks.length > 0 ? asks[asks.length - 1][0] : null;
39
- const bestBid = bids.length > 0 ? bids[0][0] : null;
40
- const spread = bestAsk && bestBid ? bestAsk - bestBid : null;
41
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: isActive ? "green" : "gray", flexGrow: 1, children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, color: isActive ? "green" : "white", children: "ORDERBOOK" }), ticker && (_jsxs(Text, { color: "gray", dimColor: true, children: [": ", ticker] }))] }), _jsx(Text, { color: "gray", dimColor: true, children: "[F2]" })] }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "gray", children: "─".repeat(40) }) }), _jsxs(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: [!ticker && (_jsx(Text, { color: "gray", children: "Select a market to view orderbook" })), ticker && isLoading && (_jsx(Text, { color: "gray", children: "Loading orderbook..." })), ticker && error && _jsx(Text, { color: "red", children: error }), ticker && orderbook && !isLoading && (_jsxs(_Fragment, { children: [asks.map(([price, qty], index) => (_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: "ASK" }), renderBar(qty, "ask"), _jsx(Text, { color: "red", children: formatPrice(100 - price) }), _jsxs(Text, { color: "gray", dimColor: true, children: ["(", qty, ")"] })] }, `ask-${index}`))), _jsx(Box, { justifyContent: "center", marginY: 1, children: _jsxs(Text, { color: "gray", children: ["─── SPREAD: ", spread !== null ? `${spread}¢` : "—", " ───"] }) }), bids.map(([price, qty], index) => (_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: "BID" }), renderBar(qty, "bid"), _jsx(Text, { color: "green", children: formatPrice(price) }), _jsxs(Text, { color: "gray", dimColor: true, children: ["(", qty, ")"] })] }, `bid-${index}`)))] }))] })] }));
19
+ const bestAsk = asks.length > 0 ? Math.min(...asks.map(a => a.price)) : null;
20
+ const bestBid = bids.length > 0 ? Math.max(...bids.map(b => b.price)) : null;
21
+ const spread = calculateSpread(bestBid, bestAsk);
22
+ // Calculate max quantity for bar scaling
23
+ const maxQty = Math.max(...asks.map(l => l.quantity), ...bids.map(l => l.quantity), 1);
24
+ const renderBar = (qty, color, maxWidth = 20) => {
25
+ const barLength = Math.min(Math.floor((qty / maxQty) * maxWidth), maxWidth);
26
+ return _jsx(Text, { color: color, children: '█'.repeat(barLength) });
27
+ };
28
+ const expiry = formatExpiry(market?.close_time);
29
+ const volume = formatVolume(market?.volume);
30
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "gray", height: height, width: "100%", children: [_jsxs(Box, { paddingX: 1, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, children: " ORDERBOOK" }), _jsxs(Text, { color: "gray", children: [": ", market?.ticker || 'Select a market'] })] }), market?.title && (_jsxs(Text, { color: "cyan", wrap: "truncate", children: [market.title.slice(0, 50), market.title.length > 50 ? '…' : ''] })), market && (_jsxs(Box, { children: [expiry && (_jsxs(Text, { color: "yellow", children: ["\u23F1 ", expiry] })), volume && (_jsxs(Text, { color: "gray", children: [" Vol: ", volume] }))] }))] }), _jsx(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: !orderbook ? (_jsx(Text, { color: "gray", children: "Select a market to view orderbook" })) : (_jsxs(_Fragment, { children: [asks.map((level, i) => (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "ASK " }), renderBar(level.quantity, 'red')] }), _jsxs(Box, { children: [_jsx(Text, { color: "red", children: formatPriceDecimal(level.price) }), _jsxs(Text, { color: "gray", children: [" (", level.quantity, ")"] })] })] }, `ask-${i}`))), _jsxs(Box, { marginY: 1, justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: '─'.repeat(30) }), spread !== null && (_jsxs(Text, { color: "yellow", bold: true, children: ["SPREAD: ", spread.toFixed(2), "\u00A2"] }))] }), bids.map((level, i) => (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "BID " }), renderBar(level.quantity, 'green')] }), _jsxs(Box, { children: [_jsx(Text, { color: "green", children: formatPriceDecimal(level.price) }), _jsxs(Text, { color: "gray", children: [" (", level.quantity, ")"] })] })] }, `bid-${i}`)))] })) })] }));
42
31
  }
43
32
  //# sourceMappingURL=Orderbook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Orderbook.js","sourceRoot":"","sources":["../../src/components/Orderbook.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Orderbook.js","sourceRoot":"","sources":["../../src/components/Orderbook.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,16 @@
1
1
  /**
2
- * Positions panel showing current holdings
2
+ * Positions Component
3
+ * Displays open positions with P&L
3
4
  */
4
- export declare function Positions(): import("react/jsx-runtime").JSX.Element;
5
+ interface Position {
6
+ ticker: string;
7
+ position: number;
8
+ market_exposure: number;
9
+ }
10
+ interface PositionsProps {
11
+ positions: Position[];
12
+ height: number;
13
+ }
14
+ export declare function Positions({ positions, height }: PositionsProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
5
16
  //# sourceMappingURL=Positions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Positions.d.ts","sourceRoot":"","sources":["../../src/components/Positions.tsx"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,SAAS,4CA6ExB"}
1
+ {"version":3,"file":"Positions.d.ts","sourceRoot":"","sources":["../../src/components/Positions.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,cAAc;IACtB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,cAAc,2CAyC9D"}