{"version":3,"file":"component---src-components-content-page-index-tsx-703f43f74378db9131cf.js","mappings":"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","sources":["webpack://product-docs-site/./src/components/ContentPage/InternalLinks/nested-list.ts","webpack://product-docs-site/./src/components/ContentPage/InternalLinks/index.tsx","webpack://product-docs-site/./src/hooks/use-page-is-helpful.ts","webpack://product-docs-site/./src/components/ContentPage/ArticleFooter/index.tsx","webpack://product-docs-site/./src/lib/create-page-path.ts","webpack://product-docs-site/./src/components/ContentPage/ArticleBody/index.tsx","webpack://product-docs-site/./src/components/ContentPage/index.tsx"],"sourcesContent":["/**\n * Convert a flat array of headings, as provided by MarkdownRemark nodes, into a nested array of headings.\n * This nested structure is used to render the nested Internal Links list.\n */\n\nexport default function createNestedInternalLinksHeadings(\n headings: MarkdownRemarkHeading[],\n depth: number\n): InternalLinksHeading[] {\n const result: InternalLinksHeading[] = []\n\n for (const heading of headings) {\n // Only process headings of the current depth\n if (heading.depth !== depth) {\n continue\n }\n // Find all of the child headings, up until the next sibling of the same depth\n const subsequentHeadings = headings.slice(headings.indexOf(heading) + 1)\n const nextSiblingIndex = subsequentHeadings.findIndex(\n (item) => item.depth === depth\n )\n let children: MarkdownRemarkHeading[] = []\n switch (nextSiblingIndex) {\n case -1:\n children = subsequentHeadings\n break\n case 0:\n children = []\n break\n default:\n children = subsequentHeadings.slice(0, nextSiblingIndex)\n break\n }\n\n result.push({\n id: heading.id,\n value: heading.value,\n children: createNestedInternalLinksHeadings(children, depth + 1),\n })\n }\n\n return result\n}\n","import classNames from 'classnames'\nimport React, { useEffect, useState } from 'react'\nimport decodeHtml from '../../../lib/decode-html'\nimport isBrowser from '../../../lib/is-browser'\nimport './index.scss'\nimport createNestedInternalLinksHeadings from './nested-list'\n\ninterface Props {\n headings: MarkdownRemarkHeading[]\n}\n\ninterface HeadingObserver {\n observer: IntersectionObserver\n target: HTMLElement\n}\n\nexport default function InternalLinks(props: Props) {\n // Restrict links to heading levels 2 and 3\n const headings = props.headings.filter(({ depth }) => depth <= 3)\n\n // Render empty component even if there are no links to avoid breaking layout\n if (headings.length <= 0) {\n return <div className=\"InternalLinks InternalLinks--empty\"></div>\n }\n\n const titleId = 'internal-links-title'\n const pathname = isBrowser() ? location.origin + location.pathname : ''\n const [activeLink, setActiveLink] = useState<string | undefined>(\n headings[0].id\n )\n const linkHeadings = createNestedInternalLinksHeadings(headings, 2)\n\n // Set up intersection observers for page headings\n useEffect(() => {\n const root = document.querySelector('.Layout')\n if (!root) {\n console.warn(\n 'failed to detect observer root - internal links will not update automatically'\n )\n return\n }\n const observers: HeadingObserver[] = []\n const visibleHeadings: string[] = []\n const allHeadings: string[] = headings.reduce((acc: string[], { id }) => {\n acc.push(id)\n return acc\n }, [])\n const getOrderedVisibleHeadings = (): string[] => {\n return allHeadings.filter((heading) => visibleHeadings.includes(heading))\n }\n\n headings.forEach(({ id }) => {\n const target = document.getElementById(id)\n if (!target) {\n return\n }\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.target !== target) {\n return\n }\n if (entry.isIntersecting) {\n visibleHeadings.push(id)\n } else if (visibleHeadings.includes(id)) {\n visibleHeadings.splice(visibleHeadings.indexOf(id), 1)\n }\n const orderedVisibleHeadings = getOrderedVisibleHeadings()\n if (orderedVisibleHeadings.length) {\n setActiveLink(orderedVisibleHeadings[0])\n }\n })\n },\n { root, rootMargin: '-70px 0px 0px 0px' }\n )\n observer.observe(target)\n observers.push({ observer, target })\n })\n return () => {\n observers.forEach(({ observer, target }) => observer.unobserve(target))\n }\n }, [])\n\n const handleLinkClick = (id: string) => {\n if (!isBrowser()) {\n return\n }\n // Defer state update until render is finished to ensure this update supercedes that of the intersection observer.\n // Necessary when two headings are close together in content and navigating to one causes the other's intersection observer to trigger.\n setTimeout(() => setActiveLink(id), 10)\n }\n\n const Item = ({ id, value, children }: InternalLinksHeading) => {\n const title = (isBrowser() ? decodeHtml(value) : value)\n // Remove the wrapping tags added by gatsby-remark-prismjs\n // Relevant when the heading contains an inline code snippet (ex: \"## `methodName()`\")\n .replace('<code class=\"gatsby-code-text\">', '')\n .replace('</code>', '')\n const isActive = id === activeLink\n return (\n <li key={id}>\n <a\n className={classNames({ active: isActive })}\n href={`${pathname}#${id}`}\n onClick={() => handleLinkClick(id)}\n >\n <span>{title}</span>\n </a>\n {children.length > 0 && (\n <ol>\n {children.map((heading: InternalLinksHeading) => (\n <Item\n key={heading.id}\n id={heading.id}\n value={heading.value}\n children={heading.children}\n />\n ))}\n </ol>\n )}\n </li>\n )\n }\n\n return (\n <nav className=\"InternalLinks\" aria-labelledby={titleId}>\n <div className=\"InternalLinks__Sticky\">\n <div className=\"InternalLinks__Title\" id={titleId}>\n <h2>On this page</h2>\n </div>\n <ol>\n {linkHeadings.map(({ id, value, children }) => {\n return <Item key={id} id={id} value={value} children={children} />\n })}\n </ol>\n </div>\n </nav>\n )\n}\n","import { Dispatch, SetStateAction, useEffect, useState } from 'react'\nimport { pageIsHelpful as analyticsEvent } from '../lib/analytics'\nimport isBrowser from '../lib/is-browser'\n\ntype ParsedData = {\n [key: string]: string\n}\n\nconst STORAGE_KEY = 'page-is-helpful'\n\nexport default function usePageIsHelpful(\n path: string\n): [boolean | undefined, Dispatch<SetStateAction<boolean | undefined>>] {\n const getInitialValue = () => getPageValue(path)\n const [value, setValue] = useState(getInitialValue)\n\n // Get value from localStorage when user visits a new page\n useEffect(() => {\n setValue(getPageValue(path))\n }, [path])\n\n // Update localStorage when value is changed\n useEffect(() => {\n if (typeof value !== 'boolean') {\n return\n }\n analyticsEvent({ path, value })\n try {\n localStorage.setItem(\n STORAGE_KEY,\n JSON.stringify({\n ...getData(),\n [path]: value,\n })\n )\n } catch (error) {\n console.log(error)\n }\n }, [value])\n\n return [value, setValue]\n}\n\n/**\n * Get data for all pages from localStorage.\n */\nfunction getData(): ParsedData {\n if (!isBrowser()) {\n return {}\n }\n const data = localStorage.getItem(STORAGE_KEY)\n if (data === null) {\n return {}\n }\n try {\n const parsedData: ParsedData = JSON.parse(data)\n return parsedData\n } catch (error) {\n console.log(error)\n return {}\n }\n}\n\n/**\n * Get a value for a specific page from localStorage.\n */\nfunction getPageValue(path: string): boolean | undefined {\n const data = getData()\n if (!data.hasOwnProperty(path)) {\n return\n }\n return Boolean(data[path])\n}\n","import React, { useEffect, useMemo } from 'react'\nimport './index.scss'\nimport { v4 as createUuid } from 'uuid'\nimport { useGatsbyPageContext } from '../../../context/GatsbyPageContext'\nimport createPagePath from '../../../lib/create-page-path'\nimport usePageIsHelpful from '../../../hooks/use-page-is-helpful'\nimport { Button, Link } from '@deque/cauldron-react'\nimport FreeTrialLink from '../FreeTrialLink'\nimport { useFeedbackModal } from '../../../context/FeedbackModal'\n\nexport default function ArticleFooter() {\n const gatsbyPageContext = useGatsbyPageContext()\n const { contentPackage, freeTrialUrl } = gatsbyPageContext\n const pagePath = createPagePath(gatsbyPageContext)\n const [pageIsHelpful, setPageIsHelpful] = usePageIsHelpful(pagePath)\n const { dispatch: dispatchFeedbackModal } = useFeedbackModal()\n\n // Generate unique id for label association\n const pageHelpfulHeadingId = useMemo(() => createUuid().substring(0, 8), [])\n\n const onPageIsHelpfulClick = (isHelpful: boolean) => {\n setPageIsHelpful(isHelpful)\n }\n\n const createRadioId = (value: boolean) => `page-helpful-radio-${value}`\n\n const onShowFeedbackModalClick = (e: React.SyntheticEvent) => {\n e.preventDefault()\n dispatchFeedbackModal({ type: 'update', value: true })\n }\n\n // Initialize checked state for \"Is this page helpful?\" radio buttons, only on mount.\n useEffect(() => {\n if (typeof pageIsHelpful !== 'boolean') {\n return\n }\n const radioEl = document.getElementById(createRadioId(pageIsHelpful))\n if (!radioEl) {\n return\n }\n radioEl.setAttribute('aria-checked', 'true')\n }, [])\n\n return (\n <div className=\"Article__Footer\">\n <div role=\"radiogroup\" aria-labelledby={pageHelpfulHeadingId}>\n <h2 id={pageHelpfulHeadingId}>Is this page helpful?</h2>\n <div className=\"Feedback__Thumbs\">\n <button\n id={createRadioId(true)}\n role=\"radio\"\n aria-checked={pageIsHelpful === true}\n onClick={() => onPageIsHelpfulClick(true)}\n >\n <img src=\"/images/light/icons/thumbs-up.svg\" alt=\"Yes\" />\n </button>\n <button\n id={createRadioId(false)}\n role=\"radio\"\n aria-checked={pageIsHelpful === false}\n onClick={() => onPageIsHelpfulClick(false)}\n >\n <img src=\"/images/light/icons/thumbs-down.svg\" alt=\"No\" />\n </button>\n </div>\n </div>\n <div>\n <h2>Help us improve this page</h2>\n <Button variant=\"secondary\" onClick={onShowFeedbackModalClick}>\n Send Feedback\n </Button>\n </div>\n {freeTrialUrl && (\n <div>\n <h2>Try {contentPackage.name}</h2>\n <FreeTrialLink url={freeTrialUrl} />\n </div>\n )}\n <div className=\"help-links\">\n <h2>Still need help?</h2>\n <ul>\n <li>\n <Link href=\"https://www.deque.com/help-center/\">\n Visit the Help Center\n </Link>\n </li>\n <li>\n <Link href=\"https://www.deque.com/get-accessibility-help\">\n Contact Us\n </Link>\n </li>\n </ul>\n </div>\n </div>\n )\n}\n","interface PageProps {\n productId: string\n version: string\n locale: string\n pageId: string\n}\n\nexport default function createPagePath({\n productId,\n version,\n locale,\n pageId,\n}: PageProps) {\n if (\n typeof productId !== 'string' ||\n productId.length <= 0 ||\n typeof version !== 'string' ||\n version.length <= 0 ||\n typeof locale !== 'string' ||\n locale.length <= 0 ||\n typeof pageId !== 'string' ||\n pageId.length <= 0\n ) {\n throw new Error('One or more invalid parameters provided')\n }\n return `/${productId}/${version}/${locale}/${pageId}`\n}\n","import React, { useEffect } from 'react'\nimport InternalLinks from '../InternalLinks'\nimport ArticleFooter from '../ArticleFooter'\nimport './index.scss'\n\ninterface ArticleBodyProps {\n children: React.ReactNode\n headings: MarkdownRemarkHeading[]\n}\n\nexport default function ArticleBody(props: ArticleBodyProps) {\n const { children, headings } = props\n const canvasRef = React.useRef<HTMLDivElement>(null)\n\n // Add tabindex to all tables within the content canvas to make them focusable.\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) {\n return\n }\n const tables = canvas.querySelectorAll('table')\n tables.forEach((table) => {\n table.setAttribute('tabindex', '0')\n })\n }, [canvasRef])\n\n return (\n <div className=\"Article__Body\">\n <InternalLinks headings={headings} />\n <div className=\"Article__Content\" ref={canvasRef}>\n {children}\n </div>\n <ArticleFooter />\n </div>\n )\n}\n","import React, { useEffect } from 'react'\nimport { graphql } from 'gatsby'\nimport '@deque/cauldron-styles'\nimport { useGatsbyPageContext } from '../../context/GatsbyPageContext'\nimport { pageView as sendPageViewEvent } from '../../lib/analytics'\nimport ArticleBody from './ArticleBody'\n\ninterface Props {\n data: ContentPageData\n}\n\nexport default function ContentPage(props: Props) {\n const { data } = props\n const { productId, version, locale, pageId, hasPiiBanner } =\n useGatsbyPageContext()\n\n useEffect(() => {\n sendPageViewEvent({\n productId,\n version,\n locale,\n pageId,\n })\n }, [productId, version, locale, pageId])\n\n let htmlContent = data.markdownRemark.html\n\n if (hasPiiBanner) {\n const piiBannerText = `It is never necessary to use Deque's software or services in a way that collects, stores, or shares personal data. Do not use the software or services in a manner that collects, stores, or shares personal data.`\n htmlContent =\n htmlContent + `<hr/><p><strong>Note</strong>: ${piiBannerText}</p>`\n }\n\n return (\n <ArticleBody headings={data.markdownRemark.headings}>\n <div\n dangerouslySetInnerHTML={{\n __html: htmlContent,\n }}\n />\n </ArticleBody>\n )\n}\n\nexport const pageQuery = graphql`\n query ContentPage(\n $productId: String\n $version: String\n $locale: String\n $pageId: String\n ) {\n markdownRemark(\n fields: {\n productId: { eq: $productId }\n version: { eq: $version }\n locale: { eq: $locale }\n pageId: { eq: $pageId }\n }\n ) {\n html\n headings {\n id\n value\n depth\n }\n }\n }\n`\n"],"names":["createNestedInternalLinksHeadings","headings","depth","result","heading","subsequentHeadings","slice","indexOf","nextSiblingIndex","findIndex","item","children","push","id","value","InternalLinks","props","filter","_ref","length","React","className","titleId","pathname","isBrowser","location","origin","activeLink","setActiveLink","useState","linkHeadings","useEffect","root","document","querySelector","console","warn","observers","visibleHeadings","allHeadings","reduce","acc","_ref2","forEach","_ref3","target","getElementById","observer","IntersectionObserver","entries","entry","isIntersecting","includes","splice","orderedVisibleHeadings","rootMargin","observe","_ref4","unobserve","Item","_ref5","title","decodeHtml","replace","isActive","key","classNames","active","href","onClick","setTimeout","handleLinkClick","map","_ref6","STORAGE_KEY","getData","data","localStorage","getItem","JSON","parse","error","log","getPageValue","path","hasOwnProperty","Boolean","ArticleFooter","gatsbyPageContext","useGatsbyPageContext","contentPackage","freeTrialUrl","pagePath","productId","version","locale","pageId","Error","createPagePath","pageIsHelpful","setPageIsHelpful","setValue","getInitialValue","analyticsEvent","setItem","stringify","usePageIsHelpful","dispatch","dispatchFeedbackModal","useFeedbackModal","pageHelpfulHeadingId","useMemo","createUuid","substring","onPageIsHelpfulClick","isHelpful","createRadioId","radioEl","setAttribute","role","src","alt","Button","variant","e","preventDefault","type","name","FreeTrialLink","url","Link","ArticleBody","canvasRef","canvas","current","querySelectorAll","table","ref","ContentPage","hasPiiBanner","sendPageViewEvent","htmlContent","markdownRemark","html","dangerouslySetInnerHTML","__html"],"sourceRoot":""}