construct-hub 0.2.50 → 0.2.51

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. package/.jsii +2 -2
  2. package/lib/construct-hub.js +1 -1
  3. package/lib/package-sources/code-artifact.js +1 -1
  4. package/lib/package-sources/npmjs.js +1 -1
  5. package/lib/package-tag/index.js +2 -2
  6. package/lib/spdx-license.js +1 -1
  7. package/package.json +2 -2
  8. package/website/asset-manifest.json +37 -37
  9. package/website/index.html +1 -1
  10. package/website/service-worker.js +1 -1
  11. package/website/service-worker.js.map +1 -1
  12. package/website/static/js/{0.476ccc35.chunk.js → 0.14ae620d.chunk.js} +2 -2
  13. package/website/static/js/{0.476ccc35.chunk.js.map → 0.14ae620d.chunk.js.map} +1 -1
  14. package/website/static/js/{1.dce521b7.chunk.js → 1.ba696ffb.chunk.js} +2 -2
  15. package/website/static/js/{1.dce521b7.chunk.js.map → 1.ba696ffb.chunk.js.map} +1 -1
  16. package/website/static/js/{10.511ed889.chunk.js → 10.48221095.chunk.js} +2 -2
  17. package/website/static/js/{10.511ed889.chunk.js.map → 10.48221095.chunk.js.map} +1 -1
  18. package/website/static/js/{11.fedfcf57.chunk.js → 11.c3c4095a.chunk.js} +2 -2
  19. package/website/static/js/{11.fedfcf57.chunk.js.map → 11.c3c4095a.chunk.js.map} +1 -1
  20. package/website/static/js/{12.f223385d.chunk.js → 12.cadd501c.chunk.js} +2 -2
  21. package/website/static/js/{12.f223385d.chunk.js.map → 12.cadd501c.chunk.js.map} +1 -1
  22. package/website/static/js/13.fe1e2da5.chunk.js +2 -0
  23. package/website/static/js/{13.97b408c9.chunk.js.map → 13.fe1e2da5.chunk.js.map} +1 -1
  24. package/website/static/js/{14.5a16949a.chunk.js → 14.0902aefd.chunk.js} +2 -2
  25. package/website/static/js/{14.5a16949a.chunk.js.map → 14.0902aefd.chunk.js.map} +1 -1
  26. package/website/static/js/{15.d29607c9.chunk.js → 15.50336305.chunk.js} +2 -2
  27. package/website/static/js/{15.d29607c9.chunk.js.map → 15.50336305.chunk.js.map} +1 -1
  28. package/website/static/js/{2.8028f8f1.chunk.js → 2.5cef3eb0.chunk.js} +2 -2
  29. package/website/static/js/{2.8028f8f1.chunk.js.map → 2.5cef3eb0.chunk.js.map} +1 -1
  30. package/website/static/js/{5.9ad3252f.chunk.js → 5.a2fc9d7c.chunk.js} +3 -3
  31. package/website/static/js/{5.9ad3252f.chunk.js.LICENSE.txt → 5.a2fc9d7c.chunk.js.LICENSE.txt} +0 -0
  32. package/website/static/js/{5.9ad3252f.chunk.js.map → 5.a2fc9d7c.chunk.js.map} +1 -1
  33. package/website/static/js/6.c49f34c2.chunk.js +3 -0
  34. package/website/static/js/{6.e67c67fc.chunk.js.LICENSE.txt → 6.c49f34c2.chunk.js.LICENSE.txt} +0 -0
  35. package/website/static/js/{6.e67c67fc.chunk.js.map → 6.c49f34c2.chunk.js.map} +1 -1
  36. package/website/static/js/{7.85487e43.chunk.js → 7.4fcbd19f.chunk.js} +2 -2
  37. package/website/static/js/{7.85487e43.chunk.js.map → 7.4fcbd19f.chunk.js.map} +1 -1
  38. package/website/static/js/8.31a21ecd.chunk.js +2 -0
  39. package/website/static/js/8.31a21ecd.chunk.js.map +1 -0
  40. package/website/static/js/9.e8c984d8.chunk.js +2 -0
  41. package/website/static/js/9.e8c984d8.chunk.js.map +1 -0
  42. package/website/static/js/main.65f1e14b.chunk.js +2 -0
  43. package/website/static/js/main.65f1e14b.chunk.js.map +1 -0
  44. package/website/static/js/{runtime-main.fc2986a7.js → runtime-main.d3c4ab29.js} +2 -2
  45. package/website/static/js/{runtime-main.fc2986a7.js.map → runtime-main.d3c4ab29.js.map} +1 -1
  46. package/website/static/js/13.97b408c9.chunk.js +0 -2
  47. package/website/static/js/6.e67c67fc.chunk.js +0 -3
  48. package/website/static/js/8.e3d4e000.chunk.js +0 -2
  49. package/website/static/js/8.e3d4e000.chunk.js.map +0 -1
  50. package/website/static/js/9.a24ba07b.chunk.js +0 -2
  51. package/website/static/js/9.a24ba07b.chunk.js.map +0 -1
  52. package/website/static/js/main.3e01d988.chunk.js +0 -2
  53. package/website/static/js/main.3e01d988.chunk.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ (this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[8],{236:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(251),c={home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},i=n(119),o=n(1),s=function(e){var t=e.children,n=e.meta,s=e.pageName,l=Object(i.b)(c[s]);Object(a.useEffect)((function(){l()}),[l]);var d=n.suffix,u=void 0===d||d,b=n.title,j=n.description,f=u?"".concat(b," - Construct Hub"):b;return Object(o.jsxs)(o.Fragment,{children:[Object(o.jsxs)(r.a,{children:[!1,Object(o.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),Object(o.jsx)("meta",{charSet:"utf-8"}),Object(o.jsx)("title",{children:f}),Object(o.jsx)("meta",{content:f,property:"og:title"}),Object(o.jsx)("meta",{content:f,name:"twitter:title"}),Object(o.jsx)("meta",{content:"summary",name:"twitter:card"}),Object(o.jsx)("meta",{content:j,name:"description"}),Object(o.jsx)("meta",{content:j,property:"og:description"}),Object(o.jsx)("meta",{content:j,name:"twitter:description"})]}),t]})}},241:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(21),c=function(){var e=Object(r.h)().search;return Object(a.useMemo)((function(){return new URLSearchParams(e)}),[e])}},242:function(e,t,n){"use strict";n.d(t,"a",(function(){return j}));var a=n(5),r=n(0),c=n(21),i=n(109),o=n(14),s=n(241),l=i.d.TypeScript,d="preferred-language",u=function(e){return null!=e&&i.e.has(e)},b=function(e){if(u(e))return e;try{var t,n=null!==(t=localStorage.getItem(d))&&void 0!==t?t:"";if(u(n))return n}catch(a){}return l},j=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.updateUrl,n=e.updateSaved,i=Object(c.h)(),l=i.pathname,j=i.hash,f=Object(c.g)(),m=f.replace,O=Object(s.a)(),h=O.get(o.b.LANGUAGE),p=Object(r.useState)((function(){return b(h)})),g=Object(a.a)(p,2),v=g[0],x=g[1];Object(r.useEffect)((function(){u(h)&&h!==v&&x(h)}),[h]),Object(r.useEffect)((function(){h!==v&&t&&(O.set(o.b.LANGUAGE,v),m({pathname:l,hash:j,search:O.toString()}))}),[v,t]);var y=Object(r.useCallback)((function(e){if(x(e),n)try{localStorage.setItem(d,e)}catch(t){}}),[n]);return Object(r.useMemo)((function(){return[v,y]}),[v,y])}},252:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var a=new Set(["aws-cdk","aws","awscdk","cdk-construct","cdk","construct","constructs"])},253:function(e,t,n){"use strict";n.d(t,"c",(function(){return r})),n.d(t,"b",(function(){return c})),n.d(t,"d",(function(){return i})),n.d(t,"a",(function(){return s}));var a=n(14),r=function(e,t){return t?"".concat(t,"/").concat(e):e},c=function(e,t,n){var c="".concat(a.a.PACKAGES_PREFIX,"/"),i=r(e,n),o="/v".concat(t);return"".concat(c).concat(i).concat(o)},i=function(e){var t=e;return(t.startsWith("~")||t.startsWith("^"))&&(t=t.substring(1)),t},o=function(e){return i(e).split(".")[0]},s=function(e,t){var n=e.packages.filter((function(e){return e.name===t}));return n.length>1?n.sort((function(e,t){var n=o(e.version);return o(t.version).localeCompare(n)}))[0]:n[0]}},256:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(225),r=n(109),c=n(1),i=function(e){var t=e.children,n=e.language,i=r.e.has(n),o=r.b[n],s=i?"Click to view documentation in ".concat(o):"Documentation support for ".concat(o," is coming soon!");return Object(c.jsx)(a.a,{hasArrow:!0,label:s,placement:"top-start",children:Object(c.jsx)("span",{children:t})})}},257:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(6),r=n(28),c=n(593),i=n(85),o=n(86),s=n(1),l=["children","language","value","label","zIndex"],d=function(e){var t=e.children,n=e.language,d=e.value,u=e.label,b=void 0===u?d:u,j=e.zIndex,f=Object(r.a)(e,l);return Object(s.jsx)(o.a,{"aria-label":"Tag: ".concat(b),to:Object(i.c)({query:"".concat(d),language:n}),zIndex:j,children:Object(s.jsx)(c.a,Object(a.a)(Object(a.a)({_hover:{textDecoration:"underline"}},f),{},{children:Object(s.jsx)(c.b,{children:t})}))})}},258:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(6),r=n(28),c=n(17),i=n(194),o=n(606),s=n(1),l=["date","format"],d=Object(c.a)((function(e,t){var n=e.date,c=e.format,d=Object(r.a)(e,l);return Object(s.jsx)(i.a,Object(a.a)(Object(a.a)({as:"time",dateTime:n.toISOString(),ref:t},d),{},{children:Object(o.a)(n,c)}))}));d.displayName="Time"},270:function(e,t,n){"use strict";var a;n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return Q})),function(e){e.Wide="wide"}(a||(a={}));var r=n(0),c=n(307),i=n(147),o=n(231),s=n(209),l=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.map((function(e){return'"'.concat(e.join(" "),'"')})).join(" ")},d=n(5),u=n(364),b=n(198),j=n(90),f=n(242),m=n(85),O=n(86),h=n(258),p=n(57),g=Object(p.a)("packageCard",["author","description","downloads","languages","published","title","version","comment","wideContainer"]),v=n(1),x=function(e){var t=e["data-testid"],n=e.icon,a=e.label,r=e.value;return Object(v.jsxs)(b.a,{"data-testid":t,fontSize:"xs",children:[n,n?" ":"",Object(v.jsx)("strong",{children:a})," ",r]})},y=function(){var e,t,n,a=Object(f.a)(),r=Object(d.a)(a,1)[0],c=J(),i=c.author,o=c.metadata.date,s=c.version,l=c.name,b=Object(j.b)().data,p=null===b||void 0===b||null===(e=b.packages)||void 0===e||null===(t=e[l])||void 0===t||null===(n=t.downloads)||void 0===n?void 0:n.npm,y="string"===typeof i?i:i.name;return Object(v.jsxs)(v.Fragment,{children:[void 0!==p&&p>=10?Object(v.jsx)(x,{"data-testid":g.downloads,icon:Object(v.jsx)(u.a,{}),label:p.toLocaleString(),value:"Downloads"}):Object(v.jsx)(x,{"data-testid":g.version,label:"Version",value:s}),Object(v.jsx)(x,{"data-testid":g.published,label:"Published",value:Object(v.jsx)(h.a,{date:new Date(o),fontSize:"xs",format:"MMM dd, yyyy"})}),Object(v.jsx)(x,{"data-testid":g.author,label:"Author",value:Object(v.jsx)(O.a,{color:"blue.500",to:Object(m.c)({query:y,language:r}),children:y})})]})},w=n(207),k=n(225),C=n(230),S=n(218),T=n(33),z=n(66),D=function(){var e=Object(f.a)(),t=Object(d.a)(e,1)[0],n=J(),a=n.comment,r=n.description,i=n.metadata.constructFramework,o=n.name,s=n.version,l=null===i||void 0===i?void 0:i.name,u=null===i||void 0===i?void 0:i.majorVersion;return Object(v.jsxs)(v.Fragment,{children:[Object(v.jsx)(c.b,{as:T.b,to:Object(m.a)({name:o,version:s,language:t}),children:Object(v.jsxs)(w.a,{align:"center",children:[l&&Object(v.jsx)(k.a,{hasArrow:!0,label:z.b[l].name+(void 0!==u?" v".concat(u):""),placement:"top",children:Object(v.jsx)(C.a,{alt:"".concat(z.b[l].name," icon"),h:5,mr:2,src:z.b[l].imgsrc,w:5,zIndex:1})}),Object(v.jsx)(S.a,{as:"h3",color:"blue.800","data-testid":g.title,fontSize:"md",fontWeight:"bold",wordBreak:"break-all",children:o})]})}),Object(v.jsx)(b.a,{color:"blue.800","data-testid":g.description,fontSize:"md",lineHeight:"tall",noOfLines:4,children:r||"No description available."}),a&&Object(v.jsxs)(b.a,{"data-testid":g.comment,fontSize:"md",lineHeight:"tall",noOfLines:4,children:[Object(v.jsxs)(b.a,{as:"span",color:"blue.500",fontSize:"md",fontWeight:"bold",lineHeight:"tall",children:["Editor's note:"," "]}),a]})]})},L={official:{imgsrc:"/assets/construct.png",label:"Official",color:"#ED3B00"},community:{imgsrc:"/assets/community.png",label:"Community",color:"#2F50FE"},highQuality:{imgsrc:"/assets/medal.png",label:"High Quality",color:"#1F02D4"}},A=function(){var e=J().name,t=z.d.some((function(t){return e.includes(t)})),n=L[t?"official":"community"],a=n.imgsrc,r=n.color,c=n.label;return Object(v.jsxs)(o.a,{align:"center",direction:"row",spacing:2,children:[Object(v.jsx)(C.a,{alt:"".concat(c," icon"),src:a,w:4}),Object(v.jsx)(b.a,{color:r,fontWeight:"bold",children:c})]})},N=n(6),_=n(109),I=n(256),E={sm:5,md:6,lg:8},F=function(e){var t=e.isRounded,n=void 0!==t&&t,a=e.languages,r=e.name,c=e.size,i=void 0===c?"md":c,o=e.version,s=Object.keys(null!==a&&void 0!==a?a:{});return Object(v.jsx)(v.Fragment,{children:Object.entries(_.c).sort((function(e,t){var n=Object(d.a)(e,1)[0],a=Object(d.a)(t,1)[0];return _.a.indexOf(n)-_.a.indexOf(a)})).map((function(e){var t=Object(d.a)(e,2),a=t[0],c=t[1],l=a,u=l===_.d.TypeScript||s.includes(l),b=l===_.d.TypeScript||_.e.has(l);if(!u)return null;var j=c.name,f=c.icon,O=Object(v.jsx)(f,{"aria-label":"Supports ".concat(j),borderRadius:n?"50%":0,h:E[i],opacity:b?1:.2,w:E[i]});return Object(v.jsx)(I.a,{language:l,children:b?Object(v.jsx)(T.b,{"aria-label":"View package docs for ".concat(l),to:Object(m.a)({name:r,version:o,language:l}),children:O}):O},l)}))})},P=function(){var e=J();return Object(v.jsx)(F,Object(N.a)(Object(N.a)({},e),{},{size:"sm"}))},H=n(18),W=n(252),K=n(257),R=function(){var e=J(),t=e.keywords,n=e.name;return Object(v.jsx)(v.Fragment,{children:[z.d.some((function(e){return n.includes(e)}))?Object(v.jsx)(K.a,{label:"official",mr:1,value:"@aws-cdk",variant:"official",children:"Official"},"official"):null].concat(Object(H.a)((null!==t&&void 0!==t?t:[]).filter((function(e){return Boolean(e)&&!W.a.has(e)})).slice(0,3).map((function(e){return Object(v.jsx)(K.a,{mr:1,value:'"'.concat(e,'"'),zIndex:"0 !important",children:e},e)}))))})},B="details",M="languages",U="tags",G="heading",X=l([G,G,B],[G,G,B],[U,U,M]),q=l([G],[M],[B]),Y=function(){return Object(v.jsx)(c.a,{_hover:{"> article":{bg:"gray.50"}},children:Object(v.jsxs)(i.a,{as:"article",autoColumns:"1fr",autoRows:"auto",bg:"white",border:"base",borderRadius:"sm",boxShadow:"base",color:"gray.600","data-testid":g.wideContainer,gap:5,h:"100%",p:5,templateAreas:{base:q,md:X},w:"100%",children:[Object(v.jsx)(o.a,{gridArea:G,spacing:2,children:Object(v.jsx)(D,{})}),Object(v.jsx)(o.a,{direction:"row",display:{base:"none",md:"initial"},gridArea:U,maxH:6,overflow:"hidden",children:Object(v.jsx)(R,{})}),Object(v.jsxs)(i.a,{alignItems:"start",alignSelf:"center",autoColumns:{base:"initial",md:"1fr"},autoRows:{base:"initial",md:"auto"},fontSize:"xs",gap:{base:0,md:1},gridArea:B,templateColumns:{base:"1fr 1fr",md:"initial"},templateRows:{base:"1fr 1fr",md:"initial"},children:[Object(v.jsx)(A,{}),Object(v.jsx)(y,{})]}),Object(v.jsxs)(o.a,{gridArea:M,spacing:{base:4,md:0},children:[Object(v.jsx)(s.a,{display:{md:"none"}}),Object(v.jsx)(o.a,{"data-testid":g.languages,direction:"row",spacing:2,children:Object(v.jsx)(P,{})})]})]})})},V=Object(r.createContext)(null),J=function(){return Object(r.useContext)(V)},Q=function(e){var t=e.pkg,n=e.variant,r=void 0===n?a.Wide:n;return Object(v.jsx)(V.Provider,{value:t,children:r===a.Wide&&Object(v.jsx)(Y,{})})}},307:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var a=n(17),r=n(20),c=n(13),i=n(0);function o(){return o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},o.apply(this,arguments)}function s(e,t){if(null==e)return{};var n,a,r={},c=Object.keys(e);for(a=0;a<c.length;a++)n=c[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}var l=Object(a.a)((function(e,t){var n=e.isExternal,a=e.target,l=e.rel,d=e.className,u=s(e,["isExternal","target","rel","className"]);return i.createElement(r.a.a,o({},u,{ref:t,className:Object(c.d)("chakra-linkbox__overlay",d),rel:n?"noopener noreferrer":l,target:n?"_blank":a,__css:{position:"static","&::before":{content:"''",cursor:"inherit",display:"block",position:"absolute",top:0,left:0,zIndex:0,width:"100%",height:"100%"}}}))})),d=Object(a.a)((function(e,t){var n=e.className,a=s(e,["className"]);return i.createElement(r.a.div,o({ref:t,position:"relative"},a,{className:Object(c.d)("chakra-linkbox",n),__css:{"a[href]:not(.chakra-linkbox__overlay), abbr[title]":{position:"relative",zIndex:1}}}))}))},364:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(78),r=Object(a.a)({d:"M11.2857,6.05714 L10.08571,4.85714 L7.85714,7.14786 L7.85714,1 L6.14286,1 L6.14286,7.14786 L3.91429,4.85714 L2.71429,6.05714 L7,10.42857 L11.2857,6.05714 Z M1,11.2857 L1,13 L13,13 L13,11.2857 L1,11.2857 Z",displayName:"DownloadIcon",viewBox:"0 0 14 14"})},608:function(e,t,n){"use strict";n.r(t),n.d(t,"HomeRedesign",(function(){return He})),n.d(t,"default",(function(){return He}));var a=n(207),r=n(236),c=n(6),i=n(28),o=n(17),s=n(55),l=n(34),d=n(46),u=n(20),b=n(27),j=n(13),f=n(8),m=n(0),O=n(4),h=n(5),p=n(233),g=n(226),v=n(145),x=n(115),y=n(144),w=n(117),k=n(154),C=n(155),S=n(176),T=n(29),z=n(211);function D(){return D=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},D.apply(this,arguments)}function L(e,t){if(null==e)return{};var n,a,r={},c=Object.keys(e);for(a=0;a<c.length;a++)n=c[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}var A=Object(g.a)(),N=Object(h.a)(A,4),_=N[0],I=N[1],E=N[2],F=N[3];var P=Object(w.a)({name:"TabsContext",errorMessage:"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />"}),H=Object(h.a)(P,2),W=H[0],K=H[1];function R(e,t){return e+"--tab-"+t}function B(e,t){return e+"--tabpanel-"+t}function M(){return M=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},M.apply(this,arguments)}function U(e,t){if(null==e)return{};var n,a,r={},c=Object.keys(e);for(a=0;a<c.length;a++)n=c[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}var G=Object(o.a)((function(e,t){var n=Object(s.a)("Tabs",e),a=Object(l.b)(e),r=a.children,c=a.className,i=function(e){var t=e.defaultIndex,n=e.onChange,a=e.index,r=e.isManual,c=e.isLazy,i=e.lazyBehavior,o=void 0===i?"unmount":i,s=e.orientation,l=void 0===s?"horizontal":s,d=e.direction,u=void 0===d?"ltr":d,b=L(e,["defaultIndex","onChange","index","isManual","isLazy","lazyBehavior","orientation","direction"]),j=m.useState(null!=t?t:0),f=Object(h.a)(j,2),O=f[0],p=f[1],g=Object(v.b)({defaultValue:null!=t?t:0,value:a,onChange:n}),y=Object(h.a)(g,2),w=y[0],k=y[1];m.useEffect((function(){null!=a&&p(a)}),[a]);var C=E();return{id:Object(x.b)(e.id,"tabs"),selectedIndex:w,focusedIndex:O,setSelectedIndex:k,setFocusedIndex:p,isManual:r,isLazy:c,lazyBehavior:o,orientation:l,descendants:C,direction:u,htmlProps:b}}(U(a,["children","className"])),o=i.htmlProps,f=i.descendants,O=U(i,["htmlProps","descendants"]),p=m.useMemo((function(){return O}),[O]),g=Object(b.g)(o,["isFitted"]);return m.createElement(_,{value:f},m.createElement(W,{value:p},m.createElement(d.b,{value:n},m.createElement(u.a.div,M({className:Object(j.d)("chakra-tabs",c),ref:t},g,{__css:n.root}),r))))}));f.a&&(G.displayName="Tabs");var X=Object(o.a)((function(e,t){var n=Object(d.d)(),a=function(e){var t=e.isDisabled,n=e.isFocusable,a=L(e,["isDisabled","isFocusable"]),r=K(),c=r.setSelectedIndex,i=r.isManual,o=r.id,s=r.setFocusedIndex,l=r.selectedIndex,d=F({disabled:t&&!n}),u=d.index,b=d.register,j=u===l,f=Object(p.a)(D({},a,{ref:Object(k.a)(b,e.ref),isDisabled:t,isFocusable:n,onClick:Object(T.b)(e.onClick,(function(){c(u)}))}));return D({},f,{id:R(o,u),role:"tab",tabIndex:j?0:-1,type:"button","aria-selected":j,"aria-controls":B(o,u),onFocus:t?void 0:Object(T.b)(e.onFocus,(function(){s(u),!i&&(!t||!n)&&c(u)}))})}(M({},e,{ref:t})),r=M({outline:"0",display:"flex",alignItems:"center",justifyContent:"center"},n.tab);return m.createElement(u.a.button,M({},a,{className:Object(j.d)("chakra-tabs__tab",e.className),__css:r}))}));f.a&&(X.displayName="Tab");var q=Object(o.a)((function(e,t){var n=function(e){var t=K(),n=t.focusedIndex,a=t.orientation,r=t.direction,c=I(),i=m.useCallback((function(e){var t,i=function(){var e=c.nextEnabled(n);e&&Object(S.a)(e.node)},o=function(){var e=c.prevEnabled(n);e&&Object(S.a)(e.node)},s="horizontal"===a,l="vertical"===a,d=Object(j.m)(e),u="ltr"===r?"ArrowLeft":"ArrowRight",b="ltr"===r?"ArrowRight":"ArrowLeft",f=(t={},Object(O.a)(t,u,(function(){return s&&o()})),Object(O.a)(t,b,(function(){return s&&i()})),Object(O.a)(t,"ArrowDown",(function(){return l&&i()})),Object(O.a)(t,"ArrowUp",(function(){return l&&o()})),Object(O.a)(t,"Home",(function(){var e=c.firstEnabled();e&&Object(S.a)(e.node)})),Object(O.a)(t,"End",(function(){var e=c.lastEnabled();e&&Object(S.a)(e.node)})),t)[d];f&&(e.preventDefault(),f(e))}),[c,n,a,r]);return D({},e,{role:"tablist","aria-orientation":a,onKeyDown:Object(T.b)(e.onKeyDown,i)})}(M({},e,{ref:t})),a=M({display:"flex"},Object(d.d)().tablist);return m.createElement(u.a.div,M({},n,{className:Object(j.d)("chakra-tabs__tablist",e.className),__css:a}))}));f.a&&(q.displayName="TabList");var Y=Object(o.a)((function(e,t){var n=function(e){var t=e.isSelected,n=e.id,a=e.children,r=L(e,["isSelected","id","children"]),c=K(),i=c.isLazy,o=c.lazyBehavior,s=m.useRef(!1);return t&&(s.current=!0),D({tabIndex:0},r,{children:Object(z.a)({hasBeenSelected:s.current,isSelected:t,isLazy:i,lazyBehavior:o})?a:null,role:"tabpanel",hidden:!t,id:n})}(M({},e,{ref:t})),a=Object(d.d)();return m.createElement(u.a.div,M({outline:"0"},n,{className:Object(j.d)("chakra-tabs__tab-panel",e.className),__css:a.tabpanel}))}));f.a&&(Y.displayName="TabPanel");var V=Object(o.a)((function(e,t){var n=function(e){var t=K(),n=t.id,a=t.selectedIndex;return D({},e,{children:Object(C.a)(e.children).map((function(e,t){return m.cloneElement(e,{isSelected:t===a,id:B(n,t),"aria-labelledby":R(n,t)})}))})}(e),a=Object(d.d)();return m.createElement(u.a.div,M({},n,{width:"100%",ref:t,className:Object(j.d)("chakra-tabs__tab-panels",e.className),__css:a.tabpanels}))}));f.a&&(V.displayName="TabPanels");var J=Object(o.a)((function(e,t){var n=function(){var e=K(),t=I(),n=e.selectedIndex,a=e.orientation,r="horizontal"===a,c="vertical"===a,i=m.useState((function(){return r?{left:0,width:0}:c?{top:0,height:0}:void 0})),o=Object(h.a)(i,2),s=o[0],l=o[1],d=m.useState(!1),u=Object(h.a)(d,2),b=u[0],j=u[1];return Object(y.a)((function(){if(!Object(f.l)(n)){var e=t.item(n);if(!Object(f.l)(e)){r&&l({left:e.node.offsetLeft,width:e.node.offsetWidth}),c&&l({top:e.node.offsetTop,height:e.node.offsetHeight});var a=requestAnimationFrame((function(){j(!0)}));return function(){a&&cancelAnimationFrame(a)}}}}),[n,r,c,t]),D({position:"absolute",transitionProperty:"left, right, top, bottom",transitionDuration:b?"200ms":"0ms",transitionTimingFunction:"cubic-bezier(0, 0, 0.2, 1)"},s)}(),a=M({},e.style,n),r=Object(d.d)();return m.createElement(u.a.div,M({ref:t},e,{className:Object(j.d)("chakra-tabs__tab-indicator",e.className),style:a,__css:r.indicator}))}));f.a&&(J.displayName="TabIndicator");var Q=n(153),Z=n(218),$=n(198),ee=n(21),te=n(51),ne=n(66),ae=n(121),re=n(85),ce={X:[4,8,12,16,20],Y:[4,6,8]},ie=n(147),oe=n(270),se=n(1),le=function(e){var t=e.packages;return Object(se.jsx)(ie.a,{gap:4,mt:8,templateColumns:{base:"1fr",lg:"1fr 1fr"},children:t.map((function(e){return Object(se.jsx)(oe.a,{pkg:e},e.name)}))})},de=["cdkType","data"],ue=function(e){var t=e.cdkType,n=e.data;return Object(se.jsxs)(X,{isDisabled:n.page.length<1,children:[t?ne.b[t].name:"All CDKs"," (",n.results.length,")"]})},be=Object(o.a)((function(e,t){var n=e.cdkType,r=e.data,o=Object(i.a)(e,de),s=Object(ee.g)().push;return Object(se.jsxs)(Y,Object(c.a)(Object(c.a)({ref:t},o),{},{p:0,children:[Object(se.jsx)(le,{packages:r.page}),Object(se.jsx)(a.a,{justify:"center",w:"full",children:Object(se.jsxs)(Q.a,{colorScheme:"blue",my:8,onClick:function(){window.scrollTo(0,0),s(Object(re.c)({cdkType:n,sort:te.a.DownloadsDesc}))},children:["See all ",n?ne.b[n].name+" ":"","constructs"]})})]}))})),je=function(){var e=Object(ae.a)({limit:4}),t=Object(ae.a)({cdkType:ne.c.awscdk,limit:4,sort:te.a.DownloadsDesc}),n=Object(ae.a)({cdkType:ne.c.cdk8s,limit:4,sort:te.a.DownloadsDesc}),r=Object(ae.a)({cdkType:ne.c.cdktf,limit:4,sort:te.a.DownloadsDesc});return Object(se.jsxs)(a.a,{bg:"white",color:"blue.800",direction:"column",px:ce.X,py:ce.Y,children:[Object(se.jsx)(Z.a,{as:"h3",fontSize:"1.5rem",fontWeight:"semibold",lineHeight:"lg",mb:3,children:"Find open-source community constructs and official libraries in one location"}),Object(se.jsx)($.a,{lineHeight:"md",maxW:"60ch",mb:5,children:"Use Construct Hub to find CDKs\u2019 libraries owned by the open source community and companies and organizations like Terraform, CNCF, AWS and more."}),Object(se.jsxs)(G,{isFitted:!0,variant:"line",children:[Object(se.jsxs)(q,{children:[Object(se.jsx)(ue,{data:e}),Object(se.jsx)(ue,{cdkType:ne.c.awscdk,data:t}),Object(se.jsx)(ue,{cdkType:ne.c.cdk8s,data:n}),Object(se.jsx)(ue,{cdkType:ne.c.cdktf,data:r})]}),Object(se.jsxs)(V,{minH:"28.5rem",children:[Object(se.jsx)(be,{data:e}),Object(se.jsx)(be,{cdkType:ne.c.awscdk,data:t}),Object(se.jsx)(be,{cdkType:ne.c.cdk8s,data:n}),Object(se.jsx)(be,{cdkType:ne.c.cdktf,data:r})]})]})]})},fe=n(137),me=n(91),Oe=n(77),he=n(253),pe=n(89),ge=function(){var e=function(e){var t=Object(me.b)().data;return(null!==t&&void 0!==t?t:{})[e]}("featuredPackages"),t=Object(h.a)((null!==e&&void 0!==e?e:fe.a).sections,1)[0],n=void 0===t?{name:"Recently Updated",showLastUpdated:4}:t,r=function(e){var t=e.showLastUpdated,n=e.showPackages,a=Object(pe.b)(),r=a.data,i=a.loading,o=a.error;return Object(m.useMemo)((function(){return i||o||!(null===r||void 0===r?void 0:r.packages)?[]:t?r.packages.sort(Oe.b[te.a.PublishDateDesc]).slice(0,t):n?n.map((function(e){var t=Object(he.a)(r,e.name);if(t)return Object(c.a)(Object(c.a)({},t),{},{comment:e.comment})})).filter((function(e){return void 0!==e})):void 0}),[r,o,i,t,n])}(n);return r?Object(se.jsxs)(a.a,{direction:"column",px:ce.X,py:ce.Y,children:[Object(se.jsx)(Z.a,{as:"h3",color:"white",fontSize:"1.5rem",fontWeight:"semibold",lineHeight:"lg",children:n.name}),Object(se.jsx)(ie.a,{gap:4,mt:8,templateColumns:{base:"1fr",lg:"1fr 1fr"},children:null===r||void 0===r?void 0:r.slice(0,4).map((function(e){return Object(se.jsx)(oe.a,{pkg:e},e.name)}))})]}):null};var ve,xe,ye,we=n(60),ke=n(194),Ce=Object(we.b)(ve||(xe=["\n 0% {\n background-position:0% 50%;\n }\n\n 50% {\n background-position:100% 50%;\n }\n\n 100% {\n background-position:0% 50%;\n }\n"],ye||(ye=xe.slice(0)),ve=Object.freeze(Object.defineProperties(xe,{raw:{value:Object.freeze(ye)}})))),Se=Object(o.a)((function(e,t){return Object(se.jsx)(ke.a,Object(c.a)({animation:"".concat(Ce," 10s linear infinite"),bg:"linear-gradient(274.2deg, #143870 20.69%, #1F50A1 84.17%)",bgSize:"200% 200%",ref:t},e))})),Te=n(70),ze=function(){return Object(se.jsxs)(a.a,{align:"center",color:"white",direction:"column",h:"20rem",justify:"center",px:ce.X,py:ce.Y,textAlign:"center",zIndex:"1",children:[Object(se.jsx)(Z.a,{as:"h1",size:"xl",children:"Build cloud infrastructure with reusable components"}),Object(se.jsx)(Z.a,{as:"h2",fontWeight:"normal",mt:4,size:"md",children:"Open source registry for AWS CDK, CDKtf and CDK8s"}),Object(se.jsx)(ke.a,{color:"initial",maxW:"36rem",mt:8,mx:"auto",w:"full",children:Object(se.jsxs)(Te.a,{hasButton:!0,children:[Object(se.jsx)(Te.b,{}),Object(se.jsx)(Te.c,{})]})})]})},De=n(231),Le=n(230),Ae=n(209),Ne=n(86),_e=n(109),Ie=function(e){var t=e.title,n=e.description,a=e.children;return Object(se.jsxs)(ie.a,{color:"blue.800",px:ce.X,py:ce.Y,templateColumns:"1fr",templateRows:"minmax(4.5rem, min-content) 1fr auto",children:[Object(se.jsx)(Z.a,{as:"h3",fontSize:"1.5rem",fontWeight:"semibold",lineHeight:"lg",mb:4,children:t}),Object(se.jsx)($.a,{fontSize:"lg",mb:4,children:n}),a]})},Ee=function(){return Object(se.jsxs)(ie.a,{bg:"white",templateColumns:{base:"1fr",lg:"1fr auto 1fr"},templateRows:{base:"1fr auto 1fr",lg:"1fr"},textAlign:"left",children:[Object(se.jsx)(Ie,{description:"The Construct Hub is a central destination for discovering and sharing cloud application design patterns and reference architectures defined for the AWS CDK, CDK for Kubernetes (CDK8s), CDK for Terraform (CDKtf) and other construct-based tools.",title:"Browse 600+ reusable cloud application libraries for popular IaC frameworks",children:Object(se.jsx)(a.a,{align:"center",justify:"space-evenly",pt:4,wrap:"wrap",children:Object.entries(ne.b).map((function(e){var t=Object(h.a)(e,2),n=t[0],a=t[1],r=a.name,c=a.imgsrc;return Object(se.jsx)(Ne.a,{to:Object(re.c)({cdkType:n}),children:Object(se.jsxs)(De.a,{align:"center",color:"blue.500",spacing:2,children:[Object(se.jsx)(Le.a,{"aria-label":r,h:8,src:c}),Object(se.jsx)("span",{children:r})]})},n)}))})}),Object(se.jsx)(Ae.a,{display:{base:"none",lg:"initial"},h:"auto",my:10,orientation:"vertical"}),Object(se.jsx)(Ae.a,{display:{lg:"none"},mx:10,w:"auto"}),Object(se.jsx)(Ie,{description:"Create cloud applications faster with reusable infrastructure building blocks in your favorite programming language. Develop faster by getting helpful API reference + code samples which are automatically generated for Typescript, Python, .NET or Java (Go coming soon)!",title:"Build using familiar programming languages. Code samples and API reference included.",children:Object(se.jsx)(a.a,{align:"center",justify:"space-evenly",pt:4,wrap:"wrap",children:Object.entries(_e.c).filter((function(e){var t=Object(h.a)(e,1)[0];return _e.e.has(t)})).map((function(e){var t=Object(h.a)(e,2),n=t[0],a=t[1],r=a.icon,c=a.name;return Object(se.jsx)(Ne.a,{to:Object(re.c)({languages:[n]}),children:Object(se.jsxs)(De.a,{align:"center",color:"blue.500",spacing:2,children:[Object(se.jsx)(r,{"aria-label":c,h:8,w:8}),Object(se.jsx)("span",{children:c})]},n)},n)}))})})]})},Fe=n(57),Pe=Object(Fe.a)("homeRedesign",["page"]),He=function(){return Object(se.jsx)(r.a,{meta:{title:"Construct Hub",description:"Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTf and other construct-based tools.",suffix:!1},pageName:"home",children:Object(se.jsxs)(Se,{as:a.a,"data-testid":Pe.page,direction:"column",children:[Object(se.jsx)(ze,{}),Object(se.jsx)(Ee,{}),Object(se.jsx)(ge,{}),Object(se.jsx)(je,{})]})})}}}]);
2
+ //# sourceMappingURL=8.31a21ecd.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","constants/keywords.ts","api/package/util.ts","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/PackageCard/constants.ts","util/css.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","../../../src/link-box.tsx","../../../src/Download.tsx","../../../src/use-tabs.ts","../../../src/tabs.tsx","views/HomeRedesign/constants.ts","views/HomeRedesign/PackageGrid.tsx","views/HomeRedesign/CDKTypeTabs.tsx","views/HomeRedesign/Featured.tsx","hooks/useConfigValue/useConfigValue.ts","views/HomeRedesign/useSection.ts","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","views/HomeRedesign/GradientContainer.tsx","views/HomeRedesign/Hero.tsx","views/HomeRedesign/InfoSection.tsx","views/HomeRedesign/Info.tsx","views/HomeRedesign/testIds.ts","views/HomeRedesign/HomeRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","KEYWORD_IGNORE_LIST","Set","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","label","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","PackageCardType","makeGridAreas","rows","map","row","join","testIds","createTestIds","Detail","dataTestid","icon","fontSize","Details","currentLanguage","usePackageCard","author","metadata","data","useStats","downloads","npm","authorName","undefined","Download","toLocaleString","published","Date","color","Heading","comment","constructFramework","cdkType","cdkVersion","majorVersion","Link","getPackagePath","align","CDKTYPE_RENDER_MAP","alt","h","mr","src","imgsrc","w","fontWeight","wordBreak","lineHeight","noOfLines","HIGHLIGHT_RENDER_MAP","official","community","highQuality","Highlight","isOfficial","OFFICIAL_SCOPES","some","includes","direction","spacing","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","left","right","LANGUAGES","indexOf","info","isSupportedByLibrary","isSupportedByConstructHub","Icon","borderRadius","opacity","Languages","Tags","keywords","variant","v","Boolean","slice","tag","GRID_AREA","gridAreasMd","gridAreasMobile","WideCard","bg","autoColumns","autoRows","border","boxShadow","wideContainer","gap","templateAreas","base","gridArea","display","maxH","overflow","alignItems","alignSelf","templateColumns","templateRows","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","LinkOverlay","className","cx","rel","isExternal","target","__css","position","cursor","top","width","height","LinkBox","DownloadIcon","createIcon","d","viewBox","createDescendantContext","errorMessage","makeTabId","id","makeTabPanelId","Tabs","styles","useMultiStyleConfig","omitThemingProps","props","lazyBehavior","orientation","React","defaultIndex","useControllableState","defaultValue","onChange","index","setFocusedIndex","descendants","useTabsDescendants","useId","selectedIndex","focusedIndex","setSelectedIndex","isManual","isLazy","htmlProps","useTabs","context","rootProps","omit","root","Tab","useStyles","tabProps","isFocusable","useTabsContext","useTabsDescendant","disabled","isDisabled","register","isSelected","clickableProps","useClickable","mergeRefs","onClick","callAllHandlers","role","tabIndex","type","onFocus","useTab","tabStyles","outline","justifyContent","TabList","tablistProps","useTabsDescendantsContext","onKeyDown","nextTab","next","focus","prevTab","prev","isHorizontal","isVertical","eventKey","normalizeEventKey","ArrowStart","ArrowEnd","action","first","last","useTabList","tablistStyles","TabPanel","panelProps","hasBeenSelected","determineLazyBehavior","hidden","useTabPanel","tabpanel","TabPanels","panelsProps","getValidChildren","useTabPanels","tabpanels","TabIndicator","indicatorStyle","useSafeLayoutEffect","isUndefined","tab","setRect","offsetWidth","offsetHeight","requestAnimationFrame","setHasMeasured","cancelAnimationFrame","transitionProperty","transitionDuration","hasMeasured","transitionTimingFunction","useTabIndicator","style","indicator","SECTION_PADDING","X","Y","PackageGrid","mt","PackageTab","results","PackageTabPanel","push","justify","colorScheme","my","window","scrollTo","CatalogSearchSort","DownloadsDesc","CDKTypeTabs","anyCDKType","useCatalogResults","limit","awscdk","CDKType","cdk8s","cdktf","px","py","mb","maxW","isFitted","minH","Featured","homePackages","key","useConfig","useConfigValue","DEFAULT_FEATURED_PACKAGES","sections","featured","showLastUpdated","section","showPackages","useCatalog","loading","error","SORT_FUNCTIONS","PublishDateDesc","useSection","strings","raw","animation","keyframes","freeze","defineProperties","GradientContainer","bgSize","Hero","textAlign","mx","SearchBar","hasButton","InfoSection","Info","pt","wrap","cdktype","HomeRedesign","Flex"],"mappings":"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","file":"static/js/8.31a21ecd.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export const KEYWORD_IGNORE_LIST = new Set([\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"construct\",\n \"constructs\",\n]);\n","import { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","/**\n * @fileoverview CSS Related Utils\n */\n\n/**\n * Translates a series of grid row definitions into a grid area string\n * ```ts\n * const gridAreas = makeGridAreas(\n * [\"header\", \"header\", \"header\"],\n * [\"aside\", \"main\", \"main\"],\n * [\"aside\", \"footer\", \"footer\"]\n * ); // `\"header header header\" \"aside main main\" \"aside footer footer\"`\n * ```\n */\nexport const makeGridAreas = (...rows: string[][]): string => {\n return rows.map((row) => `\"${row.join(\" \")}\"`).join(\" \");\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { DownloadIcon } from \"@chakra-ui/icons\";\nimport { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../contexts/Stats\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n icon?: ReactChild;\n label: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n icon,\n label,\n value,\n}) => (\n <Text data-testid={dataTestid} fontSize=\"xs\">\n {icon}\n {icon ? \" \" : \"\"}\n <strong>{label}</strong> {value}\n </Text>\n);\n\nexport const Details: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n\n const {\n author,\n metadata: { date },\n version,\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n\n return (\n <>\n {downloads !== undefined && downloads >= 10 ? (\n <Detail\n data-testid={testIds.downloads}\n icon={<DownloadIcon />}\n label={downloads.toLocaleString()}\n value={\"Downloads\"}\n />\n ) : (\n <Detail data-testid={testIds.version} label=\"Version\" value={version} />\n )}\n <Detail\n data-testid={testIds.published}\n label=\"Published\"\n value={\n <Time date={new Date(date)} fontSize=\"xs\" format=\"MMM dd, yyyy\" />\n }\n />\n <Detail\n data-testid={testIds.author}\n label=\"Author\"\n value={\n <NavLink\n color=\"blue.500\"\n to={getSearchPath({\n query: authorName,\n language: currentLanguage,\n })}\n >\n {authorName}\n </NavLink>\n }\n />\n </>\n );\n};\n","import {\n Flex,\n Image,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n comment,\n description,\n metadata: { constructFramework },\n name,\n version,\n } = usePackageCard();\n\n const cdkType = constructFramework?.name;\n const cdkVersion = constructFramework?.majorVersion;\n\n return (\n <>\n <LinkOverlay\n as={Link}\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n {cdkType && (\n <Tooltip\n hasArrow\n label={\n CDKTYPE_RENDER_MAP[cdkType].name +\n (cdkVersion !== undefined ? ` v${cdkVersion}` : \"\")\n }\n placement=\"top\"\n >\n <Image\n alt={`${CDKTYPE_RENDER_MAP[cdkType].name} icon`}\n h={5}\n mr={2}\n src={CDKTYPE_RENDER_MAP[cdkType].imgsrc}\n w={5}\n zIndex={1}\n />\n </Tooltip>\n )}\n <ChakraHeading\n as=\"h3\"\n color=\"blue.800\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"break-all\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n <Text\n color=\"blue.800\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n {comment && (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text\n as=\"span\"\n color=\"blue.500\"\n fontSize=\"md\"\n fontWeight=\"bold\"\n lineHeight=\"tall\"\n >\n Editor&apos;s note:{\" \"}\n </Text>\n {comment}\n </Text>\n )}\n </>\n );\n};\n","import { Stack, Image, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { OFFICIAL_SCOPES } from \"../../constants/constructs\";\nimport { usePackageCard } from \"./PackageCard\";\n\nconst HIGHLIGHT_RENDER_MAP = {\n official: {\n imgsrc: \"/assets/construct.png\",\n label: \"Official\",\n color: \"#ED3B00\",\n },\n community: {\n imgsrc: \"/assets/community.png\",\n label: \"Community\",\n color: \"#2F50FE\",\n },\n highQuality: {\n imgsrc: \"/assets/medal.png\",\n label: \"High Quality\",\n color: \"#1F02D4\",\n },\n} as const;\n\n// TODO: We will need a similar solution to tags for determining High Quality, and likely Official\nexport const Highlight: FunctionComponent = () => {\n const { name } = usePackageCard();\n\n const isOfficial = OFFICIAL_SCOPES.some((scope) => name.includes(scope));\n const highlightType = isOfficial ? \"official\" : \"community\";\n const { imgsrc, color, label } = HIGHLIGHT_RENDER_MAP[highlightType];\n\n return (\n <Stack align=\"center\" direction=\"row\" spacing={2}>\n <Image alt={`${label} icon`} src={imgsrc} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { OFFICIAL_SCOPES } from \"../../constants/constructs\";\nimport { KEYWORD_IGNORE_LIST } from \"../../constants/keywords\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\n// TODO: Proper tag implemenation, this is only a visual placeholder\nexport const Tags: FunctionComponent = () => {\n const { keywords, name } = usePackageCard();\n\n return (\n <>\n {[\n OFFICIAL_SCOPES.some((scope) => name.includes(scope)) ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n mr={1}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null,\n ...(keywords ?? [])\n .filter((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\n .slice(0, 3)\n .map((tag) => {\n return (\n <PackageTag\n key={tag}\n mr={1}\n value={`\"${tag}\"`}\n zIndex=\"0 !important\"\n >\n {tag}\n </PackageTag>\n );\n }),\n ]}\n </>\n );\n};\n","import { Grid, Stack, LinkBox, Divider } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { makeGridAreas } from \"../../util/css\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nconst GRID_AREA = {\n DETAILS: \"details\",\n LANGUAGES: \"languages\",\n TAGS: \"tags\",\n HEADING: \"heading\",\n};\n\nconst gridAreasMd = makeGridAreas(\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.TAGS, GRID_AREA.TAGS, GRID_AREA.LANGUAGES]\n);\n\nconst gridAreasMobile = makeGridAreas(\n [GRID_AREA.HEADING],\n [GRID_AREA.LANGUAGES],\n [GRID_AREA.DETAILS]\n);\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"gray.50\",\n },\n }}\n >\n <Grid\n as=\"article\"\n autoColumns=\"1fr\"\n autoRows=\"auto\"\n bg=\"white\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"gray.600\"\n data-testid={testIds.wideContainer}\n gap={5}\n h=\"100%\"\n p={5}\n templateAreas={{ base: gridAreasMobile, md: gridAreasMd }}\n w=\"100%\"\n >\n {/* Name + Desc */}\n <Stack gridArea={GRID_AREA.HEADING} spacing={2}>\n <Heading />\n </Stack>\n\n <Stack\n direction=\"row\"\n display={{ base: \"none\", md: \"initial\" }}\n gridArea={GRID_AREA.TAGS}\n maxH={6}\n overflow=\"hidden\"\n >\n <Tags />\n </Stack>\n\n <Grid\n alignItems=\"start\"\n alignSelf=\"center\"\n autoColumns={{ base: \"initial\", md: \"1fr\" }}\n autoRows={{ base: \"initial\", md: \"auto\" }}\n fontSize=\"xs\"\n gap={{ base: 0, md: 1 }}\n gridArea={GRID_AREA.DETAILS}\n templateColumns={{ base: \"1fr 1fr\", md: \"initial\" }}\n templateRows={{ base: \"1fr 1fr\", md: \"initial\" }}\n >\n <Highlight />\n <Details />\n </Grid>\n\n <Stack gridArea={GRID_AREA.LANGUAGES} spacing={{ base: 4, md: 0 }}>\n <Divider display={{ md: \"none\" }} />\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Stack>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n pkg: CatalogPackage;\n variant?: PackageCardType;\n}\n\nconst PackageCardContext = createContext<\n (CatalogPackage & { comment?: string }) | null\n>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={pkg}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { chakra, forwardRef, HTMLChakraProps } from \"@chakra-ui/system\"\nimport { cx } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface LinkOverlayProps extends HTMLChakraProps<\"a\"> {\n /**\n * If `true`, the link will open in new tab\n */\n isExternal?: boolean\n}\n\nexport const LinkOverlay = forwardRef<LinkOverlayProps, \"a\">((props, ref) => {\n const { isExternal, target, rel, className, ...rest } = props\n return (\n <chakra.a\n {...rest}\n ref={ref}\n className={cx(\"chakra-linkbox__overlay\", className)}\n rel={isExternal ? \"noopener noreferrer\" : rel}\n target={isExternal ? \"_blank\" : target}\n __css={{\n position: \"static\",\n \"&::before\": {\n content: \"''\",\n cursor: \"inherit\",\n display: \"block\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n width: \"100%\",\n height: \"100%\",\n },\n }}\n />\n )\n})\n\nexport interface LinkBoxProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * `LinkBox` is used to wrap content areas within a link while ensuring semantic html\n *\n * @see Docs https://chakra-ui.com/docs/navigation/link-overlay\n * @see Resources https://www.sarasoueidan.com/blog/nested-links\n */\nexport const LinkBox = forwardRef<LinkBoxProps, \"div\">((props, ref) => {\n const { className, ...rest } = props\n\n return (\n <chakra.div\n ref={ref}\n position=\"relative\"\n {...rest}\n className={cx(\"chakra-linkbox\", className)}\n __css={{\n /* Elevate the links and abbreviations up */\n \"a[href]:not(.chakra-linkbox__overlay), abbr[title]\": {\n position: \"relative\",\n zIndex: 1,\n },\n }}\n />\n )\n})\n","import { createIcon } from \"@chakra-ui/icon\"\n\nexport const DownloadIcon = createIcon({\n d:\n \"M11.2857,6.05714 L10.08571,4.85714 L7.85714,7.14786 L7.85714,1 L6.14286,1 L6.14286,7.14786 L3.91429,4.85714 L2.71429,6.05714 L7,10.42857 L11.2857,6.05714 Z M1,11.2857 L1,13 L13,13 L13,11.2857 L1,11.2857 Z\",\n displayName: \"DownloadIcon\",\n viewBox: \"0 0 14 14\",\n})\n","import { useClickable, UseClickableProps } from \"@chakra-ui/clickable\"\nimport { createDescendantContext } from \"@chakra-ui/descendant\"\nimport {\n useControllableState,\n useId,\n useSafeLayoutEffect,\n} from \"@chakra-ui/hooks\"\nimport {\n createContext,\n EventKeyMap,\n getValidChildren,\n mergeRefs,\n} from \"@chakra-ui/react-utils\"\nimport {\n callAllHandlers,\n determineLazyBehavior,\n Dict,\n focus,\n isUndefined,\n LazyBehavior,\n normalizeEventKey,\n} from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\n/* -------------------------------------------------------------------------------------------------\n * Create context to track descendants and their indices\n * -----------------------------------------------------------------------------------------------*/\n\nexport const [\n TabsDescendantsProvider,\n useTabsDescendantsContext,\n useTabsDescendants,\n useTabsDescendant,\n] = createDescendantContext<HTMLButtonElement>()\n\n/* -------------------------------------------------------------------------------------------------\n * useTabs - The root react hook that manages all tab items\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UseTabsProps {\n /**\n * The orientation of the tab list.\n */\n orientation?: \"vertical\" | \"horizontal\"\n /**\n * If `true`, the tabs will be manually activated and\n * display its panel by pressing Space or Enter.\n *\n * If `false`, the tabs will be automatically activated\n * and their panel is displayed when they receive focus.\n */\n isManual?: boolean\n /**\n * Callback when the index (controlled or un-controlled) changes.\n */\n onChange?: (index: number) => void\n /**\n * The index of the selected tab (in controlled mode)\n */\n index?: number\n /**\n * The initial index of the selected tab (in uncontrolled mode)\n */\n defaultIndex?: number\n /**\n * The id of the tab\n */\n id?: string\n /**\n * Performance 🚀:\n * If `true`, rendering of the tab panel's will be deferred until it is selected.\n */\n isLazy?: boolean\n /**\n * Performance 🚀:\n * The lazy behavior of tab panels' content when not active.\n * Only works when `isLazy={true}`\n *\n * - \"unmount\": The content of inactive tab panels are always unmounted.\n * - \"keepMounted\": The content of inactive tab panels is initially unmounted,\n * but stays mounted when selected.\n *\n * @default \"unmount\"\n */\n lazyBehavior?: LazyBehavior\n /**\n * The writing mode direction.\n *\n * - When in RTL, the left and right navigation is flipped\n */\n direction?: \"rtl\" | \"ltr\"\n}\n\n/**\n * Tabs hooks that provides all the states, and accessibility\n * helpers to keep all things working properly.\n *\n * Its returned object will be passed unto a Context Provider\n * so all child components can read from it.\n * There is no document link yet\n * @see Docs https://chakra-ui.com/docs/components/useTabs\n */\nexport function useTabs(props: UseTabsProps) {\n const {\n defaultIndex,\n onChange,\n index,\n isManual,\n isLazy,\n lazyBehavior = \"unmount\",\n orientation = \"horizontal\",\n direction = \"ltr\",\n ...htmlProps\n } = props\n\n /**\n * We use this to keep track of the index of the focused tab.\n *\n * Tabs can be automatically activated, this means selection follows focus.\n * When we navigate with the arrow keys, we move focus and selection to next/prev tab\n *\n * Tabs can also be manually activated, this means selection does not follow focus.\n * When we navigate with the arrow keys, we only move focus NOT selection. The user\n * will need not manually activate the tab using `Enter` or `Space`.\n *\n * This is why we need to keep track of the `focusedIndex` and `selectedIndex`\n */\n const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex ?? 0)\n\n const [selectedIndex, setSelectedIndex] = useControllableState({\n defaultValue: defaultIndex ?? 0,\n value: index,\n onChange,\n })\n\n /**\n * Sync focused `index` with controlled `selectedIndex` (which is the `props.index`)\n */\n React.useEffect(() => {\n if (index != null) {\n setFocusedIndex(index)\n }\n }, [index])\n\n /**\n * Think of `useDescendants` as a register for the tab nodes.\n */\n const descendants = useTabsDescendants()\n\n /**\n * Generate a unique id or use user-provided id for the tabs widget\n */\n const id = useId(props.id, `tabs`)\n\n return {\n id,\n selectedIndex,\n focusedIndex,\n setSelectedIndex,\n setFocusedIndex,\n isManual,\n isLazy,\n lazyBehavior,\n orientation,\n descendants,\n direction,\n htmlProps,\n }\n}\n\nexport type UseTabsReturn = Omit<\n ReturnType<typeof useTabs>,\n \"htmlProps\" | \"descendants\"\n>\n\nexport const [TabsProvider, useTabsContext] = createContext<UseTabsReturn>({\n name: \"TabsContext\",\n errorMessage:\n \"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />\",\n})\n\ntype Child = React.ReactElement<any>\n\nexport interface UseTabListProps {\n children?: React.ReactNode\n onKeyDown?: React.KeyboardEventHandler\n ref?: React.Ref<any>\n}\n\n/**\n * Tabs hook to manage multiple tab buttons,\n * and ensures only one tab is selected per time.\n *\n * @param props props object for the tablist\n */\nexport function useTabList<P extends UseTabListProps>(props: P) {\n const { focusedIndex, orientation, direction } = useTabsContext()\n\n const descendants = useTabsDescendantsContext()\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n const nextTab = () => {\n const next = descendants.nextEnabled(focusedIndex)\n if (next) focus(next.node)\n }\n const prevTab = () => {\n const prev = descendants.prevEnabled(focusedIndex)\n if (prev) focus(prev.node)\n }\n const firstTab = () => {\n const first = descendants.firstEnabled()\n if (first) focus(first.node)\n }\n const lastTab = () => {\n const last = descendants.lastEnabled()\n if (last) focus(last.node)\n }\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n const eventKey = normalizeEventKey(event)\n\n const ArrowStart = direction === \"ltr\" ? \"ArrowLeft\" : \"ArrowRight\"\n const ArrowEnd = direction === \"ltr\" ? \"ArrowRight\" : \"ArrowLeft\"\n\n const keyMap: EventKeyMap = {\n [ArrowStart]: () => isHorizontal && prevTab(),\n [ArrowEnd]: () => isHorizontal && nextTab(),\n ArrowDown: () => isVertical && nextTab(),\n ArrowUp: () => isVertical && prevTab(),\n Home: firstTab,\n End: lastTab,\n }\n\n const action = keyMap[eventKey]\n\n if (action) {\n event.preventDefault()\n action(event)\n }\n },\n [descendants, focusedIndex, orientation, direction],\n )\n\n return {\n ...props,\n role: \"tablist\",\n \"aria-orientation\": orientation,\n onKeyDown: callAllHandlers(props.onKeyDown, onKeyDown),\n }\n}\n\nexport type UseTabListReturn = ReturnType<typeof useTabList>\n\nexport interface UseTabOptions {\n id?: string\n isSelected?: boolean\n panelId?: string\n /**\n * If `true`, the `Tab` won't be toggleable\n */\n isDisabled?: boolean\n}\n\nexport interface UseTabProps\n extends Omit<UseClickableProps, \"color\">,\n UseTabOptions {}\n\n/**\n * Tabs hook to manage each tab button.\n *\n * A tab can be disabled and focusable, or both,\n * hence the use of `useClickable` to handle this scenario\n */\nexport function useTab<P extends UseTabProps>(props: P) {\n const { isDisabled, isFocusable, ...htmlProps } = props\n\n const {\n setSelectedIndex,\n isManual,\n id,\n setFocusedIndex,\n selectedIndex,\n } = useTabsContext()\n\n const { index, register } = useTabsDescendant({\n disabled: isDisabled && !isFocusable,\n })\n\n const isSelected = index === selectedIndex\n\n const onClick = () => {\n setSelectedIndex(index)\n }\n\n const onFocus = () => {\n setFocusedIndex(index)\n const isDisabledButFocusable = isDisabled && isFocusable\n const shouldSelect = !isManual && !isDisabledButFocusable\n if (shouldSelect) {\n setSelectedIndex(index)\n }\n }\n\n const clickableProps = useClickable({\n ...htmlProps,\n ref: mergeRefs(register, props.ref),\n isDisabled,\n isFocusable,\n onClick: callAllHandlers(props.onClick, onClick),\n })\n\n const type: \"button\" | \"submit\" | \"reset\" = \"button\"\n\n return {\n ...clickableProps,\n id: makeTabId(id, index),\n role: \"tab\",\n tabIndex: isSelected ? 0 : -1,\n type,\n \"aria-selected\": isSelected,\n \"aria-controls\": makeTabPanelId(id, index),\n onFocus: isDisabled ? undefined : callAllHandlers(props.onFocus, onFocus),\n }\n}\n\nexport interface UseTabPanelsProps {\n children?: React.ReactNode\n}\n\n/**\n * Tabs hook for managing the visibility of multiple tab panels.\n *\n * Since only one panel can be show at a time, we use `cloneElement`\n * to inject `selected` panel to each TabPanel.\n *\n * It returns a cloned version of its children with\n * all functionality included.\n */\nexport function useTabPanels<P extends UseTabPanelsProps>(props: P) {\n const context = useTabsContext()\n\n const { id, selectedIndex } = context\n\n const validChildren = getValidChildren(props.children)\n\n const children = validChildren.map((child, index) =>\n React.cloneElement(child as Child, {\n isSelected: index === selectedIndex,\n id: makeTabPanelId(id, index),\n // Refers to the associated tab element, and also provides an accessible name to the tab panel.\n \"aria-labelledby\": makeTabId(id, index),\n }),\n )\n\n return { ...props, children }\n}\n\n/**\n * Tabs hook for managing the visible/hidden states\n * of the tab panel.\n *\n * @param props props object for the tab panel\n */\nexport function useTabPanel(props: Dict) {\n const { isSelected, id, children, ...htmlProps } = props\n const { isLazy, lazyBehavior } = useTabsContext()\n\n const hasBeenSelected = React.useRef(false)\n if (isSelected) {\n hasBeenSelected.current = true\n }\n\n const shouldRenderChildren = determineLazyBehavior({\n hasBeenSelected: hasBeenSelected.current,\n isSelected,\n isLazy,\n lazyBehavior,\n })\n\n return {\n // Puts the tabpanel in the page `Tab` sequence.\n tabIndex: 0,\n ...htmlProps,\n children: shouldRenderChildren ? children : null,\n role: \"tabpanel\",\n hidden: !isSelected,\n id,\n }\n}\n\n/**\n * Tabs hook to show an animated indicators that\n * follows the active tab.\n *\n * The way we do it is by measuring the DOM Rect (or dimensions)\n * of the active tab, and return that as CSS style for\n * the indicator.\n */\nexport function useTabIndicator(): React.CSSProperties {\n const context = useTabsContext()\n const descendants = useTabsDescendantsContext()\n\n const { selectedIndex, orientation } = context\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n // Get the clientRect of the selected tab\n const [rect, setRect] = React.useState(() => {\n if (isHorizontal) return { left: 0, width: 0 }\n if (isVertical) return { top: 0, height: 0 }\n return undefined\n })\n\n const [hasMeasured, setHasMeasured] = React.useState(false)\n\n // Update the selected tab rect when the selectedIndex changes\n useSafeLayoutEffect(() => {\n if (isUndefined(selectedIndex)) return undefined\n\n const tab = descendants.item(selectedIndex)\n if (isUndefined(tab)) return undefined\n\n // Horizontal Tab: Calculate width and left distance\n if (isHorizontal) {\n setRect({ left: tab.node.offsetLeft, width: tab.node.offsetWidth })\n }\n\n // Vertical Tab: Calculate height and top distance\n if (isVertical) {\n setRect({ top: tab.node.offsetTop, height: tab.node.offsetHeight })\n }\n\n // Prevent unwanted transition from 0 to measured rect\n // by setting the measured state in the next tick\n const id = requestAnimationFrame(() => {\n setHasMeasured(true)\n })\n\n return () => {\n if (id) {\n cancelAnimationFrame(id)\n }\n }\n }, [selectedIndex, isHorizontal, isVertical, descendants])\n\n return {\n position: \"absolute\",\n transitionProperty: \"left, right, top, bottom\",\n transitionDuration: hasMeasured ? \"200ms\" : \"0ms\",\n transitionTimingFunction: \"cubic-bezier(0, 0, 0.2, 1)\",\n ...rect,\n }\n}\n\nfunction makeTabId(id: string, index: number) {\n return `${id}--tab-${index}`\n}\n\nfunction makeTabPanelId(id: string, index: number) {\n return `${id}--tabpanel-${index}`\n}\n","import {\n chakra,\n forwardRef,\n omitThemingProps,\n StylesProvider,\n SystemStyleObject,\n ThemingProps,\n useMultiStyleConfig,\n useStyles,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport {\n TabsDescendantsProvider,\n TabsProvider,\n useTab,\n useTabIndicator,\n useTabList,\n UseTabListProps,\n UseTabOptions,\n useTabPanel,\n useTabPanels,\n useTabs,\n UseTabsProps,\n} from \"./use-tabs\"\n\ninterface TabsOptions {\n /**\n * If `true`, tabs will stretch to width of the tablist.\n */\n isFitted?: boolean\n /**\n * The alignment of the tabs\n */\n align?: \"start\" | \"end\" | \"center\"\n}\n\nexport interface TabsProps\n extends UseTabsProps,\n ThemingProps<\"Tabs\">,\n Omit<HTMLChakraProps<\"div\">, \"onChange\">,\n TabsOptions {\n children: React.ReactNode\n}\n\n/**\n * Tabs\n *\n * Provides context and logic for all tabs components.\n */\nexport const Tabs = forwardRef<TabsProps, \"div\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Tabs\", props)\n const { children, className, ...rest } = omitThemingProps(props)\n\n const { htmlProps, descendants, ...ctx } = useTabs(rest)\n const context = React.useMemo(() => ctx, [ctx])\n\n const rootProps = omit(htmlProps as any, [\"isFitted\"])\n\n return (\n <TabsDescendantsProvider value={descendants}>\n <TabsProvider value={context}>\n <StylesProvider value={styles}>\n <chakra.div\n className={cx(\"chakra-tabs\", className)}\n ref={ref}\n {...rootProps}\n __css={styles.root}\n >\n {children}\n </chakra.div>\n </StylesProvider>\n </TabsProvider>\n </TabsDescendantsProvider>\n )\n})\n\nif (__DEV__) {\n Tabs.displayName = \"Tabs\"\n}\n\nexport interface TabProps extends UseTabOptions, HTMLChakraProps<\"button\"> {}\n\n/**\n * Tab button used to activate a specific tab panel. It renders a `button`,\n * and is responsible for automatic and manual selection modes.\n */\nexport const Tab = forwardRef<TabProps, \"button\">((props, ref) => {\n const styles = useStyles()\n const tabProps = useTab({ ...props, ref })\n\n const tabStyles: SystemStyleObject = {\n outline: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...styles.tab,\n }\n\n return (\n <chakra.button\n {...tabProps}\n className={cx(\"chakra-tabs__tab\", props.className)}\n __css={tabStyles}\n />\n )\n})\n\nif (__DEV__) {\n Tab.displayName = \"Tab\"\n}\n\nexport interface TabListProps\n extends UseTabListProps,\n Omit<HTMLChakraProps<\"div\">, \"onKeyDown\" | \"ref\"> {}\n\n/**\n * TabList is used to manage a list of tab buttons. It renders a `div` by default,\n * and is responsible the keyboard interaction between tabs.\n */\nexport const TabList = forwardRef<TabListProps, \"div\">((props, ref) => {\n const tablistProps = useTabList({ ...props, ref })\n\n const styles = useStyles()\n\n const tablistStyles: SystemStyleObject = {\n display: \"flex\",\n ...styles.tablist,\n }\n\n return (\n <chakra.div\n {...tablistProps}\n className={cx(\"chakra-tabs__tablist\", props.className)}\n __css={tablistStyles}\n />\n )\n})\n\nif (__DEV__) {\n TabList.displayName = \"TabList\"\n}\n\nexport interface TabPanelProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n * Used to render the content for a specific tab.\n */\nexport const TabPanel = forwardRef<TabPanelProps, \"div\">((props, ref) => {\n const panelProps = useTabPanel({ ...props, ref })\n const styles = useStyles()\n\n return (\n <chakra.div\n outline=\"0\"\n {...panelProps}\n className={cx(\"chakra-tabs__tab-panel\", props.className)}\n __css={styles.tabpanel}\n />\n )\n})\n\nif (__DEV__) {\n TabPanel.displayName = \"TabPanel\"\n}\n\nexport interface TabPanelsProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n *\n * Used to manage the rendering of multiple tab panels. It uses\n * `cloneElement` to hide/show tab panels.\n *\n * It renders a `div` by default.\n */\nexport const TabPanels = forwardRef<TabPanelsProps, \"div\">((props, ref) => {\n const panelsProps = useTabPanels(props)\n const styles = useStyles()\n\n return (\n <chakra.div\n {...panelsProps}\n width=\"100%\"\n ref={ref}\n className={cx(\"chakra-tabs__tab-panels\", props.className)}\n __css={styles.tabpanels}\n />\n )\n})\n\nif (__DEV__) {\n TabPanels.displayName = \"TabPanels\"\n}\n\nexport interface TabIndicatorProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabIndicator\n *\n * Used to render an active tab indicator that animates between\n * selected tabs.\n */\nexport const TabIndicator = forwardRef<TabIndicatorProps, \"div\">(\n (props, ref) => {\n const indicatorStyle = useTabIndicator()\n const style = {\n ...props.style,\n ...indicatorStyle,\n }\n\n const styles = useStyles()\n\n return (\n <chakra.div\n ref={ref}\n {...props}\n className={cx(\"chakra-tabs__tab-indicator\", props.className)}\n style={style}\n __css={styles.indicator}\n />\n )\n },\n)\n\nif (__DEV__) {\n TabIndicator.displayName = \"TabIndicator\"\n}\n","export const SECTION_PADDING = {\n X: [4, 8, 12, 16, 20],\n Y: [4, 6, 8],\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCard } from \"../../components/PackageCard\";\n\nexport const PackageGrid: FunctionComponent<{ packages: CatalogPackage[] }> = ({\n packages,\n}) => {\n return (\n <Grid gap={4} mt={8} templateColumns={{ base: \"1fr\", lg: \"1fr 1fr\" }}>\n {packages.map((pkg) => (\n <PackageCard key={pkg.name} pkg={pkg} />\n ))}\n </Grid>\n );\n};\n","import {\n Button,\n Flex,\n forwardRef,\n Heading,\n Tab,\n TabList,\n TabPanelProps,\n TabPanel,\n TabPanels,\n Tabs,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { getSearchPath } from \"../../util/url\";\nimport { SECTION_PADDING } from \"./constants\";\nimport { PackageGrid } from \"./PackageGrid\";\n\ninterface PackageTabProps {\n cdkType?: CDKType;\n data: ReturnType<typeof useCatalogResults>;\n}\n\nconst PackageTab: FunctionComponent<PackageTabProps> = ({ cdkType, data }) => {\n return (\n <Tab isDisabled={data.page.length < 1}>\n {cdkType ? CDKTYPE_RENDER_MAP[cdkType].name : \"All CDKs\"} (\n {data.results.length})\n </Tab>\n );\n};\n\nconst PackageTabPanel = forwardRef<PackageTabProps & TabPanelProps, \"div\">(\n ({ cdkType, data, ...props }, ref) => {\n const { push } = useHistory();\n\n const onSeeAllClick = () => {\n window.scrollTo(0, 0);\n push(getSearchPath({ cdkType, sort: CatalogSearchSort.DownloadsDesc }));\n };\n\n return (\n <TabPanel ref={ref} {...props} p={0}>\n <PackageGrid packages={data.page} />\n\n <Flex justify=\"center\" w=\"full\">\n <Button colorScheme=\"blue\" my={8} onClick={onSeeAllClick}>\n See all {cdkType ? CDKTYPE_RENDER_MAP[cdkType].name + \" \" : \"\"}\n constructs\n </Button>\n </Flex>\n </TabPanel>\n );\n }\n);\n\nexport const CDKTypeTabs: FunctionComponent = () => {\n const anyCDKType = useCatalogResults({ limit: 4 });\n const awscdk = useCatalogResults({\n cdkType: CDKType.awscdk,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n const cdk8s = useCatalogResults({\n cdkType: CDKType.cdk8s,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n const cdktf = useCatalogResults({\n cdkType: CDKType.cdktf,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n\n return (\n <Flex\n bg=\"white\"\n color=\"blue.800\"\n direction=\"column\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n >\n <Heading\n as=\"h3\"\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n mb={3}\n >\n Find open-source community constructs and official libraries in one\n location\n </Heading>\n <Text lineHeight=\"md\" maxW=\"60ch\" mb={5}>\n Use Construct Hub to find CDKs’ libraries owned by the open source\n community and companies and organizations like Terraform, CNCF, AWS and\n more.\n </Text>\n <Tabs isFitted variant=\"line\">\n <TabList>\n <PackageTab data={anyCDKType} />\n\n <PackageTab cdkType={CDKType.awscdk} data={awscdk} />\n\n <PackageTab cdkType={CDKType.cdk8s} data={cdk8s} />\n\n <PackageTab cdkType={CDKType.cdktf} data={cdktf} />\n </TabList>\n <TabPanels minH=\"28.5rem\">\n <PackageTabPanel data={anyCDKType} />\n\n <PackageTabPanel cdkType={CDKType.awscdk} data={awscdk} />\n\n <PackageTabPanel cdkType={CDKType.cdk8s} data={cdk8s} />\n\n <PackageTabPanel cdkType={CDKType.cdktf} data={cdktf} />\n </TabPanels>\n </Tabs>\n </Flex>\n );\n};\n","import { Flex, Grid, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { DEFAULT_FEATURED_PACKAGES } from \"../../api/config\";\nimport { PackageCard } from \"../../components/PackageCard\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\nimport { SECTION_PADDING } from \"./constants\";\nimport { useSection } from \"./useSection\";\n\nexport const Featured: FunctionComponent = () => {\n const homePackages = useConfigValue(\"featuredPackages\");\n const [featured = { name: \"Recently Updated\", showLastUpdated: 4 }] = (\n homePackages ?? DEFAULT_FEATURED_PACKAGES\n ).sections;\n\n const section = useSection(featured);\n\n if (!section) {\n return null;\n }\n\n return (\n <Flex direction=\"column\" px={SECTION_PADDING.X} py={SECTION_PADDING.Y}>\n <Heading\n as=\"h3\"\n color=\"white\"\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n >\n {featured.name}\n </Heading>\n <Grid gap={4} mt={8} templateColumns={{ base: \"1fr\", lg: \"1fr 1fr\" }}>\n {section?.slice(0, 4).map((pkg) => (\n <PackageCard key={pkg.name} pkg={pkg} />\n ))}\n </Grid>\n </Flex>\n );\n};\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","import { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { SORT_FUNCTIONS } from \"../../api/catalog-search/util\";\nimport { FeaturedPackagesDetail } from \"../../api/config\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\nexport const useSection = ({\n showLastUpdated,\n showPackages,\n}: {\n showLastUpdated?: number;\n showPackages?: FeaturedPackagesDetail[];\n}) => {\n const { data, loading, error } = useCatalog();\n\n return useMemo(() => {\n if (loading || error || !data?.packages) return [];\n\n if (showLastUpdated) {\n return data.packages\n .sort(\n SORT_FUNCTIONS[CatalogSearchSort.PublishDateDesc] as (\n p1: CatalogPackage,\n p2: CatalogPackage\n ) => number\n )\n .slice(0, showLastUpdated);\n } else if (showPackages) {\n return showPackages\n .map((p) => {\n const pkg = findPackage(data, p.name);\n if (pkg) {\n return {\n ...pkg,\n comment: p.comment,\n };\n }\n return undefined;\n })\n .filter((pkg) => pkg !== undefined) as CatalogPackage[];\n } else {\n return undefined;\n }\n }, [data, error, loading, showLastUpdated, showPackages]);\n};\n","export default function _taggedTemplateLiteral(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n return Object.freeze(Object.defineProperties(strings, {\n raw: {\n value: Object.freeze(raw)\n }\n }));\n}","import { Box, BoxProps, forwardRef, keyframes } from \"@chakra-ui/react\";\n\nconst gradient = \"linear-gradient(274.2deg, #143870 20.69%, #1F50A1 84.17%)\";\n\nconst animation = keyframes`\n 0% {\n background-position:0% 50%;\n }\n\n 50% {\n background-position:100% 50%;\n }\n\n 100% {\n background-position:0% 50%;\n }\n`;\n\nexport const GradientContainer = forwardRef<BoxProps, \"div\">((props, ref) => (\n <Box\n animation={`${animation} 10s linear infinite`}\n bg={gradient}\n bgSize=\"200% 200%\"\n ref={ref}\n {...props}\n />\n));\n","import { Box, Flex, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n SearchBar,\n SearchOverlay,\n SearchSuggestions,\n} from \"../../components/SearchBar\";\nimport { SECTION_PADDING } from \"./constants\";\n\nexport const Hero: FunctionComponent = () => {\n return (\n <Flex\n align=\"center\"\n color=\"white\"\n direction=\"column\"\n h=\"20rem\"\n justify=\"center\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n textAlign=\"center\"\n zIndex=\"1\"\n >\n <Heading as=\"h1\" size=\"xl\">\n Build cloud infrastructure with reusable components\n </Heading>\n <Heading as=\"h2\" fontWeight=\"normal\" mt={4} size=\"md\">\n Open source registry for AWS CDK, CDKtf and CDK8s\n </Heading>\n <Box color=\"initial\" maxW=\"36rem\" mt={8} mx=\"auto\" w=\"full\">\n <SearchBar hasButton>\n <SearchOverlay />\n <SearchSuggestions />\n </SearchBar>\n </Box>\n </Flex>\n );\n};\n","import { Grid, Heading, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactNode } from \"react\";\nimport { SECTION_PADDING } from \"./constants\";\n\nexport interface InfoSectionProps {\n title: string;\n description: ReactNode;\n}\n\nexport const InfoSection: FunctionComponent<InfoSectionProps> = ({\n title,\n description,\n children,\n}) => (\n <Grid\n color=\"blue.800\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n templateColumns=\"1fr\"\n templateRows=\"minmax(4.5rem, min-content) 1fr auto\"\n >\n <Heading\n as=\"h3\"\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n mb={4}\n >\n {title}\n </Heading>\n <Text fontSize=\"lg\" mb={4}>\n {description}\n </Text>\n {children}\n </Grid>\n);\n","import { Divider, Flex, Grid, Image, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { NavLink } from \"../../components/NavLink\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport {\n Language,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { InfoSection } from \"./InfoSection\";\n\nexport const Info: FunctionComponent = () => (\n <Grid\n bg=\"white\"\n templateColumns={{ base: \"1fr\", lg: \"1fr auto 1fr\" }}\n templateRows={{ base: \"1fr auto 1fr\", lg: \"1fr\" }}\n textAlign=\"left\"\n >\n <InfoSection\n description=\"The Construct Hub is a central destination for discovering and sharing\n cloud application design patterns and reference architectures defined\n for the AWS CDK, CDK for Kubernetes (CDK8s), CDK for Terraform (CDKtf)\n and other construct-based tools.\"\n title=\"Browse 600+ reusable cloud application libraries for popular IaC frameworks\"\n >\n <Flex align=\"center\" justify=\"space-evenly\" pt={4} wrap=\"wrap\">\n {Object.entries(CDKTYPE_RENDER_MAP).map(\n ([cdktype, { name, imgsrc }]) => (\n <NavLink\n key={cdktype}\n to={getSearchPath({ cdkType: cdktype as CDKType })}\n >\n <Stack align=\"center\" color=\"blue.500\" spacing={2}>\n <Image aria-label={name} h={8} src={imgsrc} />\n <span>{name}</span>\n </Stack>\n </NavLink>\n )\n )}\n </Flex>\n </InfoSection>\n\n <Divider\n display={{ base: \"none\", lg: \"initial\" }}\n h=\"auto\"\n my={10}\n orientation=\"vertical\"\n />\n <Divider display={{ lg: \"none\" }} mx={10} w=\"auto\" />\n\n <InfoSection\n description=\"Create cloud applications faster with reusable infrastructure building\n blocks in your favorite programming language. Develop faster by\n getting helpful API reference + code samples which are automatically\n generated for Typescript, Python, .NET or Java (Go coming soon)!\"\n title=\"Build using familiar programming languages. Code samples and API reference included.\"\n >\n <Flex align=\"center\" justify=\"space-evenly\" pt={4} wrap=\"wrap\">\n {Object.entries(LANGUAGE_RENDER_MAP)\n .filter(([language]) =>\n TEMP_SUPPORTED_LANGUAGES.has(language as Language)\n )\n .map(([language, { icon: Icon, name }]) => (\n <NavLink\n key={language}\n to={getSearchPath({ languages: [language as Language] })}\n >\n <Stack align=\"center\" color=\"blue.500\" key={language} spacing={2}>\n <Icon aria-label={name} h={8} w={8} />\n <span>{name}</span>\n </Stack>\n </NavLink>\n ))}\n </Flex>\n </InfoSection>\n </Grid>\n);\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"homeRedesign\", [\"page\"] as const);\n","import { Flex } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { CDKTypeTabs } from \"./CDKTypeTabs\";\nimport { Featured } from \"./Featured\";\nimport { GradientContainer } from \"./GradientContainer\";\nimport { Hero } from \"./Hero\";\nimport { Info } from \"./Info\";\nimport testIds from \"./testIds\";\n\nexport const HomeRedesign: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Construct Hub\",\n description:\n \"Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTf and other construct-based tools.\",\n suffix: false,\n }}\n pageName=\"home\"\n >\n <GradientContainer\n as={Flex}\n data-testid={testIds.page}\n direction=\"column\"\n >\n <Hero />\n\n <Info />\n\n <Featured />\n\n <CDKTypeTabs />\n </GradientContainer>\n </Page>\n );\n};\n"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ (this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[9],{236:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),c=n(251),r={home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},i=n(119),o=n(1),s=function(e){var t=e.children,n=e.meta,s=e.pageName,l=Object(i.b)(r[s]);Object(a.useEffect)((function(){l()}),[l]);var u=n.suffix,j=void 0===u||u,d=n.title,b=n.description,f=j?"".concat(d," - Construct Hub"):d;return Object(o.jsxs)(o.Fragment,{children:[Object(o.jsxs)(c.a,{children:[!1,Object(o.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),Object(o.jsx)("meta",{charSet:"utf-8"}),Object(o.jsx)("title",{children:f}),Object(o.jsx)("meta",{content:f,property:"og:title"}),Object(o.jsx)("meta",{content:f,name:"twitter:title"}),Object(o.jsx)("meta",{content:"summary",name:"twitter:card"}),Object(o.jsx)("meta",{content:b,name:"description"}),Object(o.jsx)("meta",{content:b,property:"og:description"}),Object(o.jsx)("meta",{content:b,name:"twitter:description"})]}),t]})}},241:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(0),c=n(21),r=function(){var e=Object(c.h)().search;return Object(a.useMemo)((function(){return new URLSearchParams(e)}),[e])}},242:function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var a=n(5),c=n(0),r=n(21),i=n(109),o=n(14),s=n(241),l=i.d.TypeScript,u="preferred-language",j=function(e){return null!=e&&i.e.has(e)},d=function(e){if(j(e))return e;try{var t,n=null!==(t=localStorage.getItem(u))&&void 0!==t?t:"";if(j(n))return n}catch(a){}return l},b=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.updateUrl,n=e.updateSaved,i=Object(r.h)(),l=i.pathname,b=i.hash,f=Object(r.g)(),O=f.replace,m=Object(s.a)(),h=m.get(o.b.LANGUAGE),g=Object(c.useState)((function(){return d(h)})),v=Object(a.a)(g,2),x=v[0],p=v[1];Object(c.useEffect)((function(){j(h)&&h!==x&&p(h)}),[h]),Object(c.useEffect)((function(){h!==x&&t&&(m.set(o.b.LANGUAGE,x),O({pathname:l,hash:b,search:m.toString()}))}),[x,t]);var y=Object(c.useCallback)((function(e){if(p(e),n)try{localStorage.setItem(u,e)}catch(t){}}),[n]);return Object(c.useMemo)((function(){return[x,y]}),[x,y])}},252:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var a=new Set(["aws-cdk","aws","awscdk","cdk-construct","cdk","construct","constructs"])},256:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(225),c=n(109),r=n(1),i=function(e){var t=e.children,n=e.language,i=c.e.has(n),o=c.b[n],s=i?"Click to view documentation in ".concat(o):"Documentation support for ".concat(o," is coming soon!");return Object(r.jsx)(a.a,{hasArrow:!0,label:s,placement:"top-start",children:Object(r.jsx)("span",{children:t})})}},257:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(6),c=n(28),r=n(593),i=n(85),o=n(86),s=n(1),l=["children","language","value","label","zIndex"],u=function(e){var t=e.children,n=e.language,u=e.value,j=e.label,d=void 0===j?u:j,b=e.zIndex,f=Object(c.a)(e,l);return Object(s.jsx)(o.a,{"aria-label":"Tag: ".concat(d),to:Object(i.c)({query:"".concat(u),language:n}),zIndex:b,children:Object(s.jsx)(r.a,Object(a.a)(Object(a.a)({_hover:{textDecoration:"underline"}},f),{},{children:Object(s.jsx)(r.b,{children:t})}))})}},258:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(6),c=n(28),r=n(17),i=n(194),o=n(606),s=n(1),l=["date","format"],u=Object(r.a)((function(e,t){var n=e.date,r=e.format,u=Object(c.a)(e,l);return Object(s.jsx)(i.a,Object(a.a)(Object(a.a)({as:"time",dateTime:n.toISOString(),ref:t},u),{},{children:Object(o.a)(n,r)}))}));u.displayName="Time"},270:function(e,t,n){"use strict";var a;n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return Z})),function(e){e.Wide="wide"}(a||(a={}));var c=n(0),r=n(307),i=n(147),o=n(231),s=n(209),l=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.map((function(e){return'"'.concat(e.join(" "),'"')})).join(" ")},u=n(5),j=n(364),d=n(198),b=n(90),f=n(242),O=n(85),m=n(86),h=n(258),g=n(57),v=Object(g.a)("packageCard",["author","description","downloads","languages","published","title","version","comment","wideContainer"]),x=n(1),p=function(e){var t=e["data-testid"],n=e.icon,a=e.label,c=e.value;return Object(x.jsxs)(d.a,{"data-testid":t,fontSize:"xs",children:[n,n?" ":"",Object(x.jsx)("strong",{children:a})," ",c]})},y=function(){var e,t,n,a=Object(f.a)(),c=Object(u.a)(a,1)[0],r=Y(),i=r.author,o=r.metadata.date,s=r.version,l=r.name,d=Object(b.b)().data,g=null===d||void 0===d||null===(e=d.packages)||void 0===e||null===(t=e[l])||void 0===t||null===(n=t.downloads)||void 0===n?void 0:n.npm,y="string"===typeof i?i:i.name;return Object(x.jsxs)(x.Fragment,{children:[void 0!==g&&g>=10?Object(x.jsx)(p,{"data-testid":v.downloads,icon:Object(x.jsx)(j.a,{}),label:g.toLocaleString(),value:"Downloads"}):Object(x.jsx)(p,{"data-testid":v.version,label:"Version",value:s}),Object(x.jsx)(p,{"data-testid":v.published,label:"Published",value:Object(x.jsx)(h.a,{date:new Date(o),fontSize:"xs",format:"MMM dd, yyyy"})}),Object(x.jsx)(p,{"data-testid":v.author,label:"Author",value:Object(x.jsx)(m.a,{color:"blue.500",to:Object(O.c)({query:y,language:c}),children:y})})]})},w=n(207),S=n(225),C=n(230),k=n(218),A=n(33),P=n(66),D=function(){var e=Object(f.a)(),t=Object(u.a)(e,1)[0],n=Y(),a=n.comment,c=n.description,i=n.metadata.constructFramework,o=n.name,s=n.version,l=null===i||void 0===i?void 0:i.name,j=null===i||void 0===i?void 0:i.majorVersion;return Object(x.jsxs)(x.Fragment,{children:[Object(x.jsx)(r.b,{as:A.b,to:Object(O.a)({name:o,version:s,language:t}),children:Object(x.jsxs)(w.a,{align:"center",children:[l&&Object(x.jsx)(S.a,{hasArrow:!0,label:P.b[l].name+(void 0!==j?" v".concat(j):""),placement:"top",children:Object(x.jsx)(C.a,{alt:"".concat(P.b[l].name," icon"),h:5,mr:2,src:P.b[l].imgsrc,w:5,zIndex:1})}),Object(x.jsx)(k.a,{as:"h3",color:"blue.800","data-testid":v.title,fontSize:"md",fontWeight:"bold",wordBreak:"break-all",children:o})]})}),Object(x.jsx)(d.a,{color:"blue.800","data-testid":v.description,fontSize:"md",lineHeight:"tall",noOfLines:4,children:c||"No description available."}),a&&Object(x.jsxs)(d.a,{"data-testid":v.comment,fontSize:"md",lineHeight:"tall",noOfLines:4,children:[Object(x.jsxs)(d.a,{as:"span",color:"blue.500",fontSize:"md",fontWeight:"bold",lineHeight:"tall",children:["Editor's note:"," "]}),a]})]})},T={official:{imgsrc:"/assets/construct.png",label:"Official",color:"#ED3B00"},community:{imgsrc:"/assets/community.png",label:"Community",color:"#2F50FE"},highQuality:{imgsrc:"/assets/medal.png",label:"High Quality",color:"#1F02D4"}},I=function(){var e=Y().name,t=P.d.some((function(t){return e.includes(t)})),n=T[t?"official":"community"],a=n.imgsrc,c=n.color,r=n.label;return Object(x.jsxs)(o.a,{align:"center",direction:"row",spacing:2,children:[Object(x.jsx)(C.a,{alt:"".concat(r," icon"),src:a,w:4}),Object(x.jsx)(d.a,{color:c,fontWeight:"bold",children:r})]})},L=n(6),R=n(109),z=n(256),F={sm:5,md:6,lg:8},E=function(e){var t=e.isRounded,n=void 0!==t&&t,a=e.languages,c=e.name,r=e.size,i=void 0===r?"md":r,o=e.version,s=Object.keys(null!==a&&void 0!==a?a:{});return Object(x.jsx)(x.Fragment,{children:Object.entries(R.c).sort((function(e,t){var n=Object(u.a)(e,1)[0],a=Object(u.a)(t,1)[0];return R.a.indexOf(n)-R.a.indexOf(a)})).map((function(e){var t=Object(u.a)(e,2),a=t[0],r=t[1],l=a,j=l===R.d.TypeScript||s.includes(l),d=l===R.d.TypeScript||R.e.has(l);if(!j)return null;var b=r.name,f=r.icon,m=Object(x.jsx)(f,{"aria-label":"Supports ".concat(b),borderRadius:n?"50%":0,h:F[i],opacity:d?1:.2,w:F[i]});return Object(x.jsx)(z.a,{language:l,children:d?Object(x.jsx)(A.b,{"aria-label":"View package docs for ".concat(l),to:Object(O.a)({name:c,version:o,language:l}),children:m}):m},l)}))})},W=function(){var e=Y();return Object(x.jsx)(E,Object(L.a)(Object(L.a)({},e),{},{size:"sm"}))},M=n(18),U=n(252),H=n(257),N=function(){var e=Y(),t=e.keywords,n=e.name;return Object(x.jsx)(x.Fragment,{children:[P.d.some((function(e){return n.includes(e)}))?Object(x.jsx)(H.a,{label:"official",mr:1,value:"@aws-cdk",variant:"official",children:"Official"},"official"):null].concat(Object(M.a)((null!==t&&void 0!==t?t:[]).filter((function(e){return Boolean(e)&&!U.a.has(e)})).slice(0,3).map((function(e){return Object(x.jsx)(H.a,{mr:1,value:'"'.concat(e,'"'),zIndex:"0 !important",children:e},e)}))))})},V="details",q="languages",K="tags",Q="heading",G=l([Q,Q,V],[Q,Q,V],[K,K,q]),_=l([Q],[q],[V]),B=function(){return Object(x.jsx)(r.a,{_hover:{"> article":{bg:"gray.50"}},children:Object(x.jsxs)(i.a,{as:"article",autoColumns:"1fr",autoRows:"auto",bg:"white",border:"base",borderRadius:"sm",boxShadow:"base",color:"gray.600","data-testid":v.wideContainer,gap:5,h:"100%",p:5,templateAreas:{base:_,md:G},w:"100%",children:[Object(x.jsx)(o.a,{gridArea:Q,spacing:2,children:Object(x.jsx)(D,{})}),Object(x.jsx)(o.a,{direction:"row",display:{base:"none",md:"initial"},gridArea:K,maxH:6,overflow:"hidden",children:Object(x.jsx)(N,{})}),Object(x.jsxs)(i.a,{alignItems:"start",alignSelf:"center",autoColumns:{base:"initial",md:"1fr"},autoRows:{base:"initial",md:"auto"},fontSize:"xs",gap:{base:0,md:1},gridArea:V,templateColumns:{base:"1fr 1fr",md:"initial"},templateRows:{base:"1fr 1fr",md:"initial"},children:[Object(x.jsx)(I,{}),Object(x.jsx)(y,{})]}),Object(x.jsxs)(o.a,{gridArea:q,spacing:{base:4,md:0},children:[Object(x.jsx)(s.a,{display:{md:"none"}}),Object(x.jsx)(o.a,{"data-testid":v.languages,direction:"row",spacing:2,children:Object(x.jsx)(W,{})})]})]})})},J=Object(c.createContext)(null),Y=function(){return Object(c.useContext)(J)},Z=function(e){var t=e.pkg,n=e.variant,c=void 0===n?a.Wide:n;return Object(x.jsx)(J.Provider,{value:t,children:c===a.Wide&&Object(x.jsx)(B,{})})}},304:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var a=n(6),c=n(205),r=n(33),i=n(1),o=function(e){var t=e.icon,n=e.offset,o=e.getPageUrl,s={"aria-label":"Page ".concat(n," link"),borderRadius:"md",borderColor:"blue.500",colorScheme:"blue",icon:Object(i.jsx)(t,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return void 0!==n?Object(i.jsx)(c.a,Object(a.a)(Object(a.a)({},s),{},{as:r.b,to:o({offset:n})})):Object(i.jsx)(c.a,Object(a.a)(Object(a.a)({},s),{},{disabled:!0}))}},305:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(5),c=n(207),r=n(229),i=n(198),o=n(0),s=n(21),l=n(1),u=function(e){var t=e.pageLimit,n=e.offset,u=e.getPageUrl,j=Object(o.useState)((n+1).toString()),d=Object(a.a)(j,2),b=d[0],f=d[1],O=Object(s.g)().push;Object(o.useEffect)((function(){f((n+1).toString())}),[n]);return Object(l.jsxs)(c.a,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),O(u({offset:parseInt(b)-1}))},children:[Object(l.jsx)(r.a,{colorScheme:"blue",h:10,max:t+1,min:1,name:"page",onChange:function(e){e.preventDefault(),f(e.target.value)},p:0,textAlign:"center",type:"number",value:b,w:10}),Object(l.jsxs)(i.a,{ml:2,w:"max-content",children:["of ",t+1]})]})}},306:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var a=25},607:function(e,t,n){"use strict";n.r(t),n.d(t,"SearchRedesign",(function(){return xe})),n.d(t,"default",(function(){return xe}));var a=n(147),c=n(236),r=n(231),i=n(218),o=n(87),s=n(18),l=n(5),u=n(0),j=n(222),d=n(198),b=n(602),f=n(207),O=n(587),m=n(205),h=n(1),g=function(e){var t=e.name,n=e.hint;return Object(h.jsxs)(f.a,{align:"center",children:[Object(h.jsx)(i.a,{as:"h4",size:"sm",w:"max-content",children:t}),n?Object(h.jsxs)(O.a,{colorScheme:"dark",placement:"top-end",strategy:"fixed",children:[Object(h.jsx)(O.g,{children:Object(h.jsx)(m.a,{"aria-label":"Hint: ".concat(t),icon:Object(h.jsx)(b.a,{h:4,w:4}),ml:2,px:0,py:0,size:"sm",variant:"ghost"})}),Object(h.jsxs)(O.e,{bg:"gray.700",color:"white",fontSize:"sm",shadow:"whiteAlpha.300",children:[Object(h.jsxs)(O.f,{children:["Hint: ",t]}),Object(h.jsx)(O.d,{}),Object(h.jsx)(O.b,{}),Object(h.jsx)(O.c,{children:Object(h.jsx)(d.a,{children:n})})]})]}):null]})},v=function(e){var t=e.hint,n=e.name,a=e.options,c=e.values,i=e.onValueChange,o=function(e){return function(){i(e)}};return Object(h.jsxs)(r.a,{spacing:2,children:[Object(h.jsx)(g,{hint:t,name:n}),a.map((function(e){var t=e.display,n=e.value;return Object(h.jsx)(j.a,{isChecked:c.includes(n),onChange:o(n),children:Object(h.jsx)(d.a,{color:"gray.600",fontSize:"sm",isTruncated:!0,children:t})},n)}))]})},x=function(){var e=Object(u.useState)([]),t=Object(l.a)(e,2),n=t[0],a=t[1];return Object(h.jsx)(v,{name:"Author",onValueChange:function(e){a(n.includes(e)?n.filter((function(t){return t!==e})):[].concat(Object(s.a)(n),[e]))},options:[{display:"Community",value:"community"},{display:"AWS",value:"aws"}],values:n})},p=n(4),y=n(6),w=n(66),S=n(94),C=n(361),k=n(614),A=function(e){var t=e.value,n=e.onValueChange,a=e.options,c=e.name,i=e.hint;return Object(h.jsxs)(r.a,{spacing:2,children:[Object(h.jsx)(g,{hint:i,name:c}),Object(h.jsx)(C.a,{onChange:n,value:t,children:Object(h.jsx)(r.a,{children:a.map((function(e){var t=e.display,n=e.value;return Object(h.jsx)(k.a,{value:n,children:Object(h.jsx)(d.a,{color:"gray.600",fontSize:"sm",isTruncated:!0,children:t})},n)}))})})]})},P=n(14),D=n(88),T=n(241),I=n(306),L=function(e){var t=parseInt(e);return"NaN"==="".concat(t)?0:t},R=Object(u.createContext)(void 0),z=function(){var e=Object(u.useContext)(R);if(!e)throw new Error("This hook must be called in a child of <SearchStateProvider />");return e},F=function(e){var t,n,a,c,r,i=e.children,o=Object(T.a)(),s=L(null!==(t=o.get(P.b.OFFSET))&&void 0!==t?t:"0"),l=decodeURIComponent(null!==(n=o.get(P.b.SEARCH_QUERY))&&void 0!==n?n:""),j=(r=o.get(P.b.LANGUAGES))?decodeURIComponent(r).split(","):[],d=null!==(a=o.get(P.b.SORT))&&void 0!==a?a:void 0,b=null!==(c=o.get(P.b.CDK_TYPE))&&void 0!==c?c:void 0,f=o.get(P.b.CDK_MAJOR),O=f?L(f):void 0,m=Object(D.a)({defaultCdkMajor:O,defaultCdkType:b,defaultLanguages:j,defaultQuery:l,defaultSort:d});return Object(u.useEffect)((function(){l!==m.query&&m.setQuery(l)}),[l]),Object(h.jsx)(R.Provider,{value:{limit:I.a,offset:s,query:l,searchAPI:m},children:i})},E=function(){var e,t=z().searchAPI,n=t.cdkType,a=t.setCdkType,c=t.cdkMajor,r=t.setCdkMajor,i=Object(S.b)(),o=Object(u.useMemo)((function(){var e=i.constructFrameworks,t=Object.entries(e).reduce((function(e,t){var n=Object(l.a)(t,2),a=n[0],c=n[1];return c.pkgCount<1?e:Object(y.a)(Object(y.a)({},e),{},Object(p.a)({},a,Object(y.a)({display:w.a[a],value:a},c)))}),{});return Object.keys(t).length?t:void 0}),[i]),j=Object(u.useMemo)((function(){var e;if(o&&n){var t=null===(e=o[n])||void 0===e?void 0:e.majorVersions;if(t)return Object(s.a)(t).sort((function(e,t){return e-t})).map((function(e){return{value:e.toString(),display:"".concat(w.a[n]," v").concat(e)}}))}}),[o,n]);if(!o)return null;return Object(h.jsxs)(h.Fragment,{children:[Object(h.jsx)(A,{hint:"Constructs support distinct output types: AWS CDK libraries output Cloudformation Templates, CDK8s libraries output Kubernetes manifests, and CDKtf libraries output Terraform Configuration. The Construct Hub attempts to detect the output type of each library, but results are not guaranteed to be completely accurate.",name:"CDK Type",onValueChange:function(e){var t=e;r(void 0),a(e?t:void 0)},options:[{display:"Any CDK Type",value:""}].concat(Object(s.a)(Object.values(o))),value:null!==n&&void 0!==n?n:""}),!!(j&&j.length>1)&&Object(h.jsx)(A,{hint:"Allows you to filter by a major version of your selected CDK Type: (".concat(w.a[n],")"),name:"CDK Major Version",onValueChange:function(e){if(e){var t=parseInt(e,10);r(t)}else r(void 0)},options:[{display:"Any Major Version",value:""}].concat(Object(s.a)(j)),value:null!==(e=null===c||void 0===c?void 0:c.toString())&&void 0!==e?e:""})]})},W=n(109),M=Object.entries(W.b).filter((function(e){var t=Object(l.a)(e,1)[0];return W.e.has(t)})).map((function(e){var t=Object(l.a)(e,2),n=t[0];return{display:t[1],value:n}})),U=function(){var e=z().searchAPI,t=e.languages,n=e.setLanguages;return Object(h.jsx)(v,{hint:"Select one or more programming languages to filter by. Results will match at least one of the selected languages. If no languages are selected, results will not be filtered by langauges.",name:"Programming Language",onValueChange:function(e){var a=e;n(t.includes(a)?t.filter((function(e){return e!==a})):[].concat(Object(s.a)(t),[a]))},options:M,values:t})},H="5.75rem",N=function(){return Object(h.jsx)(o.a,{borderRadius:"none",boxShadow:"none",display:{base:"none",md:"flex"},maxH:"calc(100vh - ".concat(H," - 1.25rem)"),maxW:"23rem",minW:"100%",overflow:"hidden auto",p:4,pos:"sticky",top:H,zIndex:"docked",children:Object(h.jsxs)(r.a,{color:"blue.800",h:"max-content",spacing:6,top:4,children:[Object(h.jsx)(i.a,{as:"h3",size:"sm",children:"Filters"}),Object(h.jsx)(E,{}),Object(h.jsx)(U,{}),Object(h.jsx)(x,{})]})})},V=n(194),q=n(21),K=n(216),Q=n(199),G=n(270),_=Object(p.a)({},G.b.Wide,(function(e){var t=e.items;return Object(h.jsx)(r.a,{spacing:4,children:t.map((function(e){return Object(h.jsx)(G.a,{pkg:e,variant:G.b.Wide},"".concat(e.name,"-").concat(e.version))}))})})),B=Object(u.memo)((function(e){var t=e.cardView,n=void 0===t?G.b.Wide:t,a=e.items;if(e.loading||!a)return Object(h.jsx)(K.a,{children:Object(h.jsx)(Q.a,{size:"xl"})});var c=_[n];return Object(h.jsx)(c,{items:a})}));B.displayName="PackageList";var J,Y=n(70),Z=n(121),X=n(85),$=n(363),ee=n(308),te=n(304),ne=n(305),ae=function(e){var t=e.offset,n=e.getPageUrl,a=e.pageLimit,c=t<a?t+1:void 0,i=t>0?t-1:void 0;return Object(h.jsxs)(r.a,{align:"center",direction:"row",justify:"space-between",maxW:"18rem",mx:"auto",spacing:4,w:"full",children:[Object(h.jsx)(te.a,{getPageUrl:n,icon:$.a,offset:i}),Object(h.jsx)(ne.a,{getPageUrl:n,offset:t,pageLimit:a}),Object(h.jsx)(te.a,{getPageUrl:n,icon:ee.a,offset:c})]})},ce=function(e){var t=e.children;return Object(h.jsx)(d.a,{as:"strong",color:"gray.700",children:t})},re=function(e){var t=e.limit,n=e.offset,a=e.count,c=e.filtered,r=e.query,i=t*n,o=i+t;return Object(h.jsxs)(d.a,{children:["Displaying"," ",Object(h.jsxs)(ce,{children:[a?i+1:a," - ",o>a?a:o]})," ","of ",Object(h.jsx)(ce,{children:a})," ",c?"search results":"constructs",r&&Object(h.jsxs)(h.Fragment,{children:[" for ",Object(h.jsx)(ce,{children:r})]})]})},ie=n(212),oe=n(200),se=n(153),le=n(232),ue=n(44),je=n(51),de=(J={},Object(p.a)(J,je.a.NameAsc,"A-Z"),Object(p.a)(J,je.a.NameDesc,"Z-A"),Object(p.a)(J,je.a.PublishDateAsc,"Oldest first"),Object(p.a)(J,je.a.PublishDateDesc,"Newest first"),Object(p.a)(J,je.a.DownloadsDesc,"Most downloads"),Object(p.a)(J,je.a.DownloadsAsc,"Least downloads"),J),be=function(){var e=z().searchAPI,t=e.sort,n=e.setSort;return Object(h.jsx)(A,{hint:"Sets the order of search results",name:"Sorted By",onValueChange:function(e){n(e||void 0)},options:[{display:"Relevance",value:""}].concat(Object(s.a)(Object.entries(de).map((function(e){var t=Object(l.a)(e,2),n=t[0];return{display:t[1],value:n}})))),value:null!==t&&void 0!==t?t:""})},fe=function(){var e=Object(oe.a)();return Object(h.jsxs)(h.Fragment,{children:[Object(h.jsx)(se.a,{colorScheme:"blue",display:{md:"none"},onClick:e.onOpen,rightIcon:Object(h.jsx)(ie.a,{}),variant:"link",children:"Sorting and Filters"}),Object(h.jsxs)(le.a,Object(y.a)(Object(y.a)({},e),{},{placement:"bottom",children:[Object(h.jsx)(ue.h,{}),Object(h.jsxs)(le.b,{color:"blue.800",children:[Object(h.jsx)(ue.g,{children:"Sorting and Filters"}),Object(h.jsx)(ue.c,{}),Object(h.jsx)(ue.b,{children:Object(h.jsxs)(r.a,{color:"blue.800",pb:4,spacing:4,children:[Object(h.jsx)(be,{}),Object(h.jsx)(E,{}),Object(h.jsx)(U,{}),Object(h.jsx)(x,{})]})})]})]}))]})},Oe=n(223),me=function(){var e=z().searchAPI,t=e.sort,n=e.setSort,a=t?de[t]:"Relevance";return Object(h.jsxs)(f.a,{align:"center",children:[Object(h.jsx)(d.a,{children:"Sorted by"}),Object(h.jsxs)(Oe.a,{children:[Object(h.jsx)(Oe.b,{as:se.a,color:"blue.500",ml:2,pl:2,pr:2,py:1,rightIcon:Object(h.jsx)(ie.a,{}),variant:"link",children:a}),Object(h.jsxs)(Oe.f,{minW:"180",zIndex:"sticky",children:[Object(h.jsx)(Oe.e,{onClick:function(){return n(void 0)},children:"Relevance"},"Relevance"),Object.entries(de).map((function(e){var t=Object(l.a)(e,2),a=t[0],c=t[1];return Object(h.jsx)(Oe.e,{onClick:function(){return n(a)},children:c},a)}))]})]})]})},he=function(){var e=Object(u.useRef)(!0),t=Object(q.g)().push,n=z(),a=n.query,i=n.searchAPI,o=n.offset,s=n.limit,l=i.languages,j=i.sort,d=i.cdkType,b=i.cdkMajor,f=i.onSearch,O=Object(Z.a)({offset:o,limit:s,query:a,languages:l,cdkMajor:b,cdkType:d,sort:j}),m=O.page,g=O.pageLimit,v=O.results,x=function(e){var t,n;return Object(X.c)({cdkMajor:b,cdkType:d,query:null!==(t=e.q)&&void 0!==t?t:a,languages:l,sort:j,offset:null!==(n=e.offset)&&void 0!==n?n:o})};return Object(u.useEffect)((function(){v.length&&(o<0||o>g)&&t(x(o<0?{offset:0}:{offset:g}))}),[v,o,g]),Object(u.useEffect)((function(){e.current?e.current=!1:f({replace:!0})}),[j,l,d,b]),Object(h.jsx)(c.a,{meta:{title:a||"Search",description:a?"".concat(v.length," results for ").concat(a," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:Object(h.jsxs)(r.a,{direction:"column",maxW:"100vw",pb:4,px:4,spacing:4,children:[Object(h.jsx)(Y.a,{bg:"white",onChange:i.onQueryChange,onSubmit:i.onSubmit,value:i.query}),Object(h.jsxs)(r.a,{align:{base:"start",lg:"center"},direction:{base:"column-reverse",lg:"row"},justify:{base:"initial",lg:"space-between"},spacing:4,children:[Object(h.jsx)(re,{count:v.length,filtered:!!a,limit:s,offset:o,query:a}),Object(h.jsx)(V.a,{display:{base:"none",md:"initial"},children:Object(h.jsx)(me,{})}),Object(h.jsx)(V.a,{display:{md:"none"},children:Object(h.jsx)(fe,{})})]}),Object(h.jsx)(B,{items:m}),Object(h.jsx)(V.a,{w:"full",children:Object(h.jsx)(ae,{getPageUrl:x,offset:o,pageLimit:g})})]})})},ge=n(57),ve=Object(ge.a)("searchRedesign",["page"]),xe=function(){return Object(h.jsx)(F,{children:Object(h.jsx)(c.a,{meta:{title:"Search - Construct Hub",description:"Search Construct Libraries for AWS CDK, CDK8s, and CDKtf"},pageName:"search",children:Object(h.jsxs)(a.a,{"data-testid":ve.page,gap:4,h:"full",maxW:"100%",px:{base:0,md:6},py:6,templateColumns:{base:"1fr",md:"auto 1fr"},templateRows:"1fr",children:[Object(h.jsx)(N,{}),Object(h.jsx)(he,{})]})})})}}}]);
2
+ //# sourceMappingURL=9.e8c984d8.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","constants/keywords.ts","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/PackageCard/constants.ts","util/css.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","views/SearchResults/components/ArrowButton.tsx","views/SearchResults/components/GoToPage.tsx","views/SearchResults/constants.ts","views/SearchRedesign/FilterHeading.tsx","views/SearchRedesign/CheckboxFilter.tsx","views/SearchRedesign/AuthorFilter.tsx","views/SearchRedesign/RadioFilter.tsx","views/SearchRedesign/util.ts","views/SearchRedesign/SearchState.tsx","views/SearchRedesign/CDKFilter.tsx","views/SearchRedesign/LanguageFilter.tsx","views/SearchRedesign/FilterPanel.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/SearchRedesign/PageControls.tsx","views/SearchRedesign/SearchDetails.tsx","views/SearchRedesign/constants.ts","views/SearchRedesign/SortFilter.tsx","views/SearchRedesign/SortAndFilterDrawer.tsx","views/SearchRedesign/SortedBy.tsx","views/SearchRedesign/SearchResults.tsx","views/SearchRedesign/testIds.ts","views/SearchRedesign/SearchRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","KEYWORD_IGNORE_LIST","Set","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","label","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","PackageCardType","makeGridAreas","rows","map","row","join","testIds","createTestIds","Detail","dataTestid","icon","fontSize","Details","currentLanguage","usePackageCard","author","metadata","version","data","useStats","downloads","packages","npm","authorName","undefined","Download","toLocaleString","published","Date","color","Heading","comment","constructFramework","cdkType","cdkVersion","majorVersion","Link","getPackagePath","align","CDKTYPE_RENDER_MAP","alt","h","mr","src","imgsrc","w","fontWeight","wordBreak","lineHeight","noOfLines","HIGHLIGHT_RENDER_MAP","official","community","highQuality","Highlight","isOfficial","OFFICIAL_SCOPES","some","scope","includes","direction","spacing","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","left","right","LANGUAGES","indexOf","info","isSupportedByLibrary","isSupportedByConstructHub","Icon","borderRadius","opacity","Languages","pkg","Tags","keywords","variant","filter","v","Boolean","slice","tag","GRID_AREA","gridAreasMd","gridAreasMobile","WideCard","bg","autoColumns","autoRows","border","boxShadow","wideContainer","gap","p","templateAreas","base","gridArea","display","maxH","overflow","alignItems","alignSelf","templateColumns","templateRows","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","ArrowButton","offset","getPageUrl","props","borderColor","colorScheme","mx","disabled","GoToPage","pageLimit","inputValue","setInputValue","push","onSubmit","e","preventDefault","parseInt","max","min","onChange","target","textAlign","type","ml","LIMIT","FilterHeading","hint","strategy","Question","px","py","shadow","CheckboxFilter","checkedValues","values","onValueChange","getOnChange","isChecked","isTruncated","AuthorFilter","authors","setAuthors","a","RadioFilter","checkedValue","toNum","result","SearchStateContext","useSearchState","state","Error","SearchStateProvider","langQuery","queryParams","OFFSET","decodeURIComponent","SEARCH_QUERY","split","SORT","CDK_TYPE","cdkMajorParam","CDK_MAJOR","cdkMajor","searchAPI","useCatalogSearch","defaultCdkMajor","defaultCdkType","defaultLanguages","defaultQuery","defaultSort","setQuery","limit","CDKFilter","setCdkType","setCdkMajor","useSearchContext","cdkOptions","cdkTypes","constructFrameworks","reduce","opts","pkgCount","CDKTYPE_NAME_MAP","length","majorsOptions","majorVersions","b","cdk","major","majorNum","languageOptions","key","LanguageFilter","setLanguages","l","TOP_OFFSET","FilterPanel","Card","maxW","minW","pos","top","listViews","items","PackageList","memo","cardView","loading","View","PageControls","nextOffset","prevOffset","justify","ChevronLeftIcon","ChevronRightIcon","Em","SearchDetails","count","filtered","first","last","SORT_RENDER_MAP","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsDesc","DownloadsAsc","SortFilter","setSort","newSort","SortAndFilterDrawer","drawer","useDisclosure","onClick","onOpen","rightIcon","ChevronDown","pb","SortedBy","selected","Button","pl","pr","SearchResults","isFirstRender","useRef","onSearch","useCatalogResults","results","getUrl","q","current","SearchBar","onQueryChange","SearchRedesign"],"mappings":"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","file":"static/js/9.e8c984d8.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export const KEYWORD_IGNORE_LIST = new Set([\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"construct\",\n \"constructs\",\n]);\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","/**\n * @fileoverview CSS Related Utils\n */\n\n/**\n * Translates a series of grid row definitions into a grid area string\n * ```ts\n * const gridAreas = makeGridAreas(\n * [\"header\", \"header\", \"header\"],\n * [\"aside\", \"main\", \"main\"],\n * [\"aside\", \"footer\", \"footer\"]\n * ); // `\"header header header\" \"aside main main\" \"aside footer footer\"`\n * ```\n */\nexport const makeGridAreas = (...rows: string[][]): string => {\n return rows.map((row) => `\"${row.join(\" \")}\"`).join(\" \");\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { DownloadIcon } from \"@chakra-ui/icons\";\nimport { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../contexts/Stats\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n icon?: ReactChild;\n label: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n icon,\n label,\n value,\n}) => (\n <Text data-testid={dataTestid} fontSize=\"xs\">\n {icon}\n {icon ? \" \" : \"\"}\n <strong>{label}</strong> {value}\n </Text>\n);\n\nexport const Details: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n\n const {\n author,\n metadata: { date },\n version,\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n\n return (\n <>\n {downloads !== undefined && downloads >= 10 ? (\n <Detail\n data-testid={testIds.downloads}\n icon={<DownloadIcon />}\n label={downloads.toLocaleString()}\n value={\"Downloads\"}\n />\n ) : (\n <Detail data-testid={testIds.version} label=\"Version\" value={version} />\n )}\n <Detail\n data-testid={testIds.published}\n label=\"Published\"\n value={\n <Time date={new Date(date)} fontSize=\"xs\" format=\"MMM dd, yyyy\" />\n }\n />\n <Detail\n data-testid={testIds.author}\n label=\"Author\"\n value={\n <NavLink\n color=\"blue.500\"\n to={getSearchPath({\n query: authorName,\n language: currentLanguage,\n })}\n >\n {authorName}\n </NavLink>\n }\n />\n </>\n );\n};\n","import {\n Flex,\n Image,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n comment,\n description,\n metadata: { constructFramework },\n name,\n version,\n } = usePackageCard();\n\n const cdkType = constructFramework?.name;\n const cdkVersion = constructFramework?.majorVersion;\n\n return (\n <>\n <LinkOverlay\n as={Link}\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n {cdkType && (\n <Tooltip\n hasArrow\n label={\n CDKTYPE_RENDER_MAP[cdkType].name +\n (cdkVersion !== undefined ? ` v${cdkVersion}` : \"\")\n }\n placement=\"top\"\n >\n <Image\n alt={`${CDKTYPE_RENDER_MAP[cdkType].name} icon`}\n h={5}\n mr={2}\n src={CDKTYPE_RENDER_MAP[cdkType].imgsrc}\n w={5}\n zIndex={1}\n />\n </Tooltip>\n )}\n <ChakraHeading\n as=\"h3\"\n color=\"blue.800\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"break-all\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n <Text\n color=\"blue.800\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n {comment && (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text\n as=\"span\"\n color=\"blue.500\"\n fontSize=\"md\"\n fontWeight=\"bold\"\n lineHeight=\"tall\"\n >\n Editor&apos;s note:{\" \"}\n </Text>\n {comment}\n </Text>\n )}\n </>\n );\n};\n","import { Stack, Image, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { OFFICIAL_SCOPES } from \"../../constants/constructs\";\nimport { usePackageCard } from \"./PackageCard\";\n\nconst HIGHLIGHT_RENDER_MAP = {\n official: {\n imgsrc: \"/assets/construct.png\",\n label: \"Official\",\n color: \"#ED3B00\",\n },\n community: {\n imgsrc: \"/assets/community.png\",\n label: \"Community\",\n color: \"#2F50FE\",\n },\n highQuality: {\n imgsrc: \"/assets/medal.png\",\n label: \"High Quality\",\n color: \"#1F02D4\",\n },\n} as const;\n\n// TODO: We will need a similar solution to tags for determining High Quality, and likely Official\nexport const Highlight: FunctionComponent = () => {\n const { name } = usePackageCard();\n\n const isOfficial = OFFICIAL_SCOPES.some((scope) => name.includes(scope));\n const highlightType = isOfficial ? \"official\" : \"community\";\n const { imgsrc, color, label } = HIGHLIGHT_RENDER_MAP[highlightType];\n\n return (\n <Stack align=\"center\" direction=\"row\" spacing={2}>\n <Image alt={`${label} icon`} src={imgsrc} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { OFFICIAL_SCOPES } from \"../../constants/constructs\";\nimport { KEYWORD_IGNORE_LIST } from \"../../constants/keywords\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\n// TODO: Proper tag implemenation, this is only a visual placeholder\nexport const Tags: FunctionComponent = () => {\n const { keywords, name } = usePackageCard();\n\n return (\n <>\n {[\n OFFICIAL_SCOPES.some((scope) => name.includes(scope)) ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n mr={1}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null,\n ...(keywords ?? [])\n .filter((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\n .slice(0, 3)\n .map((tag) => {\n return (\n <PackageTag\n key={tag}\n mr={1}\n value={`\"${tag}\"`}\n zIndex=\"0 !important\"\n >\n {tag}\n </PackageTag>\n );\n }),\n ]}\n </>\n );\n};\n","import { Grid, Stack, LinkBox, Divider } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { makeGridAreas } from \"../../util/css\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nconst GRID_AREA = {\n DETAILS: \"details\",\n LANGUAGES: \"languages\",\n TAGS: \"tags\",\n HEADING: \"heading\",\n};\n\nconst gridAreasMd = makeGridAreas(\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.TAGS, GRID_AREA.TAGS, GRID_AREA.LANGUAGES]\n);\n\nconst gridAreasMobile = makeGridAreas(\n [GRID_AREA.HEADING],\n [GRID_AREA.LANGUAGES],\n [GRID_AREA.DETAILS]\n);\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"gray.50\",\n },\n }}\n >\n <Grid\n as=\"article\"\n autoColumns=\"1fr\"\n autoRows=\"auto\"\n bg=\"white\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"gray.600\"\n data-testid={testIds.wideContainer}\n gap={5}\n h=\"100%\"\n p={5}\n templateAreas={{ base: gridAreasMobile, md: gridAreasMd }}\n w=\"100%\"\n >\n {/* Name + Desc */}\n <Stack gridArea={GRID_AREA.HEADING} spacing={2}>\n <Heading />\n </Stack>\n\n <Stack\n direction=\"row\"\n display={{ base: \"none\", md: \"initial\" }}\n gridArea={GRID_AREA.TAGS}\n maxH={6}\n overflow=\"hidden\"\n >\n <Tags />\n </Stack>\n\n <Grid\n alignItems=\"start\"\n alignSelf=\"center\"\n autoColumns={{ base: \"initial\", md: \"1fr\" }}\n autoRows={{ base: \"initial\", md: \"auto\" }}\n fontSize=\"xs\"\n gap={{ base: 0, md: 1 }}\n gridArea={GRID_AREA.DETAILS}\n templateColumns={{ base: \"1fr 1fr\", md: \"initial\" }}\n templateRows={{ base: \"1fr 1fr\", md: \"initial\" }}\n >\n <Highlight />\n <Details />\n </Grid>\n\n <Stack gridArea={GRID_AREA.LANGUAGES} spacing={{ base: 4, md: 0 }}>\n <Divider display={{ md: \"none\" }} />\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Stack>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n pkg: CatalogPackage;\n variant?: PackageCardType;\n}\n\nconst PackageCardContext = createContext<\n (CatalogPackage & { comment?: string }) | null\n>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={pkg}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface ArrowButtonProps {\n icon: FunctionComponent<IconProps>;\n offset?: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n icon: Icon,\n offset,\n getPageUrl,\n}) => {\n const label = `Page ${offset} link`;\n\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n if (offset !== undefined) {\n return <IconButton {...props} as={Link} to={getPageUrl({ offset })} />;\n }\n\n return <IconButton {...props} disabled />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport interface GoToPageProps {\n pageLimit: number;\n offset: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n pageLimit,\n offset,\n getPageUrl,\n}) => {\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n const { push } = useHistory();\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n push(getPageUrl({ offset: parseInt(inputValue) - 1 }));\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n colorScheme=\"blue\"\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import type { QueryParamKey } from \"../../constants/url\";\n\nexport const LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n IconButton,\n PopoverHeader,\n PopoverTrigger,\n PopoverBody,\n PopoverCloseButton,\n PopoverArrow,\n PopoverContent,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n return (\n <Flex align=\"center\">\n <Heading as=\"h4\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement=\"top-end\" strategy=\"fixed\">\n <PopoverTrigger>\n <IconButton\n aria-label={`Hint: ${name}`}\n icon={<QuestionIcon h={4} w={4} />}\n ml={2}\n px={0}\n py={0}\n size=\"sm\"\n variant=\"ghost\"\n />\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n color=\"white\"\n fontSize=\"sm\"\n shadow=\"whiteAlpha.300\"\n >\n <PopoverHeader>Hint: {name}</PopoverHeader>\n <PopoverCloseButton />\n <PopoverArrow />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { Checkbox, Stack, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n options: {\n display: string;\n value: string;\n }[];\n values: string[];\n onValueChange: (value: string) => void;\n}\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const getOnChange = (value: string) => () => {\n onValueChange(value);\n };\n\n return (\n <Stack spacing={2}>\n <FilterHeading hint={hint} name={name} />\n {options.map(({ display, value }) => (\n <Checkbox\n isChecked={checkedValues.includes(value)}\n key={value}\n onChange={getOnChange(value)}\n >\n <Text color=\"gray.600\" fontSize=\"sm\" isTruncated>\n {display}\n </Text>\n </Checkbox>\n ))}\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\n\n// TODO: This filter is currently non-functional\nexport const AuthorFilter: FunctionComponent = () => {\n const [authors, setAuthors] = useState<string[]>([]);\n\n const onAuthorsChange = (author: string) => {\n setAuthors(\n authors.includes(author)\n ? authors.filter((a) => a !== author)\n : [...authors, author]\n );\n };\n\n return (\n <CheckboxFilter\n name=\"Author\"\n onValueChange={onAuthorsChange}\n options={[\n {\n display: \"Community\",\n value: \"community\",\n },\n {\n display: \"AWS\",\n value: \"aws\",\n },\n ]}\n values={authors}\n />\n );\n};\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n value?: string;\n onValueChange: (value: string) => void;\n options: {\n display: string;\n value: string;\n }[];\n}\n\nexport const RadioFilter: FunctionComponent<RadioFilterProps> = ({\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack spacing={2}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack>\n {options.map(({ display, value }) => (\n <Radio key={value} value={value}>\n <Text color=\"gray.600\" fontSize=\"sm\" isTruncated>\n {display}\n </Text>\n </Radio>\n ))}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { Language } from \"../../constants/languages\";\n\nexport const toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const parseLangs = (langQuery: string | null) => {\n if (!langQuery) return [];\n\n const langs = decodeURIComponent(langQuery).split(\",\");\n return langs as Language[];\n};\n","/**\n * @fileoverview Exposes page-level state and setters to all components in the new SearchResults View.\n */\nimport { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport {\n UseCatalogSearchReturn,\n useCatalogSearch,\n} from \"../../hooks/useCatalogSearch\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { LIMIT } from \"../SearchResults/constants\";\nimport { parseLangs, toNum } from \"./util\";\n\nexport interface SearchState {\n limit: number;\n offset: number;\n query: string;\n searchAPI: UseCatalogSearchReturn;\n}\n\nconst SearchStateContext = createContext<SearchState | undefined>(undefined);\n\n/**\n * A hook to access Search Page specific state. This can only be in descendants of the new Search Page\n * and will otherwise throw an error.\n */\nexport const useSearchState = () => {\n const state = useContext(SearchStateContext);\n\n if (!state) {\n throw new Error(\n `This hook must be called in a child of <SearchStateProvider />`\n );\n }\n\n return state;\n};\n\nexport const SearchStateProvider: FunctionComponent = ({ children }) => {\n const queryParams = useQueryParams();\n\n const offset = toNum(queryParams.get(QUERY_PARAMS.OFFSET) ?? \"0\");\n\n const query = decodeURIComponent(\n queryParams.get(QUERY_PARAMS.SEARCH_QUERY) ?? \"\"\n );\n\n const languages = parseLangs(queryParams.get(QUERY_PARAMS.LANGUAGES));\n\n const sort = (queryParams.get(QUERY_PARAMS.SORT) ?? undefined) as\n | CatalogSearchSort\n | undefined;\n\n const cdkType =\n (queryParams.get(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined;\n\n const cdkMajorParam = queryParams.get(QUERY_PARAMS.CDK_MAJOR);\n const cdkMajor = cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n\n const searchAPI = useCatalogSearch({\n defaultCdkMajor: cdkMajor,\n defaultCdkType: cdkType,\n defaultLanguages: languages,\n defaultQuery: query,\n defaultSort: sort,\n });\n\n useEffect(() => {\n if (query !== searchAPI.query) {\n searchAPI.setQuery(query);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n return (\n <SearchStateContext.Provider\n value={{\n limit: LIMIT,\n offset,\n query,\n searchAPI,\n }}\n >\n {children}\n </SearchStateContext.Provider>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { CatalogConstructFrameworkMeta } from \"../../api/catalog-search\";\nimport { CDKType, CDKTYPE_NAME_MAP } from \"../../constants/constructs\";\nimport { useSearchContext } from \"../../contexts/Search\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSearchState } from \"./SearchState\";\n\ntype CDKOptions = Partial<{\n [key in CDKType]: CatalogConstructFrameworkMeta & {\n display: string;\n value: key;\n };\n}>;\n\nexport const CDKFilter: FunctionComponent = () => {\n const { cdkType, setCdkType, cdkMajor, setCdkMajor } =\n useSearchState().searchAPI;\n const searchAPI = useSearchContext()!;\n\n // Options with less than one package will be omitted\n const cdkOptions = useMemo(() => {\n const cdkTypes = searchAPI.constructFrameworks;\n const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => {\n if (meta.pkgCount < 1) {\n return opts;\n }\n\n return {\n ...opts,\n [name]: {\n display: CDKTYPE_NAME_MAP[name as CDKType],\n value: name,\n ...meta,\n },\n };\n }, {});\n\n return Object.keys(options).length ? (options as CDKOptions) : undefined;\n }, [searchAPI]);\n\n const majorsOptions = useMemo(() => {\n if (!cdkOptions || !cdkType) return undefined;\n const majorVersions = cdkOptions[cdkType]?.majorVersions;\n\n if (!majorVersions) return undefined;\n\n return [...majorVersions]\n .sort((a, b) => a - b)\n .map((value) => ({\n value: value.toString(),\n display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`,\n }));\n }, [cdkOptions, cdkType]);\n\n if (!cdkOptions) {\n return null;\n }\n\n const onCdkTypeChange = (type: string) => {\n const cdk = type as CDKType;\n setCdkMajor(undefined);\n setCdkType(type ? cdk : undefined);\n };\n\n const onCdkMajorChange = (major: string) => {\n if (!major) {\n setCdkMajor(undefined);\n return;\n }\n\n const majorNum = parseInt(major, 10);\n\n setCdkMajor(majorNum);\n };\n\n return (\n <>\n <RadioFilter\n hint=\"Constructs support distinct output types: AWS CDK libraries output Cloudformation Templates, CDK8s libraries output Kubernetes manifests, and CDKtf libraries output Terraform Configuration. The Construct Hub attempts to detect the output type of each library, but results are not guaranteed to be completely accurate.\"\n name=\"CDK Type\"\n onValueChange={onCdkTypeChange}\n options={[\n { display: \"Any CDK Type\", value: \"\" },\n ...Object.values(cdkOptions),\n ]}\n value={cdkType ?? \"\"}\n />\n {/* No point in showing major versions if only a single one is available */}\n {!!(majorsOptions && majorsOptions.length > 1) && (\n <RadioFilter\n hint={`Allows you to filter by a major version of your selected CDK Type: (${\n CDKTYPE_NAME_MAP[cdkType!]\n })`}\n name=\"CDK Major Version\"\n onValueChange={onCdkMajorChange}\n options={[\n { display: \"Any Major Version\", value: \"\" },\n ...majorsOptions,\n ]}\n value={cdkMajor?.toString() ?? \"\"}\n />\n )}\n </>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { useSearchState } from \"./SearchState\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .filter(([key]) => TEMP_SUPPORTED_LANGUAGES.has(key as Language))\n .map(([key, value]) => ({\n display: value,\n value: key,\n }));\n\nexport const LanguageFilter: FunctionComponent = () => {\n const { languages, setLanguages } = useSearchState().searchAPI;\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n setLanguages(\n languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language]\n );\n };\n\n return (\n <CheckboxFilter\n hint=\"Select one or more programming languages to filter by. Results will match at least one of the selected languages. If no languages are selected, results will not be filtered by langauges.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { AuthorFilter } from \"./AuthorFilter\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\n\nexport interface FilterPanelProps {}\n\n// Header height + section padding\nconst TOP_OFFSET = \"5.75rem\";\n\n/**\n * The desktop Resolution Filter Panel\n */\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n return (\n <Card\n borderRadius=\"none\"\n boxShadow=\"none\"\n display={{ base: \"none\", md: \"flex\" }}\n maxH={`calc(100vh - ${TOP_OFFSET} - 1.25rem)`}\n maxW=\"23rem\"\n minW=\"100%\"\n overflow=\"hidden auto\"\n p={4}\n pos=\"sticky\"\n top={TOP_OFFSET}\n zIndex=\"docked\"\n >\n <Stack color=\"blue.800\" h=\"max-content\" spacing={6} top={4}>\n <Heading as=\"h3\" size=\"sm\">\n Filters\n </Heading>\n <CDKFilter />\n <LanguageFilter />\n <AuthorFilter />\n </Stack>\n </Card>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n items: CatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n cardView = PackageCardType.Wide,\n items,\n loading,\n // title,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"../SearchResults/components/ArrowButton\";\nimport { GoToPage } from \"../SearchResults/components/GoToPage\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n getPageUrl: (params: { offset?: number }) => string;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n getPageUrl,\n pageLimit,\n}) => {\n const nextOffset = offset < pageLimit ? offset + 1 : undefined;\n const prevOffset = offset > 0 ? offset - 1 : undefined;\n\n return (\n <Stack\n align=\"center\"\n direction=\"row\"\n justify=\"space-between\"\n maxW=\"18rem\"\n mx=\"auto\"\n spacing={4}\n w=\"full\"\n >\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronLeftIcon}\n offset={prevOffset}\n />\n <GoToPage getPageUrl={getPageUrl} offset={offset} pageLimit={pageLimit} />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronRightIcon}\n offset={nextOffset}\n />\n </Stack>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport interface SearchDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n query?: string;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"strong\" color=\"gray.700\">\n {children}\n </Text>\n);\n\nexport const SearchDetails: FunctionComponent<SearchDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n query,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n return (\n <Text>\n Displaying{\" \"}\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em> {filtered ? \"search results\" : \"constructs\"}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n </Text>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest first\",\n [CatalogSearchSort.PublishDateDesc]: \"Newest first\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n","import { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSearchState } from \"./SearchState\";\n\nexport const SortFilter: FunctionComponent = () => {\n const { sort, setSort } = useSearchState().searchAPI;\n\n const onSortChange = (newSort: string) => {\n setSort(newSort ? (newSort as CatalogSearchSort) : undefined);\n };\n\n return (\n <RadioFilter\n hint=\"Sets the order of search results\"\n name=\"Sorted By\"\n onValueChange={onSortChange}\n options={[\n { display: \"Relevance\", value: \"\" },\n ...Object.entries(SORT_RENDER_MAP).map(([value, display]) => ({\n display,\n value,\n })),\n ]}\n value={sort ?? \"\"}\n />\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Drawer,\n Stack,\n DrawerBody,\n DrawerHeader,\n DrawerOverlay,\n DrawerContent,\n DrawerCloseButton,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { AuthorFilter } from \"./AuthorFilter\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n\n return (\n <>\n <Button\n colorScheme=\"blue\"\n display={{ md: \"none\" }}\n onClick={drawer.onOpen}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n Sorting and Filters\n </Button>\n <Drawer {...drawer} placement=\"bottom\">\n <DrawerOverlay />\n\n <DrawerContent color=\"blue.800\">\n <DrawerHeader>Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"blue.800\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <AuthorFilter />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Text,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { useSearchState } from \"./SearchState\";\n\nexport const SortedBy: FunctionComponent = () => {\n const { searchAPI } = useSearchState();\n const { sort, setSort } = searchAPI;\n\n const selected = sort ? SORT_RENDER_MAP[sort] : \"Relevance\";\n\n return (\n <Flex align=\"center\">\n <Text>Sorted by</Text>\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n ml={2}\n pl={2} // For some reason, the px shorthand doesn't work on this Button\n pr={2}\n py={1}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n {selected}\n </MenuButton>\n <MenuList minW=\"180\" zIndex=\"sticky\">\n <MenuItem key=\"Relevance\" onClick={() => setSort(undefined)}>\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n key={value}\n onClick={() => setSort(value as CatalogSearchSort)}\n >\n {display}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n </Flex>\n );\n};\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect, useRef } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { SearchBar } from \"../../components/SearchBar\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { getSearchPath } from \"../../util/url\";\nimport { SearchQueryParam } from \"../SearchResults/constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { useSearchState } from \"./SearchState\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\n\nexport const SearchResults: FunctionComponent = () => {\n const isFirstRender = useRef(true);\n const { push } = useHistory();\n\n const { query, searchAPI, offset, limit } = useSearchState();\n const { languages, sort, cdkType, cdkMajor, onSearch } = searchAPI;\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit,\n query,\n languages,\n cdkMajor,\n cdkType,\n sort,\n });\n\n const getUrl = (\n params: Partial<{ [key in SearchQueryParam]: number | string }>\n ) => {\n return getSearchPath({\n cdkMajor,\n cdkType,\n query: (params.q ?? query) as string,\n languages,\n sort,\n offset: params.offset ?? offset,\n });\n };\n\n // Resets the page number to 1 if query param offset is below 0, or to the last page if offset is higher than page count\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n push(getUrl({ offset: 0 }));\n } else {\n // Offset is too large, just take last page\n push(getUrl({ offset: pageLimit }));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Reset offset and update url when query, filters, or sort change\n // We want to avoid doing this on first render / when a user directly navigates to a search URL\n // so we keep a ref to prevent this\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n } else {\n // Trigger a history replace rather than push to avoid bloating browser history\n onSearch({ replace: true });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sort, languages, cdkType, cdkMajor]);\n\n return (\n <Page\n meta={{\n title: query || \"Search\",\n description: query\n ? `${results.length} results for ${query} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Stack direction=\"column\" maxW=\"100vw\" pb={4} px={4} spacing={4}>\n <SearchBar\n bg=\"white\"\n onChange={searchAPI.onQueryChange}\n onSubmit={searchAPI.onSubmit}\n value={searchAPI.query}\n />\n\n <Stack\n align={{ base: \"start\", lg: \"center\" }}\n direction={{ base: \"column-reverse\", lg: \"row\" }}\n justify={{ base: \"initial\", lg: \"space-between\" }}\n spacing={4}\n >\n <SearchDetails\n count={results.length}\n filtered={!!query}\n limit={limit}\n offset={offset}\n query={query}\n />\n\n <Box display={{ base: \"none\", md: \"initial\" }}>\n <SortedBy />\n </Box>\n\n <Box display={{ md: \"none\" }}>\n <SortAndFilterDrawer />\n </Box>\n </Stack>\n\n <PackageList items={page} />\n\n <Box w=\"full\">\n <PageControls\n getPageUrl={getUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n </Box>\n </Stack>\n </Page>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\"page\"] as const);\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchResults } from \"./SearchResults\";\nimport { SearchStateProvider } from \"./SearchState\";\nimport testIds from \"./testIds\";\n\nexport const SearchRedesign: FunctionComponent = () => {\n return (\n <SearchStateProvider>\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description:\n \"Search Construct Libraries for AWS CDK, CDK8s, and CDKtf\",\n }}\n pageName=\"search\"\n >\n <Grid\n data-testid={testIds.page}\n gap={4}\n h=\"full\"\n maxW=\"100%\"\n px={{ base: 0, md: 6 }}\n py={6}\n templateColumns={{ base: \"1fr\", md: \"auto 1fr\" }}\n templateRows=\"1fr\"\n >\n {/* Filter Panel Desktop */}\n <FilterPanel />\n\n {/* Results, Info, and Controls */}\n <SearchResults />\n </Grid>\n </Page>\n </SearchStateProvider>\n );\n};\n"],"sourceRoot":""}