@ably/ui 15.6.0-dev.eb9980fc → 15.7.0-dev.39da77a7

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.
Files changed (94) hide show
  1. package/core/Flyout.js +1 -1
  2. package/core/Flyout.js.map +1 -1
  3. package/core/Header.js +1 -1
  4. package/core/Header.js.map +1 -1
  5. package/core/Meganav/component.js +2 -0
  6. package/core/{LegacyMeganav → Meganav}/component.js.map +1 -1
  7. package/core/Meganav.js +2 -0
  8. package/core/Meganav.js.map +1 -0
  9. package/core/MeganavBlogPostsList/component.js +2 -0
  10. package/core/MeganavBlogPostsList/component.js.map +1 -0
  11. package/core/MeganavBlogPostsList.js.map +1 -1
  12. package/core/MeganavContentCompany.js.map +1 -1
  13. package/core/MeganavContentDevelopers.js.map +1 -1
  14. package/core/MeganavContentProducts.js.map +1 -1
  15. package/core/MeganavContentUseCases.js.map +1 -1
  16. package/core/MeganavControl/component.js +2 -0
  17. package/core/MeganavControl/component.js.map +1 -0
  18. package/core/MeganavControl.js.map +1 -1
  19. package/core/MeganavControlMobileDropdown/component.js +2 -0
  20. package/core/MeganavControlMobileDropdown/component.js.map +1 -0
  21. package/core/MeganavControlMobileDropdown.js.map +1 -1
  22. package/core/MeganavControlMobilePanelClose/component.js +2 -0
  23. package/core/MeganavControlMobilePanelClose/component.js.map +1 -0
  24. package/core/MeganavControlMobilePanelOpen/component.js +2 -0
  25. package/core/MeganavControlMobilePanelOpen/component.js.map +1 -0
  26. package/core/MeganavItemsDesktop.js +1 -1
  27. package/core/MeganavItemsDesktop.js.map +1 -1
  28. package/core/MeganavItemsMobile.js +1 -1
  29. package/core/MeganavItemsMobile.js.map +1 -1
  30. package/core/MeganavItemsSignedIn.js.map +1 -1
  31. package/core/MeganavSearch.js.map +1 -1
  32. package/core/MeganavSearchAutocomplete/component.js +2 -0
  33. package/core/MeganavSearchAutocomplete/component.js.map +1 -0
  34. package/core/MeganavSearchPanel.js.map +1 -1
  35. package/core/MeganavSearchSuggestions/component.js +2 -0
  36. package/core/MeganavSearchSuggestions/component.js.map +1 -0
  37. package/core/MeganavSearchSuggestions.js.map +1 -1
  38. package/core/Notice/component.js +1 -1
  39. package/core/Notice/component.js.map +1 -1
  40. package/core/SignOutLink.js.map +1 -1
  41. package/core/insights/command-queue.js +2 -0
  42. package/core/insights/command-queue.js.map +1 -0
  43. package/core/insights/datalayer.js +2 -0
  44. package/core/insights/datalayer.js.map +1 -0
  45. package/core/insights/index.js +1 -1
  46. package/core/insights/index.js.map +1 -1
  47. package/core/insights/index.test.js +2 -0
  48. package/core/insights/index.test.js.map +1 -0
  49. package/core/insights/logger.js +2 -0
  50. package/core/insights/logger.js.map +1 -0
  51. package/core/insights/mixpanel.js +1 -1
  52. package/core/insights/mixpanel.js.map +1 -1
  53. package/core/insights/posthog.js +1 -1
  54. package/core/insights/posthog.js.map +1 -1
  55. package/core/insights/service.js +2 -0
  56. package/core/insights/service.js.map +1 -0
  57. package/core/insights/types.js.map +1 -1
  58. package/core/styles/colors/computed-colors.json +1 -0
  59. package/index.d.ts +109 -178
  60. package/package.json +8 -4
  61. package/core/LegacyMeganav/MeganavBlogPostsList/component.js +0 -2
  62. package/core/LegacyMeganav/MeganavBlogPostsList/component.js.map +0 -1
  63. package/core/LegacyMeganav/MeganavControl/component.js +0 -2
  64. package/core/LegacyMeganav/MeganavControl/component.js.map +0 -1
  65. package/core/LegacyMeganav/MeganavControlMobileDropdown/component.js +0 -2
  66. package/core/LegacyMeganav/MeganavControlMobileDropdown/component.js.map +0 -1
  67. package/core/LegacyMeganav/MeganavControlMobilePanelClose/component.js +0 -2
  68. package/core/LegacyMeganav/MeganavControlMobilePanelClose/component.js.map +0 -1
  69. package/core/LegacyMeganav/MeganavControlMobilePanelOpen/component.js +0 -2
  70. package/core/LegacyMeganav/MeganavControlMobilePanelOpen/component.js.map +0 -1
  71. package/core/LegacyMeganav/MeganavSearchAutocomplete/component.js +0 -2
  72. package/core/LegacyMeganav/MeganavSearchAutocomplete/component.js.map +0 -1
  73. package/core/LegacyMeganav/MeganavSearchSuggestions/component.js +0 -2
  74. package/core/LegacyMeganav/MeganavSearchSuggestions/component.js.map +0 -1
  75. package/core/LegacyMeganav/component.js +0 -2
  76. package/core/LegacyMeganav.js +0 -2
  77. package/core/LegacyMeganav.js.map +0 -1
  78. package/core/Meganav/.DS_Store +0 -0
  79. package/core/Meganav/Meganav.js +0 -2
  80. package/core/Meganav/Meganav.js.map +0 -1
  81. package/core/Meganav/MeganavMobile.js +0 -2
  82. package/core/Meganav/MeganavMobile.js.map +0 -1
  83. package/core/Meganav/MeganavPanel.js +0 -2
  84. package/core/Meganav/MeganavPanel.js.map +0 -1
  85. package/core/Meganav/data.js +0 -2
  86. package/core/Meganav/data.js.map +0 -1
  87. package/core/Meganav/images/fan-engagement-nav-image.png +0 -0
  88. package/core/Meganav/images/founders-nav-image.png +0 -0
  89. package/core/images/award/g2-best-meets-requirements-2025.png +0 -0
  90. package/core/images/award/g2-best-support-2025.png +0 -0
  91. package/core/images/award/g2-high-performer-2025.png +0 -0
  92. package/core/images/award/g2-users-most-likely-to-recommend-2025.png +0 -0
  93. /package/core/{LegacyMeganav → Meganav}/component.css +0 -0
  94. /package/core/{LegacyMeganav → Meganav}/component.json +0 -0
@@ -0,0 +1,2 @@
1
+ import scrollLock from"scroll-lock";import{queryId}from"../dom-query";const MeganavControlMobileDropdown=({clearPanels})=>{const control=queryId("meganav-control-mobile-dropdown");const dropdown=queryId("meganav-mobile-dropdown");const menuIcon=queryId("meganav-control-mobile-dropdown-menu");const closeIcon=queryId("meganav-control-mobile-dropdown-close");const clickHandler=()=>{const ariaExpanded=control.getAttribute("aria-expanded");if(ariaExpanded==="false"){dropdown.classList.replace("invisible","visible");control.setAttribute("aria-expanded",true);scrollLock.disablePageScroll()}else{dropdown.classList.replace("visible","invisible");control.setAttribute("aria-expanded",false);scrollLock.enablePageScroll();clearPanels()}menuIcon.classList.toggle("hidden");closeIcon.classList.toggle("hidden")};control.addEventListener("click",clickHandler);return{teardown:()=>{control.removeEventListener("click",clickHandler);scrollLock.enablePageScroll()},clear:()=>{dropdown.classList.replace("visible","invisible");control.setAttribute("aria-expanded",false);menuIcon.classList.remove("hidden");closeIcon.classList.add("hidden");scrollLock.enablePageScroll()}}};export default MeganavControlMobileDropdown;
2
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/MeganavControlMobileDropdown/component.js"],"sourcesContent":["import scrollLock from \"scroll-lock\";\n\nimport { queryId } from \"../dom-query\";\n\nconst MeganavControlMobileDropdown = ({ clearPanels }) => {\n const control = queryId(\"meganav-control-mobile-dropdown\");\n const dropdown = queryId(\"meganav-mobile-dropdown\");\n const menuIcon = queryId(\"meganav-control-mobile-dropdown-menu\");\n const closeIcon = queryId(\"meganav-control-mobile-dropdown-close\");\n\n const clickHandler = () => {\n const ariaExpanded = control.getAttribute(\"aria-expanded\");\n\n if (ariaExpanded === \"false\") {\n dropdown.classList.replace(\"invisible\", \"visible\");\n control.setAttribute(\"aria-expanded\", true);\n scrollLock.disablePageScroll();\n } else {\n dropdown.classList.replace(\"visible\", \"invisible\");\n control.setAttribute(\"aria-expanded\", false);\n scrollLock.enablePageScroll();\n clearPanels();\n }\n\n menuIcon.classList.toggle(\"hidden\");\n closeIcon.classList.toggle(\"hidden\");\n };\n\n control.addEventListener(\"click\", clickHandler);\n\n return {\n teardown: () => {\n control.removeEventListener(\"click\", clickHandler);\n scrollLock.enablePageScroll();\n },\n clear: () => {\n dropdown.classList.replace(\"visible\", \"invisible\");\n control.setAttribute(\"aria-expanded\", false);\n menuIcon.classList.remove(\"hidden\");\n closeIcon.classList.add(\"hidden\");\n scrollLock.enablePageScroll();\n },\n };\n};\n\nexport default MeganavControlMobileDropdown;\n"],"names":["scrollLock","queryId","MeganavControlMobileDropdown","clearPanels","control","dropdown","menuIcon","closeIcon","clickHandler","ariaExpanded","getAttribute","classList","replace","setAttribute","disablePageScroll","enablePageScroll","toggle","addEventListener","teardown","removeEventListener","clear","remove","add"],"mappings":"AAAA,OAAOA,eAAgB,aAAc,AAErC,QAASC,OAAO,KAAQ,cAAe,CAEvC,MAAMC,6BAA+B,CAAC,CAAEC,WAAW,CAAE,IACnD,MAAMC,QAAUH,QAAQ,mCACxB,MAAMI,SAAWJ,QAAQ,2BACzB,MAAMK,SAAWL,QAAQ,wCACzB,MAAMM,UAAYN,QAAQ,yCAE1B,MAAMO,aAAe,KACnB,MAAMC,aAAeL,QAAQM,YAAY,CAAC,iBAE1C,GAAID,eAAiB,QAAS,CAC5BJ,SAASM,SAAS,CAACC,OAAO,CAAC,YAAa,WACxCR,QAAQS,YAAY,CAAC,gBAAiB,MACtCb,WAAWc,iBAAiB,EAC9B,KAAO,CACLT,SAASM,SAAS,CAACC,OAAO,CAAC,UAAW,aACtCR,QAAQS,YAAY,CAAC,gBAAiB,OACtCb,WAAWe,gBAAgB,GAC3BZ,aACF,CAEAG,SAASK,SAAS,CAACK,MAAM,CAAC,UAC1BT,UAAUI,SAAS,CAACK,MAAM,CAAC,SAC7B,EAEAZ,QAAQa,gBAAgB,CAAC,QAAST,cAElC,MAAO,CACLU,SAAU,KACRd,QAAQe,mBAAmB,CAAC,QAASX,cACrCR,WAAWe,gBAAgB,EAC7B,EACAK,MAAO,KACLf,SAASM,SAAS,CAACC,OAAO,CAAC,UAAW,aACtCR,QAAQS,YAAY,CAAC,gBAAiB,OACtCP,SAASK,SAAS,CAACU,MAAM,CAAC,UAC1Bd,UAAUI,SAAS,CAACW,GAAG,CAAC,UACxBtB,WAAWe,gBAAgB,EAC7B,CACF,CACF,CAEA,gBAAeb,4BAA6B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/MeganavControlMobileDropdown.tsx"],"sourcesContent":["import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport { MeganavTheme } from \"./LegacyMeganav\";\n\nconst MeganavControlMobileDropdown = ({ theme }: { theme: MeganavTheme }) => (\n <button\n type=\"button\"\n className=\"block ml-24 mr-0 px-0 py-16 hover:text-gui-hover focus:text-gui-focus focus:outline-none\"\n data-id=\"meganav-control-mobile-dropdown\"\n aria-expanded=\"false\"\n aria-controls=\"meganav-mobile-dropdown\"\n >\n <Icon\n name=\"icon-gui-bars-3-outline\"\n size=\"1.5rem\"\n color={theme.mobileMenuColor}\n additionalCSS=\"transition-colors\"\n data-id=\"meganav-control-mobile-dropdown-menu\"\n />\n <Icon\n name=\"icon-gui-x-mark-outline\"\n size=\"1.5rem\"\n color={theme.mobileMenuColor}\n additionalCSS=\"transition-colors hidden\"\n data-id=\"meganav-control-mobile-dropdown-close\"\n />\n </button>\n);\n\nexport default MeganavControlMobileDropdown;\n"],"names":["React","Icon","MeganavControlMobileDropdown","theme","button","type","className","data-id","aria-expanded","aria-controls","name","size","color","mobileMenuColor","additionalCSS"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,SAAU,QAAS,CAG1B,MAAMC,6BAA+B,CAAC,CAAEC,KAAK,CAA2B,GACtE,oBAACC,UACCC,KAAK,SACLC,UAAU,2FACVC,UAAQ,kCACRC,gBAAc,QACdC,gBAAc,2BAEd,oBAACR,MACCS,KAAK,0BACLC,KAAK,SACLC,MAAOT,MAAMU,eAAe,CAC5BC,cAAc,oBACdP,UAAQ,yCAEV,oBAACN,MACCS,KAAK,0BACLC,KAAK,SACLC,MAAOT,MAAMU,eAAe,CAC5BC,cAAc,2BACdP,UAAQ,0CAKd,gBAAeL,4BAA6B"}
1
+ {"version":3,"sources":["../../src/core/MeganavControlMobileDropdown.tsx"],"sourcesContent":["import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport { MeganavTheme } from \"./Meganav\";\n\nconst MeganavControlMobileDropdown = ({ theme }: { theme: MeganavTheme }) => (\n <button\n type=\"button\"\n className=\"block ml-24 mr-0 px-0 py-16 hover:text-gui-hover focus:text-gui-focus focus:outline-none\"\n data-id=\"meganav-control-mobile-dropdown\"\n aria-expanded=\"false\"\n aria-controls=\"meganav-mobile-dropdown\"\n >\n <Icon\n name=\"icon-gui-bars-3-outline\"\n size=\"1.5rem\"\n color={theme.mobileMenuColor}\n additionalCSS=\"transition-colors\"\n data-id=\"meganav-control-mobile-dropdown-menu\"\n />\n <Icon\n name=\"icon-gui-x-mark-outline\"\n size=\"1.5rem\"\n color={theme.mobileMenuColor}\n additionalCSS=\"transition-colors hidden\"\n data-id=\"meganav-control-mobile-dropdown-close\"\n />\n </button>\n);\n\nexport default MeganavControlMobileDropdown;\n"],"names":["React","Icon","MeganavControlMobileDropdown","theme","button","type","className","data-id","aria-expanded","aria-controls","name","size","color","mobileMenuColor","additionalCSS"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,SAAU,QAAS,CAG1B,MAAMC,6BAA+B,CAAC,CAAEC,KAAK,CAA2B,GACtE,oBAACC,UACCC,KAAK,SACLC,UAAU,2FACVC,UAAQ,kCACRC,gBAAc,QACdC,gBAAc,2BAEd,oBAACR,MACCS,KAAK,0BACLC,KAAK,SACLC,MAAOT,MAAMU,eAAe,CAC5BC,cAAc,oBACdP,UAAQ,yCAEV,oBAACN,MACCS,KAAK,0BACLC,KAAK,SACLC,MAAOT,MAAMU,eAAe,CAC5BC,cAAc,2BACdP,UAAQ,0CAKd,gBAAeL,4BAA6B"}
@@ -0,0 +1,2 @@
1
+ import{queryIdAll}from"../dom-query";export default(()=>{const closeControls=Array.from(queryIdAll("meganav-control-mobile-panel-close"));const openControls=Array.from(queryIdAll("meganav-control-mobile-panel-open"));const clickHandler=(btn,openBtn,panel)=>()=>{btn.setAttribute("aria-expanded",false);openBtn.setAttribute("aria-expanded",false);panel.classList.replace("block","hidden");panel.style.height=null};return closeControls.map(btn=>{const openBtn=openControls.find(open=>open.getAttribute("aria-controls")===btn.getAttribute("aria-controls"));const panel=document.querySelector(`#${btn.getAttribute("aria-controls")}`);const handler=clickHandler(btn,openBtn,panel);btn.addEventListener("click",handler);return{teardown:()=>btn.removeEventListener("click",handler),clear:()=>btn.setAttribute("aria-expanded",false)}})});
2
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/MeganavControlMobilePanelClose/component.js"],"sourcesContent":["import { queryIdAll } from \"../dom-query\";\n\nexport default () => {\n const closeControls = Array.from(\n queryIdAll(\"meganav-control-mobile-panel-close\"),\n );\n const openControls = Array.from(\n queryIdAll(\"meganav-control-mobile-panel-open\"),\n );\n\n const clickHandler = (btn, openBtn, panel) => () => {\n btn.setAttribute(\"aria-expanded\", false);\n openBtn.setAttribute(\"aria-expanded\", false);\n panel.classList.replace(\"block\", \"hidden\");\n panel.style.height = null;\n };\n\n return closeControls.map((btn) => {\n const openBtn = openControls.find(\n (open) =>\n open.getAttribute(\"aria-controls\") ===\n btn.getAttribute(\"aria-controls\"),\n );\n const panel = document.querySelector(\n `#${btn.getAttribute(\"aria-controls\")}`,\n );\n const handler = clickHandler(btn, openBtn, panel);\n\n btn.addEventListener(\"click\", handler);\n\n return {\n teardown: () => btn.removeEventListener(\"click\", handler),\n clear: () => btn.setAttribute(\"aria-expanded\", false),\n };\n });\n};\n"],"names":["queryIdAll","closeControls","Array","from","openControls","clickHandler","btn","openBtn","panel","setAttribute","classList","replace","style","height","map","find","open","getAttribute","document","querySelector","handler","addEventListener","teardown","removeEventListener","clear"],"mappings":"AAAA,OAASA,UAAU,KAAQ,cAAe,AAE1C,eAAe,CAAA,KACb,MAAMC,cAAgBC,MAAMC,IAAI,CAC9BH,WAAW,uCAEb,MAAMI,aAAeF,MAAMC,IAAI,CAC7BH,WAAW,sCAGb,MAAMK,aAAe,CAACC,IAAKC,QAASC,QAAU,KAC5CF,IAAIG,YAAY,CAAC,gBAAiB,OAClCF,QAAQE,YAAY,CAAC,gBAAiB,OACtCD,MAAME,SAAS,CAACC,OAAO,CAAC,QAAS,SACjCH,CAAAA,MAAMI,KAAK,CAACC,MAAM,CAAG,IACvB,EAEA,OAAOZ,cAAca,GAAG,CAAC,AAACR,MACxB,MAAMC,QAAUH,aAAaW,IAAI,CAC/B,AAACC,MACCA,KAAKC,YAAY,CAAC,mBAClBX,IAAIW,YAAY,CAAC,kBAErB,MAAMT,MAAQU,SAASC,aAAa,CAClC,CAAC,CAAC,EAAEb,IAAIW,YAAY,CAAC,iBAAiB,CAAC,EAEzC,MAAMG,QAAUf,aAAaC,IAAKC,QAASC,OAE3CF,IAAIe,gBAAgB,CAAC,QAASD,SAE9B,MAAO,CACLE,SAAU,IAAMhB,IAAIiB,mBAAmB,CAAC,QAASH,SACjDI,MAAO,IAAMlB,IAAIG,YAAY,CAAC,gBAAiB,MACjD,CACF,EACF,CAAA,CAAE"}
@@ -0,0 +1,2 @@
1
+ import{queryId,queryIdAll}from"../dom-query";import{remsToPixelValue}from"../css";export default(()=>{const closeControls=Array.from(queryIdAll("meganav-control-mobile-panel-close"));const openControls=Array.from(queryIdAll("meganav-control-mobile-panel-open"));const dropdown=queryId("meganav-mobile-dropdown");const meganavHeight=remsToPixelValue(getComputedStyle(document.documentElement).getPropertyValue("--ui-meganav-height"));const clickHandler=(btn,closeBtn,panel)=>()=>{btn.setAttribute("aria-expanded",true);closeBtn.setAttribute("aria-expanded",true);panel.classList.replace("hidden","block");panel.style.height=`${window.innerHeight-meganavHeight>panel.offsetHeight?panel.offsetHeight:window.innerHeight-meganavHeight}px`};return openControls.map(btn=>{const closeBtn=closeControls.find(node=>node.getAttribute("aria-controls")===btn.getAttribute("aria-controls"));const panel=document.querySelector(`#${btn.getAttribute("aria-controls")}`);const handler=clickHandler(btn,closeBtn,panel);btn.addEventListener("click",handler);return{teardown:()=>btn.removeEventListener("click",handler),clear:()=>{panel.classList.replace("block","hidden");dropdown.classList.remove("ui-meganav-mobile-dropdown-expand");btn.setAttribute("aria-expanded",false);panel.style.height=null}}})});
2
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/MeganavControlMobilePanelOpen/component.js"],"sourcesContent":["import { queryId, queryIdAll } from \"../dom-query\";\nimport { remsToPixelValue } from \"../css\";\n\nexport default () => {\n const closeControls = Array.from(\n queryIdAll(\"meganav-control-mobile-panel-close\"),\n );\n const openControls = Array.from(\n queryIdAll(\"meganav-control-mobile-panel-open\"),\n );\n const dropdown = queryId(\"meganav-mobile-dropdown\");\n\n // Height is defined in rem's so to get the pixel value we need to find the fontSize on root\n const meganavHeight = remsToPixelValue(\n getComputedStyle(document.documentElement).getPropertyValue(\n \"--ui-meganav-height\",\n ),\n );\n\n const clickHandler = (btn, closeBtn, panel) => () => {\n btn.setAttribute(\"aria-expanded\", true);\n closeBtn.setAttribute(\"aria-expanded\", true);\n panel.classList.replace(\"hidden\", \"block\");\n\n // On devices where we don't have enough space for the panel, set it's height to\n // the height of the viewport (minus the meganav height) - this will trigger a scroll.\n // Otherwise just set it to the panel height. This handles the case where the ratio of vertical\n // space to horizontal is especially high (think tablets, but not only).\n panel.style.height = `${\n window.innerHeight - meganavHeight > panel.offsetHeight\n ? panel.offsetHeight\n : window.innerHeight - meganavHeight\n }px`;\n };\n\n return openControls.map((btn) => {\n const closeBtn = closeControls.find(\n (node) =>\n node.getAttribute(\"aria-controls\") ===\n btn.getAttribute(\"aria-controls\"),\n );\n const panel = document.querySelector(\n `#${btn.getAttribute(\"aria-controls\")}`,\n );\n const handler = clickHandler(btn, closeBtn, panel);\n\n btn.addEventListener(\"click\", handler);\n\n return {\n teardown: () => btn.removeEventListener(\"click\", handler),\n clear: () => {\n panel.classList.replace(\"block\", \"hidden\");\n dropdown.classList.remove(\"ui-meganav-mobile-dropdown-expand\");\n btn.setAttribute(\"aria-expanded\", false);\n panel.style.height = null;\n },\n };\n });\n};\n"],"names":["queryId","queryIdAll","remsToPixelValue","closeControls","Array","from","openControls","dropdown","meganavHeight","getComputedStyle","document","documentElement","getPropertyValue","clickHandler","btn","closeBtn","panel","setAttribute","classList","replace","style","height","window","innerHeight","offsetHeight","map","find","node","getAttribute","querySelector","handler","addEventListener","teardown","removeEventListener","clear","remove"],"mappings":"AAAA,OAASA,OAAO,CAAEC,UAAU,KAAQ,cAAe,AACnD,QAASC,gBAAgB,KAAQ,QAAS,AAE1C,eAAe,CAAA,KACb,MAAMC,cAAgBC,MAAMC,IAAI,CAC9BJ,WAAW,uCAEb,MAAMK,aAAeF,MAAMC,IAAI,CAC7BJ,WAAW,sCAEb,MAAMM,SAAWP,QAAQ,2BAGzB,MAAMQ,cAAgBN,iBACpBO,iBAAiBC,SAASC,eAAe,EAAEC,gBAAgB,CACzD,wBAIJ,MAAMC,aAAe,CAACC,IAAKC,SAAUC,QAAU,KAC7CF,IAAIG,YAAY,CAAC,gBAAiB,MAClCF,SAASE,YAAY,CAAC,gBAAiB,MACvCD,MAAME,SAAS,CAACC,OAAO,CAAC,SAAU,QAMlCH,CAAAA,MAAMI,KAAK,CAACC,MAAM,CAAG,CAAC,EACpBC,OAAOC,WAAW,CAAGf,cAAgBQ,MAAMQ,YAAY,CACnDR,MAAMQ,YAAY,CAClBF,OAAOC,WAAW,CAAGf,cAC1B,EAAE,CAAC,AACN,EAEA,OAAOF,aAAamB,GAAG,CAAC,AAACX,MACvB,MAAMC,SAAWZ,cAAcuB,IAAI,CACjC,AAACC,MACCA,KAAKC,YAAY,CAAC,mBAClBd,IAAIc,YAAY,CAAC,kBAErB,MAAMZ,MAAQN,SAASmB,aAAa,CAClC,CAAC,CAAC,EAAEf,IAAIc,YAAY,CAAC,iBAAiB,CAAC,EAEzC,MAAME,QAAUjB,aAAaC,IAAKC,SAAUC,OAE5CF,IAAIiB,gBAAgB,CAAC,QAASD,SAE9B,MAAO,CACLE,SAAU,IAAMlB,IAAImB,mBAAmB,CAAC,QAASH,SACjDI,MAAO,KACLlB,MAAME,SAAS,CAACC,OAAO,CAAC,QAAS,UACjCZ,SAASW,SAAS,CAACiB,MAAM,CAAC,qCAC1BrB,IAAIG,YAAY,CAAC,gBAAiB,MAClCD,CAAAA,MAAMI,KAAK,CAACC,MAAM,CAAG,IACvB,CACF,CACF,EACF,CAAA,CAAE"}
@@ -1,2 +1,2 @@
1
- import React from"react";import MeganavData from"./LegacyMeganav/component.json";import MeganavControl from"./MeganavControl";const MeganavDesktopItems=({panels,paths,theme,absUrl,statusUrl})=>React.createElement("ul",{className:"hidden md:flex","data-id":"meganav-items-desktop"},MeganavData.panels.map(panel=>{const PanelComponent=panels[panel.component];const bgCSS=["products-panel","use-cases-panel"].includes(panel.id)?"ui-meganav-panel-split-bg":"";return React.createElement("li",{className:"ui-meganav-item",key:panel.id},React.createElement(MeganavControl,{theme:theme,ariaControls:panel.id,ariaLabel:panel.label},React.createElement("span",{className:"hidden lg:inline"},panel.label),React.createElement("span",{className:"lg:hidden"},panel.shortLabel)),React.createElement("div",{className:`ui-meganav-panel invisible ${bgCSS}`,id:panel.id,"data-id":"meganav-panel"},React.createElement(PanelComponent,{paths:paths,absUrl:absUrl,statusUrl:statusUrl})))}),React.createElement("li",{className:"ui-meganav-item"},React.createElement("a",{href:absUrl("/pricing"),"data-id":"meganav-link",className:`ui-meganav-link h-64 items-center flex ${theme.textColor}`},"Pricing")));export default React.memo(MeganavDesktopItems);
1
+ import React from"react";import MeganavData from"./Meganav/component.json";import MeganavControl from"./MeganavControl";const MeganavDesktopItems=({panels,paths,theme,absUrl,statusUrl})=>React.createElement("ul",{className:"hidden md:flex","data-id":"meganav-items-desktop"},MeganavData.panels.map(panel=>{const PanelComponent=panels[panel.component];const bgCSS=["products-panel","use-cases-panel"].includes(panel.id)?"ui-meganav-panel-split-bg":"";return React.createElement("li",{className:"ui-meganav-item",key:panel.id},React.createElement(MeganavControl,{theme:theme,ariaControls:panel.id,ariaLabel:panel.label},React.createElement("span",{className:"hidden lg:inline"},panel.label),React.createElement("span",{className:"lg:hidden"},panel.shortLabel)),React.createElement("div",{className:`ui-meganav-panel invisible ${bgCSS}`,id:panel.id,"data-id":"meganav-panel"},React.createElement(PanelComponent,{paths:paths,absUrl:absUrl,statusUrl:statusUrl})))}),React.createElement("li",{className:"ui-meganav-item"},React.createElement("a",{href:absUrl("/pricing"),"data-id":"meganav-link",className:`ui-meganav-link h-64 items-center flex ${theme.textColor}`},"Pricing")));export default React.memo(MeganavDesktopItems);
2
2
  //# sourceMappingURL=MeganavItemsDesktop.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/MeganavItemsDesktop.tsx"],"sourcesContent":["import React from \"react\";\n\nimport MeganavData from \"./LegacyMeganav/component.json\";\nimport MeganavControl from \"./MeganavControl\";\nimport {\n AbsUrl,\n MeganavPanels,\n MeganavPaths,\n MeganavTheme,\n} from \"./LegacyMeganav\";\n\ntype MeganavDesktopItems = {\n panels: MeganavPanels;\n paths?: MeganavPaths;\n theme: MeganavTheme;\n absUrl: AbsUrl;\n statusUrl: string;\n};\n\nconst MeganavDesktopItems = ({\n panels,\n paths,\n theme,\n absUrl,\n statusUrl,\n}: MeganavDesktopItems) => (\n <ul className=\"hidden md:flex\" data-id=\"meganav-items-desktop\">\n {MeganavData.panels.map((panel) => {\n const PanelComponent = panels[panel.component];\n const bgCSS = [\"products-panel\", \"use-cases-panel\"].includes(panel.id)\n ? \"ui-meganav-panel-split-bg\"\n : \"\";\n\n return (\n <li className=\"ui-meganav-item\" key={panel.id}>\n <MeganavControl\n theme={theme}\n ariaControls={panel.id}\n ariaLabel={panel.label}\n >\n <span className=\"hidden lg:inline\">{panel.label}</span>\n <span className=\"lg:hidden\">{panel.shortLabel}</span>\n </MeganavControl>\n\n <div\n className={`ui-meganav-panel invisible ${bgCSS}`}\n id={panel.id}\n data-id=\"meganav-panel\"\n >\n <PanelComponent\n paths={paths}\n absUrl={absUrl}\n statusUrl={statusUrl}\n />\n </div>\n </li>\n );\n })}\n\n <li className=\"ui-meganav-item\">\n <a\n href={absUrl(\"/pricing\")}\n data-id=\"meganav-link\"\n className={`ui-meganav-link h-64 items-center flex ${theme.textColor}`}\n >\n Pricing\n </a>\n </li>\n </ul>\n);\n\nexport default React.memo(MeganavDesktopItems);\n"],"names":["React","MeganavData","MeganavControl","MeganavDesktopItems","panels","paths","theme","absUrl","statusUrl","ul","className","data-id","map","panel","PanelComponent","component","bgCSS","includes","id","li","key","ariaControls","ariaLabel","label","span","shortLabel","div","a","href","textColor","memo"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,gBAAiB,gCAAiC,AACzD,QAAOC,mBAAoB,kBAAmB,CAgB9C,MAAMC,oBAAsB,CAAC,CAC3BC,MAAM,CACNC,KAAK,CACLC,KAAK,CACLC,MAAM,CACNC,SAAS,CACW,GACpB,oBAACC,MAAGC,UAAU,iBAAiBC,UAAQ,yBACpCV,YAAYG,MAAM,CAACQ,GAAG,CAAC,AAACC,QACvB,MAAMC,eAAiBV,MAAM,CAACS,MAAME,SAAS,CAAC,CAC9C,MAAMC,MAAQ,CAAC,iBAAkB,kBAAkB,CAACC,QAAQ,CAACJ,MAAMK,EAAE,EACjE,4BACA,GAEJ,OACE,oBAACC,MAAGT,UAAU,kBAAkBU,IAAKP,MAAMK,EAAE,EAC3C,oBAAChB,gBACCI,MAAOA,MACPe,aAAcR,MAAMK,EAAE,CACtBI,UAAWT,MAAMU,KAAK,EAEtB,oBAACC,QAAKd,UAAU,oBAAoBG,MAAMU,KAAK,EAC/C,oBAACC,QAAKd,UAAU,aAAaG,MAAMY,UAAU,GAG/C,oBAACC,OACChB,UAAW,CAAC,2BAA2B,EAAEM,MAAM,CAAC,CAChDE,GAAIL,MAAMK,EAAE,CACZP,UAAQ,iBAER,oBAACG,gBACCT,MAAOA,MACPE,OAAQA,OACRC,UAAWA,aAKrB,GAEA,oBAACW,MAAGT,UAAU,mBACZ,oBAACiB,KACCC,KAAMrB,OAAO,YACbI,UAAQ,eACRD,UAAW,CAAC,uCAAuC,EAAEJ,MAAMuB,SAAS,CAAC,CAAC,EACvE,YAOP,gBAAe7B,MAAM8B,IAAI,CAAC3B,oBAAqB"}
1
+ {"version":3,"sources":["../../src/core/MeganavItemsDesktop.tsx"],"sourcesContent":["import React from \"react\";\n\nimport MeganavData from \"./Meganav/component.json\";\nimport MeganavControl from \"./MeganavControl\";\nimport { AbsUrl, MeganavPanels, MeganavPaths, MeganavTheme } from \"./Meganav\";\n\ntype MeganavDesktopItems = {\n panels: MeganavPanels;\n paths?: MeganavPaths;\n theme: MeganavTheme;\n absUrl: AbsUrl;\n statusUrl: string;\n};\n\nconst MeganavDesktopItems = ({\n panels,\n paths,\n theme,\n absUrl,\n statusUrl,\n}: MeganavDesktopItems) => (\n <ul className=\"hidden md:flex\" data-id=\"meganav-items-desktop\">\n {MeganavData.panels.map((panel) => {\n const PanelComponent = panels[panel.component];\n const bgCSS = [\"products-panel\", \"use-cases-panel\"].includes(panel.id)\n ? \"ui-meganav-panel-split-bg\"\n : \"\";\n\n return (\n <li className=\"ui-meganav-item\" key={panel.id}>\n <MeganavControl\n theme={theme}\n ariaControls={panel.id}\n ariaLabel={panel.label}\n >\n <span className=\"hidden lg:inline\">{panel.label}</span>\n <span className=\"lg:hidden\">{panel.shortLabel}</span>\n </MeganavControl>\n\n <div\n className={`ui-meganav-panel invisible ${bgCSS}`}\n id={panel.id}\n data-id=\"meganav-panel\"\n >\n <PanelComponent\n paths={paths}\n absUrl={absUrl}\n statusUrl={statusUrl}\n />\n </div>\n </li>\n );\n })}\n\n <li className=\"ui-meganav-item\">\n <a\n href={absUrl(\"/pricing\")}\n data-id=\"meganav-link\"\n className={`ui-meganav-link h-64 items-center flex ${theme.textColor}`}\n >\n Pricing\n </a>\n </li>\n </ul>\n);\n\nexport default React.memo(MeganavDesktopItems);\n"],"names":["React","MeganavData","MeganavControl","MeganavDesktopItems","panels","paths","theme","absUrl","statusUrl","ul","className","data-id","map","panel","PanelComponent","component","bgCSS","includes","id","li","key","ariaControls","ariaLabel","label","span","shortLabel","div","a","href","textColor","memo"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,gBAAiB,0BAA2B,AACnD,QAAOC,mBAAoB,kBAAmB,CAW9C,MAAMC,oBAAsB,CAAC,CAC3BC,MAAM,CACNC,KAAK,CACLC,KAAK,CACLC,MAAM,CACNC,SAAS,CACW,GACpB,oBAACC,MAAGC,UAAU,iBAAiBC,UAAQ,yBACpCV,YAAYG,MAAM,CAACQ,GAAG,CAAC,AAACC,QACvB,MAAMC,eAAiBV,MAAM,CAACS,MAAME,SAAS,CAAC,CAC9C,MAAMC,MAAQ,CAAC,iBAAkB,kBAAkB,CAACC,QAAQ,CAACJ,MAAMK,EAAE,EACjE,4BACA,GAEJ,OACE,oBAACC,MAAGT,UAAU,kBAAkBU,IAAKP,MAAMK,EAAE,EAC3C,oBAAChB,gBACCI,MAAOA,MACPe,aAAcR,MAAMK,EAAE,CACtBI,UAAWT,MAAMU,KAAK,EAEtB,oBAACC,QAAKd,UAAU,oBAAoBG,MAAMU,KAAK,EAC/C,oBAACC,QAAKd,UAAU,aAAaG,MAAMY,UAAU,GAG/C,oBAACC,OACChB,UAAW,CAAC,2BAA2B,EAAEM,MAAM,CAAC,CAChDE,GAAIL,MAAMK,EAAE,CACZP,UAAQ,iBAER,oBAACG,gBACCT,MAAOA,MACPE,OAAQA,OACRC,UAAWA,aAKrB,GAEA,oBAACW,MAAGT,UAAU,mBACZ,oBAACiB,KACCC,KAAMrB,OAAO,YACbI,UAAQ,eACRD,UAAW,CAAC,uCAAuC,EAAEJ,MAAMuB,SAAS,CAAC,CAAC,EACvE,YAOP,gBAAe7B,MAAM8B,IAAI,CAAC3B,oBAAqB"}
@@ -1,2 +1,2 @@
1
- import React from"react";import SignOutLink from"./SignOutLink";import MeganavSearchSuggestions from"./MeganavSearchSuggestions";import Icon from"./Icon";import MeganavData from"./LegacyMeganav/component.json";import MeganavControlMobileDropdown from"./MeganavControlMobileDropdown";import MeganavControlMobilePanelClose from"./MeganavControlMobilePanelClose";import MeganavControlMobilePanelOpen from"./MeganavControlMobilePanelOpen";import MeganavSearchAutocomplete from"./MeganavSearchAutocomplete";const MeganavItemsMobile=({panels,paths,sessionState,theme,loginLink,absUrl,statusUrl,searchDataId})=>{const classNames=`ui-meganav-link ${theme.textColor}`;return React.createElement("ul",{className:"flex md:hidden items-center","data-id":"meganav-items-mobile"},React.createElement("li",null,sessionState?.signedIn&&sessionState?.logOut?React.createElement(SignOutLink,{absUrl:absUrl,...sessionState.logOut},({text,href,onClick})=>React.createElement("a",{onClick:onClick,href:absUrl(href),className:classNames,"data-id":"meganav-link"},text)):React.createElement("a",{href:absUrl(loginLink),className:classNames,"data-id":"meganav-link"},"Login")),React.createElement("li",{className:"ui-meganav-item"},React.createElement(MeganavControlMobileDropdown,{theme:theme}),React.createElement("div",{className:"ui-meganav-mobile-dropdown invisible",id:"meganav-mobile-dropdown","data-id":"meganav-mobile-dropdown"},React.createElement("div",{className:"pt-24 pb-16 ui-grid-px bg-white"},React.createElement("form",{className:"mb-16",action:absUrl("/search"),method:"get"},React.createElement("div",{className:"relative w-full"},React.createElement(Icon,{name:"icon-gui-magnifying-glass-outline",color:"text-cool-black",size:"1.5rem",additionalCSS:"absolute top-12 left-16 hover:text-gui-hover"}),React.createElement("button",{type:"button",className:"absolute top-12 right-16 p-0 focus:outline-none focus-visible:outline-gui-focus m-0 md:hidden invisible","data-id":"meganav-search-input-clear"},React.createElement(Icon,{name:"icon-gui-x-circle-solid",color:"text-dark-grey",size:"1.5rem",additionalCSS:""})),React.createElement("input",{type:"search",name:"q",className:"ui-input px-48 h-48",style:{maxWidth:"none"},placeholder:"Search",autoComplete:"off","data-id":searchDataId??"meganav-mobile-search-input"}),React.createElement(MeganavSearchAutocomplete,null))),React.createElement("div",{className:"max-h-0 overflow-hidden transition-all","data-id":"meganav-mobile-search-suggestions"},React.createElement(MeganavSearchSuggestions,{absUrl:absUrl,displaySupportLink:false})),React.createElement("ul",{className:"mb-16","data-id":"meganav-mobile-panel-controls"},MeganavData.panels.map(panel=>{const PanelComponent=panels[panel.component];const displayHr=["company-panel","developers-panel"].includes(panel.id);return React.createElement("li",{className:"ui-meganav-mobile-item",key:`${panel.id}-mobile`},React.createElement(MeganavControlMobilePanelOpen,{ariaControls:`${panel.id}-mobile`},panel.label),React.createElement("div",{className:"ui-meganav-panel-mobile hidden",id:`${panel.id}-mobile`,"data-scroll-lock-scrollable":true},React.createElement(MeganavControlMobilePanelClose,{ariaControls:`${panel.id}-mobile`,displayHr:displayHr}),React.createElement(PanelComponent,{paths:paths,absUrl:absUrl,statusUrl:statusUrl})))}),React.createElement("li",null,React.createElement("a",{href:absUrl("/pricing"),className:"ui-meganav-mobile-link"},"Pricing"))),React.createElement("hr",{className:"ui-meganav-hr mb-20"}),React.createElement("div",{className:"flex justify-between items-center mb-16"},React.createElement("a",{href:absUrl("/contact"),className:"text-menu2 font-medium block ml-0 mr-8 lg:mx-12 p-0 hover:text-gui-hover focus:text-gui-focus focus:outline-none"},"Contact us"),sessionState?.signedIn&&sessionState?.account?React.createElement("a",{href:absUrl(sessionState.account.links.dashboard.href),className:"ui-btn-secondary"},"Dashboard"):React.createElement("a",{href:absUrl("/sign-up"),className:"ui-btn"},"Sign up free"))))))};export default React.memo(MeganavItemsMobile,(oldState,newState)=>{const{paths:pathsOld,theme:themeOld}=oldState;const{paths:pathsNew,theme:themeNew}=newState;return pathsOld===pathsNew&&themeOld===themeNew&&Object.keys(newState.sessionState||{}).length===0});
1
+ import React from"react";import SignOutLink from"./SignOutLink";import MeganavSearchSuggestions from"./MeganavSearchSuggestions";import Icon from"./Icon";import MeganavData from"./Meganav/component.json";import MeganavControlMobileDropdown from"./MeganavControlMobileDropdown";import MeganavControlMobilePanelClose from"./MeganavControlMobilePanelClose";import MeganavControlMobilePanelOpen from"./MeganavControlMobilePanelOpen";import MeganavSearchAutocomplete from"./MeganavSearchAutocomplete";const MeganavItemsMobile=({panels,paths,sessionState,theme,loginLink,absUrl,statusUrl,searchDataId})=>{const classNames=`ui-meganav-link ${theme.textColor}`;return React.createElement("ul",{className:"flex md:hidden items-center","data-id":"meganav-items-mobile"},React.createElement("li",null,sessionState?.signedIn&&sessionState?.logOut?React.createElement(SignOutLink,{absUrl:absUrl,...sessionState.logOut},({text,href,onClick})=>React.createElement("a",{onClick:onClick,href:absUrl(href),className:classNames,"data-id":"meganav-link"},text)):React.createElement("a",{href:absUrl(loginLink),className:classNames,"data-id":"meganav-link"},"Login")),React.createElement("li",{className:"ui-meganav-item"},React.createElement(MeganavControlMobileDropdown,{theme:theme}),React.createElement("div",{className:"ui-meganav-mobile-dropdown invisible",id:"meganav-mobile-dropdown","data-id":"meganav-mobile-dropdown"},React.createElement("div",{className:"pt-24 pb-16 ui-grid-px bg-white"},React.createElement("form",{className:"mb-16",action:absUrl("/search"),method:"get"},React.createElement("div",{className:"relative w-full"},React.createElement(Icon,{name:"icon-gui-magnifying-glass-outline",color:"text-cool-black",size:"1.5rem",additionalCSS:"absolute top-12 left-16 hover:text-gui-hover"}),React.createElement("button",{type:"button",className:"absolute top-12 right-16 p-0 focus:outline-none focus-visible:outline-gui-focus m-0 md:hidden invisible","data-id":"meganav-search-input-clear"},React.createElement(Icon,{name:"icon-gui-x-circle-solid",color:"text-dark-grey",size:"1.5rem",additionalCSS:""})),React.createElement("input",{type:"search",name:"q",className:"ui-input px-48 h-48",style:{maxWidth:"none"},placeholder:"Search",autoComplete:"off","data-id":searchDataId??"meganav-mobile-search-input"}),React.createElement(MeganavSearchAutocomplete,null))),React.createElement("div",{className:"max-h-0 overflow-hidden transition-all","data-id":"meganav-mobile-search-suggestions"},React.createElement(MeganavSearchSuggestions,{absUrl:absUrl,displaySupportLink:false})),React.createElement("ul",{className:"mb-16","data-id":"meganav-mobile-panel-controls"},MeganavData.panels.map(panel=>{const PanelComponent=panels[panel.component];const displayHr=["company-panel","developers-panel"].includes(panel.id);return React.createElement("li",{className:"ui-meganav-mobile-item",key:`${panel.id}-mobile`},React.createElement(MeganavControlMobilePanelOpen,{ariaControls:`${panel.id}-mobile`},panel.label),React.createElement("div",{className:"ui-meganav-panel-mobile hidden",id:`${panel.id}-mobile`,"data-scroll-lock-scrollable":true},React.createElement(MeganavControlMobilePanelClose,{ariaControls:`${panel.id}-mobile`,displayHr:displayHr}),React.createElement(PanelComponent,{paths:paths,absUrl:absUrl,statusUrl:statusUrl})))}),React.createElement("li",null,React.createElement("a",{href:absUrl("/pricing"),className:"ui-meganav-mobile-link"},"Pricing"))),React.createElement("hr",{className:"ui-meganav-hr mb-20"}),React.createElement("div",{className:"flex justify-between items-center mb-16"},React.createElement("a",{href:absUrl("/contact"),className:"text-menu2 font-medium block ml-0 mr-8 lg:mx-12 p-0 hover:text-gui-hover focus:text-gui-focus focus:outline-none"},"Contact us"),sessionState?.signedIn&&sessionState?.account?React.createElement("a",{href:absUrl(sessionState.account.links.dashboard.href),className:"ui-btn-secondary"},"Dashboard"):React.createElement("a",{href:absUrl("/sign-up"),className:"ui-btn"},"Sign up free"))))))};export default React.memo(MeganavItemsMobile,(oldState,newState)=>{const{paths:pathsOld,theme:themeOld}=oldState;const{paths:pathsNew,theme:themeNew}=newState;return pathsOld===pathsNew&&themeOld===themeNew&&Object.keys(newState.sessionState||{}).length===0});
2
2
  //# sourceMappingURL=MeganavItemsMobile.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/MeganavItemsMobile.tsx"],"sourcesContent":["import React from \"react\";\n\nimport SignOutLink from \"./SignOutLink\";\nimport MeganavSearchSuggestions from \"./MeganavSearchSuggestions\";\nimport Icon from \"./Icon\";\nimport MeganavData from \"./LegacyMeganav/component.json\";\nimport MeganavControlMobileDropdown from \"./MeganavControlMobileDropdown\";\nimport MeganavControlMobilePanelClose from \"./MeganavControlMobilePanelClose\";\nimport MeganavControlMobilePanelOpen from \"./MeganavControlMobilePanelOpen\";\nimport MeganavSearchAutocomplete from \"./MeganavSearchAutocomplete\";\nimport {\n AbsUrl,\n MeganavPanels,\n MeganavPaths,\n MeganavSessionState,\n MeganavTheme,\n} from \"./LegacyMeganav\";\n\ntype MeganavItemsMobileProps = {\n panels: MeganavPanels;\n paths?: MeganavPaths;\n sessionState?: MeganavSessionState;\n theme: MeganavTheme;\n loginLink: string;\n absUrl: AbsUrl;\n statusUrl: string;\n searchDataId?: string;\n};\n\nconst MeganavItemsMobile = ({\n panels,\n paths,\n sessionState,\n theme,\n loginLink,\n absUrl,\n statusUrl,\n searchDataId,\n}: MeganavItemsMobileProps) => {\n const classNames = `ui-meganav-link ${theme.textColor}`;\n\n return (\n <ul className=\"flex md:hidden items-center\" data-id=\"meganav-items-mobile\">\n <li>\n {sessionState?.signedIn && sessionState?.logOut ? (\n <SignOutLink absUrl={absUrl} {...sessionState.logOut}>\n {({ text, href, onClick }) => (\n <a\n onClick={onClick}\n href={absUrl(href)}\n className={classNames}\n data-id=\"meganav-link\"\n >\n {text}\n </a>\n )}\n </SignOutLink>\n ) : (\n <a\n href={absUrl(loginLink)}\n className={classNames}\n data-id=\"meganav-link\"\n >\n Login\n </a>\n )}\n </li>\n\n <li className=\"ui-meganav-item\">\n <MeganavControlMobileDropdown theme={theme} />\n\n <div\n className=\"ui-meganav-mobile-dropdown invisible\"\n id=\"meganav-mobile-dropdown\"\n data-id=\"meganav-mobile-dropdown\"\n >\n <div className=\"pt-24 pb-16 ui-grid-px bg-white\">\n <form className=\"mb-16\" action={absUrl(\"/search\")} method=\"get\">\n <div className=\"relative w-full\">\n <Icon\n name=\"icon-gui-magnifying-glass-outline\"\n color=\"text-cool-black\"\n size=\"1.5rem\"\n additionalCSS=\"absolute top-12 left-16 hover:text-gui-hover\"\n />\n <button\n type=\"button\"\n className=\"absolute top-12 right-16 p-0 focus:outline-none focus-visible:outline-gui-focus m-0 md:hidden invisible\"\n data-id=\"meganav-search-input-clear\"\n >\n <Icon\n name=\"icon-gui-x-circle-solid\"\n color=\"text-dark-grey\"\n size=\"1.5rem\"\n additionalCSS=\"\"\n />\n </button>\n <input\n type=\"search\"\n name=\"q\"\n className=\"ui-input px-48 h-48\"\n style={{ maxWidth: \"none\" }}\n placeholder=\"Search\"\n autoComplete=\"off\"\n data-id={searchDataId ?? \"meganav-mobile-search-input\"}\n />\n\n <MeganavSearchAutocomplete />\n </div>\n </form>\n\n <div\n className=\"max-h-0 overflow-hidden transition-all\"\n data-id=\"meganav-mobile-search-suggestions\"\n >\n <MeganavSearchSuggestions\n absUrl={absUrl}\n displaySupportLink={false}\n />\n </div>\n\n <ul className=\"mb-16\" data-id=\"meganav-mobile-panel-controls\">\n {MeganavData.panels.map((panel) => {\n const PanelComponent = panels[panel.component];\n const displayHr = [\n \"company-panel\",\n \"developers-panel\",\n ].includes(panel.id);\n\n return (\n <li\n className=\"ui-meganav-mobile-item\"\n key={`${panel.id}-mobile`}\n >\n <MeganavControlMobilePanelOpen\n ariaControls={`${panel.id}-mobile`}\n >\n {panel.label}\n </MeganavControlMobilePanelOpen>\n\n <div\n className=\"ui-meganav-panel-mobile hidden\"\n id={`${panel.id}-mobile`}\n data-scroll-lock-scrollable\n >\n <MeganavControlMobilePanelClose\n ariaControls={`${panel.id}-mobile`}\n displayHr={displayHr}\n />\n <PanelComponent\n paths={paths}\n absUrl={absUrl}\n statusUrl={statusUrl}\n />\n </div>\n </li>\n );\n })}\n <li>\n <a href={absUrl(\"/pricing\")} className=\"ui-meganav-mobile-link\">\n Pricing\n </a>\n </li>\n </ul>\n\n <hr className=\"ui-meganav-hr mb-20\" />\n\n <div className=\"flex justify-between items-center mb-16\">\n <a\n href={absUrl(\"/contact\")}\n className=\"text-menu2 font-medium block ml-0 mr-8 lg:mx-12 p-0 hover:text-gui-hover focus:text-gui-focus focus:outline-none\"\n >\n Contact us\n </a>\n {sessionState?.signedIn && sessionState?.account ? (\n <a\n href={absUrl(sessionState.account.links.dashboard.href)}\n className=\"ui-btn-secondary\"\n >\n Dashboard\n </a>\n ) : (\n <a href={absUrl(\"/sign-up\")} className=\"ui-btn\">\n Sign up free\n </a>\n )}\n </div>\n </div>\n </div>\n </li>\n </ul>\n );\n};\n\nexport default React.memo(MeganavItemsMobile, (oldState, newState) => {\n const { paths: pathsOld, theme: themeOld } = oldState;\n const { paths: pathsNew, theme: themeNew } = newState;\n\n return (\n pathsOld === pathsNew &&\n themeOld === themeNew &&\n Object.keys(newState.sessionState || {}).length === 0\n );\n});\n"],"names":["React","SignOutLink","MeganavSearchSuggestions","Icon","MeganavData","MeganavControlMobileDropdown","MeganavControlMobilePanelClose","MeganavControlMobilePanelOpen","MeganavSearchAutocomplete","MeganavItemsMobile","panels","paths","sessionState","theme","loginLink","absUrl","statusUrl","searchDataId","classNames","textColor","ul","className","data-id","li","signedIn","logOut","text","href","onClick","a","div","id","form","action","method","name","color","size","additionalCSS","button","type","input","style","maxWidth","placeholder","autoComplete","displaySupportLink","map","panel","PanelComponent","component","displayHr","includes","key","ariaControls","label","data-scroll-lock-scrollable","hr","account","links","dashboard","memo","oldState","newState","pathsOld","themeOld","pathsNew","themeNew","Object","keys","length"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/core/MeganavItemsMobile.tsx"],"sourcesContent":["import React from \"react\";\n\nimport SignOutLink from \"./SignOutLink\";\nimport MeganavSearchSuggestions from \"./MeganavSearchSuggestions\";\nimport Icon from \"./Icon\";\nimport MeganavData from \"./Meganav/component.json\";\nimport MeganavControlMobileDropdown from \"./MeganavControlMobileDropdown\";\nimport MeganavControlMobilePanelClose from \"./MeganavControlMobilePanelClose\";\nimport MeganavControlMobilePanelOpen from \"./MeganavControlMobilePanelOpen\";\nimport MeganavSearchAutocomplete from \"./MeganavSearchAutocomplete\";\nimport {\n AbsUrl,\n MeganavPanels,\n MeganavPaths,\n MeganavSessionState,\n MeganavTheme,\n} from \"./Meganav\";\n\ntype MeganavItemsMobileProps = {\n panels: MeganavPanels;\n paths?: MeganavPaths;\n sessionState?: MeganavSessionState;\n theme: MeganavTheme;\n loginLink: string;\n absUrl: AbsUrl;\n statusUrl: string;\n searchDataId?: string;\n};\n\nconst MeganavItemsMobile = ({\n panels,\n paths,\n sessionState,\n theme,\n loginLink,\n absUrl,\n statusUrl,\n searchDataId,\n}: MeganavItemsMobileProps) => {\n const classNames = `ui-meganav-link ${theme.textColor}`;\n\n return (\n <ul className=\"flex md:hidden items-center\" data-id=\"meganav-items-mobile\">\n <li>\n {sessionState?.signedIn && sessionState?.logOut ? (\n <SignOutLink absUrl={absUrl} {...sessionState.logOut}>\n {({ text, href, onClick }) => (\n <a\n onClick={onClick}\n href={absUrl(href)}\n className={classNames}\n data-id=\"meganav-link\"\n >\n {text}\n </a>\n )}\n </SignOutLink>\n ) : (\n <a\n href={absUrl(loginLink)}\n className={classNames}\n data-id=\"meganav-link\"\n >\n Login\n </a>\n )}\n </li>\n\n <li className=\"ui-meganav-item\">\n <MeganavControlMobileDropdown theme={theme} />\n\n <div\n className=\"ui-meganav-mobile-dropdown invisible\"\n id=\"meganav-mobile-dropdown\"\n data-id=\"meganav-mobile-dropdown\"\n >\n <div className=\"pt-24 pb-16 ui-grid-px bg-white\">\n <form className=\"mb-16\" action={absUrl(\"/search\")} method=\"get\">\n <div className=\"relative w-full\">\n <Icon\n name=\"icon-gui-magnifying-glass-outline\"\n color=\"text-cool-black\"\n size=\"1.5rem\"\n additionalCSS=\"absolute top-12 left-16 hover:text-gui-hover\"\n />\n <button\n type=\"button\"\n className=\"absolute top-12 right-16 p-0 focus:outline-none focus-visible:outline-gui-focus m-0 md:hidden invisible\"\n data-id=\"meganav-search-input-clear\"\n >\n <Icon\n name=\"icon-gui-x-circle-solid\"\n color=\"text-dark-grey\"\n size=\"1.5rem\"\n additionalCSS=\"\"\n />\n </button>\n <input\n type=\"search\"\n name=\"q\"\n className=\"ui-input px-48 h-48\"\n style={{ maxWidth: \"none\" }}\n placeholder=\"Search\"\n autoComplete=\"off\"\n data-id={searchDataId ?? \"meganav-mobile-search-input\"}\n />\n\n <MeganavSearchAutocomplete />\n </div>\n </form>\n\n <div\n className=\"max-h-0 overflow-hidden transition-all\"\n data-id=\"meganav-mobile-search-suggestions\"\n >\n <MeganavSearchSuggestions\n absUrl={absUrl}\n displaySupportLink={false}\n />\n </div>\n\n <ul className=\"mb-16\" data-id=\"meganav-mobile-panel-controls\">\n {MeganavData.panels.map((panel) => {\n const PanelComponent = panels[panel.component];\n const displayHr = [\n \"company-panel\",\n \"developers-panel\",\n ].includes(panel.id);\n\n return (\n <li\n className=\"ui-meganav-mobile-item\"\n key={`${panel.id}-mobile`}\n >\n <MeganavControlMobilePanelOpen\n ariaControls={`${panel.id}-mobile`}\n >\n {panel.label}\n </MeganavControlMobilePanelOpen>\n\n <div\n className=\"ui-meganav-panel-mobile hidden\"\n id={`${panel.id}-mobile`}\n data-scroll-lock-scrollable\n >\n <MeganavControlMobilePanelClose\n ariaControls={`${panel.id}-mobile`}\n displayHr={displayHr}\n />\n <PanelComponent\n paths={paths}\n absUrl={absUrl}\n statusUrl={statusUrl}\n />\n </div>\n </li>\n );\n })}\n <li>\n <a href={absUrl(\"/pricing\")} className=\"ui-meganav-mobile-link\">\n Pricing\n </a>\n </li>\n </ul>\n\n <hr className=\"ui-meganav-hr mb-20\" />\n\n <div className=\"flex justify-between items-center mb-16\">\n <a\n href={absUrl(\"/contact\")}\n className=\"text-menu2 font-medium block ml-0 mr-8 lg:mx-12 p-0 hover:text-gui-hover focus:text-gui-focus focus:outline-none\"\n >\n Contact us\n </a>\n {sessionState?.signedIn && sessionState?.account ? (\n <a\n href={absUrl(sessionState.account.links.dashboard.href)}\n className=\"ui-btn-secondary\"\n >\n Dashboard\n </a>\n ) : (\n <a href={absUrl(\"/sign-up\")} className=\"ui-btn\">\n Sign up free\n </a>\n )}\n </div>\n </div>\n </div>\n </li>\n </ul>\n );\n};\n\nexport default React.memo(MeganavItemsMobile, (oldState, newState) => {\n const { paths: pathsOld, theme: themeOld } = oldState;\n const { paths: pathsNew, theme: themeNew } = newState;\n\n return (\n pathsOld === pathsNew &&\n themeOld === themeNew &&\n Object.keys(newState.sessionState || {}).length === 0\n );\n});\n"],"names":["React","SignOutLink","MeganavSearchSuggestions","Icon","MeganavData","MeganavControlMobileDropdown","MeganavControlMobilePanelClose","MeganavControlMobilePanelOpen","MeganavSearchAutocomplete","MeganavItemsMobile","panels","paths","sessionState","theme","loginLink","absUrl","statusUrl","searchDataId","classNames","textColor","ul","className","data-id","li","signedIn","logOut","text","href","onClick","a","div","id","form","action","method","name","color","size","additionalCSS","button","type","input","style","maxWidth","placeholder","autoComplete","displaySupportLink","map","panel","PanelComponent","component","displayHr","includes","key","ariaControls","label","data-scroll-lock-scrollable","hr","account","links","dashboard","memo","oldState","newState","pathsOld","themeOld","pathsNew","themeNew","Object","keys","length"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/MeganavItemsSignedIn.tsx"],"sourcesContent":["import React from \"react\";\nimport MeganavSearch from \"./MeganavSearch\";\nimport { AbsUrl, MeganavSessionState, MeganavTheme } from \"./LegacyMeganav\";\n\ntype MeganavItemsSignedIn = {\n sessionState: MeganavSessionState;\n theme: MeganavTheme;\n absUrl: AbsUrl;\n searchDataId?: string;\n};\n\nconst truncate = (string: string, length: number) => {\n return string?.length && string.length > length\n ? `${string.slice(0, length - 1)}…`\n : string;\n};\n\nconst MeganavItemsSignedIn = ({\n sessionState,\n absUrl,\n searchDataId,\n}: MeganavItemsSignedIn) => {\n const accountName = truncate(sessionState.accountName, 20);\n\n return (\n <ul className=\"hidden md:flex items-center\">\n <li className=\"ui-meganav-item relative\">\n <span className=\"ui-meganav-link h-64 hover:text-cool-black mr-0\">\n {accountName}\n </span>\n </li>\n\n <li>\n <MeganavSearch absUrl={absUrl} dataId={searchDataId} />\n </li>\n\n {sessionState.account && (\n <li>\n <a\n href={absUrl(sessionState.account.links.dashboard.href)}\n className=\"ui-btn-secondary p-btn-small\"\n >\n Dashboard\n </a>\n </li>\n )}\n </ul>\n );\n};\n\nexport default MeganavItemsSignedIn;\n"],"names":["React","MeganavSearch","truncate","string","length","slice","MeganavItemsSignedIn","sessionState","absUrl","searchDataId","accountName","ul","className","li","span","dataId","account","a","href","links","dashboard"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAC1B,QAAOC,kBAAmB,iBAAkB,CAU5C,MAAMC,SAAW,CAACC,OAAgBC,UAChC,OAAOD,QAAQC,QAAUD,OAAOC,MAAM,CAAGA,OACrC,CAAC,EAAED,OAAOE,KAAK,CAAC,EAAGD,OAAS,GAAG,CAAC,CAAC,CACjCD,MACN,EAEA,MAAMG,qBAAuB,CAAC,CAC5BC,YAAY,CACZC,MAAM,CACNC,YAAY,CACS,IACrB,MAAMC,YAAcR,SAASK,aAAaG,WAAW,CAAE,IAEvD,OACE,oBAACC,MAAGC,UAAU,+BACZ,oBAACC,MAAGD,UAAU,4BACZ,oBAACE,QAAKF,UAAU,mDACbF,cAIL,oBAACG,UACC,oBAACZ,eAAcO,OAAQA,OAAQO,OAAQN,gBAGxCF,aAAaS,OAAO,EACnB,oBAACH,UACC,oBAACI,KACCC,KAAMV,OAAOD,aAAaS,OAAO,CAACG,KAAK,CAACC,SAAS,CAACF,IAAI,EACtDN,UAAU,gCACX,cAOX,CAEA,gBAAeN,oBAAqB"}
1
+ {"version":3,"sources":["../../src/core/MeganavItemsSignedIn.tsx"],"sourcesContent":["import React from \"react\";\nimport MeganavSearch from \"./MeganavSearch\";\nimport { AbsUrl, MeganavSessionState, MeganavTheme } from \"./Meganav\";\n\ntype MeganavItemsSignedIn = {\n sessionState: MeganavSessionState;\n theme: MeganavTheme;\n absUrl: AbsUrl;\n searchDataId?: string;\n};\n\nconst truncate = (string: string, length: number) => {\n return string?.length && string.length > length\n ? `${string.slice(0, length - 1)}…`\n : string;\n};\n\nconst MeganavItemsSignedIn = ({\n sessionState,\n absUrl,\n searchDataId,\n}: MeganavItemsSignedIn) => {\n const accountName = truncate(sessionState.accountName, 20);\n\n return (\n <ul className=\"hidden md:flex items-center\">\n <li className=\"ui-meganav-item relative\">\n <span className=\"ui-meganav-link h-64 hover:text-cool-black mr-0\">\n {accountName}\n </span>\n </li>\n\n <li>\n <MeganavSearch absUrl={absUrl} dataId={searchDataId} />\n </li>\n\n {sessionState.account && (\n <li>\n <a\n href={absUrl(sessionState.account.links.dashboard.href)}\n className=\"ui-btn-secondary p-btn-small\"\n >\n Dashboard\n </a>\n </li>\n )}\n </ul>\n );\n};\n\nexport default MeganavItemsSignedIn;\n"],"names":["React","MeganavSearch","truncate","string","length","slice","MeganavItemsSignedIn","sessionState","absUrl","searchDataId","accountName","ul","className","li","span","dataId","account","a","href","links","dashboard"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAC1B,QAAOC,kBAAmB,iBAAkB,CAU5C,MAAMC,SAAW,CAACC,OAAgBC,UAChC,OAAOD,QAAQC,QAAUD,OAAOC,MAAM,CAAGA,OACrC,CAAC,EAAED,OAAOE,KAAK,CAAC,EAAGD,OAAS,GAAG,CAAC,CAAC,CACjCD,MACN,EAEA,MAAMG,qBAAuB,CAAC,CAC5BC,YAAY,CACZC,MAAM,CACNC,YAAY,CACS,IACrB,MAAMC,YAAcR,SAASK,aAAaG,WAAW,CAAE,IAEvD,OACE,oBAACC,MAAGC,UAAU,+BACZ,oBAACC,MAAGD,UAAU,4BACZ,oBAACE,QAAKF,UAAU,mDACbF,cAIL,oBAACG,UACC,oBAACZ,eAAcO,OAAQA,OAAQO,OAAQN,gBAGxCF,aAAaS,OAAO,EACnB,oBAACH,UACC,oBAACI,KACCC,KAAMV,OAAOD,aAAaS,OAAO,CAACG,KAAK,CAACC,SAAS,CAACF,IAAI,EACtDN,UAAU,gCACX,cAOX,CAEA,gBAAeN,oBAAqB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/MeganavSearch.tsx"],"sourcesContent":["import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport MeganavSearchPanel from \"./MeganavSearchPanel\";\nimport { AbsUrl } from \"./LegacyMeganav\";\n\nconst MeganavSearch = ({\n absUrl,\n dataId = \"meganav-control\",\n}: {\n absUrl: AbsUrl;\n dataId?: string;\n}) => (\n <>\n <button\n type=\"button\"\n data-id={dataId}\n data-control=\"search\"\n className=\"h-64 w-24 px-24 pr-48 py-20 group focus:outline-none\"\n aria-expanded=\"false\"\n aria-controls=\"panel-search\"\n aria-label={`Show Search Panel`}\n >\n <Icon\n name=\"icon-gui-magnifying-glass-outline\"\n color=\"text-cool-black\"\n size=\"1.5rem\"\n additionalCSS=\"group-hover:text-gui-hover group-focus:text-gui-focus\"\n />\n </button>\n\n <div\n className=\"ui-meganav-panel invisible\"\n id=\"panel-search\"\n data-id=\"meganav-panel\"\n >\n <MeganavSearchPanel absUrl={absUrl} />\n </div>\n </>\n);\n\nexport default MeganavSearch;\n"],"names":["React","Icon","MeganavSearchPanel","MeganavSearch","absUrl","dataId","button","type","data-id","data-control","className","aria-expanded","aria-controls","aria-label","name","color","size","additionalCSS","div","id"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,SAAU,QAAS,AAC1B,QAAOC,uBAAwB,sBAAuB,CAGtD,MAAMC,cAAgB,CAAC,CACrBC,MAAM,CACNC,OAAS,iBAAiB,CAI3B,GACC,wCACE,oBAACC,UACCC,KAAK,SACLC,UAASH,OACTI,eAAa,SACbC,UAAU,uDACVC,gBAAc,QACdC,gBAAc,eACdC,aAAY,CAAC,iBAAiB,CAAC,EAE/B,oBAACZ,MACCa,KAAK,oCACLC,MAAM,kBACNC,KAAK,SACLC,cAAc,2DAIlB,oBAACC,OACCR,UAAU,6BACVS,GAAG,eACHX,UAAQ,iBAER,oBAACN,oBAAmBE,OAAQA,UAKlC,gBAAeD,aAAc"}
1
+ {"version":3,"sources":["../../src/core/MeganavSearch.tsx"],"sourcesContent":["import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport MeganavSearchPanel from \"./MeganavSearchPanel\";\nimport { AbsUrl } from \"./Meganav\";\n\nconst MeganavSearch = ({\n absUrl,\n dataId = \"meganav-control\",\n}: {\n absUrl: AbsUrl;\n dataId?: string;\n}) => (\n <>\n <button\n type=\"button\"\n data-id={dataId}\n data-control=\"search\"\n className=\"h-64 w-24 px-24 pr-48 py-20 group focus:outline-none\"\n aria-expanded=\"false\"\n aria-controls=\"panel-search\"\n aria-label={`Show Search Panel`}\n >\n <Icon\n name=\"icon-gui-magnifying-glass-outline\"\n color=\"text-cool-black\"\n size=\"1.5rem\"\n additionalCSS=\"group-hover:text-gui-hover group-focus:text-gui-focus\"\n />\n </button>\n\n <div\n className=\"ui-meganav-panel invisible\"\n id=\"panel-search\"\n data-id=\"meganav-panel\"\n >\n <MeganavSearchPanel absUrl={absUrl} />\n </div>\n </>\n);\n\nexport default MeganavSearch;\n"],"names":["React","Icon","MeganavSearchPanel","MeganavSearch","absUrl","dataId","button","type","data-id","data-control","className","aria-expanded","aria-controls","aria-label","name","color","size","additionalCSS","div","id"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,SAAU,QAAS,AAC1B,QAAOC,uBAAwB,sBAAuB,CAGtD,MAAMC,cAAgB,CAAC,CACrBC,MAAM,CACNC,OAAS,iBAAiB,CAI3B,GACC,wCACE,oBAACC,UACCC,KAAK,SACLC,UAASH,OACTI,eAAa,SACbC,UAAU,uDACVC,gBAAc,QACdC,gBAAc,eACdC,aAAY,CAAC,iBAAiB,CAAC,EAE/B,oBAACZ,MACCa,KAAK,oCACLC,MAAM,kBACNC,KAAK,SACLC,cAAc,2DAIlB,oBAACC,OACCR,UAAU,6BACVS,GAAG,eACHX,UAAQ,iBAER,oBAACN,oBAAmBE,OAAQA,UAKlC,gBAAeD,aAAc"}
@@ -0,0 +1,2 @@
1
+ import{queryId}from"../dom-query";import AddSearchClient from"addsearch-js-client";const init=({input,container,listContainer,clear,client})=>{client.setAnalyticsTag("Meganav autocomplete");client.setThrottleTime(400);const clearResults=()=>{container.classList.add("hidden");listContainer.innerHTML=""};const toggleClearBtn=query=>{if((query||"").length>0&&clear){clear.classList.remove("invisible")}else if(clear){clear.classList.add("invisible")}};const markQueryInSuggestion=(suggestionValue,query)=>{return suggestionValue.replace(query.toLowerCase(),`<span class="font-light">${query}</span>`)};const navigateToUrl=q=>window.location=`/search?q=${q}`;const focusNext=index=>{const nextSuggestion=listContainer.querySelector(`[data-suggestion-index="${index+1}"]`);if(!nextSuggestion)return;nextSuggestion.focus()};const focusPrevious=index=>{const previousIndex=index-1;const previousSuggestion=listContainer.querySelector(`[data-suggestion-index="${previousIndex}"]`);if(!previousSuggestion)return;previousSuggestion.focus()};const renderResults=query=>(results={})=>{toggleClearBtn(query);if(!Array.isArray(results.suggestions)){clearResults();return}if(results.suggestions.length===0){clearResults();return}const items=results.suggestions.map((suggestion,index)=>{const li=document.createElement("li");const button=document.createElement("button");button.type="button";button.classList.add("ui-text-menu2","font-medium","p-8","w-full","text-left","rounded","hover:text-gui-hover","focus:outline-gui-focus","hover:bg-light-grey");button.innerHTML=markQueryInSuggestion(suggestion.value,query);button.dataset.suggestionIndex=index;button.addEventListener("click",()=>{navigateToUrl(suggestion.value)});button.addEventListener("keydown",e=>{const key=e.key;if(key==="ArrowDown"){focusNext(index)}else if(key==="ArrowUp"&&index-1<0){input.focus()}else if(key==="ArrowUp"&&index-1>=0){focusPrevious(index)}else if(key==="Enter"||key==="Space"){navigateToUrl(suggestion.value)}});li.appendChild(button);return li});listContainer.innerHTML="";items.forEach(item=>listContainer.appendChild(item));container.classList.remove("hidden")};const keyupHandler=e=>{const query=e.target.value;const key=e.key;if(key==="ArrowDown"){focusNext(0);return}if(!query){clearResults()}else{client.suggestions(query,renderResults(query))}};let clearHandler;if(clear){clearHandler=()=>{input.value="";clear.classList.add("invisible");clearResults()};clear.addEventListener("click",clearHandler)}input.addEventListener("keyup",keyupHandler);return{teardown:()=>{input.removeEventListener("keyup",keyupHandler);if(clear)clear.removeEventListener("click",clearHandler)},clear:()=>{input.value="";clearResults()}}};export default(apiKey=>{if(!apiKey){console.log(`No AddSearch API key provided, skipping search suggestions.`);return[]}const client=new AddSearchClient(apiKey);return[queryId("meganav-search-input"),queryId("meganav-mobile-search-input")].filter(i=>i).map(input=>{const parent=input.parentNode;const container=queryId("meganav-search-autocomplete-container",parent);const listContainer=queryId("meganav-search-autocomplete-list",parent);const clear=queryId("meganav-search-input-clear",parent);return init({input,container,listContainer,client,clear})})});
2
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/MeganavSearchAutocomplete/component.js"],"sourcesContent":["import { queryId } from \"../dom-query\";\nimport AddSearchClient from \"addsearch-js-client\";\n\nconst init = ({ input, container, listContainer, clear, client }) => {\n client.setAnalyticsTag(\"Meganav autocomplete\");\n client.setThrottleTime(400);\n\n const clearResults = () => {\n container.classList.add(\"hidden\");\n listContainer.innerHTML = \"\";\n };\n\n const toggleClearBtn = (query) => {\n if ((query || \"\").length > 0 && clear) {\n clear.classList.remove(\"invisible\");\n } else if (clear) {\n clear.classList.add(\"invisible\");\n }\n };\n\n const markQueryInSuggestion = (suggestionValue, query) => {\n return suggestionValue.replace(\n query.toLowerCase(),\n `<span class=\"font-light\">${query}</span>`,\n );\n };\n\n const navigateToUrl = (q) => (window.location = `/search?q=${q}`);\n\n const focusNext = (index) => {\n const nextSuggestion = listContainer.querySelector(\n `[data-suggestion-index=\"${index + 1}\"]`,\n );\n if (!nextSuggestion) return;\n nextSuggestion.focus();\n };\n\n const focusPrevious = (index) => {\n const previousIndex = index - 1;\n\n const previousSuggestion = listContainer.querySelector(\n `[data-suggestion-index=\"${previousIndex}\"]`,\n );\n if (!previousSuggestion) return;\n previousSuggestion.focus();\n };\n\n const renderResults =\n (query) =>\n (results = {}) => {\n toggleClearBtn(query);\n\n // Prevent invalid access error when key is invalid\n if (!Array.isArray(results.suggestions)) {\n clearResults();\n return;\n }\n\n // Prevent key error from invalid key\n if (results.suggestions.length === 0) {\n clearResults();\n return;\n }\n\n const items = results.suggestions.map((suggestion, index) => {\n const li = document.createElement(\"li\");\n const button = document.createElement(\"button\");\n button.type = \"button\";\n\n button.classList.add(\n \"ui-text-menu2\",\n \"font-medium\",\n \"p-8\",\n \"w-full\",\n \"text-left\",\n \"rounded\",\n \"hover:text-gui-hover\",\n \"focus:outline-gui-focus\",\n \"hover:bg-light-grey\",\n );\n\n button.innerHTML = markQueryInSuggestion(suggestion.value, query);\n\n button.dataset.suggestionIndex = index;\n\n button.addEventListener(\"click\", () => {\n navigateToUrl(suggestion.value);\n });\n\n button.addEventListener(\"keydown\", (e) => {\n const key = e.key;\n\n if (key === \"ArrowDown\") {\n focusNext(index);\n } else if (key === \"ArrowUp\" && index - 1 < 0) {\n input.focus();\n } else if (key === \"ArrowUp\" && index - 1 >= 0) {\n focusPrevious(index);\n } else if (key === \"Enter\" || key === \"Space\") {\n navigateToUrl(suggestion.value);\n }\n });\n\n li.appendChild(button);\n return li;\n });\n\n listContainer.innerHTML = \"\";\n items.forEach((item) => listContainer.appendChild(item));\n container.classList.remove(\"hidden\");\n };\n\n const keyupHandler = (e) => {\n const query = e.target.value;\n const key = e.key;\n\n if (key === \"ArrowDown\") {\n focusNext(0);\n return;\n }\n\n if (!query) {\n clearResults();\n } else {\n client.suggestions(query, renderResults(query));\n }\n };\n\n let clearHandler;\n if (clear) {\n clearHandler = () => {\n input.value = \"\";\n clear.classList.add(\"invisible\");\n clearResults();\n };\n clear.addEventListener(\"click\", clearHandler);\n }\n\n input.addEventListener(\"keyup\", keyupHandler);\n\n return {\n teardown: () => {\n input.removeEventListener(\"keyup\", keyupHandler);\n if (clear) clear.removeEventListener(\"click\", clearHandler);\n },\n clear: () => {\n input.value = \"\";\n clearResults();\n },\n };\n};\n\nexport default (apiKey) => {\n if (!apiKey) {\n console.log(`No AddSearch API key provided, skipping search suggestions.`);\n return [];\n }\n\n const client = new AddSearchClient(apiKey);\n\n return [\n queryId(\"meganav-search-input\"),\n queryId(\"meganav-mobile-search-input\"),\n ]\n .filter((i) => i)\n .map((input) => {\n const parent = input.parentNode;\n const container = queryId(\n \"meganav-search-autocomplete-container\",\n parent,\n );\n const listContainer = queryId(\"meganav-search-autocomplete-list\", parent);\n const clear = queryId(\"meganav-search-input-clear\", parent);\n\n return init({ input, container, listContainer, client, clear });\n });\n};\n"],"names":["queryId","AddSearchClient","init","input","container","listContainer","clear","client","setAnalyticsTag","setThrottleTime","clearResults","classList","add","innerHTML","toggleClearBtn","query","length","remove","markQueryInSuggestion","suggestionValue","replace","toLowerCase","navigateToUrl","q","window","location","focusNext","index","nextSuggestion","querySelector","focus","focusPrevious","previousIndex","previousSuggestion","renderResults","results","Array","isArray","suggestions","items","map","suggestion","li","document","createElement","button","type","value","dataset","suggestionIndex","addEventListener","e","key","appendChild","forEach","item","keyupHandler","target","clearHandler","teardown","removeEventListener","apiKey","console","log","filter","i","parent","parentNode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/MeganavSearchPanel.tsx"],"sourcesContent":["import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport MeganavSearchSuggestions from \"./MeganavSearchSuggestions\";\nimport MeganavSearchAutocomplete from \"./MeganavSearchAutocomplete\";\nimport { AbsUrl } from \"./LegacyMeganav\";\n\nconst MeganavSearchPanel = ({ absUrl }: { absUrl: AbsUrl }) => (\n <section className=\"ui-meganav-content grid-cols-12\">\n <div className=\"col-span-8\">\n <div className=\"mb-32\">\n <form\n className=\"flex items-start\"\n action={absUrl(\"/search\")}\n method=\"get\"\n >\n <div className=\"relative w-full\">\n <Icon\n name=\"icon-gui-magnifying-glass-outline\"\n color=\"text-cool-black\"\n size=\"1.5rem\"\n additionalCSS=\"absolute top-12 left-16\"\n />\n <input\n type=\"search\"\n name=\"q\"\n className=\"ui-input pl-48 h-48\"\n placeholder=\"Search\"\n autoComplete=\"off\"\n data-id=\"meganav-search-input\"\n />\n\n <MeganavSearchAutocomplete />\n </div>\n\n <button\n type=\"submit\"\n className=\"ui-btn-secondary flex-shrink-0 ml-8 sm:ml-16 md:ml-24 xl:ml-32\"\n >\n Search\n </button>\n </form>\n </div>\n </div>\n\n <div className=\"col-span-12\">\n <MeganavSearchSuggestions displaySupportLink={true} absUrl={absUrl} />\n </div>\n </section>\n);\n\nexport default MeganavSearchPanel;\n"],"names":["React","Icon","MeganavSearchSuggestions","MeganavSearchAutocomplete","MeganavSearchPanel","absUrl","section","className","div","form","action","method","name","color","size","additionalCSS","input","type","placeholder","autoComplete","data-id","button","displaySupportLink"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,SAAU,QAAS,AAC1B,QAAOC,6BAA8B,4BAA6B,AAClE,QAAOC,8BAA+B,6BAA8B,CAGpE,MAAMC,mBAAqB,CAAC,CAAEC,MAAM,CAAsB,GACxD,oBAACC,WAAQC,UAAU,mCACjB,oBAACC,OAAID,UAAU,cACb,oBAACC,OAAID,UAAU,SACb,oBAACE,QACCF,UAAU,mBACVG,OAAQL,OAAO,WACfM,OAAO,OAEP,oBAACH,OAAID,UAAU,mBACb,oBAACN,MACCW,KAAK,oCACLC,MAAM,kBACNC,KAAK,SACLC,cAAc,4BAEhB,oBAACC,SACCC,KAAK,SACLL,KAAK,IACLL,UAAU,sBACVW,YAAY,SACZC,aAAa,MACbC,UAAQ,yBAGV,oBAACjB,iCAGH,oBAACkB,UACCJ,KAAK,SACLV,UAAU,kEACX,aAOP,oBAACC,OAAID,UAAU,eACb,oBAACL,0BAAyBoB,mBAAoB,KAAMjB,OAAQA,UAKlE,gBAAeD,kBAAmB"}
1
+ {"version":3,"sources":["../../src/core/MeganavSearchPanel.tsx"],"sourcesContent":["import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport MeganavSearchSuggestions from \"./MeganavSearchSuggestions\";\nimport MeganavSearchAutocomplete from \"./MeganavSearchAutocomplete\";\nimport { AbsUrl } from \"./Meganav\";\n\nconst MeganavSearchPanel = ({ absUrl }: { absUrl: AbsUrl }) => (\n <section className=\"ui-meganav-content grid-cols-12\">\n <div className=\"col-span-8\">\n <div className=\"mb-32\">\n <form\n className=\"flex items-start\"\n action={absUrl(\"/search\")}\n method=\"get\"\n >\n <div className=\"relative w-full\">\n <Icon\n name=\"icon-gui-magnifying-glass-outline\"\n color=\"text-cool-black\"\n size=\"1.5rem\"\n additionalCSS=\"absolute top-12 left-16\"\n />\n <input\n type=\"search\"\n name=\"q\"\n className=\"ui-input pl-48 h-48\"\n placeholder=\"Search\"\n autoComplete=\"off\"\n data-id=\"meganav-search-input\"\n />\n\n <MeganavSearchAutocomplete />\n </div>\n\n <button\n type=\"submit\"\n className=\"ui-btn-secondary flex-shrink-0 ml-8 sm:ml-16 md:ml-24 xl:ml-32\"\n >\n Search\n </button>\n </form>\n </div>\n </div>\n\n <div className=\"col-span-12\">\n <MeganavSearchSuggestions displaySupportLink={true} absUrl={absUrl} />\n </div>\n </section>\n);\n\nexport default MeganavSearchPanel;\n"],"names":["React","Icon","MeganavSearchSuggestions","MeganavSearchAutocomplete","MeganavSearchPanel","absUrl","section","className","div","form","action","method","name","color","size","additionalCSS","input","type","placeholder","autoComplete","data-id","button","displaySupportLink"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,SAAU,QAAS,AAC1B,QAAOC,6BAA8B,4BAA6B,AAClE,QAAOC,8BAA+B,6BAA8B,CAGpE,MAAMC,mBAAqB,CAAC,CAAEC,MAAM,CAAsB,GACxD,oBAACC,WAAQC,UAAU,mCACjB,oBAACC,OAAID,UAAU,cACb,oBAACC,OAAID,UAAU,SACb,oBAACE,QACCF,UAAU,mBACVG,OAAQL,OAAO,WACfM,OAAO,OAEP,oBAACH,OAAID,UAAU,mBACb,oBAACN,MACCW,KAAK,oCACLC,MAAM,kBACNC,KAAK,SACLC,cAAc,4BAEhB,oBAACC,SACCC,KAAK,SACLL,KAAK,IACLL,UAAU,sBACVW,YAAY,SACZC,aAAa,MACbC,UAAQ,yBAGV,oBAACjB,iCAGH,oBAACkB,UACCJ,KAAK,SACLV,UAAU,kEACX,aAOP,oBAACC,OAAID,UAAU,eACb,oBAACL,0BAAyBoB,mBAAoB,KAAMjB,OAAQA,UAKlE,gBAAeD,kBAAmB"}
@@ -0,0 +1,2 @@
1
+ import{queryId}from"../dom-query";const DRAG_BUFFER=5;const getTranslateX=node=>new DOMMatrix(window.getComputedStyle(node).transform).e;const updateTranslateX=(node,value)=>node.style.transform=`translateX(${value}px)`;const dragLeftBoundary=(translateX,threshold)=>translateX>=threshold;const dragRightBoundary=(translateX,itemsWidth,windowWidth,threshold)=>Math.abs(translateX-windowWidth+threshold)>itemsWidth;const getDistance=(e,touchStartX)=>e.changedTouches[0]?.clientX-touchStartX;const withinBuffer=distance=>Math.abs(distance)<DRAG_BUFFER;const getItemsTotalWidth=nodes=>nodes.map(item=>item.getBoundingClientRect().width).reduce((acc,val)=>acc+val,0);const MeganavSearchSuggestions=()=>{const suggestionsToggle=queryId("meganav-mobile-search-input");const suggestions=queryId("meganav-mobile-search-suggestions");const list=suggestions.querySelector("ul");const listItems=Array.from(list.querySelectorAll("li"));const dragLeft=(distance,threshold)=>{const currentTranslateX=getTranslateX(list);const translateX=Math.round(currentTranslateX+distance);if(dragLeftBoundary(translateX,threshold))return;updateTranslateX(list,translateX)};const dragLeftEnd=(distance,threshold)=>{const currentTranslateX=getTranslateX(list);let translateX=Math.round(currentTranslateX+distance);if(dragLeftBoundary(translateX,threshold)){translateX=0}updateTranslateX(list,translateX)};const dragRight=(distance,threshold)=>{const listWidth=list.getBoundingClientRect().width;const currentTranslateX=getTranslateX(list);const translateX=Math.round(currentTranslateX+distance);const itemsTotalWidth=getItemsTotalWidth(listItems);if(dragRightBoundary(translateX,itemsTotalWidth,listWidth,threshold)){return}updateTranslateX(list,translateX)};const dragRightEnd=(distance,threshold)=>{const listWidth=list.getBoundingClientRect().width;const currentTranslateX=getTranslateX(list);const itemsTotalWidth=getItemsTotalWidth(listItems);let translateX=Math.round(currentTranslateX+distance);if(dragRightBoundary(translateX,itemsTotalWidth,listWidth,threshold)){translateX=-(itemsTotalWidth-listWidth+threshold)}updateTranslateX(list,translateX)};let touchStartX;const touchstartHandler=e=>{touchStartX=e.touches[0]?.clientX};const touchmoveHandler=e=>{const distance=getDistance(e,touchStartX);if(withinBuffer(distance))return;distance>0?dragLeft(distance,24):dragRight(distance,96)};const touchendHandler=e=>{const distance=getDistance(e,touchStartX);if(withinBuffer(distance))return;distance>0?dragLeftEnd(distance,24):dragRightEnd(distance,48)};const focusSuggestionsHandler=()=>{suggestions.classList.add("max-h-96")};const blurSuggestionsHandler=e=>{if(e.relatedTarget===suggestions.querySelectorAll("a")[0]){return}suggestions.classList.remove("max-h-96")};const wheelHandler=e=>{const distance=e.deltaY*4;if(withinBuffer(distance))return;distance>0?dragLeftEnd(distance,24):dragRightEnd(distance,48)};suggestionsToggle?.addEventListener("focus",focusSuggestionsHandler);suggestionsToggle?.addEventListener("blur",blurSuggestionsHandler);suggestions.addEventListener("touchstart",touchstartHandler);suggestions.addEventListener("touchmove",touchmoveHandler);suggestions.addEventListener("touchend",touchendHandler);suggestions.addEventListener("wheel",wheelHandler);return{teardown:()=>{suggestionsToggle?.removeEventListener("focus",focusSuggestionsHandler);suggestionsToggle?.removeEventListener("blur",blurSuggestionsHandler);suggestions.removeEventListener("touchstart",touchstartHandler);suggestions.removeEventListener("touchmove",touchmoveHandler);suggestions.removeEventListener("touchend",touchendHandler)},clear:()=>{suggestions.classList.remove("max-h-96");list.style.transform=`translateX(0px)`}}};export default MeganavSearchSuggestions;
2
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/MeganavSearchSuggestions/component.js"],"sourcesContent":["import { queryId } from \"../dom-query\";\n\nconst DRAG_BUFFER = 5;\n\nconst getTranslateX = (node) =>\n new DOMMatrix(window.getComputedStyle(node).transform).e;\n\nconst updateTranslateX = (node, value) =>\n (node.style.transform = `translateX(${value}px)`);\n\nconst dragLeftBoundary = (translateX, threshold) => translateX >= threshold;\n\nconst dragRightBoundary = (translateX, itemsWidth, windowWidth, threshold) =>\n Math.abs(translateX - windowWidth + threshold) > itemsWidth;\n\nconst getDistance = (e, touchStartX) =>\n e.changedTouches[0]?.clientX - touchStartX;\n\nconst withinBuffer = (distance) => Math.abs(distance) < DRAG_BUFFER;\n\nconst getItemsTotalWidth = (nodes) =>\n nodes\n .map((item) => item.getBoundingClientRect().width)\n .reduce((acc, val) => acc + val, 0);\n\nconst MeganavSearchSuggestions = () => {\n const suggestionsToggle = queryId(\"meganav-mobile-search-input\");\n const suggestions = queryId(\"meganav-mobile-search-suggestions\");\n const list = suggestions.querySelector(\"ul\");\n const listItems = Array.from(list.querySelectorAll(\"li\"));\n\n const dragLeft = (distance, threshold) => {\n const currentTranslateX = getTranslateX(list);\n const translateX = Math.round(currentTranslateX + distance);\n if (dragLeftBoundary(translateX, threshold)) return;\n updateTranslateX(list, translateX);\n };\n\n const dragLeftEnd = (distance, threshold) => {\n const currentTranslateX = getTranslateX(list);\n let translateX = Math.round(currentTranslateX + distance);\n\n if (dragLeftBoundary(translateX, threshold)) {\n translateX = 0;\n }\n\n updateTranslateX(list, translateX);\n };\n\n const dragRight = (distance, threshold) => {\n const listWidth = list.getBoundingClientRect().width;\n const currentTranslateX = getTranslateX(list);\n const translateX = Math.round(currentTranslateX + distance);\n const itemsTotalWidth = getItemsTotalWidth(listItems);\n\n if (dragRightBoundary(translateX, itemsTotalWidth, listWidth, threshold)) {\n return;\n }\n\n updateTranslateX(list, translateX);\n };\n\n const dragRightEnd = (distance, threshold) => {\n const listWidth = list.getBoundingClientRect().width;\n const currentTranslateX = getTranslateX(list);\n const itemsTotalWidth = getItemsTotalWidth(listItems);\n let translateX = Math.round(currentTranslateX + distance);\n\n if (dragRightBoundary(translateX, itemsTotalWidth, listWidth, threshold)) {\n translateX = -(itemsTotalWidth - listWidth + threshold);\n }\n\n updateTranslateX(list, translateX);\n };\n\n let touchStartX;\n\n const touchstartHandler = (e) => {\n touchStartX = e.touches[0]?.clientX;\n };\n\n const touchmoveHandler = (e) => {\n const distance = getDistance(e, touchStartX);\n if (withinBuffer(distance)) return;\n distance > 0 ? dragLeft(distance, 24) : dragRight(distance, 96);\n };\n\n const touchendHandler = (e) => {\n const distance = getDistance(e, touchStartX);\n if (withinBuffer(distance)) return;\n distance > 0 ? dragLeftEnd(distance, 24) : dragRightEnd(distance, 48);\n };\n\n const focusSuggestionsHandler = () => {\n suggestions.classList.add(\"max-h-96\");\n };\n\n const blurSuggestionsHandler = (e) => {\n if (e.relatedTarget === suggestions.querySelectorAll(\"a\")[0]) {\n return;\n }\n suggestions.classList.remove(\"max-h-96\");\n };\n\n const wheelHandler = (e) => {\n const distance = e.deltaY * 4;\n if (withinBuffer(distance)) return;\n distance > 0 ? dragLeftEnd(distance, 24) : dragRightEnd(distance, 48);\n };\n\n suggestionsToggle?.addEventListener(\"focus\", focusSuggestionsHandler);\n suggestionsToggle?.addEventListener(\"blur\", blurSuggestionsHandler);\n suggestions.addEventListener(\"touchstart\", touchstartHandler);\n suggestions.addEventListener(\"touchmove\", touchmoveHandler);\n suggestions.addEventListener(\"touchend\", touchendHandler);\n suggestions.addEventListener(\"wheel\", wheelHandler);\n\n return {\n teardown: () => {\n suggestionsToggle?.removeEventListener(\"focus\", focusSuggestionsHandler);\n suggestionsToggle?.removeEventListener(\"blur\", blurSuggestionsHandler);\n suggestions.removeEventListener(\"touchstart\", touchstartHandler);\n suggestions.removeEventListener(\"touchmove\", touchmoveHandler);\n suggestions.removeEventListener(\"touchend\", touchendHandler);\n },\n clear: () => {\n suggestions.classList.remove(\"max-h-96\");\n list.style.transform = `translateX(0px)`;\n },\n };\n};\n\nexport default MeganavSearchSuggestions;\n"],"names":["queryId","DRAG_BUFFER","getTranslateX","node","DOMMatrix","window","getComputedStyle","transform","e","updateTranslateX","value","style","dragLeftBoundary","translateX","threshold","dragRightBoundary","itemsWidth","windowWidth","Math","abs","getDistance","touchStartX","changedTouches","clientX","withinBuffer","distance","getItemsTotalWidth","nodes","map","item","getBoundingClientRect","width","reduce","acc","val","MeganavSearchSuggestions","suggestionsToggle","suggestions","list","querySelector","listItems","Array","from","querySelectorAll","dragLeft","currentTranslateX","round","dragLeftEnd","dragRight","listWidth","itemsTotalWidth","dragRightEnd","touchstartHandler","touches","touchmoveHandler","touchendHandler","focusSuggestionsHandler","classList","add","blurSuggestionsHandler","relatedTarget","remove","wheelHandler","deltaY","addEventListener","teardown","removeEventListener","clear"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/MeganavSearchSuggestions.tsx"],"sourcesContent":["import React from \"react\";\n\nimport FeaturedLink from \"./FeaturedLink\";\nimport { AbsUrl } from \"./LegacyMeganav\";\n\ntype MeganavSearchSuggestionsProps = {\n absUrl: AbsUrl;\n displaySupportLink: boolean;\n};\n\nconst MeganavSearchSuggestions = ({\n absUrl,\n displaySupportLink,\n}: MeganavSearchSuggestionsProps) => (\n <>\n <p className=\"ui-text-overline2 text-cool-black py-12\">Popular pages</p>\n\n <div className=\"flex justify-between items-center overflow-hidden\">\n <ul className=\"flex transition-transform\">\n <li className=\"py-12 pr-8 flex-shrink-0\">\n <a\n href={absUrl(\"/docs/how-ably-works\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n How does Ably work?\n </a>\n </li>\n <li className=\"py-12 px-8 flex-shrink-0\">\n <a\n href={absUrl(\"/docs/quick-start-guide\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n Quickstart guide\n </a>\n </li>\n <li className=\"py-12 px-8 flex-shrink-0\">\n <a\n href={absUrl(\"/docs/core-features/pubsub\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n Publish/Subscribe Messaging\n </a>\n </li>\n <li className=\"py-12 pl-8 flex-shrink-0\">\n <a\n href={absUrl(\"/platform\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n Platform\n </a>\n </li>\n </ul>\n {displaySupportLink ? (\n <FeaturedLink url={absUrl(\"/support\")} textSize=\"text-p2\">\n Support\n </FeaturedLink>\n ) : null}\n </div>\n </>\n);\n\nexport default MeganavSearchSuggestions;\n"],"names":["React","FeaturedLink","MeganavSearchSuggestions","absUrl","displaySupportLink","p","className","div","ul","li","a","href","url","textSize"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,iBAAkB,gBAAiB,CAQ1C,MAAMC,yBAA2B,CAAC,CAChCC,MAAM,CACNC,kBAAkB,CACY,GAC9B,wCACE,oBAACC,KAAEC,UAAU,2CAA0C,iBAEvD,oBAACC,OAAID,UAAU,qDACb,oBAACE,MAAGF,UAAU,6BACZ,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,wBACbG,UAAU,+EACX,wBAIH,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,2BACbG,UAAU,+EACX,qBAIH,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,8BACbG,UAAU,+EACX,gCAIH,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,aACbG,UAAU,+EACX,cAKJF,mBACC,oBAACH,cAAaW,IAAKT,OAAO,YAAaU,SAAS,WAAU,WAGxD,MAKV,gBAAeX,wBAAyB"}
1
+ {"version":3,"sources":["../../src/core/MeganavSearchSuggestions.tsx"],"sourcesContent":["import React from \"react\";\n\nimport FeaturedLink from \"./FeaturedLink\";\nimport { AbsUrl } from \"./Meganav\";\n\ntype MeganavSearchSuggestionsProps = {\n absUrl: AbsUrl;\n displaySupportLink: boolean;\n};\n\nconst MeganavSearchSuggestions = ({\n absUrl,\n displaySupportLink,\n}: MeganavSearchSuggestionsProps) => (\n <>\n <p className=\"ui-text-overline2 text-cool-black py-12\">Popular pages</p>\n\n <div className=\"flex justify-between items-center overflow-hidden\">\n <ul className=\"flex transition-transform\">\n <li className=\"py-12 pr-8 flex-shrink-0\">\n <a\n href={absUrl(\"/docs/how-ably-works\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n How does Ably work?\n </a>\n </li>\n <li className=\"py-12 px-8 flex-shrink-0\">\n <a\n href={absUrl(\"/docs/quick-start-guide\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n Quickstart guide\n </a>\n </li>\n <li className=\"py-12 px-8 flex-shrink-0\">\n <a\n href={absUrl(\"/docs/core-features/pubsub\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n Publish/Subscribe Messaging\n </a>\n </li>\n <li className=\"py-12 pl-8 flex-shrink-0\">\n <a\n href={absUrl(\"/platform\")}\n className=\"ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus\"\n >\n Platform\n </a>\n </li>\n </ul>\n {displaySupportLink ? (\n <FeaturedLink url={absUrl(\"/support\")} textSize=\"text-p2\">\n Support\n </FeaturedLink>\n ) : null}\n </div>\n </>\n);\n\nexport default MeganavSearchSuggestions;\n"],"names":["React","FeaturedLink","MeganavSearchSuggestions","absUrl","displaySupportLink","p","className","div","ul","li","a","href","url","textSize"],"mappings":"AAAA,OAAOA,UAAW,OAAQ,AAE1B,QAAOC,iBAAkB,gBAAiB,CAQ1C,MAAMC,yBAA2B,CAAC,CAChCC,MAAM,CACNC,kBAAkB,CACY,GAC9B,wCACE,oBAACC,KAAEC,UAAU,2CAA0C,iBAEvD,oBAACC,OAAID,UAAU,qDACb,oBAACE,MAAGF,UAAU,6BACZ,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,wBACbG,UAAU,+EACX,wBAIH,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,2BACbG,UAAU,+EACX,qBAIH,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,8BACbG,UAAU,+EACX,gCAIH,oBAACG,MAAGH,UAAU,4BACZ,oBAACI,KACCC,KAAMR,OAAO,aACbG,UAAU,+EACX,cAKJF,mBACC,oBAACH,cAAaW,IAAKT,OAAO,YAAaU,SAAS,WAAU,WAGxD,MAKV,gBAAeX,wBAAyB"}
@@ -1,2 +1,2 @@
1
- import Cookie from"js-cookie";import throttle from"lodash.throttle";import{queryId}from"../dom-query";import{FLASH_DATA_ID}from"../Flash";const COOKIE_EXPIRY=90;export const COLLAPSE_TRIGGER_DISTANCE=5;const SCROLL_LISTENER_THROTTLE=100;const RESIZE_LISTENER_THROTTLE=100;const isMdViewport=()=>!window.matchMedia(`(min-width: 65rem)`).matches;const adjustFlashMargin=open=>{const flash=queryId(FLASH_DATA_ID);if(flash){flash.style.marginTop=open?`4rem`:null}};const hideOnMobile=bannerContainer=>{if(isMdViewport()){bannerContainer.style.display="none"}else{bannerContainer.style.display=null}};const hideNotice=bannerContainer=>{bannerContainer.style.maxHeight=0;bannerContainer.style.overflow="hidden";adjustFlashMargin(false)};const showNotice=bannerContainer=>{bannerContainer.style.maxHeight=null;bannerContainer.style.overflow=null;adjustFlashMargin(true)};const setupRememberClosed=(cookieId,noticeId)=>{const cookie=Cookie.get(cookieId)||"";Cookie.set(cookieId,`${cookie.replace(`${noticeId},`,"")+noticeId},`,{expires:COOKIE_EXPIRY})};const hasBeenClosedBefore=(cookieId,noticeId)=>(Cookie.get(cookieId)||"").includes(noticeId);const setupNoticeCollapse=bannerContainer=>{const scrollTop=window.scrollY;if(scrollTop>COLLAPSE_TRIGGER_DISTANCE){hideNotice(bannerContainer)}const listener=throttle(()=>{const scrollTop=window.scrollY;if(scrollTop>COLLAPSE_TRIGGER_DISTANCE){hideNotice(bannerContainer)}else if(bannerContainer.style.overflow){showNotice(bannerContainer)}},SCROLL_LISTENER_THROTTLE);document.addEventListener("scroll",listener);return()=>document.removeEventListener("scroll",listener)};const setupCloseBtn=(bannerContainer,cookieId,noticeId,collapseUnmountListeners)=>{const closeBtn=bannerContainer.querySelector("button");if(!closeBtn)return()=>{};const listener=()=>{if(cookieId&&noticeId)setupRememberClosed(cookieId,noticeId);hideNotice(bannerContainer);collapseUnmountListeners()};closeBtn.addEventListener("click",listener);return()=>document.removeEventListener("click",listener)};const resizeHandler=bannerContainer=>{const handler=throttle(()=>{hideOnMobile(bannerContainer)},RESIZE_LISTENER_THROTTLE);window.addEventListener("resize",handler);return()=>window.removeEventListener("resize",handler)};const Notice=({bannerContainer,cookieId,noticeId,options})=>{if(typeof window==="undefined")return()=>{};if(!bannerContainer){console.warn("A Notice component was initited but no notice container was found.");return()=>{}}if(hasBeenClosedBefore(cookieId,noticeId))return()=>{};hideOnMobile(bannerContainer);showNotice(bannerContainer);const opts={collapse:true,...options};const collapseUnmountListeners=opts.collapse?setupNoticeCollapse(bannerContainer):()=>{};const closeBtnUnmountListeners=setupCloseBtn(bannerContainer,cookieId,noticeId,collapseUnmountListeners);const resizeUnmountListener=resizeHandler(bannerContainer);return()=>{[closeBtnUnmountListeners,collapseUnmountListeners,resizeUnmountListener].forEach(unmount=>unmount())}};export default Notice;
1
+ import Cookie from"js-cookie";import throttle from"lodash.throttle";import{queryId}from"../dom-query";import{FLASH_DATA_ID}from"../Flash";const COOKIE_EXPIRY=90;const COLLAPSE_TRIGGER_DISTANCE=5;const SCROLL_LISTENER_THROTTLE=100;const RESIZE_LISTENER_THROTTLE=100;const isMdViewport=()=>!window.matchMedia(`(min-width: 65rem)`).matches;const adjustFlashMargin=open=>{const flash=queryId(FLASH_DATA_ID);if(flash){flash.style.marginTop=open?`4rem`:null}};const hideOnMobile=bannerContainer=>{if(isMdViewport()){bannerContainer.style.display="none"}else{bannerContainer.style.display=null}};const hideNotice=bannerContainer=>{bannerContainer.style.maxHeight=0;bannerContainer.style.overflow="hidden";adjustFlashMargin(false)};const showNotice=bannerContainer=>{bannerContainer.style.maxHeight=null;bannerContainer.style.overflow=null;adjustFlashMargin(true)};const setupRememberClosed=(cookieId,noticeId)=>{const cookie=Cookie.get(cookieId)||"";Cookie.set(cookieId,`${cookie.replace(`${noticeId},`,"")+noticeId},`,{expires:COOKIE_EXPIRY})};const hasBeenClosedBefore=(cookieId,noticeId)=>(Cookie.get(cookieId)||"").includes(noticeId);const setupNoticeCollapse=bannerContainer=>{const scrollTop=window.scrollY;if(scrollTop>COLLAPSE_TRIGGER_DISTANCE){hideNotice(bannerContainer)}const listener=throttle(()=>{const scrollTop=window.scrollY;if(scrollTop>COLLAPSE_TRIGGER_DISTANCE){hideNotice(bannerContainer)}else if(bannerContainer.style.overflow){showNotice(bannerContainer)}},SCROLL_LISTENER_THROTTLE);document.addEventListener("scroll",listener);return()=>document.removeEventListener("scroll",listener)};const setupCloseBtn=(bannerContainer,cookieId,noticeId,collapseUnmountListeners)=>{const closeBtn=bannerContainer.querySelector("button");if(!closeBtn)return()=>{};const listener=()=>{if(cookieId&&noticeId)setupRememberClosed(cookieId,noticeId);hideNotice(bannerContainer);collapseUnmountListeners()};closeBtn.addEventListener("click",listener);return()=>document.removeEventListener("click",listener)};const resizeHandler=bannerContainer=>{const handler=throttle(()=>{hideOnMobile(bannerContainer)},RESIZE_LISTENER_THROTTLE);window.addEventListener("resize",handler);return()=>window.removeEventListener("resize",handler)};const Notice=({bannerContainer,cookieId,noticeId,options})=>{if(typeof window==="undefined")return()=>{};if(!bannerContainer){console.warn("A Notice component was initited but no notice container was found.");return()=>{}}if(hasBeenClosedBefore(cookieId,noticeId))return()=>{};hideOnMobile(bannerContainer);showNotice(bannerContainer);const opts={collapse:true,...options};const collapseUnmountListeners=opts.collapse?setupNoticeCollapse(bannerContainer):()=>{};const closeBtnUnmountListeners=setupCloseBtn(bannerContainer,cookieId,noticeId,collapseUnmountListeners);const resizeUnmountListener=resizeHandler(bannerContainer);return()=>{[closeBtnUnmountListeners,collapseUnmountListeners,resizeUnmountListener].forEach(unmount=>unmount())}};export default Notice;
2
2
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/Notice/component.js"],"sourcesContent":["import Cookie from \"js-cookie\";\nimport throttle from \"lodash.throttle\";\n\nimport { queryId } from \"../dom-query\";\nimport { FLASH_DATA_ID } from \"../Flash\";\n\nconst COOKIE_EXPIRY = 90;\nexport const COLLAPSE_TRIGGER_DISTANCE = 5;\nconst SCROLL_LISTENER_THROTTLE = 100;\nconst RESIZE_LISTENER_THROTTLE = 100;\n\nconst isMdViewport = () => !window.matchMedia(`(min-width: 65rem)`).matches;\n\nconst adjustFlashMargin = (open) => {\n // HACK ALERT\n // Add margin to flashes when opening the notice.\n // Flashes are react components and this notice needs to work as a view-component and react component.\n // We could do this with redux but then we potentially update state on every scroll event, which\n // even with debounce will deplate our frame budget.\n\n const flash = queryId(FLASH_DATA_ID);\n\n if (flash) {\n flash.style.marginTop = open ? `4rem` : null;\n }\n};\n\nconst hideOnMobile = (bannerContainer) => {\n if (isMdViewport()) {\n bannerContainer.style.display = \"none\";\n } else {\n bannerContainer.style.display = null;\n }\n};\n\nconst hideNotice = (bannerContainer) => {\n bannerContainer.style.maxHeight = 0;\n bannerContainer.style.overflow = \"hidden\";\n\n adjustFlashMargin(false);\n};\n\nconst showNotice = (bannerContainer) => {\n bannerContainer.style.maxHeight = null;\n bannerContainer.style.overflow = null;\n\n adjustFlashMargin(true);\n};\n\nconst setupRememberClosed = (cookieId, noticeId) => {\n const cookie = Cookie.get(cookieId) || \"\";\n\n Cookie.set(cookieId, `${cookie.replace(`${noticeId},`, \"\") + noticeId},`, {\n expires: COOKIE_EXPIRY,\n });\n};\n\nconst hasBeenClosedBefore = (cookieId, noticeId) =>\n (Cookie.get(cookieId) || \"\").includes(noticeId);\n\nconst setupNoticeCollapse = (bannerContainer) => {\n const scrollTop = window.scrollY;\n\n if (scrollTop > COLLAPSE_TRIGGER_DISTANCE) {\n hideNotice(bannerContainer);\n }\n\n const listener = throttle(() => {\n const scrollTop = window.scrollY;\n\n if (scrollTop > COLLAPSE_TRIGGER_DISTANCE) {\n hideNotice(bannerContainer);\n } else if (bannerContainer.style.overflow) {\n showNotice(bannerContainer);\n }\n }, SCROLL_LISTENER_THROTTLE);\n\n document.addEventListener(\"scroll\", listener);\n\n return () => document.removeEventListener(\"scroll\", listener);\n};\n\nconst setupCloseBtn = (\n bannerContainer,\n cookieId,\n noticeId,\n collapseUnmountListeners,\n) => {\n const closeBtn = bannerContainer.querySelector(\"button\");\n\n if (!closeBtn) return () => {};\n\n const listener = () => {\n if (cookieId && noticeId) setupRememberClosed(cookieId, noticeId);\n\n hideNotice(bannerContainer);\n collapseUnmountListeners();\n };\n\n closeBtn.addEventListener(\"click\", listener);\n\n return () => document.removeEventListener(\"click\", listener);\n};\n\nconst resizeHandler = (bannerContainer) => {\n const handler = throttle(() => {\n hideOnMobile(bannerContainer);\n }, RESIZE_LISTENER_THROTTLE);\n\n window.addEventListener(\"resize\", handler);\n\n return () => window.removeEventListener(\"resize\", handler);\n};\n\nconst Notice = ({ bannerContainer, cookieId, noticeId, options }) => {\n if (typeof window === \"undefined\") return () => {};\n\n if (!bannerContainer) {\n console.warn(\n \"A Notice component was initited but no notice container was found.\",\n );\n return () => {};\n }\n\n if (hasBeenClosedBefore(cookieId, noticeId)) return () => {};\n\n hideOnMobile(bannerContainer);\n showNotice(bannerContainer);\n\n const opts = { collapse: true, ...options };\n\n const collapseUnmountListeners = opts.collapse\n ? setupNoticeCollapse(bannerContainer)\n : () => {};\n\n const closeBtnUnmountListeners = setupCloseBtn(\n bannerContainer,\n cookieId,\n noticeId,\n collapseUnmountListeners,\n );\n\n const resizeUnmountListener = resizeHandler(bannerContainer);\n\n return () => {\n [\n closeBtnUnmountListeners,\n collapseUnmountListeners,\n resizeUnmountListener,\n ].forEach((unmount) => unmount());\n };\n};\n\nexport default Notice;\n"],"names":["Cookie","throttle","queryId","FLASH_DATA_ID","COOKIE_EXPIRY","COLLAPSE_TRIGGER_DISTANCE","SCROLL_LISTENER_THROTTLE","RESIZE_LISTENER_THROTTLE","isMdViewport","window","matchMedia","matches","adjustFlashMargin","open","flash","style","marginTop","hideOnMobile","bannerContainer","display","hideNotice","maxHeight","overflow","showNotice","setupRememberClosed","cookieId","noticeId","cookie","get","set","replace","expires","hasBeenClosedBefore","includes","setupNoticeCollapse","scrollTop","scrollY","listener","document","addEventListener","removeEventListener","setupCloseBtn","collapseUnmountListeners","closeBtn","querySelector","resizeHandler","handler","Notice","options","console","warn","opts","collapse","closeBtnUnmountListeners","resizeUnmountListener","forEach","unmount"],"mappings":"AAAA,OAAOA,WAAY,WAAY,AAC/B,QAAOC,aAAc,iBAAkB,AAEvC,QAASC,OAAO,KAAQ,cAAe,AACvC,QAASC,aAAa,KAAQ,UAAW,CAEzC,MAAMC,cAAgB,EACtB,QAAO,MAAMC,0BAA4B,CAAE,CAC3C,MAAMC,yBAA2B,IACjC,MAAMC,yBAA2B,IAEjC,MAAMC,aAAe,IAAM,CAACC,OAAOC,UAAU,CAAC,CAAC,kBAAkB,CAAC,EAAEC,OAAO,CAE3E,MAAMC,kBAAoB,AAACC,OAOzB,MAAMC,MAAQZ,QAAQC,eAEtB,GAAIW,MAAO,CACTA,MAAMC,KAAK,CAACC,SAAS,CAAGH,KAAO,CAAC,IAAI,CAAC,CAAG,IAC1C,CACF,EAEA,MAAMI,aAAe,AAACC,kBACpB,GAAIV,eAAgB,CAClBU,gBAAgBH,KAAK,CAACI,OAAO,CAAG,MAClC,KAAO,CACLD,gBAAgBH,KAAK,CAACI,OAAO,CAAG,IAClC,CACF,EAEA,MAAMC,WAAa,AAACF,kBAClBA,gBAAgBH,KAAK,CAACM,SAAS,CAAG,CAClCH,CAAAA,gBAAgBH,KAAK,CAACO,QAAQ,CAAG,SAEjCV,kBAAkB,MACpB,EAEA,MAAMW,WAAa,AAACL,kBAClBA,gBAAgBH,KAAK,CAACM,SAAS,CAAG,IAClCH,CAAAA,gBAAgBH,KAAK,CAACO,QAAQ,CAAG,KAEjCV,kBAAkB,KACpB,EAEA,MAAMY,oBAAsB,CAACC,SAAUC,YACrC,MAAMC,OAAS3B,OAAO4B,GAAG,CAACH,WAAa,GAEvCzB,OAAO6B,GAAG,CAACJ,SAAU,CAAC,EAAEE,OAAOG,OAAO,CAAC,CAAC,EAAEJ,SAAS,CAAC,CAAC,CAAE,IAAMA,SAAS,CAAC,CAAC,CAAE,CACxEK,QAAS3B,aACX,EACF,EAEA,MAAM4B,oBAAsB,CAACP,SAAUC,WACrC,AAAC1B,CAAAA,OAAO4B,GAAG,CAACH,WAAa,EAAC,EAAGQ,QAAQ,CAACP,UAExC,MAAMQ,oBAAsB,AAAChB,kBAC3B,MAAMiB,UAAY1B,OAAO2B,OAAO,CAEhC,GAAID,UAAY9B,0BAA2B,CACzCe,WAAWF,gBACb,CAEA,MAAMmB,SAAWpC,SAAS,KACxB,MAAMkC,UAAY1B,OAAO2B,OAAO,CAEhC,GAAID,UAAY9B,0BAA2B,CACzCe,WAAWF,gBACb,MAAO,GAAIA,gBAAgBH,KAAK,CAACO,QAAQ,CAAE,CACzCC,WAAWL,gBACb,CACF,EAAGZ,0BAEHgC,SAASC,gBAAgB,CAAC,SAAUF,UAEpC,MAAO,IAAMC,SAASE,mBAAmB,CAAC,SAAUH,SACtD,EAEA,MAAMI,cAAgB,CACpBvB,gBACAO,SACAC,SACAgB,4BAEA,MAAMC,SAAWzB,gBAAgB0B,aAAa,CAAC,UAE/C,GAAI,CAACD,SAAU,MAAO,KAAO,EAE7B,MAAMN,SAAW,KACf,GAAIZ,UAAYC,SAAUF,oBAAoBC,SAAUC,UAExDN,WAAWF,iBACXwB,0BACF,EAEAC,SAASJ,gBAAgB,CAAC,QAASF,UAEnC,MAAO,IAAMC,SAASE,mBAAmB,CAAC,QAASH,SACrD,EAEA,MAAMQ,cAAgB,AAAC3B,kBACrB,MAAM4B,QAAU7C,SAAS,KACvBgB,aAAaC,gBACf,EAAGX,0BAEHE,OAAO8B,gBAAgB,CAAC,SAAUO,SAElC,MAAO,IAAMrC,OAAO+B,mBAAmB,CAAC,SAAUM,QACpD,EAEA,MAAMC,OAAS,CAAC,CAAE7B,eAAe,CAAEO,QAAQ,CAAEC,QAAQ,CAAEsB,OAAO,CAAE,IAC9D,GAAI,OAAOvC,SAAW,YAAa,MAAO,KAAO,EAEjD,GAAI,CAACS,gBAAiB,CACpB+B,QAAQC,IAAI,CACV,sEAEF,MAAO,KAAO,CAChB,CAEA,GAAIlB,oBAAoBP,SAAUC,UAAW,MAAO,KAAO,EAE3DT,aAAaC,iBACbK,WAAWL,iBAEX,MAAMiC,KAAO,CAAEC,SAAU,KAAM,GAAGJ,OAAO,AAAC,EAE1C,MAAMN,yBAA2BS,KAAKC,QAAQ,CAC1ClB,oBAAoBhB,iBACpB,KAAO,EAEX,MAAMmC,yBAA2BZ,cAC/BvB,gBACAO,SACAC,SACAgB,0BAGF,MAAMY,sBAAwBT,cAAc3B,iBAE5C,MAAO,KACL,CACEmC,yBACAX,yBACAY,sBACD,CAACC,OAAO,CAAC,AAACC,SAAYA,UACzB,CACF,CAEA,gBAAeT,MAAO"}
1
+ {"version":3,"sources":["../../../src/core/Notice/component.js"],"sourcesContent":["import Cookie from \"js-cookie\";\nimport throttle from \"lodash.throttle\";\n\nimport { queryId } from \"../dom-query\";\nimport { FLASH_DATA_ID } from \"../Flash\";\n\nconst COOKIE_EXPIRY = 90;\nconst COLLAPSE_TRIGGER_DISTANCE = 5;\nconst SCROLL_LISTENER_THROTTLE = 100;\nconst RESIZE_LISTENER_THROTTLE = 100;\n\nconst isMdViewport = () => !window.matchMedia(`(min-width: 65rem)`).matches;\n\nconst adjustFlashMargin = (open) => {\n // HACK ALERT\n // Add margin to flashes when opening the notice.\n // Flashes are react components and this notice needs to work as a view-component and react component.\n // We could do this with redux but then we potentially update state on every scroll event, which\n // even with debounce will deplate our frame budget.\n\n const flash = queryId(FLASH_DATA_ID);\n\n if (flash) {\n flash.style.marginTop = open ? `4rem` : null;\n }\n};\n\nconst hideOnMobile = (bannerContainer) => {\n if (isMdViewport()) {\n bannerContainer.style.display = \"none\";\n } else {\n bannerContainer.style.display = null;\n }\n};\n\nconst hideNotice = (bannerContainer) => {\n bannerContainer.style.maxHeight = 0;\n bannerContainer.style.overflow = \"hidden\";\n\n adjustFlashMargin(false);\n};\n\nconst showNotice = (bannerContainer) => {\n bannerContainer.style.maxHeight = null;\n bannerContainer.style.overflow = null;\n\n adjustFlashMargin(true);\n};\n\nconst setupRememberClosed = (cookieId, noticeId) => {\n const cookie = Cookie.get(cookieId) || \"\";\n\n Cookie.set(cookieId, `${cookie.replace(`${noticeId},`, \"\") + noticeId},`, {\n expires: COOKIE_EXPIRY,\n });\n};\n\nconst hasBeenClosedBefore = (cookieId, noticeId) =>\n (Cookie.get(cookieId) || \"\").includes(noticeId);\n\nconst setupNoticeCollapse = (bannerContainer) => {\n const scrollTop = window.scrollY;\n\n if (scrollTop > COLLAPSE_TRIGGER_DISTANCE) {\n hideNotice(bannerContainer);\n }\n\n const listener = throttle(() => {\n const scrollTop = window.scrollY;\n\n if (scrollTop > COLLAPSE_TRIGGER_DISTANCE) {\n hideNotice(bannerContainer);\n } else if (bannerContainer.style.overflow) {\n showNotice(bannerContainer);\n }\n }, SCROLL_LISTENER_THROTTLE);\n\n document.addEventListener(\"scroll\", listener);\n\n return () => document.removeEventListener(\"scroll\", listener);\n};\n\nconst setupCloseBtn = (\n bannerContainer,\n cookieId,\n noticeId,\n collapseUnmountListeners,\n) => {\n const closeBtn = bannerContainer.querySelector(\"button\");\n\n if (!closeBtn) return () => {};\n\n const listener = () => {\n if (cookieId && noticeId) setupRememberClosed(cookieId, noticeId);\n\n hideNotice(bannerContainer);\n collapseUnmountListeners();\n };\n\n closeBtn.addEventListener(\"click\", listener);\n\n return () => document.removeEventListener(\"click\", listener);\n};\n\nconst resizeHandler = (bannerContainer) => {\n const handler = throttle(() => {\n hideOnMobile(bannerContainer);\n }, RESIZE_LISTENER_THROTTLE);\n\n window.addEventListener(\"resize\", handler);\n\n return () => window.removeEventListener(\"resize\", handler);\n};\n\nconst Notice = ({ bannerContainer, cookieId, noticeId, options }) => {\n if (typeof window === \"undefined\") return () => {};\n\n if (!bannerContainer) {\n console.warn(\n \"A Notice component was initited but no notice container was found.\",\n );\n return () => {};\n }\n\n if (hasBeenClosedBefore(cookieId, noticeId)) return () => {};\n\n hideOnMobile(bannerContainer);\n showNotice(bannerContainer);\n\n const opts = { collapse: true, ...options };\n\n const collapseUnmountListeners = opts.collapse\n ? setupNoticeCollapse(bannerContainer)\n : () => {};\n\n const closeBtnUnmountListeners = setupCloseBtn(\n bannerContainer,\n cookieId,\n noticeId,\n collapseUnmountListeners,\n );\n\n const resizeUnmountListener = resizeHandler(bannerContainer);\n\n return () => {\n [\n closeBtnUnmountListeners,\n collapseUnmountListeners,\n resizeUnmountListener,\n ].forEach((unmount) => unmount());\n };\n};\n\nexport default Notice;\n"],"names":["Cookie","throttle","queryId","FLASH_DATA_ID","COOKIE_EXPIRY","COLLAPSE_TRIGGER_DISTANCE","SCROLL_LISTENER_THROTTLE","RESIZE_LISTENER_THROTTLE","isMdViewport","window","matchMedia","matches","adjustFlashMargin","open","flash","style","marginTop","hideOnMobile","bannerContainer","display","hideNotice","maxHeight","overflow","showNotice","setupRememberClosed","cookieId","noticeId","cookie","get","set","replace","expires","hasBeenClosedBefore","includes","setupNoticeCollapse","scrollTop","scrollY","listener","document","addEventListener","removeEventListener","setupCloseBtn","collapseUnmountListeners","closeBtn","querySelector","resizeHandler","handler","Notice","options","console","warn","opts","collapse","closeBtnUnmountListeners","resizeUnmountListener","forEach","unmount"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/SignOutLink.tsx"],"sourcesContent":["import React, { MouseEvent, MouseEventHandler, ReactNode, useRef } from \"react\";\nimport { AbsUrl } from \"./LegacyMeganav\";\n\ntype SignOutLinkProps = {\n token: string;\n href: string;\n text: string;\n children: ({\n href,\n text,\n onClick,\n }: {\n href: string;\n text: string;\n onClick: MouseEventHandler<HTMLAnchorElement>;\n }) => ReactNode;\n absUrl: AbsUrl;\n};\n\nconst SignOutLink = ({\n token,\n href,\n text,\n children,\n absUrl,\n}: SignOutLinkProps) => {\n const formRef = useRef<HTMLFormElement>(null);\n\n const onClick = (e: MouseEvent) => {\n formRef.current?.submit();\n e.preventDefault();\n };\n\n return (\n <>\n <form\n ref={formRef}\n method=\"post\"\n action={absUrl(href)}\n className=\"hidden\"\n >\n <input name=\"_method\" value=\"delete\" type=\"hidden\" />\n <input name=\"authenticity_token\" value={token} type=\"hidden\" />\n </form>\n\n {children({ href, text, onClick })}\n </>\n );\n};\n\nexport default SignOutLink;\n"],"names":["React","useRef","SignOutLink","token","href","text","children","absUrl","formRef","onClick","e","current","submit","preventDefault","form","ref","method","action","className","input","name","value","type"],"mappings":"AAAA,OAAOA,OAAmDC,MAAM,KAAQ,OAAQ,CAmBhF,MAAMC,YAAc,CAAC,CACnBC,KAAK,CACLC,IAAI,CACJC,IAAI,CACJC,QAAQ,CACRC,MAAM,CACW,IACjB,MAAMC,QAAUP,OAAwB,MAExC,MAAMQ,QAAU,AAACC,IACfF,QAAQG,OAAO,EAAEC,SACjBF,EAAEG,cAAc,EAClB,EAEA,OACE,wCACE,oBAACC,QACCC,IAAKP,QACLQ,OAAO,OACPC,OAAQV,OAAOH,MACfc,UAAU,UAEV,oBAACC,SAAMC,KAAK,UAAUC,MAAM,SAASC,KAAK,WAC1C,oBAACH,SAAMC,KAAK,qBAAqBC,MAAOlB,MAAOmB,KAAK,YAGrDhB,SAAS,CAAEF,KAAMC,KAAMI,OAAQ,GAGtC,CAEA,gBAAeP,WAAY"}
1
+ {"version":3,"sources":["../../src/core/SignOutLink.tsx"],"sourcesContent":["import React, { MouseEvent, MouseEventHandler, ReactNode, useRef } from \"react\";\nimport { AbsUrl } from \"./Meganav\";\n\ntype SignOutLinkProps = {\n token: string;\n href: string;\n text: string;\n children: ({\n href,\n text,\n onClick,\n }: {\n href: string;\n text: string;\n onClick: MouseEventHandler<HTMLAnchorElement>;\n }) => ReactNode;\n absUrl: AbsUrl;\n};\n\nconst SignOutLink = ({\n token,\n href,\n text,\n children,\n absUrl,\n}: SignOutLinkProps) => {\n const formRef = useRef<HTMLFormElement>(null);\n\n const onClick = (e: MouseEvent) => {\n formRef.current?.submit();\n e.preventDefault();\n };\n\n return (\n <>\n <form\n ref={formRef}\n method=\"post\"\n action={absUrl(href)}\n className=\"hidden\"\n >\n <input name=\"_method\" value=\"delete\" type=\"hidden\" />\n <input name=\"authenticity_token\" value={token} type=\"hidden\" />\n </form>\n\n {children({ href, text, onClick })}\n </>\n );\n};\n\nexport default SignOutLink;\n"],"names":["React","useRef","SignOutLink","token","href","text","children","absUrl","formRef","onClick","e","current","submit","preventDefault","form","ref","method","action","className","input","name","value","type"],"mappings":"AAAA,OAAOA,OAAmDC,MAAM,KAAQ,OAAQ,CAmBhF,MAAMC,YAAc,CAAC,CACnBC,KAAK,CACLC,IAAI,CACJC,IAAI,CACJC,QAAQ,CACRC,MAAM,CACW,IACjB,MAAMC,QAAUP,OAAwB,MAExC,MAAMQ,QAAU,AAACC,IACfF,QAAQG,OAAO,EAAEC,SACjBF,EAAEG,cAAc,EAClB,EAEA,OACE,wCACE,oBAACC,QACCC,IAAKP,QACLQ,OAAO,OACPC,OAAQV,OAAOH,MACfc,UAAU,UAEV,oBAACC,SAAMC,KAAK,UAAUC,MAAM,SAASC,KAAK,WAC1C,oBAACH,SAAMC,KAAK,qBAAqBC,MAAOlB,MAAOmB,KAAK,YAGrDhB,SAAS,CAAEF,KAAMC,KAAMI,OAAQ,GAGtC,CAEA,gBAAeP,WAAY"}
@@ -0,0 +1,2 @@
1
+ function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{InsightsService}from"./service";import*as logger from"./logger";export class InsightsCommandQueue{executeInitInsights(config){this.debugMode=!!config.debug;if(this.debugMode){logger.debug("Initializing insights")}this.realImplementation=new InsightsService;this.realImplementation.initInsights(config);this.isInitialized=true;this.processQueue()}processQueue(){if(this.debugMode){logger.debug(`Processing ${this.queue.length} queued commands`)}while(this.queue.length>0){const cmd=this.queue.shift();if(cmd&&this.realImplementation&&typeof this.realImplementation[cmd.methodName]==="function"){try{if(this.debugMode){logger.debug(`Executing queued command: ${cmd.methodName}`,cmd.args)}this.realImplementation[cmd.methodName](...cmd.args)}catch(e){if(this.debugMode){logger.error(`Error executing queued command: ${cmd.methodName}`,e)}}}}}initInsights(config){}enableDebugMode(){}disableDebugMode(){}identify(identity){}trackPageView(){}track(event,properties){}startSessionRecording(){}stopSessionRecording(){}setupObserver(){return()=>{}}constructor(){_define_property(this,"isInitialized",false);_define_property(this,"queue",[]);_define_property(this,"debugMode",false);_define_property(this,"realImplementation",null);return new Proxy(this,{get:(target,prop)=>{if(prop in target&&typeof target[prop]!=="function"){return target[prop]}return(...args)=>{if(!target.isInitialized||!target.realImplementation){if(prop==="initInsights"){target.executeInitInsights(args[0]);return}if(target.debugMode){logger.debug(`Queuing method call: ${String(prop)}`,args)}target.queue.push({methodName:prop,args});return}if(typeof target.realImplementation[prop]==="function"){return target.realImplementation[prop](...args)}}}})}}
2
+ //# sourceMappingURL=command-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/insights/command-queue.ts"],"sourcesContent":["import {\n AnalyticsService,\n Command,\n InsightsConfig,\n InsightsIdentity,\n} from \"./types\";\nimport { InsightsService } from \"./service\";\nimport * as logger from \"./logger\";\n\n// Queue handler that will collect commands before initialization\nexport class InsightsCommandQueue implements AnalyticsService {\n private isInitialized: boolean = false;\n private queue: Command[] = [];\n private debugMode: boolean = false;\n private realImplementation: InsightsService | null = null;\n\n constructor() {\n // Create a proxy that will either queue commands or execute them directly\n return new Proxy(this, {\n get: (target: InsightsCommandQueue, prop: string) => {\n // Return actual properties of the queue\n if (\n prop in target &&\n typeof (target as InsightsCommandQueue)[prop] !== \"function\"\n ) {\n return (target as InsightsCommandQueue)[\n prop as keyof InsightsCommandQueue\n ];\n }\n\n // Return a function that either queues or executes the method call\n return (...args: unknown[]) => {\n if (!target.isInitialized || !target.realImplementation) {\n // Queue the command for later execution\n if (prop === \"initInsights\") {\n // Special handling for initInsights - execute it right away\n target.executeInitInsights(args[0] as InsightsConfig);\n return;\n }\n\n // For debug logging\n if (target.debugMode) {\n logger.debug(`Queuing method call: ${String(prop)}`, args);\n }\n\n target.queue.push({\n methodName: prop as keyof AnalyticsService,\n args,\n });\n return;\n }\n\n // Execute the command immediately on the real implementation\n if (\n typeof (target.realImplementation as AnalyticsService)[prop] ===\n \"function\"\n ) {\n return (target.realImplementation as AnalyticsService)[prop](\n ...args,\n );\n }\n };\n },\n });\n }\n\n // Special handling for init since it needs to happen right away\n private executeInitInsights(config: InsightsConfig): void {\n this.debugMode = !!config.debug;\n\n if (this.debugMode) {\n logger.debug(\"Initializing insights\");\n }\n\n // Create and initialize the real implementation\n this.realImplementation = new InsightsService();\n this.realImplementation.initInsights(config);\n\n // Mark as initialized and process the queue\n this.isInitialized = true;\n this.processQueue();\n }\n\n // Process all queued commands\n private processQueue(): void {\n if (this.debugMode) {\n logger.debug(`Processing ${this.queue.length} queued commands`);\n }\n\n while (this.queue.length > 0) {\n const cmd = this.queue.shift();\n if (\n cmd &&\n this.realImplementation &&\n typeof this.realImplementation[cmd.methodName] === \"function\"\n ) {\n try {\n if (this.debugMode) {\n logger.debug(\n `Executing queued command: ${cmd.methodName}`,\n cmd.args,\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n (this.realImplementation[cmd.methodName] as Function)(\n ...(cmd.args as unknown[]),\n );\n } catch (e) {\n if (this.debugMode) {\n logger.error(\n `Error executing queued command: ${cmd.methodName}`,\n e,\n );\n }\n }\n }\n }\n }\n\n // Implement all methods required by AnalyticsService to satisfy TypeScript\n // (These won't be called directly due to the proxy)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n initInsights(config: InsightsConfig): void {}\n enableDebugMode(): void {}\n disableDebugMode(): void {}\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n identify(identity: InsightsIdentity): void {}\n trackPageView(): void {}\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n track(event: string, properties?: Record<string, unknown>): void {}\n startSessionRecording(): void {}\n stopSessionRecording(): void {}\n setupObserver(): () => void {\n return () => {};\n }\n}\n"],"names":["InsightsService","logger","InsightsCommandQueue","executeInitInsights","config","debugMode","debug","realImplementation","initInsights","isInitialized","processQueue","queue","length","cmd","shift","methodName","args","e","error","enableDebugMode","disableDebugMode","identify","identity","trackPageView","track","event","properties","startSessionRecording","stopSessionRecording","setupObserver","constructor","Proxy","get","target","prop","String","push"],"mappings":"oLAMA,OAASA,eAAe,KAAQ,WAAY,AAC5C,WAAYC,WAAY,UAAW,AAGnC,QAAO,MAAMC,qBAyDX,AAAQC,oBAAoBC,MAAsB,CAAQ,CACxD,IAAI,CAACC,SAAS,CAAG,CAAC,CAACD,OAAOE,KAAK,CAE/B,GAAI,IAAI,CAACD,SAAS,CAAE,CAClBJ,OAAOK,KAAK,CAAC,wBACf,CAGA,IAAI,CAACC,kBAAkB,CAAG,IAAIP,gBAC9B,IAAI,CAACO,kBAAkB,CAACC,YAAY,CAACJ,OAGrC,CAAA,IAAI,CAACK,aAAa,CAAG,KACrB,IAAI,CAACC,YAAY,EACnB,CAGA,AAAQA,cAAqB,CAC3B,GAAI,IAAI,CAACL,SAAS,CAAE,CAClBJ,OAAOK,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAACK,KAAK,CAACC,MAAM,CAAC,gBAAgB,CAAC,CAChE,CAEA,MAAO,IAAI,CAACD,KAAK,CAACC,MAAM,CAAG,EAAG,CAC5B,MAAMC,IAAM,IAAI,CAACF,KAAK,CAACG,KAAK,GAC5B,GACED,KACA,IAAI,CAACN,kBAAkB,EACvB,OAAO,IAAI,CAACA,kBAAkB,CAACM,IAAIE,UAAU,CAAC,GAAK,WACnD,CACA,GAAI,CACF,GAAI,IAAI,CAACV,SAAS,CAAE,CAClBJ,OAAOK,KAAK,CACV,CAAC,0BAA0B,EAAEO,IAAIE,UAAU,CAAC,CAAC,CAC7CF,IAAIG,IAAI,CAEZ,CAEA,AAAC,IAAI,CAACT,kBAAkB,CAACM,IAAIE,UAAU,CAAC,IAClCF,IAAIG,IAAI,CAEhB,CAAE,MAAOC,EAAG,CACV,GAAI,IAAI,CAACZ,SAAS,CAAE,CAClBJ,OAAOiB,KAAK,CACV,CAAC,gCAAgC,EAAEL,IAAIE,UAAU,CAAC,CAAC,CACnDE,EAEJ,CACF,CACF,CACF,CACF,CAKAT,aAAaJ,MAAsB,CAAQ,CAAC,CAC5Ce,iBAAwB,CAAC,CACzBC,kBAAyB,CAAC,CAE1BC,SAASC,QAA0B,CAAQ,CAAC,CAC5CC,eAAsB,CAAC,CAEvBC,MAAMC,KAAa,CAAEC,UAAoC,CAAQ,CAAC,CAClEC,uBAA8B,CAAC,CAC/BC,sBAA6B,CAAC,CAC9BC,eAA4B,CAC1B,MAAO,KAAO,CAChB,CAtHAC,aAAc,CALd,sBAAQrB,gBAAyB,OACjC,sBAAQE,QAAmB,EAAE,EAC7B,sBAAQN,YAAqB,OAC7B,sBAAQE,qBAA6C,MAInD,OAAO,IAAIwB,MAAM,IAAI,CAAE,CACrBC,IAAK,CAACC,OAA8BC,QAElC,GACEA,QAAQD,QACR,OAAO,AAACA,MAA+B,CAACC,KAAK,GAAK,WAClD,CACA,OAAO,AAACD,MAA+B,CACrCC,KACD,AACH,CAGA,MAAO,CAAC,GAAGlB,QACT,GAAI,CAACiB,OAAOxB,aAAa,EAAI,CAACwB,OAAO1B,kBAAkB,CAAE,CAEvD,GAAI2B,OAAS,eAAgB,CAE3BD,OAAO9B,mBAAmB,CAACa,IAAI,CAAC,EAAE,EAClC,MACF,CAGA,GAAIiB,OAAO5B,SAAS,CAAE,CACpBJ,OAAOK,KAAK,CAAC,CAAC,qBAAqB,EAAE6B,OAAOD,MAAM,CAAC,CAAElB,KACvD,CAEAiB,OAAOtB,KAAK,CAACyB,IAAI,CAAC,CAChBrB,WAAYmB,KACZlB,IACF,GACA,MACF,CAGA,GACE,OAAO,AAACiB,OAAO1B,kBAAkB,AAAqB,CAAC2B,KAAK,GAC5D,WACA,CACA,OAAO,AAACD,OAAO1B,kBAAkB,AAAqB,CAAC2B,KAAK,IACvDlB,KAEP,CACF,CACF,CACF,EACF,CAuEF"}
@@ -0,0 +1,2 @@
1
+ export const track=(event,properties)=>{const dataLayer=window.dataLayer||[];window.dataLayer=dataLayer;window.dataLayer.push({event,...properties})};
2
+ //# sourceMappingURL=datalayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/insights/datalayer.ts"],"sourcesContent":["declare global {\n interface Window {\n dataLayer: unknown[];\n }\n}\n\nexport const track = (event: string, properties?: Record<string, unknown>) => {\n const dataLayer = window.dataLayer || [];\n window.dataLayer = dataLayer;\n\n window.dataLayer.push({\n event,\n ...properties,\n });\n};\n"],"names":["track","event","properties","dataLayer","window","push"],"mappings":"AAMA,OAAO,MAAMA,MAAQ,CAACC,MAAeC,cACnC,MAAMC,UAAYC,OAAOD,SAAS,EAAI,EAAE,AACxCC,CAAAA,OAAOD,SAAS,CAAGA,UAEnBC,OAAOD,SAAS,CAACE,IAAI,CAAC,CACpBJ,MACA,GAAGC,UAAU,AACf,EACF,CAAE"}
@@ -1,2 +1,2 @@
1
- import*as mixpanel from"./mixpanel";import*as posthog from"./posthog";let debugMode=false;export const initInsights=({mixpanelToken,mixpanelAutoCapture,posthogApiKey,posthogApiHost,debug=false})=>{debugMode=!!debug;try{mixpanel.initMixpanel(mixpanelToken,mixpanelAutoCapture,debugMode)}catch(e){if(debugMode){console.error("Failed to initialize Mixpanel",e)}}try{posthog.initPosthog(posthogApiKey,posthogApiHost)}catch(e){if(debugMode){console.error("Failed to initialize Posthog",e)}}};export const enableDebugMode=()=>{debugMode=true;try{mixpanel.enableDebugMode();posthog.enableDebugMode()}catch(e){console.error("Failed to enable debug mode",e)}};export const disableDebugMode=()=>{debugMode=false;try{mixpanel.disableDebugMode();posthog.disableDebugMode()}catch(e){console.error("Failed to disable debug mode",e)}};export const identify=({userId,accountId,organisationId,email,name})=>{if(!userId){if(debugMode){console.warn("User ID not provided, skipping identify")}return}try{mixpanel.identify({userId,accountId,organisationId,email,name})}catch(e){if(debugMode){console.error("Failed to identify user in Mixpanel",e)}}try{posthog.identify({userId,accountId,organisationId,email,name})}catch(e){if(debugMode){console.error("Failed to identify user in Posthog",e)}}};export const trackPageView=()=>{try{mixpanel.trackPageView()}catch(e){if(debugMode){console.error("Failed to track page view in Mixpanel",e)}}try{posthog.trackPageView()}catch(e){if(debugMode){console.error("Failed to track page view in Posthog",e)}}};export const track=(event,properties)=>{try{mixpanel.track(event,properties)}catch(e){if(debugMode){console.error("Failed to track event in Mixpanel",e)}}try{posthog.track(event,properties)}catch(e){if(debugMode){console.error("Failed to track event in Posthog",e)}}};export const setupObserver=()=>{const getInsightAttributes=element=>{const MAX_ATTRIBUTES=10;let count=0;const attributes={};for(const attr of element.attributes){if(count>=MAX_ATTRIBUTES)break;if(attr.name.startsWith("data-insight-")){if(!/^data-insight-[a-zA-Z0-9-]+$/.test(attr.name))continue;if(typeof attr.value!=="string"||attr.value.length>100)continue;const key=attr.name.replace("data-insight-","").split("-").map((part,index)=>index===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("");attributes[key]=attr.value;count++}}return attributes};const findClosestElementWithInsights=element=>{let current=element;while(current&&current!==document.body){const insights=getInsightAttributes(current);if(Object.keys(insights).length>0){return insights}current=current.parentElement}return null};const handleClick=event=>{if(!(event.target instanceof HTMLElement))return;const insights=findClosestElementWithInsights(event.target);if(insights){const{event:eventName,...properties}=insights;track(eventName||"element_clicked",properties)}};document.body.addEventListener("click",handleClick);return()=>{document.body.removeEventListener("click",handleClick)}};
1
+ import{InsightsCommandQueue}from"./command-queue";const insights=new InsightsCommandQueue;export const initInsights=config=>insights.initInsights(config);export const enableDebugMode=()=>insights.enableDebugMode();export const disableDebugMode=()=>insights.disableDebugMode();export const identify=identity=>insights.identify(identity);export const trackPageView=()=>insights.trackPageView();export const track=(event,properties)=>insights.track(event,properties);export const startSessionRecording=()=>insights.startSessionRecording();export const stopSessionRecording=()=>insights.stopSessionRecording();export const setupObserver=()=>insights.setupObserver();
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/insights/index.ts"],"sourcesContent":["import * as mixpanel from \"./mixpanel\";\nimport * as posthog from \"./posthog\";\nimport { InsightsIdentity } from \"./types\";\n\nexport type InsightsConfig = {\n debug: boolean;\n mixpanelToken: string;\n mixpanelAutoCapture: boolean;\n posthogApiKey: string;\n posthogApiHost: string;\n};\n\nlet debugMode = false;\n\nexport const initInsights = ({\n mixpanelToken,\n mixpanelAutoCapture,\n posthogApiKey,\n posthogApiHost,\n debug = false,\n}: InsightsConfig) => {\n debugMode = !!debug;\n\n try {\n mixpanel.initMixpanel(mixpanelToken, mixpanelAutoCapture, debugMode);\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to initialize Mixpanel\", e);\n }\n }\n\n try {\n posthog.initPosthog(posthogApiKey, posthogApiHost);\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to initialize Posthog\", e);\n }\n }\n};\n\nexport const enableDebugMode = () => {\n debugMode = true;\n try {\n mixpanel.enableDebugMode();\n posthog.enableDebugMode();\n } catch (e) {\n console.error(\"Failed to enable debug mode\", e);\n }\n};\n\nexport const disableDebugMode = () => {\n debugMode = false;\n try {\n mixpanel.disableDebugMode();\n posthog.disableDebugMode();\n } catch (e) {\n console.error(\"Failed to disable debug mode\", e);\n }\n};\n\nexport const identify = ({\n userId,\n accountId,\n organisationId,\n email,\n name,\n}: InsightsIdentity) => {\n // In very rare cases we might have a user without an account, so we'll\n // let null/undefined/blank strings through on that one\n if (!userId) {\n if (debugMode) {\n console.warn(\"User ID not provided, skipping identify\");\n }\n return;\n }\n\n try {\n mixpanel.identify({ userId, accountId, organisationId, email, name });\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to identify user in Mixpanel\", e);\n }\n }\n\n try {\n posthog.identify({ userId, accountId, organisationId, email, name });\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to identify user in Posthog\", e);\n }\n }\n};\n\nexport const trackPageView = () => {\n try {\n mixpanel.trackPageView();\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to track page view in Mixpanel\", e);\n }\n }\n\n try {\n posthog.trackPageView();\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to track page view in Posthog\", e);\n }\n }\n};\n\nexport const track = (event: string, properties?: Record<string, unknown>) => {\n try {\n mixpanel.track(event, properties);\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to track event in Mixpanel\", e);\n }\n }\n\n try {\n posthog.track(event, properties);\n } catch (e) {\n if (debugMode) {\n console.error(\"Failed to track event in Posthog\", e);\n }\n }\n};\n\ntype InsightAttributes = {\n event?: string;\n [key: string]: string | undefined;\n};\n\nexport const setupObserver = () => {\n // Helper to get all data-insight-* attributes from an element\n const getInsightAttributes = (element): InsightAttributes => {\n // limit how many data attributes we'll process\n const MAX_ATTRIBUTES = 10;\n let count = 0;\n\n const attributes: InsightAttributes = {};\n\n for (const attr of element.attributes) {\n if (count >= MAX_ATTRIBUTES) break;\n if (attr.name.startsWith(\"data-insight-\")) {\n // Validate attribute name format\n if (!/^data-insight-[a-zA-Z0-9-]+$/.test(attr.name)) continue;\n\n // Sanitize attribute value\n if (typeof attr.value !== \"string\" || attr.value.length > 100) continue;\n\n // Convert data-insight-event-name to eventName\n const key = attr.name\n .replace(\"data-insight-\", \"\")\n .split(\"-\")\n .map((part, index) =>\n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n )\n .join(\"\");\n attributes[key] = attr.value;\n count++;\n }\n }\n return attributes;\n };\n\n // Helper to find closest element with data-insight attributes\n const findClosestElementWithInsights = (element) => {\n let current = element;\n while (current && current !== document.body) {\n const insights = getInsightAttributes(current);\n if (Object.keys(insights).length > 0) {\n return insights;\n }\n current = current.parentElement;\n }\n return null;\n };\n\n // Global click handler\n const handleClick = (event: MouseEvent): void => {\n if (!(event.target instanceof HTMLElement)) return;\n const insights = findClosestElementWithInsights(event.target);\n if (insights) {\n // Extract special properties if they exist\n const { event: eventName, ...properties } = insights;\n track(eventName || \"element_clicked\", properties);\n }\n };\n\n // Add listener to document body to catch all clicks\n document.body.addEventListener(\"click\", handleClick);\n\n // Return cleanup function in case it's needed\n return () => {\n document.body.removeEventListener(\"click\", handleClick);\n };\n};\n"],"names":["mixpanel","posthog","debugMode","initInsights","mixpanelToken","mixpanelAutoCapture","posthogApiKey","posthogApiHost","debug","initMixpanel","e","console","error","initPosthog","enableDebugMode","disableDebugMode","identify","userId","accountId","organisationId","email","name","warn","trackPageView","track","event","properties","setupObserver","getInsightAttributes","element","MAX_ATTRIBUTES","count","attributes","attr","startsWith","test","value","length","key","replace","split","map","part","index","charAt","toUpperCase","slice","join","findClosestElementWithInsights","current","document","body","insights","Object","keys","parentElement","handleClick","target","HTMLElement","eventName","addEventListener","removeEventListener"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/insights/index.ts"],"sourcesContent":["import { InsightsConfig, InsightsIdentity } from \"./types\";\nimport { InsightsCommandQueue } from \"./command-queue\";\nexport type { InsightsConfig };\n\n// Hi and welcome 👋\n//\n// The insights code is written using a Command Queue, or Deferred Execution pattern.\n// This pattern is useful when you need to queue up actions that should wait until\n// some initialization is complete. In this case, we want to queue up all the analytics\n// commands until the analytics service is initialized. This way, we can ensure that\n// no analytics events are lost during the initialization process. It looks wildly\n// different than other parts of Ably UI, but if you squint you realise it looks very\n// much like the services it's wrapping.\n//\n// There are three pieces working together here:\n// - The `AnalyticsService` interface, which defines the public methods that the insights\n// service will expose.\n// - The `InsightsCommandQueue` class, which is the main entry point for the insights\n// service. It acts as a proxy that will either queue up commands or execute\n// them directly on the real implementation.\n// - The `InsightsService` class, which is the real implementation that will be used\n// after initialization. It's responsible for initializing the underlying analytics\n// services (Mixpanel, Posthog & the data layer) and executing the queued commands.\n\n// Create the singleton instance with the command queue pattern\nconst insights = new InsightsCommandQueue();\n\n// Export the methods with the same interface as before\nexport const initInsights = (config: InsightsConfig) =>\n insights.initInsights(config);\nexport const enableDebugMode = () => insights.enableDebugMode();\nexport const disableDebugMode = () => insights.disableDebugMode();\nexport const identify = (identity: InsightsIdentity) =>\n insights.identify(identity);\nexport const trackPageView = () => insights.trackPageView();\nexport const track = (event: string, properties?: Record<string, unknown>) =>\n insights.track(event, properties);\nexport const startSessionRecording = () => insights.startSessionRecording();\nexport const stopSessionRecording = () => insights.stopSessionRecording();\nexport const setupObserver = () => insights.setupObserver();\n"],"names":["InsightsCommandQueue","insights","initInsights","config","enableDebugMode","disableDebugMode","identify","identity","trackPageView","track","event","properties","startSessionRecording","stopSessionRecording","setupObserver"],"mappings":"AACA,OAASA,oBAAoB,KAAQ,iBAAkB,CAwBvD,MAAMC,SAAW,IAAID,oBAGrB,QAAO,MAAME,aAAe,AAACC,QAC3BF,SAASC,YAAY,CAACC,OAAQ,AAChC,QAAO,MAAMC,gBAAkB,IAAMH,SAASG,eAAe,EAAG,AAChE,QAAO,MAAMC,iBAAmB,IAAMJ,SAASI,gBAAgB,EAAG,AAClE,QAAO,MAAMC,SAAW,AAACC,UACvBN,SAASK,QAAQ,CAACC,SAAU,AAC9B,QAAO,MAAMC,cAAgB,IAAMP,SAASO,aAAa,EAAG,AAC5D,QAAO,MAAMC,MAAQ,CAACC,MAAeC,aACnCV,SAASQ,KAAK,CAACC,MAAOC,WAAY,AACpC,QAAO,MAAMC,sBAAwB,IAAMX,SAASW,qBAAqB,EAAG,AAC5E,QAAO,MAAMC,qBAAuB,IAAMZ,SAASY,oBAAoB,EAAG,AAC1E,QAAO,MAAMC,cAAgB,IAAMb,SAASa,aAAa,EAAG"}
@@ -0,0 +1,2 @@
1
+ import{describe,expect,beforeEach,afterEach,it,vi}from"vitest";import*as datalayer from"./datalayer";import*as mixpanel from"./mixpanel";import*as posthog from"./posthog";import*as logger from"./logger";import*as insights from"./index";vi.mock("./datalayer",()=>({track:vi.fn()}));vi.mock("./mixpanel",()=>({initMixpanel:vi.fn(),enableDebugMode:vi.fn(),disableDebugMode:vi.fn(),identify:vi.fn(),trackPageView:vi.fn(),track:vi.fn(),startSessionRecording:vi.fn(),stopSessionRecording:vi.fn()}));vi.mock("./posthog",()=>({initPosthog:vi.fn(),enableDebugMode:vi.fn(),disableDebugMode:vi.fn(),identify:vi.fn(),trackPageView:vi.fn(),track:vi.fn(),startSessionRecording:vi.fn(),stopSessionRecording:vi.fn()}));vi.mock("./logger",()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn()}));describe("Insights Command Queue",()=>{const testConfig={debug:true,mixpanelToken:"test-token",mixpanelAutoCapture:false,mixpanelRecordSessionsPercent:10,posthogApiKey:"test-key",posthogApiHost:"test-host"};const testIdentity={userId:"user-123",accountId:"account-456",organisationId:"org-789",email:"test@example.com",name:"Test User"};beforeEach(()=>{vi.clearAllMocks();vi.resetModules()});afterEach(()=>{document.body.replaceWith(document.body.cloneNode(true))});describe("Pre-initialization Queueing",()=>{it("should queue methods called before initialization",async()=>{insights.track("early_event",{early:true});insights.identify(testIdentity);insights.trackPageView();expect(mixpanel.track).not.toHaveBeenCalled();expect(posthog.track).not.toHaveBeenCalled();expect(datalayer.track).not.toHaveBeenCalled();expect(mixpanel.identify).not.toHaveBeenCalled();expect(posthog.identify).not.toHaveBeenCalled();expect(mixpanel.trackPageView).not.toHaveBeenCalled();expect(posthog.trackPageView).not.toHaveBeenCalled();insights.initInsights(testConfig);expect(mixpanel.initMixpanel).toHaveBeenCalledWith(testConfig.mixpanelToken,testConfig.mixpanelAutoCapture,testConfig.debug,testConfig.mixpanelRecordSessionsPercent);expect(posthog.initPosthog).toHaveBeenCalledWith(testConfig.posthogApiKey,testConfig.posthogApiHost);expect(mixpanel.track).toHaveBeenCalledWith("early_event",{early:true});expect(posthog.track).toHaveBeenCalledWith("early_event",{early:true});expect(datalayer.track).toHaveBeenCalledWith("early_event",{early:true});expect(mixpanel.identify).toHaveBeenCalledWith(testIdentity);expect(posthog.identify).toHaveBeenCalledWith(testIdentity);expect(mixpanel.trackPageView).toHaveBeenCalled();expect(posthog.trackPageView).toHaveBeenCalled()});it("should handle errors in queued methods gracefully",async()=>{mixpanel.track.mockImplementationOnce(()=>{throw new Error("Mixpanel error")});insights.track("error_event",{error:true});insights.trackPageView();insights.initInsights(testConfig);expect(logger.error).toHaveBeenCalledWith(expect.stringContaining("Failed to track event in Mixpanel"),expect.any(Error));expect(posthog.track).toHaveBeenCalledWith("error_event",{error:true});expect(datalayer.track).toHaveBeenCalledWith("error_event",{error:true});expect(mixpanel.trackPageView).toHaveBeenCalled();expect(posthog.trackPageView).toHaveBeenCalled()})});describe("Post-initialization Direct Execution",()=>{beforeEach(()=>{insights.initInsights(testConfig);vi.clearAllMocks()});it("should directly call methods after initialization",()=>{insights.track("post_init_event",{post:true});expect(mixpanel.track).toHaveBeenCalledWith("post_init_event",{post:true});expect(posthog.track).toHaveBeenCalledWith("post_init_event",{post:true});expect(datalayer.track).toHaveBeenCalledWith("post_init_event",{post:true})});it("should handle all exported methods correctly",()=>{insights.identify(testIdentity);expect(mixpanel.identify).toHaveBeenCalledWith(testIdentity);expect(posthog.identify).toHaveBeenCalledWith(testIdentity);insights.trackPageView();expect(mixpanel.trackPageView).toHaveBeenCalled();expect(posthog.trackPageView).toHaveBeenCalled();insights.startSessionRecording();expect(mixpanel.startSessionRecording).toHaveBeenCalled();expect(posthog.startSessionRecording).toHaveBeenCalled();insights.stopSessionRecording();expect(mixpanel.stopSessionRecording).toHaveBeenCalled();expect(posthog.stopSessionRecording).toHaveBeenCalled();insights.enableDebugMode();expect(mixpanel.enableDebugMode).toHaveBeenCalled();expect(posthog.enableDebugMode).toHaveBeenCalled();insights.disableDebugMode();expect(mixpanel.disableDebugMode).toHaveBeenCalled();expect(posthog.disableDebugMode).toHaveBeenCalled()})});describe("Observer Setup",()=>{beforeEach(()=>{insights.initInsights(testConfig);vi.clearAllMocks()});it("should set up click event observer and track clicks",()=>{const cleanup=insights.setupObserver();const testElement=document.createElement("button");testElement.setAttribute("data-insight-event","button_clicked");testElement.setAttribute("data-insight-button-id","test-123");document.body.appendChild(testElement);testElement.click();expect(mixpanel.track).toHaveBeenCalledWith("button_clicked",{buttonId:"test-123"});expect(posthog.track).toHaveBeenCalledWith("button_clicked",{buttonId:"test-123"});expect(datalayer.track).toHaveBeenCalledWith("button_clicked",{buttonId:"test-123"});cleanup();vi.clearAllMocks();testElement.click();expect(mixpanel.track).not.toHaveBeenCalled()});it("should handle nested elements correctly",()=>{insights.setupObserver();const parentElement=document.createElement("div");parentElement.setAttribute("data-insight-event","container_clicked");parentElement.setAttribute("data-insight-container-id","parent-container");const childElement=document.createElement("span");childElement.textContent="Click me";parentElement.appendChild(childElement);document.body.appendChild(parentElement);childElement.click();expect(mixpanel.track).toHaveBeenCalledWith("container_clicked",{containerId:"parent-container"})})});describe("Error Handling",()=>{it("should handle initialization errors gracefully",()=>{mixpanel.initMixpanel.mockImplementationOnce(()=>{throw new Error("Mixpanel init error")});expect(()=>{insights.initInsights(testConfig)}).not.toThrow();expect(logger.error).toHaveBeenCalledWith(expect.stringContaining("Failed to initialize Mixpanel"),expect.any(Error))});it("should handle runtime errors in methods",()=>{insights.initInsights(testConfig);vi.clearAllMocks();mixpanel.track.mockImplementationOnce(()=>{throw new Error("Mixpanel track error")});posthog.track.mockImplementationOnce(()=>{throw new Error("Posthog track error")});expect(()=>{insights.track("error_test",{test:true})}).not.toThrow();expect(logger.error).toHaveBeenCalledWith(expect.stringContaining("Failed to track event in Mixpanel"),expect.any(Error));expect(logger.error).toHaveBeenCalledWith(expect.stringContaining("Failed to track event in Posthog"),expect.any(Error));expect(datalayer.track).toHaveBeenCalledWith("error_test",{test:true})})});describe("Debug Mode",()=>{it("should respect debug flag in config",()=>{insights.initInsights(testConfig);expect(logger.debug).toHaveBeenCalledWith(expect.stringContaining("Initializing insights"));vi.clearAllMocks();insights.track("debug_test",{debug:true});expect(logger.info).toHaveBeenCalledWith(expect.stringContaining("Tracking event"),expect.objectContaining({event:"debug_test",properties:{debug:true}}))});it("should not log debug info when debug is false",()=>{insights.initInsights({...testConfig,debug:false});vi.clearAllMocks();insights.track("no_debug_test",{debug:false});expect(logger.info).not.toHaveBeenCalled()})})});
2
+ //# sourceMappingURL=index.test.js.map