{"version":3,"file":"NavLink.cjs","sources":["../../../src/components/NavLink/NavLink.tsx"],"sourcesContent":["import { useUncontrolled } from '@raikou/hooks';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getSpacing,\n  polymorphicFactory,\n  PolymorphicFactory,\n  RaikouColor,\n  RaikouSize,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { AccordionChevron } from '../Accordion';\nimport { Collapse } from '../Collapse';\nimport { UnstyledButton } from '../UnstyledButton';\nimport {\n  NavLinkBodyStyle,\n  NavLinkChevronStyle,\n  NavLinkChildrenStyle,\n  NavLinkDescriptionStyle,\n  NavLinkLabelStyle,\n  NavLinkRootStyle,\n  NavLinkSectionStyle,\n} from './NavLink.css';\n\nexport type NavLinkStylesNames =\n  | 'root'\n  | 'section'\n  | 'body'\n  | 'label'\n  | 'description'\n  | 'chevron'\n  | 'collapse'\n  | 'children';\nexport type NavLinkVariant = 'filled' | 'light' | 'subtle';\nexport type NavLinkCssVariables = {\n  root: '--nl-color' | '--nl-bg' | '--nl-hover';\n  children: '--nl-offset';\n};\n\nexport interface NavLinkProps extends BoxProps, StylesApiProps<NavLinkFactory> {\n  /** Main link label */\n  label?: React.ReactNode;\n\n  /** Link description, displayed below the label */\n  description?: React.ReactNode;\n\n  /** Section displayed on the left side of the label */\n  leftSection?: React.ReactNode;\n\n  /** Section displayed on the right side of the label */\n  rightSection?: React.ReactNode;\n\n  /** Determines whether the link should have active styles, `false` by default */\n  active?: boolean;\n\n  /** Key of `theme.colors` of any valid CSS color to control active styles, `theme.primaryColor` by default */\n  color?: RaikouColor;\n\n  /** If set, label and description will not wrap to the next line, `false` by default */\n  noWrap?: boolean;\n\n  /** Child `NavLink` components */\n  children?: React.ReactNode;\n\n  /** Controlled nested items collapse state */\n  opened?: boolean;\n\n  /** Uncontrolled nested items collapse initial state */\n  defaultOpened?: boolean;\n\n  /** Called when open state changes */\n  onChange?: (opened: boolean) => void;\n\n  /** If set, right section will not be rotated when collapse is opened, `false` by default */\n  disableRightSectionRotation?: boolean;\n\n  /** Key of `theme.spacing` or any valid CSS value to set collapsed links `padding-left`, `'lg'` by default */\n  childrenOffset?: RaikouSize | (string & {}) | number;\n\n  /** If set, disabled styles will be added to the root element, `false` by default */\n  disabled?: boolean;\n\n  /** Called when the link is clicked */\n  onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;\n\n  /** Link `onkeydown` event */\n  onKeyDown?: (event: React.KeyboardEvent<HTMLAnchorElement>) => void;\n\n  /** Determines whether button text color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n}\n\nexport type NavLinkFactory = PolymorphicFactory<{\n  props: NavLinkProps;\n  defaultRef: HTMLAnchorElement;\n  defaultComponent: 'a';\n  stylesNames: NavLinkStylesNames;\n  vars: NavLinkCssVariables;\n  variant: NavLinkVariant;\n}>;\n\nconst defaultProps: Partial<NavLinkProps> = {};\n\nconst varsResolver = createVarsResolver<NavLinkFactory>(\n  (theme, { variant, color, childrenOffset, autoContrast }) => {\n    const colors = theme.variantColorResolver({\n      color: color || theme.primaryColor,\n      theme,\n      variant: variant || 'light',\n      autoContrast,\n    });\n\n    return {\n      root: {\n        '--nl-bg': color || variant ? colors.background : undefined,\n        '--nl-hover': color || variant ? colors.hover : undefined,\n        '--nl-color': color || variant ? colors.color : undefined,\n      },\n\n      children: {\n        '--nl-offset': getSpacing(childrenOffset),\n      },\n    };\n  }\n);\n\nexport const NavLink = polymorphicFactory<NavLinkFactory>((_props, ref) => {\n  const props = useProps('NavLink', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    opened,\n    defaultOpened,\n    onChange,\n    children,\n    onClick,\n    active,\n    disabled,\n    leftSection,\n    rightSection,\n    label,\n    description,\n    disableRightSectionRotation,\n    noWrap,\n    childrenOffset,\n    onKeyDown,\n    autoContrast,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<NavLinkFactory>({\n    name: 'NavLink',\n    props,\n    classes: {\n      root: NavLinkRootStyle,\n      section: NavLinkSectionStyle,\n      body: NavLinkBodyStyle,\n      label: NavLinkLabelStyle,\n      description: NavLinkDescriptionStyle,\n      chevron: NavLinkChevronStyle,\n      children: NavLinkChildrenStyle,\n    },\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const [_opened, setOpened] = useUncontrolled({\n    value: opened,\n    defaultValue: defaultOpened,\n    finalValue: false,\n    onChange,\n  });\n\n  const withChildren = !!children;\n\n  const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n    onClick?.(event);\n\n    if (withChildren) {\n      event.preventDefault();\n      setOpened(!_opened);\n    }\n  };\n\n  return (\n    <>\n      <UnstyledButton\n        {...getStyles('root')}\n        component=\"a\"\n        ref={ref}\n        onClick={handleClick}\n        onKeyDown={(event) => {\n          onKeyDown?.(event);\n\n          if (event.nativeEvent.code === 'Space' && withChildren) {\n            event.preventDefault();\n            setOpened(!_opened);\n          }\n        }}\n        unstyled={unstyled}\n        mod={[{ disabled, active, expanded: _opened }, mod]}\n        {...others}\n      >\n        {leftSection && (\n          <Box component=\"span\" {...getStyles('section')} mod={{ position: 'left' }}>\n            {leftSection}\n          </Box>\n        )}\n        <Box {...getStyles('body')} mod={{ 'no-wrap': noWrap }}>\n          <Box component=\"span\" {...getStyles('label')}>\n            {label}\n          </Box>\n          <Box component=\"span\" mod={{ active }} {...getStyles('description')}>\n            {description}\n          </Box>\n        </Box>\n        {(withChildren || rightSection) && (\n          <Box\n            {...getStyles('section')}\n            component=\"span\"\n            mod={{ rotate: _opened && !disableRightSectionRotation, position: 'right' }}\n          >\n            {withChildren\n              ? rightSection || <AccordionChevron {...getStyles('chevron')} />\n              : rightSection}\n          </Box>\n        )}\n      </UnstyledButton>\n      <Collapse in={_opened} {...getStyles('collapse')}>\n        <div {...getStyles('children')}>{children}</div>\n      </Collapse>\n    </>\n  );\n});\n\nNavLink.displayName = '@raikou/core/NavLink';\n"],"names":["createVarsResolver","getSpacing","polymorphicFactory","useProps","useStyles","NavLinkRootStyle","NavLinkSectionStyle","NavLinkBodyStyle","NavLinkLabelStyle","NavLinkDescriptionStyle","NavLinkChevronStyle","NavLinkChildrenStyle","useUncontrolled","jsxs","Fragment","UnstyledButton","jsx","Box","AccordionChevron","Collapse"],"mappings":"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"}