import * as ContextMenu from '@radix-ui/react-context-menu' import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import * as RadioGroup from '@radix-ui/react-radio-group' import * as Panel from './panel' import styled from 'styles' import React, { forwardRef } from 'react' import { CheckIcon, ChevronRightIcon } from '@radix-ui/react-icons' import { isMobile } from 'utils' export const breakpoints: any = { '@initial': 'mobile', '@sm': 'small' } export const IconButton = styled('button', { position: 'relative', height: '32px', width: '32px', backgroundColor: '$panel', borderRadius: '4px', padding: '0', margin: '0', display: 'grid', alignItems: 'center', justifyContent: 'center', outline: 'none', border: 'none', pointerEvents: 'all', fontSize: '$0', color: '$text', cursor: 'pointer', '& > *': { gridRow: 1, gridColumn: 1, }, '&:disabled': { opacity: '0.5', }, '& > span': { width: '100%', height: '100%', display: 'flex', alignItems: 'center', }, variants: { bp: { mobile: { backgroundColor: 'transparent', }, small: { '&:hover:not(:disabled)': { backgroundColor: '$hover', }, }, }, size: { small: { height: 32, width: 32, '& svg:nth-of-type(1)': { height: '16px', width: '16px', }, }, medium: { height: 44, width: 44, '& svg:nth-of-type(1)': { height: '18px', width: '18px', }, }, large: { height: 44, width: 44, '& svg:nth-of-type(1)': { height: '20px', width: '20px', }, }, }, isActive: { true: { color: '$selected', }, }, }, }) export const RowButton = styled('button', { position: 'relative', display: 'flex', width: '100%', background: 'none', height: '32px', border: 'none', cursor: 'pointer', color: '$text', outline: 'none', alignItems: 'center', fontFamily: '$ui', fontWeight: 400, fontSize: '$1', justifyContent: 'space-between', padding: '4px 8px 4px 12px', borderRadius: 4, '& label': { fontWeight: '$1', margin: 0, padding: 0, }, '& svg': { position: 'relative', stroke: '$overlay', strokeWidth: 1, zIndex: 1, }, '&:disabled': { opacity: 0.1, }, variants: { bp: { mobile: {}, small: { '& *[data-shy="true"]': { opacity: 0, }, '&:hover:not(:disabled)': { backgroundColor: '$hover', '& *[data-shy="true"]': { opacity: 1, }, }, }, }, size: { icon: { padding: '4px ', width: 'auto', }, }, variant: { pageButton: { display: 'grid', gridTemplateColumns: '24px auto', width: '100%', paddingLeft: '$1', gap: '$3', justifyContent: 'flex-start', [`& > *[data-state="checked"]`]: { gridRow: 1, gridColumn: 1, }, '& > span': { gridRow: 1, gridColumn: 2, width: '100%', }, }, }, disabled: { true: { opacity: 0.3, }, }, isActive: { true: { backgroundColor: '$hover', }, }, }, }) export const StylePanelRoot = styled(Panel.Root, { minWidth: 1, width: 184, maxWidth: 184, overflow: 'hidden', position: 'relative', border: '1px solid $panel', boxShadow: '$4', variants: { isOpen: { true: {}, false: { padding: '$0', height: 38, width: 38, }, }, }, }) export const Group = styled(RadioGroup.Root, { display: 'flex', }) export const Item = styled('button', { height: '32px', width: '32px', backgroundColor: '$panel', borderRadius: '4px', padding: '0', margin: '0', display: 'flex', alignItems: 'center', justifyContent: 'center', outline: 'none', border: 'none', pointerEvents: 'all', cursor: 'pointer', '&:focus': { backgroundColor: '$hover', }, '&:hover:not(:disabled)': { backgroundColor: '$hover', }, '&:disabled': { opacity: '0.5', }, variants: { isActive: { true: { '& svg': { fill: '$text', stroke: '$text', }, }, false: { '& svg': { fill: '$inactive', stroke: '$inactive', }, }, }, }, }) export const ShortcutKey = styled('span', { fontSize: '$0', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center', boxShadow: '1px 1px 0px rgba(0,0,0,.5)', }) export const IconWrapper = styled('div', { height: '100%', borderRadius: '4px', marginRight: '1px', display: 'grid', alignItems: 'center', justifyContent: 'center', outline: 'none', border: 'none', pointerEvents: 'all', cursor: 'pointer', color: '$text', '& svg': { height: 22, width: 22, strokeWidth: 1, }, '& > *': { gridRow: 1, gridColumn: 1, }, variants: { size: { small: { '& svg': { height: '16px', width: '16px', }, }, medium: { '& svg': { height: '22px', width: '22px', }, }, }, }, }) export const DropdownContent = styled(DropdownMenu.Content, { display: 'grid', padding: 4, gridTemplateColumns: 'repeat(4, 1fr)', backgroundColor: '$panel', borderRadius: 4, border: '1px solid $panel', boxShadow: '$4', variants: { direction: { vertical: { gridTemplateColumns: '1fr', }, }, }, }) export function DashSolidIcon(): JSX.Element { return ( ) } export function DashDashedIcon(): JSX.Element { return ( ) } const dottedDasharray = `${50.26548 * 0.025} ${50.26548 * 0.1}` export function DashDottedIcon(): JSX.Element { return ( ) } export function DashDrawIcon(): JSX.Element { return ( ) } export function BoxIcon({ fill = 'none', stroke = 'currentColor', }: { fill?: string stroke?: string }): JSX.Element { return ( ) } export const IsFilledFillIcon = forwardRef( (props, ref) => { return ( ) } ) export const ButtonsRow = styled('div', { position: 'relative', display: 'flex', width: '100%', background: 'none', border: 'none', cursor: 'pointer', outline: 'none', alignItems: 'center', justifyContent: 'flex-start', padding: 0, }) export const VerticalDivider = styled('hr', { width: '1px', margin: '-2px 3px', border: 'none', backgroundColor: '$brushFill', }) export const FloatingContainer = styled('div', { backgroundColor: '$panel', border: '1px solid $panel', borderRadius: '4px', boxShadow: '$4', display: 'flex', height: 'fit-content', padding: '$0', pointerEvents: 'all', position: 'relative', userSelect: 'none', zIndex: 200, variants: { direction: { row: { flexDirection: 'row', }, column: { flexDirection: 'column', }, }, elevation: { 0: { boxShadow: 'none', }, 2: { boxShadow: '$2', }, 3: { boxShadow: '$3', }, 4: { boxShadow: '$4', }, }, }, }) export const StyledKbd = styled('kbd', { marginLeft: '32px', fontSize: '$1', fontFamily: '$ui', fontWeight: 400, '& > span': { display: 'inline-block', width: '12px', }, }) export function Kbd({ children }: { children: React.ReactNode }): JSX.Element { if (isMobile()) return null return {children} } /* -------------------------------------------------- */ /* Menus */ /* -------------------------------------------------- */ export const MenuContent = styled('div', { position: 'relative', backgroundColor: '$panel', borderRadius: '4px', overflow: 'hidden', pointerEvents: 'all', userSelect: 'none', zIndex: 180, border: '1px solid $panel', padding: '$0', boxShadow: '$4', minWidth: 180, font: '$ui', }) export const Divider = styled('div', { backgroundColor: '$hover', height: 1, marginTop: '$2', marginRight: '-$2', marginBottom: '$2', marginLeft: '-$2', }) /* -------------------------------------------------- */ /* Dropdown Menu */ /* -------------------------------------------------- */ export function DropdownMenuRoot({ isOpen, onOpenChange, children, }: { isOpen?: boolean onOpenChange?: (isOpen: boolean) => void children: React.ReactNode }): JSX.Element { return ( {children} ) } export function DropdownMenuSubMenu({ children, disabled = false, label, }: { label: string disabled?: boolean children: React.ReactNode }): JSX.Element { return ( {label} {children} ) } export const DropdownMenuDivider = styled(DropdownMenu.Separator, { backgroundColor: '$hover', height: 1, marginTop: '$2', marginRight: '-$2', marginBottom: '$2', marginLeft: '-$2', }) export const DropdownMenuArrow = styled(DropdownMenu.Arrow, { fill: '$panel', }) export function DropdownMenuButton({ onSelect, children, disabled = false, }: { onSelect?: () => void disabled?: boolean children: React.ReactNode }): JSX.Element { return ( {children} ) } interface DropdownMenuIconButtonProps { onSelect: () => void disabled?: boolean children: React.ReactNode } export function DropdownMenuIconButton({ onSelect, children, disabled = false, }: DropdownMenuIconButtonProps): JSX.Element { return ( {children} ) } interface MenuCheckboxItemProps { checked: boolean disabled?: boolean onCheckedChange: (isChecked: boolean) => void children: React.ReactNode } export function DropdownMenuCheckboxItem({ checked, disabled = false, onCheckedChange, children, }: MenuCheckboxItemProps): JSX.Element { return ( {children} ) } /* -------------------------------------------------- */ /* Context Menu */ /* -------------------------------------------------- */ export function ContextMenuRoot({ onOpenChange, children, }: { onOpenChange?: (isOpen: boolean) => void children: React.ReactNode }): JSX.Element { return ( {children} ) } export function ContextMenuSubMenu({ children, label, }: { label: string children: React.ReactNode }): JSX.Element { return ( {label} {children} ) } export const ContextMenuDivider = styled(ContextMenu.Separator, { backgroundColor: '$hover', height: 1, margin: '$2 -$2', }) export const ContextMenuArrow = styled(ContextMenu.Arrow, { fill: '$panel', }) export function ContextMenuButton({ onSelect, children, disabled = false, }: { onSelect?: () => void disabled?: boolean children: React.ReactNode }): JSX.Element { return ( {children} ) } export function ContextMenuIconButton({ onSelect, children, disabled = false, }: { onSelect: () => void disabled?: boolean children: React.ReactNode }): JSX.Element { return ( {children} ) } export function ContextMenuCheckboxItem({ checked, disabled = false, onCheckedChange, children, }: MenuCheckboxItemProps): JSX.Element { return ( {children} ) }