improve styles & adapt brand colors
							
								
								
									
										
											BIN
										
									
								
								public/devices/cznic_turris-omnia.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 95 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/devices/optimcloud_d50.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 17 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/devices/xunison_d50.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 17 KiB | 
| Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 586 KiB | 
| Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 586 KiB | 
| @@ -14,6 +14,7 @@ import { | |||||||
| import { useTranslation } from 'react-i18next'; | import { useTranslation } from 'react-i18next'; | ||||||
| import { ConfigurationFieldExplanation } from '../../ConfigurationFieldExplanation'; | import { ConfigurationFieldExplanation } from '../../ConfigurationFieldExplanation'; | ||||||
| import { FieldInputProps } from 'models/Form'; | import { FieldInputProps } from 'models/Form'; | ||||||
|  | import {Eye, EyeSlash } from 'iconsax-react'; | ||||||
|  |  | ||||||
| export interface StringInputProps extends FieldInputProps<string | undefined | string[]>, LayoutProps { | export interface StringInputProps extends FieldInputProps<string | undefined | string[]>, LayoutProps { | ||||||
|   isError: boolean; |   isError: boolean; | ||||||
| @@ -77,12 +78,13 @@ const _StringInput: React.FC<StringInputProps> = ({ | |||||||
|             value={value} |             value={value} | ||||||
|             onChange={onChange} |             onChange={onChange} | ||||||
|             onBlur={onBlur} |             onBlur={onBlur} | ||||||
|             borderRadius="15px" |             borderRadius="5px" | ||||||
|             fontSize="sm" |             fontSize="sm" | ||||||
|             type={hideButton && !show ? 'password' : 'text'} |             type={hideButton && !show ? 'password' : 'text'} | ||||||
|             autoComplete="off" |             autoComplete="off" | ||||||
|             border="2px solid" |             border="2px solid" | ||||||
|             _disabled={{ opacity: 0.8, cursor: 'not-allowed' }} |             _disabled={{ opacity: 0.8, cursor: 'not-allowed' }} | ||||||
|  |             boxShadow="-1px -1px 1px 0px #F0F0F3 inset, 1px 1px 1px 0px rgba(174, 174, 192, 0.25) inset" | ||||||
|           /> |           /> | ||||||
|           {hideButton && ( |           {hideButton && ( | ||||||
|             <InputRightElement width="4.5rem"> |             <InputRightElement width="4.5rem"> | ||||||
| @@ -91,8 +93,10 @@ const _StringInput: React.FC<StringInputProps> = ({ | |||||||
|                 size="sm" |                 size="sm" | ||||||
|                 onClick={setShow.toggle} |                 onClick={setShow.toggle} | ||||||
|                 _disabled={{ opacity: 0.8, cursor: 'not-allowed' }} |                 _disabled={{ opacity: 0.8, cursor: 'not-allowed' }} | ||||||
|  |                 border="none" | ||||||
|  |                 bg="transparent" | ||||||
|               > |               > | ||||||
|                 {show ? t('common.hide') : t('common.show')} |                 {show ? <EyeSlash/> : <Eye/>} | ||||||
|               </Button> |               </Button> | ||||||
|             </InputRightElement> |             </InputRightElement> | ||||||
|           )} |           )} | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ export const NavLinkButton = ({ isActive, route, toggleSidebar }: Props) => { | |||||||
|             }} |             }} | ||||||
|           > |           > | ||||||
|             <Flex alignItems="center" w="100%"> |             <Flex alignItems="center" w="100%"> | ||||||
|               <IconBox color="blue.300" h="30px" w="30px" me="6px" transition={variantChange} fontWeight="bold"> |               <IconBox color="#489BFF" h="30px" w="30px" me="6px" transition={variantChange} fontWeight="bold"> | ||||||
|                 {route.icon(false)} |                 {route.icon(false)} | ||||||
|               </IconBox> |               </IconBox> | ||||||
|               <Text color={activeTextColor} fontSize="md" fontWeight="bold"> |               <Text color={activeTextColor} fontSize="md" fontWeight="bold"> | ||||||
| @@ -66,7 +66,7 @@ export const NavLinkButton = ({ isActive, route, toggleSidebar }: Props) => { | |||||||
|             }} |             }} | ||||||
|           > |           > | ||||||
|             <Flex alignItems="center" w="100%"> |             <Flex alignItems="center" w="100%"> | ||||||
|               <IconBox color="blue.300" h="30px" w="30px" me="6px" transition={variantChange} fontWeight="bold"> |               <IconBox color="#489BFF" h="30px" w="30px" me="6px" transition={variantChange} fontWeight="bold"> | ||||||
|                 {route.icon(false)} |                 {route.icon(false)} | ||||||
|               </IconBox> |               </IconBox> | ||||||
|               <Text color={inactiveTextColor} fontSize="md" fontWeight="bold"> |               <Text color={inactiveTextColor} fontSize="md" fontWeight="bold"> | ||||||
|   | |||||||
| @@ -11,10 +11,10 @@ type Props = { | |||||||
|  |  | ||||||
| const SubNavigationButton = ({ isActive, route }: Props) => { | const SubNavigationButton = ({ isActive, route }: Props) => { | ||||||
|   const { t } = useTranslation(); |   const { t } = useTranslation(); | ||||||
|   const activeTextColor = useColorModeValue('gray.700', 'white'); |   const activeTextColor = useColorModeValue('white', 'white'); | ||||||
|   const inactiveTextColor = useColorModeValue('gray.600', 'gray.200'); |   const inactiveTextColor = useColorModeValue('gray.600', 'gray.200'); | ||||||
|   const activeBg = useColorModeValue('blue.50', 'blue.900'); |   const activeBg = useColorModeValue('#67ACFF', 'blue.900'); | ||||||
|   const hoverBg = useColorModeValue('blue.100', 'blue.800'); |   const hoverBg = useColorModeValue('#4499FF', 'blue.800'); | ||||||
|  |  | ||||||
|   const isCurrentlyActive = isActive(route.path); |   const isCurrentlyActive = isActive(route.path); | ||||||
|  |  | ||||||
| @@ -27,7 +27,11 @@ const SubNavigationButton = ({ isActive, route }: Props) => { | |||||||
|         bg={isCurrentlyActive ? activeBg : 'transparent'} |         bg={isCurrentlyActive ? activeBg : 'transparent'} | ||||||
|         _hover={{ |         _hover={{ | ||||||
|           bg: hoverBg, |           bg: hoverBg, | ||||||
|  |           boxShadow: "1.5px 1.5px 3px 0px rgba(174, 174, 192, 0.40), -1px -1px 3px 0px #FFF" | ||||||
|         }} |         }} | ||||||
|  |         borderStartRadius="0px" | ||||||
|  |         borderRadius="10px" | ||||||
|  |         mb="1px" | ||||||
|         border="none" |         border="none" | ||||||
|       > |       > | ||||||
|         {t(route.name)} |         {t(route.name)} | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ type Props = { | |||||||
| const NestedNavButton = ({ isActive, route }: Props) => { | const NestedNavButton = ({ isActive, route }: Props) => { | ||||||
|   const { t } = useTranslation(); |   const { t } = useTranslation(); | ||||||
|   const inactiveTextColor = useColorModeValue('gray.600', 'gray.200'); |   const inactiveTextColor = useColorModeValue('gray.600', 'gray.200'); | ||||||
|   const hoverBg = useColorModeValue('blue.100', 'blue.800'); |   const hoverBg = useColorModeValue('#C6E0FF', 'blue.800'); | ||||||
|  |  | ||||||
|   return ( |   return ( | ||||||
|     <AccordionItem w="152px" borderTop="0px" borderBottom="0px"> |     <AccordionItem w="152px" borderTop="0px" borderBottom="0px"> | ||||||
| @@ -37,11 +37,11 @@ const NestedNavButton = ({ isActive, route }: Props) => { | |||||||
|         _hover={{ |         _hover={{ | ||||||
|           bg: hoverBg, |           bg: hoverBg, | ||||||
|         }} |         }} | ||||||
|         borderRadius="15px" |         borderRadius="0px" | ||||||
|         w="100%" |         w="100%" | ||||||
|       > |       > | ||||||
|         <Flex alignItems="center" w="100%"> |         <Flex alignItems="center" w="100%"> | ||||||
|           <IconBox color="blue.300" h="30px" w="30px" me="6px" transition={variantChange} fontWeight="bold"> |           <IconBox color="#489BFF" h="30px" w="30px" me="6px" transition={variantChange} fontWeight="bold"> | ||||||
|             {route.icon(false)} |             {route.icon(false)} | ||||||
|           </IconBox> |           </IconBox> | ||||||
|           <Text size="md" fontWeight="bold" color={inactiveTextColor}> |           <Text size="md" fontWeight="bold" color={inactiveTextColor}> | ||||||
| @@ -51,7 +51,7 @@ const NestedNavButton = ({ isActive, route }: Props) => { | |||||||
|         <AccordionIcon /> |         <AccordionIcon /> | ||||||
|       </AccordionButton> |       </AccordionButton> | ||||||
|       <AccordionPanel pl="18px" paddingEnd={0} pr="-18px"> |       <AccordionPanel pl="18px" paddingEnd={0} pr="-18px"> | ||||||
|         <Box pl={1} pr={-1} borderLeft="1px solid #63b3ed"> |         <Box pl={1} pr={-1} borderLeft="1px solid #489BFF"> | ||||||
|           {route.children.map((subRoute) => ( |           {route.children.map((subRoute) => ( | ||||||
|             <SubNavigationButton key={subRoute.path} route={subRoute} isActive={isActive} /> |             <SubNavigationButton key={subRoute.path} route={subRoute} isActive={isActive} /> | ||||||
|           ))} |           ))} | ||||||
|   | |||||||
| @@ -122,18 +122,19 @@ export const Sidebar = ({ routes, isOpen, toggle, logo, version, topNav, childre | |||||||
|         <Box hidden={isCompact} position="fixed"> |         <Box hidden={isCompact} position="fixed"> | ||||||
|           <Box |           <Box | ||||||
|             shadow={navbarShadow} |             shadow={navbarShadow} | ||||||
|             bg={useColorModeValue('white', 'gray.700')} |             bg={useColorModeValue('#FEFEFE', 'gray.700')} | ||||||
|             transition={variantChange} |             transition={variantChange} | ||||||
|             w="200px" |             w="200px" | ||||||
|             maxW="200px" |             maxW="200px" | ||||||
|             h="calc(100vh - 32px)" |             h="calc(100vh - 32px)" | ||||||
|             my="16px" |             my="16px" | ||||||
|             ml="16px" |             ml="16px" | ||||||
|             borderRadius="15px" |             borderRadius="10px" | ||||||
|             border="0.5px solid" |             border="0.5px solid none" | ||||||
|  |             boxShadow="4px 4px 6px 0px rgba(174, 174, 192, 0.40), -1px -1px 3px 0px #FFF;" | ||||||
|           > |           > | ||||||
|             {brand} |             {brand} | ||||||
|             <Flex direction="column" h="calc(100vh - 160px)" alignItems="center" overflowY="auto"> |             <Flex direction="column" h="calc(100vh - 185px)" alignItems="center" overflowY="auto"> | ||||||
|               {sidebarContent} |               {sidebarContent} | ||||||
|             </Flex> |             </Flex> | ||||||
|           </Box> |           </Box> | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ const _LoginForm: React.FC<_LoginFormProps> = ({ setActiveForm }) => { | |||||||
|   const { t } = useTranslation(); |   const { t } = useTranslation(); | ||||||
|   const { setToken } = useAuth(); |   const { setToken } = useAuth(); | ||||||
|   const { accessPolicyLink, passwordPolicyLink } = useApiRequirements(); |   const { accessPolicyLink, passwordPolicyLink } = useApiRequirements(); | ||||||
|   const titleColor = useColorModeValue('blue.300', 'white'); |   const titleColor = useColorModeValue('#489BFF', 'white'); | ||||||
|   const textColor = useColorModeValue('gray.400', 'white'); |   const textColor = useColorModeValue('gray.400', 'white'); | ||||||
|   const { mutateAsync: login, error } = useLogin(); |   const { mutateAsync: login, error } = useLogin(); | ||||||
|   const forgotPassword = () => setActiveForm({ form: 'forgot-password' }); |   const forgotPassword = () => setActiveForm({ form: 'forgot-password' }); | ||||||
| @@ -129,8 +129,11 @@ const _LoginForm: React.FC<_LoginFormProps> = ({ setActiveForm }) => { | |||||||
|                 color={textColor} |                 color={textColor} | ||||||
|                 onClick={forgotPassword} |                 onClick={forgotPassword} | ||||||
|                 fontWeight="medium" |                 fontWeight="medium" | ||||||
|                 variant="ghost" |                 variant="none" | ||||||
|                 pl={{ base: '0px' }} |                 pl={{ base: '0px' }} | ||||||
|  |                 _hover={{ | ||||||
|  |                 bg:"none" | ||||||
|  |                 }} | ||||||
|               > |               > | ||||||
|                 {t('login.forgot_password')} |                 {t('login.forgot_password')} | ||||||
|               </Button> |               </Button> | ||||||
| @@ -143,17 +146,18 @@ const _LoginForm: React.FC<_LoginFormProps> = ({ setActiveForm }) => { | |||||||
|             <Button |             <Button | ||||||
|               fontSize="15px" |               fontSize="15px" | ||||||
|               type="submit" |               type="submit" | ||||||
|               bg="blue.300" |               bg="#489BFF" | ||||||
|               w="100%" |               w="100%" | ||||||
|               h="45" |               h="45" | ||||||
|               mb="20px" |               mb="20px" | ||||||
|               color="white" |               color="white" | ||||||
|               mt="20px" |               mt="20px" | ||||||
|  |               borderRadius="5px" | ||||||
|               _hover={{ |               _hover={{ | ||||||
|                 bg: 'blue.500', |                 bg: '#489BFF', | ||||||
|               }} |               }} | ||||||
|               _active={{ |               _active={{ | ||||||
|                 bg: 'blue.300', |                 bg:  "#489BFF", | ||||||
|               }} |               }} | ||||||
|               isLoading={isSubmitting} |               isLoading={isSubmitting} | ||||||
|               isDisabled={!isValid} |               isDisabled={!isValid} | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ interface LoginPageProps { | |||||||
| const LoginPage = ({ lightLogo, darkLogo }: LoginPageProps) => { | const LoginPage = ({ lightLogo, darkLogo }: LoginPageProps) => { | ||||||
|   const [activeForm, setActiveForm] = useState<LoginFormProps>({ form: 'login' }); |   const [activeForm, setActiveForm] = useState<LoginFormProps>({ form: 'login' }); | ||||||
|   const { colorMode } = useColorMode(); |   const { colorMode } = useColorMode(); | ||||||
|   const loginBg = useColorModeValue('gray.100', 'gray.700'); |   const loginBg = useColorModeValue('#F0F0F3', 'gray.700'); | ||||||
|  |  | ||||||
|   const getForm = React.useCallback(() => { |   const getForm = React.useCallback(() => { | ||||||
|     if (activeForm.form === 'login') return <LoginForm setActiveForm={setActiveForm} />; |     if (activeForm.form === 'login') return <LoginForm setActiveForm={setActiveForm} />; | ||||||
| @@ -29,16 +29,16 @@ const LoginPage = ({ lightLogo, darkLogo }: LoginPageProps) => { | |||||||
|     <Box px="5%" h="100vh" display="flex" alignItems="center"> |     <Box px="5%" h="100vh" display="flex" alignItems="center"> | ||||||
|       <Center display="block" w="100%"> |       <Center display="block" w="100%"> | ||||||
|         <Center h="100%" w="100%" mb={6} alignItems="center"> |         <Center h="100%" w="100%" mb={6} alignItems="center"> | ||||||
|           <Image maxH="300px" w="100%" maxW="600px" src={colorMode === 'light' ? lightLogo : darkLogo} /> |           <Image maxH="185px" w="100%" maxW="600px" src={colorMode === 'light' ? lightLogo : darkLogo} /> | ||||||
|         </Center> |         </Center> | ||||||
|         <Center> |         <Center> | ||||||
|           <Flex |           <Flex | ||||||
|             borderRadius="40px" |             borderRadius="15px" | ||||||
|             w="100%" |             w="100%" | ||||||
|             maxW="600px" |             maxW="600px" | ||||||
|             bgColor={loginBg} |             bgColor={loginBg} | ||||||
|             p="48px" |             p="48px" | ||||||
|             boxShadow={colorMode === 'light' ? 'xl' : 'dark-lg'} |             boxShadow="1.5px 1.5px 3px 0px rgba(174, 174, 192, 0.40), -1px -1px 3px 0px #FFF" | ||||||
|             direction="column" |             direction="column" | ||||||
|           > |           > | ||||||
|             {getForm()} |             {getForm()} | ||||||
|   | |||||||
| @@ -12,16 +12,16 @@ const Card = { | |||||||
|     panel: (props: { colorMode: string }) => ({ |     panel: (props: { colorMode: string }) => ({ | ||||||
|       bg: props.colorMode === 'dark' ? 'gray.700' : 'white', |       bg: props.colorMode === 'dark' ? 'gray.700' : 'white', | ||||||
|       width: '100%', |       width: '100%', | ||||||
|       boxShadow: '0px 4px 12px rgba(0, 0, 0, 0.05)', |       boxShadow: '1.5px 1.5px 3px 0px rgba(174, 174, 192, 0.40), -1px -1px 3px 0px #FFF', | ||||||
|       borderRadius: '15px', |       borderRadius: '10px', | ||||||
|       border: '0.5px solid', |       border: '0.5px solid none', | ||||||
|     }), |     }), | ||||||
|     widget: (props: { colorMode: string }) => ({ |     widget: (props: { colorMode: string }) => ({ | ||||||
|       bg: props.colorMode === 'dark' ? 'gray.800' : 'gray.100', |       bg: props.colorMode === 'dark' ? 'gray.800' : 'gray.100', | ||||||
|       width: '100%', |       width: '100%', | ||||||
|       boxShadow: '0px 4px 6px rgba(0, 0, 0, 0.1)', |       boxShadow: '0px 4px 6px rgba(0, 0, 0, 0.1)', | ||||||
|       borderRadius: '15px', |       borderRadius: '5px', | ||||||
|       border: '0.5px solid', |       border: '0.5px solid none', | ||||||
|     }), |     }), | ||||||
|   }, |   }, | ||||||
|   defaultProps: { |   defaultProps: { | ||||||
|   | |||||||
| @@ -45,7 +45,7 @@ export default { | |||||||
|   styles: { |   styles: { | ||||||
|     global: (props: { colorMode: string }) => ({ |     global: (props: { colorMode: string }) => ({ | ||||||
|       body: { |       body: { | ||||||
|         bg: mode('gray.50', 'gray.800')(props), |         bg: mode('#F0F0F3', 'gray.800')(props), | ||||||
|         fontFamily: 'Inter, sans-serif', |         fontFamily: 'Inter, sans-serif', | ||||||
|       }, |       }, | ||||||
|       html: { |       html: { | ||||||
|   | |||||||
 praveenkumarsirisolla
					praveenkumarsirisolla