@mintlify/msft-sdk 1.1.51 → 1.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-playground/EndpointFields/ParamFields/PrimitiveParamField/index.js +2 -3
- package/dist/api-playground/EndpointFields/ParamFields/PrimitiveParamField/index.js.map +1 -1
- package/dist/components/content-components/callouts.js +2 -2
- package/dist/components/content-components/callouts.js.map +1 -1
- package/dist/components/content-components/code-block.js +42 -42
- package/dist/components/content-components/code-block.js.map +1 -1
- package/dist/components/content-components/code-group.js +25 -25
- package/dist/components/content-components/code-group.js.map +1 -1
- package/dist/components/content-components/table/index.js +2 -2
- package/dist/components/content-components/table/index.js.map +1 -1
- package/dist/components/content-components/tabs/tabs.js +18 -18
- package/dist/components/content-components/tabs/tabs.js.map +1 -1
- package/dist/components/nav-tree/index.js +122 -112
- package/dist/components/nav-tree/index.js.map +1 -1
- package/dist/components/toc/index.js +64 -55
- package/dist/components/toc/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/generate-llms-txt.js +3 -3
- package/dist/utils/generate-llms-txt.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/nav-tree/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\n\nimport { useComponents } from '../../context/components-context';\nimport '../../styles.css';\nimport type { NavItem, NavTreeData, AnchorConfig } from '../../types';\nimport { cn } from '../../utils/cn';\nimport { MethodPill } from '../Api/MethodPill';\n\nexport { MobileNavTree } from './mobile-nav';\nexport type { MobileNavTreeProps } from './mobile-nav';\nexport type { AnchorConfig } from '../../types';\n\nexport interface BottomLinkConfig {\n href?: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n component?: React.ReactNode;\n}\n\ninterface NavTreeProps {\n navTree: NavTreeData;\n activeId?: string;\n className?: string;\n activeHref?: string;\n theme?: 'light' | 'dark' | 'system';\n bottomLinks?: BottomLinkConfig[];\n anchors?: AnchorConfig[];\n}\n\ninterface TreeItemProps {\n item: NavItem;\n activeId?: string;\n level?: number;\n activeHref?: string;\n}\n\nfunction ChevronIcon({ isExpanded }: { isExpanded: boolean }) {\n return (\n <svg\n className={cn(\n 'mint:w-[12px] mint:h-[12px] mint:shrink-0 mint:text-[#707070] mint:dark:text-[#999999]',\n isExpanded ? 'mint:rotate-90' : 'mint:rotate-0'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\nconst ACTIVE_ITEM_CLASSES =\n 'mint:bg-[#e6e6e6] mint:dark:bg-[#2e2e2e] mint:text-[#242424] mint:dark:text-[#ffffff] mint:font';\n\nfunction TreeItemComponent({ item, activeId, level = 0, activeHref }: TreeItemProps) {\n const hasChildren = item.children && item.children.length > 0;\n\n const normalizeHref = (href?: string): string => {\n if (!href) return '';\n const normalized = href.startsWith('/') ? href : `/${href}`;\n return normalized;\n };\n\n const compareHrefs = (href1?: string, href2?: string): boolean => {\n if (!href1 || !href2) return false;\n const norm1 = normalizeHref(href1);\n const norm2 = normalizeHref(href2);\n return (\n norm1 === norm2 ||\n norm1.replace('/docs/', '/') === norm2.replace('/docs/', '/') ||\n norm1 === norm2.replace('/docs/', '/') ||\n norm1.replace('/docs/', '/') === norm2\n );\n };\n\n const hasActiveChild = (navItem: NavItem): boolean => {\n if (compareHrefs(navItem.href, activeHref)) return true;\n if (navItem.children) {\n return navItem.children.some(hasActiveChild);\n }\n return false;\n };\n\n const shouldBeExpanded =\n level === 0 ? true : (item.expanded ?? false) || (hasChildren && hasActiveChild(item));\n const [isExpanded, setIsExpanded] = useState(shouldBeExpanded);\n\n useEffect(() => {\n if (hasChildren && hasActiveChild(item)) {\n setIsExpanded(true);\n }\n }, [activeHref]);\n\n const { LinkComponent } = useComponents();\n const isGroup = !item.href;\n const isActive =\n item.href && (compareHrefs(item.href, activeId) || compareHrefs(item.href, activeHref));\n const Icon = item.icon;\n\n if (isGroup && level === 0) {\n return (\n <div id=\"nav-group\" role=\"group\" aria-label={item.toc_title}>\n <div className=\"mint:text-sm mint:text-[#242424] mint:dark:text-[#ffffff] mint:mb-2 mint:flex mint:items-start mint:gap-2 mint:pl-3\">\n {Icon && <Icon className=\"mint:w-5 mint:h-5\" aria-hidden=\"true\" />}\n <span>{item.toc_title}</span>\n </div>\n {hasChildren && item.children && (\n <ul className=\"mint:flex mint:flex-col mint:pl-0 mint:mt-0 mint:gap-0.5\" role=\"list\">\n {item.children.map((child, index) => (\n <TreeItemComponent\n key={`${child.href}-${index}`}\n item={child}\n activeId={activeId}\n level={level + 1}\n activeHref={activeHref}\n />\n ))}\n </ul>\n )}\n </div>\n );\n }\n\n if (isGroup && level > 0) {\n return (\n <li className=\"mint:list-none\">\n <button\n id=\"nav-group-toggle\"\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${item.toc_title} section`}\n className=\"mint:relative mint:text-left mint:w-full mint:flex mint:items-center mint:justify-between mint:py-2 mint:px-3 mint:text-sm mint:rounded-lg mint:bg-transparent mint:border-none mint:cursor-pointer mint:text-[#707070] mint:dark:text-[#999999] mint:hover:bg-[rgba(0,0,0,0.06)] mint:hover:text-[#242424] mint:dark:hover:bg-[rgba(128,128,128,0.05)] mint:dark:hover:text-[#ffffff] mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2\"\n >\n <span className=\"mint:flex-1 mint:min-w-0\">{item.toc_title}</span>\n <ChevronIcon isExpanded={!!isExpanded} />\n </button>\n {hasChildren && isExpanded && item.children && (\n <ul\n className=\"mint:ml-3 mint:flex mint:flex-col mint:pl-0 mint:mt-0 mint:gap-0.5\"\n role=\"group\"\n >\n {item.children.map((child, index) => (\n <TreeItemComponent\n key={`${child.href}-${index}`}\n item={child}\n activeId={activeId}\n level={level + 1}\n activeHref={activeHref}\n />\n ))}\n </ul>\n )}\n </li>\n );\n }\n\n const LinkElement = LinkComponent || 'a';\n\n if (hasChildren) {\n return (\n <li className=\"mint:list-none\">\n <button\n id=\"nav-item-toggle\"\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${item.toc_title} section`}\n className={cn(\n 'mint:font-aptos mint:relative mint:text-left mint:w-full mint:flex mint:items-center mint:justify-between mint:gap-2 mint:py-2 mint:px-3 mint:text-[14px] mint:font-normal mint:rounded-xl mint:bg-transparent mint:border-none mint:cursor-pointer mint:text-[#707070] mint:dark:text-[#999999] mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2',\n isActive\n ? ACTIVE_ITEM_CLASSES\n : 'mint:hover:bg-[rgba(0,0,0,0.06)] mint:hover:text-[#242424] mint:dark:hover:bg-[rgba(128,128,128,0.05)] mint:dark:hover:text-[#ffffff]'\n )}\n >\n <span className=\"mint:flex-1 mint:min-w-0 mint:font-aptos\">{item.toc_title}</span>\n <ChevronIcon isExpanded={!!isExpanded} />\n </button>\n {isExpanded && item.children && (\n <ul\n className=\"mint:ml-3 mint:flex mint:flex-col mint:pl-0 mint:mt-0 mint:gap-0.5\"\n role=\"group\"\n >\n {item.children.map((child, index) => (\n <TreeItemComponent\n key={`${child.href}-${index}`}\n item={child}\n activeId={activeId}\n level={level + 1}\n activeHref={activeHref}\n />\n ))}\n </ul>\n )}\n </li>\n );\n }\n\n return (\n <li className=\"mint:list-none\">\n <LinkElement\n id=\"nav-item\"\n href={item.href}\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'mint:relative mint:flex mint:items-center mint:gap-2 mint:py-2 mint:px-3 mint:text-[14px] mint:font-normal mint:rounded-xl mint:no-underline mint:text-[#707070] mint:dark:text-[#999999] mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2 mint:[&_span]:flex-1',\n isActive\n ? ACTIVE_ITEM_CLASSES\n : 'mint:hover:bg-[rgba(0,0,0,0.06)] mint:hover:text-[#242424] mint:dark:hover:bg-[rgba(128,128,128,0.05)] mint:dark:hover:text-[#ffffff]'\n )}\n >\n {item.method && (\n <MethodPill isActive={!!isActive} method={item.method} shortMethod={true} />\n )}\n {item.toc_title}\n </LinkElement>\n </li>\n );\n}\n\nexport function NavTree({\n navTree,\n activeId,\n className = '',\n activeHref,\n theme,\n bottomLinks,\n anchors,\n}: NavTreeProps) {\n const { LinkComponent } = useComponents();\n const navContentRef = useRef<HTMLDivElement>(null);\n\n // Save and restore scroll position\n useEffect(() => {\n const navElement = navContentRef.current;\n if (!navElement || !activeHref) return;\n\n const savedScrollPos = sessionStorage.getItem('nav-tree-scroll-position');\n\n if (savedScrollPos) {\n // Restore scroll position from sessionStorage\n navElement.scrollTop = parseInt(savedScrollPos, 10);\n } else {\n // If no saved position, scroll to active item\n const normalizeHref = (href: string): string => {\n if (!href) return '';\n return href.startsWith('/') ? href : `/${href}`;\n };\n\n const compareHrefs = (href1: string, href2: string): boolean => {\n const norm1 = normalizeHref(href1);\n const norm2 = normalizeHref(href2);\n return (\n norm1 === norm2 ||\n norm1.replace('/docs/', '/') === norm2.replace('/docs/', '/') ||\n norm1 === norm2.replace('/docs/', '/') ||\n norm1.replace('/docs/', '/') === norm2\n );\n };\n\n requestAnimationFrame(() => {\n const allLinks = navElement.querySelectorAll('a[href]');\n let activeLink: HTMLElement | null = null;\n\n for (const link of Array.from(allLinks)) {\n const href = link.getAttribute('href');\n if (href && compareHrefs(href, activeHref)) {\n activeLink = link as HTMLElement;\n break;\n }\n }\n\n if (activeLink) {\n activeLink.scrollIntoView({\n behavior: 'instant',\n block: 'center',\n inline: 'nearest',\n });\n }\n });\n }\n\n // Save scroll position on scroll\n const handleScroll = () => {\n sessionStorage.setItem('nav-tree-scroll-position', navElement.scrollTop.toString());\n };\n\n navElement.addEventListener('scroll', handleScroll);\n return () => navElement.removeEventListener('scroll', handleScroll);\n }, [activeHref]);\n\n if (!navTree || navTree.items.length === 0) {\n return null;\n }\n\n const LinkElement = LinkComponent || 'a';\n\n return (\n <nav\n id=\"nav-tree\"\n className={cn(\n 'mint:flex mint:flex-col mint:h-full mint:min-h-0',\n className,\n theme === 'dark' && 'dark'\n )}\n aria-label=\"Documentation navigation\"\n >\n <div\n id=\"nav-tree-content\"\n ref={navContentRef}\n className={cn(\n 'mint:flex-1 mint:overflow-y-auto mint:overflow-x-hidden mint:min-h-0 mint:[scrollbar-gutter:stable] mint:md:px-4 mint:[scrollbar-width:thin] mint:[scrollbar-color:rgba(0,0,0,0.2)_transparent] mint:dark:[scrollbar-color:rgba(255,255,255,0.2)_transparent] mint:[&::-webkit-scrollbar]:w-1 mint:[&::-webkit-scrollbar-track]:bg-transparent mint:[&::-webkit-scrollbar-thumb]:bg-black/20 mint:dark:[&::-webkit-scrollbar-thumb]:bg-white/20 mint:[&::-webkit-scrollbar-thumb]:rounded mint:[&::-webkit-scrollbar-thumb:hover]:bg-black/30 mint:dark:[&::-webkit-scrollbar-thumb:hover]:bg-white/30 mint:space-y-6 mint:py-4'\n )}\n >\n {anchors && anchors.length > 0 && (\n <div id=\"nav-anchors\" className=\"mint:shrink-0 mint:w-full mint:mb-3\">\n <div className=\"mint:flex mint:flex-col\">\n {anchors.map((anchor, index) => {\n const Icon = anchor.icon;\n\n const normalizeAnchorHref = (href: string): string => {\n if (!href) return '';\n return href.startsWith('/') ? href : `/${href}`;\n };\n\n const isAnchorActive = (() => {\n if (!activeHref || !anchor.href) return false;\n const normalizedActive = normalizeAnchorHref(activeHref);\n const normalizedAnchor = normalizeAnchorHref(anchor.href);\n\n const cleanActive = normalizedActive.replace(/\\/$/, '');\n const cleanAnchor = normalizedAnchor.replace(/\\/$/, '');\n\n const matches =\n cleanActive === cleanAnchor || cleanActive.startsWith(cleanAnchor + '/');\n if (!matches) return false;\n\n const longestMatchingAnchor = anchors\n .filter((a) => {\n if (!a.href) return false;\n const normalizedHref = normalizeAnchorHref(a.href);\n const cleanHref = normalizedHref.replace(/\\/$/, '');\n return cleanActive === cleanHref || cleanActive.startsWith(cleanHref + '/');\n })\n .reduce((longest, current) => {\n const longestHref = normalizeAnchorHref(longest.href || '').replace(\n /\\/$/,\n ''\n );\n const currentHref = normalizeAnchorHref(current.href || '').replace(\n /\\/$/,\n ''\n );\n return currentHref.length > longestHref.length ? current : longest;\n }, anchor);\n\n return longestMatchingAnchor === anchor;\n })();\n\n return (\n <LinkElement\n key={index}\n href={anchor.href}\n aria-current={isAnchorActive ? 'page' : undefined}\n className={cn(\n 'mint:group mint:relative mint:flex mint:items-start mint:gap-2 mint:py-2 mint:px-3 mint:text-sm mint:rounded-lg mint:no-underline mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2 mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb]',\n isAnchorActive\n ? 'mint:text-[#141414] mint:dark:text-[#ffffff]'\n : 'mint:text-[#242424] mint:dark:text-[#adadad]'\n )}\n >\n {Icon && (\n <Icon\n className={cn(\n 'mint:w-5 mint:h-5 mint:shrink-0',\n isAnchorActive\n ? 'mint:text-[#8251ee] mint:dark:text-[#9263f1]'\n : 'mint:text-[#6b7280] mint:dark:text-[#adadad] mint:group-hover:text-[#8251ee] mint:dark:group-hover:text-[#9263f1]'\n )}\n />\n )}\n <div className=\"mint:flex mint:flex-col mint:gap-0.5 mint:min-w-0\">\n <span\n className={cn(\n 'mint:font-medium',\n isAnchorActive\n ? 'mint:text-[#8251ee] mint:dark:text-[#9263f1] mint:font-semibold'\n : 'mint:text-[#141414] mint:dark:text-[#ffffff] mint:group-hover:text-[#8251ee] mint:dark:group-hover:text-[#9263f1]'\n )}\n >\n {anchor.title}\n </span>\n {anchor.description && (\n <span className=\"mint:text-xs mint:text-[#6b7280] mint:dark:text-[#adadad] mint:leading-snug\">\n {anchor.description}\n </span>\n )}\n </div>\n </LinkElement>\n );\n })}\n </div>\n </div>\n )}\n {navTree.items.map((item, index) => (\n <TreeItemComponent\n key={`${item.href}-${index}`}\n item={item}\n activeId={activeId}\n activeHref={activeHref}\n />\n ))}\n </div>\n {bottomLinks && bottomLinks.length > 0 && (\n <div\n id=\"nav-tree-bottom-links\"\n className=\"mint:shrink-0 mint:w-full mint:bg-[#f0f0f0] mint:dark:bg-[#0f0f0f] mint:mt-auto\"\n >\n <div className=\"mint:h-[0.5px] mint:w-full mint:bg-[#d1d1d1] mint:dark:bg-[#666666]\"></div>\n <div className=\"mint:flex mint:flex-col mint:py-3 mint:px-4\">\n {bottomLinks.map((link, index) => {\n const Icon = link.icon;\n if (link.component) {\n return (\n <div key={index}>\n {React.isValidElement(link.component) ? (\n React.cloneElement(link.component as React.ReactElement, {\n ...(link.component as React.ReactElement).props,\n className: cn(\n 'mint:flex mint:items-center mint:py-2 mint:gap-2 mint:text-sm mint:text-[#242424] mint:dark:text-[#adadad] mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb] mint:px-2 mint:cursor-pointer',\n (link.component as React.ReactElement).props?.className\n ),\n children: (\n <>\n <Icon className=\"mint:w-5 mint:h-5 mint:shrink-0\" />\n <span>{link.label}</span>\n </>\n ),\n })\n ) : (\n <div className=\"mint:flex mint:items-center mint:py-2 mint:gap-2 mint:text-sm mint:text-[#242424] mint:dark:text-[#adadad] mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb] mint:px-2 mint:cursor-pointer\">\n <Icon className=\"mint:w-5 mint:h-5 mint:shrink-0\" />\n <span>{link.label}</span>\n {link.component}\n </div>\n )}\n </div>\n );\n }\n return (\n <LinkElement\n key={index}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mint:flex mint:items-center mint:py-2 mint:gap-2 mint:text-sm mint:no-underline mint:text-[#242424] mint:dark:text-[#adadad] mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb] mint:px-2 mint:[&>span]:flex mint:[&>span]:items-center mint:[&>span]:gap-2 mint:[&>svg:last-child]:hidden\"\n >\n <Icon className=\"mint:w-5 mint:h-5 mint:shrink-0\" />\n <span>{link.label}</span>\n </LinkElement>\n );\n })}\n </div>\n </div>\n )}\n </nav>\n );\n}\n"],"names":["ChevronIcon","isExpanded","jsx","cn","ACTIVE_ITEM_CLASSES","TreeItemComponent","item","activeId","level","activeHref","hasChildren","normalizeHref","href","compareHrefs","href1","href2","norm1","norm2","hasActiveChild","navItem","shouldBeExpanded","setIsExpanded","useState","useEffect","LinkComponent","useComponents","isGroup","isActive","Icon","jsxs","child","index","LinkElement","MethodPill","NavTree","navTree","className","theme","bottomLinks","anchors","navContentRef","useRef","navElement","savedScrollPos","allLinks","activeLink","link","handleScroll","anchor","normalizeAnchorHref","isAnchorActive","normalizedActive","normalizedAnchor","cleanActive","cleanAnchor","a","cleanHref","longest","current","longestHref","React","_a","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/nav-tree/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\n\nimport { useComponents } from '../../context/components-context';\nimport '../../styles.css';\nimport type { NavItem, NavTreeData, AnchorConfig } from '../../types';\nimport { cn } from '../../utils/cn';\nimport { MethodPill } from '../Api/MethodPill';\n\nexport { MobileNavTree } from './mobile-nav';\nexport type { MobileNavTreeProps } from './mobile-nav';\nexport type { AnchorConfig } from '../../types';\n\nexport interface BottomLinkConfig {\n href?: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n component?: React.ReactNode;\n}\n\ninterface NavTreeProps {\n navTree: NavTreeData;\n activeId?: string;\n className?: string;\n activeHref?: string;\n theme?: 'light' | 'dark' | 'system';\n bottomLinks?: BottomLinkConfig[];\n anchors?: AnchorConfig[];\n}\n\ninterface TreeItemProps {\n item: NavItem;\n activeId?: string;\n level?: number;\n activeHref?: string;\n}\n\nfunction ChevronIcon({ isExpanded }: { isExpanded: boolean }) {\n return (\n <svg\n className={cn(\n 'mint:w-[12px] mint:h-[12px] mint:shrink-0 mint:text-[#707070] mint:dark:text-[#999999]',\n isExpanded ? 'mint:rotate-90' : 'mint:rotate-0'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\nconst ACTIVE_ITEM_CLASSES =\n 'mint:bg-[#e6e6e6] mint:dark:bg-[#2e2e2e] mint:text-[#242424] mint:dark:text-[#ffffff] mint:font';\n\nfunction TreeItemComponent({ item, activeId, level = 0, activeHref }: TreeItemProps) {\n const hasChildren = item.children && item.children.length > 0;\n\n const normalizeHref = (href?: string): string => {\n if (!href) return '';\n const normalized = href.startsWith('/') ? href : `/${href}`;\n return normalized;\n };\n\n const compareHrefs = (href1?: string, href2?: string): boolean => {\n if (!href1 || !href2) return false;\n const norm1 = normalizeHref(href1);\n const norm2 = normalizeHref(href2);\n return (\n norm1 === norm2 ||\n norm1.replace('/docs/', '/') === norm2.replace('/docs/', '/') ||\n norm1 === norm2.replace('/docs/', '/') ||\n norm1.replace('/docs/', '/') === norm2\n );\n };\n\n const hasActiveChild = (navItem: NavItem): boolean => {\n if (compareHrefs(navItem.href, activeHref)) return true;\n if (navItem.children) {\n return navItem.children.some(hasActiveChild);\n }\n return false;\n };\n\n const shouldBeExpanded =\n level === 0 ? true : (item.expanded ?? false) || (hasChildren && hasActiveChild(item));\n const [isExpanded, setIsExpanded] = useState(shouldBeExpanded);\n\n useEffect(() => {\n if (hasChildren && hasActiveChild(item)) {\n setIsExpanded(true);\n }\n }, [activeHref]);\n\n const { LinkComponent } = useComponents();\n const isGroup = !item.href;\n const isActive =\n item.href && (compareHrefs(item.href, activeId) || compareHrefs(item.href, activeHref));\n const Icon = item.icon;\n\n if (isGroup && level === 0) {\n return (\n <div id=\"nav-group\" role=\"group\" aria-label={item.toc_title}>\n <div className=\"mint:text-sm mint:text-[#242424] mint:dark:text-[#ffffff] mint:mb-2 mint:flex mint:items-start mint:gap-2 mint:pl-3 mint:font-semibold\">\n {Icon && <Icon className=\"mint:w-5 mint:h-5\" aria-hidden=\"true\" />}\n <span>{item.toc_title}</span>\n </div>\n {hasChildren && item.children && (\n <ul className=\"mint:flex mint:flex-col mint:pl-0 mint:mt-0 mint:gap-0.5\" role=\"list\">\n {item.children.map((child, index) => (\n <TreeItemComponent\n key={`${child.href}-${index}`}\n item={child}\n activeId={activeId}\n level={level + 1}\n activeHref={activeHref}\n />\n ))}\n </ul>\n )}\n </div>\n );\n }\n\n if (isGroup && level > 0) {\n return (\n <li className=\"mint:list-none\">\n <div\n id=\"nav-group-toggle\"\n onClick={() => setIsExpanded(!isExpanded)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsExpanded(!isExpanded);\n }\n }}\n aria-expanded={isExpanded}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${item.toc_title} section`}\n className=\"mint:relative mint:text-left mint:w-full mint:flex mint:items-center mint:justify-between mint:py-2 mint:px-3 mint:text-sm mint:rounded-lg mint:bg-transparent mint:cursor-pointer mint:text-[#707070] mint:dark:text-[#999999] mint:hover:bg-[rgba(0,0,0,0.06)] mint:hover:text-[#242424] mint:dark:hover:bg-[rgba(128,128,128,0.05)] mint:dark:hover:text-[#ffffff] mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2\"\n >\n <span className=\"mint:flex-1 mint:min-w-0\">{item.toc_title}</span>\n <ChevronIcon isExpanded={!!isExpanded} />\n </div>\n {hasChildren && isExpanded && item.children && (\n <ul\n className=\"mint:ml-3 mint:flex mint:flex-col mint:pl-0 mint:mt-0 mint:gap-0.5\"\n role=\"group\"\n >\n {item.children.map((child, index) => (\n <TreeItemComponent\n key={`${child.href}-${index}`}\n item={child}\n activeId={activeId}\n level={level + 1}\n activeHref={activeHref}\n />\n ))}\n </ul>\n )}\n </li>\n );\n }\n\n const LinkElement = LinkComponent || 'a';\n\n if (hasChildren) {\n return (\n <li className=\"mint:list-none\">\n <div\n id=\"nav-item-toggle\"\n onClick={() => setIsExpanded(!isExpanded)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsExpanded(!isExpanded);\n }\n }}\n aria-expanded={isExpanded}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${item.toc_title} section`}\n className={cn(\n 'mint:font-aptos mint:relative mint:text-left mint:w-full mint:flex mint:items-center mint:justify-between mint:gap-2 mint:py-2 mint:px-3 mint:text-[14px] mint:font-normal mint:rounded-xl mint:bg-transparent mint:cursor-pointer mint:text-[#707070] mint:dark:text-[#999999] mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2',\n isActive\n ? ACTIVE_ITEM_CLASSES\n : 'mint:hover:bg-[rgba(0,0,0,0.06)] mint:hover:text-[#242424] mint:dark:hover:bg-[rgba(128,128,128,0.05)] mint:dark:hover:text-[#ffffff]'\n )}\n >\n <span className=\"mint:flex-1 mint:min-w-0 mint:font-aptos\">{item.toc_title}</span>\n <ChevronIcon isExpanded={!!isExpanded} />\n </div>\n {isExpanded && item.children && (\n <ul\n className=\"mint:ml-3 mint:flex mint:flex-col mint:pl-0 mint:mt-0 mint:gap-0.5\"\n role=\"group\"\n >\n {item.children.map((child, index) => (\n <TreeItemComponent\n key={`${child.href}-${index}`}\n item={child}\n activeId={activeId}\n level={level + 1}\n activeHref={activeHref}\n />\n ))}\n </ul>\n )}\n </li>\n );\n }\n\n return (\n <li className=\"mint:list-none\">\n <LinkElement\n id=\"nav-item\"\n href={item.href}\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'mint:relative mint:flex mint:items-center mint:gap-2 mint:py-2 mint:px-3 mint:text-[14px] mint:font-normal mint:rounded-xl mint:no-underline mint:text-[#707070] mint:dark:text-[#999999] mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2 mint:[&_span]:flex-1',\n isActive\n ? ACTIVE_ITEM_CLASSES\n : 'mint:hover:bg-[rgba(0,0,0,0.06)] mint:hover:text-[#242424] mint:dark:hover:bg-[rgba(128,128,128,0.05)] mint:dark:hover:text-[#ffffff]'\n )}\n >\n {item.method && (\n <MethodPill isActive={!!isActive} method={item.method} shortMethod={true} />\n )}\n {item.toc_title}\n </LinkElement>\n </li>\n );\n}\n\nexport function NavTree({\n navTree,\n activeId,\n className = '',\n activeHref,\n theme,\n bottomLinks,\n anchors,\n}: NavTreeProps) {\n const { LinkComponent } = useComponents();\n const navContentRef = useRef<HTMLDivElement>(null);\n\n // Save and restore scroll position\n useEffect(() => {\n const navElement = navContentRef.current;\n if (!navElement || !activeHref) return;\n\n const savedScrollPos = sessionStorage.getItem('nav-tree-scroll-position');\n\n if (savedScrollPos) {\n // Restore scroll position from sessionStorage\n navElement.scrollTop = parseInt(savedScrollPos, 10);\n } else {\n // If no saved position, scroll to active item\n const normalizeHref = (href: string): string => {\n if (!href) return '';\n return href.startsWith('/') ? href : `/${href}`;\n };\n\n const compareHrefs = (href1: string, href2: string): boolean => {\n const norm1 = normalizeHref(href1);\n const norm2 = normalizeHref(href2);\n return (\n norm1 === norm2 ||\n norm1.replace('/docs/', '/') === norm2.replace('/docs/', '/') ||\n norm1 === norm2.replace('/docs/', '/') ||\n norm1.replace('/docs/', '/') === norm2\n );\n };\n\n requestAnimationFrame(() => {\n const allLinks = navElement.querySelectorAll('a[href]');\n let activeLink: HTMLElement | null = null;\n\n for (const link of Array.from(allLinks)) {\n const href = link.getAttribute('href');\n if (href && compareHrefs(href, activeHref)) {\n activeLink = link as HTMLElement;\n break;\n }\n }\n\n if (activeLink) {\n activeLink.scrollIntoView({\n behavior: 'instant',\n block: 'center',\n inline: 'nearest',\n });\n }\n });\n }\n\n // Save scroll position on scroll\n const handleScroll = () => {\n sessionStorage.setItem('nav-tree-scroll-position', navElement.scrollTop.toString());\n };\n\n navElement.addEventListener('scroll', handleScroll);\n return () => navElement.removeEventListener('scroll', handleScroll);\n }, [activeHref]);\n\n if (!navTree || navTree.items.length === 0) {\n return null;\n }\n\n const LinkElement = LinkComponent || 'a';\n\n return (\n <nav\n id=\"nav-tree\"\n className={cn(\n 'mint:flex mint:flex-col mint:h-full mint:min-h-0',\n className,\n theme === 'dark' && 'dark'\n )}\n aria-label=\"Documentation navigation\"\n >\n <div\n id=\"nav-tree-content\"\n ref={navContentRef}\n className={cn(\n 'mint:flex-1 mint:overflow-y-auto mint:overflow-x-hidden mint:min-h-0 mint:[scrollbar-gutter:stable] mint:md:px-4 mint:[scrollbar-width:thin] mint:[scrollbar-color:rgba(0,0,0,0.2)_transparent] mint:dark:[scrollbar-color:rgba(255,255,255,0.2)_transparent] mint:[&::-webkit-scrollbar]:w-1 mint:[&::-webkit-scrollbar-track]:bg-transparent mint:[&::-webkit-scrollbar-thumb]:bg-black/20 mint:dark:[&::-webkit-scrollbar-thumb]:bg-white/20 mint:[&::-webkit-scrollbar-thumb]:rounded mint:[&::-webkit-scrollbar-thumb:hover]:bg-black/30 mint:dark:[&::-webkit-scrollbar-thumb:hover]:bg-white/30 mint:[&>*+*]:mt-[45px] mint:py-4'\n )}\n >\n {anchors && anchors.length > 0 && (\n <div id=\"nav-anchors\" className=\"mint:shrink-0 mint:w-full mint:mb-3\">\n <div className=\"mint:flex mint:flex-col\">\n {anchors.map((anchor, index) => {\n const Icon = anchor.icon;\n\n const normalizeAnchorHref = (href: string): string => {\n if (!href) return '';\n return href.startsWith('/') ? href : `/${href}`;\n };\n\n const isAnchorActive = (() => {\n if (!activeHref || !anchor.href) return false;\n const normalizedActive = normalizeAnchorHref(activeHref);\n const normalizedAnchor = normalizeAnchorHref(anchor.href);\n\n const cleanActive = normalizedActive.replace(/\\/$/, '');\n const cleanAnchor = normalizedAnchor.replace(/\\/$/, '');\n\n const matches =\n cleanActive === cleanAnchor || cleanActive.startsWith(cleanAnchor + '/');\n if (!matches) return false;\n\n const longestMatchingAnchor = anchors\n .filter((a) => {\n if (!a.href) return false;\n const normalizedHref = normalizeAnchorHref(a.href);\n const cleanHref = normalizedHref.replace(/\\/$/, '');\n return cleanActive === cleanHref || cleanActive.startsWith(cleanHref + '/');\n })\n .reduce((longest, current) => {\n const longestHref = normalizeAnchorHref(longest.href || '').replace(\n /\\/$/,\n ''\n );\n const currentHref = normalizeAnchorHref(current.href || '').replace(\n /\\/$/,\n ''\n );\n return currentHref.length > longestHref.length ? current : longest;\n }, anchor);\n\n return longestMatchingAnchor === anchor;\n })();\n\n return (\n <LinkElement\n key={index}\n href={anchor.href}\n aria-current={isAnchorActive ? 'page' : undefined}\n className={cn(\n 'mint:group mint:relative mint:flex mint:items-start mint:gap-2 mint:py-2 mint:px-3 mint:text-sm mint:rounded-lg mint:no-underline mint:focus-visible:outline-2 mint:focus-visible:outline-[#643fb2] mint:focus-visible:outline-offset-2 mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb]',\n isAnchorActive\n ? 'mint:text-[#141414] mint:dark:text-[#ffffff]'\n : 'mint:text-[#242424] mint:dark:text-[#adadad]'\n )}\n >\n {Icon && (\n <Icon\n className={cn(\n 'mint:w-5 mint:h-5 mint:shrink-0',\n isAnchorActive\n ? 'mint:text-[#8251ee] mint:dark:text-[#9263f1]'\n : 'mint:text-[#6b7280] mint:dark:text-[#adadad] mint:group-hover:text-[#8251ee] mint:dark:group-hover:text-[#9263f1]'\n )}\n />\n )}\n <div className=\"mint:flex mint:flex-col mint:gap-0.5 mint:min-w-0\">\n <span\n className={cn(\n 'mint:font-medium',\n isAnchorActive\n ? 'mint:text-[#8251ee] mint:dark:text-[#9263f1] mint:font-semibold'\n : 'mint:text-[#141414] mint:dark:text-[#ffffff] mint:group-hover:text-[#8251ee] mint:dark:group-hover:text-[#9263f1]'\n )}\n >\n {anchor.title}\n </span>\n {anchor.description && (\n <span className=\"mint:text-xs mint:text-[#6b7280] mint:dark:text-[#adadad] mint:leading-snug\">\n {anchor.description}\n </span>\n )}\n </div>\n </LinkElement>\n );\n })}\n </div>\n </div>\n )}\n {navTree.items.map((item, index) => (\n <TreeItemComponent\n key={`${item.href}-${index}`}\n item={item}\n activeId={activeId}\n activeHref={activeHref}\n />\n ))}\n </div>\n {bottomLinks && bottomLinks.length > 0 && (\n <div\n id=\"nav-tree-bottom-links\"\n className=\"mint:shrink-0 mint:w-full mint:bg-[#f0f0f0] mint:dark:bg-[#0f0f0f] mint:mt-auto\"\n >\n <div className=\"mint:h-[0.5px] mint:w-full mint:bg-[#d1d1d1] mint:dark:bg-[#666666]\"></div>\n <div className=\"mint:flex mint:flex-col mint:py-3 mint:px-4\">\n {bottomLinks.map((link, index) => {\n const Icon = link.icon;\n if (link.component) {\n return (\n <div key={index}>\n {React.isValidElement(link.component) ? (\n React.cloneElement(link.component as React.ReactElement, {\n ...(link.component as React.ReactElement).props,\n className: cn(\n 'mint:flex mint:items-center mint:py-2 mint:gap-2 mint:text-sm mint:text-[#242424] mint:dark:text-[#adadad] mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb] mint:px-2 mint:cursor-pointer',\n (link.component as React.ReactElement).props?.className\n ),\n children: (\n <>\n <Icon className=\"mint:w-5 mint:h-5 mint:shrink-0\" />\n <span>{link.label}</span>\n </>\n ),\n })\n ) : (\n <div className=\"mint:flex mint:items-center mint:py-2 mint:gap-2 mint:text-sm mint:text-[#242424] mint:dark:text-[#adadad] mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb] mint:px-2 mint:cursor-pointer\">\n <Icon className=\"mint:w-5 mint:h-5 mint:shrink-0\" />\n <span>{link.label}</span>\n {link.component}\n </div>\n )}\n </div>\n );\n }\n return (\n <LinkElement\n key={index}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mint:flex mint:items-center mint:py-2 mint:gap-2 mint:text-sm mint:no-underline mint:text-[#242424] mint:dark:text-[#adadad] mint:hover:text-[#141414] mint:dark:hover:text-[#e5e7eb] mint:px-2 mint:[&>span]:flex mint:[&>span]:items-center mint:[&>span]:gap-2 mint:[&>svg:last-child]:hidden\"\n >\n <Icon className=\"mint:w-5 mint:h-5 mint:shrink-0\" />\n <span>{link.label}</span>\n </LinkElement>\n );\n })}\n </div>\n </div>\n )}\n </nav>\n );\n}\n"],"names":["ChevronIcon","isExpanded","jsx","cn","ACTIVE_ITEM_CLASSES","TreeItemComponent","item","activeId","level","activeHref","hasChildren","normalizeHref","href","compareHrefs","href1","href2","norm1","norm2","hasActiveChild","navItem","shouldBeExpanded","setIsExpanded","useState","useEffect","LinkComponent","useComponents","isGroup","isActive","Icon","jsxs","child","index","e","LinkElement","MethodPill","NavTree","navTree","className","theme","bottomLinks","anchors","navContentRef","useRef","navElement","savedScrollPos","allLinks","activeLink","link","handleScroll","anchor","normalizeAnchorHref","isAnchorActive","normalizedActive","normalizedAnchor","cleanActive","cleanAnchor","a","cleanHref","longest","current","longestHref","React","_a","Fragment"],"mappings":"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"}
|
|
@@ -1,76 +1,85 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { cn as
|
|
1
|
+
import { jsx as y, jsxs as L } from "react/jsx-runtime";
|
|
2
|
+
import { useState as _, useRef as I, useEffect as z } from "react";
|
|
3
|
+
import { cn as A } from "../../utils/cn.js";
|
|
4
4
|
function N({ toc: i }) {
|
|
5
|
-
const [
|
|
6
|
-
return
|
|
7
|
-
var
|
|
5
|
+
const [v, m] = _(""), d = I(!1), s = I();
|
|
6
|
+
return z(() => {
|
|
7
|
+
var u;
|
|
8
8
|
if (i.length === 0) return;
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
9
|
+
d.current = !1, s.current && clearTimeout(s.current);
|
|
10
|
+
const o = window.location.hash.slice(1);
|
|
11
|
+
m(o || ((u = i[0]) == null ? void 0 : u.slug) || "");
|
|
12
12
|
const f = () => {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
},
|
|
16
|
-
var
|
|
17
|
-
if (!
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
if (!
|
|
21
|
-
const
|
|
22
|
-
return { id:
|
|
13
|
+
const n = window.location.hash.slice(1);
|
|
14
|
+
n && m(n);
|
|
15
|
+
}, t = document.getElementById("main-content"), x = () => {
|
|
16
|
+
var B, S;
|
|
17
|
+
if (!t) return (B = i[0]) == null ? void 0 : B.slug;
|
|
18
|
+
const n = window.getComputedStyle(document.documentElement), w = parseFloat(n.getPropertyValue("--scroll-mt") || "0"), R = parseFloat(n.fontSize), C = w * R + 100, g = t.scrollTop, E = t.scrollHeight - t.clientHeight, T = g >= E - 10, r = i.map((l) => {
|
|
19
|
+
const c = document.getElementById(l.slug);
|
|
20
|
+
if (!c) return null;
|
|
21
|
+
const h = c.getBoundingClientRect(), b = t.getBoundingClientRect(), k = h.top - b.top + g;
|
|
22
|
+
return { id: l.slug, top: k };
|
|
23
23
|
}).filter(Boolean);
|
|
24
|
-
if (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
24
|
+
if (r.length === 0) return (S = i[0]) == null ? void 0 : S.slug;
|
|
25
|
+
if (T) {
|
|
26
|
+
const l = t.getBoundingClientRect();
|
|
27
|
+
for (let c = r.length - 1; c >= 0; c--) {
|
|
28
|
+
const h = document.getElementById(r[c].id);
|
|
29
|
+
if (h) {
|
|
30
|
+
const b = h.getBoundingClientRect();
|
|
31
|
+
if (b.top <= l.bottom && b.bottom >= l.top)
|
|
32
|
+
return r[c].id;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return r[r.length - 1].id;
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
let p = r[0];
|
|
38
|
+
for (const l of r)
|
|
39
|
+
g + C >= l.top && (p = l);
|
|
40
|
+
return p == null ? void 0 : p.id;
|
|
41
|
+
}, e = () => {
|
|
42
|
+
if (d.current) return;
|
|
43
|
+
const n = x();
|
|
44
|
+
n && n !== v && (m(n), history.replaceState(null, "", `#${n}`));
|
|
38
45
|
};
|
|
39
|
-
window.addEventListener("hashchange", f),
|
|
46
|
+
window.addEventListener("hashchange", f), t ? t.addEventListener("scroll", e, {
|
|
40
47
|
passive: !0
|
|
41
|
-
}) : window.addEventListener("scroll",
|
|
42
|
-
let
|
|
43
|
-
return
|
|
44
|
-
|
|
48
|
+
}) : window.addEventListener("scroll", e, { passive: !0 });
|
|
49
|
+
let a;
|
|
50
|
+
return o || (a = setTimeout(e, 100)), () => {
|
|
51
|
+
a && clearTimeout(a), s.current && clearTimeout(s.current), window.removeEventListener("hashchange", f), t ? t.removeEventListener("scroll", e) : window.removeEventListener("scroll", e);
|
|
45
52
|
};
|
|
46
|
-
}, [i,
|
|
47
|
-
const
|
|
48
|
-
return /* @__PURE__ */
|
|
49
|
-
|
|
50
|
-
/* @__PURE__ */
|
|
53
|
+
}, [i, v]), /* @__PURE__ */ y("ul", { className: "mint:list-none mint:flex mint:flex-col mint:gap-2 mint:text-sm mint:text-[#6b7280] mint:dark:text-[#adadad] mint:font-medium mint:relative mint:pl-[0.15rem] mint:before:content-[''] mint:before:absolute mint:before:left-[0.15rem] mint:before:top-0 mint:before:bottom-0 mint:before:w-[2px] mint:before:bg-[#f2f3f3] mint:dark:before:bg-[#222223] mint:before:rounded-full", children: i.map((o, f) => {
|
|
54
|
+
const t = v === o.slug;
|
|
55
|
+
return /* @__PURE__ */ L("li", { className: "mint:relative", children: [
|
|
56
|
+
t && /* @__PURE__ */ y("div", { className: "mint:absolute mint:left-0 mint:top-0 mint:bottom-0 mint:w-[2px] mint:rounded-full mint:bg-[#643fb2] mint:dark:bg-[#c9aaf9] mint:z-1" }),
|
|
57
|
+
/* @__PURE__ */ y(
|
|
51
58
|
"a",
|
|
52
59
|
{
|
|
53
|
-
href: `#${
|
|
54
|
-
onClick: (
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
if (
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
top:
|
|
60
|
+
href: `#${o.slug}`,
|
|
61
|
+
onClick: (x) => {
|
|
62
|
+
x.preventDefault(), m(o.slug), d.current = !0, s.current && clearTimeout(s.current);
|
|
63
|
+
const e = document.getElementById("main-content"), a = document.getElementById(o.slug);
|
|
64
|
+
if (e && a) {
|
|
65
|
+
const u = window.getComputedStyle(document.documentElement), n = parseFloat(u.getPropertyValue("--scroll-mt") || "0"), w = parseFloat(u.fontSize), R = n * w, C = e.getBoundingClientRect(), E = a.getBoundingClientRect().top - C.top + e.scrollTop - R, T = e.scrollHeight - e.clientHeight, r = Math.min(E, T);
|
|
66
|
+
e.scrollTo({
|
|
67
|
+
top: r,
|
|
61
68
|
behavior: "instant"
|
|
62
69
|
});
|
|
63
70
|
}
|
|
64
|
-
history.replaceState(null, "", `#${
|
|
71
|
+
history.replaceState(null, "", `#${o.slug}`), s.current = setTimeout(() => {
|
|
72
|
+
d.current = !1;
|
|
73
|
+
}, 100);
|
|
65
74
|
},
|
|
66
|
-
className:
|
|
75
|
+
className: A(
|
|
67
76
|
"mint:block mint:pl-6 mint:leading-relaxed mint:no-underline",
|
|
68
|
-
|
|
77
|
+
t ? "mint:text-[#643fb2] mint:dark:text-[#c9aaf9] mint:[text-shadow:-0.2px_0_0_currentColor,0.2px_0_0_currentColor]" : "mint:text-[#424242] mint:dark:text-[#d6d6d6] mint:dark:hover:text-[#d1d5db] mint:hover:text-[#111827]"
|
|
69
78
|
),
|
|
70
|
-
children:
|
|
79
|
+
children: o.title
|
|
71
80
|
}
|
|
72
81
|
)
|
|
73
|
-
] }, `${
|
|
82
|
+
] }, `${o.slug}-${f}`);
|
|
74
83
|
}) });
|
|
75
84
|
}
|
|
76
85
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/toc/index.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { TocItem } from '../../types';\nimport { cn } from '../../utils/cn';\n\ninterface TableOfContentsProps {\n toc: TocItem[];\n}\n\nexport function TableOfContents({ toc }: TableOfContentsProps) {\n const [activeId, setActiveId] = useState('');\n const ignoreScrollRef = useRef(false);\n const ignoreTimeoutRef = useRef<NodeJS.Timeout>();\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n ignoreScrollRef.current = false;\n if (ignoreTimeoutRef.current) {\n clearTimeout(ignoreTimeoutRef.current);\n }\n\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n } else {\n setActiveId(toc[0]?.slug || '');\n }\n\n const handleHashChange = () => {\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n }\n };\n\n const scrollContainer = document.getElementById('main-content');\n\n const getActiveHeading = () => {\n if (!scrollContainer) return toc[0]?.slug;\n\n const style = window.getComputedStyle(document.documentElement);\n const scrollMtRem = parseFloat(style.getPropertyValue('--scroll-mt') || '0');\n const fontSize = parseFloat(style.fontSize);\n const scrollOffset = scrollMtRem * fontSize + 100;\n\n const scrollY = scrollContainer.scrollTop;\n\n const headingPositions = toc\n .map((item) => {\n const element = document.getElementById(item.slug);\n if (!element) return null;\n\n const rect = element.getBoundingClientRect();\n const containerRect = scrollContainer.getBoundingClientRect();\n const relativeTop = rect.top - containerRect.top + scrollY;\n\n return { id: item.slug, top: relativeTop };\n })\n .filter(Boolean) as Array<{ id: string; top: number }>;\n\n if (headingPositions.length === 0) return toc[0]?.slug;\n\n let currentHeading = headingPositions[0];\n for (const heading of headingPositions) {\n if (scrollY + scrollOffset >= heading.top) {\n currentHeading = heading;\n }\n }\n\n return currentHeading?.id;\n };\n\n const handleScroll = () => {\n if (ignoreScrollRef.current) return;\n\n const hash = window.location.hash.slice(1);\n // If there's a hash in the URL, keep that heading active regardless of scroll position\n // This ensures headings near the bottom of the page stay active when clicked\n if (hash && toc.some((item) => item.slug === hash)) {\n if (activeId !== hash) {\n setActiveId(hash);\n }\n return;\n }\n\n const newActiveId = getActiveHeading();\n if (newActiveId) {\n setActiveId(newActiveId);\n }\n };\n\n window.addEventListener('hashchange', handleHashChange);\n\n if (scrollContainer) {\n scrollContainer.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n } else {\n window.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n let timeoutId: NodeJS.Timeout | undefined;\n if (!hash) {\n timeoutId = setTimeout(handleScroll, 100);\n }\n\n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (ignoreTimeoutRef.current) clearTimeout(ignoreTimeoutRef.current);\n window.removeEventListener('hashchange', handleHashChange);\n if (scrollContainer) {\n scrollContainer.removeEventListener('scroll', handleScroll);\n } else {\n window.removeEventListener('scroll', handleScroll);\n }\n };\n }, [toc, activeId]);\n\n return (\n <ul className=\"mint:list-none mint:flex mint:flex-col mint:gap-2 mint:text-sm mint:text-[#6b7280] mint:dark:text-[#adadad] mint:font-medium mint:relative mint:pl-[0.15rem] mint:before:content-[''] mint:before:absolute mint:before:left-[0.15rem] mint:before:top-0 mint:before:bottom-0 mint:before:w-[3px] mint:before:bg-[#f2f3f3] mint:dark:before:bg-[#222223] mint:before:rounded-full\">\n {toc.map((item, index) => {\n const isActive = activeId === item.slug;\n return (\n <li key={`${item.slug}-${index}`} className=\"mint:relative\">\n {isActive && (\n <div className=\"mint:absolute mint:left-0 mint:top-0 mint:bottom-0 mint:w-[3px] mint:rounded-full mint:bg-[#643fb2] mint:dark:bg-[#c9aaf9] mint:z-1\" />\n )}\n <a\n href={`#${item.slug}`}\n onClick={(e) => {\n e.preventDefault();\n\n // Immediately set the active ID to ensure it's highlighted\n setActiveId(item.slug);\n\n const scrollContainer = document.getElementById('main-content');\n const targetElement = document.getElementById(item.slug);\n\n if (scrollContainer && targetElement) {\n const style = window.getComputedStyle(document.documentElement);\n const scrollMtRem = parseFloat(style.getPropertyValue('--scroll-mt') || '0');\n const fontSize = parseFloat(style.fontSize);\n const scrollOffset = scrollMtRem * fontSize;\n\n const containerRect = scrollContainer.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const relativeTop =\n targetRect.top - containerRect.top + scrollContainer.scrollTop - scrollOffset;\n\n scrollContainer.scrollTo({\n top: relativeTop,\n behavior: 'instant',\n });\n }\n\n history.replaceState(null, '', `#${item.slug}`);\n }}\n className={cn(\n 'mint:block mint:pl-6 mint:leading-relaxed mint:no-underline',\n isActive\n ? 'mint:text-[#643fb2] mint:dark:text-[#c9aaf9] mint:[text-shadow:-0.2px_0_0_currentColor,0.2px_0_0_currentColor]'\n : 'mint:text-[#424242] mint:dark:text-[#d6d6d6] mint:dark:hover:text-[#d1d5db] mint:hover:text-[#111827]'\n )}\n >\n {item.title}\n </a>\n </li>\n );\n })}\n </ul>\n );\n}\n"],"names":["TableOfContents","toc","activeId","setActiveId","useState","ignoreScrollRef","useRef","ignoreTimeoutRef","useEffect","hash","_a","handleHashChange","scrollContainer","getActiveHeading","style","scrollMtRem","fontSize","scrollOffset","scrollY","headingPositions","item","element","rect","containerRect","relativeTop","_b","currentHeading","heading","handleScroll","newActiveId","timeoutId","jsx","index","isActive","jsxs","e","targetElement","cn"],"mappings":";;;AASO,SAASA,EAAgB,EAAE,KAAAC,KAA6B;AAC7D,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAE,GACrCC,IAAkBC,EAAO,EAAK,GAC9BC,IAAmBD,EAAA;AAEzB,SAAAE,EAAU,MAAM;;AACd,QAAIP,EAAI,WAAW,EAAG;AAEtB,IAAAI,EAAgB,UAAU,IACtBE,EAAiB,WACnB,aAAaA,EAAiB,OAAO;AAGvC,UAAME,IAAO,OAAO,SAAS,KAAK,MAAM,CAAC;AACzC,IACEN,EADEM,OAGUC,IAAAT,EAAI,CAAC,MAAL,gBAAAS,EAAQ,SAAQ,EAFZ;AAKlB,UAAMC,IAAmB,MAAM;AAC7B,YAAMF,IAAO,OAAO,SAAS,KAAK,MAAM,CAAC;AACzC,MAAIA,KACFN,EAAYM,CAAI;AAAA,IAEpB,GAEMG,IAAkB,SAAS,eAAe,cAAc,GAExDC,IAAmB,MAAM;;AAC7B,UAAI,CAACD,EAAiB,SAAOF,IAAAT,EAAI,CAAC,MAAL,gBAAAS,EAAQ;AAErC,YAAMI,IAAQ,OAAO,iBAAiB,SAAS,eAAe,GACxDC,IAAc,WAAWD,EAAM,iBAAiB,aAAa,KAAK,GAAG,GACrEE,IAAW,WAAWF,EAAM,QAAQ,GACpCG,IAAeF,IAAcC,IAAW,KAExCE,IAAUN,EAAgB,WAE1BO,IAAmBlB,EACtB,IAAI,CAACmB,MAAS;AACb,cAAMC,IAAU,SAAS,eAAeD,EAAK,IAAI;AACjD,YAAI,CAACC,EAAS,QAAO;AAErB,cAAMC,IAAOD,EAAQ,sBAAA,GACfE,IAAgBX,EAAgB,sBAAA,GAChCY,IAAcF,EAAK,MAAMC,EAAc,MAAML;AAEnD,eAAO,EAAE,IAAIE,EAAK,MAAM,KAAKI,EAAA;AAAA,MAC/B,CAAC,EACA,OAAO,OAAO;AAEjB,UAAIL,EAAiB,WAAW,EAAG,SAAOM,IAAAxB,EAAI,CAAC,MAAL,gBAAAwB,EAAQ;AAElD,UAAIC,IAAiBP,EAAiB,CAAC;AACvC,iBAAWQ,KAAWR;AACpB,QAAID,IAAUD,KAAgBU,EAAQ,QACpCD,IAAiBC;AAIrB,aAAOD,KAAA,gBAAAA,EAAgB;AAAA,IACzB,GAEME,IAAe,MAAM;AACzB,UAAIvB,EAAgB,QAAS;AAE7B,YAAMI,IAAO,OAAO,SAAS,KAAK,MAAM,CAAC;AAGzC,UAAIA,KAAQR,EAAI,KAAK,CAACmB,MAASA,EAAK,SAASX,CAAI,GAAG;AAClD,QAAIP,MAAaO,KACfN,EAAYM,CAAI;AAElB;AAAA,MACF;AAEA,YAAMoB,IAAchB,EAAA;AACpB,MAAIgB,KACF1B,EAAY0B,CAAW;AAAA,IAE3B;AAEA,WAAO,iBAAiB,cAAclB,CAAgB,GAElDC,IACFA,EAAgB,iBAAiB,UAAUgB,GAAc;AAAA,MACvD,SAAS;AAAA,IAAA,CACV,IAED,OAAO,iBAAiB,UAAUA,GAAc,EAAE,SAAS,IAAM;AAGnE,QAAIE;AACJ,WAAKrB,MACHqB,IAAY,WAAWF,GAAc,GAAG,IAGnC,MAAM;AACX,MAAIE,kBAAwBA,CAAS,GACjCvB,EAAiB,WAAS,aAAaA,EAAiB,OAAO,GACnE,OAAO,oBAAoB,cAAcI,CAAgB,GACrDC,IACFA,EAAgB,oBAAoB,UAAUgB,CAAY,IAE1D,OAAO,oBAAoB,UAAUA,CAAY;AAAA,IAErD;AAAA,EACF,GAAG,CAAC3B,GAAKC,CAAQ,CAAC,GAGhB,gBAAA6B,EAAC,QAAG,WAAU,oXACX,YAAI,IAAI,CAACX,GAAMY,MAAU;AACxB,UAAMC,IAAW/B,MAAakB,EAAK;AACnC,WACE,gBAAAc,EAAC,MAAA,EAAiC,WAAU,iBACzC,UAAA;AAAA,MAAAD,KACC,gBAAAF,EAAC,OAAA,EAAI,WAAU,sIAAA,CAAsI;AAAA,MAEvJ,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM,IAAIX,EAAK,IAAI;AAAA,UACnB,SAAS,CAACe,MAAM;AACd,YAAAA,EAAE,eAAA,GAGFhC,EAAYiB,EAAK,IAAI;AAErB,kBAAMR,IAAkB,SAAS,eAAe,cAAc,GACxDwB,IAAgB,SAAS,eAAehB,EAAK,IAAI;AAEvD,gBAAIR,KAAmBwB,GAAe;AACpC,oBAAMtB,IAAQ,OAAO,iBAAiB,SAAS,eAAe,GACxDC,IAAc,WAAWD,EAAM,iBAAiB,aAAa,KAAK,GAAG,GACrEE,IAAW,WAAWF,EAAM,QAAQ,GACpCG,IAAeF,IAAcC,GAE7BO,IAAgBX,EAAgB,sBAAA,GAEhCY,IADaY,EAAc,sBAAA,EAEpB,MAAMb,EAAc,MAAMX,EAAgB,YAAYK;AAEnE,cAAAL,EAAgB,SAAS;AAAA,gBACvB,KAAKY;AAAA,gBACL,UAAU;AAAA,cAAA,CACX;AAAA,YACH;AAEA,oBAAQ,aAAa,MAAM,IAAI,IAAIJ,EAAK,IAAI,EAAE;AAAA,UAChD;AAAA,UACA,WAAWiB;AAAA,YACT;AAAA,YACAJ,IACI,mHACA;AAAA,UAAA;AAAA,UAGL,UAAAb,EAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACR,EAAA,GA1CO,GAAGA,EAAK,IAAI,IAAIY,CAAK,EA2C9B;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/toc/index.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { TocItem } from '../../types';\nimport { cn } from '../../utils/cn';\n\ninterface TableOfContentsProps {\n toc: TocItem[];\n}\n\nexport function TableOfContents({ toc }: TableOfContentsProps) {\n const [activeId, setActiveId] = useState('');\n const ignoreScrollRef = useRef(false);\n const ignoreTimeoutRef = useRef<NodeJS.Timeout>();\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n ignoreScrollRef.current = false;\n if (ignoreTimeoutRef.current) {\n clearTimeout(ignoreTimeoutRef.current);\n }\n\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n } else {\n setActiveId(toc[0]?.slug || '');\n }\n\n const handleHashChange = () => {\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n }\n };\n\n const scrollContainer = document.getElementById('main-content');\n\n const getActiveHeading = () => {\n if (!scrollContainer) return toc[0]?.slug;\n\n const style = window.getComputedStyle(document.documentElement);\n const scrollMtRem = parseFloat(style.getPropertyValue('--scroll-mt') || '0');\n const fontSize = parseFloat(style.fontSize);\n const scrollOffset = scrollMtRem * fontSize + 100;\n\n const scrollY = scrollContainer.scrollTop;\n const maxScroll = scrollContainer.scrollHeight - scrollContainer.clientHeight;\n const isAtBottom = scrollY >= maxScroll - 10;\n\n const headingPositions = toc\n .map((item) => {\n const element = document.getElementById(item.slug);\n if (!element) return null;\n\n const rect = element.getBoundingClientRect();\n const containerRect = scrollContainer.getBoundingClientRect();\n const relativeTop = rect.top - containerRect.top + scrollY;\n\n return { id: item.slug, top: relativeTop };\n })\n .filter(Boolean) as Array<{ id: string; top: number }>;\n\n if (headingPositions.length === 0) return toc[0]?.slug;\n\n if (isAtBottom) {\n const containerRect = scrollContainer.getBoundingClientRect();\n for (let i = headingPositions.length - 1; i >= 0; i--) {\n const element = document.getElementById(headingPositions[i].id);\n if (element) {\n const rect = element.getBoundingClientRect();\n if (rect.top <= containerRect.bottom && rect.bottom >= containerRect.top) {\n return headingPositions[i].id;\n }\n }\n }\n return headingPositions[headingPositions.length - 1].id;\n }\n\n let currentHeading = headingPositions[0];\n for (const heading of headingPositions) {\n if (scrollY + scrollOffset >= heading.top) {\n currentHeading = heading;\n }\n }\n\n return currentHeading?.id;\n };\n\n const handleScroll = () => {\n if (ignoreScrollRef.current) return;\n\n const newActiveId = getActiveHeading();\n if (newActiveId && newActiveId !== activeId) {\n setActiveId(newActiveId);\n history.replaceState(null, '', `#${newActiveId}`);\n }\n };\n\n window.addEventListener('hashchange', handleHashChange);\n\n if (scrollContainer) {\n scrollContainer.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n } else {\n window.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n let timeoutId: NodeJS.Timeout | undefined;\n if (!hash) {\n timeoutId = setTimeout(handleScroll, 100);\n }\n\n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (ignoreTimeoutRef.current) clearTimeout(ignoreTimeoutRef.current);\n window.removeEventListener('hashchange', handleHashChange);\n if (scrollContainer) {\n scrollContainer.removeEventListener('scroll', handleScroll);\n } else {\n window.removeEventListener('scroll', handleScroll);\n }\n };\n }, [toc, activeId]);\n\n return (\n <ul className=\"mint:list-none mint:flex mint:flex-col mint:gap-2 mint:text-sm mint:text-[#6b7280] mint:dark:text-[#adadad] mint:font-medium mint:relative mint:pl-[0.15rem] mint:before:content-[''] mint:before:absolute mint:before:left-[0.15rem] mint:before:top-0 mint:before:bottom-0 mint:before:w-[2px] mint:before:bg-[#f2f3f3] mint:dark:before:bg-[#222223] mint:before:rounded-full\">\n {toc.map((item, index) => {\n const isActive = activeId === item.slug;\n return (\n <li key={`${item.slug}-${index}`} className=\"mint:relative\">\n {isActive && (\n <div className=\"mint:absolute mint:left-0 mint:top-0 mint:bottom-0 mint:w-[2px] mint:rounded-full mint:bg-[#643fb2] mint:dark:bg-[#c9aaf9] mint:z-1\" />\n )}\n <a\n href={`#${item.slug}`}\n onClick={(e) => {\n e.preventDefault();\n\n setActiveId(item.slug);\n\n ignoreScrollRef.current = true;\n if (ignoreTimeoutRef.current) {\n clearTimeout(ignoreTimeoutRef.current);\n }\n\n const scrollContainer = document.getElementById('main-content');\n const targetElement = document.getElementById(item.slug);\n\n if (scrollContainer && targetElement) {\n const style = window.getComputedStyle(document.documentElement);\n const scrollMtRem = parseFloat(style.getPropertyValue('--scroll-mt') || '0');\n const fontSize = parseFloat(style.fontSize);\n const scrollOffset = scrollMtRem * fontSize;\n\n const containerRect = scrollContainer.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const relativeTop =\n targetRect.top - containerRect.top + scrollContainer.scrollTop - scrollOffset;\n\n const maxScroll = scrollContainer.scrollHeight - scrollContainer.clientHeight;\n const scrollTop = Math.min(relativeTop, maxScroll);\n\n scrollContainer.scrollTo({\n top: scrollTop,\n behavior: 'instant',\n });\n }\n\n history.replaceState(null, '', `#${item.slug}`);\n\n ignoreTimeoutRef.current = setTimeout(() => {\n ignoreScrollRef.current = false;\n }, 100);\n }}\n className={cn(\n 'mint:block mint:pl-6 mint:leading-relaxed mint:no-underline',\n isActive\n ? 'mint:text-[#643fb2] mint:dark:text-[#c9aaf9] mint:[text-shadow:-0.2px_0_0_currentColor,0.2px_0_0_currentColor]'\n : 'mint:text-[#424242] mint:dark:text-[#d6d6d6] mint:dark:hover:text-[#d1d5db] mint:hover:text-[#111827]'\n )}\n >\n {item.title}\n </a>\n </li>\n );\n })}\n </ul>\n );\n}\n"],"names":["TableOfContents","toc","activeId","setActiveId","useState","ignoreScrollRef","useRef","ignoreTimeoutRef","useEffect","hash","_a","handleHashChange","scrollContainer","getActiveHeading","style","scrollMtRem","fontSize","scrollOffset","scrollY","maxScroll","isAtBottom","headingPositions","item","element","rect","containerRect","relativeTop","_b","i","currentHeading","heading","handleScroll","newActiveId","timeoutId","jsx","index","isActive","jsxs","e","targetElement","scrollTop","cn"],"mappings":"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"}
|