diff --git a/apps/i15-1/package.json b/apps/i15-1/package.json index d4ab43a0..4bc672b9 100644 --- a/apps/i15-1/package.json +++ b/apps/i15-1/package.json @@ -15,7 +15,7 @@ "@atlas/blueapi-query": "workspace:*", "@atlas/pvws-config": "workspace:*", "@diamondlightsource/cs-web-lib": "0.9.5", - "@diamondlightsource/sci-react-ui": "^0.4.0", + "@diamondlightsource/sci-react-ui": "file:../../diamondlightsource-sci-react-ui-0.4.1.tgz", "@mui/icons-material": "^6.5.0", "@mui/material": "<7.0.0", "@tanstack/react-query": "^5.90.21", diff --git a/apps/i15-1/src/main.tsx b/apps/i15-1/src/main.tsx index ee99aca5..a03b6385 100644 --- a/apps/i15-1/src/main.tsx +++ b/apps/i15-1/src/main.tsx @@ -1,4 +1,4 @@ -import { DiamondTheme } from "@diamondlightsource/sci-react-ui"; +import { DiamondDSTheme } from "@diamondlightsource/sci-react-ui"; import { RouterProvider } from "react-router-dom"; import { createRoot } from "react-dom/client"; import { StrictMode } from "react"; @@ -20,7 +20,7 @@ const api = createApi("/api"); enableMocking().then(() => { createRoot(document.getElementById("root")!).render( - + , diff --git a/diamondlightsource-sci-react-ui-0.4.1.tgz b/diamondlightsource-sci-react-ui-0.4.1.tgz new file mode 100644 index 00000000..409ee7e7 Binary files /dev/null and b/diamondlightsource-sci-react-ui-0.4.1.tgz differ diff --git a/packages/app-shell/src/Layout.tsx b/packages/app-shell/src/Layout.tsx index 3027a35c..0e8d1a00 100644 --- a/packages/app-shell/src/Layout.tsx +++ b/packages/app-shell/src/Layout.tsx @@ -1,18 +1,34 @@ +import { Toolbar } from "@mui/material"; import Box from "@mui/material/Box"; -import { Outlet } from "react-router-dom"; -import { SideNav } from "./SideNav"; +import { NavLink, Outlet } from "react-router-dom"; +import { routePath, type RouterProps } from "./Router"; +import { SidebarNav, type Navigation } from "./SidebarNav"; import { TopBar } from "./TopBar"; -import type { RouterProps } from "./Router"; import { usePersistentDrawerState } from "./usePersistentDrawerState"; -import { Toolbar } from "@mui/material"; + +export function toNavItemGroups(routerProps: RouterProps): Navigation { + return routerProps.navigation.map((group) => ({ + name: group.name, + navItems: group.sections.map((section) => ({ + label: section.name, + icon: section.icon, + linkProps: { + to: routePath(section), + component: NavLink, + }, + })), + })); +} export function Layout(props: RouterProps) { const { open, setOpen } = usePersistentDrawerState(); + const navigation = toNavItemGroups(props); + return ( - + {/* The Toolbar acts as a spacer, same size as the toolbar used inside the TopBar's AppBar*/} diff --git a/packages/app-shell/src/Router.tsx b/packages/app-shell/src/Router.tsx index 1d70011f..19d8ae08 100644 --- a/packages/app-shell/src/Router.tsx +++ b/packages/app-shell/src/Router.tsx @@ -55,7 +55,7 @@ export function sanitisePath(name: string) { return name.toLowerCase().replace(/\s/g, "_"); } -function routePath(route: LabelledRoute) { +export function routePath(route: LabelledRoute) { return route.path ?? sanitisePath(route.name); } diff --git a/packages/app-shell/src/SideNav.tsx b/packages/app-shell/src/SideNav.tsx deleted file mode 100644 index b6b1f78f..00000000 --- a/packages/app-shell/src/SideNav.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { - Box, - Divider, - Drawer, - List, - ListItem, - ListItemButton, - ListItemIcon, - ListItemText, - Toolbar, - Tooltip, -} from "@mui/material"; -import { NavLink } from "react-router-dom"; -import type { Section, SectionGroup } from "./Router"; -import type React from "react"; -import { Fragment } from "react"; - -interface SideNavProps { - navigation: SectionGroup[]; - open: boolean; -} - -export function SideNav({ navigation, open }: SideNavProps) { - const width = open ? 256 : 72; - - return ( - - {/* spacer equal to the AppBar's height*/} - - - {navigation.map((group, groupIndex) => ( - - {groupIndex > 0 && } - {group.sections.map((route) => ( - - ))} - - ))} - - - - ); -} - -interface EntryProps { - route: Section; - open: boolean; -} - -function Entry(props: EntryProps) { - const route = props.route; - const icon = ( - - {route.icon} - - ); - return ( - - - {props.open ? ( - icon - ) : ( - - {icon} - - )} - - - - ); -} diff --git a/packages/app-shell/src/SideNav.test.tsx b/packages/app-shell/src/SidebarNav.test.tsx similarity index 78% rename from packages/app-shell/src/SideNav.test.tsx rename to packages/app-shell/src/SidebarNav.test.tsx index 46397276..087ea3d1 100644 --- a/packages/app-shell/src/SideNav.test.tsx +++ b/packages/app-shell/src/SidebarNav.test.tsx @@ -1,9 +1,9 @@ import { render, screen, userEvent } from "@atlas/vitest-conf"; -import { SideNav } from "./SideNav"; -import type { Section, SectionGroup } from "./Router"; +import { SidebarNav } from "./SidebarNav"; +import type { SectionGroup } from "./Router"; import { createMemoryRouter, RouterProvider } from "react-router-dom"; -describe("SideNav", () => { +describe("SidebarNav", () => { const groups: SectionGroup[] = [ { sections: [ @@ -24,13 +24,22 @@ describe("SideNav", () => { }, ], }, + { + sections: [ + { + name: "Log", + icon:
, + pages: [], + }, + ], + }, ]; function renderSidenav(open: boolean) { const router = createMemoryRouter([ { path: "/", - element: , + element: , }, ]); render(); @@ -47,7 +56,7 @@ describe("SideNav", () => { const label = screen.getByText(route.name); expect(label).toBeVisible(); }); - ["navicon1", "navicon2", "navicon3"].forEach((id) => + ["navicon1", "navicon2", "navicon3", "navicon4"].forEach((id) => expect(screen.getByTestId(id)).toBeVisible(), ); }); @@ -62,7 +71,7 @@ describe("SideNav", () => { expect(label).toBeInTheDocument(); // label exists but expect(label).not.toBeVisible(); // not visible }); - ["navicon1", "navicon2", "navicon3"].forEach((id) => + ["navicon1", "navicon2", "navicon3", "navicon4"].forEach((id) => expect(screen.getByTestId(id)).toBeVisible(), ); }); @@ -91,4 +100,10 @@ describe("SideNav", () => { }); expect(tooltip).not.toBeInTheDocument(); }); + + it("creates divider between nav sections", () => { + renderSidenav(true); + const divider = screen.queryByRole("separator"); + expect(divider).toBeInTheDocument(); + }); }); diff --git a/packages/app-shell/src/SidebarNav.tsx b/packages/app-shell/src/SidebarNav.tsx new file mode 100644 index 00000000..8187c6a2 --- /dev/null +++ b/packages/app-shell/src/SidebarNav.tsx @@ -0,0 +1,171 @@ +import { + Box, + Divider, + Drawer, + List, + ListItem, + ListItemButton, + ListItemIcon, + ListItemText, + Toolbar, + Tooltip, + type Theme, +} from "@mui/material"; +import { Fragment, type ElementType, type ReactNode } from "react"; + +export type Navigation = NavItemGroup[]; + +type NavItemGroup = { + name?: string; + navItems: NavItemDefinition[]; +}; + +type NavItemDefinition = { + label: string; + icon: ReactNode; + linkProps: LinkProps; +}; + +type LinkProps = ExternalLinkProps | InternalLinkProps; + +/** For native anchor tags */ +type ExternalLinkProps = { + href: string; + component?: never; + to?: never; +}; + +/** For SPA navigation */ +type InternalLinkProps = { + component: ElementType; + to: string; + href?: never; +}; + +const drawerTransition = (theme: Theme, opening: boolean) => { + return theme.transitions.create("width", { + easing: opening + ? theme.transitions.easing.easeIn + : theme.transitions.easing.easeOut, + duration: opening + ? theme.transitions.duration.enteringScreen + : theme.transitions.duration.leavingScreen, + }); +}; + +type NavProps = { + navigation: Navigation; + open: boolean; +}; + +export function SidebarNav({ navigation, open }: NavProps) { + const width = open ? 257 : 65; // 256/64 + 1 pixel for the border + return ( + ({ + width: width, + flexShrink: 0, + transition: (theme) => drawerTransition(theme, open), + [`& .MuiDrawer-paper`]: { + width: width, + boxSizing: "border-box", + transition: drawerTransition(theme, open), + }, + })} + > + {/* spacer equal to the AppBar's height*/} + + + {navigation.map((group, groupIndex) => ( + + {groupIndex > 0 && } + {group.navItems.map((item, itemIndex) => { + return ( + + ); + })} + + ))} + + + + ); +} + +function SectionDivider() { + return ( + + + + ); +} + +interface NavItemProps { + definition: NavItemDefinition; + open: boolean; +} + +function NavItem(props: NavItemProps) { + const item = props.definition; + const open = props.open; + const icon = ( + + {item.icon} + + ); + + return ( + + + {open ? ( + icon + ) : ( + + {icon} + + )} + + theme.transitions.create("opacity", { + duration: theme.transitions.duration.shorter, + }), + }} + /> + + + ); +} diff --git a/packages/app-shell/src/TopBar.tsx b/packages/app-shell/src/TopBar.tsx index 6d123971..93927ea9 100644 --- a/packages/app-shell/src/TopBar.tsx +++ b/packages/app-shell/src/TopBar.tsx @@ -20,22 +20,27 @@ export function TopBar({ title, open, setOpen }: Props) { return ( theme.zIndex.drawer + 1 }} + color="inherit" + sx={{ + zIndex: (theme: Theme) => theme.zIndex.drawer + 1, + borderBottom: "1px solid", + borderColor: "divider", + }} + elevation={0} > setOpen(!open)} > - + @@ -48,6 +53,7 @@ export function TopBar({ title, open, setOpen }: Props) { ml: 1.5, mt: 1.25, mr: 1.25, + color: "brand.onContainer", }} > Data Acquisition @@ -62,6 +68,7 @@ export function TopBar({ title, open, setOpen }: Props) { sx={{ ml: 1.5, mt: 1.25, + color: "brand.onContainer", }} > {title} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f0c4756..076b4373 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,8 +67,8 @@ importers: specifier: 0.9.5 version: 0.9.5(@types/react@18.3.28)(graphql@16.13.1)(mapbox-gl@1.13.3)(react-dom@18.3.1(react@18.3.1))(react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-router-dom@7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.106.2) '@diamondlightsource/sci-react-ui': - specifier: ^0.4.0 - version: 0.4.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@jsonforms/core@3.6.0)(@jsonforms/material-renderers@3.6.0(a2958437c922d885fd4a4f8b5e701907))(@jsonforms/react@3.6.0(@jsonforms/core@3.6.0)(react@18.3.1))(@mui/icons-material@6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: file:../../diamondlightsource-sci-react-ui-0.4.1.tgz + version: file:diamondlightsource-sci-react-ui-0.4.1.tgz(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@jsonforms/core@3.6.0)(@jsonforms/material-renderers@3.6.0(a2958437c922d885fd4a4f8b5e701907))(@jsonforms/react@3.6.0(@jsonforms/core@3.6.0)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) '@mui/icons-material': specifier: ^6.5.0 version: 6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) @@ -324,7 +324,7 @@ importers: version: link:../vitest-conf '@diamondlightsource/sci-react-ui': specifier: ^0.4.1 - version: 0.4.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@jsonforms/core@3.6.0)(@jsonforms/material-renderers@3.6.0(a2958437c922d885fd4a4f8b5e701907))(@jsonforms/react@3.6.0(@jsonforms/core@3.6.0)(react@18.3.1))(@mui/icons-material@6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.4.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@jsonforms/core@3.6.0)(@jsonforms/material-renderers@3.6.0(77d78ecfc22988be2f298fed3e42b40a))(@jsonforms/react@3.6.0(@jsonforms/core@3.6.0)(react@18.3.1))(@mui/icons-material@7.3.11(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@mui/material': specifier: ^6.5.0 version: 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -576,6 +576,18 @@ packages: '@mui/material': ^6.1.7 react: ^18.3.1 + '@diamondlightsource/sci-react-ui@file:diamondlightsource-sci-react-ui-0.4.1.tgz': + resolution: {integrity: sha512-Xp/qmo/+eM5qyorT/mfkEeRdSrTub8c96B1qIq5GElBJJBPUMor7BBJlw/gInl3+G2gzslI8b960bYFRz1OlRg==, tarball: file:diamondlightsource-sci-react-ui-0.4.1.tgz} + version: 0.4.1 + peerDependencies: + '@emotion/react': ^11.13.3 + '@emotion/styled': ^11.13.0 + '@jsonforms/core': ^3.7.0 + '@jsonforms/material-renderers': ^3.7.0 + '@jsonforms/react': ^3.7.0 + '@mui/material': ^7.0.0 + react: ^18.3.1 + '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -845,6 +857,9 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@fontsource-variable/inter@5.2.8': + resolution: {integrity: sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==} + '@h5web/lib@13.0.0': resolution: {integrity: sha512-Y4yOH5QgJ9RmM4xyS74z2R0C0h3rJ2xx/dQrlabYJzbPDI/x4EdZC9FmDKG7RO1Rpol6gcqz13u0NHN+JMlEdg==} peerDependencies: @@ -1028,6 +1043,17 @@ packages: '@types/react': optional: true + '@mui/icons-material@7.3.11': + resolution: {integrity: sha512-+hz5ilwHZ3djd5es3sCErLioqe/NhZcYTsV/TNXZAMdJdb23F4xzJjqnnZdnurc3S1+ietcssRNqieOhPQLZ7Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@mui/material': ^7.3.11 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@mui/lab@6.0.0-beta.22': resolution: {integrity: sha512-9nwUfBj+UzoQJOCbqV+JcCSJ74T+gGWrM1FMlXzkahtYUcMN+5Zmh2ArlttW3zv2dZyCzp7K5askcnKF0WzFQg==} engines: {node: '>=14.0.0'} @@ -5037,20 +5063,38 @@ snapshots: react: 18.3.1 react-icons: 5.6.0(react@18.3.1) - '@diamondlightsource/sci-react-ui@0.4.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@jsonforms/core@3.6.0)(@jsonforms/material-renderers@3.6.0(a2958437c922d885fd4a4f8b5e701907))(@jsonforms/react@3.6.0(@jsonforms/core@3.6.0)(react@18.3.1))(@mui/icons-material@6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@diamondlightsource/sci-react-ui@0.4.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@jsonforms/core@3.6.0)(@jsonforms/material-renderers@3.6.0(77d78ecfc22988be2f298fed3e42b40a))(@jsonforms/react@3.6.0(@jsonforms/core@3.6.0)(react@18.3.1))(@mui/icons-material@7.3.11(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) '@jsonforms/core': 3.6.0 - '@jsonforms/material-renderers': 3.6.0(a2958437c922d885fd4a4f8b5e701907) + '@jsonforms/material-renderers': 3.6.0(77d78ecfc22988be2f298fed3e42b40a) '@jsonforms/react': 3.6.0(@jsonforms/core@3.6.0)(react@18.3.1) - '@mui/icons-material': 6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@mui/icons-material': 7.3.11(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) keycloak-js: 26.2.4 react: 18.3.1 react-icons: 5.6.0(react@18.3.1) utif: 3.1.0 + '@diamondlightsource/sci-react-ui@file:diamondlightsource-sci-react-ui-0.4.1.tgz(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@jsonforms/core@3.6.0)(@jsonforms/material-renderers@3.6.0(a2958437c922d885fd4a4f8b5e701907))(@jsonforms/react@3.6.0(@jsonforms/core@3.6.0)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@fontsource-variable/inter': 5.2.8 + '@jsonforms/core': 3.6.0 + '@jsonforms/material-renderers': 3.6.0(a2958437c922d885fd4a4f8b5e701907) + '@jsonforms/react': 3.6.0(@jsonforms/core@3.6.0)(react@18.3.1) + '@mui/icons-material': 7.3.11(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-icons: 5.6.0(react@18.3.1) + utif: 3.1.0 + optionalDependencies: + keycloak-js: 26.2.4 + transitivePeerDependencies: + - '@types/react' + '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.28.6 @@ -5283,6 +5327,8 @@ snapshots: '@floating-ui/utils@0.2.11': {} + '@fontsource-variable/inter@5.2.8': {} + '@h5web/lib@13.0.0(@react-three/fiber@8.18.0(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.164.1))(@types/react@18.3.28)(immer@11.1.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.164.1)(typescript@5.9.3)': dependencies: '@floating-ui/react': 0.26.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -5388,6 +5434,20 @@ snapshots: ajv-formats: 2.1.1(ajv@8.18.0) lodash: 4.17.23 + '@jsonforms/material-renderers@3.6.0(77d78ecfc22988be2f298fed3e42b40a)': + dependencies: + '@date-io/dayjs': 3.2.0(dayjs@1.10.7) + '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@jsonforms/core': 3.6.0 + '@jsonforms/react': 3.6.0(@jsonforms/core@3.6.0)(react@18.3.1) + '@mui/icons-material': 7.3.11(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/x-date-pickers': 7.29.4(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(dayjs@1.10.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + dayjs: 1.10.7 + lodash: 4.17.23 + react: 18.3.1 + '@jsonforms/material-renderers@3.6.0(a2958437c922d885fd4a4f8b5e701907)': dependencies: '@date-io/dayjs': 3.2.0(dayjs@1.10.7) @@ -5487,6 +5547,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.28 + '@mui/icons-material@7.3.11(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + '@mui/lab@6.0.0-beta.22(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.6