gloomberb 0.9.1 → 0.9.2

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 (33) hide show
  1. package/package.json +1 -1
  2. package/src/components/chart/comparison-stock-chart/helpers.ts +0 -32
  3. package/src/components/chart/comparison-stock-chart/layout-metrics.ts +6 -6
  4. package/src/components/chart/comparison-stock-chart/legend.tsx +41 -44
  5. package/src/components/chart/comparison-stock-chart/view.tsx +46 -6
  6. package/src/components/layout/detached-pane-shell.tsx +5 -2
  7. package/src/components/layout/header.tsx +13 -5
  8. package/src/components/layout/window-controls.tsx +19 -10
  9. package/src/components/price-performance.tsx +175 -0
  10. package/src/market-data/performance.test.ts +54 -0
  11. package/src/market-data/performance.ts +109 -0
  12. package/src/plugins/builtin/comparison-chart/index.test.tsx +88 -9
  13. package/src/plugins/builtin/congress-trades/detail.tsx +204 -68
  14. package/src/plugins/builtin/congress-trades/footer.ts +14 -8
  15. package/src/plugins/builtin/congress-trades/keyboard.ts +4 -23
  16. package/src/plugins/builtin/congress-trades/model.ts +29 -0
  17. package/src/plugins/builtin/congress-trades/pane.tsx +8 -13
  18. package/src/plugins/builtin/congress-trades/table.tsx +10 -1
  19. package/src/plugins/builtin/ticker-detail/overview/model.ts +0 -14
  20. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +25 -0
  21. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +9 -2
  22. package/src/renderers/electrobun/bun/desktop/initialization.ts +1 -0
  23. package/src/renderers/electrobun/bun/desktop/window-controls.ts +11 -2
  24. package/src/renderers/electrobun/bun/desktop/window-style.ts +27 -1
  25. package/src/renderers/electrobun/bun/desktop/windows-custom-chrome.ts +58 -0
  26. package/src/renderers/electrobun/bun/desktop/windows-icons.ts +11 -64
  27. package/src/renderers/electrobun/bun/desktop/windows-native.ts +75 -0
  28. package/src/renderers/electrobun/bun/index.ts +9 -2
  29. package/src/renderers/electrobun/shared/protocol.ts +1 -0
  30. package/src/renderers/electrobun/view/main.tsx +2 -1
  31. package/src/renderers/electrobun/view/styles.css +9 -8
  32. package/src/renderers/electrobun/view/ui-host.tsx +102 -77
  33. package/src/version.ts +1 -1
@@ -32,15 +32,9 @@ button, [data-gloom-interactive="true"] { cursor: pointer; }
32
32
  [data-gloom-role="app-header"][data-titlebar-overlay="true"],
33
33
  .electrobun-webkit-app-region-drag {
34
34
  cursor: default;
35
- -webkit-app-region: drag;
36
- app-region: drag;
37
35
  -webkit-user-select: none;
38
36
  user-select: none;
39
37
  }
40
- .electrobun-webkit-app-region-no-drag {
41
- -webkit-app-region: no-drag;
42
- app-region: no-drag;
43
- }
44
38
  [data-titlebar-overlay="true"] {
45
39
  min-height: __TITLEBAR_OVERLAY_HEIGHT_PX__px;
46
40
  max-height: __TITLEBAR_OVERLAY_HEIGHT_PX__px;
@@ -55,15 +49,22 @@ button, [data-gloom-interactive="true"] { cursor: pointer; }
55
49
  [data-titlebar-overlay="true"] a,
56
50
  [data-titlebar-overlay="true"] .electrobun-webkit-app-region-no-drag,
57
51
  [data-titlebar-overlay="true"] [data-gloom-interactive="true"] {
58
- -webkit-app-region: no-drag;
59
- app-region: no-drag;
52
+ cursor: pointer;
60
53
  }
61
54
  [data-gloom-role="window-controls"] {
62
55
  height: 100%;
63
56
  color: var(--gloom-header-text, #f2f2f2);
64
57
  }
65
58
  [data-gloom-role="window-control"] {
59
+ appearance: none;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ border: 0;
64
+ padding: 0;
65
+ background: transparent;
66
66
  color: color-mix(in srgb, var(--gloom-header-text, #f2f2f2) 86%, transparent);
67
+ cursor: pointer;
67
68
  transition: background-color 90ms linear, color 90ms linear;
68
69
  }
69
70
  [data-gloom-role="window-control"] svg {
@@ -31,92 +31,117 @@ function currentDesktopPlatform(): string {
31
31
  const navigatorWithUserAgentData = navigator as Navigator & {
32
32
  userAgentData?: { platform?: string };
33
33
  };
34
- return navigatorWithUserAgentData.userAgentData?.platform ?? navigator.platform ?? "";
34
+ return [
35
+ navigatorWithUserAgentData.userAgentData?.platform,
36
+ navigator.platform,
37
+ navigator.userAgent,
38
+ ].filter((value): value is string => Boolean(value)).join(" ");
35
39
  }
36
40
 
37
41
  const DESKTOP_PLATFORM = currentDesktopPlatform();
38
- const USES_WINDOWS_CONTROLS = /win/i.test(DESKTOP_PLATFORM);
42
+ const USES_WINDOWS_CONTROLS = !/(darwin|ipad|iphone|linux|mac)/i.test(DESKTOP_PLATFORM);
43
+ const NON_WINDOWS_DESKTOP_PLATFORMS = /^(darwin|linux|freebsd|openbsd|aix|sunos)$/i;
39
44
 
40
- export const webUiHost: UiHost = {
41
- kind: "desktop-web",
42
- capabilities: {
43
- nativePaneChrome: true,
44
- titleBarOverlay: true,
45
- precisePointer: true,
46
- fractionalViewport: true,
47
- cellWidthPx: WEB_CELL_WIDTH,
48
- cellHeightPx: WEB_CELL_HEIGHT,
49
- pixelRatio: Math.min(window.devicePixelRatio || 1, 2),
50
- canvasCharts: true,
51
- nativeContextMenu: NATIVE_CONTEXT_MENU_SUPPORTED,
52
- windowControls: USES_WINDOWS_CONTROLS ? "windows" : undefined,
53
- },
54
- Box: WebBox,
55
- Text: WebText,
56
- Span: WebSpan,
57
- Strong: WebStrong,
58
- Underline: WebUnderline,
59
- ScrollBox: WebScrollBox,
60
- Input: WebInput,
61
- Textarea: WebTextarea,
62
- Button: WebButton,
63
- TextField: WebTextField,
64
- MessageComposer: WebMessageComposer,
65
- ListView: WebListView,
66
- SegmentedControl: WebSegmentedControl,
67
- DialogFrame: WebDialogFrame,
68
- PageStackView: WebPageStackView,
69
- DataTable: WebDataTable,
70
- Tabs: WebTabs,
71
- ChartSurface: WebChartSurface,
72
- ImageSurface: ({ children, src, alt = "", objectFit = "contain", ...props }) => {
73
- const imageSrc = typeof src === "string" ? src.trim() : "";
74
- const [failed, setFailed] = useState(false);
75
- useEffect(() => setFailed(false), [imageSrc]);
76
- const baseStyle = commonStyle(props);
77
- return (
78
- <div
45
+ function usesWindowsWindowControls(desktopPlatform?: string): boolean {
46
+ const platform = desktopPlatform?.trim();
47
+ if (!platform) {
48
+ return USES_WINDOWS_CONTROLS;
49
+ }
50
+ if (/^win/i.test(platform)) {
51
+ return true;
52
+ }
53
+ if (NON_WINDOWS_DESKTOP_PLATFORMS.test(platform)) {
54
+ return false;
55
+ }
56
+ return USES_WINDOWS_CONTROLS;
57
+ }
58
+
59
+ export function createWebUiHost(desktopPlatform?: string): UiHost {
60
+ const usesWindowsControls = usesWindowsWindowControls(desktopPlatform);
61
+
62
+ return {
63
+ kind: "desktop-web",
64
+ capabilities: {
65
+ nativePaneChrome: true,
66
+ titleBarOverlay: true,
67
+ precisePointer: true,
68
+ fractionalViewport: true,
69
+ cellWidthPx: WEB_CELL_WIDTH,
70
+ cellHeightPx: WEB_CELL_HEIGHT,
71
+ pixelRatio: Math.min(window.devicePixelRatio || 1, 2),
72
+ canvasCharts: true,
73
+ nativeContextMenu: NATIVE_CONTEXT_MENU_SUPPORTED,
74
+ windowControls: usesWindowsControls ? "windows" : undefined,
75
+ },
76
+ Box: WebBox,
77
+ Text: WebText,
78
+ Span: WebSpan,
79
+ Strong: WebStrong,
80
+ Underline: WebUnderline,
81
+ ScrollBox: WebScrollBox,
82
+ Input: WebInput,
83
+ Textarea: WebTextarea,
84
+ Button: WebButton,
85
+ TextField: WebTextField,
86
+ MessageComposer: WebMessageComposer,
87
+ ListView: WebListView,
88
+ SegmentedControl: WebSegmentedControl,
89
+ DialogFrame: WebDialogFrame,
90
+ PageStackView: WebPageStackView,
91
+ DataTable: WebDataTable,
92
+ Tabs: WebTabs,
93
+ ChartSurface: WebChartSurface,
94
+ ImageSurface: ({ children, src, alt = "", objectFit = "contain", ...props }) => {
95
+ const imageSrc = typeof src === "string" ? src.trim() : "";
96
+ const [failed, setFailed] = useState(false);
97
+ useEffect(() => setFailed(false), [imageSrc]);
98
+ const baseStyle = commonStyle(props);
99
+ return (
100
+ <div
101
+ {...cleanDomProps(props)}
102
+ style={{
103
+ ...baseStyle,
104
+ overflow: baseStyle.overflow ?? "hidden",
105
+ ...(props.style as CSSProperties | undefined),
106
+ }}
107
+ >
108
+ {imageSrc && !failed ? (
109
+ <img
110
+ src={imageSrc}
111
+ alt={alt}
112
+ draggable={false}
113
+ onError={() => setFailed(true)}
114
+ style={{
115
+ width: "100%",
116
+ height: "100%",
117
+ display: "block",
118
+ objectFit,
119
+ }}
120
+ />
121
+ ) : children as ReactNode}
122
+ </div>
123
+ );
124
+ },
125
+ SpinnerMark: ({ color, ...props }) => (
126
+ <span
79
127
  {...cleanDomProps(props)}
128
+ aria-hidden="true"
80
129
  style={{
81
- ...baseStyle,
82
- overflow: baseStyle.overflow ?? "hidden",
130
+ color,
131
+ display: "inline-block",
132
+ width: "1ch",
133
+ animation: "gloom-spin 0.9s steps(8) infinite",
83
134
  ...(props.style as CSSProperties | undefined),
84
135
  }}
85
136
  >
86
- {imageSrc && !failed ? (
87
- <img
88
- src={imageSrc}
89
- alt={alt}
90
- draggable={false}
91
- onError={() => setFailed(true)}
92
- style={{
93
- width: "100%",
94
- height: "100%",
95
- display: "block",
96
- objectFit,
97
- }}
98
- />
99
- ) : children as ReactNode}
100
- </div>
101
- );
102
- },
103
- SpinnerMark: ({ color, ...props }) => (
104
- <span
105
- {...cleanDomProps(props)}
106
- aria-hidden="true"
107
- style={{
108
- color,
109
- display: "inline-block",
110
- width: "1ch",
111
- animation: "gloom-spin 0.9s steps(8) infinite",
112
- ...(props.style as CSSProperties | undefined),
113
- }}
114
- >
115
- *
116
- </span>
117
- ),
118
- AsciiText: WebAsciiText,
119
- };
137
+ *
138
+ </span>
139
+ ),
140
+ AsciiText: WebAsciiText,
141
+ };
142
+ }
143
+
144
+ export const webUiHost: UiHost = createWebUiHost();
120
145
 
121
146
  export const webRendererHost: RendererHost = {
122
147
  supportsNativeDesktopNotifications: true,
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const VERSION = "0.9.1";
1
+ export const VERSION = "0.9.2";