{"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":""}