@chakra-ui/react#useColorMode TypeScript Examples
The following examples show how to use
@chakra-ui/react#useColorMode.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.tsx From coindrop with GNU General Public License v3.0 | 6 votes |
Home: NextPage = () => {
const { colorMode } = useColorMode();
return (
<>
<NextSeo
title="Coindrop - Accept payments and donations 100% Free with Zero Fees"
description="Create your page. Let the sender choose how to pay you. Supports all payment apps and cryptocurrencies."
/>
<LandingPage
headingTextPrimaryPreUnderline="Easily accept "
headingTextPrimaryUnderline="zero-fee"
headingTextPrimaryPostUnderline=" donations and tips"
headingTextSecondary="List your payment apps. Let the sender choose how to pay you."
headingTextTertiary="100% free. Zero fees."
smartphoneMockupImagePublicPath={`/landing-page/smartphone-mockup-${colorMode}.png`}
showSubscriptionPlatforms
ShareOptions={ShareOptionsDefault}
shareOptionsHeading="Share anywhere & get paid"
advertiseOpenSource
getStartedText="Coindrops are 100% free and only take ~2 minutes to set up."
smartphoneMockupImageWidth={305}
smartphoneMockupImageHeight={606}
createCoindropInputPlaceholder="your-name"
logoSubtitle={null}
/>
</>
);
}
Example #2
Source File: restaurants.tsx From coindrop with GNU General Public License v3.0 | 6 votes |
LandingPageForRestaurants: NextPage = () => {
const { colorMode } = useColorMode();
return (
<>
<NextSeo
title="Accept tips on take-out orders | Coindrop"
description="Print tip cards and include them in the to-go box"
/>
<LandingPage
headingTextPrimaryPreUnderline="The "
headingTextPrimaryUnderline="best"
headingTextPrimaryPostUnderline=" way to accept tips on carry-out & delivery orders"
headingTextSecondary="Include tip cards in to-go and delivery boxes. Let customers tip you when their expectations are exceeded."
headingTextTertiary="Web app is free to use. Tip Cards starting at $19 for 500."
smartphoneMockupImagePublicPath={`/landing-page/smartphone-mockup-${colorMode}-for-restaurants.png`}
showSubscriptionPlatforms={false}
shareOptionsHeading="Include tip cards with orders & get tipped"
ShareOptions={ShareOptionsForRestaurants}
advertiseOpenSource={false}
getStartedText="Coindrop is 100% free and open-source."
smartphoneMockupImageWidth={800}
smartphoneMockupImageHeight={606}
createCoindropInputPlaceholder="restaurant-name"
logoSubtitle="for restaurants"
/>
</>
);
}
Example #3
Source File: ColorModeSwitcher.tsx From notebook with MIT License | 6 votes |
ColorModeSwitcher: React.FC<ColorModeSwitcherProps> = (props) => {
const { toggleColorMode } = useColorMode()
const text = useColorModeValue("dark", "light")
const SwitchIcon = useColorModeValue(FaMoon, FaSun)
return (
<IconButton
size="md"
fontSize="lg"
variant="ghost"
color="current"
marginLeft="2"
onClick={toggleColorMode}
icon={<SwitchIcon />}
aria-label={`Switch to ${text} mode`}
{...props}
/>
)
}
Example #4
Source File: Logo.tsx From coindrop with GNU General Public License v3.0 | 6 votes |
PiggyLogo: FC<IconProps> = (iconProps) => {
const theme = useTheme();
const { colorMode } = useColorMode();
const logoOutlineColor = useColorModeValue(theme.colors.gray['800'], theme.colors.gray['900']);
// eslint-disable-next-line react/jsx-props-no-spreading
return colorMode === 'light'
? <PiggyLogoIcon color={logoOutlineColor} {...iconProps} />
: <PiggyLogoIconDarkMode color={logoOutlineColor} {...iconProps} />;
}
Example #5
Source File: ToggleColorModeButton.tsx From coindrop with GNU General Public License v3.0 | 6 votes |
ToggleColorModeButton: FC<ButtonProps> = (buttonProps) => {
const { colorMode, toggleColorMode } = useColorMode();
return (
<Button
aria-label="Toggle dark mode"
onClick={toggleColorMode}
// eslint-disable-next-line react/jsx-props-no-spreading
{...buttonProps}
>
{colorMode === 'light' ? <SunIcon /> : <MoonIcon />}
</Button>
);
}
Example #6
Source File: DarkModeSwitch.tsx From ksana.in with Apache License 2.0 | 6 votes |
export function DarkModeSwitch() {
const { colorMode, toggleColorMode } = useColorMode()
const isDark: string | boolean = colorMode === 'dark'
return (
<IconButton
aria-label="Theme switcher"
onClick={toggleColorMode}
fontSize="20px"
borderRadius="md"
bgColor="orange.300"
_hover={{
bg: 'orange.500'
}}
icon={isDark ? <HiSun color="white" /> : <HiMoon color="white" />}
/>
)
}
Example #7
Source File: ModifiedTooltip.tsx From lucide with ISC License | 6 votes |
ModifiedTooltip = ({}) => {
const { colorMode } = useColorMode();
return (
<Tooltip
hasArrow
label="This is new or modified icon"
bg={colorMode === 'light' ? theme.colors.white : theme.colors.gray[700]}
color={colorMode === 'dark' ? theme.colors.white : null}
>
<Box
{
...{
position: 'absolute',
height: '8px',
width: '8px',
background: '#F56565',
top: '8px',
right: '8px',
borderRadius: '4px'
}
}
/>
</Tooltip>
)
}
Example #8
Source File: Container.tsx From ksana.in with Apache License 2.0 | 6 votes |
export function Container(props: ContainerProps) {
const { colorMode } = useColorMode()
return (
<Flex
direction="column"
alignItems="center"
justifyContent="flex-start"
bg={bgColor[colorMode]}
color={textColor[colorMode]}
{...props}
/>
)
}
Example #9
Source File: withColorModeHooks.tsx From bluebubbles-server with Apache License 2.0 | 6 votes |
withColorModeHooks = (Elem: any): (props: any) => JSX.Element => {
// eslint-disable-next-line react/display-name
return (props: any): JSX.Element => {
return <Elem
useColorModeValue={useColorModeValue}
useColorMode={useColorMode()}
{...props}
/>;
};
}
Example #10
Source File: SearchInput.tsx From lucide with ISC License | 5 votes |
SearchInput = (
({ onChange, count }: SearchInputProps) => {
const { colorMode } = useColorMode();
const [urlValue, setUrlValue] = useRouterParam('search');
const [inputValue, setInputValue] = useState('');
const debouncedValue = useDebounce(inputValue.trim(), 300);
useUpdateEffect(() => {
onChange(debouncedValue);
setUrlValue(debouncedValue);
}, [debouncedValue]);
useEffect(() => {
if (urlValue && !inputValue) {
setInputValue(urlValue);
onChange(urlValue);
}
}, [urlValue]);
const ref = useRef(null);
// Keyboard `/` shortcut
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === '/' && ref.current !== document.activeElement) {
event.preventDefault();
ref.current.focus();
}
};
window.addEventListener('keydown', handleKeyDown);
return () => window.removeEventListener('keydown', handleKeyDown);
}, []);
return (
<InputGroup position="sticky" top={4} zIndex={1}>
<InputLeftElement
children={
<Icon>
<SearchIcon />
</Icon>
}
/>
<Input
ref={ref}
placeholder={`Search ${count} icons (Press "/" to focus)`}
onChange={(event) => setInputValue(event.target.value)}
value={inputValue}
bg={colorMode == 'light' ? theme.colors.white : theme.colors.gray[700]}
/>
</InputGroup>
);
}
)
Example #11
Source File: Navbar.tsx From coindrop with GNU General Public License v3.0 | 5 votes |
UserMenu = () => {
const { colorMode, toggleColorMode } = useColorMode();
const { logout } = useUser();
return (
<Menu placement="bottom-end">
<MenuButton as={Button} variant="ghost">
<HamburgerMenuIcon />
</MenuButton>
<MenuList>
<NextLink href="/account">
<MenuItem>
<Flex
align="center"
>
<SettingsIcon mr={2} />
My Account
</Flex>
</MenuItem>
</NextLink>
{/* This is an external link to ensure Ecwid scripts run on page changes */}
{/* Should figure out a way to trigger the scripts manually within /shop */}
{/* <Link href="/shop" style={{textDecoration: "none"}}>
<MenuItem>
<Flex
align="center"
>
<Icon mr={2} as={AiOutlineShopping} />
Shop
</Flex>
</MenuItem>
</Link> */}
<MenuItem
onClick={toggleColorMode}
>
<Flex
align="center"
>
{colorMode === 'dark' ? <SunIcon mr={2} /> : <MoonIcon mr={2} />}
{colorMode === 'dark' ? 'Light mode' : 'Dark mode'}
</Flex>
</MenuItem>
<MenuItem
onClick={() => {
logout();
}}
>
<Flex
align="center"
>
<LogoutIcon mr={2} />
Log out
</Flex>
</MenuItem>
</MenuList>
</Menu>
);
}
Example #12
Source File: ShareOptions.tsx From coindrop with GNU General Public License v3.0 | 5 votes |
ShareOptionsDefault: FC = () => {
const { colorMode } = useColorMode();
const yellow = useColorModeValue("yellow.400", "yellow.300");
return (
<Flex
direction={["column", "row"]}
wrap="wrap"
>
<ShareOption
title="Custom URL"
description="For literally anywhere"
bg={colorMode === 'light' ? 'logoPrimary' : 'orange.300'}
>
<b>
<Text
fontSize="lg"
color={colorMode === 'light' ? 'gray.800' : 'white'}
>
coindrop.to/your-name
</Text>
</b>
</ShareOption>
<ShareOption
title="Button"
description="For websites"
bg={colorMode === 'light' ? 'green.400' : 'green.300'}
>
<>
<Box w="228px" h="57px">
<Link href="https://coindrop.to/satoshi-nakamoto" isExternal>
<img src="/embed-button.png" style={{borderRadius: "10px", height: "57px", width: "229px"}} alt="Coindrop.to me" />
</Link>
</Box>
</>
</ShareOption>
<ShareOption
title="QR Code"
description="For smartphones"
bg={yellow}
>
<QRCodeExample />
</ShareOption>
<ShareOption
title="Tip Cards"
description="For the real world"
bg='#BBCBCB'
>
<Image src={tipCardPng} alt="Tip Card example" height="150px" width="150px" />
</ShareOption>
</Flex>
);
}
Example #13
Source File: ShareOption.tsx From coindrop with GNU General Public License v3.0 | 5 votes |
ShareOption: FC<{title: string, description: string, bg: string}> = ({ bg, description, title, children }) => {
const { colorMode } = useColorMode();
return (
<Flex
direction="column"
flex={["0 1 auto", "1 0 50%", "1 0 50%", "1 0 33.33%"]}
align="center"
>
<Heading
textAlign="center"
as="h3"
size="md"
mt={[3, null]}
>
{title}
</Heading>
<Text
textAlign="center"
fontSize="lg"
mb={4}
>
{description}
</Text>
<Flex
bg={bg}
borderRadius="50%"
borderColor={colorMode === 'light' ? 'gray.800' : 'gray.600'}
borderWidth="8px"
borderStyle="solid"
mx={[0, 4]}
w="275px"
h="275px"
justify="center"
direction="column"
>
<Flex justify="center" align="center" direction="column" h="150px">
{children}
</Flex>
</Flex>
</Flex>
);
}
Example #14
Source File: MessageDialog.tsx From ksana.in with Apache License 2.0 | 5 votes |
export function MessageDialog({
title,
message,
cancelText,
confirmText,
confirmSchema,
isOpen,
onConfirm,
onClose
}: IMessageDialogProps) {
const cancelRef = useRef<any>()
const { colorMode } = useColorMode()
return (
<AlertDialog
motionPreset="slideInBottom"
isOpen={isOpen}
leastDestructiveRef={cancelRef}
onClose={onClose}
isCentered
>
<AlertDialogOverlay>
<AlertDialogContent width="90%">
<AlertDialogHeader fontSize="lg" fontWeight="bold" color={textColor[colorMode]}>
{title}
</AlertDialogHeader>
<AlertDialogBody color={textColor[colorMode]}>{message}</AlertDialogBody>
<AlertDialogFooter>
<Button ref={cancelRef} onClick={onClose} color={textColor[colorMode]}>
{cancelText}
</Button>
{confirmText && (
<Button colorScheme={confirmSchema} onClick={onConfirm} ml={3}>
{confirmText}
</Button>
)}
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialogOverlay>
</AlertDialog>
)
}
Example #15
Source File: CodeBlock.tsx From lucide with ISC License | 5 votes |
function CodeBlock({ code, language, metastring, showLines, ...props }: HighlightProps) {
const shouldHighlightLine = calculateLinesToHighlight(metastring);
const { colorMode } = useColorMode();
const backgroundColor =
colorMode === 'light' ? uiTheme.colors.gray[100] : uiTheme.colors.gray[700];
const codeTheme = colorMode === 'light' ? nightOwlLightTheme : nightOwlDarkTheme;
const customizedCodeTheme = {
...codeTheme,
plain: {
...codeTheme.plain,
backgroundColor,
},
};
return (
<Box position="relative" zIndex="0" {...props}>
<CodeContainer bg={backgroundColor}>
<BaseHighlight
{...defaultProps}
code={code}
language={language}
theme={customizedCodeTheme}
key={colorMode}
>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<div style={editorStyle} data-language={language} key={colorMode}>
<pre className={className} style={style}>
{tokens.slice(0, -1).map((line, i) => {
const lineProps = getLineProps({ line, key: i });
return (
<chakra.div
px="4"
bg={shouldHighlightLine(i) ? 'whiteAlpha.200' : undefined}
{...lineProps}
>
{showLines && (
<chakra.span
opacity={0.3}
mr="4"
width="16px"
display="inline-block"
fontSize="xs"
style={{ userSelect: 'none' }}
>
{i + 1}
</chakra.span>
)}
{line.map((token, key) => (
<span {...getTokenProps({ token, key })} />
))}
</chakra.div>
);
})}
</pre>
</div>
)}
</BaseHighlight>
</CodeContainer>
<CopyButton
size="sm"
position="absolute"
textTransform="uppercase"
colorScheme="teal"
fontSize="xs"
height="24px"
zIndex="1"
top="2.5"
right="1.25em"
copyText={code}
fontFamily={uiTheme.fonts.body}
fontWeight="bold"
/>
</Box>
);
}
Example #16
Source File: about.tsx From portfolio with MIT License | 5 votes |
About = () => {
const { colorMode } = useColorMode();
return (
<PageSlideFade>
<StaggerChildren>
<MotionBox>
<Heading>
<Flex alignItems="center">
<Header underlineColor={TURQUOISE} mt={0} mb={0}>
Career
</Header>
<Stack pl={3}>
<Box as={BsFillBriefcaseFill} size="25px" />
</Stack>
</Flex>
</Heading>
</MotionBox>
<VStack spacing={4} marginBottom={6} align="left" mx={[0, 0, 6]} mt={12}>
{companies.map((company, index) => (
<MotionBox whileHover={{ y: -5 }} key={index}>
<Card
key={index}
title={company.title}
role={company.role}
skills={company.skills}
period={company.period}
logo={company.logo}
colorMode={colorMode}
/>
</MotionBox>
))}
</VStack>
<Heading>
<Flex alignItems="center">
<Header underlineColor={TURQUOISE} mt={0} mb={0}>
Education
</Header>
<Stack pl={3}>
<Box as={FaGraduationCap} size="25px" />
</Stack>
</Flex>
</Heading>
<VStack spacing={4} marginBottom={6} align="left" mx={[0, 0, 6]} mt={12}>
{institutes.map((institute, index) => (
<MotionBox whileHover={{ y: -5 }} key={index}>
<Card
key={index}
title={institute.title}
role={institute.role}
skills={institute.skills}
period={institute.period}
logo={institute.logo}
colorMode={colorMode}
/>
</MotionBox>
))}
</VStack>
</StaggerChildren>
</PageSlideFade>
);
}
Example #17
Source File: ColorModeSwitcher.tsx From portfolio with MIT License | 5 votes |
ColorModeSwitcher: React.FC<ColorModeSwitcherProps> = props => {
const { toggleColorMode } = useColorMode();
const text = useColorModeValue("dark", "light");
const SwitchIcon = useColorModeValue(FaMoon, FaSun);
const [play] = useSound(lightswitch, {
volume: 0.05,
sprite: {
on: [0, 300],
off: [500, 300]
}
});
const handleClick = () => {
text === "dark" ? play({ id: "on" }) : play({ id: "off" });
toggleColorMode();
};
return (
<Tooltip
label={text === "dark" ? "Dark mode" : "Light mode"}
aria-label="A tooltip"
>
<IconButton
size="md"
fontSize="md"
variant="ghost"
color="current"
marginLeft="2"
onClick={handleClick}
icon={<SwitchIcon />}
aria-label={`Switch to ${text} mode`}
_hover={{
bg: useColorModeValue("gray.200", "gray.900")
}}
{...props}
/>
</Tooltip>
);
}
Example #18
Source File: UseBackground.ts From bluebubbles-server with Apache License 2.0 | 5 votes |
useBackground = () => {
const { colorMode } = useColorMode();
const useOled = useAppSelector(state => state.config.use_oled_dark_mode ?? false);
if (colorMode === 'light') return 'white';
return (useOled) ? 'black' : 'gray.800';
}
Example #19
Source File: Setup.tsx From bluebubbles-server with Apache License 2.0 | 5 votes |
NavBar = (): JSX.Element => {
const { colorMode, toggleColorMode } = useColorMode();
return (
<Flex
height="20"
alignItems="center"
borderBottomWidth="1px"
borderBottomColor={useColorModeValue('gray.200', 'gray.700')}
justifyContent='space-between'
p={4}
pl={6}
>
<Flex alignItems="center" justifyContent='flex-start'>
<img src={logo} className="logo" alt="logo" height={48} />
<Text fontSize="1xl" ml={2}>BlueBubbles</Text>
</Flex>
<Flex justifyContent='flex-end'>
<HStack spacing={{ base: '0', md: '1' }}>
<Tooltip label="Website Home" aria-label="website-tip">
<Link href="https://bluebubbles.app" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="website" icon={<AiOutlineHome />} />
</Link>
</Tooltip>
<Tooltip label="BlueBubbles Web" aria-label="website-tip">
<Link href="https://bluebubbles.app/web" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="bluebubbles web" icon={<FiMessageCircle />} />
</Link>
</Tooltip>
<Tooltip label="Support Us" aria-label="donate-tip">
<Link href="https://bluebubbles.app/donate" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="donate" icon={<MdOutlineAttachMoney />} />
</Link>
</Tooltip>
<Tooltip label="Join our Discord" aria-label="discord-tip">
<Link href="https://discord.gg/yC4wr38" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="discord" icon={<FaDiscord />} />
</Link>
</Tooltip>
<Tooltip label="Read our Source Code" aria-label="github-tip">
<Link href="https://github.com/BlueBubblesApp" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="github" icon={<FiGithub />} />
</Link>
</Tooltip>
<Spacer />
<Divider orientation="vertical" width={1} height={15} borderColor='gray' />
<Spacer />
<Spacer />
<Spacer />
<FormControl display='flex' alignItems='center'>
<Box mr={2}><MdOutlineDarkMode size={20} /></Box>
<Switch id='theme-mode-toggle' onChange={toggleColorMode} isChecked={colorMode === 'light'} />
<Box ml={2}><MdOutlineLightMode size={20} /></Box>
</FormControl>
</HStack>
</Flex>
</Flex>
);
}
Example #20
Source File: Package.tsx From lucide with ISC License | 4 votes |
Package = ({ name, description, image, shields, source, documentation }) => {
const { colorMode } = useColorMode();
return (
<Box
borderWidth="1px"
rounded="lg"
position="relative"
width="100%"
maxWidth="1152px"
boxShadow="lg"
bg={colorMode == 'light' ? 'gray-200' : 'gray.700'}
padding={8}
>
<Flex
justifyContent={{
base: 'center',
md: 'flex-start',
}}
flexDirection={{
base: 'column',
md: 'row',
}}
>
<Flex
marginRight={{
base: 0,
md: 8,
}}
marginBottom={{
base: 4,
md: 0,
}}
flex={3}
align="center"
>
<Box marginX="auto">
<Image width={278} height={120} src={image} />
</Box>
</Flex>
<Box
flex={5}
marginRight={4}
textAlign={{
base: 'center',
md: 'left',
}}
>
<Heading as="h2" fontSize="3xl" mb={2}>
{name}
</Heading>
<Text mb={3}>{description}</Text>
<ButtonGroup spacing={2}>
{shields.map(({ alt, src, href }, index) => (
<Link href={href} passHref>
<a target="_blank">
<img {...{ alt, src }} key={index} />
</a>
</Link>
))}
</ButtonGroup>
</Box>
<Flex
placeItems="center"
align="center"
marginTop={{
base: 4,
md: 0,
}}
>
<ButtonGroup
// as={Stack}
// spacing={8}
// align='center'
flexDirection={{
base: 'column',
lg: 'initial',
}}
margin="auto"
justifyContent={{
base: 'center',
sm: 'flex-start',
}}
>
<Link passHref href={documentation}>
<Button as="a" variant="solid" textDecoration="none" leftIcon={<FileText />} my={2}>
Documentation
</Button>
</Link>
<Link passHref href={source}>
<Button as="a" variant="solid" textDecoration="none" leftIcon={<Code />} my={2}>
Source
</Button>
</Link>
</ButtonGroup>
</Flex>
</Flex>
</Box>
);
}
Example #21
Source File: Layout.tsx From lucide with ISC License | 4 votes |
Layout = ({ aside, children }: LayoutProps) => {
const router = useRouter();
const { toggleMobileMenu } = useMobileNavigationContext();
const { toggleColorMode } = useColorMode();
const currentColorMode = useColorModeValue('dark', 'light');
const ColorModeToggle = useColorModeValue(Moon, Sun);
const MobileMenuToggle = useMobileNavigationValue(Menu, X);
const showBaseNavigation = useBreakpointValue({ base: false, md: true });
const IconbuttonProps = {
size: 'md',
fontSize: 'lg',
variant: 'ghost',
color: 'current',
ml: '3',
};
function setQuery(query) {
router.push({
pathname: '/',
query: { query: query },
},
undefined,
{ shallow: true })
}
useKeyBindings({
Escape: {
fn: () => setQuery(''),
},
KeyT: {
fn: () => toggleColorMode(),
},
});
return (
<Box h="100vh">
<Flex mb={16} w="full">
<Flex
alignItems="center"
justifyContent="space-between"
pt={4}
pb={4}
margin="0 auto"
w="full"
px={5}
>
<Flex justifyContent="center" alignItems="center">
<Logo />
</Flex>
<Flex justifyContent="center" alignItems="center">
{showBaseNavigation ? (
<>
<NextLink href="/docs" passHref>
<Link marginRight={12} fontSize="xl">
Documentation
</Link>
</NextLink>
<NextLink href="/packages" passHref>
<Link marginRight={12} fontSize="xl">
Packages
</Link>
</NextLink>
<NextLink href="/license" passHref>
<Link marginRight={12} fontSize="xl">
License
</Link>
</NextLink>
<Link
href="https://github.com/lucide-icons/lucide"
isExternal
marginRight={6}
fontSize="xl"
>
Github
</Link>
</>
) : null}
<IconButton
aria-label={`Switch to ${currentColorMode} mode`}
onClick={toggleColorMode}
{...IconbuttonProps}
icon={<ColorModeToggle />}
/>
{!showBaseNavigation ? (
<IconButton
aria-label={`Open Mobile menu`}
onClick={toggleMobileMenu}
{...IconbuttonProps}
icon={<MobileMenuToggle />}
/>
) : null}
</Flex>
</Flex>
</Flex>
<Flex>
{aside ? <Box as="aside" marginRight={{ base: 0, lg: -240, }}>{aside}</Box> : null}
<Flex margin="0 auto" direction="column" maxW="1250px" px={5} width="100%">
{children}
<Divider mb={6} mt={12} />
<p style={{ alignSelf: 'center' }}>
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
<img src="/vercel.svg" alt="Powered by Vercel" width="200" />
</a>
</p>
<br />
</Flex>
</Flex>
</Box>
);
}
Example #22
Source File: IconDetailOverlay.tsx From lucide with ISC License | 4 votes |
IconDetailOverlay = ({ open = true, close, icon }) => {
const toast = useToast();
const { colorMode } = useColorMode();
const { tags = [], name } = icon;
const {color, strokeWidth, size} = useContext(IconStyleContext);
const iconRef = useRef<SVGSVGElement>(null);
const [isMobile] = useMediaQuery("(max-width: 560px)")
const { isOpen, onOpen, onClose } = useDisclosure()
const handleClose = () => {
onClose();
close();
};
useEffect(() => {
if(open) {
onOpen()
}
}, [open])
const iconStyling = (isLight) => ({
height: "25vw",
width: "25vw",
minHeight: "160px",
minWidth: "160px",
maxHeight: "240px",
maxWidth: "240px",
color: color,
});
const downloadIcon = ({src, name} : IconDownload) => download(src, `${name}.svg`, 'image/svg+xml');
const copyIcon = ({src, name} : IconDownload) => {
copy(src);
toast({
title: "Copied!",
description: `Icon "${name}" copied to clipboard.`,
status: "success",
duration: 1500,
isClosable: true
});
}
const downloadPNG = ({src, name}: IconDownload) => {
const canvas = document.createElement('canvas');
canvas.width = size;
canvas.height = size;
const ctx = canvas.getContext("2d");
const image = new Image();
image.src = `data:image/svg+xml;base64,${btoa(src)}`;
image.onload = function() {
ctx.drawImage(image, 0, 0);
const link = document.createElement('a');
link.download = `${name}.png`;
link.href = canvas.toDataURL('image/png')
link.click();
}
}
return (
<Box
position="fixed"
bottom={0}
zIndex={2}
width="100%"
left={0}
height={0}
key={name}
>
<Slide direction="bottom" in={isOpen} style={{ zIndex: 10 }}>
<Flex
alignItems="center"
justifyContent="space-between"
pt={4}
pb={4}
maxW="850px"
margin="0 auto"
w="full"
px={8}
>
<Box
borderWidth="1px"
rounded="lg"
width="full"
boxShadow={theme.shadows.xl}
position="relative"
bg={
colorMode == "light"
? theme.colors.white
: theme.colors.gray[700]
}
padding={8}
>
<IconButton
size="sm"
aria-label="Close overlay"
variant="ghost"
color="current"
ml="3"
position="absolute"
top={4}
right={4}
onClick={handleClose}
icon={<Close />}
/>
<Flex direction={['column', 'row']} alignItems={['center', 'flex-start']}>
<Flex>
<Box
borderWidth="1px"
rounded="md"
position="relative"
bg={
colorMode == "light"
? theme.colors.whiteAlpha[800]
: theme.colors.blackAlpha[500]
}
padding={0}
>
<div
style={iconStyling(colorMode == "light")}
className="icon-large"
>
<IconWrapper
content={icon.content}
stroke={color}
strokeWidth={strokeWidth}
height={size}
width={size}
ref={iconRef}
/>
</div>
<svg className="icon-grid" width="24" height="24" viewBox={`0 0 ${size} ${size}`} fill="none" stroke={colorMode == "light" ? '#E2E8F0' : theme.colors.gray[600]} strokeWidth="0.1" xmlns="http://www.w3.org/2000/svg">
{ Array.from({ length:(size - 1) }, (_, i) => (
<g key={`grid-${i}`}>
<line key={`horizontal-${i}`} x1={0} y1={i + 1} x2={size} y2={i + 1} />
<line key={`vertical-${i}`} x1={i + 1} y1={0} x2={i + 1} y2={size} />
</g>
)) }
</svg>
</Box>
</Flex>
<Flex marginLeft={[0, 8]} w="100%">
<Box w="100%">
<Flex
justify={isMobile ? 'center' : 'flex-start'}
marginTop={isMobile ? 10 : 0}
>
<Box
position="relative"
mb={1}
display="inline-block"
style={{ cursor: "pointer" }}
pr={6}
>
<Text fontSize="3xl">
{icon.name}
</Text>
{ icon?.contributors?.length ? ( <ModifiedTooltip/> ) : null}
</Box>
</Flex>
<Box mb={4}>
{ tags?.length ? (
<Text
fontSize="xl"
fontWeight="bold"
color={
colorMode === "light"
? 'gray.600'
: 'gray.500'
}
>
{ tags.join(' • ') }
</Text>
) : ''}
{/* <Button size="sm" fontSize="md" variant="ghost" onClick={() => downloadIcon(icon)}>
Edit Tags
</Button> */}
</Box>
<Box overflowY="auto" w="100%" pt={1} pb={1}>
<ButtonGroup spacing={4}>
<Button variant="solid" onClick={() => downloadIcon({src: iconRef.current.outerHTML, name: icon.name})} mb={1}>
Download SVG
</Button>
<Button variant="solid" onClick={() => copyIcon({src: iconRef.current.outerHTML, name: icon.name})} mb={1}>
Copy SVG
</Button>
<Button variant="solid" onClick={() => downloadPNG({src: iconRef.current.outerHTML, name: icon.name})} mb={1}>
Download PNG
</Button>
</ButtonGroup>
</Box>
{ icon?.contributors?.length ? (
<>
<Heading as="h5" size="sm" marginTop={4} marginBottom={2}>
Contributors:
</Heading>
<AvatarGroup size="md">
{ icon.contributors.map((commit, index) => (
<Link href={`https://github.com/${commit.author}`} isExternal key={`${index}_${commit.sha}`}>
<Tooltip label={commit.author} key={commit.sha}>
<Avatar name={commit.author} src={`https://github.com/${commit.author}.png?size=88`} />
</Tooltip>
</Link>
)) }
</AvatarGroup>
</>
) : null }
</Box>
</Flex>
</Flex>
</Box>
</Flex>
</Slide>
</Box>
);
}
Example #23
Source File: index.tsx From nextjs-hasura-boilerplate with MIT License | 4 votes |
Navbar: NextComponentType = () => {
const [session] = useSession();
const { colorMode, toggleColorMode } = useColorMode();
const handleToggleTheme = () => {
toggleColorMode();
};
const linksForAllUsers = [
{
id: "home",
label: "Home",
href: "/",
},
];
const linksForAuthenticatedUsers = [
{
id: "feeds",
label: "Feeds",
href: "/feeds",
},
{
id: "myAccount",
label: "My Account",
href: "/my-account",
},
];
const signInButtonNode = () => {
if (session) {
return false;
}
return (
<Box>
<Link href="/api/auth/signin">
<Button
onClick={(e) => {
e.preventDefault();
signIn();
}}
>
Sign In
</Button>
</Link>
</Box>
);
};
const signOutButtonNode = () => {
if (!session) {
return false;
}
return (
<Box>
<Link href="/api/auth/signout">
<Button
onClick={(e) => {
e.preventDefault();
signOut();
}}
>
Sign Out
</Button>
</Link>
</Box>
);
};
const themeToggleButtonNode = () => {
return (
<IconButton
aria-label="Toggle theme"
fontSize="20px"
icon={colorMode === "dark" ? <SunIcon /> : <MoonIcon />}
onClick={handleToggleTheme}
/>
);
};
return (
<Box>
<Box p={4} shadow="lg" pos="relative">
<Box maxW="xl" mx="auto" w="full">
<Stack
isInline
spacing={4}
align="center"
justifyContent="space-between"
w="full"
>
<Box>
<Stack isInline spacing={4} align="center" fontWeight="semibold">
{linksForAllUsers.map((link) => {
return (
<Box key={link.id}>
<Link href={link.href}>
<_Link>{link.label}</_Link>
</Link>
</Box>
);
})}
{session &&
linksForAuthenticatedUsers.map((link) => {
return (
<Box key={link.id}>
<Link href={link.href}>
<_Link>{link.label}</_Link>
</Link>
</Box>
);
})}
</Stack>
</Box>
<Box>
<Stack isInline spacing={4} align="center">
{themeToggleButtonNode()}
{signInButtonNode()}
{signOutButtonNode()}
</Stack>
</Box>
</Stack>
</Box>
</Box>
</Box>
);
}
Example #24
Source File: EditPiggybankModal.tsx From coindrop with GNU General Public License v3.0 | 4 votes |
EditPiggybankModal: FunctionComponent<Props> = ({ isOpen, onClose }) => {
const [isSubmitting, setIsSubmitting] = useState(false);
const { colors } = useTheme();
const { user } = useUser();
const { colorMode } = useColorMode();
const accentColorLevelInitial = getAccentColorLevelInitial(colorMode);
const accentColorLevelHover = getAccentColorLevelHover(colorMode);
const { push: routerPush, query: { piggybankName } } = useRouter();
const initialPiggybankId = Array.isArray(piggybankName) ? piggybankName[0] : piggybankName;
const { piggybankDbData } = useContext(PublicPiggybankDataContext);
const { avatar_storage_id: currentAvatarStorageId } = piggybankDbData;
const initialPaymentMethodsDataFieldArray = convertPaymentMethodsDataToFieldArray(piggybankDbData.paymentMethods);
const initialAccentColor = piggybankDbData.accentColor ?? 'orange';
const {
register,
handleSubmit,
setValue,
watch,
control,
formState: { isDirty },
} = useForm({
defaultValues: {
piggybankId: initialPiggybankId,
accentColor: initialAccentColor,
website: piggybankDbData.website ?? '',
name: piggybankDbData.name ?? '',
verb: piggybankDbData.verb ?? 'pay',
paymentMethods: sortByIsPreferredThenAlphabetical(initialPaymentMethodsDataFieldArray),
},
});
const paymentMethodsFieldArrayName = "paymentMethods";
const { fields, append, remove } = useFieldArray({
control,
name: paymentMethodsFieldArrayName,
});
const {
accentColor: watchedAccentColor,
piggybankId: watchedPiggybankId,
} = watch(["accentColor", "piggybankId"]);
const isAccentColorDirty = initialAccentColor !== watchedAccentColor;
const isUrlUnchanged = initialPiggybankId === watchedPiggybankId;
const { isPiggybankIdAvailable, setIsAddressTouched } = useContext(AdditionalValidation);
const onSubmit = async (formData) => {
try {
setIsSubmitting(true);
const dataToSubmit = {
...formData,
paymentMethods: convertPaymentMethodsFieldArrayToDbMap(formData.paymentMethods ?? []),
owner_uid: user.id,
avatar_storage_id: currentAvatarStorageId ?? null,
};
if (isUrlUnchanged) {
await db.collection('piggybanks').doc(initialPiggybankId).set(dataToSubmit);
mutate(['publicPiggybankData', initialPiggybankId], dataToSubmit);
} else {
await axios.post(
'/api/createPiggybank',
{
oldPiggybankName: initialPiggybankId,
newPiggybankName: formData.piggybankId,
piggybankData: dataToSubmit,
},
{
headers: {
token: user.token,
},
},
);
try {
await db.collection('piggybanks').doc(initialPiggybankId).delete();
} catch (err) {
console.log('error deleting old Coindrop page');
}
routerPush(`/${formData.piggybankId}`);
}
fetch(`/${initialPiggybankId}`, { headers: { isToForceStaticRegeneration: "true" }});
onClose();
} catch (error) {
setIsSubmitting(false);
// TODO: handle errors
throw error;
}
};
const handleAccentColorChange = (e) => {
e.preventDefault();
setValue("accentColor", e.target.dataset.colorname);
};
useEffect(() => {
register("accentColor");
}, [register]);
const formControlTopMargin = 2;
return (
<Modal
isOpen={isOpen}
onClose={onClose}
size="xl"
closeOnOverlayClick={false}
>
<ModalOverlay />
<ModalContent>
<ModalHeader>Configure</ModalHeader>
<ModalCloseButton />
<form id="configure-coindrop-form" onSubmit={handleSubmit(onSubmit)}>
<ModalBody>
<AvatarInput />
<FormControl
isRequired
mt={formControlTopMargin}
>
<FormLabel htmlFor="input-piggybankId">URL</FormLabel>
<EditUrlInput
register={register}
value={watchedPiggybankId}
/>
</FormControl>
<FormControl
mt={formControlTopMargin}
>
<FormLabel
htmlFor="input-accentColor"
>
Theme
</FormLabel>
<Flex wrap="wrap" justify="center">
{themeColorOptions.map(colorName => {
const isColorSelected = watchedAccentColor === colorName;
const accentColorInitial = colors[colorName][accentColorLevelInitial];
const accentColorHover = colors[colorName][accentColorLevelHover];
return (
<Box
key={colorName}
as="button"
bg={isColorSelected ? accentColorHover : accentColorInitial}
_hover={{
bg: accentColorHover,
}}
w="36px"
h="36px"
borderRadius="50%"
mx={1}
my={1}
onClick={handleAccentColorChange}
data-colorname={colorName}
>
{isColorSelected && (
<CheckIcon color="#FFF" />
)}
</Box>
);
})}
</Flex>
</FormControl>
<FormControl
isRequired
mt={formControlTopMargin}
>
<FormLabel
htmlFor="input-name"
>
Name
</FormLabel>
<Input
id="input-name"
name="name"
ref={register}
/>
</FormControl>
<FormControl
isRequired
mt={formControlTopMargin}
>
<FormLabel
htmlFor="input-verb"
>
Payment action name
</FormLabel>
<Select
id="input-verb"
name="verb"
ref={register}
>
<option value="pay">Pay</option>
<option value="donate to">Donate to</option>
<option value="support">Support</option>
<option value="tip">Tip</option>
</Select>
</FormControl>
<FormControl
mt={formControlTopMargin}
>
<FormLabel
htmlFor="input-website"
>
Website
</FormLabel>
<Input
id="input-website"
name="website"
ref={register}
placeholder="http://"
type="url"
/>
</FormControl>
<FormControl
mt={formControlTopMargin}
>
<FormLabel
htmlFor="input-paymentmethods"
>
Payment Methods
</FormLabel>
<PaymentMethodsInput
fields={fields}
control={control}
register={register}
remove={remove}
append={append}
fieldArrayName={paymentMethodsFieldArrayName}
/>
</FormControl>
</ModalBody>
<Flex
id="modal-footer"
justify="space-between"
m={6}
>
<DeleteButton
piggybankName={initialPiggybankId}
/>
<Flex>
<Button
variant="ghost"
onClick={onClose}
>
Cancel
</Button>
<Button
id="save-configuration-btn"
colorScheme="green"
mx={1}
type="submit"
isLoading={isSubmitting}
loadingText="Saving"
isDisabled={
(
!isDirty
&& !isAccentColorDirty // controlled accentColor field is not showing up in formState.dirtyFields
)
|| !isPiggybankIdAvailable
|| !initialPiggybankId
}
onClick={() => setIsAddressTouched(true)}
>
Save
</Button>
</Flex>
</Flex>
</form>
</ModalContent>
</Modal>
);
}
Example #25
Source File: PublicPiggybankPage.tsx From coindrop with GNU General Public License v3.0 | 4 votes |
PublicPiggybankPage: FunctionComponent = () => {
const { query: { piggybankName } } = useRouter();
const { piggybankDbData } = useContext(PublicPiggybankDataContext);
const theme = useTheme();
const { user } = useUser();
const { colorMode } = useColorMode();
const accentColorLevelInitial = getAccentColorLevelInitial(colorMode);
const accentColorLevelHover = getAccentColorLevelHover(colorMode);
const {
name,
website,
accentColor = "orange",
verb,
owner_uid,
} = piggybankDbData;
const accentColorInitial = theme.colors[accentColor][accentColorLevelInitial];
const accentColorHover = theme.colors[accentColor][accentColorLevelHover];
const pagePaymentMethodsDataEntries = Object.entries(piggybankDbData.paymentMethods ?? {});
const preferredAddresses = pagePaymentMethodsDataEntries.filter(([, paymentMethodData]: any) => paymentMethodData.isPreferred);
const otherAddresses = pagePaymentMethodsDataEntries.filter(([, paymentMethodData]: any) => !paymentMethodData.isPreferred);
const WrapGroup: FunctionComponent = ({ children }) => (
<Wrap
justify="center"
>
{children}
</Wrap>
);
type PaymentMethodButtonsFromEntriesProps = {
entries: PaymentMethodDbObjEntry[]
}
const PaymentMethodButtonsFromEntries: FunctionComponent<PaymentMethodButtonsFromEntriesProps> = ({ entries }) => (
<WrapGroup>
{entries
.sort(sortArrayByEntriesKeyAlphabetical)
.map(([paymentMethodId, paymentMethodData]) => (
<WrapItem key={paymentMethodId}>
<PaymentMethodButton
key={paymentMethodId}
paymentMethod={paymentMethodId}
paymentMethodValue={paymentMethodData.address}
isPreferred={paymentMethodData.isPreferred}
accentColor={accentColor}
/>
</WrapItem>
))}
</WrapGroup>
);
const piggybankExists = !!owner_uid;
const initialSetupComplete = name && accentColor && verb && pagePaymentMethodsDataEntries.length > 0;
return (
<>
<NextSeo
title={`${name ?? piggybankName}'s Coindrop (coindrop.to/${piggybankName})`}
description={`Send money to ${name} with no fees`}
/>
<Container
maxW={theme.breakpoints.lg}
mx="auto"
>
{user?.id
&& user.id === owner_uid
&& (
<>
<DataRefetcher />
<ManagePiggybankBar
editButtonOptions={
initialSetupComplete
? ({
text: 'Configure',
color: undefined,
icon: <SettingsIcon />,
}) : ({
text: 'Set up',
color: 'green',
icon: <SettingsIcon />,
})
}
initialSetupComplete={initialSetupComplete}
/>
</>
)}
{initialSetupComplete ? (
<Box
mb={6}
>
<Box
padding="10px"
my={2}
mx={3}
>
<Center>
<Avatar />
</Center>
<Heading textAlign="center">
Choose a payment method to
{` ${verb} `}
{website ? (
<Link href={website} target="_blank" rel="noreferrer">
<Heading
as="span"
color={accentColorInitial}
textDecoration="underline"
css={css`
&:hover {
color: ${accentColorHover};
}
`}
>
{name}
</Heading>
</Link>
) : (
<Heading
as="span"
color={accentColorInitial}
>
{name}
</Heading>
)}
:
</Heading>
</Box>
<PaymentMethodButtonsFromEntries
entries={preferredAddresses}
/>
<PaymentMethodButtonsFromEntries
entries={otherAddresses}
/>
<PoweredByCoindropLink />
</Box>
) : (
<Heading mt={4} textAlign="center">
{piggybankExists ? 'This Coindrop has not been set up yet.' : 'This Coindrop does not exist'}
{/* TODO: Include action buttons to log in or landing page */}
</Heading>
)}
</Container>
</>
);
}
Example #26
Source File: Navigation.tsx From bluebubbles-server with Apache License 2.0 | 4 votes |
MobileNav = ({ onOpen, onNotificationOpen, unreadCount, ...rest }: MobileProps) => {
const { colorMode, toggleColorMode } = useColorMode();
return (
<Flex
ml={{ base: 0, md: 60 }}
px={{ base: 4, md: 4 }}
height="20"
alignItems="center"
borderBottomWidth="1px"
borderBottomColor={useColorModeValue('gray.200', 'gray.700')}
justifyContent={{ base: 'space-between', md: 'flex-end' }}
{...rest}
>
<IconButton
display={{ base: 'flex', md: 'none' }}
onClick={onOpen}
variant="outline"
aria-label="open menu"
icon={<FiMenu />}
/>
<Text display={{ base: 'flex', md: 'none' }} fontSize="2xl" fontFamily="monospace" fontWeight="bold">
<img src={logo} className="logo-small" alt="logo" />
</Text>
<HStack spacing={{ base: '0', md: '1' }}>
<Tooltip label="Website Home" aria-label="website-tip">
<Link href="https://bluebubbles.app" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="website" icon={<AiOutlineHome />} />
</Link>
</Tooltip>
<Tooltip label="BlueBubbles Web" aria-label="website-tip">
<Link href="https://bluebubbles.app/web" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="bluebubbles web" icon={<FiMessageCircle />} />
</Link>
</Tooltip>
<Tooltip label="Sponsor Us" aria-label="sponsor-tip">
<Link href="https://github.com/sponsors/BlueBubblesApp" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="donate" icon={<AiOutlineHeart />} />
</Link>
</Tooltip>
<Tooltip label="Support Us" aria-label="donate-tip">
<Link href="https://bluebubbles.app/donate" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="donate" icon={<MdOutlineAttachMoney />} />
</Link>
</Tooltip>
<Tooltip label="Join our Discord" aria-label="discord-tip">
<Link href="https://discord.gg/yC4wr38" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="discord" icon={<FaDiscord />} />
</Link>
</Tooltip>
<Tooltip label="Read our Source Code" aria-label="github-tip">
<Link href="https://github.com/BlueBubblesApp" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="github" icon={<FiGithub />} />
</Link>
</Tooltip>
<Box position='relative' float='left'>
<IconButton
size="lg"
verticalAlign='middle'
zIndex={1}
variant="ghost"
aria-label="notifications"
icon={<FiBell />}
onClick={() => onNotificationOpen()}
/>
{(unreadCount > 0) ? (
<Badge
borderRadius='lg'
variant='solid'
colorScheme='red'
position='absolute'
margin={0}
top={1}
right={1}
zIndex={2}
>{unreadCount}</Badge>
) : null}
</Box>
<Spacer />
<Divider orientation="vertical" width={1} height={15} borderColor='gray' />
<Spacer />
<Spacer />
<Spacer />
<FormControl display='flex' alignItems='center'>
<Box mr={2}><MdOutlineDarkMode size={20} /></Box>
<Switch id='theme-mode-toggle' onChange={toggleColorMode} isChecked={colorMode === 'light'} />
<Box ml={2}><MdOutlineLightMode size={20} /></Box>
</FormControl>
</HStack>
</Flex>
);
}