@vuu-ui/vuu-shell 0.13.9 → 0.13.10

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 (225) hide show
  1. package/cjs/ShellContextProvider.js +25 -0
  2. package/cjs/ShellContextProvider.js.map +1 -0
  3. package/cjs/app-header/AppHeader.css.js +6 -0
  4. package/cjs/app-header/AppHeader.css.js.map +1 -0
  5. package/cjs/app-header/AppHeader.js +85 -0
  6. package/cjs/app-header/AppHeader.js.map +1 -0
  7. package/cjs/app-status-bar/AppStatusBar.css.js +6 -0
  8. package/cjs/app-status-bar/AppStatusBar.css.js.map +1 -0
  9. package/cjs/app-status-bar/AppStatusBar.js +47 -0
  10. package/cjs/app-status-bar/AppStatusBar.js.map +1 -0
  11. package/cjs/application-provider/ApplicationContext.js +18 -0
  12. package/cjs/application-provider/ApplicationContext.js.map +1 -0
  13. package/cjs/application-provider/ApplicationProvider.js +104 -0
  14. package/cjs/application-provider/ApplicationProvider.js.map +1 -0
  15. package/cjs/connection-status/ConnectionRetryCountdown.js +36 -0
  16. package/cjs/connection-status/ConnectionRetryCountdown.js.map +1 -0
  17. package/cjs/connection-status/ConnectionStateDisplay.css.js +6 -0
  18. package/cjs/connection-status/ConnectionStateDisplay.css.js.map +1 -0
  19. package/cjs/connection-status/ConnectionStateDisplay.js +65 -0
  20. package/cjs/connection-status/ConnectionStateDisplay.js.map +1 -0
  21. package/cjs/connection-status/ConnectionStatusIndicator.css.js +6 -0
  22. package/cjs/connection-status/ConnectionStatusIndicator.css.js.map +1 -0
  23. package/cjs/connection-status/ConnectionStatusIndicator.js +81 -0
  24. package/cjs/connection-status/ConnectionStatusIndicator.js.map +1 -0
  25. package/cjs/feature/Feature.js +55 -0
  26. package/cjs/feature/Feature.js.map +1 -0
  27. package/cjs/feature/FeatureErrorBoundary.js +30 -0
  28. package/cjs/feature/FeatureErrorBoundary.js.map +1 -0
  29. package/cjs/feature/Loader.js +8 -0
  30. package/cjs/feature/Loader.js.map +1 -0
  31. package/cjs/feature-and-layout-provider/FeatureAndLayoutProvider.js +60 -0
  32. package/cjs/feature-and-layout-provider/FeatureAndLayoutProvider.js.map +1 -0
  33. package/cjs/feature-list/FeatureList.css.js +6 -0
  34. package/cjs/feature-list/FeatureList.css.js.map +1 -0
  35. package/cjs/feature-list/FeatureList.js +97 -0
  36. package/cjs/feature-list/FeatureList.js.map +1 -0
  37. package/cjs/index.js +77 -2826
  38. package/cjs/index.js.map +1 -1
  39. package/cjs/left-nav/LeftNav.css.js +6 -0
  40. package/cjs/left-nav/LeftNav.css.js.map +1 -0
  41. package/cjs/left-nav/LeftNav.js +199 -0
  42. package/cjs/left-nav/LeftNav.js.map +1 -0
  43. package/cjs/login/LoginPanel.css.js +6 -0
  44. package/cjs/login/LoginPanel.css.js.map +1 -0
  45. package/cjs/login/LoginPanel.js +108 -0
  46. package/cjs/login/LoginPanel.js.map +1 -0
  47. package/cjs/login/VuuLogo.js +134 -0
  48. package/cjs/login/VuuLogo.js.map +1 -0
  49. package/cjs/login/login-utils.js +31 -0
  50. package/cjs/login/login-utils.js.map +1 -0
  51. package/cjs/persistence-manager/LocalPersistenceManager.js +197 -0
  52. package/cjs/persistence-manager/LocalPersistenceManager.js.map +1 -0
  53. package/cjs/persistence-manager/PersistenceProvider.js +21 -0
  54. package/cjs/persistence-manager/PersistenceProvider.js.map +1 -0
  55. package/cjs/persistence-manager/RemotePersistenceManager.js +175 -0
  56. package/cjs/persistence-manager/RemotePersistenceManager.js.map +1 -0
  57. package/cjs/persistence-manager/StaticPersistenceManager.js +71 -0
  58. package/cjs/persistence-manager/StaticPersistenceManager.js.map +1 -0
  59. package/cjs/shell-layout-templates/context-panel/ContextPanel.css.js +6 -0
  60. package/cjs/shell-layout-templates/context-panel/ContextPanel.css.js.map +1 -0
  61. package/cjs/shell-layout-templates/context-panel/ContextPanel.js +94 -0
  62. package/cjs/shell-layout-templates/context-panel/ContextPanel.js.map +1 -0
  63. package/cjs/shell-layout-templates/full-height-left-panel/useFullHeightLeftPanel.js +53 -0
  64. package/cjs/shell-layout-templates/full-height-left-panel/useFullHeightLeftPanel.js.map +1 -0
  65. package/cjs/shell-layout-templates/inlay-left-panel/useInlayLeftPanel.js +83 -0
  66. package/cjs/shell-layout-templates/inlay-left-panel/useInlayLeftPanel.js.map +1 -0
  67. package/cjs/shell-layout-templates/left-main-tabs/useLeftMainTabs.js +46 -0
  68. package/cjs/shell-layout-templates/left-main-tabs/useLeftMainTabs.js.map +1 -0
  69. package/cjs/shell-layout-templates/side-panel/SidePanel.css.js +6 -0
  70. package/cjs/shell-layout-templates/side-panel/SidePanel.css.js.map +1 -0
  71. package/cjs/shell-layout-templates/side-panel/SidePanel.js +36 -0
  72. package/cjs/shell-layout-templates/side-panel/SidePanel.js.map +1 -0
  73. package/cjs/shell-layout-templates/simple-content-pane/useSimpleContentPane.js +48 -0
  74. package/cjs/shell-layout-templates/simple-content-pane/useSimpleContentPane.js.map +1 -0
  75. package/cjs/shell-layout-templates/useShellLayout.js +23 -0
  76. package/cjs/shell-layout-templates/useShellLayout.js.map +1 -0
  77. package/cjs/shell.css.js +6 -0
  78. package/cjs/shell.css.js.map +1 -0
  79. package/cjs/shell.js +161 -0
  80. package/cjs/shell.js.map +1 -0
  81. package/cjs/theme-switch/ThemeSwitch.css.js +6 -0
  82. package/cjs/theme-switch/ThemeSwitch.css.js.map +1 -0
  83. package/cjs/theme-switch/ThemeSwitch.js +56 -0
  84. package/cjs/theme-switch/ThemeSwitch.js.map +1 -0
  85. package/cjs/user-settings/SettingsForm.css.js +6 -0
  86. package/cjs/user-settings/SettingsForm.css.js.map +1 -0
  87. package/cjs/user-settings/SettingsForm.js +168 -0
  88. package/cjs/user-settings/SettingsForm.js.map +1 -0
  89. package/cjs/user-settings/UserSettingsPanel.css.js +6 -0
  90. package/cjs/user-settings/UserSettingsPanel.css.js.map +1 -0
  91. package/cjs/user-settings/UserSettingsPanel.js +42 -0
  92. package/cjs/user-settings/UserSettingsPanel.js.map +1 -0
  93. package/cjs/workspace-management/LayoutList.css.js +6 -0
  94. package/cjs/workspace-management/LayoutList.css.js.map +1 -0
  95. package/cjs/workspace-management/LayoutList.js +116 -0
  96. package/cjs/workspace-management/LayoutList.js.map +1 -0
  97. package/cjs/workspace-management/LayoutTile.css.js +6 -0
  98. package/cjs/workspace-management/LayoutTile.css.js.map +1 -0
  99. package/cjs/workspace-management/LayoutTile.js +41 -0
  100. package/cjs/workspace-management/LayoutTile.js.map +1 -0
  101. package/cjs/workspace-management/SaveLayoutPanel.css.js +6 -0
  102. package/cjs/workspace-management/SaveLayoutPanel.css.js.map +1 -0
  103. package/cjs/workspace-management/SaveLayoutPanel.js +129 -0
  104. package/cjs/workspace-management/SaveLayoutPanel.js.map +1 -0
  105. package/cjs/workspace-management/WorkspaceProvider.js +264 -0
  106. package/cjs/workspace-management/WorkspaceProvider.js.map +1 -0
  107. package/cjs/workspace-management/defaultWorkspaceJSON.js +101 -0
  108. package/cjs/workspace-management/defaultWorkspaceJSON.js.map +1 -0
  109. package/cjs/workspace-management/screenshot-utils.js +25 -0
  110. package/cjs/workspace-management/screenshot-utils.js.map +1 -0
  111. package/cjs/workspace-management/useWorkspaceContextMenuItems.js +72 -0
  112. package/cjs/workspace-management/useWorkspaceContextMenuItems.js.map +1 -0
  113. package/esm/ShellContextProvider.js +23 -0
  114. package/esm/ShellContextProvider.js.map +1 -0
  115. package/esm/app-header/AppHeader.css.js +4 -0
  116. package/esm/app-header/AppHeader.css.js.map +1 -0
  117. package/esm/app-header/AppHeader.js +83 -0
  118. package/esm/app-header/AppHeader.js.map +1 -0
  119. package/esm/app-status-bar/AppStatusBar.css.js +4 -0
  120. package/esm/app-status-bar/AppStatusBar.css.js.map +1 -0
  121. package/esm/app-status-bar/AppStatusBar.js +45 -0
  122. package/esm/app-status-bar/AppStatusBar.js.map +1 -0
  123. package/esm/application-provider/ApplicationContext.js +16 -0
  124. package/esm/application-provider/ApplicationContext.js.map +1 -0
  125. package/esm/application-provider/ApplicationProvider.js +98 -0
  126. package/esm/application-provider/ApplicationProvider.js.map +1 -0
  127. package/esm/connection-status/ConnectionRetryCountdown.js +34 -0
  128. package/esm/connection-status/ConnectionRetryCountdown.js.map +1 -0
  129. package/esm/connection-status/ConnectionStateDisplay.css.js +4 -0
  130. package/esm/connection-status/ConnectionStateDisplay.css.js.map +1 -0
  131. package/esm/connection-status/ConnectionStateDisplay.js +63 -0
  132. package/esm/connection-status/ConnectionStateDisplay.js.map +1 -0
  133. package/esm/connection-status/ConnectionStatusIndicator.css.js +4 -0
  134. package/esm/connection-status/ConnectionStatusIndicator.css.js.map +1 -0
  135. package/esm/connection-status/ConnectionStatusIndicator.js +79 -0
  136. package/esm/connection-status/ConnectionStatusIndicator.js.map +1 -0
  137. package/esm/feature/Feature.js +53 -0
  138. package/esm/feature/Feature.js.map +1 -0
  139. package/esm/feature/FeatureErrorBoundary.js +28 -0
  140. package/esm/feature/FeatureErrorBoundary.js.map +1 -0
  141. package/esm/feature/Loader.js +6 -0
  142. package/esm/feature/Loader.js.map +1 -0
  143. package/esm/feature-and-layout-provider/FeatureAndLayoutProvider.js +56 -0
  144. package/esm/feature-and-layout-provider/FeatureAndLayoutProvider.js.map +1 -0
  145. package/esm/feature-list/FeatureList.css.js +4 -0
  146. package/esm/feature-list/FeatureList.css.js.map +1 -0
  147. package/esm/feature-list/FeatureList.js +95 -0
  148. package/esm/feature-list/FeatureList.js.map +1 -0
  149. package/esm/index.js +27 -2780
  150. package/esm/index.js.map +1 -1
  151. package/esm/left-nav/LeftNav.css.js +4 -0
  152. package/esm/left-nav/LeftNav.css.js.map +1 -0
  153. package/esm/left-nav/LeftNav.js +197 -0
  154. package/esm/left-nav/LeftNav.js.map +1 -0
  155. package/esm/login/LoginPanel.css.js +4 -0
  156. package/esm/login/LoginPanel.css.js.map +1 -0
  157. package/esm/login/LoginPanel.js +106 -0
  158. package/esm/login/LoginPanel.js.map +1 -0
  159. package/esm/login/VuuLogo.js +132 -0
  160. package/esm/login/VuuLogo.js.map +1 -0
  161. package/esm/login/login-utils.js +26 -0
  162. package/esm/login/login-utils.js.map +1 -0
  163. package/esm/persistence-manager/LocalPersistenceManager.js +195 -0
  164. package/esm/persistence-manager/LocalPersistenceManager.js.map +1 -0
  165. package/esm/persistence-manager/PersistenceProvider.js +17 -0
  166. package/esm/persistence-manager/PersistenceProvider.js.map +1 -0
  167. package/esm/persistence-manager/RemotePersistenceManager.js +173 -0
  168. package/esm/persistence-manager/RemotePersistenceManager.js.map +1 -0
  169. package/esm/persistence-manager/StaticPersistenceManager.js +69 -0
  170. package/esm/persistence-manager/StaticPersistenceManager.js.map +1 -0
  171. package/esm/shell-layout-templates/context-panel/ContextPanel.css.js +4 -0
  172. package/esm/shell-layout-templates/context-panel/ContextPanel.css.js.map +1 -0
  173. package/esm/shell-layout-templates/context-panel/ContextPanel.js +92 -0
  174. package/esm/shell-layout-templates/context-panel/ContextPanel.js.map +1 -0
  175. package/esm/shell-layout-templates/full-height-left-panel/useFullHeightLeftPanel.js +51 -0
  176. package/esm/shell-layout-templates/full-height-left-panel/useFullHeightLeftPanel.js.map +1 -0
  177. package/esm/shell-layout-templates/inlay-left-panel/useInlayLeftPanel.js +81 -0
  178. package/esm/shell-layout-templates/inlay-left-panel/useInlayLeftPanel.js.map +1 -0
  179. package/esm/shell-layout-templates/left-main-tabs/useLeftMainTabs.js +44 -0
  180. package/esm/shell-layout-templates/left-main-tabs/useLeftMainTabs.js.map +1 -0
  181. package/esm/shell-layout-templates/side-panel/SidePanel.css.js +4 -0
  182. package/esm/shell-layout-templates/side-panel/SidePanel.css.js.map +1 -0
  183. package/esm/shell-layout-templates/side-panel/SidePanel.js +34 -0
  184. package/esm/shell-layout-templates/side-panel/SidePanel.js.map +1 -0
  185. package/esm/shell-layout-templates/simple-content-pane/useSimpleContentPane.js +46 -0
  186. package/esm/shell-layout-templates/simple-content-pane/useSimpleContentPane.js.map +1 -0
  187. package/esm/shell-layout-templates/useShellLayout.js +21 -0
  188. package/esm/shell-layout-templates/useShellLayout.js.map +1 -0
  189. package/esm/shell.css.js +4 -0
  190. package/esm/shell.css.js.map +1 -0
  191. package/esm/shell.js +159 -0
  192. package/esm/shell.js.map +1 -0
  193. package/esm/theme-switch/ThemeSwitch.css.js +4 -0
  194. package/esm/theme-switch/ThemeSwitch.css.js.map +1 -0
  195. package/esm/theme-switch/ThemeSwitch.js +54 -0
  196. package/esm/theme-switch/ThemeSwitch.js.map +1 -0
  197. package/esm/user-settings/SettingsForm.css.js +4 -0
  198. package/esm/user-settings/SettingsForm.css.js.map +1 -0
  199. package/esm/user-settings/SettingsForm.js +162 -0
  200. package/esm/user-settings/SettingsForm.js.map +1 -0
  201. package/esm/user-settings/UserSettingsPanel.css.js +4 -0
  202. package/esm/user-settings/UserSettingsPanel.css.js.map +1 -0
  203. package/esm/user-settings/UserSettingsPanel.js +40 -0
  204. package/esm/user-settings/UserSettingsPanel.js.map +1 -0
  205. package/esm/workspace-management/LayoutList.css.js +4 -0
  206. package/esm/workspace-management/LayoutList.css.js.map +1 -0
  207. package/esm/workspace-management/LayoutList.js +114 -0
  208. package/esm/workspace-management/LayoutList.js.map +1 -0
  209. package/esm/workspace-management/LayoutTile.css.js +4 -0
  210. package/esm/workspace-management/LayoutTile.css.js.map +1 -0
  211. package/esm/workspace-management/LayoutTile.js +39 -0
  212. package/esm/workspace-management/LayoutTile.js.map +1 -0
  213. package/esm/workspace-management/SaveLayoutPanel.css.js +4 -0
  214. package/esm/workspace-management/SaveLayoutPanel.css.js.map +1 -0
  215. package/esm/workspace-management/SaveLayoutPanel.js +127 -0
  216. package/esm/workspace-management/SaveLayoutPanel.js.map +1 -0
  217. package/esm/workspace-management/WorkspaceProvider.js +261 -0
  218. package/esm/workspace-management/WorkspaceProvider.js.map +1 -0
  219. package/esm/workspace-management/defaultWorkspaceJSON.js +95 -0
  220. package/esm/workspace-management/defaultWorkspaceJSON.js.map +1 -0
  221. package/esm/workspace-management/screenshot-utils.js +23 -0
  222. package/esm/workspace-management/screenshot-utils.js.map +1 -0
  223. package/esm/workspace-management/useWorkspaceContextMenuItems.js +70 -0
  224. package/esm/workspace-management/useWorkspaceContextMenuItems.js.map +1 -0
  225. package/package.json +13 -13
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+
6
+ const Provider = ({
7
+ children,
8
+ context,
9
+ inheritedContext
10
+ }) => {
11
+ const mergedContext = {
12
+ ...inheritedContext,
13
+ ...context
14
+ };
15
+ return /* @__PURE__ */ jsxRuntime.jsx(vuuUtils.ShellContext.Provider, { value: mergedContext, children });
16
+ };
17
+ const ShellContextProvider = ({
18
+ children,
19
+ value
20
+ }) => {
21
+ return /* @__PURE__ */ jsxRuntime.jsx(vuuUtils.ShellContext.Consumer, { children: (context) => /* @__PURE__ */ jsxRuntime.jsx(Provider, { context: value, inheritedContext: context, children }) });
22
+ };
23
+
24
+ exports.ShellContextProvider = ShellContextProvider;
25
+ //# sourceMappingURL=ShellContextProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellContextProvider.js","sources":["../src/ShellContextProvider.tsx"],"sourcesContent":["import { ShellContext, ShellContextProps } from \"@vuu-ui/vuu-utils\";\nimport { ReactElement, ReactNode } from \"react\";\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value?: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n"],"names":["ShellContext","jsx"],"mappings":";;;;;AAQA,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAIM,KAAA;AAEJ,EAAA,MAAM,aAAgB,GAAA;AAAA,IACpB,GAAG,gBAAA;AAAA,IACH,GAAG;AAAA,GACL;AACA,EAAA,sCACGA,qBAAa,CAAA,QAAA,EAAb,EAAsB,KAAA,EAAO,eAC3B,QACH,EAAA,CAAA;AAEJ,CAAA;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC,QAAA;AAAA,EACA;AACF,CAAwC,KAAA;AACtC,EAAA,uBACGC,cAAA,CAAAD,qBAAA,CAAa,QAAb,EAAA,EACE,QAAC,EAAA,CAAA,OAAA,qBACCC,cAAA,CAAA,QAAA,EAAA,EAAS,OAAS,EAAA,KAAA,EAAO,gBAAkB,EAAA,OAAA,EACzC,UACH,CAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var appHeaderCss = ".vuuAppHeader {\n --saltButton-borderRadius: 6px;\n --saltButton-text-color: var(--vuu-color-gray-50);\n --saltButton-padding: 12px;\n --vuuToolbarItem-height: 26px;\n --vuuOverflowContainer-gap: 8px;\n --vuu-icon-color: var(--vuu-color-gray-45);\n --vuu-icon-size: 16px;\n --vuuToolbar-borderWidth: 1px;\n --vuuToolbar-borderStyle: solid;\n --vuuToolbar-borderColor: var(--salt-separable-primary-borderColor);\n\n align-items: center;\n display: flex;\n justify-content: flex-end;\n}\n\n.vuu-theme .vuuAppHeader {\n border-radius: 8px;\n\n margin-bottom: 8px;\n}\n";
4
+
5
+ module.exports = appHeaderCss;
6
+ //# sourceMappingURL=AppHeader.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppHeader.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var vuuLayout = require('@vuu-ui/vuu-layout');
8
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
9
+ var cx = require('clsx');
10
+ var React = require('react');
11
+ var ApplicationProvider = require('../application-provider/ApplicationProvider.js');
12
+ var loginUtils = require('../login/login-utils.js');
13
+ var AppHeader$1 = require('./AppHeader.css.js');
14
+
15
+ const classBase = "vuuAppHeader";
16
+ const AppHeader = ({
17
+ className: classNameProp,
18
+ themeMode: _,
19
+ ...htmlAttributes
20
+ }) => {
21
+ const targetWindow = window.useWindow();
22
+ styles.useComponentCssInjection({
23
+ testId: "vuu-app-header",
24
+ css: AppHeader$1,
25
+ window: targetWindow
26
+ });
27
+ const settingsButtonRef = React.useRef(null);
28
+ const className = cx(classBase, classNameProp);
29
+ const loginUrl = ApplicationProvider.useLoginUrl();
30
+ const { showComponentInContextPanel } = vuuLayout.useLayoutOperation();
31
+ const handleLogout = React.useCallback(() => {
32
+ loginUtils.logout(loginUrl);
33
+ }, [loginUrl]);
34
+ const handleShowSettings = React.useCallback(() => {
35
+ showComponentInContextPanel(
36
+ {
37
+ type: "ApplicationSettings"
38
+ },
39
+ "Settings",
40
+ () => settingsButtonRef.current?.focus()
41
+ );
42
+ }, [showComponentInContextPanel]);
43
+ return /* @__PURE__ */ jsxRuntime.jsxs(
44
+ vuuUiControls.Toolbar,
45
+ {
46
+ alignItems: "end",
47
+ className,
48
+ role: "banner",
49
+ showSeparators: true,
50
+ ...htmlAttributes,
51
+ children: [
52
+ /* @__PURE__ */ jsxRuntime.jsx(core.Button, { className: `${classBase}-menuItem`, variant: "secondary", children: "Help" }),
53
+ /* @__PURE__ */ jsxRuntime.jsxs(core.Button, { className: `${classBase}-menuItem`, variant: "secondary", children: [
54
+ "History ",
55
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-icon": "history" })
56
+ ] }),
57
+ /* @__PURE__ */ jsxRuntime.jsxs(
58
+ core.Button,
59
+ {
60
+ className: `${classBase}-menuItem`,
61
+ onClick: handleShowSettings,
62
+ ref: settingsButtonRef,
63
+ variant: "secondary",
64
+ children: [
65
+ "Settings ",
66
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-icon": "settings" })
67
+ ]
68
+ }
69
+ ),
70
+ /* @__PURE__ */ jsxRuntime.jsx(
71
+ core.Button,
72
+ {
73
+ className: `${classBase}-menuItem`,
74
+ onClick: handleLogout,
75
+ variant: "secondary",
76
+ children: "Log out"
77
+ }
78
+ )
79
+ ]
80
+ }
81
+ );
82
+ };
83
+
84
+ exports.AppHeader = AppHeader;
85
+ //# sourceMappingURL=AppHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppHeader.js","sources":["../../src/app-header/AppHeader.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useLayoutOperation } from \"@vuu-ui/vuu-layout\";\nimport { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport type { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback, useRef } from \"react\";\nimport { useLoginUrl } from \"../application-provider\";\nimport { logout } from \"../login\";\n\nimport appHeaderCss from \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n themeMode?: ThemeMode;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n themeMode: _,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-app-header\",\n css: appHeaderCss,\n window: targetWindow,\n });\n\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n\n const className = cx(classBase, classNameProp);\n const loginUrl = useLoginUrl();\n\n const { showComponentInContextPanel } = useLayoutOperation();\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const handleShowSettings = useCallback(() => {\n showComponentInContextPanel(\n {\n type: \"ApplicationSettings\",\n },\n \"Settings\",\n () => settingsButtonRef.current?.focus(),\n );\n }, [showComponentInContextPanel]);\n\n return (\n <Toolbar\n alignItems=\"end\"\n className={className}\n role=\"banner\"\n showSeparators\n {...htmlAttributes}\n >\n <Button className={`${classBase}-menuItem`} variant=\"secondary\">\n Help\n </Button>\n <Button className={`${classBase}-menuItem`} variant=\"secondary\">\n History <span data-icon=\"history\" />\n </Button>\n <Button\n className={`${classBase}-menuItem`}\n onClick={handleShowSettings}\n ref={settingsButtonRef}\n variant=\"secondary\"\n >\n Settings <span data-icon=\"settings\" />\n </Button>\n <Button\n className={`${classBase}-menuItem`}\n onClick={handleLogout}\n variant=\"secondary\"\n >\n Log out\n </Button>\n </Toolbar>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","appHeaderCss","useRef","useLoginUrl","useLayoutOperation","useCallback","logout","jsxs","Toolbar","jsx","Button"],"mappings":";;;;;;;;;;;;;;AAaA,MAAM,SAAY,GAAA,cAAA;AAKX,MAAM,YAAY,CAAC;AAAA,EACxB,SAAW,EAAA,aAAA;AAAA,EACX,SAAW,EAAA,CAAA;AAAA,EACX,GAAG;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAAC,WAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,iBAAA,GAAoBC,aAA0B,IAAI,CAAA;AAExD,EAAM,MAAA,SAAA,GAAY,EAAG,CAAA,SAAA,EAAW,aAAa,CAAA;AAC7C,EAAA,MAAM,WAAWC,+BAAY,EAAA;AAE7B,EAAM,MAAA,EAAE,2BAA4B,EAAA,GAAIC,4BAAmB,EAAA;AAE3D,EAAM,MAAA,YAAA,GAAeC,kBAAY,MAAM;AACrC,IAAAC,iBAAA,CAAO,QAAQ,CAAA;AAAA,GACjB,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAM,MAAA,kBAAA,GAAqBD,kBAAY,MAAM;AAC3C,IAAA,2BAAA;AAAA,MACE;AAAA,QACE,IAAM,EAAA;AAAA,OACR;AAAA,MACA,UAAA;AAAA,MACA,MAAM,iBAAkB,CAAA,OAAA,EAAS,KAAM;AAAA,KACzC;AAAA,GACF,EAAG,CAAC,2BAA2B,CAAC,CAAA;AAEhC,EACE,uBAAAE,eAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,UAAW,EAAA,KAAA;AAAA,MACX,SAAA;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,cAAc,EAAA,IAAA;AAAA,MACb,GAAG,cAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAACC,eAAO,SAAW,EAAA,CAAA,EAAG,SAAS,CAAa,SAAA,CAAA,EAAA,OAAA,EAAQ,aAAY,QAEhE,EAAA,MAAA,EAAA,CAAA;AAAA,wCACCA,WAAO,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA,EAAa,SAAQ,WAAY,EAAA,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,0BACtDD,cAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,SAAU,EAAA;AAAA,SACpC,EAAA,CAAA;AAAA,wBACAF,eAAA;AAAA,UAACG,WAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,YACvB,OAAS,EAAA,kBAAA;AAAA,YACT,GAAK,EAAA,iBAAA;AAAA,YACL,OAAQ,EAAA,WAAA;AAAA,YACT,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,8BACUD,cAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,UAAW,EAAA;AAAA;AAAA;AAAA,SACtC;AAAA,wBACAA,cAAA;AAAA,UAACC,WAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,YACvB,OAAS,EAAA,YAAA;AAAA,YACT,OAAQ,EAAA,WAAA;AAAA,YACT,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var appStatusBarCss = ".vuuAppStatusBar {\n align-items: center;\n background-color: var(--salt-container-secondary-background);\n display: flex;\n height: 36px;\n justify-content: flex-end;\n}\n.vuuAppStatusBar-hidden {\n display: none;\n}\n";
4
+
5
+ module.exports = appStatusBarCss;
6
+ //# sourceMappingURL=AppStatusBar.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppStatusBar.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
6
+ var cx = require('clsx');
7
+ var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
8
+ var AppStatusBar = require('./AppStatusBar.css.js');
9
+ var ApplicationProvider = require('../application-provider/ApplicationProvider.js');
10
+ var ConnectionStateDisplay = require('../connection-status/ConnectionStateDisplay.js');
11
+ require('../connection-status/ConnectionStatusIndicator.js');
12
+ var React = require('react');
13
+
14
+ const classBase = "vuuAppStatusBar";
15
+ const shouldShowStatusBar = (connected, settings) => {
16
+ if (settings && "showAppStatusBar" in settings) {
17
+ return settings.showAppStatusBar === true || connected === false;
18
+ } else {
19
+ return connected === false;
20
+ }
21
+ };
22
+ const ApplicationStatusBar = () => {
23
+ const targetWindow = window.useWindow();
24
+ styles.useComponentCssInjection({
25
+ testId: "vuu-settings-form",
26
+ css: AppStatusBar,
27
+ window: targetWindow
28
+ });
29
+ const [connected, setConnected] = React.useState(true);
30
+ const settings = ApplicationProvider.useUserSetting();
31
+ React.useEffect(() => {
32
+ vuuDataRemote.ConnectionManager.on("connection-status", ({ connectionStatus }) => {
33
+ if (connectionStatus === "disconnected") {
34
+ setConnected(false);
35
+ } else if (connectionStatus.endsWith("connected")) {
36
+ setConnected(true);
37
+ }
38
+ });
39
+ }, []);
40
+ if (!shouldShowStatusBar(connected, settings)) {
41
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx(classBase, `${classBase}-hidden`) });
42
+ }
43
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: classBase, children: /* @__PURE__ */ jsxRuntime.jsx(ConnectionStateDisplay.ConnectionStateDisplay, {}) });
44
+ };
45
+
46
+ exports.ApplicationStatusBar = ApplicationStatusBar;
47
+ //# sourceMappingURL=AppStatusBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppStatusBar.js","sources":["../../src/app-status-bar/AppStatusBar.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\n\nimport appStatusBarCss from \"./AppStatusBar.css\";\nimport { useUserSetting } from \"../application-provider\";\nimport { Settings } from \"@vuu-ui/vuu-utils\";\nimport { ConnectionStateDisplay } from \"../connection-status\";\nimport { useEffect, useState } from \"react\";\n\nconst classBase = \"vuuAppStatusBar\";\n\nconst shouldShowStatusBar = (connected: boolean, settings?: Settings) => {\n if (settings && \"showAppStatusBar\" in settings) {\n return settings.showAppStatusBar === true || connected === false;\n } else {\n return connected === false;\n }\n};\n\nexport const ApplicationStatusBar = () => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-settings-form\",\n css: appStatusBarCss,\n window: targetWindow,\n });\n\n const [connected, setConnected] = useState(true);\n const settings = useUserSetting();\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", ({ connectionStatus }) => {\n if (connectionStatus === \"disconnected\") {\n setConnected(false);\n } else if (connectionStatus.endsWith(\"connected\")) {\n setConnected(true);\n }\n });\n }, []);\n\n if (!shouldShowStatusBar(connected, settings)) {\n return <div className={cx(classBase, `${classBase}-hidden`)} />;\n }\n\n // const connect = () => {\n // ConnectionManager.connect({\n // token: \"blah\",\n // url: \"ws://localhost:8090/websocket\",\n // username: \"steve\",\n // });\n // };\n // const disconnect = () => {\n // ConnectionManager.disconnect();\n // };\n\n return (\n <div className={classBase}>\n {/* <Button onClick={disconnect}>Disconnect</Button>\n <Button onClick={connect}>Connect</Button> */}\n <ConnectionStateDisplay />\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","appStatusBarCss","useState","useUserSetting","useEffect","ConnectionManager","jsx","ConnectionStateDisplay"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,SAAY,GAAA,iBAAA;AAElB,MAAM,mBAAA,GAAsB,CAAC,SAAA,EAAoB,QAAwB,KAAA;AACvE,EAAI,IAAA,QAAA,IAAY,sBAAsB,QAAU,EAAA;AAC9C,IAAO,OAAA,QAAA,CAAS,gBAAqB,KAAA,IAAA,IAAQ,SAAc,KAAA,KAAA;AAAA,GACtD,MAAA;AACL,IAAA,OAAO,SAAc,KAAA,KAAA;AAAA;AAEzB,CAAA;AAEO,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,YAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,WAAWC,kCAAe,EAAA;AAEhC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAAC,+BAAA,CAAkB,EAAG,CAAA,mBAAA,EAAqB,CAAC,EAAE,kBAAuB,KAAA;AAClE,MAAA,IAAI,qBAAqB,cAAgB,EAAA;AACvC,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,OACT,MAAA,IAAA,gBAAA,CAAiB,QAAS,CAAA,WAAW,CAAG,EAAA;AACjD,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA;AACnB,KACD,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,mBAAA,CAAoB,SAAW,EAAA,QAAQ,CAAG,EAAA;AAC7C,IAAO,uBAAAC,cAAA,CAAC,SAAI,SAAW,EAAA,EAAA,CAAG,WAAW,CAAG,EAAA,SAAS,SAAS,CAAG,EAAA,CAAA;AAAA;AAc/D,EAAA,sCACG,KAAI,EAAA,EAAA,SAAA,EAAW,SAGd,EAAA,QAAA,kBAAAA,cAAA,CAACC,iDAAuB,CAC1B,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const Guest = {
6
+ username: "unknown",
7
+ token: ""
8
+ };
9
+ const ApplicationContext = React.createContext({
10
+ onUserSettingChanged: (propertyName) => console.warn(
11
+ `Cannot change setting '${propertyName}'.
12
+ Did you forget to declare an ApplicationProvider ?`
13
+ ),
14
+ user: Guest
15
+ });
16
+
17
+ exports.ApplicationContext = ApplicationContext;
18
+ //# sourceMappingURL=ApplicationContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApplicationContext.js","sources":["../../src/application-provider/ApplicationContext.tsx"],"sourcesContent":["import type { Settings, VuuUser } from \"@vuu-ui/vuu-utils\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { createContext } from \"react\";\nimport { SettingsSchema } from \"../user-settings\";\n\nconst Guest: VuuUser = {\n username: \"unknown\",\n token: \"\",\n};\n\nexport interface ApplicationContextProps {\n onUserSettingChanged: (\n propertyName: string,\n value: VuuRowDataItemType,\n ) => void;\n loginUrl?: string;\n userSettings?: Settings;\n userSettingsSchema?: SettingsSchema;\n user: VuuUser;\n}\n\nexport const ApplicationContext = createContext<ApplicationContextProps>({\n onUserSettingChanged: (propertyName: string) =>\n console.warn(\n `Cannot change setting '${propertyName}'.\\nDid you forget to declare an ApplicationProvider ?`,\n ),\n user: Guest,\n});\n"],"names":["createContext"],"mappings":";;;;AAKA,MAAM,KAAiB,GAAA;AAAA,EACrB,QAAU,EAAA,SAAA;AAAA,EACV,KAAO,EAAA;AACT,CAAA;AAaO,MAAM,qBAAqBA,mBAAuC,CAAA;AAAA,EACvE,oBAAA,EAAsB,CAAC,YAAA,KACrB,OAAQ,CAAA,IAAA;AAAA,IACN,0BAA0B,YAAY,CAAA;AAAA,kDAAA;AAAA,GACxC;AAAA,EACF,IAAM,EAAA;AACR,CAAC;;;;"}
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var React = require('react');
6
+ var ApplicationContext = require('./ApplicationContext.js');
7
+ var PersistenceProvider = require('../persistence-manager/PersistenceProvider.js');
8
+ require('../persistence-manager/LocalPersistenceManager.js');
9
+ require('@vuu-ui/vuu-ui-controls');
10
+ require('@salt-ds/styles');
11
+ require('@salt-ds/window');
12
+ require('clsx');
13
+ require('@vuu-ui/vuu-utils');
14
+ require('../persistence-manager/StaticPersistenceManager.js');
15
+
16
+ const getThemeMode = (mode = "light", userSettings) => {
17
+ const themeMode = userSettings?.themeMode;
18
+ if (themeMode === "light" || themeMode === "dark") {
19
+ return themeMode;
20
+ }
21
+ return mode;
22
+ };
23
+ const ApplicationProvider = ({
24
+ children,
25
+ density: densityProp,
26
+ loginUrl,
27
+ mode,
28
+ theme,
29
+ userSettingsSchema,
30
+ user
31
+ }) => {
32
+ const { mode: inheritedMode, theme: inheritedTheme } = core.useTheme();
33
+ const density = core.useDensity(densityProp);
34
+ const persistenceManager = PersistenceProvider.usePersistenceManager();
35
+ const context = React.useContext(ApplicationContext.ApplicationContext);
36
+ const [userSettings, setSettings] = React.useState();
37
+ React.useMemo(async () => {
38
+ if (persistenceManager) {
39
+ const userSettings2 = await persistenceManager.getUserSettings();
40
+ setSettings(userSettings2);
41
+ } else {
42
+ setSettings({});
43
+ }
44
+ }, [persistenceManager]);
45
+ const onUserSettingChanged = React.useCallback(
46
+ (propertyName, value) => {
47
+ setSettings((currentSettings) => {
48
+ const newSettings = { ...currentSettings, [propertyName]: value };
49
+ persistenceManager?.saveUserSettings(newSettings);
50
+ return newSettings;
51
+ });
52
+ },
53
+ [persistenceManager]
54
+ );
55
+ return userSettings ? /* @__PURE__ */ jsxRuntime.jsx(
56
+ ApplicationContext.ApplicationContext.Provider,
57
+ {
58
+ value: {
59
+ ...context,
60
+ loginUrl,
61
+ onUserSettingChanged,
62
+ userSettings,
63
+ userSettingsSchema,
64
+ user: user ?? context.user
65
+ },
66
+ children: /* @__PURE__ */ jsxRuntime.jsx(
67
+ core.SaltProvider,
68
+ {
69
+ theme: theme ?? inheritedTheme ?? "vuu-theme",
70
+ density,
71
+ mode: getThemeMode(mode ?? inheritedMode, userSettings),
72
+ children
73
+ }
74
+ )
75
+ }
76
+ ) : null;
77
+ };
78
+ const useApplicationUser = () => {
79
+ const { user } = React.useContext(ApplicationContext.ApplicationContext);
80
+ return user;
81
+ };
82
+ const useLoginUrl = () => {
83
+ const { loginUrl } = React.useContext(ApplicationContext.ApplicationContext);
84
+ return loginUrl;
85
+ };
86
+ const useApplicationSettings = () => {
87
+ const { onUserSettingChanged, userSettings, userSettingsSchema } = React.useContext(ApplicationContext.ApplicationContext);
88
+ return {
89
+ onUserSettingChanged,
90
+ userSettings,
91
+ userSettingsSchema
92
+ };
93
+ };
94
+ const useUserSetting = () => {
95
+ const { userSettings } = React.useContext(ApplicationContext.ApplicationContext);
96
+ return userSettings;
97
+ };
98
+
99
+ exports.ApplicationProvider = ApplicationProvider;
100
+ exports.useApplicationSettings = useApplicationSettings;
101
+ exports.useApplicationUser = useApplicationUser;
102
+ exports.useLoginUrl = useLoginUrl;
103
+ exports.useUserSetting = useUserSetting;
104
+ //# sourceMappingURL=ApplicationProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApplicationProvider.js","sources":["../../src/application-provider/ApplicationProvider.tsx"],"sourcesContent":["import { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n Density,\n Mode,\n SaltProvider,\n ThemeContextProps,\n useDensity,\n useTheme,\n} from \"@salt-ds/core\";\nimport {\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport {\n ApplicationContext,\n ApplicationContextProps,\n} from \"./ApplicationContext\";\nimport { usePersistenceManager } from \"../persistence-manager\";\n\nexport interface ApplicationProviderProps\n extends Partial<Pick<ThemeContextProps, \"theme\" | \"mode\">>,\n Partial<Omit<ApplicationContextProps, \"userSettings\">> {\n children: ReactNode;\n density?: Density;\n}\n\nconst getThemeMode = (\n mode: Mode = \"light\",\n userSettings?: Record<string, string | number | boolean>,\n) => {\n const themeMode = userSettings?.themeMode;\n if (themeMode === \"light\" || themeMode === \"dark\") {\n return themeMode;\n }\n return mode;\n};\n\nexport const ApplicationProvider = ({\n children,\n density: densityProp,\n loginUrl,\n mode,\n theme,\n userSettingsSchema: userSettingsSchema,\n user,\n}: ApplicationProviderProps): ReactElement | null => {\n const { mode: inheritedMode, theme: inheritedTheme } = useTheme();\n const density = useDensity(densityProp);\n const persistenceManager = usePersistenceManager();\n const context = useContext(ApplicationContext);\n const [userSettings, setSettings] =\n useState<Record<string, string | number | boolean>>();\n\n useMemo(async () => {\n if (persistenceManager) {\n const userSettings = await persistenceManager.getUserSettings();\n setSettings(userSettings);\n } else {\n setSettings({});\n }\n }, [persistenceManager]);\n\n const onUserSettingChanged = useCallback(\n (propertyName: string, value: VuuRowDataItemType) => {\n setSettings((currentSettings) => {\n const newSettings = { ...currentSettings, [propertyName]: value };\n persistenceManager?.saveUserSettings(newSettings);\n return newSettings;\n });\n },\n [persistenceManager],\n );\n\n return userSettings ? (\n <ApplicationContext.Provider\n value={{\n ...context,\n loginUrl,\n onUserSettingChanged,\n userSettings,\n userSettingsSchema,\n user: user ?? context.user,\n }}\n >\n <SaltProvider\n theme={theme ?? inheritedTheme ?? \"vuu-theme\"}\n density={density}\n mode={getThemeMode(mode ?? inheritedMode, userSettings)}\n >\n {children}\n </SaltProvider>\n </ApplicationContext.Provider>\n ) : null;\n};\n\nexport const useApplicationUser = () => {\n const { user } = useContext(ApplicationContext);\n return user;\n};\n\nexport const useLoginUrl = () => {\n const { loginUrl } = useContext(ApplicationContext);\n return loginUrl;\n};\n\n//Setter method (only used within the shell)\nexport const useApplicationSettings = () => {\n const { onUserSettingChanged, userSettings, userSettingsSchema } =\n useContext(ApplicationContext);\n return {\n onUserSettingChanged,\n userSettings,\n userSettingsSchema,\n };\n};\n\n//Getter method (read only access to applicationSetting)\nexport const useUserSetting = () => {\n const { userSettings } = useContext(ApplicationContext);\n return userSettings;\n};\n"],"names":["useTheme","useDensity","usePersistenceManager","useContext","ApplicationContext","useState","useMemo","userSettings","useCallback","jsx","SaltProvider"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+
6
+ const classBase = "vuuConnectionRetryCountdown";
7
+ const ConnectionRetryCountdown = ({
8
+ seconds: secondsProp
9
+ }) => {
10
+ const secondsRemainingRef = React.useRef(secondsProp);
11
+ const [seconds, setSeconds] = React.useState(secondsRemainingRef.current);
12
+ const countDown = React.useCallback(() => {
13
+ secondsRemainingRef.current -= 1;
14
+ setSeconds(secondsRemainingRef.current);
15
+ if (secondsRemainingRef.current > 0) {
16
+ setTimeout(countDown, 1e3);
17
+ }
18
+ }, []);
19
+ React.useEffect(() => {
20
+ if (secondsProp !== secondsRemainingRef.current) {
21
+ secondsRemainingRef.current = secondsProp;
22
+ countDown();
23
+ }
24
+ }, [countDown, secondsProp]);
25
+ React.useMemo(() => {
26
+ setTimeout(countDown, 1e3);
27
+ }, [countDown]);
28
+ return seconds === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: classBase, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: "connecting" }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: classBase, children: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
29
+ "retry in ",
30
+ seconds,
31
+ " seconds"
32
+ ] }) });
33
+ };
34
+
35
+ exports.ConnectionRetryCountdown = ConnectionRetryCountdown;
36
+ //# sourceMappingURL=ConnectionRetryCountdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionRetryCountdown.js","sources":["../../src/connection-status/ConnectionRetryCountdown.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst classBase = \"vuuConnectionRetryCountdown\";\n\nexport const ConnectionRetryCountdown = ({\n seconds: secondsProp,\n}: {\n seconds: number;\n}) => {\n const secondsRemainingRef = useRef(secondsProp);\n const [seconds, setSeconds] = useState<number>(secondsRemainingRef.current);\n\n const countDown = useCallback(() => {\n secondsRemainingRef.current -= 1;\n setSeconds(secondsRemainingRef.current);\n if (secondsRemainingRef.current > 0) {\n setTimeout(countDown, 1000);\n }\n }, []);\n\n useEffect(() => {\n if (secondsProp !== secondsRemainingRef.current) {\n secondsRemainingRef.current = secondsProp;\n countDown();\n }\n }, [countDown, secondsProp]);\n\n useMemo(() => {\n setTimeout(countDown, 1000);\n }, [countDown]);\n\n return seconds === 0 ? (\n <div className={classBase}>\n <span>connecting</span>\n </div>\n ) : (\n <div className={classBase}>\n <span>retry in {seconds} seconds</span>\n </div>\n );\n};\n"],"names":["useRef","useState","useCallback","useEffect","useMemo","jsx"],"mappings":";;;;;AAEA,MAAM,SAAY,GAAA,6BAAA;AAEX,MAAM,2BAA2B,CAAC;AAAA,EACvC,OAAS,EAAA;AACX,CAEM,KAAA;AACJ,EAAM,MAAA,mBAAA,GAAsBA,aAAO,WAAW,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAAC,cAAA,CAAiB,oBAAoB,OAAO,CAAA;AAE1E,EAAM,MAAA,SAAA,GAAYC,kBAAY,MAAM;AAClC,IAAA,mBAAA,CAAoB,OAAW,IAAA,CAAA;AAC/B,IAAA,UAAA,CAAW,oBAAoB,OAAO,CAAA;AACtC,IAAI,IAAA,mBAAA,CAAoB,UAAU,CAAG,EAAA;AACnC,MAAA,UAAA,CAAW,WAAW,GAAI,CAAA;AAAA;AAC5B,GACF,EAAG,EAAE,CAAA;AAEL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAI,IAAA,WAAA,KAAgB,oBAAoB,OAAS,EAAA;AAC/C,MAAA,mBAAA,CAAoB,OAAU,GAAA,WAAA;AAC9B,MAAU,SAAA,EAAA;AAAA;AACZ,GACC,EAAA,CAAC,SAAW,EAAA,WAAW,CAAC,CAAA;AAE3B,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAA,UAAA,CAAW,WAAW,GAAI,CAAA;AAAA,GAC5B,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO,YAAY,CACjB,mBAAAC,cAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,WACd,QAAC,kBAAAA,cAAA,CAAA,MAAA,EAAA,EAAK,QAAU,EAAA,YAAA,EAAA,CAAA,EAClB,oBAECA,cAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,SAAA,EACd,0CAAC,MAAK,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,IAAU,OAAA;AAAA,IAAQ;AAAA,GAAA,EAAQ,CAClC,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var connectionStateDisplayCss = ".vuuConnectionStateDisplay {\n --ballbox-height: 24px;\n --message-height: 14px;\n --row-gap: 3px;\n --top-row: calc(var(--ballbox-height) + var(--message-height));\n --bottom-row: 0px;\n\n align-items: center;\n background: var(--salt-container-secondary-background);\n column-gap: var(--salt-spacing-200);\n display: grid;\n grid-template-columns: auto 1fr;\n grid-template-rows: var(--top-row) var(--bottom-row);\n justify-items: end;\n height: calc(var(--ballbox-height) + var(--message-height) + var(--row-gap));\n padding: 0 var(--salt-spacing-200);\n transition: grid-template-rows 0.4s linear;\n row-gap: var(--row-gap);\n width: max-content;\n\n .vuuTrafficLightControl {\n grid-area: 1/2/2/3;\n padding-left: 20px;\n }\n\n &.vuuConnectionStateDisplay-disconnected {\n --top-row: var(--ballbox-height);\n --bottom-row: var(--message-height);\n }\n\n .vuuConnectionRetryCountdown {\n color: var(--salt-content-secondary-foreground);\n grid-area: 2/2/3/3;\n font-size: 11px;\n text-align: end;\n width: 100%;\n }\n}\n\n.vuuConnectionStateDisplay-text {\n grid-area: 1/1/2/2;\n text-transform: capitalize;\n}\n";
4
+
5
+ module.exports = connectionStateDisplayCss;
6
+ //# sourceMappingURL=ConnectionStateDisplay.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionStateDisplay.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var React = require('react');
8
+ var ConnectionRetryCountdown = require('./ConnectionRetryCountdown.js');
9
+ var ConnectionStatusIndicator = require('./ConnectionStatusIndicator.js');
10
+ var cx = require('clsx');
11
+ var ConnectionStateDisplay$1 = require('./ConnectionStateDisplay.css.js');
12
+
13
+ const classBase = "vuuConnectionStateDisplay";
14
+ const DefaultConnectionState = {
15
+ connectionPhase: "connecting",
16
+ connectionStatus: "closed",
17
+ secondsToNextRetry: -1,
18
+ retryAttemptsRemaining: 0,
19
+ retryAttemptsTotal: 1
20
+ };
21
+ const getDisplayText = (connectionState) => {
22
+ switch (connectionState.connectionStatus) {
23
+ case "closed":
24
+ return "Unable to connect to data service";
25
+ case "failed":
26
+ return connectionState.connectionPhase === "connecting" ? "Failed to connect" : "Failed to re-connect";
27
+ case "disconnected":
28
+ return connectionState.connectionPhase === "connecting" ? "Attempting to connect to data service" : "Attempting to reconnect to data service";
29
+ }
30
+ };
31
+ const ConnectionStateDisplay = ({
32
+ connectionState: connectionStateProp,
33
+ showText = true,
34
+ ...htmlAttributes
35
+ }) => {
36
+ const targetWindow = window.useWindow();
37
+ styles.useComponentCssInjection({
38
+ testId: "vuu-connection-status-indicator",
39
+ css: ConnectionStateDisplay$1,
40
+ window: targetWindow
41
+ });
42
+ const [connectionState, setConnectionState] = React.useState(DefaultConnectionState);
43
+ React.useMemo(() => {
44
+ vuuDataRemote.ConnectionManager.on("connection-status", setConnectionState);
45
+ if (connectionStateProp) {
46
+ setConnectionState(connectionStateProp);
47
+ }
48
+ }, [connectionStateProp]);
49
+ const { connectionStatus, secondsToNextRetry } = connectionState;
50
+ return /* @__PURE__ */ jsxRuntime.jsxs(
51
+ "div",
52
+ {
53
+ ...htmlAttributes,
54
+ className: cx(classBase, `${classBase}-${connectionStatus}`),
55
+ children: [
56
+ showText ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-text`, children: getDisplayText(connectionState) }) : null,
57
+ connectionStatus === "disconnected" && secondsToNextRetry > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ConnectionRetryCountdown.ConnectionRetryCountdown, { seconds: secondsToNextRetry }) : null,
58
+ /* @__PURE__ */ jsxRuntime.jsx(ConnectionStatusIndicator.ConnectionStatusIndicator, { connectionState })
59
+ ]
60
+ }
61
+ );
62
+ };
63
+
64
+ exports.ConnectionStateDisplay = ConnectionStateDisplay;
65
+ //# sourceMappingURL=ConnectionStateDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionStateDisplay.js","sources":["../../src/connection-status/ConnectionStateDisplay.tsx"],"sourcesContent":["import { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\nimport type { WebSocketConnectionState } from \"@vuu-ui/vuu-data-remote/src/WebSocketConnection\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, useMemo, useState } from \"react\";\nimport { ConnectionRetryCountdown } from \"./ConnectionRetryCountdown\";\nimport { ConnectionStatusIndicator } from \"./ConnectionStatusIndicator\";\nimport cx from \"clsx\";\n\nimport connectionStateDisplayCss from \"./ConnectionStateDisplay.css\";\n\nconst classBase = \"vuuConnectionStateDisplay\";\n\nconst DefaultConnectionState: WebSocketConnectionState = {\n connectionPhase: \"connecting\",\n connectionStatus: \"closed\",\n secondsToNextRetry: -1,\n retryAttemptsRemaining: 0,\n retryAttemptsTotal: 1,\n};\n\ninterface ConnectionStateDisplayProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n connectionState?: WebSocketConnectionState;\n showText?: boolean;\n}\n\nconst getDisplayText = (connectionState: WebSocketConnectionState) => {\n switch (connectionState.connectionStatus) {\n case \"closed\":\n return \"Unable to connect to data service\";\n case \"failed\":\n return connectionState.connectionPhase === \"connecting\"\n ? \"Failed to connect\"\n : \"Failed to re-connect\";\n\n case \"disconnected\":\n return connectionState.connectionPhase === \"connecting\"\n ? \"Attempting to connect to data service\"\n : \"Attempting to reconnect to data service\";\n }\n};\n\nexport const ConnectionStateDisplay = ({\n connectionState: connectionStateProp,\n showText = true,\n ...htmlAttributes\n}: ConnectionStateDisplayProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-connection-status-indicator\",\n css: connectionStateDisplayCss,\n window: targetWindow,\n });\n const [connectionState, setConnectionState] =\n useState<WebSocketConnectionState>(DefaultConnectionState);\n\n useMemo(() => {\n ConnectionManager.on(\"connection-status\", setConnectionState);\n if (connectionStateProp) {\n setConnectionState(connectionStateProp);\n }\n }, [connectionStateProp]);\n\n const { connectionStatus, secondsToNextRetry } = connectionState;\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, `${classBase}-${connectionStatus}`)}\n >\n {showText ? (\n <div className={`${classBase}-text`}>\n {getDisplayText(connectionState)}\n </div>\n ) : null}\n {connectionStatus === \"disconnected\" && secondsToNextRetry > 0 ? (\n <ConnectionRetryCountdown seconds={secondsToNextRetry} />\n ) : null}\n <ConnectionStatusIndicator connectionState={connectionState} />\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","connectionStateDisplayCss","useState","useMemo","ConnectionManager","jsxs","jsx","ConnectionRetryCountdown","ConnectionStatusIndicator"],"mappings":";;;;;;;;;;;;AAWA,MAAM,SAAY,GAAA,2BAAA;AAElB,MAAM,sBAAmD,GAAA;AAAA,EACvD,eAAiB,EAAA,YAAA;AAAA,EACjB,gBAAkB,EAAA,QAAA;AAAA,EAClB,kBAAoB,EAAA,CAAA,CAAA;AAAA,EACpB,sBAAwB,EAAA,CAAA;AAAA,EACxB,kBAAoB,EAAA;AACtB,CAAA;AAQA,MAAM,cAAA,GAAiB,CAAC,eAA8C,KAAA;AACpE,EAAA,QAAQ,gBAAgB,gBAAkB;AAAA,IACxC,KAAK,QAAA;AACH,MAAO,OAAA,mCAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAO,OAAA,eAAA,CAAgB,eAAoB,KAAA,YAAA,GACvC,mBACA,GAAA,sBAAA;AAAA,IAEN,KAAK,cAAA;AACH,MAAO,OAAA,eAAA,CAAgB,eAAoB,KAAA,YAAA,GACvC,uCACA,GAAA,yCAAA;AAAA;AAEV,CAAA;AAEO,MAAM,yBAAyB,CAAC;AAAA,EACrC,eAAiB,EAAA,mBAAA;AAAA,EACjB,QAAW,GAAA,IAAA;AAAA,EACX,GAAG;AACL,CAAmC,KAAA;AACjC,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,iCAAA;AAAA,IACR,GAAK,EAAAC,wBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AACD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GACxCC,eAAmC,sBAAsB,CAAA;AAE3D,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAkBC,+BAAA,CAAA,EAAA,CAAG,qBAAqB,kBAAkB,CAAA;AAC5D,IAAA,IAAI,mBAAqB,EAAA;AACvB,MAAA,kBAAA,CAAmB,mBAAmB,CAAA;AAAA;AACxC,GACF,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAExB,EAAM,MAAA,EAAE,gBAAkB,EAAA,kBAAA,EAAuB,GAAA,eAAA;AAEjD,EACE,uBAAAC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,WAAW,EAAG,CAAA,SAAA,EAAW,GAAG,SAAS,CAAA,CAAA,EAAI,gBAAgB,CAAE,CAAA,CAAA;AAAA,MAE1D,QAAA,EAAA;AAAA,QACC,QAAA,mBAAAC,cAAA,CAAC,SAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CACzB,KAAA,CAAA,EAAA,QAAA,EAAA,cAAA,CAAe,eAAe,CAAA,EACjC,CACE,GAAA,IAAA;AAAA,QACH,gBAAA,KAAqB,kBAAkB,kBAAqB,GAAA,CAAA,kCAC1DC,iDAAyB,EAAA,EAAA,OAAA,EAAS,oBAAoB,CACrD,GAAA,IAAA;AAAA,wBACJD,cAAA,CAACE,uDAA0B,eAAkC,EAAA;AAAA;AAAA;AAAA,GAC/D;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var connectionStatusIndicatorCss = "@keyframes squeeze {\n 0% {\n transform: scale(1);\n }\n\n 50% {\n transform: scale(0.85);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n\n.ConnectionStatusIndicator {\n --ball-size-large: 20px;\n --ball-size-small: 14px;\n --ballbox-padding: 4px;\n --retry-count: 0;\n --height: var(\n --ballbox-height,\n calc(var(--ball-size-large) + var(--salt-spacing-100))\n );\n height: var(--height);\n padding: 0 4px;\n position: relative;\n width: calc(\n var(--ball-size-large) + var(--salt-spacing-400) +\n (var(--ball-size-small) + var(--salt-spacing-100)) * var(--retry-count)\n );\n\n &.expanded {\n transition-delay: 1s;\n .Ball.large {\n animation-duration: 0.8s;\n animation-name: squeeze;\n transform-origin: center;\n }\n .Ball.small {\n transform: translateX(calc(var(--ball-size-large) * var(--i)));\n }\n }\n}\n\n.ConnectionStatusIndicator-inactive {\n --ball-color: lightgray;\n}\n\n.ConnectionStatusIndicator-closed {\n --ball-color: red;\n opacity: 0.8;\n .Ball.large {\n transition: background-color 1s linear;\n }\n}\n\n.ConnectionStatusIndicator-connected {\n --ball-color: green;\n}\n\n.ConnectionStatusIndicator-disconnected {\n --ball-color: red;\n}\n\n.Ball.large {\n background-color: var(--ball-color);\n border-radius: calc(var(--ball-size-large) / 2);\n height: var(--ball-size-large);\n right: var(--ballbox-padding);\n top: calc(var(--height) / 2 - (var(--ball-size-large) / 2));\n position: absolute;\n transition: transform 0.8s linear;\n\n width: var(--ball-size-large);\n z-index: 1;\n}\n\n.Ball.small {\n background-color: var(--ball-color);\n border-radius: calc(var(--ball-size-small) / 2);\n height: var(--ball-size-small);\n position: absolute;\n right: calc(\n var(--ballbox-padding) + (var(--ball-size-large) - var(--ball-size-small)) /\n 2\n );\n top: calc(var(--height) / 2 - (var(--ball-size-small) / 2));\n width: var(--ball-size-small);\n\n transition: transform 0.4s ease-out;\n transition-delay: 0.1s;\n}\n";
4
+
5
+ module.exports = connectionStatusIndicatorCss;
6
+ //# sourceMappingURL=ConnectionStatusIndicator.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionStatusIndicator.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var cx = require('clsx');
8
+ var ConnectionStatusIndicator$1 = require('./ConnectionStatusIndicator.css.js');
9
+
10
+ const classBase = "ConnectionStatusIndicator";
11
+ const Ball = React.memo(({ background, i = 0, large = false }) => {
12
+ if (large) {
13
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "Ball large", style: { background } }, i);
14
+ } else {
15
+ return /* @__PURE__ */ jsxRuntime.jsx(
16
+ "div",
17
+ {
18
+ className: "Ball small",
19
+ style: { "--i": -(i + 1), background }
20
+ },
21
+ i
22
+ );
23
+ }
24
+ });
25
+ Ball.displayName = "Ball";
26
+ const ConnectionStatusIndicator = ({
27
+ connectionState
28
+ }) => {
29
+ const targetWindow = window.useWindow();
30
+ styles.useComponentCssInjection({
31
+ testId: "vuu-connection-status-indicator",
32
+ css: ConnectionStatusIndicator$1,
33
+ window: targetWindow
34
+ });
35
+ const ballbox = React.useRef(null);
36
+ const expandedRef = React.useRef(false);
37
+ const { connectionStatus, retryAttemptsRemaining, retryAttemptsTotal } = connectionState;
38
+ if (connectionStatus === "disconnected") {
39
+ expandedRef.current = true;
40
+ }
41
+ const finalState = connectionStatus === "connected" || connectionStatus === "closed";
42
+ React.useMemo(() => {
43
+ if (finalState) {
44
+ expandedRef.current = false;
45
+ }
46
+ }, [finalState]);
47
+ const getSmallBalls = () => {
48
+ const colors = Array(retryAttemptsTotal).fill("lightgray");
49
+ const index = retryAttemptsTotal - retryAttemptsRemaining;
50
+ if (retryAttemptsRemaining) {
51
+ colors[index] = "orange";
52
+ for (let i = 0; i < index; i++) {
53
+ colors[i] = "red";
54
+ }
55
+ } else {
56
+ colors.fill("red");
57
+ }
58
+ colors.reverse();
59
+ return colors.map((background, i) => /* @__PURE__ */ jsxRuntime.jsx(Ball, { i, background }, i));
60
+ };
61
+ const balls = getSmallBalls();
62
+ const displayState = connectionStatus;
63
+ const retryCount = connectionStatus === "disconnected" ? retryAttemptsTotal : 0;
64
+ return /* @__PURE__ */ jsxRuntime.jsxs(
65
+ "div",
66
+ {
67
+ className: cx(classBase, `${classBase}-${displayState}`, {
68
+ expanded: expandedRef.current
69
+ }),
70
+ ref: ballbox,
71
+ style: { "--retry-count": retryCount },
72
+ children: [
73
+ /* @__PURE__ */ jsxRuntime.jsx(Ball, { large: true }),
74
+ balls
75
+ ]
76
+ }
77
+ );
78
+ };
79
+
80
+ exports.ConnectionStatusIndicator = ConnectionStatusIndicator;
81
+ //# sourceMappingURL=ConnectionStatusIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionStatusIndicator.js","sources":["../../src/connection-status/ConnectionStatusIndicator.tsx"],"sourcesContent":["import { CSSProperties, memo, useMemo, useRef } from \"react\";\nimport type { WebSocketConnectionState } from \"@vuu-ui/vuu-data-remote\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport cx from \"clsx\";\n\nimport connectionStatusIndicatorCss from \"./ConnectionStatusIndicator.css\";\n\nconst classBase = \"ConnectionStatusIndicator\";\n\ninterface BallProps {\n background?: string;\n i?: number;\n large?: boolean;\n}\nconst Ball = memo(({ background, i = 0, large = false }: BallProps) => {\n if (large) {\n return <div className=\"Ball large\" key={i} style={{ background }} />;\n } else {\n return (\n <div\n className=\"Ball small\"\n key={i}\n style={{ \"--i\": -(i + 1), background } as CSSProperties}\n />\n );\n }\n});\nBall.displayName = \"Ball\";\n\ninterface ConnectionStatusIndicatorProps {\n connectionState: WebSocketConnectionState;\n}\n\nexport const ConnectionStatusIndicator = ({\n connectionState,\n}: ConnectionStatusIndicatorProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-connection-status-indicator\",\n css: connectionStatusIndicatorCss,\n window: targetWindow,\n });\n\n const ballbox = useRef<HTMLDivElement>(null);\n const expandedRef = useRef(false);\n const { connectionStatus, retryAttemptsRemaining, retryAttemptsTotal } =\n connectionState;\n\n if (connectionStatus === \"disconnected\") {\n // one way switch\n expandedRef.current = true;\n }\n const finalState =\n connectionStatus === \"connected\" || connectionStatus === \"closed\";\n\n useMemo(() => {\n if (finalState) {\n expandedRef.current = false;\n }\n }, [finalState]);\n\n const getSmallBalls = () => {\n const colors = Array(retryAttemptsTotal).fill(\"lightgray\");\n const index = retryAttemptsTotal - retryAttemptsRemaining;\n if (retryAttemptsRemaining) {\n colors[index] = \"orange\";\n for (let i = 0; i < index; i++) {\n colors[i] = \"red\";\n }\n } else {\n colors.fill(\"red\");\n }\n colors.reverse();\n return colors.map((background, i) => (\n <Ball key={i} i={i} background={background} />\n ));\n };\n\n const balls = getSmallBalls();\n\n // const displayState = balls.length > 0 ? \"disconnected\" : connectionStatus;\n const displayState = connectionStatus;\n const retryCount =\n connectionStatus === \"disconnected\" ? retryAttemptsTotal : 0;\n\n return (\n <div\n className={cx(classBase, `${classBase}-${displayState}`, {\n expanded: expandedRef.current,\n })}\n ref={ballbox}\n style={{ \"--retry-count\": retryCount } as CSSProperties}\n >\n <Ball large />\n {balls}\n </div>\n );\n};\n"],"names":["memo","jsx","useWindow","useComponentCssInjection","connectionStatusIndicatorCss","useRef","useMemo","jsxs"],"mappings":"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"}