@vuu-ui/vuu-shell 0.0.26

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 (222) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +0 -0
  3. package/cjs/ShellContextProvider.js +31 -0
  4. package/cjs/ShellContextProvider.js.map +1 -0
  5. package/cjs/app-header/AppHeader.css.js +6 -0
  6. package/cjs/app-header/AppHeader.css.js.map +1 -0
  7. package/cjs/app-header/AppHeader.js +66 -0
  8. package/cjs/app-header/AppHeader.js.map +1 -0
  9. package/cjs/connection-status/ConnectionStatusIndicator.css.js +6 -0
  10. package/cjs/connection-status/ConnectionStatusIndicator.css.js.map +1 -0
  11. package/cjs/connection-status/ConnectionStatusIndicator.js +51 -0
  12. package/cjs/connection-status/ConnectionStatusIndicator.js.map +1 -0
  13. package/cjs/feature/Feature.js +56 -0
  14. package/cjs/feature/Feature.js.map +1 -0
  15. package/cjs/feature/FeatureErrorBoundary.js +30 -0
  16. package/cjs/feature/FeatureErrorBoundary.js.map +1 -0
  17. package/cjs/feature/Loader.js +8 -0
  18. package/cjs/feature/Loader.js.map +1 -0
  19. package/cjs/feature-list/FeatureList.css.js +6 -0
  20. package/cjs/feature-list/FeatureList.css.js.map +1 -0
  21. package/cjs/feature-list/FeatureList.js +52 -0
  22. package/cjs/feature-list/FeatureList.js.map +1 -0
  23. package/cjs/index.js +51 -0
  24. package/cjs/index.js.map +1 -0
  25. package/cjs/layout-management/LayoutList.css.js +6 -0
  26. package/cjs/layout-management/LayoutList.css.js.map +1 -0
  27. package/cjs/layout-management/LayoutList.js +75 -0
  28. package/cjs/layout-management/LayoutList.js.map +1 -0
  29. package/cjs/layout-management/LayoutTile.css.js +6 -0
  30. package/cjs/layout-management/LayoutTile.css.js.map +1 -0
  31. package/cjs/layout-management/LayoutTile.js +36 -0
  32. package/cjs/layout-management/LayoutTile.js.map +1 -0
  33. package/cjs/layout-management/SaveLayoutPanel.css.js +6 -0
  34. package/cjs/layout-management/SaveLayoutPanel.css.js.map +1 -0
  35. package/cjs/layout-management/SaveLayoutPanel.js +149 -0
  36. package/cjs/layout-management/SaveLayoutPanel.js.map +1 -0
  37. package/cjs/layout-management/screenshot-utils.js +25 -0
  38. package/cjs/layout-management/screenshot-utils.js.map +1 -0
  39. package/cjs/layout-management/useLayoutContextMenuItems.js +72 -0
  40. package/cjs/layout-management/useLayoutContextMenuItems.js.map +1 -0
  41. package/cjs/layout-management/useLayoutManager.js +218 -0
  42. package/cjs/layout-management/useLayoutManager.js.map +1 -0
  43. package/cjs/left-nav/LeftNav.css.js +6 -0
  44. package/cjs/left-nav/LeftNav.css.js.map +1 -0
  45. package/cjs/left-nav/LeftNav.js +166 -0
  46. package/cjs/left-nav/LeftNav.js.map +1 -0
  47. package/cjs/login/LoginPanel.css.js +6 -0
  48. package/cjs/login/LoginPanel.css.js.map +1 -0
  49. package/cjs/login/LoginPanel.js +108 -0
  50. package/cjs/login/LoginPanel.js.map +1 -0
  51. package/cjs/login/VuuLogo.js +134 -0
  52. package/cjs/login/VuuLogo.js.map +1 -0
  53. package/cjs/login/login-utils.js +31 -0
  54. package/cjs/login/login-utils.js.map +1 -0
  55. package/cjs/persistence-management/LocalPersistenceManager.js +184 -0
  56. package/cjs/persistence-management/LocalPersistenceManager.js.map +1 -0
  57. package/cjs/persistence-management/RemotePersistenceManager.js +164 -0
  58. package/cjs/persistence-management/RemotePersistenceManager.js.map +1 -0
  59. package/cjs/persistence-management/defaultApplicationJson.js +42 -0
  60. package/cjs/persistence-management/defaultApplicationJson.js.map +1 -0
  61. package/cjs/session-editing-form/SessionEditingForm.css.js +6 -0
  62. package/cjs/session-editing-form/SessionEditingForm.css.js.map +1 -0
  63. package/cjs/session-editing-form/SessionEditingForm.js +280 -0
  64. package/cjs/session-editing-form/SessionEditingForm.js.map +1 -0
  65. package/cjs/shell-layouts/context-panel/ContextPanel.css.js +6 -0
  66. package/cjs/shell-layouts/context-panel/ContextPanel.css.js.map +1 -0
  67. package/cjs/shell-layouts/context-panel/ContextPanel.js +70 -0
  68. package/cjs/shell-layouts/context-panel/ContextPanel.js.map +1 -0
  69. package/cjs/shell-layouts/side-panel/SidePanel.css.js +6 -0
  70. package/cjs/shell-layouts/side-panel/SidePanel.css.js.map +1 -0
  71. package/cjs/shell-layouts/side-panel/SidePanel.js +36 -0
  72. package/cjs/shell-layouts/side-panel/SidePanel.js.map +1 -0
  73. package/cjs/shell-layouts/useFullHeightLeftPanel.js +41 -0
  74. package/cjs/shell-layouts/useFullHeightLeftPanel.js.map +1 -0
  75. package/cjs/shell-layouts/useInlayLeftPanel.js +78 -0
  76. package/cjs/shell-layouts/useInlayLeftPanel.js.map +1 -0
  77. package/cjs/shell-layouts/useShellLayout.js +15 -0
  78. package/cjs/shell-layouts/useShellLayout.js.map +1 -0
  79. package/cjs/shell.css.js +6 -0
  80. package/cjs/shell.css.js.map +1 -0
  81. package/cjs/shell.js +137 -0
  82. package/cjs/shell.js.map +1 -0
  83. package/cjs/shellTypes.js +8 -0
  84. package/cjs/shellTypes.js.map +1 -0
  85. package/cjs/theme-switch/ThemeSwitch.css.js +6 -0
  86. package/cjs/theme-switch/ThemeSwitch.css.js.map +1 -0
  87. package/cjs/theme-switch/ThemeSwitch.js +56 -0
  88. package/cjs/theme-switch/ThemeSwitch.js.map +1 -0
  89. package/esm/ShellContextProvider.js +28 -0
  90. package/esm/ShellContextProvider.js.map +1 -0
  91. package/esm/app-header/AppHeader.css.js +4 -0
  92. package/esm/app-header/AppHeader.css.js.map +1 -0
  93. package/esm/app-header/AppHeader.js +64 -0
  94. package/esm/app-header/AppHeader.js.map +1 -0
  95. package/esm/connection-status/ConnectionStatusIndicator.css.js +4 -0
  96. package/esm/connection-status/ConnectionStatusIndicator.css.js.map +1 -0
  97. package/esm/connection-status/ConnectionStatusIndicator.js +49 -0
  98. package/esm/connection-status/ConnectionStatusIndicator.js.map +1 -0
  99. package/esm/feature/Feature.js +54 -0
  100. package/esm/feature/Feature.js.map +1 -0
  101. package/esm/feature/FeatureErrorBoundary.js +28 -0
  102. package/esm/feature/FeatureErrorBoundary.js.map +1 -0
  103. package/esm/feature/Loader.js +6 -0
  104. package/esm/feature/Loader.js.map +1 -0
  105. package/esm/feature-list/FeatureList.css.js +4 -0
  106. package/esm/feature-list/FeatureList.css.js.map +1 -0
  107. package/esm/feature-list/FeatureList.js +50 -0
  108. package/esm/feature-list/FeatureList.js.map +1 -0
  109. package/esm/index.js +20 -0
  110. package/esm/index.js.map +1 -0
  111. package/esm/layout-management/LayoutList.css.js +4 -0
  112. package/esm/layout-management/LayoutList.css.js.map +1 -0
  113. package/esm/layout-management/LayoutList.js +73 -0
  114. package/esm/layout-management/LayoutList.js.map +1 -0
  115. package/esm/layout-management/LayoutTile.css.js +4 -0
  116. package/esm/layout-management/LayoutTile.css.js.map +1 -0
  117. package/esm/layout-management/LayoutTile.js +34 -0
  118. package/esm/layout-management/LayoutTile.js.map +1 -0
  119. package/esm/layout-management/SaveLayoutPanel.css.js +4 -0
  120. package/esm/layout-management/SaveLayoutPanel.css.js.map +1 -0
  121. package/esm/layout-management/SaveLayoutPanel.js +147 -0
  122. package/esm/layout-management/SaveLayoutPanel.js.map +1 -0
  123. package/esm/layout-management/screenshot-utils.js +23 -0
  124. package/esm/layout-management/screenshot-utils.js.map +1 -0
  125. package/esm/layout-management/useLayoutContextMenuItems.js +70 -0
  126. package/esm/layout-management/useLayoutContextMenuItems.js.map +1 -0
  127. package/esm/layout-management/useLayoutManager.js +214 -0
  128. package/esm/layout-management/useLayoutManager.js.map +1 -0
  129. package/esm/left-nav/LeftNav.css.js +4 -0
  130. package/esm/left-nav/LeftNav.css.js.map +1 -0
  131. package/esm/left-nav/LeftNav.js +164 -0
  132. package/esm/left-nav/LeftNav.js.map +1 -0
  133. package/esm/login/LoginPanel.css.js +4 -0
  134. package/esm/login/LoginPanel.css.js.map +1 -0
  135. package/esm/login/LoginPanel.js +106 -0
  136. package/esm/login/LoginPanel.js.map +1 -0
  137. package/esm/login/VuuLogo.js +132 -0
  138. package/esm/login/VuuLogo.js.map +1 -0
  139. package/esm/login/login-utils.js +26 -0
  140. package/esm/login/login-utils.js.map +1 -0
  141. package/esm/persistence-management/LocalPersistenceManager.js +182 -0
  142. package/esm/persistence-management/LocalPersistenceManager.js.map +1 -0
  143. package/esm/persistence-management/RemotePersistenceManager.js +162 -0
  144. package/esm/persistence-management/RemotePersistenceManager.js.map +1 -0
  145. package/esm/persistence-management/defaultApplicationJson.js +39 -0
  146. package/esm/persistence-management/defaultApplicationJson.js.map +1 -0
  147. package/esm/session-editing-form/SessionEditingForm.css.js +4 -0
  148. package/esm/session-editing-form/SessionEditingForm.css.js.map +1 -0
  149. package/esm/session-editing-form/SessionEditingForm.js +278 -0
  150. package/esm/session-editing-form/SessionEditingForm.js.map +1 -0
  151. package/esm/shell-layouts/context-panel/ContextPanel.css.js +4 -0
  152. package/esm/shell-layouts/context-panel/ContextPanel.css.js.map +1 -0
  153. package/esm/shell-layouts/context-panel/ContextPanel.js +68 -0
  154. package/esm/shell-layouts/context-panel/ContextPanel.js.map +1 -0
  155. package/esm/shell-layouts/side-panel/SidePanel.css.js +4 -0
  156. package/esm/shell-layouts/side-panel/SidePanel.css.js.map +1 -0
  157. package/esm/shell-layouts/side-panel/SidePanel.js +34 -0
  158. package/esm/shell-layouts/side-panel/SidePanel.js.map +1 -0
  159. package/esm/shell-layouts/useFullHeightLeftPanel.js +39 -0
  160. package/esm/shell-layouts/useFullHeightLeftPanel.js.map +1 -0
  161. package/esm/shell-layouts/useInlayLeftPanel.js +76 -0
  162. package/esm/shell-layouts/useInlayLeftPanel.js.map +1 -0
  163. package/esm/shell-layouts/useShellLayout.js +13 -0
  164. package/esm/shell-layouts/useShellLayout.js.map +1 -0
  165. package/esm/shell.css.js +4 -0
  166. package/esm/shell.css.js.map +1 -0
  167. package/esm/shell.js +135 -0
  168. package/esm/shell.js.map +1 -0
  169. package/esm/shellTypes.js +5 -0
  170. package/esm/shellTypes.js.map +1 -0
  171. package/esm/theme-switch/ThemeSwitch.css.js +4 -0
  172. package/esm/theme-switch/ThemeSwitch.css.js.map +1 -0
  173. package/esm/theme-switch/ThemeSwitch.js +54 -0
  174. package/esm/theme-switch/ThemeSwitch.js.map +1 -0
  175. package/package.json +48 -0
  176. package/types/ShellContextProvider.d.ts +16 -0
  177. package/types/app-header/AppHeader.d.ts +12 -0
  178. package/types/app-header/index.d.ts +1 -0
  179. package/types/connection-status/ConnectionStatusIndicator.d.ts +10 -0
  180. package/types/connection-status/index.d.ts +1 -0
  181. package/types/feature/Feature.d.ts +26 -0
  182. package/types/feature/FeatureErrorBoundary.d.ts +13 -0
  183. package/types/feature/Loader.d.ts +2 -0
  184. package/types/feature/index.d.ts +1 -0
  185. package/types/feature-list/FeatureList.d.ts +6 -0
  186. package/types/feature-list/index.d.ts +1 -0
  187. package/types/get-layout-history.d.ts +8 -0
  188. package/types/index.d.ts +13 -0
  189. package/types/layout-management/LayoutList.d.ts +2 -0
  190. package/types/layout-management/LayoutTile.d.ts +8 -0
  191. package/types/layout-management/SaveLayoutPanel.d.ts +10 -0
  192. package/types/layout-management/index.d.ts +5 -0
  193. package/types/layout-management/layoutTypes.d.ts +19 -0
  194. package/types/layout-management/screenshot-utils.d.ts +6 -0
  195. package/types/layout-management/useLayoutContextMenuItems.d.ts +6 -0
  196. package/types/layout-management/useLayoutManager.d.ts +26 -0
  197. package/types/left-nav/LeftNav.d.ts +17 -0
  198. package/types/left-nav/index.d.ts +1 -0
  199. package/types/login/LoginPanel.d.ts +7 -0
  200. package/types/login/VuuLogo.d.ts +2 -0
  201. package/types/login/index.d.ts +2 -0
  202. package/types/login/login-utils.d.ts +4 -0
  203. package/types/persistence-management/LocalPersistenceManager.d.ts +21 -0
  204. package/types/persistence-management/PersistenceManager.d.ts +55 -0
  205. package/types/persistence-management/RemotePersistenceManager.d.ts +22 -0
  206. package/types/persistence-management/defaultApplicationJson.d.ts +4 -0
  207. package/types/persistence-management/index.d.ts +4 -0
  208. package/types/session-editing-form/SessionEditingForm.d.ts +24 -0
  209. package/types/session-editing-form/index.d.ts +1 -0
  210. package/types/shell-layouts/context-panel/ContextPanel.d.ts +10 -0
  211. package/types/shell-layouts/context-panel/index.d.ts +1 -0
  212. package/types/shell-layouts/index.d.ts +3 -0
  213. package/types/shell-layouts/side-panel/SidePanel.d.ts +8 -0
  214. package/types/shell-layouts/side-panel/index.d.ts +1 -0
  215. package/types/shell-layouts/useFullHeightLeftPanel.d.ts +3 -0
  216. package/types/shell-layouts/useInlayLeftPanel.d.ts +3 -0
  217. package/types/shell-layouts/useShellLayout.d.ts +10 -0
  218. package/types/shell.d.ts +21 -0
  219. package/types/shellTypes.d.ts +29 -0
  220. package/types/theme-switch/ThemeSwitch.d.ts +8 -0
  221. package/types/theme-switch/index.d.ts +1 -0
  222. package/types/use-force-render.d.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
package/cjs/shell.js ADDED
@@ -0,0 +1,137 @@
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 vuuLayout = require('@vuu-ui/vuu-layout');
8
+ var vuuPopups = require('@vuu-ui/vuu-popups');
9
+ var vuuUtils = require('@vuu-ui/vuu-utils');
10
+ var core = require('@salt-ds/core');
11
+ var cx = require('clsx');
12
+ var React = require('react');
13
+ var AppHeader = require('./app-header/AppHeader.js');
14
+ require('@vuu-ui/vuu-ui-controls');
15
+ require('html-to-image');
16
+ var useLayoutManager = require('./layout-management/useLayoutManager.js');
17
+ var useLayoutContextMenuItems = require('./layout-management/useLayoutContextMenuItems.js');
18
+ var defaultApplicationJson = require('./persistence-management/defaultApplicationJson.js');
19
+ require('./persistence-management/LocalPersistenceManager.js');
20
+ require('./persistence-management/RemotePersistenceManager.js');
21
+ var useShellLayout = require('./shell-layouts/useShellLayout.js');
22
+ var shell = require('./shell.css.js');
23
+
24
+ if (typeof vuuLayout.StackLayout !== "function") {
25
+ console.warn(
26
+ "StackLayout module not loaded, will be unsbale to deserialize from layout JSON"
27
+ );
28
+ }
29
+ const { error } = vuuUtils.logger("Shell");
30
+ const defaultLeftSidePanel = {};
31
+ const Shell = ({
32
+ LayoutProps,
33
+ LeftSidePanelProps = defaultLeftSidePanel,
34
+ children,
35
+ className: classNameProp,
36
+ leftSidePanelLayout,
37
+ loginUrl,
38
+ saveLocation: _,
39
+ saveUrl,
40
+ serverUrl,
41
+ user,
42
+ ...htmlAttributes
43
+ }) => {
44
+ const targetWindow = window.useWindow();
45
+ styles.useComponentCssInjection({
46
+ testId: "vuu-shell",
47
+ css: shell,
48
+ window: targetWindow
49
+ });
50
+ const rootRef = React.useRef(null);
51
+ const { dialog, setDialogState } = vuuPopups.useDialog();
52
+ const layoutId = React.useRef("latest");
53
+ const { applicationJson, saveApplicationLayout, loadLayoutById } = useLayoutManager.useLayoutManager();
54
+ const { buildMenuOptions, handleMenuAction } = useLayoutContextMenuItems.useLayoutContextMenuItems(setDialogState);
55
+ const [connectionStatus, setConnectionStatus] = React.useState("connected");
56
+ const handleLayoutChange = React.useCallback(
57
+ (layout) => {
58
+ try {
59
+ saveApplicationLayout(layout);
60
+ } catch {
61
+ error?.("Failed to save layout");
62
+ }
63
+ },
64
+ [saveApplicationLayout]
65
+ );
66
+ const handleSwitchTheme = React.useCallback((mode) => {
67
+ if (rootRef.current) {
68
+ rootRef.current.dataset.mode = mode;
69
+ }
70
+ }, []);
71
+ const handleNavigate = React.useCallback(
72
+ (id) => {
73
+ layoutId.current = id;
74
+ loadLayoutById(id);
75
+ },
76
+ [loadLayoutById]
77
+ );
78
+ React.useMemo(async () => {
79
+ if (serverUrl && user.token) {
80
+ const connectionStatus2 = await vuuDataRemote.connectToServer({
81
+ authToken: user.token,
82
+ url: serverUrl,
83
+ username: user.username
84
+ });
85
+ setConnectionStatus(connectionStatus2);
86
+ }
87
+ }, [serverUrl, user.token, user.username]);
88
+ const className = cx("vuuShell");
89
+ const isLoading = applicationJson === defaultApplicationJson.loadingApplicationJson;
90
+ const shellLayout = useShellLayout.useShellLayout({
91
+ LeftSidePanelProps,
92
+ leftSidePanelLayout,
93
+ appHeader: /* @__PURE__ */ jsxRuntime.jsx(
94
+ AppHeader.AppHeader,
95
+ {
96
+ layoutId: layoutId.current,
97
+ loginUrl,
98
+ user,
99
+ onNavigate: handleNavigate,
100
+ onSwitchTheme: handleSwitchTheme
101
+ }
102
+ )
103
+ });
104
+ if (connectionStatus === "rejected") {
105
+ console.log("game over, no connection to server");
106
+ }
107
+ return isLoading ? null : /* @__PURE__ */ jsxRuntime.jsx(core.SaltProvider, { theme: "vuu-theme", density: "high", children: /* @__PURE__ */ jsxRuntime.jsxs(
108
+ vuuPopups.ContextMenuProvider,
109
+ {
110
+ menuActionHandler: handleMenuAction,
111
+ menuBuilder: buildMenuOptions,
112
+ children: [
113
+ /* @__PURE__ */ jsxRuntime.jsx(
114
+ vuuLayout.LayoutProvider,
115
+ {
116
+ ...LayoutProps,
117
+ layout: applicationJson.layout,
118
+ onLayoutChange: handleLayoutChange,
119
+ children: /* @__PURE__ */ jsxRuntime.jsx(
120
+ vuuLayout.DraggableLayout,
121
+ {
122
+ className,
123
+ ref: rootRef,
124
+ ...htmlAttributes,
125
+ children: shellLayout
126
+ }
127
+ )
128
+ }
129
+ ),
130
+ children || dialog
131
+ ]
132
+ }
133
+ ) });
134
+ };
135
+
136
+ exports.Shell = Shell;
137
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sources":["../src/shell.tsx"],"sourcesContent":["import { connectToServer } from \"@vuu-ui/vuu-data-remote\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n DraggableLayout,\n LayoutProvider,\n LayoutProviderProps,\n StackLayout,\n} from \"@vuu-ui/vuu-layout\";\nimport type { LayoutChangeHandler } from \"@vuu-ui/vuu-layout\";\nimport { ContextMenuProvider, useDialog } from \"@vuu-ui/vuu-popups\";\nimport { logger, ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport { SaltProvider } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport {\n HTMLAttributes,\n ReactNode,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AppHeader } from \"./app-header\";\nimport {\n useLayoutContextMenuItems,\n useLayoutManager,\n} from \"./layout-management\";\nimport { loadingApplicationJson } from \"./persistence-management\";\nimport { SidePanelProps, useShellLayout } from \"./shell-layouts\";\nimport { SaveLocation } from \"./shellTypes\";\n\nimport shellCss from \"./shell.css\";\n\nif (typeof StackLayout !== \"function\") {\n console.warn(\n \"StackLayout module not loaded, will be unsbale to deserialize from layout JSON\"\n );\n}\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst { error } = logger(\"Shell\");\n\nconst defaultLeftSidePanel: ShellProps[\"LeftSidePanelProps\"] = {};\n\nexport type LayoutTemplateName = \"full-height\" | \"inlay\";\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n LayoutProps?: Pick<\n LayoutProviderProps,\n \"createNewChild\" | \"pathToDropTarget\"\n >;\n LeftSidePanelProps?: SidePanelProps;\n children?: ReactNode;\n leftSidePanelLayout?: \"full-height\" | \"inlay\";\n loginUrl?: string;\n // paletteConfig: any;\n saveLocation?: SaveLocation;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n LayoutProps,\n LeftSidePanelProps = defaultLeftSidePanel,\n children,\n className: classNameProp,\n leftSidePanelLayout,\n loginUrl,\n saveLocation: _,\n saveUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-shell\",\n css: shellCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const { dialog, setDialogState } = useDialog();\n const layoutId = useRef(\"latest\");\n const { applicationJson, saveApplicationLayout, loadLayoutById } =\n useLayoutManager();\n const { buildMenuOptions, handleMenuAction } =\n useLayoutContextMenuItems(setDialogState);\n const [connectionStatus, setConnectionStatus] = useState<\n \"connected\" | \"rejected\"\n >(\"connected\");\n\n const handleLayoutChange = useCallback<LayoutChangeHandler>(\n (layout) => {\n try {\n saveApplicationLayout(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveApplicationLayout]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n // TODO this is out of date\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useMemo(async () => {\n if (serverUrl && user.token) {\n const connectionStatus = await connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n setConnectionStatus(connectionStatus);\n }\n }, [serverUrl, user.token, user.username]);\n\n const className = cx(\"vuuShell\");\n\n const isLoading = applicationJson === loadingApplicationJson;\n\n const shellLayout = useShellLayout({\n LeftSidePanelProps,\n leftSidePanelLayout,\n appHeader: (\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n ),\n });\n\n if (connectionStatus === \"rejected\") {\n console.log(\"game over, no connection to server\");\n }\n\n return isLoading ? null : (\n <SaltProvider theme=\"vuu-theme\" density=\"high\">\n <ContextMenuProvider\n menuActionHandler={handleMenuAction}\n menuBuilder={buildMenuOptions}\n >\n <LayoutProvider\n {...LayoutProps}\n layout={applicationJson.layout}\n onLayoutChange={handleLayoutChange}\n >\n <DraggableLayout\n className={className}\n ref={rootRef}\n {...htmlAttributes}\n >\n {shellLayout}\n </DraggableLayout>\n </LayoutProvider>\n {children || dialog}\n </ContextMenuProvider>\n </SaltProvider>\n );\n};\n"],"names":["StackLayout","logger","useWindow","useComponentCssInjection","shellCss","useRef","useDialog","useLayoutManager","useLayoutContextMenuItems","useState","useCallback","useMemo","connectionStatus","connectToServer","loadingApplicationJson","useShellLayout","jsx","AppHeader","SaltProvider","jsxs","ContextMenuProvider","LayoutProvider","DraggableLayout"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ const isWildcardSchema = (schema) => schema === "*";
4
+ const isTableSchema = (schema) => typeof schema === "object" && typeof schema.module === "string" && typeof schema.table === "string";
5
+
6
+ exports.isTableSchema = isTableSchema;
7
+ exports.isWildcardSchema = isWildcardSchema;
8
+ //# sourceMappingURL=shellTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellTypes.js","sources":["../src/shellTypes.ts"],"sourcesContent":["import type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport type { ViewProps } from \"@vuu-ui/vuu-layout\";\n\ndeclare global {\n const vuuConfig: Promise<VuuConfig>;\n}\n\nexport type SaveLocation = \"local\" | \"remote\";\n\nexport interface FeatureConfig {\n name: string;\n title: string;\n url: string;\n css?: string;\n leftNavLocation: \"vuu-features\" | \"vuu-tables\";\n featureProps?: {\n schema?: \"*\" | VuuTable;\n schemas?: VuuTable[];\n ViewProps?: Partial<ViewProps>;\n };\n}\n\nexport type Features = {\n [key: string]: FeatureConfig;\n};\nexport interface VuuConfig {\n features: Features;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\nexport const isWildcardSchema = (schema?: \"*\" | VuuTable): schema is \"*\" =>\n schema === \"*\";\nexport const isTableSchema = (schema?: \"*\" | VuuTable): schema is VuuTable =>\n typeof schema === \"object\" &&\n typeof schema.module === \"string\" &&\n typeof schema.table === \"string\";\n"],"names":[],"mappings":";;AAgCa,MAAA,gBAAA,GAAmB,CAAC,MAAA,KAC/B,MAAW,KAAA,IAAA;AACN,MAAM,aAAgB,GAAA,CAAC,MAC5B,KAAA,OAAO,MAAW,KAAA,QAAA,IAClB,OAAO,MAAA,CAAO,MAAW,KAAA,QAAA,IACzB,OAAO,MAAA,CAAO,KAAU,KAAA;;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var themeSwitchCss = "\n.vuuThemeSwitch {\n --saltButton-minWidth: 22px;\n --svg-light: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z\"/></svg>');\n --svg-dark: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z\"/></svg>');\n padding: 2px;\n}\n\n.salt-density-high .vuuThemeSwitch {\n --saltButton-minWidth: 16px;\n --saltButton-width: 18px;\n --vuuThemeSwitch-iconSize: 16px;\n}\n\n.vuuThemeSwitch [data-icon] {\n --vuu-icon-size: var(--vuuThemeSwitch-iconSize,18px);\n}\n\n.vuuThemeSwitch [data-icon='light'] {\n --vuu-icon-svg: var(--svg-light);\n}\n.vuuThemeSwitch [data-icon='dark'] {\n --vuu-icon-svg: var(--svg-dark);\n}\n\n.vuuThemeSwitch .saltToggleButton {\n height: 20px;\n width: 20px;\n}\n\n";
4
+
5
+ module.exports = themeSwitchCss;
6
+ //# sourceMappingURL=ThemeSwitch.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeSwitch.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var cx = require('clsx');
5
+ var core = require('@salt-ds/core');
6
+ var styles = require('@salt-ds/styles');
7
+ var window = require('@salt-ds/window');
8
+ var React = require('react');
9
+ var ThemeSwitch$1 = require('./ThemeSwitch.css.js');
10
+
11
+ const classBase = "vuuThemeSwitch";
12
+ const ThemeSwitch = ({
13
+ className: classNameProp,
14
+ defaultMode: defaultModeProp,
15
+ mode: modeProp,
16
+ onChange,
17
+ ...htmlAttributes
18
+ }) => {
19
+ const targetWindow = window.useWindow();
20
+ styles.useComponentCssInjection({
21
+ testId: "vuu-theme-switch",
22
+ css: ThemeSwitch$1,
23
+ window: targetWindow
24
+ });
25
+ const [mode, setMode] = core.useControlled({
26
+ controlled: modeProp,
27
+ default: defaultModeProp ?? "light",
28
+ name: "ThemeSwitch",
29
+ state: "mode"
30
+ });
31
+ const handleChangeSecondary = React.useCallback(
32
+ (evt) => {
33
+ const { value } = evt.target;
34
+ setMode(value);
35
+ onChange(value);
36
+ },
37
+ [onChange, setMode]
38
+ );
39
+ const className = cx(classBase, classNameProp);
40
+ return /* @__PURE__ */ jsxRuntime.jsxs(
41
+ core.ToggleButtonGroup,
42
+ {
43
+ className,
44
+ ...htmlAttributes,
45
+ onChange: handleChangeSecondary,
46
+ value: mode,
47
+ children: [
48
+ /* @__PURE__ */ jsxRuntime.jsx(core.ToggleButton, { "aria-label": "alert", "data-icon": "light", value: "light" }),
49
+ /* @__PURE__ */ jsxRuntime.jsx(core.ToggleButton, { "aria-label": "home", "data-icon": "dark", value: "dark" })
50
+ ]
51
+ }
52
+ );
53
+ };
54
+
55
+ exports.ThemeSwitch = ThemeSwitch;
56
+ //# sourceMappingURL=ThemeSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeSwitch.js","sources":["../../src/theme-switch/ThemeSwitch.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport { ToggleButton, ToggleButtonGroup, useControlled } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, SyntheticEvent, useCallback } from \"react\";\nimport { ThemeMode } from \"@vuu-ui/vuu-utils\";\n\nimport themeSwitchCss from \"./ThemeSwitch.css\";\n\nconst classBase = \"vuuThemeSwitch\";\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-theme-switch\",\n css: themeSwitchCss,\n window: targetWindow,\n });\n\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const handleChangeSecondary = useCallback(\n (evt: SyntheticEvent<HTMLButtonElement>) => {\n const { value } = evt.target as HTMLButtonElement;\n setMode(value as ThemeMode);\n onChange(value as ThemeMode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n value={mode}\n >\n <ToggleButton aria-label=\"alert\" data-icon=\"light\" value=\"light\" />\n <ToggleButton aria-label=\"home\" data-icon=\"dark\" value=\"dark\" />\n </ToggleButtonGroup>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","themeSwitchCss","useControlled","useCallback","jsxs","ToggleButtonGroup","jsx","ToggleButton"],"mappings":";;;;;;;;;;AASA,MAAM,SAAY,GAAA,gBAAA,CAAA;AAQX,MAAM,cAAc,CAAC;AAAA,EAC1B,SAAW,EAAA,aAAA;AAAA,EACX,WAAa,EAAA,eAAA;AAAA,EACb,IAAM,EAAA,QAAA;AAAA,EACN,QAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAwB,KAAA;AACtB,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,kBAAA;AAAA,IACR,GAAK,EAAAC,aAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,kBAAyB,CAAA;AAAA,IAC/C,UAAY,EAAA,QAAA;AAAA,IACZ,SAAS,eAAmB,IAAA,OAAA;AAAA,IAC5B,IAAM,EAAA,aAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,GACR,CAAA,CAAA;AAED,EAAA,MAAM,qBAAwB,GAAAC,iBAAA;AAAA,IAC5B,CAAC,GAA2C,KAAA;AAC1C,MAAM,MAAA,EAAE,KAAM,EAAA,GAAI,GAAI,CAAA,MAAA,CAAA;AACtB,MAAA,OAAA,CAAQ,KAAkB,CAAA,CAAA;AAC1B,MAAA,QAAA,CAAS,KAAkB,CAAA,CAAA;AAAA,KAC7B;AAAA,IACA,CAAC,UAAU,OAAO,CAAA;AAAA,GACpB,CAAA;AACA,EAAM,MAAA,SAAA,GAAY,EAAG,CAAA,SAAA,EAAW,aAAa,CAAA,CAAA;AAC7C,EACE,uBAAAC,eAAA;AAAA,IAACC,sBAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACC,GAAG,cAAA;AAAA,MACJ,QAAU,EAAA,qBAAA;AAAA,MACV,KAAO,EAAA,IAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAACC,qBAAa,YAAW,EAAA,OAAA,EAAQ,WAAU,EAAA,OAAA,EAAQ,OAAM,OAAQ,EAAA,CAAA;AAAA,uCAChEA,iBAAa,EAAA,EAAA,YAAA,EAAW,QAAO,WAAU,EAAA,MAAA,EAAO,OAAM,MAAO,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAChE,CAAA;AAEJ;;;;"}
@@ -0,0 +1,28 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext } from 'react';
3
+
4
+ const defaultConfig = {};
5
+ const ShellContext = createContext(defaultConfig);
6
+ const Provider = ({
7
+ children,
8
+ context,
9
+ inheritedContext
10
+ }) => {
11
+ const mergedContext = {
12
+ ...inheritedContext,
13
+ ...context
14
+ };
15
+ return /* @__PURE__ */ jsx(ShellContext.Provider, { value: mergedContext, children });
16
+ };
17
+ const ShellContextProvider = ({
18
+ children,
19
+ value
20
+ }) => {
21
+ return /* @__PURE__ */ jsx(ShellContext.Consumer, { children: (context) => /* @__PURE__ */ jsx(Provider, { context: value, inheritedContext: context, children }) });
22
+ };
23
+ const useShellContext = () => {
24
+ return useContext(ShellContext);
25
+ };
26
+
27
+ export { ShellContextProvider, useShellContext };
28
+ //# sourceMappingURL=ShellContextProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellContextProvider.js","sources":["../src/ShellContextProvider.tsx"],"sourcesContent":["import {\n DefaultColumnConfiguration,\n ListOption,\n} from \"@vuu-ui/vuu-table-types\";\nimport type { RpcResponseHandler } from \"@vuu-ui/vuu-data-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nexport type LookupTableProvider = (table: VuuTable) => ListOption[];\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: DefaultColumnConfiguration;\n getLookupValues?: LookupTableProvider;\n handleRpcResponse?: RpcResponseHandler;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\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\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n"],"names":[],"mappings":";;;AAgBA,MAAM,gBAAgB,EAAC,CAAA;AAEvB,MAAM,YAAA,GAAe,cAAiC,aAAa,CAAA,CAAA;AAOnE,MAAM,WAAW,CAAC;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AACF,CAIM,KAAA;AAEJ,EAAA,MAAM,aAAgB,GAAA;AAAA,IACpB,GAAG,gBAAA;AAAA,IACH,GAAG,OAAA;AAAA,GACL,CAAA;AACA,EAAA,2BACG,YAAa,CAAA,QAAA,EAAb,EAAsB,KAAA,EAAO,eAC3B,QACH,EAAA,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC,QAAA;AAAA,EACA,KAAA;AACF,CAAwC,KAAA;AACtC,EAAA,uBACG,GAAA,CAAA,YAAA,CAAa,QAAb,EAAA,EACE,QAAC,EAAA,CAAA,OAAA,qBACC,GAAA,CAAA,QAAA,EAAA,EAAS,OAAS,EAAA,KAAA,EAAO,gBAAkB,EAAA,OAAA,EACzC,UACH,CAEJ,EAAA,CAAA,CAAA;AAEJ,EAAA;AAEO,MAAM,kBAAkB,MAAM;AACnC,EAAA,OAAO,WAAW,YAAY,CAAA,CAAA;AAChC;;;;"}
@@ -0,0 +1,4 @@
1
+ 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-background: var(--vuuAppHeader-background, var(--vuu-color-gray-28));\n --vuuToolbar-borderWidth: 1px;\n --vuuToolbar-borderStyle: solid; \n --vuuToolbar-borderColor: var(--vuu-color-gray-30);\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\n";
2
+
3
+ export { appHeaderCss as default };
4
+ //# sourceMappingURL=AppHeader.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppHeader.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,64 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Toolbar } from '@vuu-ui/vuu-ui-controls';
3
+ import { Button } from '@salt-ds/core';
4
+ import { useComponentCssInjection } from '@salt-ds/styles';
5
+ import { useWindow } from '@salt-ds/window';
6
+ import cx from 'clsx';
7
+ import { useCallback } from 'react';
8
+ import { logout } from '../login/login-utils.js';
9
+ import appHeaderCss from './AppHeader.css.js';
10
+
11
+ const classBase = "vuuAppHeader";
12
+ const AppHeader = ({
13
+ className: classNameProp,
14
+ layoutId,
15
+ loginUrl,
16
+ onNavigate,
17
+ onSwitchTheme,
18
+ themeMode: _,
19
+ user,
20
+ ...htmlAttributes
21
+ }) => {
22
+ const targetWindow = useWindow();
23
+ useComponentCssInjection({
24
+ testId: "vuu-app-header",
25
+ css: appHeaderCss,
26
+ window: targetWindow
27
+ });
28
+ const className = cx(classBase, classNameProp);
29
+ const handleLogout = useCallback(() => {
30
+ logout(loginUrl);
31
+ }, [loginUrl]);
32
+ return /* @__PURE__ */ jsxs(
33
+ Toolbar,
34
+ {
35
+ alignItems: "end",
36
+ className,
37
+ showSeparators: true,
38
+ ...htmlAttributes,
39
+ children: [
40
+ /* @__PURE__ */ jsx(Button, { className: `${classBase}-menuItem`, variant: "secondary", children: "Help" }),
41
+ /* @__PURE__ */ jsxs(Button, { className: `${classBase}-menuItem`, variant: "secondary", children: [
42
+ "History ",
43
+ /* @__PURE__ */ jsx("span", { "data-icon": "history" })
44
+ ] }),
45
+ /* @__PURE__ */ jsxs(Button, { className: `${classBase}-menuItem`, variant: "secondary", children: [
46
+ "View ",
47
+ /* @__PURE__ */ jsx("span", { "data-icon": "settings" })
48
+ ] }),
49
+ /* @__PURE__ */ jsx(
50
+ Button,
51
+ {
52
+ className: `${classBase}-menuItem`,
53
+ onClick: handleLogout,
54
+ variant: "secondary",
55
+ children: "Log out"
56
+ }
57
+ )
58
+ ]
59
+ }
60
+ );
61
+ };
62
+
63
+ export { AppHeader };
64
+ //# sourceMappingURL=AppHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppHeader.js","sources":["../../src/app-header/AppHeader.tsx"],"sourcesContent":["import { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport { logout } from \"../login\";\nimport { VuuUser } from \"../shell\";\n\nimport appHeaderCss from \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode: _,\n user,\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 className = cx(classBase, classNameProp);\n // const handleSwitchTheme = useCallback(\n // (mode: ThemeMode) => onSwitchTheme?.(mode),\n // [onSwitchTheme]\n // );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n return (\n <Toolbar\n alignItems=\"end\"\n className={className}\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 className={`${classBase}-menuItem`} variant=\"secondary\">\n View <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 {/* <ThemeSwitch\n data-align=\"right\"\n defaultMode={themeMode}\n onChange={handleSwitchTheme}\n /> */}\n {/* <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n /> */}\n </Toolbar>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,SAAY,GAAA,cAAA,CAAA;AAUX,MAAM,YAAY,CAAC;AAAA,EACxB,SAAW,EAAA,aAAA;AAAA,EACX,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAW,EAAA,CAAA;AAAA,EACX,IAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,YAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,SAAA,GAAY,EAAG,CAAA,SAAA,EAAW,aAAa,CAAA,CAAA;AAM7C,EAAM,MAAA,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,GACjB,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EACE,uBAAA,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,UAAW,EAAA,KAAA;AAAA,MACX,SAAA;AAAA,MACA,cAAc,EAAA,IAAA;AAAA,MACb,GAAG,cAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAO,SAAW,EAAA,CAAA,EAAG,SAAS,CAAa,SAAA,CAAA,EAAA,OAAA,EAAQ,aAAY,QAEhE,EAAA,MAAA,EAAA,CAAA;AAAA,6BACC,MAAO,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA,EAAa,SAAQ,WAAY,EAAA,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,0BACtD,GAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,SAAU,EAAA,CAAA;AAAA,SACpC,EAAA,CAAA;AAAA,6BACC,MAAO,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA,EAAa,SAAQ,WAAY,EAAA,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,0BACzD,GAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,UAAW,EAAA,CAAA;AAAA,SAClC,EAAA,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;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,SAAA;AAAA,WAAA;AAAA,SAED;AAAA,OAAA;AAAA,KAAA;AAAA,GAYF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,4 @@
1
+ var connectionStatusIndicatorCss = ".vuuStatus-container {\n\tdisplay: flex;\n}\n\n.vuuStatus-text {\n\talign-self: center;\n}\n\n\n.vuuStatus {\n\t--vuu-icon-height: 18px;\n\t--vuu-icon-padding: var(--vuuStatus-padding, 6px);\n\t--vuu-icon-width: var(--vuuStatus-width, auto);\n\t--vuu-icon-min-width: var(--vuuStatus-min-width, 20px);\n\talign-items: center;\n\tdisplay: inline-flex;\n\theight: var(--vuu-icon-height);\n\tjustify-content: center;\n\tmin-width: var(--vuu-icon-min-width);\n\tpadding: 0 var(--vuu-icon-padding);\n\twidth: var(--vuu-icon-width);\n\tposition: relative;\n}\n\n.vuuStatus[data-icon]::after {\n\tinset: 0 0 0 0;\n\tcontent: '';\n\tbox-shadow: 0 0 0 0 black;\n\tposition: absolute;\n\tmask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n\t-webkit-mask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n}\n\n.vuuActiveStatus::after {\n\t--vuu-icon-svg: var(--svg-active-status);\n\tbackground-color: rgb(0, 255, 0);\n}\n\n.vuuConnectingStatus::after {\n\t--vuu-icon-svg: var(--svg-connecting-status);\n\tbackground-color: orange;\n\ttransform: scale(1);\n\tanimation: infinite pulse 1s;\n}\n\n.vuuDisconnectedStatus::after {\n\t--vuu-icon-svg: var(--svg-disconnected-status);\n\tbackground-color: red;\n\ttransform: scale(1);\n\tanimation: infinite pulse 0.5s;\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);\n\t}\n\n\t70% {\n\t\ttransform: scale(1);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n\n\t100% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n}";
2
+
3
+ export { connectionStatusIndicatorCss as default };
4
+ //# sourceMappingURL=ConnectionStatusIndicator.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionStatusIndicator.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,49 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import React, { useState, useEffect } from 'react';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import cx from 'clsx';
6
+ import connectionStatusIndicatorCss from './ConnectionStatusIndicator.css.js';
7
+
8
+ const ConnectionStatusIndicator = ({
9
+ connectionStatus,
10
+ className,
11
+ element = "span",
12
+ ...props
13
+ }) => {
14
+ const targetWindow = useWindow();
15
+ useComponentCssInjection({
16
+ testId: "vuu-connection-status-indicator",
17
+ css: connectionStatusIndicatorCss,
18
+ window: targetWindow
19
+ });
20
+ const [classBase, setClassBase] = useState("vuuConnectingStatus");
21
+ useEffect(() => {
22
+ switch (connectionStatus) {
23
+ case "connected":
24
+ case "reconnected":
25
+ setClassBase("vuuActiveStatus");
26
+ break;
27
+ case "connecting":
28
+ setClassBase("vuuConnectingStatus");
29
+ break;
30
+ case "disconnected":
31
+ setClassBase("vuuDisconnectedStatus");
32
+ break;
33
+ }
34
+ }, [connectionStatus]);
35
+ const statusIcon = React.createElement(element, {
36
+ ...props,
37
+ className: cx("vuuStatus vuuIcon", classBase, className)
38
+ });
39
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("div", { className: "vuuStatus-container salt-theme", children: [
40
+ statusIcon,
41
+ /* @__PURE__ */ jsxs("div", { className: "vuuStatus-text", children: [
42
+ "Status: ",
43
+ connectionStatus.toUpperCase()
44
+ ] })
45
+ ] }) });
46
+ };
47
+
48
+ export { ConnectionStatusIndicator };
49
+ //# sourceMappingURL=ConnectionStatusIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionStatusIndicator.js","sources":["../../src/connection-status/ConnectionStatusIndicator.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport cx from \"clsx\";\n\nimport connectionStatusIndicatorCss from \"./ConnectionStatusIndicator.css\";\n\ntype connectionStatus =\n | \"connected\"\n | \"reconnected\"\n | \"connecting\"\n | \"disconnected\";\n\ninterface ConnectionStatusProps {\n connectionStatus: connectionStatus;\n className?: string;\n props?: unknown;\n element?: string;\n}\n\nexport const ConnectionStatusIndicator = ({\n connectionStatus,\n className,\n element = \"span\",\n ...props\n}: ConnectionStatusProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-connection-status-indicator\",\n css: connectionStatusIndicatorCss,\n window: targetWindow,\n });\n\n const [classBase, setClassBase] = useState<string>(\"vuuConnectingStatus\");\n useEffect(() => {\n switch (connectionStatus) {\n case \"connected\":\n case \"reconnected\":\n setClassBase(\"vuuActiveStatus\");\n break;\n case \"connecting\":\n setClassBase(\"vuuConnectingStatus\");\n break;\n case \"disconnected\":\n setClassBase(\"vuuDisconnectedStatus\");\n break;\n default:\n break;\n }\n }, [connectionStatus]);\n\n const statusIcon = React.createElement(element, {\n ...props,\n className: cx(\"vuuStatus vuuIcon\", classBase, className),\n });\n\n return (\n <>\n <div className=\"vuuStatus-container salt-theme\">\n {statusIcon}\n <div className=\"vuuStatus-text\">\n Status: {connectionStatus.toUpperCase()}\n </div>\n </div>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAqBO,MAAM,4BAA4B,CAAC;AAAA,EACxC,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAU,GAAA,MAAA;AAAA,EACV,GAAG,KAAA;AACL,CAA6B,KAAA;AAC3B,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,iCAAA;AAAA,IACR,GAAK,EAAA,4BAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAiB,qBAAqB,CAAA,CAAA;AACxE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAQ,gBAAkB;AAAA,MACxB,KAAK,WAAA,CAAA;AAAA,MACL,KAAK,aAAA;AACH,QAAA,YAAA,CAAa,iBAAiB,CAAA,CAAA;AAC9B,QAAA,MAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,YAAA,CAAa,qBAAqB,CAAA,CAAA;AAClC,QAAA,MAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,YAAA,CAAa,uBAAuB,CAAA,CAAA;AACpC,QAAA,MAAA;AAEA,KACJ;AAAA,GACF,EAAG,CAAC,gBAAgB,CAAC,CAAA,CAAA;AAErB,EAAM,MAAA,UAAA,GAAa,KAAM,CAAA,aAAA,CAAc,OAAS,EAAA;AAAA,IAC9C,GAAG,KAAA;AAAA,IACH,SAAW,EAAA,EAAA,CAAG,mBAAqB,EAAA,SAAA,EAAW,SAAS,CAAA;AAAA,GACxD,CAAA,CAAA;AAED,EAAA,uBAEI,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,kBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,gCACZ,EAAA,QAAA,EAAA;AAAA,IAAA,UAAA;AAAA,oBACD,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,gBAAiB,EAAA,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MACrB,iBAAiB,WAAY,EAAA;AAAA,KACxC,EAAA,CAAA;AAAA,GAAA,EACF,CACF,EAAA,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,54 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { registerComponent } from '@vuu-ui/vuu-layout';
3
+ import { importCSS } from '@vuu-ui/vuu-utils';
4
+ import React, { Suspense, useEffect } from 'react';
5
+ import { FeatureErrorBoundary } from './FeatureErrorBoundary.js';
6
+ import { Loader } from './Loader.js';
7
+
8
+ const componentsMap = /* @__PURE__ */ new Map();
9
+ const useCachedFeature = (url) => {
10
+ useEffect(
11
+ () => () => {
12
+ componentsMap.delete(url);
13
+ },
14
+ [url]
15
+ );
16
+ if (!componentsMap.has(url)) {
17
+ componentsMap.set(
18
+ url,
19
+ React.lazy(() => import(
20
+ /* @vite-ignore */
21
+ url
22
+ ))
23
+ );
24
+ }
25
+ const lazyFeature = componentsMap.get(url);
26
+ if (!lazyFeature) {
27
+ throw Error(`Unable to load Lazy Feature at url ${url}`);
28
+ } else {
29
+ return lazyFeature;
30
+ }
31
+ };
32
+ function RawFeature({
33
+ url,
34
+ css,
35
+ ComponentProps: params,
36
+ ...props
37
+ }) {
38
+ if (css) {
39
+ importCSS(css).then((styleSheet) => {
40
+ document.adoptedStyleSheets = [
41
+ ...document.adoptedStyleSheets,
42
+ styleSheet
43
+ ];
44
+ });
45
+ }
46
+ const LazyFeature = useCachedFeature(url);
47
+ return /* @__PURE__ */ jsx(FeatureErrorBoundary, { url, children: /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Loader, {}), children: /* @__PURE__ */ jsx(LazyFeature, { ...props, ...params }) }) });
48
+ }
49
+ const Feature = React.memo(RawFeature);
50
+ Feature.displayName = "Feature";
51
+ registerComponent("Feature", Feature, "view");
52
+
53
+ export { Feature };
54
+ //# sourceMappingURL=Feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Feature.js","sources":["../../src/feature/Feature.tsx"],"sourcesContent":["import { registerComponent, ViewProps } from \"@vuu-ui/vuu-layout\";\nimport { importCSS } from \"@vuu-ui/vuu-utils\";\nimport React, { Suspense, useEffect } from \"react\";\nimport { FeatureErrorBoundary } from \"./FeatureErrorBoundary\";\nimport { Loader } from \"./Loader\";\n\n/**\n * Ensure we never lazy load the same component more than once\n */\nconst componentsMap = new Map<string, ReturnType<typeof React.lazy>>();\nconst useCachedFeature = (url: string) => {\n useEffect(\n () => () => {\n componentsMap.delete(url);\n },\n [url]\n );\n\n if (!componentsMap.has(url)) {\n componentsMap.set(\n url,\n React.lazy(() => import(/* @vite-ignore */ url))\n );\n }\n\n const lazyFeature = componentsMap.get(url);\n\n if (!lazyFeature) {\n throw Error(`Unable to load Lazy Feature at url ${url}`);\n } else {\n return lazyFeature;\n }\n};\n\nexport interface FeatureProps<P extends object | undefined = any> {\n /**\n props that will be passed to the lazily loaded component.\n */\n ComponentProps?: P;\n ViewProps?: Partial<Pick<ViewProps, \"closeable\" | \"header\">>;\n css?: string;\n height?: number;\n title?: string;\n /** \n The url of javascript bundle to lazily load. Bundle must provide a default export\n and that export must be a React component.\n */\n url: string;\n width?: number;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n ComponentProps: params,\n ...props\n}: FeatureProps<Params>) {\n // useEffect(() => {\n // console.log(\"%cFeature mount\", \"color: green;\");\n // return () => {\n // console.log(\"%cFeature unmount\", \"color:red;\");\n // };\n // }, []);\n\n if (css) {\n // import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n // (cssModule) => {\n // console.log(\"%cInject Styles\", \"color: blue;font-weight: bold\");\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // cssModule.default,\n // ];\n // }\n // );\n // Polyfill until cypress build supports import assertions\n // Note: already fully supported in esbuild and vite\n importCSS(css).then((styleSheet) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n styleSheet,\n ];\n });\n }\n\n const LazyFeature = useCachedFeature(url);\n return (\n <FeatureErrorBoundary url={url}>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </FeatureErrorBoundary>\n );\n}\n\n/**\n Feature is a wrapper around React Lazy Loading. It will load a component\n from the given url. That url must resolve to a javascript bundle with a\n single default export. That export must be a React component.\n */\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n"],"names":[],"mappings":";;;;;;;AASA,MAAM,aAAA,uBAAoB,GAA2C,EAAA,CAAA;AACrE,MAAM,gBAAA,GAAmB,CAAC,GAAgB,KAAA;AACxC,EAAA,SAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,aAAA,CAAc,OAAO,GAAG,CAAA,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,GAAG,CAAA;AAAA,GACN,CAAA;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,GAAI,CAAA,GAAG,CAAG,EAAA;AAC3B,IAAc,aAAA,CAAA,GAAA;AAAA,MACZ,GAAA;AAAA,MACA,KAAA,CAAM,KAAK,MAAM;AAAA;AAAA,QAA0B,GAAA;AAAA,OAAI,CAAA;AAAA,KACjD,CAAA;AAAA,GACF;AAEA,EAAM,MAAA,WAAA,GAAc,aAAc,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAEzC,EAAA,IAAI,CAAC,WAAa,EAAA;AAChB,IAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAE,CAAA,CAAA,CAAA;AAAA,GAClD,MAAA;AACL,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAmBA,SAAS,UAA8C,CAAA;AAAA,EACrD,GAAA;AAAA,EACA,GAAA;AAAA,EACA,cAAgB,EAAA,MAAA;AAAA,EAChB,GAAG,KAAA;AACL,CAAyB,EAAA;AAQvB,EAAA,IAAI,GAAK,EAAA;AAYP,IAAA,SAAA,CAAU,GAAG,CAAA,CAAE,IAAK,CAAA,CAAC,UAAe,KAAA;AAClC,MAAA,QAAA,CAAS,kBAAqB,GAAA;AAAA,QAC5B,GAAG,QAAS,CAAA,kBAAA;AAAA,QACZ,UAAA;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,WAAA,GAAc,iBAAiB,GAAG,CAAA,CAAA;AACxC,EAAA,2BACG,oBAAqB,EAAA,EAAA,GAAA,EACpB,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,0BAAW,GAAA,CAAA,MAAA,EAAA,EAAO,CAC1B,EAAA,QAAA,kBAAA,GAAA,CAAC,eAAa,GAAG,KAAA,EAAQ,GAAG,MAAA,EAAQ,GACtC,CACF,EAAA,CAAA,CAAA;AAEJ,CAAA;AAOa,MAAA,OAAA,GAAU,KAAM,CAAA,IAAA,CAAK,UAAU,EAAA;AAC5C,OAAA,CAAQ,WAAc,GAAA,SAAA,CAAA;AACtB,iBAAkB,CAAA,SAAA,EAAW,SAAS,MAAM,CAAA;;;;"}
@@ -0,0 +1,28 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+
4
+ class FeatureErrorBoundary extends React.Component {
5
+ constructor(props) {
6
+ super(props);
7
+ this.state = { errorMessage: null };
8
+ }
9
+ static getDerivedStateFromError(error) {
10
+ return { errorMessage: error.message };
11
+ }
12
+ componentDidCatch(error, errorInfo) {
13
+ console.log(`error creating component at ${this.props.url}`);
14
+ console.log(error, errorInfo);
15
+ }
16
+ render() {
17
+ if (this.state.errorMessage) {
18
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
19
+ /* @__PURE__ */ jsx("h1", { children: "An error occured while creating component." }),
20
+ /* @__PURE__ */ jsx("p", { children: this.state.errorMessage })
21
+ ] });
22
+ }
23
+ return this.props.children;
24
+ }
25
+ }
26
+
27
+ export { FeatureErrorBoundary };
28
+ //# sourceMappingURL=FeatureErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeatureErrorBoundary.js","sources":["../../src/feature/FeatureErrorBoundary.tsx"],"sourcesContent":["import React, { ErrorInfo, ReactNode } from \"react\";\nimport { FeatureProps } from \"./Feature\";\n\nexport interface FeatureErrorBoundaryProps extends FeatureProps {\n children: ReactNode;\n}\n\nexport class FeatureErrorBoundary extends React.Component<\n FeatureErrorBoundaryProps,\n any\n> {\n constructor(props: FeatureErrorBoundaryProps) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // You can also log the error to an error reporting service\n console.log(`error creating component at ${this.props.url}`);\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>An error occured while creating component.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n"],"names":[],"mappings":";;;AAOa,MAAA,oBAAA,SAA6B,MAAM,SAG9C,CAAA;AAAA,EACA,YAAY,KAAkC,EAAA;AAC5C,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACX,IAAK,IAAA,CAAA,KAAA,GAAQ,EAAE,YAAA,EAAc,IAAK,EAAA,CAAA;AAAA,GACpC;AAAA,EAEA,OAAO,yBAAyB,KAAc,EAAA;AAE5C,IAAO,OAAA,EAAE,YAAc,EAAA,KAAA,CAAM,OAAQ,EAAA,CAAA;AAAA,GACvC;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAAsB,EAAA;AAEpD,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,4BAAA,EAA+B,IAAK,CAAA,KAAA,CAAM,GAAG,CAAE,CAAA,CAAA,CAAA;AAC3D,IAAQ,OAAA,CAAA,GAAA,CAAI,OAAO,SAAS,CAAA,CAAA;AAAA,GAC9B;AAAA,EAEA,MAAS,GAAA;AACP,IAAI,IAAA,IAAA,CAAK,MAAM,YAAc,EAAA;AAC3B,MAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAG,QAA0C,EAAA,4CAAA,EAAA,CAAA;AAAA,wBAC7C,GAAA,CAAA,GAAA,EAAA,EAAG,QAAK,EAAA,IAAA,CAAA,KAAA,CAAM,YAAa,EAAA,CAAA;AAAA,OAC9B,EAAA,CAAA,CAAA;AAAA,KAEJ;AAEA,IAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAAA,GACpB;AACF;;;;"}
@@ -0,0 +1,6 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Loader = () => /* @__PURE__ */ jsx("div", { className: "hwLoader" });
4
+
5
+ export { Loader };
6
+ //# sourceMappingURL=Loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Loader.js","sources":["../../src/feature/Loader.tsx"],"sourcesContent":["// TODO\nexport const Loader = () => <div className=\"hwLoader\"></div>;\n"],"names":[],"mappings":";;AACO,MAAM,MAAS,GAAA,sBAAO,GAAA,CAAA,KAAA,EAAA,EAAI,WAAU,UAAW,EAAA;;;;"}
@@ -0,0 +1,4 @@
1
+ var featureListCss = ".vuuFeatureList {\n background: var(--vuuFeatureList-background, var(--salt-container-primary-background));\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 195px 32px 16px 24px;\n}\n\n.vuuFeatureList-header {\n flex: 0 0 40px;\n font-size: 12px;\n font-weight: 700;\n line-height: 2;\n}\n\n.vuuFeatureList-content {\n flex: 1 1 auto;\n font-size: 12px;\n font-weight: 700;\n}\n\n";
2
+
3
+ export { featureListCss as default };
4
+ //# sourceMappingURL=FeatureList.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeatureList.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,50 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Palette, PaletteItem } from '@vuu-ui/vuu-layout';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { Feature } from '../feature/Feature.js';
6
+ import featureListCss from './FeatureList.css.js';
7
+
8
+ const classBase = "vuuFeatureList";
9
+ const FeatureList = ({
10
+ features,
11
+ title = "VUU TABLES",
12
+ ...htmlAttributes
13
+ }) => {
14
+ const targetWindow = useWindow();
15
+ useComponentCssInjection({
16
+ testId: "vuu-feature-list",
17
+ css: featureListCss,
18
+ window: targetWindow
19
+ });
20
+ const ViewProps = {};
21
+ const listProps = {
22
+ height: "100%"
23
+ };
24
+ return /* @__PURE__ */ jsxs("div", { ...htmlAttributes, className: classBase, children: [
25
+ /* @__PURE__ */ jsx("div", { className: `${classBase}-header`, children: title }),
26
+ /* @__PURE__ */ jsx("div", { className: `${classBase}-content`, children: /* @__PURE__ */ jsx(
27
+ Palette,
28
+ {
29
+ orientation: "vertical",
30
+ ListProps: listProps,
31
+ ViewProps,
32
+ children: features.map((featureProps, i) => /* @__PURE__ */ jsx(
33
+ PaletteItem,
34
+ {
35
+ closeable: true,
36
+ label: featureProps.title,
37
+ resizeable: true,
38
+ resize: "defer",
39
+ header: true,
40
+ children: /* @__PURE__ */ jsx(Feature, { ...featureProps })
41
+ },
42
+ i
43
+ ))
44
+ }
45
+ ) })
46
+ ] });
47
+ };
48
+
49
+ export { FeatureList };
50
+ //# sourceMappingURL=FeatureList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeatureList.js","sources":["../../src/feature-list/FeatureList.tsx"],"sourcesContent":["import { Palette, PaletteItem } from \"@vuu-ui/vuu-layout\";\nimport { ListProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { HTMLAttributes } from \"react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport { Feature, FeatureProps } from \"../feature/Feature\";\n\nimport featureListCss from \"./FeatureList.css\";\n\nconst classBase = \"vuuFeatureList\";\n\nexport interface FeatureListProps extends HTMLAttributes<HTMLDivElement> {\n features: FeatureProps[];\n}\n\nexport const FeatureList = ({\n features,\n title = \"VUU TABLES\",\n ...htmlAttributes\n}: FeatureListProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-feature-list\",\n css: featureListCss,\n window: targetWindow,\n });\n\n const ViewProps = {};\n\n const listProps: Partial<ListProps> = {\n height: \"100%\",\n };\n\n return (\n <div {...htmlAttributes} className={classBase}>\n <div className={`${classBase}-header`}>{title}</div>\n <div className={`${classBase}-content`}>\n <Palette\n orientation=\"vertical\"\n ListProps={listProps}\n ViewProps={ViewProps}\n >\n {features.map((featureProps, i) => (\n <PaletteItem\n closeable\n key={i}\n label={featureProps.title}\n resizeable\n resize=\"defer\"\n header\n >\n <Feature {...featureProps} />\n </PaletteItem>\n ))}\n </Palette>\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAUA,MAAM,SAAY,GAAA,gBAAA,CAAA;AAMX,MAAM,cAAc,CAAC;AAAA,EAC1B,QAAA;AAAA,EACA,KAAQ,GAAA,YAAA;AAAA,EACR,GAAG,cAAA;AACL,CAAwB,KAAA;AACtB,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,kBAAA;AAAA,IACR,GAAK,EAAA,cAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,YAAY,EAAC,CAAA;AAEnB,EAAA,MAAM,SAAgC,GAAA;AAAA,IACpC,MAAQ,EAAA,MAAA;AAAA,GACV,CAAA;AAEA,EAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,WAAW,SAClC,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,WAAY,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,oBAC7C,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,QAAA,CAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,WAAY,EAAA,UAAA;AAAA,QACZ,SAAW,EAAA,SAAA;AAAA,QACX,SAAA;AAAA,QAEC,QAAS,EAAA,QAAA,CAAA,GAAA,CAAI,CAAC,YAAA,EAAc,CAC3B,qBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,SAAS,EAAA,IAAA;AAAA,YAET,OAAO,YAAa,CAAA,KAAA;AAAA,YACpB,UAAU,EAAA,IAAA;AAAA,YACV,MAAO,EAAA,OAAA;AAAA,YACP,MAAM,EAAA,IAAA;AAAA,YAEN,QAAA,kBAAA,GAAA,CAAC,OAAS,EAAA,EAAA,GAAG,YAAc,EAAA,CAAA;AAAA,WAAA;AAAA,UANtB,CAAA;AAAA,SAQR,CAAA;AAAA,OAAA;AAAA,KAEL,EAAA,CAAA;AAAA,GACF,EAAA,CAAA,CAAA;AAEJ;;;;"}