construct-hub-webapp 0.1.558 → 0.1.561
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/asset-manifest.json +15 -15
- package/build/index.html +1 -1
- package/build/static/js/122.133f03c1.chunk.js.map +1 -1
- package/build/static/js/{225.36a236f9.chunk.js → 225.46bab247.chunk.js} +2 -2
- package/build/static/js/225.46bab247.chunk.js.map +1 -0
- package/build/static/js/{51.3b58a25f.chunk.js → 51.a319b42f.chunk.js} +2 -2
- package/build/static/js/{51.3b58a25f.chunk.js.map → 51.a319b42f.chunk.js.map} +1 -1
- package/build/static/js/{577.b8baa31c.chunk.js → 577.e3e02e10.chunk.js} +2 -2
- package/build/static/js/{577.b8baa31c.chunk.js.map → 577.e3e02e10.chunk.js.map} +1 -1
- package/build/static/js/{634.2970130f.chunk.js → 634.9d4bc0e6.chunk.js} +3 -3
- package/build/static/js/{634.2970130f.chunk.js.LICENSE.txt → 634.9d4bc0e6.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/634.9d4bc0e6.chunk.js.map +1 -0
- package/build/static/js/{639.a2da0946.chunk.js → 639.d3b6952f.chunk.js} +2 -2
- package/build/static/js/639.d3b6952f.chunk.js.map +1 -0
- package/build/static/js/{926.633393a3.chunk.js → 926.73d499f8.chunk.js} +2 -2
- package/build/static/js/{926.633393a3.chunk.js.map → 926.73d499f8.chunk.js.map} +1 -1
- package/build/static/js/main.00202b70.js +3 -0
- package/build/static/js/{main.f64ed614.js.LICENSE.txt → main.00202b70.js.LICENSE.txt} +0 -15
- package/build/static/js/main.00202b70.js.map +1 -0
- package/package.json +26 -25
- package/build/static/js/225.36a236f9.chunk.js.map +0 -1
- package/build/static/js/634.2970130f.chunk.js.map +0 -1
- package/build/static/js/639.a2da0946.chunk.js.map +0 -1
- package/build/static/js/main.f64ed614.js +0 -3
- package/build/static/js/main.f64ed614.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/js/225.46bab247.chunk.js","mappings":"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","sources":["../node_modules/@chakra-ui/tabs/dist/chakra-ui-tabs.esm.js","../node_modules/date-fns/esm/compareAsc/index.js","../node_modules/date-fns/esm/_lib/cloneObject/index.js","../node_modules/date-fns/esm/_lib/assign/index.js","../node_modules/date-fns/esm/formatDistanceStrict/index.js","../node_modules/date-fns/esm/formatDistanceToNowStrict/index.js","../node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js"],"sourcesContent":["import { forwardRef, useMultiStyleConfig, omitThemingProps, StylesProvider, chakra, useStyles } from '@chakra-ui/system';\nimport { normalizeEventKey, callAllHandlers, determineLazyBehavior, isUndefined, focus, omit, cx, __DEV__ } from '@chakra-ui/utils';\nimport * as React from 'react';\nimport { useClickable } from '@chakra-ui/clickable';\nimport { createDescendantContext } from '@chakra-ui/descendant';\nimport { useControllableState, useId, useSafeLayoutEffect } from '@chakra-ui/hooks';\nimport { createContext, mergeRefs, getValidChildren } from '@chakra-ui/react-utils';\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nvar _excluded$1 = [\"defaultIndex\", \"onChange\", \"index\", \"isManual\", \"isLazy\", \"lazyBehavior\", \"orientation\", \"direction\"],\n _excluded2$1 = [\"isDisabled\", \"isFocusable\"],\n _excluded3 = [\"isSelected\", \"id\", \"children\"];\n/* -------------------------------------------------------------------------------------------------\n * Create context to track descendants and their indices\n * -----------------------------------------------------------------------------------------------*/\n\nvar _createDescendantCont = createDescendantContext(),\n TabsDescendantsProvider = _createDescendantCont[0],\n useTabsDescendantsContext = _createDescendantCont[1],\n useTabsDescendants = _createDescendantCont[2],\n useTabsDescendant = _createDescendantCont[3];\n\n/**\n * Tabs hook 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 */\nfunction useTabs(props) {\n var defaultIndex = props.defaultIndex,\n onChange = props.onChange,\n index = props.index,\n isManual = props.isManual,\n isLazy = props.isLazy,\n _props$lazyBehavior = props.lazyBehavior,\n lazyBehavior = _props$lazyBehavior === void 0 ? \"unmount\" : _props$lazyBehavior,\n _props$orientation = props.orientation,\n orientation = _props$orientation === void 0 ? \"horizontal\" : _props$orientation,\n _props$direction = props.direction,\n direction = _props$direction === void 0 ? \"ltr\" : _props$direction,\n htmlProps = _objectWithoutPropertiesLoose(props, _excluded$1);\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\n\n var _React$useState = React.useState(defaultIndex != null ? defaultIndex : 0),\n focusedIndex = _React$useState[0],\n setFocusedIndex = _React$useState[1];\n\n var _useControllableState = useControllableState({\n defaultValue: defaultIndex != null ? defaultIndex : 0,\n value: index,\n onChange: onChange\n }),\n selectedIndex = _useControllableState[0],\n setSelectedIndex = _useControllableState[1];\n /**\n * Sync focused `index` with controlled `selectedIndex` (which is the `props.index`)\n */\n\n\n React.useEffect(function () {\n if (index != null) {\n setFocusedIndex(index);\n }\n }, [index]);\n /**\n * Think of `useDescendants` as a register for the tab nodes.\n */\n\n var descendants = useTabsDescendants();\n /**\n * Generate a unique id or use user-provided id for the tabs widget\n */\n\n var id = useId(props.id, \"tabs\");\n return {\n id: id,\n selectedIndex: selectedIndex,\n focusedIndex: focusedIndex,\n setSelectedIndex: setSelectedIndex,\n setFocusedIndex: setFocusedIndex,\n isManual: isManual,\n isLazy: isLazy,\n lazyBehavior: lazyBehavior,\n orientation: orientation,\n descendants: descendants,\n direction: direction,\n htmlProps: htmlProps\n };\n}\n\nvar _createContext = createContext({\n name: \"TabsContext\",\n errorMessage: \"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />\"\n}),\n TabsProvider = _createContext[0],\n useTabsContext = _createContext[1];\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 */\nfunction useTabList(props) {\n var _useTabsContext = useTabsContext(),\n focusedIndex = _useTabsContext.focusedIndex,\n orientation = _useTabsContext.orientation,\n direction = _useTabsContext.direction;\n\n var descendants = useTabsDescendantsContext();\n var onKeyDown = React.useCallback(function (event) {\n var _keyMap;\n\n var nextTab = function nextTab() {\n var next = descendants.nextEnabled(focusedIndex);\n if (next) focus(next.node);\n };\n\n var prevTab = function prevTab() {\n var prev = descendants.prevEnabled(focusedIndex);\n if (prev) focus(prev.node);\n };\n\n var firstTab = function firstTab() {\n var first = descendants.firstEnabled();\n if (first) focus(first.node);\n };\n\n var lastTab = function lastTab() {\n var last = descendants.lastEnabled();\n if (last) focus(last.node);\n };\n\n var isHorizontal = orientation === \"horizontal\";\n var isVertical = orientation === \"vertical\";\n var eventKey = normalizeEventKey(event);\n var ArrowStart = direction === \"ltr\" ? \"ArrowLeft\" : \"ArrowRight\";\n var ArrowEnd = direction === \"ltr\" ? \"ArrowRight\" : \"ArrowLeft\";\n var keyMap = (_keyMap = {}, _keyMap[ArrowStart] = function () {\n return isHorizontal && prevTab();\n }, _keyMap[ArrowEnd] = function () {\n return isHorizontal && nextTab();\n }, _keyMap.ArrowDown = function ArrowDown() {\n return isVertical && nextTab();\n }, _keyMap.ArrowUp = function ArrowUp() {\n return isVertical && prevTab();\n }, _keyMap.Home = firstTab, _keyMap.End = lastTab, _keyMap);\n var action = keyMap[eventKey];\n\n if (action) {\n event.preventDefault();\n action(event);\n }\n }, [descendants, focusedIndex, orientation, direction]);\n return _extends({}, props, {\n role: \"tablist\",\n \"aria-orientation\": orientation,\n onKeyDown: callAllHandlers(props.onKeyDown, onKeyDown)\n });\n}\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 */\nfunction useTab(props) {\n var isDisabled = props.isDisabled,\n isFocusable = props.isFocusable,\n htmlProps = _objectWithoutPropertiesLoose(props, _excluded2$1);\n\n var _useTabsContext2 = useTabsContext(),\n setSelectedIndex = _useTabsContext2.setSelectedIndex,\n isManual = _useTabsContext2.isManual,\n id = _useTabsContext2.id,\n setFocusedIndex = _useTabsContext2.setFocusedIndex,\n selectedIndex = _useTabsContext2.selectedIndex;\n\n var _useTabsDescendant = useTabsDescendant({\n disabled: isDisabled && !isFocusable\n }),\n index = _useTabsDescendant.index,\n register = _useTabsDescendant.register;\n\n var isSelected = index === selectedIndex;\n\n var onClick = function onClick() {\n setSelectedIndex(index);\n };\n\n var onFocus = function onFocus() {\n setFocusedIndex(index);\n var isDisabledButFocusable = isDisabled && isFocusable;\n var shouldSelect = !isManual && !isDisabledButFocusable;\n\n if (shouldSelect) {\n setSelectedIndex(index);\n }\n };\n\n var clickableProps = useClickable(_extends({}, htmlProps, {\n ref: mergeRefs(register, props.ref),\n isDisabled: isDisabled,\n isFocusable: isFocusable,\n onClick: callAllHandlers(props.onClick, onClick)\n }));\n var type = \"button\";\n return _extends({}, clickableProps, {\n id: makeTabId(id, index),\n role: \"tab\",\n tabIndex: isSelected ? 0 : -1,\n type: type,\n \"aria-selected\": isSelected,\n \"aria-controls\": makeTabPanelId(id, index),\n onFocus: isDisabled ? undefined : callAllHandlers(props.onFocus, onFocus)\n });\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 */\nfunction useTabPanels(props) {\n var context = useTabsContext();\n var id = context.id,\n selectedIndex = context.selectedIndex;\n var validChildren = getValidChildren(props.children);\n var children = validChildren.map(function (child, index) {\n return /*#__PURE__*/React.cloneElement(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 return _extends({}, props, {\n children: 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 */\n\nfunction useTabPanel(props) {\n var isSelected = props.isSelected,\n id = props.id,\n children = props.children,\n htmlProps = _objectWithoutPropertiesLoose(props, _excluded3);\n\n var _useTabsContext3 = useTabsContext(),\n isLazy = _useTabsContext3.isLazy,\n lazyBehavior = _useTabsContext3.lazyBehavior;\n\n var hasBeenSelected = React.useRef(false);\n\n if (isSelected) {\n hasBeenSelected.current = true;\n }\n\n var shouldRenderChildren = determineLazyBehavior({\n hasBeenSelected: hasBeenSelected.current,\n isSelected: isSelected,\n isLazy: isLazy,\n lazyBehavior: lazyBehavior\n });\n return _extends({\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: id\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 */\n\nfunction useTabIndicator() {\n var context = useTabsContext();\n var descendants = useTabsDescendantsContext();\n var selectedIndex = context.selectedIndex,\n orientation = context.orientation;\n var isHorizontal = orientation === \"horizontal\";\n var isVertical = orientation === \"vertical\"; // Get the clientRect of the selected tab\n\n var _React$useState2 = React.useState(function () {\n if (isHorizontal) return {\n left: 0,\n width: 0\n };\n if (isVertical) return {\n top: 0,\n height: 0\n };\n return undefined;\n }),\n rect = _React$useState2[0],\n setRect = _React$useState2[1];\n\n var _React$useState3 = React.useState(false),\n hasMeasured = _React$useState3[0],\n setHasMeasured = _React$useState3[1]; // Update the selected tab rect when the selectedIndex changes\n\n\n useSafeLayoutEffect(function () {\n if (isUndefined(selectedIndex)) return undefined;\n var tab = descendants.item(selectedIndex);\n if (isUndefined(tab)) return undefined; // Horizontal Tab: Calculate width and left distance\n\n if (isHorizontal) {\n setRect({\n left: tab.node.offsetLeft,\n width: tab.node.offsetWidth\n });\n } // Vertical Tab: Calculate height and top distance\n\n\n if (isVertical) {\n setRect({\n top: tab.node.offsetTop,\n height: tab.node.offsetHeight\n });\n } // Prevent unwanted transition from 0 to measured rect\n // by setting the measured state in the next tick\n\n\n var id = requestAnimationFrame(function () {\n setHasMeasured(true);\n });\n return function () {\n if (id) {\n cancelAnimationFrame(id);\n }\n };\n }, [selectedIndex, isHorizontal, isVertical, descendants]);\n return _extends({\n position: \"absolute\",\n transitionProperty: \"left, right, top, bottom, height, width\",\n transitionDuration: hasMeasured ? \"200ms\" : \"0ms\",\n transitionTimingFunction: \"cubic-bezier(0, 0, 0.2, 1)\"\n }, rect);\n}\n\nfunction makeTabId(id, index) {\n return id + \"--tab-\" + index;\n}\n\nfunction makeTabPanelId(id, index) {\n return id + \"--tabpanel-\" + index;\n}\n\nvar _excluded = [\"children\", \"className\"],\n _excluded2 = [\"htmlProps\", \"descendants\"];\n\n/**\n * Tabs\n *\n * Provides context and logic for all tabs components.\n */\nvar Tabs = /*#__PURE__*/forwardRef(function (props, ref) {\n var styles = useMultiStyleConfig(\"Tabs\", props);\n\n var _omitThemingProps = omitThemingProps(props),\n children = _omitThemingProps.children,\n className = _omitThemingProps.className,\n rest = _objectWithoutPropertiesLoose(_omitThemingProps, _excluded);\n\n var _useTabs = useTabs(rest),\n htmlProps = _useTabs.htmlProps,\n descendants = _useTabs.descendants,\n ctx = _objectWithoutPropertiesLoose(_useTabs, _excluded2);\n\n var context = React.useMemo(function () {\n return ctx;\n }, [ctx]);\n var rootProps = omit(htmlProps, [\"isFitted\"]);\n return /*#__PURE__*/React.createElement(TabsDescendantsProvider, {\n value: descendants\n }, /*#__PURE__*/React.createElement(TabsProvider, {\n value: context\n }, /*#__PURE__*/React.createElement(StylesProvider, {\n value: styles\n }, /*#__PURE__*/React.createElement(chakra.div, _extends({\n className: cx(\"chakra-tabs\", className),\n ref: ref\n }, rootProps, {\n __css: styles.root\n }), children))));\n});\n\nif (__DEV__) {\n Tabs.displayName = \"Tabs\";\n}\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 */\nvar Tab = /*#__PURE__*/forwardRef(function (props, ref) {\n var styles = useStyles();\n var tabProps = useTab(_extends({}, props, {\n ref: ref\n }));\n\n var tabStyles = _extends({\n outline: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\"\n }, styles.tab);\n\n return /*#__PURE__*/React.createElement(chakra.button, _extends({}, tabProps, {\n className: cx(\"chakra-tabs__tab\", props.className),\n __css: tabStyles\n }));\n});\n\nif (__DEV__) {\n Tab.displayName = \"Tab\";\n}\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 */\nvar TabList = /*#__PURE__*/forwardRef(function (props, ref) {\n var tablistProps = useTabList(_extends({}, props, {\n ref: ref\n }));\n var styles = useStyles();\n\n var tablistStyles = _extends({\n display: \"flex\"\n }, styles.tablist);\n\n return /*#__PURE__*/React.createElement(chakra.div, _extends({}, tablistProps, {\n className: cx(\"chakra-tabs__tablist\", props.className),\n __css: tablistStyles\n }));\n});\n\nif (__DEV__) {\n TabList.displayName = \"TabList\";\n}\n\n/**\n * TabPanel\n * Used to render the content for a specific tab.\n */\nvar TabPanel = /*#__PURE__*/forwardRef(function (props, ref) {\n var panelProps = useTabPanel(_extends({}, props, {\n ref: ref\n }));\n var styles = useStyles();\n return /*#__PURE__*/React.createElement(chakra.div, _extends({\n outline: \"0\"\n }, panelProps, {\n className: cx(\"chakra-tabs__tab-panel\", props.className),\n __css: styles.tabpanel\n }));\n});\n\nif (__DEV__) {\n TabPanel.displayName = \"TabPanel\";\n}\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 */\nvar TabPanels = /*#__PURE__*/forwardRef(function (props, ref) {\n var panelsProps = useTabPanels(props);\n var styles = useStyles();\n return /*#__PURE__*/React.createElement(chakra.div, _extends({}, panelsProps, {\n width: \"100%\",\n ref: ref,\n className: cx(\"chakra-tabs__tab-panels\", props.className),\n __css: styles.tabpanels\n }));\n});\n\nif (__DEV__) {\n TabPanels.displayName = \"TabPanels\";\n}\n\n/**\n * TabIndicator\n *\n * Used to render an active tab indicator that animates between\n * selected tabs.\n */\nvar TabIndicator = /*#__PURE__*/forwardRef(function (props, ref) {\n var indicatorStyle = useTabIndicator();\n\n var style = _extends({}, props.style, indicatorStyle);\n\n var styles = useStyles();\n return /*#__PURE__*/React.createElement(chakra.div, _extends({\n ref: ref\n }, props, {\n className: cx(\"chakra-tabs__tab-indicator\", props.className),\n style: style,\n __css: styles.indicator\n }));\n});\n\nif (__DEV__) {\n TabIndicator.displayName = \"TabIndicator\";\n}\n\nexport { Tab, TabIndicator, TabList, TabPanel, TabPanels, Tabs, TabsDescendantsProvider, TabsProvider, useTab, useTabIndicator, useTabList, useTabPanel, useTabPanels, useTabs, useTabsContext, useTabsDescendant, useTabsDescendants, useTabsDescendantsContext };\n","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the first date to compare\n * @param {Date|Number} dateRight - the second date to compare\n * @returns {Number} the result of the comparison\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\n\nexport default function compareAsc(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n var diff = dateLeft.getTime() - dateRight.getTime();\n\n if (diff < 0) {\n return -1;\n } else if (diff > 0) {\n return 1; // Return 0 if diff is 0; return NaN if diff is NaN\n } else {\n return diff;\n }\n}","import assign from \"../assign/index.js\";\nexport default function cloneObject(dirtyObject) {\n return assign({}, dirtyObject);\n}","export default function assign(target, dirtyObject) {\n if (target == null) {\n throw new TypeError('assign requires that input parameter not be null or undefined');\n }\n\n dirtyObject = dirtyObject || {};\n\n for (var property in dirtyObject) {\n if (Object.prototype.hasOwnProperty.call(dirtyObject, property)) {\n target[property] = dirtyObject[property];\n }\n }\n\n return target;\n}","import getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport compareAsc from \"../compareAsc/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport cloneObject from \"../_lib/cloneObject/index.js\";\nimport defaultLocale from \"../locale/en-US/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nvar MILLISECONDS_IN_MINUTE = 1000 * 60;\nvar MINUTES_IN_DAY = 60 * 24;\nvar MINUTES_IN_MONTH = MINUTES_IN_DAY * 30;\nvar MINUTES_IN_YEAR = MINUTES_IN_DAY * 365;\n/**\n * @name formatDistanceStrict\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The function was renamed from `distanceInWordsStrict` to `formatDistanceStrict`\n * to make its name consistent with `format` and `formatRelative`.\n *\n * - The order of arguments is swapped to make the function\n * consistent with `differenceIn...` functions.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(2015, 0, 2),\n * new Date(2014, 6, 2)\n * ) //=> '6 months'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(2014, 6, 2),\n * new Date(2015, 0, 2)\n * ) //=> '6 months'\n * ```\n *\n * - `partialMethod` option is renamed to `roundingMethod`.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { partialMethod: 'ceil' }\n * ) //=> '2 minutes'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { roundingMethod: 'ceil' }\n * ) //=> '2 minutes'\n * ```\n *\n * - If `roundingMethod` is not specified, it now defaults to `round` instead of `floor`.\n *\n * - `unit` option now accepts one of the strings:\n * 'second', 'minute', 'hour', 'day', 'month' or 'year' instead of 's', 'm', 'h', 'd', 'M' or 'Y'\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { unit: 'm' }\n * )\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { unit: 'minute' }\n * )\n * ```\n *\n * @param {Date|Number} date - the date\n * @param {Date|Number} baseDate - the date to compare with\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `baseDate` must not be Invalid Date\n * @throws {RangeError} `options.roundingMethod` must be 'floor', 'ceil' or 'round'\n * @throws {RangeError} `options.unit` must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistanceStrict(new Date(2014, 6, 2), new Date(2015, 0, 2))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00?\n * const result = formatDistanceStrict(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0)\n * )\n * //=> '15 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistanceStrict(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> '1 year ago'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, in minutes?\n * const result = formatDistanceStrict(new Date(2016, 0, 1), new Date(2015, 0, 1), {\n * unit: 'minute'\n * })\n * //=> '525600 minutes'\n *\n * @example\n * // What is the distance from 1 January 2015\n * // to 28 January 2015, in months, rounded up?\n * const result = formatDistanceStrict(new Date(2015, 0, 28), new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistanceStrict(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceStrict(dirtyDate, dirtyBaseDate) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n requiredArgs(2, arguments);\n var locale = options.locale || defaultLocale;\n\n if (!locale.formatDistance) {\n throw new RangeError('locale must contain localize.formatDistance property');\n }\n\n var comparison = compareAsc(dirtyDate, dirtyBaseDate);\n\n if (isNaN(comparison)) {\n throw new RangeError('Invalid time value');\n }\n\n var localizeOptions = cloneObject(options);\n localizeOptions.addSuffix = Boolean(options.addSuffix);\n localizeOptions.comparison = comparison;\n var dateLeft;\n var dateRight;\n\n if (comparison > 0) {\n dateLeft = toDate(dirtyBaseDate);\n dateRight = toDate(dirtyDate);\n } else {\n dateLeft = toDate(dirtyDate);\n dateRight = toDate(dirtyBaseDate);\n }\n\n var roundingMethod = options.roundingMethod == null ? 'round' : String(options.roundingMethod);\n var roundingMethodFn;\n\n if (roundingMethod === 'floor') {\n roundingMethodFn = Math.floor;\n } else if (roundingMethod === 'ceil') {\n roundingMethodFn = Math.ceil;\n } else if (roundingMethod === 'round') {\n roundingMethodFn = Math.round;\n } else {\n throw new RangeError(\"roundingMethod must be 'floor', 'ceil' or 'round'\");\n }\n\n var milliseconds = dateRight.getTime() - dateLeft.getTime();\n var minutes = milliseconds / MILLISECONDS_IN_MINUTE;\n var timezoneOffset = getTimezoneOffsetInMilliseconds(dateRight) - getTimezoneOffsetInMilliseconds(dateLeft); // Use DST-normalized difference in minutes for years, months and days;\n // use regular difference in minutes for hours, minutes and seconds.\n\n var dstNormalizedMinutes = (milliseconds - timezoneOffset) / MILLISECONDS_IN_MINUTE;\n var unit;\n\n if (options.unit == null) {\n if (minutes < 1) {\n unit = 'second';\n } else if (minutes < 60) {\n unit = 'minute';\n } else if (minutes < MINUTES_IN_DAY) {\n unit = 'hour';\n } else if (dstNormalizedMinutes < MINUTES_IN_MONTH) {\n unit = 'day';\n } else if (dstNormalizedMinutes < MINUTES_IN_YEAR) {\n unit = 'month';\n } else {\n unit = 'year';\n }\n } else {\n unit = String(options.unit);\n } // 0 up to 60 seconds\n\n\n if (unit === 'second') {\n var seconds = roundingMethodFn(milliseconds / 1000);\n return locale.formatDistance('xSeconds', seconds, localizeOptions); // 1 up to 60 mins\n } else if (unit === 'minute') {\n var roundedMinutes = roundingMethodFn(minutes);\n return locale.formatDistance('xMinutes', roundedMinutes, localizeOptions); // 1 up to 24 hours\n } else if (unit === 'hour') {\n var hours = roundingMethodFn(minutes / 60);\n return locale.formatDistance('xHours', hours, localizeOptions); // 1 up to 30 days\n } else if (unit === 'day') {\n var days = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_DAY);\n return locale.formatDistance('xDays', days, localizeOptions); // 1 up to 12 months\n } else if (unit === 'month') {\n var months = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_MONTH);\n return months === 12 && options.unit !== 'month' ? locale.formatDistance('xYears', 1, localizeOptions) : locale.formatDistance('xMonths', months, localizeOptions); // 1 year up to max Date\n } else if (unit === 'year') {\n var years = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_YEAR);\n return locale.formatDistance('xYears', years, localizeOptions);\n }\n\n throw new RangeError(\"unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\");\n}","import formatDistanceStrict from \"../formatDistanceStrict/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name formatDistanceToNowStrict\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * @param {Date|Number} date - the given date\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * var result = formatDistanceToNowStrict(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * var result = formatDistanceToNowStrict(\n * new Date(2015, 0, 1, 0, 0, 15)\n * )\n * //=> '20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in 1 year'\n *\n * @example\n * // If today is 28 January 2015,\n * // what is the distance to 1 January 2015, in months, rounded up??\n * var result = formatDistanceToNowStrict(new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceToNowStrict(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n return formatDistanceStrict(dirtyDate, Date.now(), dirtyOptions);\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}"],"names":["_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","_objectWithoutPropertiesLoose","excluded","sourceKeys","keys","indexOf","_excluded$1","_excluded2$1","_excluded3","_createDescendantCont","createDescendantContext","TabsDescendantsProvider","useTabsDescendantsContext","useTabsDescendants","useTabsDescendant","_createContext","createContext","name","errorMessage","TabsProvider","useTabsContext","makeTabId","id","index","makeTabPanelId","_excluded","_excluded2","Tabs","forwardRef","props","ref","styles","useMultiStyleConfig","_omitThemingProps","omitThemingProps","children","className","_useTabs","defaultIndex","onChange","isManual","isLazy","_props$lazyBehavior","lazyBehavior","_props$orientation","orientation","_props$direction","direction","htmlProps","_React$useState","React","focusedIndex","setFocusedIndex","_useControllableState","useControllableState","defaultValue","value","selectedIndex","setSelectedIndex","descendants","useId","useTabs","ctx","context","rootProps","omit","StylesProvider","chakra","cx","__css","root","__DEV__","displayName","Tab","useStyles","tabProps","isDisabled","isFocusable","_useTabsContext2","_useTabsDescendant","disabled","register","isSelected","clickableProps","useClickable","mergeRefs","onClick","callAllHandlers","role","tabIndex","type","onFocus","undefined","useTab","tabStyles","outline","display","alignItems","justifyContent","tab","TabList","tablistProps","_useTabsContext","onKeyDown","event","_keyMap","nextTab","next","nextEnabled","focus","node","prevTab","prev","prevEnabled","isHorizontal","isVertical","eventKey","normalizeEventKey","ArrowEnd","action","ArrowDown","ArrowUp","Home","first","firstEnabled","End","last","lastEnabled","preventDefault","useTabList","tablistStyles","tablist","TabPanel","panelProps","_useTabsContext3","hasBeenSelected","current","determineLazyBehavior","hidden","useTabPanel","tabpanel","TabPanels","panelsProps","getValidChildren","map","child","useTabPanels","width","tabpanels","TabIndicator","indicatorStyle","_React$useState2","left","top","height","rect","setRect","_React$useState3","hasMeasured","setHasMeasured","useSafeLayoutEffect","isUndefined","item","offsetLeft","offsetWidth","offsetTop","offsetHeight","requestAnimationFrame","cancelAnimationFrame","position","transitionProperty","transitionDuration","transitionTimingFunction","useTabIndicator","style","indicator","compareAsc","dirtyDateLeft","dirtyDateRight","requiredArgs","dateLeft","toDate","dateRight","diff","getTime","cloneObject","dirtyObject","TypeError","property","MILLISECONDS_IN_MINUTE","MINUTES_IN_DAY","MINUTES_IN_MONTH","MINUTES_IN_YEAR","formatDistanceStrict","dirtyDate","dirtyBaseDate","options","locale","defaultLocale","formatDistance","RangeError","comparison","isNaN","localizeOptions","addSuffix","Boolean","roundingMethodFn","roundingMethod","String","Math","floor","ceil","round","unit","milliseconds","minutes","timezoneOffset","getTimezoneOffsetInMilliseconds","dstNormalizedMinutes","seconds","roundedMinutes","hours","days","months","years","formatDistanceToNowStrict","dirtyOptions","Date","now","_taggedTemplateLiteral","strings","raw","slice","freeze","defineProperties"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkconstruct_hub_webapp=self.webpackChunkconstruct_hub_webapp||[]).push([[51],{55051:function(e,n,t){t.r(n),t.d(n,{default:function(){return we}});var r,a=t(28735),i=t(41712),o=t(777),s=t(93433),l=t(4942),c=t(1413),u=t(29439),d=t(72791),f=t(30791),v=t(59707),h=t(3445),x=t(59534),m=t(16478),g=(r={},(0,l.Z)(r,m.W.NameAsc,"A-Z"),(0,l.Z)(r,m.W.NameDesc,"Z-A"),(0,l.Z)(r,m.W.PublishDateAsc,"Oldest"),(0,l.Z)(r,m.W.PublishDateDesc,"Recently updated"),(0,l.Z)(r,m.W.DownloadsDesc,"Most downloads"),(0,l.Z)(r,m.W.DownloadsAsc,"Least downloads"),r),p=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return x.oJ.apply(void 0,["Search"].concat(n))},j={FILTERS:p("Filters"),RESULTS:p("Results"),SEARCH:p("Search"),SORT:p("Sort")},y=t(75272),b=t(10855),C=t(74817),k=t(80184),S=function(e){var n=e.name,t=e.hint,r=(0,b.Sx)({base:"auto",md:"right"});return(0,k.jsxs)(a.kC,{align:"center",mb:1,children:[(0,k.jsx)(a.X6,{as:"h3",size:"sm",w:"max-content",children:n}),t?(0,k.jsxs)(C.J2,{colorScheme:"dark",placement:r,strategy:"fixed",children:[(0,k.jsx)(C.xo,{children:(0,k.jsx)(a.kC,{"aria-label":"Hint: ".concat(n),as:"button","data-event":(0,x.oJ)(j.FILTERS,n,"Popover"),ml:2,children:(0,k.jsx)(y.UO,{h:3.5,w:3.5})})}),(0,k.jsxs)(C.yk,{bg:"gray.700",borderRadius:"base",color:"white",fontSize:"sm",mx:{base:"1rem",md:"initial"},shadow:"whiteAlpha.300",children:[(0,k.jsx)(C.QH,{bg:"gray.700"}),(0,k.jsx)(C.b,{children:(0,k.jsx)(a.xv,{children:t})})]})]}):null]})},Z=(0,t(88606).$)("searchRedesign",["page","searchDetails","nextPage","prevPage","goToPage","sortButton","sortDropdown","sortItem","filtersPanel","cdkTypeFilter","cdkVersionFilter","filterItem","languagesFilter"]),T=function(e){var n=e["data-testid"],t=e.value,r=e.onValueChange,i=e.options,o=e.name,s=e.hint;return(0,k.jsxs)(a.Kq,{"data-testid":n,spacing:1,children:[(0,k.jsx)(S,{hint:s,name:o}),(0,k.jsx)(h.Ee,{onChange:r,value:t,children:(0,k.jsx)(a.Kq,{spacing:1,children:i.map((function(e){var n=e.display,t=e.value,r=(0,x.oJ)(j.FILTERS,o,"Filter",n);return(0,k.jsx)(h.Y8,{"data-event":r,value:t,children:(0,k.jsx)(a.xv,{color:"textTertiary","data-event":r,"data-testid":Z.filterItem,"data-value":t,isTruncated:!0,children:n})},t)}))})})]})},w=t(29499),R=t(4487),D=function(e){var n=parseInt(e);return"NaN"==="".concat(n)?0:n},E=function(e){return e?decodeURIComponent(e).split(","):[]},F=function(e){return"undefined"===typeof window?null:new URL(window.location.href).searchParams.get(e)},K=function(e,n){var t=(0,R.K)().get(e);return(0,d.useMemo)((function(){return n?n(t):t}),[t])},O=function(){var e;return null!==(e=K(w.Tx.CDK_TYPE))&&void 0!==e?e:void 0},A=function(){return K(w.Tx.CDK_MAJOR,(function(e){return e?D(e):void 0}))},I=function(){return K(w.Tx.KEYWORDS,E)},P=function(){return K(w.Tx.LANGUAGES,E)},L=function(){var e;return null!==(e=K(w.Tx.SEARCH_QUERY))&&void 0!==e?e:""},W=function(){var e;return null!==(e=K(w.Tx.SORT))&&void 0!==e?e:void 0},q=function(){return K(w.Tx.TAGS,E)},M=t(45987),J=t(79271),N=t(19748),V=["offset"],U=function(){var e=(0,J.k6)().push;return(0,d.useCallback)((function(n){var t=null!==n&&void 0!==n?n:{},r=t.offset,a=(0,M.Z)(t,V);e((0,N.yc)((0,c.Z)((0,c.Z)((0,c.Z)({},function(){var e,n,t,r;return{query:null!==(e=F(w.Tx.SEARCH_QUERY))&&void 0!==e?e:"",keywords:E(F(w.Tx.KEYWORDS)),cdkType:null!==(n=F(w.Tx.CDK_TYPE))&&void 0!==n?n:void 0,cdkMajor:function(){var e=F(w.Tx.CDK_MAJOR);return e?D(e):void 0}(),languages:E(F(w.Tx.LANGUAGES)),offset:D(null!==(t=F(w.Tx.OFFSET))&&void 0!==t?t:""),sort:null!==(r=F(w.Tx.SORT))&&void 0!==r?r:void 0,tags:E(F(w.Tx.TAGS))}}()),a),{},{offset:null!==r&&void 0!==r?r:0})))}),[e])},z=function(){var e,n=O(),t=A(),r=U(),a=(0,v.A)(),i=(0,d.useMemo)((function(){var e=a.constructFrameworks,n=Object.entries(e).reduce((function(e,n){var t=(0,u.Z)(n,2),r=t[0],a=t[1];return a.pkgCount<1?e:(0,c.Z)((0,c.Z)({},e),{},(0,l.Z)({},r,(0,c.Z)({display:f.lQ[r],value:r},a)))}),{});return Object.keys(n).length?n:void 0}),[a]),o=(0,d.useMemo)((function(){var e;if(i&&n){var t=null===(e=i[n])||void 0===e?void 0:e.majorVersions;if(t)return(0,s.Z)(t).sort((function(e,n){return e-n})).map((function(e){return{value:e.toString(),display:"".concat(f.lQ[n]," v").concat(e)}}))}}),[i,n]);if(!i)return null;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(T,{"data-testid":Z.cdkTypeFilter,hint:"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKtf for Terraform, or CDK8s for Kubernetes.",name:"CDK Type",onValueChange:function(e){r({cdkType:e?e:void 0,cdkMajor:void 0})},options:[{display:"Any CDK Type",value:""}].concat((0,s.Z)(Object.values(i))),value:null!==n&&void 0!==n?n:""}),!!(o&&o.length>1)&&(0,k.jsx)(T,{"data-testid":Z.cdkVersionFilter,hint:"Choose the major version of the CDK you're using to see only constructs that will work with that version.",name:"CDK Major Version",onValueChange:function(e){var n=void 0;e&&(n=parseInt(e,10)),r({cdkMajor:n})},options:[{display:"Any Major Version",value:""}].concat((0,s.Z)(o)),value:null!==(e=null===t||void 0===t?void 0:t.toString())&&void 0!==e?e:""})]})},H=t(62732),_=t(81070),Y=t(65223),G=t(77231),Q=t(82504),$=function(e){var n=e.display,t=e.value,r=e.isDisabled,i=e.disabledHint,o=e.isChecked,s=e.onChange;return(0,k.jsx)(H.XZ,{isChecked:o,isDisabled:r,onChange:s,children:(0,k.jsx)(_.u,{hasArrow:!0,isDisabled:!r&&!i,label:i,placement:"right",children:(0,k.jsx)(a.xv,{color:"textTertiary","data-testid":Z.filterItem,"data-value":t,isTruncated:!0,children:n})})},t)},B=function(e){var n=e["data-testid"],t=e.initialItemCount,r=e.hint,i=e.name,o=e.options,s=e.values,l=e.onValueChange,u=(0,Y.qY)(),f=(0,x.z$)().trackCustomEvent,v=function(e){return function(){f((0,x.Q5)({name:(0,x.oJ)(j.FILTERS,i,"Filter",e.display)})),l(e.value)}},h=o,m=[];t&&(h=o.slice(0,t),m=o.slice(t,o.length));var g=m.length>0;return(0,k.jsxs)(a.kC,{"data-testid":n,direction:"column",children:[(0,k.jsx)(S,{hint:r,name:i}),(0,k.jsxs)(a.Kq,{mt:1,spacing:1,children:[h.map((function(e){return(0,d.createElement)($,(0,c.Z)((0,c.Z)({},e),{},{isChecked:s.includes(e.value),key:e.value,onChange:v(e)}))})),g&&(0,k.jsx)(G.UO,{animateOpacity:!0,in:u.isOpen,unmountOnExit:!0,children:(0,k.jsx)(a.Kq,{spacing:1,children:m.map((function(e){return(0,d.createElement)($,(0,c.Z)((0,c.Z)({},e),{},{isChecked:s.includes(e.value),key:e.value,onChange:v(e)}))}))})})]}),g&&(0,k.jsx)(a.kC,{align:"start",mt:1,children:(0,k.jsx)(Q.zx,{color:"textTertiary","data-event":(0,x.oJ)(j.FILTERS,i,"Show More"),fontWeight:"normal",leftIcon:u.isOpen?(0,k.jsx)(y.g8,{}):(0,k.jsx)(y.v4,{}),onClick:u.onToggle,size:"sm",textAlign:"left",variant:"link",w:"auto",children:u.isOpen?"Show fewer options (".concat(h.length,")"):"Show more options (".concat(m.length,")")})})]})},X=function(){var e=I(),n=(0,v.A)().keywords,t=U(),r=(0,d.useMemo)((function(){var t=(0,s.Z)(n.entries()).sort((function(e,n){return(0,u.Z)(e,2)[1]<(0,u.Z)(n,2)[1]?1:-1})).filter((function(n){var t=(0,u.Z)(n,1)[0];return!e.includes(t)})).map((function(e){var n=(0,u.Z)(e,1)[0];return{display:n,value:n}})).slice(0,25),r=e.filter((function(e){return!t.some((function(n){return n.value===e}))}));return[].concat((0,s.Z)(r.map((function(e){return{display:e,value:e}}))),(0,s.Z)(t))}),[n,e]);return(0,k.jsx)(B,{"data-testid":Z.languagesFilter,hint:"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.",initialItemCount:5,name:"Keywords",onValueChange:function(n){t({keywords:e.includes(n)?e.filter((function(e){return e!==n})):[].concat((0,s.Z)(e),[n])})},options:r,values:e})},ee=t(86617),ne=Object.entries(ee.k8).map((function(e){var n=(0,u.Z)(e,2),t=n[0],r=n[1];return(0,c.Z)({display:r,value:t},ee.dX.has(t)?{isDisabled:!1}:{isDisabled:!0,disabledHint:"".concat(ee.k8[t]," support is coming soon!")})})).sort((function(e,n){return e.isDisabled>n.isDisabled?1:-1})),te=function(){var e=P(),n=U();return(0,k.jsx)(B,{"data-testid":Z.languagesFilter,hint:"Choose one or more languages. Results include constructs for use with at least one of the selected languages.",name:"Programming Language",onValueChange:function(t){var r=t;n({languages:e.includes(r)?e.filter((function(e){return e!==r})):[].concat((0,s.Z)(e),[r])})},options:ne,values:e})},re=t(56804),ae=function(){var e=(0,re.E)("packageTags"),n=(0,re.E)("packageTagGroups"),t=(0,d.useMemo)((function(){var t,r=new Map;return null===n||void 0===n||n.forEach((function(e){r.set(e.id,e)})),function(e,n){return e.reduce((function(e,t){var r,a,i,o=null===(r=t.searchFilter)||void 0===r?void 0:r.groupBy,u=o?n.get(o):void 0;if(o&&u){var d=e[o];return d?(d.tags=[].concat((0,s.Z)(d.tags),[t]),e):(0,c.Z)((0,c.Z)({},e),{},(0,l.Z)({},o,(0,c.Z)((0,c.Z)({},u),{},{tags:[t]})))}return o?(0,c.Z)((0,c.Z)({},e),{},(0,l.Z)({},o,{id:o,tags:[].concat((0,s.Z)(null!==(a=null===e||void 0===e||null===(i=e[o])||void 0===i?void 0:i.tags)&&void 0!==a?a:[]),[t])})):e}),{})}(null!==(t=null===e||void 0===e?void 0:e.filter((function(e){return Boolean(e.searchFilter)})))&&void 0!==t?t:[],r)}),[e,n]),r=q(),a=U(),i=function(e){a({tags:r.includes(e)?r.filter((function(n){return n!==e})):[].concat((0,s.Z)(r),[e])})},o=(0,d.useCallback)((function(e){var n,i,o=new Set((null!==(n=null===(i=t[e])||void 0===i?void 0:i.tags)&&void 0!==n?n:[]).map((function(e){return e.id})));return function(e){var n=r.filter((function(e){return!o.has(e)}));a({tags:e?[].concat((0,s.Z)(n),[e]):n})}}),[t,r,a]);return(0,k.jsx)(k.Fragment,{children:Object.values(t).map((function(e){var n,t,a=e.filterType,l=e.id,u=e.label,f=e.tooltip,v=e.tags,h={hint:f,name:null!==u&&void 0!==u?u:l,options:v.map((function(e){return{display:e.searchFilter.display,value:e.id}}))};return"radio"===a?(0,d.createElement)(T,(0,c.Z)((0,c.Z)({},h),{},{key:l,onValueChange:o(l),options:[{display:"Any ".concat(h.name),value:""}].concat((0,s.Z)(h.options)),value:null!==(n=null===(t=v.find((function(e){return r.includes(e.id)})))||void 0===t?void 0:t.id)&&void 0!==n?n:""})):(0,d.createElement)(B,(0,c.Z)((0,c.Z)({},h),{},{key:l,onValueChange:i,values:r}))}))})},ie="5.75rem",oe=function(){return(0,k.jsx)(o.Z,{borderRadius:"sm","data-testid":Z.filtersPanel,display:{base:"none",md:"flex"},maxH:"calc(100vh - ".concat(ie," - 1.25rem)"),maxW:"23rem",minW:"100%",overflow:"hidden auto",p:4,pos:"sticky",top:ie,zIndex:"docked",children:(0,k.jsxs)(a.Kq,{color:"textPrimary",h:"max-content",spacing:4,top:4,children:[(0,k.jsx)(a.X6,{as:"h2",size:"sm",children:"Filters"}),(0,k.jsx)(z,{}),(0,k.jsx)(te,{}),(0,k.jsx)(ae,{}),(0,k.jsx)(X,{})]})})},se=t(92213),le=t(64159),ce=(0,l.Z)({},le.$.Wide,(function(e){var n=e["data-event"],t=e.items;return(0,k.jsx)(a.Kq,{spacing:4,children:t.map((function(e){return(0,k.jsx)(le.L,{"data-event":n,pkg:e,variant:le.$.Wide},"".concat(e.name,"-").concat(e.version))}))})})),ue=(0,d.memo)((function(e){var n=e["data-event"],t=e.cardView,r=void 0===t?le.$.Wide:t,i=e.items;if(e.loading||!i)return(0,k.jsx)(a.M5,{children:(0,k.jsx)(se.$,{size:"xl"})});var o=ce[r];return(0,k.jsx)(o,{"data-event":n,items:i})}));ue.displayName="PackageList";var de=t(45832),fe=function(e){var n=e["data-event"],t=e["data-testid"],r=e.icon,a=e.label,i=e.onClick,o={"aria-label":a,borderRadius:"md",borderColor:"blue.500",colorScheme:"blue","data-event":n,"data-testid":t,icon:(0,k.jsx)(r,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return(0,k.jsx)(Q.hU,(0,c.Z)((0,c.Z)({},o),{},{disabled:!i,onClick:i}))},ve=t(95798),he=function(e){var n=e["data-event"],t=e["data-testid"],r=e.pageLimit,i=e.offset,o=U(),s=(0,x.z$)().trackCustomEvent,l=(0,d.useState)((i+1).toString()),c=(0,u.Z)(l,2),f=c[0],v=c[1];(0,d.useEffect)((function(){v((i+1).toString())}),[i]);return(0,k.jsxs)(a.kC,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),o({offset:parseInt(f)-1})},children:[(0,k.jsx)(ve.II,{"aria-label":"Jump to page",colorScheme:"brand","data-testid":t,h:10,max:r+1,min:1,name:"page",onChange:function(e){e.preventDefault(),v(e.target.value)},onFocus:function(){n&&s((0,x.Q5)({name:n}))},p:0,textAlign:"center",type:"number",value:f,w:10}),(0,k.jsxs)(a.xv,{ml:2,w:"max-content",children:["of ",r+1]})]})},xe=function(e){var n=e.offset,t=e.pageLimit,r=U(),i=n<t?function(){return r({offset:n+1})}:void 0,o=n>0?function(){return r({offset:n-1})}:void 0;return(0,k.jsxs)(a.Kq,{align:"center",direction:"row",justify:"space-between",maxW:"18rem",mx:"auto",spacing:4,w:"full",children:[(0,k.jsx)(fe,{"data-event":(0,x.oJ)(j.RESULTS,"Previous Page"),"data-testid":Z.prevPage,icon:y.wy,label:"Previous page button",onClick:o}),(0,k.jsx)(he,{"data-event":(0,x.oJ)(j.RESULTS,"Go to Page"),"data-testid":Z.goToPage,offset:n,pageLimit:t}),(0,k.jsx)(fe,{"data-event":(0,x.oJ)(j.RESULTS,"Next Page"),"data-testid":Z.nextPage,icon:y.XC,label:"Next page button",onClick:i})]})},me=t(99185),ge=function(){var e=L(),n=U(),t=(0,d.useState)(null!==e&&void 0!==e?e:""),r=(0,u.Z)(t,2),a=r[0],i=r[1];return(0,k.jsx)(me.E1,{bg:"bgSecondary","data-event":j.SEARCH,onChange:function(e){return i(e.target.value)},onSubmit:function(e){e.preventDefault(),n({query:a,sort:void 0})},value:a})},pe=function(e){var n=e.children;return(0,k.jsx)(a.xv,{as:"strong",color:"textSecondary",children:n})},je=function(e){var n=e.first,t=e.count,r=e.last;return!n&&r>=t?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(pe,{children:t})," of ",(0,k.jsx)(pe,{children:t})]}):(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(pe,{children:[t?n+1:t," - ",r>t?t:r]})," ","of ",(0,k.jsx)(pe,{children:t})]})},ye=function(e){var n=e.limit,t=e.offset,r=e.count,i=e.filtered,o=e.query,s=n*t,l=s+n,c=r>0;return(0,k.jsxs)(a.xv,{"data-testid":Z.searchDetails,children:[c?(0,k.jsxs)(k.Fragment,{children:["Displaying ",(0,k.jsx)(je,{count:r,first:s,last:l})," ",i?"search results":"constructs"]}):(0,k.jsx)(k.Fragment,{children:i?"There were no search results":"No constructs found"}),o&&(0,k.jsxs)(k.Fragment,{children:[" for ",(0,k.jsx)(pe,{children:o})]}),".",!c&&i&&(0,k.jsx)(k.Fragment,{children:" Try a different term."})]})},be=t(86988),Ce=function(){var e=W(),n=U();return(0,k.jsx)(T,{hint:"Sets the order of search results",name:"Sorted By",onValueChange:function(e){n({sort:e||void 0})},options:[{display:"Relevance",value:""}].concat((0,s.Z)(Object.entries(g).map((function(e){var n=(0,u.Z)(e,2),t=n[0];return{display:n[1],value:t}})))),value:null!==e&&void 0!==e?e:""})},ke=function(){var e=(0,Y.qY)();return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(Q.zx,{colorScheme:"brand",display:{md:"none"},onClick:e.onOpen,rightIcon:(0,k.jsx)(y.v4,{}),variant:"link",children:"Sorting and Filters"}),(0,k.jsxs)(be.dy,(0,c.Z)((0,c.Z)({},e),{},{placement:"bottom",children:[(0,k.jsx)(be.P1,{}),(0,k.jsxs)(be.sc,{color:"textPrimary",maxH:"full",children:[(0,k.jsx)(be.OX,{borderBottom:"base",children:"Sorting and Filters"}),(0,k.jsx)(be.cC,{}),(0,k.jsx)(be.Ng,{children:(0,k.jsxs)(a.Kq,{color:"textPrimary",pb:4,spacing:4,children:[(0,k.jsx)(Ce,{}),(0,k.jsx)(z,{}),(0,k.jsx)(te,{}),(0,k.jsx)(ae,{}),(0,k.jsx)(X,{})]})})]})]}))]})},Se=t(81641),Ze=function(){var e=W(),n=U(),t=e?g[e]:"Relevance";return(0,k.jsxs)(a.kC,{align:"center",children:[(0,k.jsx)(a.xv,{children:"Sorted by"}),(0,k.jsxs)(Se.v2,{children:[(0,k.jsx)(Se.j2,{as:Q.zx,color:"link","data-event":(0,x.oJ)(j.SORT,"Menu"),"data-testid":Z.sortButton,ml:2,pl:2,pr:2,py:1,rightIcon:(0,k.jsx)(y.v4,{}),variant:"link",children:t}),(0,k.jsxs)(Se.qy,{"data-testid":Z.sortDropdown,minW:"180",zIndex:"sticky",children:[(0,k.jsx)(Se.sN,{"data-event":(0,x.oJ)(j.SORT,"Option","Relevance"),"data-testid":Z.sortItem,"data-value":"",onClick:function(){return n({sort:void 0})},children:"Relevance"},"Relevance"),Object.entries(g).map((function(e){var t=(0,u.Z)(e,2),r=t[0],a=t[1];return(0,k.jsx)(Se.sN,{"data-event":(0,x.oJ)(j.SORT,"Option",a),"data-testid":Z.sortItem,"data-value":r,onClick:function(){return n({sort:r})},children:a},r)}))]})]})]})},Te=function(){var e=U(),n=K(w.Tx.OFFSET,(function(e){return D(null!==e&&void 0!==e?e:"")})),t=L(),r=I(),o=P(),s=A(),l=O(),c=W(),u=q(),f=(0,de.D)({offset:n,limit:25,query:t,keywords:r,languages:o,cdkMajor:s,cdkType:l,sort:c,tags:u}),v=f.page,h=f.pageLimit,x=f.results;return(0,d.useEffect)((function(){x.length&&(n<0||n>h)&&e(n<0?{offset:0}:{offset:h})}),[x,n,h]),(0,d.useEffect)((function(){window.scrollTo(0,0)}),[v]),(0,k.jsx)(i.T,{meta:{title:t||"Search",description:t?"".concat(x.length," results for ").concat(t," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:(0,k.jsxs)(a.Kq,{direction:"column",maxW:"100vw",pb:4,px:4,spacing:4,children:[(0,k.jsx)(ge,{}),(0,k.jsxs)(a.Kq,{align:{base:"start",lg:"center"},direction:{base:"column-reverse",lg:"row"},justify:{base:"initial",lg:"space-between"},spacing:4,children:[(0,k.jsx)(ye,{count:x.length,filtered:!!t,limit:25,offset:n,query:t}),(0,k.jsx)(a.xu,{display:{base:"none",md:"initial"},children:(0,k.jsx)(Ze,{})}),(0,k.jsx)(a.xu,{display:{md:"none"},children:(0,k.jsx)(ke,{})})]}),(0,k.jsx)(ue,{"data-event":j.RESULTS,items:v}),(0,k.jsx)(a.xu,{w:"full",children:(0,k.jsx)(xe,{offset:n,pageLimit:h})})]})})},we=function(){return(0,k.jsx)(i.T,{meta:{title:"Search - Construct Hub",description:"Search Construct Libraries for AWS CDK, CDK8s, and CDKtf"},pageName:"search",children:(0,k.jsxs)(a.rj,{"data-testid":Z.page,gap:4,h:"full",maxW:"100%",px:{base:0,md:6},py:6,templateColumns:{base:"1fr",md:"auto 1fr"},templateRows:"1fr",children:[(0,k.jsx)(oe,{}),(0,k.jsx)(Te,{})]})})}}}]);
|
|
2
|
-
//# sourceMappingURL=51.
|
|
1
|
+
"use strict";(self.webpackChunkconstruct_hub_webapp=self.webpackChunkconstruct_hub_webapp||[]).push([[51],{55051:function(e,n,t){t.r(n),t.d(n,{default:function(){return we}});var r,a=t(28735),i=t(41712),o=t(777),s=t(93433),l=t(4942),c=t(1413),u=t(29439),d=t(72791),f=t(30791),v=t(59707),h=t(3445),x=t(59534),m=t(16478),g=(r={},(0,l.Z)(r,m.W.NameAsc,"A-Z"),(0,l.Z)(r,m.W.NameDesc,"Z-A"),(0,l.Z)(r,m.W.PublishDateAsc,"Oldest"),(0,l.Z)(r,m.W.PublishDateDesc,"Recently updated"),(0,l.Z)(r,m.W.DownloadsDesc,"Most downloads"),(0,l.Z)(r,m.W.DownloadsAsc,"Least downloads"),r),p=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return x.oJ.apply(void 0,["Search"].concat(n))},j={FILTERS:p("Filters"),RESULTS:p("Results"),SEARCH:p("Search"),SORT:p("Sort")},y=t(75272),b=t(10855),C=t(74817),k=t(80184),S=function(e){var n=e.name,t=e.hint,r=(0,b.Sx)({base:"auto",md:"right"});return(0,k.jsxs)(a.kC,{align:"center",mb:1,children:[(0,k.jsx)(a.X6,{as:"h3",size:"sm",w:"max-content",children:n}),t?(0,k.jsxs)(C.J2,{colorScheme:"dark",placement:r,strategy:"fixed",children:[(0,k.jsx)(C.xo,{children:(0,k.jsx)(a.kC,{"aria-label":"Hint: ".concat(n),as:"button","data-event":(0,x.oJ)(j.FILTERS,n,"Popover"),ml:2,children:(0,k.jsx)(y.UO,{h:3.5,w:3.5})})}),(0,k.jsxs)(C.yk,{bg:"gray.700",borderRadius:"base",color:"white",fontSize:"sm",mx:{base:"1rem",md:"initial"},shadow:"whiteAlpha.300",children:[(0,k.jsx)(C.QH,{bg:"gray.700"}),(0,k.jsx)(C.b,{children:(0,k.jsx)(a.xv,{children:t})})]})]}):null]})},Z=(0,t(88606).$)("searchRedesign",["page","searchDetails","nextPage","prevPage","goToPage","sortButton","sortDropdown","sortItem","filtersPanel","cdkTypeFilter","cdkVersionFilter","filterItem","languagesFilter"]),T=function(e){var n=e["data-testid"],t=e.value,r=e.onValueChange,i=e.options,o=e.name,s=e.hint;return(0,k.jsxs)(a.Kq,{"data-testid":n,spacing:1,children:[(0,k.jsx)(S,{hint:s,name:o}),(0,k.jsx)(h.Ee,{onChange:r,value:t,children:(0,k.jsx)(a.Kq,{spacing:1,children:i.map((function(e){var n=e.display,t=e.value,r=(0,x.oJ)(j.FILTERS,o,"Filter",n);return(0,k.jsx)(h.Y8,{"data-event":r,value:t,children:(0,k.jsx)(a.xv,{color:"textTertiary","data-event":r,"data-testid":Z.filterItem,"data-value":t,isTruncated:!0,children:n})},t)}))})})]})},w=t(29499),R=t(4487),D=function(e){var n=parseInt(e);return"NaN"==="".concat(n)?0:n},E=function(e){return e?decodeURIComponent(e).split(","):[]},F=function(e){return"undefined"===typeof window?null:new URL(window.location.href).searchParams.get(e)},K=function(e,n){var t=(0,R.K)().get(e);return(0,d.useMemo)((function(){return n?n(t):t}),[t])},O=function(){var e;return null!==(e=K(w.Tx.CDK_TYPE))&&void 0!==e?e:void 0},A=function(){return K(w.Tx.CDK_MAJOR,(function(e){return e?D(e):void 0}))},I=function(){return K(w.Tx.KEYWORDS,E)},P=function(){return K(w.Tx.LANGUAGES,E)},L=function(){var e;return null!==(e=K(w.Tx.SEARCH_QUERY))&&void 0!==e?e:""},W=function(){var e;return null!==(e=K(w.Tx.SORT))&&void 0!==e?e:void 0},q=function(){return K(w.Tx.TAGS,E)},M=t(45987),J=t(79271),N=t(19748),V=["offset"],U=function(){var e=(0,J.k6)().push;return(0,d.useCallback)((function(n){var t=null!==n&&void 0!==n?n:{},r=t.offset,a=(0,M.Z)(t,V);e((0,N.yc)((0,c.Z)((0,c.Z)((0,c.Z)({},function(){var e,n,t,r;return{query:null!==(e=F(w.Tx.SEARCH_QUERY))&&void 0!==e?e:"",keywords:E(F(w.Tx.KEYWORDS)),cdkType:null!==(n=F(w.Tx.CDK_TYPE))&&void 0!==n?n:void 0,cdkMajor:function(){var e=F(w.Tx.CDK_MAJOR);return e?D(e):void 0}(),languages:E(F(w.Tx.LANGUAGES)),offset:D(null!==(t=F(w.Tx.OFFSET))&&void 0!==t?t:""),sort:null!==(r=F(w.Tx.SORT))&&void 0!==r?r:void 0,tags:E(F(w.Tx.TAGS))}}()),a),{},{offset:null!==r&&void 0!==r?r:0})))}),[e])},z=function(){var e,n=O(),t=A(),r=U(),a=(0,v.A)(),i=(0,d.useMemo)((function(){var e=a.constructFrameworks,n=Object.entries(e).reduce((function(e,n){var t=(0,u.Z)(n,2),r=t[0],a=t[1];return a.pkgCount<1?e:(0,c.Z)((0,c.Z)({},e),{},(0,l.Z)({},r,(0,c.Z)({display:f.lQ[r],value:r},a)))}),{});return Object.keys(n).length?n:void 0}),[a]),o=(0,d.useMemo)((function(){var e;if(i&&n){var t=null===(e=i[n])||void 0===e?void 0:e.majorVersions;if(t)return(0,s.Z)(t).sort((function(e,n){return e-n})).map((function(e){return{value:e.toString(),display:"".concat(f.lQ[n]," v").concat(e)}}))}}),[i,n]);if(!i)return null;return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(T,{"data-testid":Z.cdkTypeFilter,hint:"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKtf for Terraform, or CDK8s for Kubernetes.",name:"CDK Type",onValueChange:function(e){r({cdkType:e?e:void 0,cdkMajor:void 0})},options:[{display:"Any CDK Type",value:""}].concat((0,s.Z)(Object.values(i))),value:null!==n&&void 0!==n?n:""}),!!(o&&o.length>1)&&(0,k.jsx)(T,{"data-testid":Z.cdkVersionFilter,hint:"Choose the major version of the CDK you're using to see only constructs that will work with that version.",name:"CDK Major Version",onValueChange:function(e){var n=void 0;e&&(n=parseInt(e,10)),r({cdkMajor:n})},options:[{display:"Any Major Version",value:""}].concat((0,s.Z)(o)),value:null!==(e=null===t||void 0===t?void 0:t.toString())&&void 0!==e?e:""})]})},H=t(62732),_=t(81070),Y=t(65223),G=t(77231),Q=t(82504),$=function(e){var n=e.display,t=e.value,r=e.isDisabled,i=e.disabledHint,o=e.isChecked,s=e.onChange;return(0,k.jsx)(H.XZ,{isChecked:o,isDisabled:r,onChange:s,children:(0,k.jsx)(_.u,{hasArrow:!0,isDisabled:!r&&!i,label:i,placement:"right",children:(0,k.jsx)(a.xv,{color:"textTertiary","data-testid":Z.filterItem,"data-value":t,isTruncated:!0,children:n})})},t)},B=function(e){var n=e["data-testid"],t=e.initialItemCount,r=e.hint,i=e.name,o=e.options,s=e.values,l=e.onValueChange,u=(0,Y.qY)(),f=(0,x.z$)().trackCustomEvent,v=function(e){return function(){f((0,x.Q5)({name:(0,x.oJ)(j.FILTERS,i,"Filter",e.display)})),l(e.value)}},h=o,m=[];t&&(h=o.slice(0,t),m=o.slice(t,o.length));var g=m.length>0;return(0,k.jsxs)(a.kC,{"data-testid":n,direction:"column",children:[(0,k.jsx)(S,{hint:r,name:i}),(0,k.jsxs)(a.Kq,{mt:1,spacing:1,children:[h.map((function(e){return(0,d.createElement)($,(0,c.Z)((0,c.Z)({},e),{},{isChecked:s.includes(e.value),key:e.value,onChange:v(e)}))})),g&&(0,k.jsx)(G.UO,{animateOpacity:!0,in:u.isOpen,unmountOnExit:!0,children:(0,k.jsx)(a.Kq,{spacing:1,children:m.map((function(e){return(0,d.createElement)($,(0,c.Z)((0,c.Z)({},e),{},{isChecked:s.includes(e.value),key:e.value,onChange:v(e)}))}))})})]}),g&&(0,k.jsx)(a.kC,{align:"start",mt:1,children:(0,k.jsx)(Q.zx,{color:"textTertiary","data-event":(0,x.oJ)(j.FILTERS,i,"Show More"),fontWeight:"normal",leftIcon:u.isOpen?(0,k.jsx)(y.g8,{}):(0,k.jsx)(y.v4,{}),onClick:u.onToggle,size:"sm",textAlign:"left",variant:"link",w:"auto",children:u.isOpen?"Show fewer options (".concat(h.length,")"):"Show more options (".concat(m.length,")")})})]})},X=function(){var e=I(),n=(0,v.A)().keywords,t=U(),r=(0,d.useMemo)((function(){var t=(0,s.Z)(n.entries()).sort((function(e,n){return(0,u.Z)(e,2)[1]<(0,u.Z)(n,2)[1]?1:-1})).filter((function(n){var t=(0,u.Z)(n,1)[0];return!e.includes(t)})).map((function(e){var n=(0,u.Z)(e,1)[0];return{display:n,value:n}})).slice(0,25),r=e.filter((function(e){return!t.some((function(n){return n.value===e}))}));return[].concat((0,s.Z)(r.map((function(e){return{display:e,value:e}}))),(0,s.Z)(t))}),[n,e]);return(0,k.jsx)(B,{"data-testid":Z.languagesFilter,hint:"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.",initialItemCount:5,name:"Keywords",onValueChange:function(n){t({keywords:e.includes(n)?e.filter((function(e){return e!==n})):[].concat((0,s.Z)(e),[n])})},options:r,values:e})},ee=t(86617),ne=Object.entries(ee.k8).map((function(e){var n=(0,u.Z)(e,2),t=n[0],r=n[1];return(0,c.Z)({display:r,value:t},ee.dX.has(t)?{isDisabled:!1}:{isDisabled:!0,disabledHint:"".concat(ee.k8[t]," support is coming soon!")})})).sort((function(e,n){return e.isDisabled>n.isDisabled?1:-1})),te=function(){var e=P(),n=U();return(0,k.jsx)(B,{"data-testid":Z.languagesFilter,hint:"Choose one or more languages. Results include constructs for use with at least one of the selected languages.",name:"Programming Language",onValueChange:function(t){var r=t;n({languages:e.includes(r)?e.filter((function(e){return e!==r})):[].concat((0,s.Z)(e),[r])})},options:ne,values:e})},re=t(56804),ae=function(){var e=(0,re.E)("packageTags"),n=(0,re.E)("packageTagGroups"),t=(0,d.useMemo)((function(){var t,r=new Map;return null===n||void 0===n||n.forEach((function(e){r.set(e.id,e)})),function(e,n){return e.reduce((function(e,t){var r,a,i,o=null===(r=t.searchFilter)||void 0===r?void 0:r.groupBy,u=o?n.get(o):void 0;if(o&&u){var d=e[o];return d?(d.tags=[].concat((0,s.Z)(d.tags),[t]),e):(0,c.Z)((0,c.Z)({},e),{},(0,l.Z)({},o,(0,c.Z)((0,c.Z)({},u),{},{tags:[t]})))}return o?(0,c.Z)((0,c.Z)({},e),{},(0,l.Z)({},o,{id:o,tags:[].concat((0,s.Z)(null!==(a=null===e||void 0===e||null===(i=e[o])||void 0===i?void 0:i.tags)&&void 0!==a?a:[]),[t])})):e}),{})}(null!==(t=null===e||void 0===e?void 0:e.filter((function(e){return Boolean(e.searchFilter)})))&&void 0!==t?t:[],r)}),[e,n]),r=q(),a=U(),i=function(e){a({tags:r.includes(e)?r.filter((function(n){return n!==e})):[].concat((0,s.Z)(r),[e])})},o=(0,d.useCallback)((function(e){var n,i,o=new Set((null!==(n=null===(i=t[e])||void 0===i?void 0:i.tags)&&void 0!==n?n:[]).map((function(e){return e.id})));return function(e){var n=r.filter((function(e){return!o.has(e)}));a({tags:e?[].concat((0,s.Z)(n),[e]):n})}}),[t,r,a]);return(0,k.jsx)(k.Fragment,{children:Object.values(t).map((function(e){var n,t,a=e.filterType,l=e.id,u=e.label,f=e.tooltip,v=e.tags,h={hint:f,name:null!==u&&void 0!==u?u:l,options:v.map((function(e){return{display:e.searchFilter.display,value:e.id}}))};return"radio"===a?(0,d.createElement)(T,(0,c.Z)((0,c.Z)({},h),{},{key:l,onValueChange:o(l),options:[{display:"Any ".concat(h.name),value:""}].concat((0,s.Z)(h.options)),value:null!==(n=null===(t=v.find((function(e){return r.includes(e.id)})))||void 0===t?void 0:t.id)&&void 0!==n?n:""})):(0,d.createElement)(B,(0,c.Z)((0,c.Z)({},h),{},{key:l,onValueChange:i,values:r}))}))})},ie="5.75rem",oe=function(){return(0,k.jsx)(o.Z,{borderRadius:"sm","data-testid":Z.filtersPanel,display:{base:"none",md:"flex"},maxH:"calc(100vh - ".concat(ie," - 1.25rem)"),maxW:"23rem",minW:"100%",overflow:"hidden auto",p:4,pos:"sticky",top:ie,zIndex:"docked",children:(0,k.jsxs)(a.Kq,{color:"textPrimary",h:"max-content",spacing:4,top:4,children:[(0,k.jsx)(a.X6,{as:"h2",size:"sm",children:"Filters"}),(0,k.jsx)(z,{}),(0,k.jsx)(te,{}),(0,k.jsx)(ae,{}),(0,k.jsx)(X,{})]})})},se=t(92213),le=t(64159),ce=(0,l.Z)({},le.$.Wide,(function(e){var n=e["data-event"],t=e.items;return(0,k.jsx)(a.Kq,{spacing:4,children:t.map((function(e){return(0,k.jsx)(le.L,{"data-event":n,pkg:e,variant:le.$.Wide},"".concat(e.name,"-").concat(e.version))}))})})),ue=(0,d.memo)((function(e){var n=e["data-event"],t=e.cardView,r=void 0===t?le.$.Wide:t,i=e.items;if(e.loading||!i)return(0,k.jsx)(a.M5,{children:(0,k.jsx)(se.$,{size:"xl"})});var o=ce[r];return(0,k.jsx)(o,{"data-event":n,items:i})}));ue.displayName="PackageList";var de=t(45832),fe=function(e){var n=e["data-event"],t=e["data-testid"],r=e.icon,a=e.label,i=e.onClick,o={"aria-label":a,borderRadius:"md",borderColor:"blue.500",colorScheme:"blue","data-event":n,"data-testid":t,icon:(0,k.jsx)(r,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return(0,k.jsx)(Q.hU,(0,c.Z)((0,c.Z)({},o),{},{disabled:!i,onClick:i}))},ve=t(95798),he=function(e){var n=e["data-event"],t=e["data-testid"],r=e.pageLimit,i=e.offset,o=U(),s=(0,x.z$)().trackCustomEvent,l=(0,d.useState)((i+1).toString()),c=(0,u.Z)(l,2),f=c[0],v=c[1];(0,d.useEffect)((function(){v((i+1).toString())}),[i]);return(0,k.jsxs)(a.kC,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),o({offset:parseInt(f)-1})},children:[(0,k.jsx)(ve.II,{"aria-label":"Jump to page",colorScheme:"brand","data-testid":t,h:10,max:r+1,min:1,name:"page",onChange:function(e){e.preventDefault(),v(e.target.value)},onFocus:function(){n&&s((0,x.Q5)({name:n}))},p:0,textAlign:"center",type:"number",value:f,w:10}),(0,k.jsxs)(a.xv,{ml:2,w:"max-content",children:["of ",r+1]})]})},xe=function(e){var n=e.offset,t=e.pageLimit,r=U(),i=n<t?function(){return r({offset:n+1})}:void 0,o=n>0?function(){return r({offset:n-1})}:void 0;return(0,k.jsxs)(a.Kq,{align:"center",direction:"row",justify:"space-between",maxW:"18rem",mx:"auto",spacing:4,w:"full",children:[(0,k.jsx)(fe,{"data-event":(0,x.oJ)(j.RESULTS,"Previous Page"),"data-testid":Z.prevPage,icon:y.wy,label:"Previous page button",onClick:o}),(0,k.jsx)(he,{"data-event":(0,x.oJ)(j.RESULTS,"Go to Page"),"data-testid":Z.goToPage,offset:n,pageLimit:t}),(0,k.jsx)(fe,{"data-event":(0,x.oJ)(j.RESULTS,"Next Page"),"data-testid":Z.nextPage,icon:y.XC,label:"Next page button",onClick:i})]})},me=t(99185),ge=function(){var e=L(),n=U(),t=(0,d.useState)(null!==e&&void 0!==e?e:""),r=(0,u.Z)(t,2),a=r[0],i=r[1];return(0,k.jsx)(me.E1,{bg:"bgSecondary","data-event":j.SEARCH,onChange:function(e){return i(e.target.value)},onSubmit:function(e){e.preventDefault(),n({query:a,sort:void 0})},value:a})},pe=function(e){var n=e.children;return(0,k.jsx)(a.xv,{as:"strong",color:"textSecondary",children:n})},je=function(e){var n=e.first,t=e.count,r=e.last;return!n&&r>=t?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(pe,{children:t})," of ",(0,k.jsx)(pe,{children:t})]}):(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(pe,{children:[t?n+1:t," - ",r>t?t:r]})," ","of ",(0,k.jsx)(pe,{children:t})]})},ye=function(e){var n=e.limit,t=e.offset,r=e.count,i=e.filtered,o=e.query,s=n*t,l=s+n,c=r>0;return(0,k.jsxs)(a.xv,{"data-testid":Z.searchDetails,children:[c?(0,k.jsxs)(k.Fragment,{children:["Displaying ",(0,k.jsx)(je,{count:r,first:s,last:l})," ",i?"search results":"constructs"]}):(0,k.jsx)(k.Fragment,{children:i?"There were no search results":"No constructs found"}),o&&(0,k.jsxs)(k.Fragment,{children:[" for ",(0,k.jsx)(pe,{children:o})]}),".",!c&&i&&(0,k.jsx)(k.Fragment,{children:" Try a different term."})]})},be=t(65949),Ce=function(){var e=W(),n=U();return(0,k.jsx)(T,{hint:"Sets the order of search results",name:"Sorted By",onValueChange:function(e){n({sort:e||void 0})},options:[{display:"Relevance",value:""}].concat((0,s.Z)(Object.entries(g).map((function(e){var n=(0,u.Z)(e,2),t=n[0];return{display:n[1],value:t}})))),value:null!==e&&void 0!==e?e:""})},ke=function(){var e=(0,Y.qY)();return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(Q.zx,{colorScheme:"brand",display:{md:"none"},onClick:e.onOpen,rightIcon:(0,k.jsx)(y.v4,{}),variant:"link",children:"Sorting and Filters"}),(0,k.jsxs)(be.dy,(0,c.Z)((0,c.Z)({},e),{},{placement:"bottom",children:[(0,k.jsx)(be.P1,{}),(0,k.jsxs)(be.sc,{color:"textPrimary",maxH:"full",children:[(0,k.jsx)(be.OX,{borderBottom:"base",children:"Sorting and Filters"}),(0,k.jsx)(be.cC,{}),(0,k.jsx)(be.Ng,{children:(0,k.jsxs)(a.Kq,{color:"textPrimary",pb:4,spacing:4,children:[(0,k.jsx)(Ce,{}),(0,k.jsx)(z,{}),(0,k.jsx)(te,{}),(0,k.jsx)(ae,{}),(0,k.jsx)(X,{})]})})]})]}))]})},Se=t(81641),Ze=function(){var e=W(),n=U(),t=e?g[e]:"Relevance";return(0,k.jsxs)(a.kC,{align:"center",children:[(0,k.jsx)(a.xv,{children:"Sorted by"}),(0,k.jsxs)(Se.v2,{children:[(0,k.jsx)(Se.j2,{as:Q.zx,color:"link","data-event":(0,x.oJ)(j.SORT,"Menu"),"data-testid":Z.sortButton,ml:2,pl:2,pr:2,py:1,rightIcon:(0,k.jsx)(y.v4,{}),variant:"link",children:t}),(0,k.jsxs)(Se.qy,{"data-testid":Z.sortDropdown,minW:"180",zIndex:"sticky",children:[(0,k.jsx)(Se.sN,{"data-event":(0,x.oJ)(j.SORT,"Option","Relevance"),"data-testid":Z.sortItem,"data-value":"",onClick:function(){return n({sort:void 0})},children:"Relevance"},"Relevance"),Object.entries(g).map((function(e){var t=(0,u.Z)(e,2),r=t[0],a=t[1];return(0,k.jsx)(Se.sN,{"data-event":(0,x.oJ)(j.SORT,"Option",a),"data-testid":Z.sortItem,"data-value":r,onClick:function(){return n({sort:r})},children:a},r)}))]})]})]})},Te=function(){var e=U(),n=K(w.Tx.OFFSET,(function(e){return D(null!==e&&void 0!==e?e:"")})),t=L(),r=I(),o=P(),s=A(),l=O(),c=W(),u=q(),f=(0,de.D)({offset:n,limit:25,query:t,keywords:r,languages:o,cdkMajor:s,cdkType:l,sort:c,tags:u}),v=f.page,h=f.pageLimit,x=f.results;return(0,d.useEffect)((function(){x.length&&(n<0||n>h)&&e(n<0?{offset:0}:{offset:h})}),[x,n,h]),(0,d.useEffect)((function(){window.scrollTo(0,0)}),[v]),(0,k.jsx)(i.T,{meta:{title:t||"Search",description:t?"".concat(x.length," results for ").concat(t," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:(0,k.jsxs)(a.Kq,{direction:"column",maxW:"100vw",pb:4,px:4,spacing:4,children:[(0,k.jsx)(ge,{}),(0,k.jsxs)(a.Kq,{align:{base:"start",lg:"center"},direction:{base:"column-reverse",lg:"row"},justify:{base:"initial",lg:"space-between"},spacing:4,children:[(0,k.jsx)(ye,{count:x.length,filtered:!!t,limit:25,offset:n,query:t}),(0,k.jsx)(a.xu,{display:{base:"none",md:"initial"},children:(0,k.jsx)(Ze,{})}),(0,k.jsx)(a.xu,{display:{md:"none"},children:(0,k.jsx)(ke,{})})]}),(0,k.jsx)(ue,{"data-event":j.RESULTS,items:v}),(0,k.jsx)(a.xu,{w:"full",children:(0,k.jsx)(xe,{offset:n,pageLimit:h})})]})})},we=function(){return(0,k.jsx)(i.T,{meta:{title:"Search - Construct Hub",description:"Search Construct Libraries for AWS CDK, CDK8s, and CDKtf"},pageName:"search",children:(0,k.jsxs)(a.rj,{"data-testid":Z.page,gap:4,h:"full",maxW:"100%",px:{base:0,md:6},py:6,templateColumns:{base:"1fr",md:"auto 1fr"},templateRows:"1fr",children:[(0,k.jsx)(oe,{}),(0,k.jsx)(Te,{})]})})}}}]);
|
|
2
|
+
//# sourceMappingURL=51.a319b42f.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/51.3b58a25f.chunk.js","mappings":"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","sources":["views/Search/constants.ts","views/Search/FilterHeading.tsx","views/Search/testIds.ts","views/Search/RadioFilter.tsx","views/Search/util.ts","views/Search/useSearchParam.ts","views/Search/useUpdateSearchParam.ts","views/Search/CDKFilter.tsx","views/Search/CheckboxFilter.tsx","views/Search/KeywordsFilter.tsx","views/Search/LanguageFilter.tsx","views/Search/TagFilter.tsx","views/Search/FilterPanel.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/Search/ArrowButton.tsx","views/Search/GoToPage.tsx","views/Search/PageControls.tsx","views/Search/SearchBar.tsx","views/Search/SearchDetails.tsx","views/Search/SortFilter.tsx","views/Search/SortAndFilterDrawer.tsx","views/Search/SortedBy.tsx","views/Search/SearchResults.tsx","views/Search/Search.tsx"],"sourcesContent":["import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nconst LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest\",\n [CatalogSearchSort.PublishDateDesc]: \"Recently updated\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n\nconst searchEvent: typeof eventName = (...e) => eventName(\"Search\", ...e);\n\nexport const SEARCH_ANALYTICS = {\n FILTERS: searchEvent(\"Filters\"),\n RESULTS: searchEvent(\"Results\"),\n SEARCH: searchEvent(\"Search\"),\n SORT: searchEvent(\"Sort\"),\n};\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n useBreakpointValue,\n PlacementWithLogical,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n const placement = useBreakpointValue<PlacementWithLogical>({\n base: \"auto\",\n md: \"right\",\n });\n\n return (\n <Flex align=\"center\" mb={1}>\n <Heading as=\"h3\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement={placement} strategy=\"fixed\">\n <PopoverTrigger>\n <Flex\n aria-label={`Hint: ${name}`}\n as=\"button\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Popover\")}\n ml={2}\n >\n <QuestionIcon h={3.5} w={3.5} />\n </Flex>\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n borderRadius=\"base\"\n color=\"white\"\n fontSize=\"sm\"\n mx={{ base: \"1rem\", md: \"initial\" }}\n shadow=\"whiteAlpha.300\"\n >\n <PopoverArrow bg=\"gray.700\" />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\n \"page\",\n // Results\n \"searchDetails\",\n \"nextPage\",\n \"prevPage\",\n \"goToPage\",\n // Sorting\n \"sortButton\",\n \"sortDropdown\",\n \"sortItem\",\n // Filters Panel\n \"filtersPanel\",\n \"cdkTypeFilter\",\n \"cdkVersionFilter\",\n \"filterItem\",\n \"languagesFilter\",\n] as const);\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n \"data-testid\"?: string;\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 \"data-testid\": dataTestid,\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack data-testid={dataTestid} spacing={1}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack spacing={1}>\n {options.map(({ display, value }) => {\n const dataEvent = eventName(\n SEARCH_ANALYTICS.FILTERS,\n name,\n \"Filter\",\n display\n );\n return (\n <Radio data-event={dataEvent} key={value} value={value}>\n <Text\n color=\"textTertiary\"\n data-event={dataEvent}\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n );\n })}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\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 parseQueryArray = <T extends string>(\n queryString: string | null\n) => {\n if (!queryString) return [];\n\n return decodeURIComponent(queryString).split(\",\") as T[];\n};\n\nconst getParamFromUrl = (key: string) => {\n if (typeof window === \"undefined\") return null;\n const queryParams = new URL(window.location.href).searchParams;\n return queryParams.get(key);\n};\n\nexport const getSearchUrlParams = () => {\n return {\n query: getParamFromUrl(QUERY_PARAMS.SEARCH_QUERY) ?? \"\",\n keywords: parseQueryArray(getParamFromUrl(QUERY_PARAMS.KEYWORDS)),\n cdkType: (getParamFromUrl(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined,\n cdkMajor: (() => {\n const cdkMajorParam = getParamFromUrl(QUERY_PARAMS.CDK_MAJOR);\n return cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n })(),\n languages: parseQueryArray(\n getParamFromUrl(QUERY_PARAMS.LANGUAGES)\n ) as Language[],\n offset: toNum(getParamFromUrl(QUERY_PARAMS.OFFSET) ?? \"\"),\n sort:\n (getParamFromUrl(QUERY_PARAMS.SORT) as CatalogSearchSort) ?? undefined,\n tags: parseQueryArray(getParamFromUrl(QUERY_PARAMS.TAGS)),\n };\n};\n","import { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { parseQueryArray, toNum } from \"./util\";\n\nconst useSearchParam = <T = string | null>(\n key: string,\n transform?: (param: string | null) => T\n): T => {\n const queryParams = useQueryParams();\n const qp = queryParams.get(key);\n\n return useMemo(\n () => (transform ? transform(qp) : (qp as unknown as T)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [qp]\n );\n};\n\nexport const useCdkType = () => {\n const cdkType: CDKType | undefined =\n useSearchParam(QUERY_PARAMS.CDK_TYPE) ?? undefined;\n\n return cdkType;\n};\n\nexport const useCdkMajor = () => {\n const cdkMajor: number | undefined = useSearchParam(\n QUERY_PARAMS.CDK_MAJOR,\n (p) => (p ? toNum(p) : undefined)\n );\n\n return cdkMajor;\n};\n\nexport const useKeywords = () => {\n const keywords: string[] = useSearchParam(\n QUERY_PARAMS.KEYWORDS,\n parseQueryArray\n );\n\n return keywords;\n};\n\nexport const useLanguages = () => {\n const languages: Language[] = useSearchParam(\n QUERY_PARAMS.LANGUAGES,\n parseQueryArray\n ) as Language[];\n\n return languages;\n};\n\nexport const useOffset = () => {\n const offset = useSearchParam(QUERY_PARAMS.OFFSET, (o) => toNum(o ?? \"\"));\n return offset;\n};\n\nexport const useSearchQuery = () => {\n const query: string = useSearchParam(QUERY_PARAMS.SEARCH_QUERY) ?? \"\";\n return query;\n};\n\nexport const useSort = () => {\n const sort: CatalogSearchSort | undefined =\n useSearchParam(QUERY_PARAMS.SORT) ?? undefined;\n return sort;\n};\n\nexport const useTags = () => {\n const tags: string[] = useSearchParam(QUERY_PARAMS.TAGS, parseQueryArray);\n return tags;\n};\n","import { useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { getSearchPath } from \"../../util/url\";\nimport { getSearchUrlParams } from \"./util\";\n\nexport const useUpdateSearchParam = () => {\n const { push } = useHistory();\n\n return useCallback(\n (p?: Partial<Parameters<typeof getSearchPath>[0]>) => {\n const { offset, ...params } = p ?? {};\n\n push(\n getSearchPath({\n ...getSearchUrlParams(),\n ...params,\n offset: offset ?? 0,\n })\n );\n },\n [push]\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 testIds from \"./testIds\";\nimport { useCdkMajor, useCdkType } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\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 = useCdkType();\n const cdkMajor = useCdkMajor();\n\n const updateSearch = useUpdateSearchParam();\n\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 updateSearch({ cdkType: type ? cdk : undefined, cdkMajor: undefined });\n };\n\n const onCdkMajorChange = (major: string) => {\n let majorNum: number | undefined = undefined;\n\n if (major) {\n majorNum = parseInt(major, 10);\n }\n\n updateSearch({ cdkMajor: majorNum });\n };\n\n return (\n <>\n <RadioFilter\n data-testid={testIds.cdkTypeFilter}\n hint=\"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKtf for Terraform, or CDK8s for Kubernetes.\"\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 data-testid={testIds.cdkVersionFilter}\n hint=\"Choose the major version of the CDK you're using to see only constructs that will work with that version.\"\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 { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Button,\n Collapse,\n Checkbox,\n Stack,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { clickEvent, eventName, useAnalytics } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\n\ninterface CheckboxOption {\n display: string;\n value: string;\n isDisabled?: boolean;\n disabledHint?: string;\n}\n\ninterface CheckboxItemProps extends CheckboxOption {\n onChange: () => void;\n isChecked: boolean;\n}\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n /**\n * Test ID to select checkbox in tests\n */\n \"data-testid\"?: string;\n /**\n * Number of items that can be initially shown\n */\n initialItemCount?: number;\n /**\n * Defines checkbox items\n */\n options: CheckboxOption[];\n /**\n * Selected values\n */\n values: string[];\n /**\n * Callback triggered when an item is clicked\n */\n onValueChange: (value: string) => void;\n}\n\nconst CheckboxItem: FunctionComponent<CheckboxItemProps> = ({\n display,\n value,\n isDisabled,\n disabledHint,\n isChecked,\n onChange,\n}) => (\n <Checkbox\n isChecked={isChecked}\n isDisabled={isDisabled}\n key={value}\n onChange={onChange}\n >\n <Tooltip\n hasArrow\n isDisabled={!isDisabled && !disabledHint}\n label={disabledHint}\n placement=\"right\"\n >\n <Text\n color=\"textTertiary\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Tooltip>\n </Checkbox>\n);\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n \"data-testid\": dataTestid,\n initialItemCount,\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const collapse = useDisclosure();\n const { trackCustomEvent } = useAnalytics();\n\n const getOnChange = (item: CheckboxOption) => () => {\n trackCustomEvent(\n clickEvent({\n name: eventName(SEARCH_ANALYTICS.FILTERS, name, \"Filter\", item.display),\n })\n );\n onValueChange(item.value);\n };\n\n let alwaysShow: typeof options = options;\n let showWhenExpanded: typeof options = [];\n\n if (initialItemCount) {\n alwaysShow = options.slice(0, initialItemCount);\n showWhenExpanded = options.slice(initialItemCount, options.length);\n }\n\n const isExpandible = showWhenExpanded.length > 0;\n\n return (\n <Flex data-testid={dataTestid} direction=\"column\">\n <FilterHeading hint={hint} name={name} />\n <Stack mt={1} spacing={1}>\n {alwaysShow.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n {isExpandible && (\n <Collapse animateOpacity in={collapse.isOpen} unmountOnExit>\n <Stack spacing={1}>\n {showWhenExpanded.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"textTertiary\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Show More\")}\n fontWeight=\"normal\"\n leftIcon={collapse.isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n onClick={collapse.onToggle}\n size=\"sm\"\n textAlign=\"left\"\n variant=\"link\"\n w=\"auto\"\n >\n {collapse.isOpen\n ? `Show fewer options (${alwaysShow.length})`\n : `Show more options (${showWhenExpanded.length})`}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { useSearchContext } from \"../../contexts/Search\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useKeywords } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const KeywordsFilter: FunctionComponent = () => {\n const keywords = useKeywords();\n const keywordMap = useSearchContext()!.keywords;\n const updateSearch = useUpdateSearchParam();\n\n const onKeywordChange = (keyword: string) => {\n updateSearch({\n keywords: keywords.includes(keyword)\n ? keywords.filter((k) => k !== keyword)\n : [...keywords, keyword],\n });\n };\n\n const keywordOptions = useMemo(() => {\n const baseOptions = [...keywordMap.entries()]\n .sort(([, count1], [, count2]) => {\n return count1 < count2 ? 1 : -1;\n })\n .filter(([keyword]) => !keywords.includes(keyword))\n .map(([keyword]) => ({\n display: keyword,\n value: keyword,\n }))\n .slice(0, 25);\n\n const keywordsNotInOptions = keywords.filter(\n (k) => !baseOptions.some((opt) => opt.value === k)\n );\n\n return [\n ...keywordsNotInOptions.map((k) => ({ display: k, value: k })),\n ...baseOptions,\n ];\n }, [keywordMap, keywords]);\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.\"\n initialItemCount={5}\n name=\"Keywords\"\n onValueChange={onKeywordChange}\n options={keywordOptions}\n values={keywords}\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 testIds from \"./testIds\";\nimport { useLanguages } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .map(([key, value]) => ({\n display: value,\n value: key,\n ...(TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n ? { isDisabled: false }\n : {\n isDisabled: true,\n disabledHint: `${\n LANGUAGE_NAME_MAP[key as Language]\n } support is coming soon!`,\n }),\n }))\n .sort((l1, l2) => {\n // Push disabled languages to back of list\n return l1.isDisabled > l2.isDisabled ? 1 : -1;\n });\n\nexport const LanguageFilter: FunctionComponent = () => {\n const languages = useLanguages();\n\n const updateSearch = useUpdateSearchParam();\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n updateSearch({\n languages: languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language],\n });\n };\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Choose one or more languages. Results include constructs for use with at least one of the selected languages.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { FunctionComponent, useCallback, useMemo } from \"react\";\nimport { PackageTagConfig, TagGroupConfig } from \"../../api/config\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useTags } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\ninterface FilterGroup extends Partial<TagGroupConfig> {\n id: string;\n tags: PackageTagConfig[];\n}\ninterface FilterGroups {\n [group: string]: FilterGroup;\n}\n\n/**\n * Creates a plain object map of FilterGroups keyed by group id\n */\nexport const mapTagsToFilterGroups = (\n packageTags: PackageTagConfig[],\n tagGroupsMap: Map<string, TagGroupConfig>\n): FilterGroups => {\n return packageTags.reduce(\n (accum: FilterGroups, tag: PackageTagConfig): FilterGroups => {\n const groupIdOrName = tag.searchFilter?.groupBy;\n const customGroup = groupIdOrName\n ? tagGroupsMap.get(groupIdOrName)\n : undefined;\n\n if (groupIdOrName && customGroup) {\n const entry = accum[groupIdOrName];\n if (entry) {\n entry.tags = [...entry.tags, tag];\n return accum;\n }\n\n return {\n ...accum,\n [groupIdOrName]: {\n ...customGroup,\n tags: [tag],\n },\n };\n }\n\n if (groupIdOrName) {\n return {\n ...accum,\n [groupIdOrName]: {\n id: groupIdOrName,\n tags: [...(accum?.[groupIdOrName]?.tags ?? []), tag],\n },\n };\n }\n return accum;\n },\n {}\n );\n};\n\nexport const TagFilter: FunctionComponent = () => {\n const packageTags = useConfigValue(\"packageTags\");\n const packageTagGroups = useConfigValue(\"packageTagGroups\");\n\n const tagFilterGroups: FilterGroups = useMemo(() => {\n const tagGroupsMap = new Map<string, TagGroupConfig>();\n packageTagGroups?.forEach((group) => {\n tagGroupsMap.set(group.id, group);\n });\n\n const filterableTags =\n packageTags?.filter((tag) => Boolean(tag.searchFilter)) ?? [];\n\n return mapTagsToFilterGroups(filterableTags, tagGroupsMap);\n }, [packageTags, packageTagGroups]);\n\n const tags = useTags();\n const updateSearch = useUpdateSearchParam();\n\n const onTagsChange = (tag: string) => {\n updateSearch({\n tags: tags.includes(tag) ? tags.filter((t) => t !== tag) : [...tags, tag],\n });\n };\n\n const getOnRadioTagChange = useCallback(\n (groupName: string) => {\n const groupTags = new Set(\n (tagFilterGroups[groupName]?.tags ?? []).map(({ id }) => id)\n );\n\n return (tag: string) => {\n const filteredTags = tags.filter((t) => !groupTags.has(t));\n\n updateSearch({\n tags: tag ? [...filteredTags, tag] : filteredTags,\n });\n };\n },\n [tagFilterGroups, tags, updateSearch]\n );\n\n return (\n <>\n {Object.values(tagFilterGroups).map(\n ({ filterType, id, label, tooltip, tags: tagItems }) => {\n const sharedProps = {\n hint: tooltip,\n name: label ?? id,\n options: tagItems.map((tag) => {\n return {\n display: tag.searchFilter!.display,\n value: tag.id,\n };\n }),\n };\n\n if (filterType === \"radio\") {\n return (\n <RadioFilter\n {...sharedProps}\n key={id}\n onValueChange={getOnRadioTagChange(id)}\n options={[\n { display: `Any ${sharedProps.name}`, value: \"\" },\n ...sharedProps.options,\n ]}\n value={tagItems.find((t) => tags.includes(t.id))?.id ?? \"\"}\n />\n );\n }\n\n return (\n <CheckboxFilter\n {...sharedProps}\n key={id}\n onValueChange={onTagsChange}\n values={tags}\n />\n );\n }\n )}\n </>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { TagFilter } from \"./TagFilter\";\nimport testIds from \"./testIds\";\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=\"sm\"\n data-testid={testIds.filtersPanel}\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=\"textPrimary\" h=\"max-content\" spacing={4} top={4}>\n <Heading as=\"h2\" size=\"sm\">\n Filters\n </Heading>\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </Card>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n \"data-event\"?: string;\n items: ExtendedCatalogPackage[];\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 \"data-event\": dataEvent,\n cardView = PackageCardType.Wide,\n items,\n loading,\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 data-event={dataEvent} 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 \"data-event\": dataEvent,\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n data-event={dataEvent}\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface ArrowButtonProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n icon: FunctionComponent<IconProps>;\n label: string;\n onClick?: () => void;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: Icon,\n label,\n onClick,\n}) => {\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\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 return <IconButton {...props} disabled={!onClick} onClick={onClick} />;\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 { clickEvent, useAnalytics } from \"../../contexts/Analytics\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport interface GoToPageProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n pageLimit: number;\n offset: number;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n pageLimit,\n offset,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const { trackCustomEvent } = useAnalytics();\n const [inputValue, setInputValue] = useState((offset + 1).toString());\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 updateSearch({ offset: parseInt(inputValue) - 1 });\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n aria-label=\"Jump to page\"\n colorScheme=\"brand\"\n data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n onFocus={() => {\n if (dataEvent) {\n trackCustomEvent(clickEvent({ name: dataEvent }));\n }\n }}\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 { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { GoToPage } from \"./GoToPage\";\nimport testIds from \"./testIds\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const goForward =\n offset < pageLimit ? () => updateSearch({ offset: offset + 1 }) : undefined;\n const goBack =\n offset > 0 ? () => updateSearch({ offset: 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 data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Previous Page\")}\n data-testid={testIds.prevPage}\n icon={ChevronLeftIcon}\n label=\"Previous page button\"\n onClick={goBack}\n />\n <GoToPage\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Go to Page\")}\n data-testid={testIds.goToPage}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Next Page\")}\n data-testid={testIds.nextPage}\n icon={ChevronRightIcon}\n label=\"Next page button\"\n onClick={goForward}\n />\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { SearchBar as SearchBarComponent } from \"../../components/SearchBar\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { useSearchQuery } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SearchBar: FunctionComponent = () => {\n const query = useSearchQuery();\n const updateSearch = useUpdateSearchParam();\n\n const [value, setValue] = useState(query ?? \"\");\n\n return (\n <SearchBarComponent\n bg=\"bgSecondary\"\n data-event={SEARCH_ANALYTICS.SEARCH}\n onChange={(e) => setValue(e.target.value)}\n onSubmit={(e) => {\n e.preventDefault();\n\n updateSearch({\n query: value,\n sort: undefined,\n });\n }}\n value={value}\n />\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\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=\"textSecondary\">\n {children}\n </Text>\n);\n\nconst Count: FunctionComponent<{\n first: number;\n count: number;\n last: number;\n}> = ({ first, count, last }) => {\n if (!first && last >= count) {\n return (\n <>\n <Em>{count}</Em> of <Em>{count}</Em>\n </>\n );\n }\n\n return (\n <>\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em>\n </>\n );\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 const hasResults = count > 0;\n\n return (\n <Text data-testid={testIds.searchDetails}>\n {hasResults ? (\n <>\n Displaying <Count count={count} first={first} last={last} />{\" \"}\n {filtered ? \"search results\" : \"constructs\"}\n </>\n ) : (\n <>{filtered ? \"There were no search results\" : \"No constructs found\"}</>\n )}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n .{!hasResults && filtered && <> Try a different term.</>}\n </Text>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SortFilter: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const onSortChange = (newSort: string) => {\n updateSearch({\n sort: newSort ? (newSort as CatalogSearchSort) : undefined,\n });\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 { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\nimport { TagFilter } from \"./TagFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n return (\n <>\n <Button\n colorScheme=\"brand\"\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=\"textPrimary\" maxH=\"full\">\n <DrawerHeader borderBottom=\"base\">Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"textPrimary\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\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 { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS, SORT_RENDER_MAP } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SortedBy: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\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=\"link\"\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Menu\")}\n data-testid={testIds.sortButton}\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 data-testid={testIds.sortDropdown} minW=\"180\" zIndex=\"sticky\">\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", \"Relevance\")}\n data-testid={testIds.sortItem}\n data-value=\"\"\n key=\"Relevance\"\n onClick={() => updateSearch({ sort: undefined })}\n >\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", display)}\n data-testid={testIds.sortItem}\n data-value={value}\n key={value}\n onClick={() => updateSearch({ sort: 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 } from \"react\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { LIMIT, SEARCH_ANALYTICS } from \"./constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\nimport {\n useCdkType,\n useCdkMajor,\n useKeywords,\n useLanguages,\n useOffset,\n useSearchQuery,\n useSort,\n useTags,\n} from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SearchResults: FunctionComponent = () => {\n const updateSearch = useUpdateSearchParam();\n\n const offset = useOffset();\n const query = useSearchQuery();\n const keywords = useKeywords();\n const languages = useLanguages();\n const cdkMajor = useCdkMajor();\n const cdkType = useCdkType();\n const sort = useSort();\n const tags = useTags();\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit: LIMIT,\n query,\n keywords,\n languages,\n cdkMajor,\n cdkType,\n sort,\n tags,\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 updateSearch({ offset: 0 });\n } else {\n // Offset is too large, just take last page\n updateSearch({ offset: pageLimit });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Scroll to top on page change\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [page]);\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\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 data-event={SEARCH_ANALYTICS.RESULTS} items={page} />\n\n <Box w=\"full\">\n <PageControls offset={offset} pageLimit={pageLimit} />\n </Box>\n </Stack>\n </Page>\n );\n};\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 testIds from \"./testIds\";\n\nexport const Search: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"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 );\n};\n"],"names":["SORT_RENDER_MAP","CatalogSearchSort","searchEvent","e","eventName","SEARCH_ANALYTICS","FILTERS","RESULTS","SEARCH","SORT","FilterHeading","name","hint","placement","useBreakpointValue","base","md","align","mb","as","size","w","colorScheme","strategy","ml","h","bg","borderRadius","color","fontSize","mx","shadow","createTestIds","RadioFilter","dataTestid","checkedValue","value","onValueChange","options","spacing","onChange","map","display","dataEvent","testIds","filterItem","isTruncated","toNum","val","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","getParamFromUrl","key","window","URL","location","href","searchParams","get","useSearchParam","transform","qp","useQueryParams","useMemo","useCdkType","QUERY_PARAMS","undefined","useCdkMajor","p","useKeywords","useLanguages","useSearchQuery","useSort","useTags","useUpdateSearchParam","push","useHistory","useCallback","offset","params","getSearchPath","query","keywords","cdkType","cdkMajor","cdkMajorParam","languages","sort","tags","getSearchUrlParams","CDKFilter","updateSearch","searchAPI","useSearchContext","cdkOptions","cdkTypes","constructFrameworks","Object","entries","reduce","opts","meta","pkgCount","CDKTYPE_NAME_MAP","keys","length","majorsOptions","majorVersions","a","b","toString","cdkTypeFilter","type","values","cdkVersionFilter","major","majorNum","CheckboxItem","isDisabled","disabledHint","isChecked","hasArrow","label","CheckboxFilter","initialItemCount","checkedValues","collapse","useDisclosure","trackCustomEvent","useAnalytics","getOnChange","item","clickEvent","alwaysShow","showWhenExpanded","slice","isExpandible","direction","mt","includes","animateOpacity","in","isOpen","unmountOnExit","fontWeight","leftIcon","onClick","onToggle","textAlign","variant","KeywordsFilter","keywordMap","keywordOptions","baseOptions","filter","keyword","keywordsNotInOptions","k","some","opt","languagesFilter","languageOptions","LANGUAGE_NAME_MAP","TEMP_SUPPORTED_LANGUAGES","l1","l2","LanguageFilter","lang","language","l","TagFilter","packageTags","useConfigValue","packageTagGroups","tagFilterGroups","tagGroupsMap","Map","forEach","group","set","id","accum","tag","groupIdOrName","searchFilter","groupBy","customGroup","entry","mapTagsToFilterGroups","Boolean","onTagsChange","t","getOnRadioTagChange","groupName","groupTags","Set","filteredTags","has","filterType","tooltip","tagItems","sharedProps","find","TOP_OFFSET","FilterPanel","Card","filtersPanel","maxH","maxW","minW","overflow","pos","top","zIndex","listViews","PackageCardType","items","pkg","PackageCard","version","PackageList","memo","cardView","loading","View","displayName","ArrowButton","Icon","icon","props","borderColor","disabled","GoToPage","pageLimit","useState","inputValue","setInputValue","useEffect","onSubmit","preventDefault","max","min","target","onFocus","PageControls","goForward","goBack","justify","prevPage","ChevronLeftIcon","goToPage","nextPage","ChevronRightIcon","SearchBar","setValue","Em","children","Count","first","count","last","SearchDetails","limit","filtered","hasResults","searchDetails","SortFilter","newSort","SortAndFilterDrawer","drawer","onOpen","rightIcon","borderBottom","pb","SortedBy","selected","Button","sortButton","pl","pr","py","sortDropdown","sortItem","SearchResults","o","useCatalogResults","page","results","scrollTo","Page","title","description","pageName","px","lg","Search","gap","templateColumns","templateRows"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/js/51.a319b42f.chunk.js","mappings":"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","sources":["views/Search/constants.ts","views/Search/FilterHeading.tsx","views/Search/testIds.ts","views/Search/RadioFilter.tsx","views/Search/util.ts","views/Search/useSearchParam.ts","views/Search/useUpdateSearchParam.ts","views/Search/CDKFilter.tsx","views/Search/CheckboxFilter.tsx","views/Search/KeywordsFilter.tsx","views/Search/LanguageFilter.tsx","views/Search/TagFilter.tsx","views/Search/FilterPanel.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/Search/ArrowButton.tsx","views/Search/GoToPage.tsx","views/Search/PageControls.tsx","views/Search/SearchBar.tsx","views/Search/SearchDetails.tsx","views/Search/SortFilter.tsx","views/Search/SortAndFilterDrawer.tsx","views/Search/SortedBy.tsx","views/Search/SearchResults.tsx","views/Search/Search.tsx"],"sourcesContent":["import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nconst LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest\",\n [CatalogSearchSort.PublishDateDesc]: \"Recently updated\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n\nconst searchEvent: typeof eventName = (...e) => eventName(\"Search\", ...e);\n\nexport const SEARCH_ANALYTICS = {\n FILTERS: searchEvent(\"Filters\"),\n RESULTS: searchEvent(\"Results\"),\n SEARCH: searchEvent(\"Search\"),\n SORT: searchEvent(\"Sort\"),\n};\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n useBreakpointValue,\n PlacementWithLogical,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n const placement = useBreakpointValue<PlacementWithLogical>({\n base: \"auto\",\n md: \"right\",\n });\n\n return (\n <Flex align=\"center\" mb={1}>\n <Heading as=\"h3\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement={placement} strategy=\"fixed\">\n <PopoverTrigger>\n <Flex\n aria-label={`Hint: ${name}`}\n as=\"button\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Popover\")}\n ml={2}\n >\n <QuestionIcon h={3.5} w={3.5} />\n </Flex>\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n borderRadius=\"base\"\n color=\"white\"\n fontSize=\"sm\"\n mx={{ base: \"1rem\", md: \"initial\" }}\n shadow=\"whiteAlpha.300\"\n >\n <PopoverArrow bg=\"gray.700\" />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\n \"page\",\n // Results\n \"searchDetails\",\n \"nextPage\",\n \"prevPage\",\n \"goToPage\",\n // Sorting\n \"sortButton\",\n \"sortDropdown\",\n \"sortItem\",\n // Filters Panel\n \"filtersPanel\",\n \"cdkTypeFilter\",\n \"cdkVersionFilter\",\n \"filterItem\",\n \"languagesFilter\",\n] as const);\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n \"data-testid\"?: string;\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 \"data-testid\": dataTestid,\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack data-testid={dataTestid} spacing={1}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack spacing={1}>\n {options.map(({ display, value }) => {\n const dataEvent = eventName(\n SEARCH_ANALYTICS.FILTERS,\n name,\n \"Filter\",\n display\n );\n return (\n <Radio data-event={dataEvent} key={value} value={value}>\n <Text\n color=\"textTertiary\"\n data-event={dataEvent}\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n );\n })}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\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 parseQueryArray = <T extends string>(\n queryString: string | null\n) => {\n if (!queryString) return [];\n\n return decodeURIComponent(queryString).split(\",\") as T[];\n};\n\nconst getParamFromUrl = (key: string) => {\n if (typeof window === \"undefined\") return null;\n const queryParams = new URL(window.location.href).searchParams;\n return queryParams.get(key);\n};\n\nexport const getSearchUrlParams = () => {\n return {\n query: getParamFromUrl(QUERY_PARAMS.SEARCH_QUERY) ?? \"\",\n keywords: parseQueryArray(getParamFromUrl(QUERY_PARAMS.KEYWORDS)),\n cdkType: (getParamFromUrl(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined,\n cdkMajor: (() => {\n const cdkMajorParam = getParamFromUrl(QUERY_PARAMS.CDK_MAJOR);\n return cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n })(),\n languages: parseQueryArray(\n getParamFromUrl(QUERY_PARAMS.LANGUAGES)\n ) as Language[],\n offset: toNum(getParamFromUrl(QUERY_PARAMS.OFFSET) ?? \"\"),\n sort:\n (getParamFromUrl(QUERY_PARAMS.SORT) as CatalogSearchSort) ?? undefined,\n tags: parseQueryArray(getParamFromUrl(QUERY_PARAMS.TAGS)),\n };\n};\n","import { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { parseQueryArray, toNum } from \"./util\";\n\nconst useSearchParam = <T = string | null>(\n key: string,\n transform?: (param: string | null) => T\n): T => {\n const queryParams = useQueryParams();\n const qp = queryParams.get(key);\n\n return useMemo(\n () => (transform ? transform(qp) : (qp as unknown as T)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [qp]\n );\n};\n\nexport const useCdkType = () => {\n const cdkType: CDKType | undefined =\n useSearchParam(QUERY_PARAMS.CDK_TYPE) ?? undefined;\n\n return cdkType;\n};\n\nexport const useCdkMajor = () => {\n const cdkMajor: number | undefined = useSearchParam(\n QUERY_PARAMS.CDK_MAJOR,\n (p) => (p ? toNum(p) : undefined)\n );\n\n return cdkMajor;\n};\n\nexport const useKeywords = () => {\n const keywords: string[] = useSearchParam(\n QUERY_PARAMS.KEYWORDS,\n parseQueryArray\n );\n\n return keywords;\n};\n\nexport const useLanguages = () => {\n const languages: Language[] = useSearchParam(\n QUERY_PARAMS.LANGUAGES,\n parseQueryArray\n ) as Language[];\n\n return languages;\n};\n\nexport const useOffset = () => {\n const offset = useSearchParam(QUERY_PARAMS.OFFSET, (o) => toNum(o ?? \"\"));\n return offset;\n};\n\nexport const useSearchQuery = () => {\n const query: string = useSearchParam(QUERY_PARAMS.SEARCH_QUERY) ?? \"\";\n return query;\n};\n\nexport const useSort = () => {\n const sort: CatalogSearchSort | undefined =\n useSearchParam(QUERY_PARAMS.SORT) ?? undefined;\n return sort;\n};\n\nexport const useTags = () => {\n const tags: string[] = useSearchParam(QUERY_PARAMS.TAGS, parseQueryArray);\n return tags;\n};\n","import { useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { getSearchPath } from \"../../util/url\";\nimport { getSearchUrlParams } from \"./util\";\n\nexport const useUpdateSearchParam = () => {\n const { push } = useHistory();\n\n return useCallback(\n (p?: Partial<Parameters<typeof getSearchPath>[0]>) => {\n const { offset, ...params } = p ?? {};\n\n push(\n getSearchPath({\n ...getSearchUrlParams(),\n ...params,\n offset: offset ?? 0,\n })\n );\n },\n [push]\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 testIds from \"./testIds\";\nimport { useCdkMajor, useCdkType } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\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 = useCdkType();\n const cdkMajor = useCdkMajor();\n\n const updateSearch = useUpdateSearchParam();\n\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 updateSearch({ cdkType: type ? cdk : undefined, cdkMajor: undefined });\n };\n\n const onCdkMajorChange = (major: string) => {\n let majorNum: number | undefined = undefined;\n\n if (major) {\n majorNum = parseInt(major, 10);\n }\n\n updateSearch({ cdkMajor: majorNum });\n };\n\n return (\n <>\n <RadioFilter\n data-testid={testIds.cdkTypeFilter}\n hint=\"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKtf for Terraform, or CDK8s for Kubernetes.\"\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 data-testid={testIds.cdkVersionFilter}\n hint=\"Choose the major version of the CDK you're using to see only constructs that will work with that version.\"\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 { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Button,\n Collapse,\n Checkbox,\n Stack,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { clickEvent, eventName, useAnalytics } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\n\ninterface CheckboxOption {\n display: string;\n value: string;\n isDisabled?: boolean;\n disabledHint?: string;\n}\n\ninterface CheckboxItemProps extends CheckboxOption {\n onChange: () => void;\n isChecked: boolean;\n}\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n /**\n * Test ID to select checkbox in tests\n */\n \"data-testid\"?: string;\n /**\n * Number of items that can be initially shown\n */\n initialItemCount?: number;\n /**\n * Defines checkbox items\n */\n options: CheckboxOption[];\n /**\n * Selected values\n */\n values: string[];\n /**\n * Callback triggered when an item is clicked\n */\n onValueChange: (value: string) => void;\n}\n\nconst CheckboxItem: FunctionComponent<CheckboxItemProps> = ({\n display,\n value,\n isDisabled,\n disabledHint,\n isChecked,\n onChange,\n}) => (\n <Checkbox\n isChecked={isChecked}\n isDisabled={isDisabled}\n key={value}\n onChange={onChange}\n >\n <Tooltip\n hasArrow\n isDisabled={!isDisabled && !disabledHint}\n label={disabledHint}\n placement=\"right\"\n >\n <Text\n color=\"textTertiary\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Tooltip>\n </Checkbox>\n);\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n \"data-testid\": dataTestid,\n initialItemCount,\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const collapse = useDisclosure();\n const { trackCustomEvent } = useAnalytics();\n\n const getOnChange = (item: CheckboxOption) => () => {\n trackCustomEvent(\n clickEvent({\n name: eventName(SEARCH_ANALYTICS.FILTERS, name, \"Filter\", item.display),\n })\n );\n onValueChange(item.value);\n };\n\n let alwaysShow: typeof options = options;\n let showWhenExpanded: typeof options = [];\n\n if (initialItemCount) {\n alwaysShow = options.slice(0, initialItemCount);\n showWhenExpanded = options.slice(initialItemCount, options.length);\n }\n\n const isExpandible = showWhenExpanded.length > 0;\n\n return (\n <Flex data-testid={dataTestid} direction=\"column\">\n <FilterHeading hint={hint} name={name} />\n <Stack mt={1} spacing={1}>\n {alwaysShow.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n {isExpandible && (\n <Collapse animateOpacity in={collapse.isOpen} unmountOnExit>\n <Stack spacing={1}>\n {showWhenExpanded.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"textTertiary\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Show More\")}\n fontWeight=\"normal\"\n leftIcon={collapse.isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n onClick={collapse.onToggle}\n size=\"sm\"\n textAlign=\"left\"\n variant=\"link\"\n w=\"auto\"\n >\n {collapse.isOpen\n ? `Show fewer options (${alwaysShow.length})`\n : `Show more options (${showWhenExpanded.length})`}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { useSearchContext } from \"../../contexts/Search\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useKeywords } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const KeywordsFilter: FunctionComponent = () => {\n const keywords = useKeywords();\n const keywordMap = useSearchContext()!.keywords;\n const updateSearch = useUpdateSearchParam();\n\n const onKeywordChange = (keyword: string) => {\n updateSearch({\n keywords: keywords.includes(keyword)\n ? keywords.filter((k) => k !== keyword)\n : [...keywords, keyword],\n });\n };\n\n const keywordOptions = useMemo(() => {\n const baseOptions = [...keywordMap.entries()]\n .sort(([, count1], [, count2]) => {\n return count1 < count2 ? 1 : -1;\n })\n .filter(([keyword]) => !keywords.includes(keyword))\n .map(([keyword]) => ({\n display: keyword,\n value: keyword,\n }))\n .slice(0, 25);\n\n const keywordsNotInOptions = keywords.filter(\n (k) => !baseOptions.some((opt) => opt.value === k)\n );\n\n return [\n ...keywordsNotInOptions.map((k) => ({ display: k, value: k })),\n ...baseOptions,\n ];\n }, [keywordMap, keywords]);\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.\"\n initialItemCount={5}\n name=\"Keywords\"\n onValueChange={onKeywordChange}\n options={keywordOptions}\n values={keywords}\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 testIds from \"./testIds\";\nimport { useLanguages } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .map(([key, value]) => ({\n display: value,\n value: key,\n ...(TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n ? { isDisabled: false }\n : {\n isDisabled: true,\n disabledHint: `${\n LANGUAGE_NAME_MAP[key as Language]\n } support is coming soon!`,\n }),\n }))\n .sort((l1, l2) => {\n // Push disabled languages to back of list\n return l1.isDisabled > l2.isDisabled ? 1 : -1;\n });\n\nexport const LanguageFilter: FunctionComponent = () => {\n const languages = useLanguages();\n\n const updateSearch = useUpdateSearchParam();\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n updateSearch({\n languages: languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language],\n });\n };\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Choose one or more languages. Results include constructs for use with at least one of the selected languages.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { FunctionComponent, useCallback, useMemo } from \"react\";\nimport { PackageTagConfig, TagGroupConfig } from \"../../api/config\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useTags } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\ninterface FilterGroup extends Partial<TagGroupConfig> {\n id: string;\n tags: PackageTagConfig[];\n}\ninterface FilterGroups {\n [group: string]: FilterGroup;\n}\n\n/**\n * Creates a plain object map of FilterGroups keyed by group id\n */\nexport const mapTagsToFilterGroups = (\n packageTags: PackageTagConfig[],\n tagGroupsMap: Map<string, TagGroupConfig>\n): FilterGroups => {\n return packageTags.reduce(\n (accum: FilterGroups, tag: PackageTagConfig): FilterGroups => {\n const groupIdOrName = tag.searchFilter?.groupBy;\n const customGroup = groupIdOrName\n ? tagGroupsMap.get(groupIdOrName)\n : undefined;\n\n if (groupIdOrName && customGroup) {\n const entry = accum[groupIdOrName];\n if (entry) {\n entry.tags = [...entry.tags, tag];\n return accum;\n }\n\n return {\n ...accum,\n [groupIdOrName]: {\n ...customGroup,\n tags: [tag],\n },\n };\n }\n\n if (groupIdOrName) {\n return {\n ...accum,\n [groupIdOrName]: {\n id: groupIdOrName,\n tags: [...(accum?.[groupIdOrName]?.tags ?? []), tag],\n },\n };\n }\n return accum;\n },\n {}\n );\n};\n\nexport const TagFilter: FunctionComponent = () => {\n const packageTags = useConfigValue(\"packageTags\");\n const packageTagGroups = useConfigValue(\"packageTagGroups\");\n\n const tagFilterGroups: FilterGroups = useMemo(() => {\n const tagGroupsMap = new Map<string, TagGroupConfig>();\n packageTagGroups?.forEach((group) => {\n tagGroupsMap.set(group.id, group);\n });\n\n const filterableTags =\n packageTags?.filter((tag) => Boolean(tag.searchFilter)) ?? [];\n\n return mapTagsToFilterGroups(filterableTags, tagGroupsMap);\n }, [packageTags, packageTagGroups]);\n\n const tags = useTags();\n const updateSearch = useUpdateSearchParam();\n\n const onTagsChange = (tag: string) => {\n updateSearch({\n tags: tags.includes(tag) ? tags.filter((t) => t !== tag) : [...tags, tag],\n });\n };\n\n const getOnRadioTagChange = useCallback(\n (groupName: string) => {\n const groupTags = new Set(\n (tagFilterGroups[groupName]?.tags ?? []).map(({ id }) => id)\n );\n\n return (tag: string) => {\n const filteredTags = tags.filter((t) => !groupTags.has(t));\n\n updateSearch({\n tags: tag ? [...filteredTags, tag] : filteredTags,\n });\n };\n },\n [tagFilterGroups, tags, updateSearch]\n );\n\n return (\n <>\n {Object.values(tagFilterGroups).map(\n ({ filterType, id, label, tooltip, tags: tagItems }) => {\n const sharedProps = {\n hint: tooltip,\n name: label ?? id,\n options: tagItems.map((tag) => {\n return {\n display: tag.searchFilter!.display,\n value: tag.id,\n };\n }),\n };\n\n if (filterType === \"radio\") {\n return (\n <RadioFilter\n {...sharedProps}\n key={id}\n onValueChange={getOnRadioTagChange(id)}\n options={[\n { display: `Any ${sharedProps.name}`, value: \"\" },\n ...sharedProps.options,\n ]}\n value={tagItems.find((t) => tags.includes(t.id))?.id ?? \"\"}\n />\n );\n }\n\n return (\n <CheckboxFilter\n {...sharedProps}\n key={id}\n onValueChange={onTagsChange}\n values={tags}\n />\n );\n }\n )}\n </>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { TagFilter } from \"./TagFilter\";\nimport testIds from \"./testIds\";\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=\"sm\"\n data-testid={testIds.filtersPanel}\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=\"textPrimary\" h=\"max-content\" spacing={4} top={4}>\n <Heading as=\"h2\" size=\"sm\">\n Filters\n </Heading>\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </Card>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n \"data-event\"?: string;\n items: ExtendedCatalogPackage[];\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 \"data-event\": dataEvent,\n cardView = PackageCardType.Wide,\n items,\n loading,\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 data-event={dataEvent} 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 \"data-event\": dataEvent,\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n data-event={dataEvent}\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface ArrowButtonProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n icon: FunctionComponent<IconProps>;\n label: string;\n onClick?: () => void;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: Icon,\n label,\n onClick,\n}) => {\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\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 return <IconButton {...props} disabled={!onClick} onClick={onClick} />;\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 { clickEvent, useAnalytics } from \"../../contexts/Analytics\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport interface GoToPageProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n pageLimit: number;\n offset: number;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n pageLimit,\n offset,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const { trackCustomEvent } = useAnalytics();\n const [inputValue, setInputValue] = useState((offset + 1).toString());\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 updateSearch({ offset: parseInt(inputValue) - 1 });\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n aria-label=\"Jump to page\"\n colorScheme=\"brand\"\n data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n onFocus={() => {\n if (dataEvent) {\n trackCustomEvent(clickEvent({ name: dataEvent }));\n }\n }}\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 { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { GoToPage } from \"./GoToPage\";\nimport testIds from \"./testIds\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const goForward =\n offset < pageLimit ? () => updateSearch({ offset: offset + 1 }) : undefined;\n const goBack =\n offset > 0 ? () => updateSearch({ offset: 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 data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Previous Page\")}\n data-testid={testIds.prevPage}\n icon={ChevronLeftIcon}\n label=\"Previous page button\"\n onClick={goBack}\n />\n <GoToPage\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Go to Page\")}\n data-testid={testIds.goToPage}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Next Page\")}\n data-testid={testIds.nextPage}\n icon={ChevronRightIcon}\n label=\"Next page button\"\n onClick={goForward}\n />\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { SearchBar as SearchBarComponent } from \"../../components/SearchBar\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { useSearchQuery } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SearchBar: FunctionComponent = () => {\n const query = useSearchQuery();\n const updateSearch = useUpdateSearchParam();\n\n const [value, setValue] = useState(query ?? \"\");\n\n return (\n <SearchBarComponent\n bg=\"bgSecondary\"\n data-event={SEARCH_ANALYTICS.SEARCH}\n onChange={(e) => setValue(e.target.value)}\n onSubmit={(e) => {\n e.preventDefault();\n\n updateSearch({\n query: value,\n sort: undefined,\n });\n }}\n value={value}\n />\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\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=\"textSecondary\">\n {children}\n </Text>\n);\n\nconst Count: FunctionComponent<{\n first: number;\n count: number;\n last: number;\n}> = ({ first, count, last }) => {\n if (!first && last >= count) {\n return (\n <>\n <Em>{count}</Em> of <Em>{count}</Em>\n </>\n );\n }\n\n return (\n <>\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em>\n </>\n );\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 const hasResults = count > 0;\n\n return (\n <Text data-testid={testIds.searchDetails}>\n {hasResults ? (\n <>\n Displaying <Count count={count} first={first} last={last} />{\" \"}\n {filtered ? \"search results\" : \"constructs\"}\n </>\n ) : (\n <>{filtered ? \"There were no search results\" : \"No constructs found\"}</>\n )}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n .{!hasResults && filtered && <> Try a different term.</>}\n </Text>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SortFilter: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const onSortChange = (newSort: string) => {\n updateSearch({\n sort: newSort ? (newSort as CatalogSearchSort) : undefined,\n });\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 { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\nimport { TagFilter } from \"./TagFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n return (\n <>\n <Button\n colorScheme=\"brand\"\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=\"textPrimary\" maxH=\"full\">\n <DrawerHeader borderBottom=\"base\">Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"textPrimary\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\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 { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS, SORT_RENDER_MAP } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SortedBy: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\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=\"link\"\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Menu\")}\n data-testid={testIds.sortButton}\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 data-testid={testIds.sortDropdown} minW=\"180\" zIndex=\"sticky\">\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", \"Relevance\")}\n data-testid={testIds.sortItem}\n data-value=\"\"\n key=\"Relevance\"\n onClick={() => updateSearch({ sort: undefined })}\n >\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", display)}\n data-testid={testIds.sortItem}\n data-value={value}\n key={value}\n onClick={() => updateSearch({ sort: 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 } from \"react\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { LIMIT, SEARCH_ANALYTICS } from \"./constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\nimport {\n useCdkType,\n useCdkMajor,\n useKeywords,\n useLanguages,\n useOffset,\n useSearchQuery,\n useSort,\n useTags,\n} from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\n\nexport const SearchResults: FunctionComponent = () => {\n const updateSearch = useUpdateSearchParam();\n\n const offset = useOffset();\n const query = useSearchQuery();\n const keywords = useKeywords();\n const languages = useLanguages();\n const cdkMajor = useCdkMajor();\n const cdkType = useCdkType();\n const sort = useSort();\n const tags = useTags();\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit: LIMIT,\n query,\n keywords,\n languages,\n cdkMajor,\n cdkType,\n sort,\n tags,\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 updateSearch({ offset: 0 });\n } else {\n // Offset is too large, just take last page\n updateSearch({ offset: pageLimit });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Scroll to top on page change\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [page]);\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\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 data-event={SEARCH_ANALYTICS.RESULTS} items={page} />\n\n <Box w=\"full\">\n <PageControls offset={offset} pageLimit={pageLimit} />\n </Box>\n </Stack>\n </Page>\n );\n};\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 testIds from \"./testIds\";\n\nexport const Search: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"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 );\n};\n"],"names":["SORT_RENDER_MAP","CatalogSearchSort","searchEvent","e","eventName","SEARCH_ANALYTICS","FILTERS","RESULTS","SEARCH","SORT","FilterHeading","name","hint","placement","useBreakpointValue","base","md","align","mb","as","size","w","colorScheme","strategy","ml","h","bg","borderRadius","color","fontSize","mx","shadow","createTestIds","RadioFilter","dataTestid","checkedValue","value","onValueChange","options","spacing","onChange","map","display","dataEvent","testIds","filterItem","isTruncated","toNum","val","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","getParamFromUrl","key","window","URL","location","href","searchParams","get","useSearchParam","transform","qp","useQueryParams","useMemo","useCdkType","QUERY_PARAMS","undefined","useCdkMajor","p","useKeywords","useLanguages","useSearchQuery","useSort","useTags","useUpdateSearchParam","push","useHistory","useCallback","offset","params","getSearchPath","query","keywords","cdkType","cdkMajor","cdkMajorParam","languages","sort","tags","getSearchUrlParams","CDKFilter","updateSearch","searchAPI","useSearchContext","cdkOptions","cdkTypes","constructFrameworks","Object","entries","reduce","opts","meta","pkgCount","CDKTYPE_NAME_MAP","keys","length","majorsOptions","majorVersions","a","b","toString","cdkTypeFilter","type","values","cdkVersionFilter","major","majorNum","CheckboxItem","isDisabled","disabledHint","isChecked","hasArrow","label","CheckboxFilter","initialItemCount","checkedValues","collapse","useDisclosure","trackCustomEvent","useAnalytics","getOnChange","item","clickEvent","alwaysShow","showWhenExpanded","slice","isExpandible","direction","mt","includes","animateOpacity","in","isOpen","unmountOnExit","fontWeight","leftIcon","onClick","onToggle","textAlign","variant","KeywordsFilter","keywordMap","keywordOptions","baseOptions","filter","keyword","keywordsNotInOptions","k","some","opt","languagesFilter","languageOptions","LANGUAGE_NAME_MAP","TEMP_SUPPORTED_LANGUAGES","l1","l2","LanguageFilter","lang","language","l","TagFilter","packageTags","useConfigValue","packageTagGroups","tagFilterGroups","tagGroupsMap","Map","forEach","group","set","id","accum","tag","groupIdOrName","searchFilter","groupBy","customGroup","entry","mapTagsToFilterGroups","Boolean","onTagsChange","t","getOnRadioTagChange","groupName","groupTags","Set","filteredTags","has","filterType","tooltip","tagItems","sharedProps","find","TOP_OFFSET","FilterPanel","Card","filtersPanel","maxH","maxW","minW","overflow","pos","top","zIndex","listViews","PackageCardType","items","pkg","PackageCard","version","PackageList","memo","cardView","loading","View","displayName","ArrowButton","Icon","icon","props","borderColor","disabled","GoToPage","pageLimit","useState","inputValue","setInputValue","useEffect","onSubmit","preventDefault","max","min","target","onFocus","PageControls","goForward","goBack","justify","prevPage","ChevronLeftIcon","goToPage","nextPage","ChevronRightIcon","SearchBar","setValue","Em","children","Count","first","count","last","SearchDetails","limit","filtered","hasResults","searchDetails","SortFilter","newSort","SortAndFilterDrawer","drawer","onOpen","rightIcon","borderBottom","pb","SortedBy","selected","Button","sortButton","pl","pr","py","sortDropdown","sortItem","SearchResults","o","useCatalogResults","page","results","scrollTo","Page","title","description","pageName","px","lg","Search","gap","templateColumns","templateRows"],"sourceRoot":""}
|