{"version":3,"file":"TableOfContents.cjs","names":["createVarsResolver","getFontSize","rem","getRadius","factory","useProps","useStyles","noop","UnstyledButton","Box","classes"],"sources":["../../../src/components/TableOfContents/TableOfContents.tsx"],"sourcesContent":["import {\n  assignRef,\n  useId,\n  useScrollSpy,\n  UseScrollSpyHeadingData,\n  UseScrollSpyOptions,\n} from '@mantine/hooks';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getFontSize,\n  getRadius,\n  MantineColor,\n  MantineRadius,\n  MantineSize,\n  noop,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { UnstyledButton, UnstyledButtonProps } from '../UnstyledButton';\nimport classes from './TableOfContents.module.css';\n\nexport type TableOfContentsStylesNames = 'root' | 'control';\nexport type TableOfContentsVariant = 'filled' | 'light' | 'none';\nexport type TableOfContentsCssVariables = {\n  root: '--toc-bg' | '--toc-color' | '--toc-size' | '--toc-depth-offset' | '--toc-radius';\n};\n\nexport interface InitialTableOfContentsData {\n  /** Heading depth, 1-6 */\n  depth: number;\n\n  /** Heading text content value */\n  value: string;\n\n  /** Heading id, must be unique, used as `key` */\n  id?: string;\n}\n\nexport interface TableOfContentsGetControlPropsPayload {\n  /** True if the associated heading is currently the best match in the viewport */\n  active: boolean;\n\n  /** Data passed down from `use-scroll-spy` hook: depth, id, value */\n  data: UseScrollSpyHeadingData;\n}\n\nexport interface TableOfContentsProps\n  extends BoxProps, StylesApiProps<TableOfContentsFactory>, ElementProps<'div'> {\n  /** Key of `theme.colors` or any valid CSS color value @default theme.primaryColor */\n  color?: MantineColor;\n\n  /** Controls font-size and padding of all elements @default 'md' */\n  size?: MantineSize | (string & {}) | number;\n\n  /** If set, adjusts text color based on background color for `filled` variant */\n  autoContrast?: boolean;\n\n  /** Options passed down to `use-scroll-spy` hook */\n  scrollSpyOptions?: UseScrollSpyOptions;\n\n  /** Data used to render content until actual values are retrieved from the DOM */\n  initialData?: InitialTableOfContentsData[];\n\n  /** A function to pass props down to controls, accepts values from `use-scroll-spy` hook as an argument and active state. */\n  getControlProps?: (\n    payload: TableOfContentsGetControlPropsPayload\n  ) => UnstyledButtonProps & ElementProps<'button'> & Record<`data-${string}`, any>;\n\n  /** Minimum `depth` value that requires offset, `1` by default */\n  minDepthToOffset?: number;\n\n  /** Controls padding on the left side of control, multiplied by (`depth` - `minDepthToOffset`), `20px` by default  */\n  depthOffset?: number | string;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n  radius?: MantineRadius;\n\n  /** A function to reinitialize headings from `use-scroll-spy` hook */\n  reinitializeRef?: React.RefObject<() => void>;\n}\n\nexport type TableOfContentsFactory = Factory<{\n  props: TableOfContentsProps;\n  ref: HTMLDivElement;\n  stylesNames: TableOfContentsStylesNames;\n  vars: TableOfContentsCssVariables;\n  variant: TableOfContentsVariant;\n}>;\n\nconst defaultProps = {\n  getControlProps: ({ data }) => ({\n    children: data.value,\n  }),\n} satisfies Partial<TableOfContentsProps>;\n\nconst varsResolver = createVarsResolver<TableOfContentsFactory>(\n  (theme, { color, size, variant, autoContrast, depthOffset, radius }) => {\n    const colors = theme.variantColorResolver({\n      color: color || theme.primaryColor,\n      theme,\n      variant: variant || 'filled',\n      autoContrast,\n    });\n\n    return {\n      root: {\n        '--toc-bg': variant !== 'none' ? colors.background : undefined,\n        '--toc-color': variant !== 'none' ? colors.color : undefined,\n        '--toc-size': getFontSize(size),\n        '--toc-depth-offset': rem(depthOffset),\n        '--toc-radius': getRadius(radius),\n      },\n    };\n  }\n);\n\nexport const TableOfContents = factory<TableOfContentsFactory>((_props) => {\n  const props = useProps('TableOfContents', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    color,\n    autoContrast,\n    scrollSpyOptions,\n    initialData,\n    getControlProps,\n    minDepthToOffset,\n    depthOffset,\n    variant,\n    radius,\n    reinitializeRef,\n    attributes,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<TableOfContentsFactory>({\n    name: 'TableOfContents',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    varsResolver,\n  });\n\n  const idBase = useId();\n  const spy = useScrollSpy(scrollSpyOptions);\n\n  assignRef(reinitializeRef, spy.reinitialize);\n\n  const headingsData = (\n    spy.initialized ? spy.data : initialData || []\n  ) as UseScrollSpyHeadingData[];\n\n  const controls = headingsData.map((data, index) => {\n    const controlProps = getControlProps?.({\n      active: index === spy.active,\n      data: { ...data, getNode: data.getNode || noop },\n    });\n\n    return (\n      <UnstyledButton\n        key={data.id || `${idBase}-${index}`}\n        __vars={{ '--depth-offset': `${data.depth - (minDepthToOffset || 1)}` }}\n        data-active={index === spy.active || undefined}\n        variant={variant}\n        {...controlProps}\n        {...getStyles('control', {\n          className: controlProps?.className,\n          style: controlProps?.style,\n        })}\n      />\n    );\n  });\n\n  return (\n    <Box variant={variant} {...getStyles('root')} {...others}>\n      {controls}\n    </Box>\n  );\n});\n\nTableOfContents.displayName = '@mantine/core/TableOfContents';\nTableOfContents.classes = classes;\nTableOfContents.varsResolver = varsResolver;\n"],"mappings":";;;;;;;;;;;;;;;AAgGA,MAAM,eAAe,EACnB,kBAAkB,EAAE,YAAY,EAC9B,UAAU,KAAK,OAChB,GACF;AAED,MAAM,eAAeA,6BAAAA,oBAClB,OAAO,EAAE,OAAO,MAAM,SAAS,cAAc,aAAa,aAAa;CACtE,MAAM,SAAS,MAAM,qBAAqB;EACxC,OAAO,SAAS,MAAM;EACtB;EACA,SAAS,WAAW;EACpB;EACD,CAAC;AAEF,QAAO,EACL,MAAM;EACJ,YAAY,YAAY,SAAS,OAAO,aAAa,KAAA;EACrD,eAAe,YAAY,SAAS,OAAO,QAAQ,KAAA;EACnD,cAAcC,iBAAAA,YAAY,KAAK;EAC/B,sBAAsBC,YAAAA,IAAI,YAAY;EACtC,gBAAgBC,iBAAAA,UAAU,OAAO;EAClC,EACF;EAEJ;AAED,MAAa,kBAAkBC,gBAAAA,SAAiC,WAAW;CACzE,MAAM,QAAQC,kBAAAA,SAAS,mBAAmB,cAAc,OAAO;CAC/D,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,OACA,cACA,kBACA,aACA,iBACA,kBACA,aACA,SACA,QACA,iBACA,YACA,GAAG,WACD;CAEJ,MAAM,YAAYC,mBAAAA,UAAkC;EAClD,MAAM;EACN,SAAA,+BAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,UAAA,GAAA,eAAA,QAAgB;CACtB,MAAM,OAAA,GAAA,eAAA,cAAmB,iBAAiB;AAE1C,EAAA,GAAA,eAAA,WAAU,iBAAiB,IAAI,aAAa;CAM5C,MAAM,YAHJ,IAAI,cAAc,IAAI,OAAO,eAAe,EAAE,EAGlB,KAAK,MAAM,UAAU;EACjD,MAAM,eAAe,kBAAkB;GACrC,QAAQ,UAAU,IAAI;GACtB,MAAM;IAAE,GAAG;IAAM,SAAS,KAAK,WAAWC,aAAAA;IAAM;GACjD,CAAC;AAEF,SACE,iBAAA,GAAA,kBAAA,KAACC,uBAAAA,gBAAD;GAEE,QAAQ,EAAE,kBAAkB,GAAG,KAAK,SAAS,oBAAoB,MAAM;GACvE,eAAa,UAAU,IAAI,UAAU,KAAA;GAC5B;GACT,GAAI;GACJ,GAAI,UAAU,WAAW;IACvB,WAAW,cAAc;IACzB,OAAO,cAAc;IACtB,CAAC;GACF,EATK,KAAK,MAAM,GAAG,OAAO,GAAG,QAS7B;GAEJ;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EAAc;EAAS,GAAI,UAAU,OAAO;EAAE,GAAI;YAC/C;EACG,CAAA;EAER;AAEF,gBAAgB,cAAc;AAC9B,gBAAgB,UAAUC,+BAAAA;AAC1B,gBAAgB,eAAe"}