theme-ui#IconButton TypeScript Examples
The following examples show how to use
theme-ui#IconButton.
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: LazyImageCarousel.tsx From nextjs-shopify with MIT License | 6 votes |
CustomDotGroup: FC<Omit<ImageCarouselProps, 'alt'>> = ({
images,
onThumbnailClick,
...imageProps
}) => {
return (
<div
sx={{
textAlign: 'center',
position: 'absolute',
left: '50%',
maxWidth: '100%',
overflow: 'auto',
display: 'flex',
bottom: 10,
transform: 'translatex(-50%)',
}}
>
{images.map((image, slide) => (
<IconButton
key={slide}
sx={{ height: 80, width: 80 }}
as="span"
onClick={() => onThumbnailClick?.(slide)}
>
<Dot slide={slide}>
<Image
src={image.src}
{...imageProps}
height={80}
width={80}
></Image>
</Dot>
</IconButton>
))}
</div>
)
}
Example #2
Source File: index.tsx From slice-machine with Apache License 2.0 | 6 votes |
SliceMachineIconButton: React.FunctionComponent<SliceMachineIconButtonProps> =
({
sx = null,
onClick = () => null,
label,
Icon,
error = null,
size = 18,
fitButton = false,
active = false,
useActive = false,
activeSx = defaultActiveSx,
...rest
}) => (
<IconButton
onClick={onClick}
aria-label={label}
type="button"
sx={{
...(fitButton ? { width: size, height: size } : null),
...(useActive && activeSx(active, error)),
...sx,
}}
{...rest}
>
<Icon size={size} />
</IconButton>
)
Example #3
Source File: CartItem.tsx From nextjs-shopify with MIT License | 4 votes |
CartItem = ({
item,
currencyCode,
}: {
item: /*ShopifyBuy.LineItem todo: check if updated types*/ any
currencyCode: string
}) => {
const updateItem = useUpdateItemQuantity()
const removeItem = useRemoveItemFromCart()
const [quantity, setQuantity] = useState(item.quantity)
const [removing, setRemoving] = useState(false)
const updateQuantity = async (quantity: number) => {
await updateItem(item.variant.id, quantity)
}
const handleQuantity = (e: ChangeEvent<HTMLInputElement>) => {
const val = Number(e.target.value)
if (Number.isInteger(val) && val >= 0) {
setQuantity(val)
}
}
const handleBlur = () => {
const val = Number(quantity)
if (val !== item.quantity) {
updateQuantity(val)
}
}
const increaseQuantity = (n = 1) => {
const val = Number(quantity) + n
if (Number.isInteger(val) && val >= 0) {
setQuantity(val)
updateQuantity(val)
}
}
const handleRemove = async () => {
setRemoving(true)
try {
// If this action succeeds then there's no need to do `setRemoving(true)`
// because the component will be removed from the view
await removeItem(item.variant.id)
} catch (error) {
console.error(error)
setRemoving(false)
}
}
useEffect(() => {
// Reset the quantity state if the item quantity changes
if (item.quantity !== Number(quantity)) {
setQuantity(item.quantity)
}
}, [item.quantity])
return (
<Grid gap={2} sx={{ width: '100%', m: 12 }} columns={[2]}>
<div
sx={{
padding: 1,
border: '1px solid gray',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
}}
>
<Image
height={130}
width={130}
unoptimized
alt={item.variant.image.altText}
src={item.variant.image.src}
/>
</div>
<div>
<Themed.div
as={Link}
href={`/product/${item.variant.product.handle}/`}
sx={{ fontSize: 3, m: 0, fontWeight: 700 }}
>
<>
{item.title}
<Text
sx={{
fontSize: 4,
fontWeight: 700,
display: 'block',
marginLeft: 'auto',
}}
>
{getPrice(
item.variant.priceV2.amount,
item.variant.priceV2.currencyCode || 'USD'
)}
</Text>
</>
</Themed.div>
<Themed.ul sx={{ mt: 2, mb: 0, padding: 0, listStyle: 'none' }}>
<li>
<div sx={{ display: 'flex', justifyItems: 'center' }}>
<IconButton onClick={() => increaseQuantity(-1)}>
<Minus width={18} height={18} />
</IconButton>
<label>
<Input
sx={{
height: '100%',
textAlign: 'center',
}}
type="number"
max={99}
min={0}
value={quantity}
onChange={handleQuantity}
onBlur={handleBlur}
/>
</label>
<IconButton onClick={() => increaseQuantity(1)}>
<Plus width={18} height={18} />
</IconButton>
</div>
</li>
{item.variant.selectedOptions.map((option: any) => (
<li key={option.value}>
{option.name}:{option.value}
</li>
))}
</Themed.ul>
</div>
</Grid>
)
}
Example #4
Source File: onboarding.tsx From slice-machine with Apache License 2.0 | 4 votes |
export default function Onboarding(): JSX.Element {
const STEPS = [
<WelcomeSlide onClick={nextSlide} />,
<BuildSlicesSlide />,
<CreatePageTypesSlide />,
<PushPagesSlide />,
];
const { finishOnboarding } = useSliceMachineActions();
const [state, setState] = useState({
step: 0,
});
handleTracking({
...state,
maxSteps: STEPS.length,
});
const finish = () => {
finishOnboarding();
// eslint-disable-next-line @typescript-eslint/no-floating-promises
router.push("/");
};
function nextSlide() {
if (state.step === STEPS.length - 1) return finish();
// eslint-disable-next-line @typescript-eslint/no-floating-promises
Tracker.get().trackOnboardingContinue(idFromStep(state.step));
return setState({ ...state, step: state.step + 1 });
}
function prevSlide() {
return setState({ ...state, step: state.step - 1 });
}
return (
<OnboardingGrid>
<Flex
sx={{
gridArea: "top-right",
alignItems: "center",
justifyContent: "end",
padding: "1em 4em",
}}
>
{!!state.step && (
<Button
variant="transparent"
onClick={finish}
data-cy="skip-onboarding"
title="skip onboarding"
tabIndex={0}
sx={{
color: "textClear",
}}
>
skip
</Button>
)}
</Flex>
{STEPS.map((Component, i) => (
<Flex
hidden={i !== state.step}
key={`step-${i + 1}`}
sx={{
gridArea: "content",
alignItems: "center",
justifyContent: "center",
alignContent: "center",
flexDirection: "column",
opacity: i === state.step ? "1" : "0",
pointerEvents: i === state.step ? "all" : "none",
transition: `opacity .2s ease-in`,
}}
>
{Component}
</Flex>
))}
<Flex
sx={{
gridArea: "footer",
alignItems: "start",
justifyContent: "center",
padingTop: "16px", // half height of a button
}}
>
{!!state.step && (
<StepIndicator current={state.step - 1} maxSteps={STEPS.length - 1} />
)}
</Flex>
<Flex
sx={{
gridArea: "footer-left",
alignItems: "start",
justifyContent: "space-around",
}}
>
{state.step >= 2 && (
<IconButton
tabIndex={0}
title="previous slide"
sx={{
width: "40px",
height: "40px",
borderRadius: "50%",
background: "#F1F1F4",
border: "1px solid rgba(62, 62, 72, 0.15)",
}}
onClick={prevSlide}
>
<BiChevronLeft />
</IconButton>
)}
</Flex>
<Flex
sx={{
gridArea: "footer-right",
alignItems: "start",
justifyContent: "end",
padding: "0em 4em",
}}
>
{!!state.step && (
<Button
data-cy="continue"
onClick={nextSlide}
title="continue"
tabIndex={0}
>
Continue
</Button>
)}
</Flex>
</OnboardingGrid>
);
}