UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

1 lines 7.43 kB
{"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"}