construct-hub-webapp 0.1.642 → 0.1.643

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/build/asset-manifest.json +19 -19
  2. package/build/index.html +1 -1
  3. package/build/static/js/{122.58367a72.chunk.js → 122.517fee0b.chunk.js} +2 -2
  4. package/build/static/js/{122.58367a72.chunk.js.map → 122.517fee0b.chunk.js.map} +1 -1
  5. package/build/static/js/{225.0bdfad83.chunk.js → 225.8711ae88.chunk.js} +2 -2
  6. package/build/static/js/{225.0bdfad83.chunk.js.map → 225.8711ae88.chunk.js.map} +1 -1
  7. package/build/static/js/{29.1c8de512.chunk.js → 29.4850c1e7.chunk.js} +2 -2
  8. package/build/static/js/{29.1c8de512.chunk.js.map → 29.4850c1e7.chunk.js.map} +1 -1
  9. package/build/static/js/{545.10058b2e.chunk.js → 545.737d8d6a.chunk.js} +2 -2
  10. package/build/static/js/{545.10058b2e.chunk.js.map → 545.737d8d6a.chunk.js.map} +1 -1
  11. package/build/static/js/{577.e3e02e10.chunk.js → 577.0fbaedf1.chunk.js} +2 -2
  12. package/build/static/js/{577.e3e02e10.chunk.js.map → 577.0fbaedf1.chunk.js.map} +1 -1
  13. package/build/static/js/{58.76e74329.chunk.js → 58.e067338b.chunk.js} +2 -2
  14. package/build/static/js/{58.76e74329.chunk.js.map → 58.e067338b.chunk.js.map} +1 -1
  15. package/build/static/js/{634.955be5c1.chunk.js → 634.f8d70077.chunk.js} +3 -3
  16. package/build/static/js/{634.955be5c1.chunk.js.LICENSE.txt → 634.f8d70077.chunk.js.LICENSE.txt} +0 -0
  17. package/build/static/js/{634.955be5c1.chunk.js.map → 634.f8d70077.chunk.js.map} +1 -1
  18. package/build/static/js/{639.1c59bbcb.chunk.js → 639.706303a6.chunk.js} +2 -2
  19. package/build/static/js/{639.1c59bbcb.chunk.js.map → 639.706303a6.chunk.js.map} +1 -1
  20. package/build/static/js/main.160a0583.js +3 -0
  21. package/build/static/js/{main.31dca7c2.js.LICENSE.txt → main.160a0583.js.LICENSE.txt} +0 -0
  22. package/build/static/js/main.160a0583.js.map +1 -0
  23. package/package.json +2 -2
  24. package/build/static/js/main.31dca7c2.js +0 -3
  25. package/build/static/js/main.31dca7c2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"static/js/225.0bdfad83.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/assign/index.js","../node_modules/date-fns/esm/_lib/cloneObject/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 * @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}","export default function assign(target, object) {\n if (target == null) {\n throw new TypeError('assign requires that input parameter not be null or undefined');\n }\n\n for (var property in object) {\n if (Object.prototype.hasOwnProperty.call(object, property)) {\n ;\n target[property] = object[property];\n }\n }\n\n return target;\n}","import assign from \"../assign/index.js\";\nexport default function cloneObject(object) {\n return assign({}, object);\n}","import { getDefaultOptions } from \"../_lib/defaultOptions/index.js\";\nimport 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 assign from \"../_lib/assign/index.js\";\nimport defaultLocale from \"../_lib/defaultLocale/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 * @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, options) {\n var _ref, _options$locale, _options$roundingMeth;\n\n requiredArgs(2, arguments);\n var defaultOptions = getDefaultOptions();\n var locale = (_ref = (_options$locale = options === null || options === void 0 ? void 0 : options.locale) !== null && _options$locale !== void 0 ? _options$locale : defaultOptions.locale) !== null && _ref !== void 0 ? _ref : 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 = assign(cloneObject(options), {\n addSuffix: Boolean(options === null || options === void 0 ? void 0 : options.addSuffix),\n comparison: comparison\n });\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 = String((_options$roundingMeth = options === null || options === void 0 ? void 0 : options.roundingMethod) !== null && _options$roundingMeth !== void 0 ? _options$roundingMeth : 'round');\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 defaultUnit = options === null || options === void 0 ? void 0 : options.unit;\n var unit;\n\n if (!defaultUnit) {\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(defaultUnit);\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 && defaultUnit !== '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 * const 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 * const result = formatDistanceToNowStrict(\n * new Date(2015, 0, 1, 0, 0, 15)\n * )\n * //=> '15 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * const 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 * const 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 January 2016 in Esperanto?\n * const eoLocale = require('date-fns/locale/eo')\n * const result = formatDistanceToNowStrict(\n * new Date(2016, 0, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceToNowStrict(dirtyDate, options) {\n requiredArgs(1, arguments);\n return formatDistanceStrict(dirtyDate, Date.now(), options);\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","object","TypeError","property","cloneObject","MILLISECONDS_IN_MINUTE","MINUTES_IN_DAY","MINUTES_IN_MONTH","MINUTES_IN_YEAR","formatDistanceStrict","dirtyDate","dirtyBaseDate","options","_ref","_options$locale","_options$roundingMeth","defaultOptions","getDefaultOptions","locale","defaultLocale","formatDistance","RangeError","comparison","isNaN","localizeOptions","addSuffix","Boolean","roundingMethodFn","roundingMethod","String","Math","floor","ceil","round","unit","milliseconds","minutes","timezoneOffset","getTimezoneOffsetInMilliseconds","dstNormalizedMinutes","defaultUnit","seconds","roundedMinutes","hours","days","months","years","formatDistanceToNowStrict","Date","now","_taggedTemplateLiteral","strings","raw","slice","freeze","defineProperties"],"sourceRoot":""}
1
+ {"version":3,"file":"static/js/225.8711ae88.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/assign/index.js","../node_modules/date-fns/esm/_lib/cloneObject/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 * @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}","export default function assign(target, object) {\n if (target == null) {\n throw new TypeError('assign requires that input parameter not be null or undefined');\n }\n\n for (var property in object) {\n if (Object.prototype.hasOwnProperty.call(object, property)) {\n ;\n target[property] = object[property];\n }\n }\n\n return target;\n}","import assign from \"../assign/index.js\";\nexport default function cloneObject(object) {\n return assign({}, object);\n}","import { getDefaultOptions } from \"../_lib/defaultOptions/index.js\";\nimport 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 assign from \"../_lib/assign/index.js\";\nimport defaultLocale from \"../_lib/defaultLocale/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 * @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, options) {\n var _ref, _options$locale, _options$roundingMeth;\n\n requiredArgs(2, arguments);\n var defaultOptions = getDefaultOptions();\n var locale = (_ref = (_options$locale = options === null || options === void 0 ? void 0 : options.locale) !== null && _options$locale !== void 0 ? _options$locale : defaultOptions.locale) !== null && _ref !== void 0 ? _ref : 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 = assign(cloneObject(options), {\n addSuffix: Boolean(options === null || options === void 0 ? void 0 : options.addSuffix),\n comparison: comparison\n });\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 = String((_options$roundingMeth = options === null || options === void 0 ? void 0 : options.roundingMethod) !== null && _options$roundingMeth !== void 0 ? _options$roundingMeth : 'round');\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 defaultUnit = options === null || options === void 0 ? void 0 : options.unit;\n var unit;\n\n if (!defaultUnit) {\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(defaultUnit);\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 && defaultUnit !== '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 * const 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 * const result = formatDistanceToNowStrict(\n * new Date(2015, 0, 1, 0, 0, 15)\n * )\n * //=> '15 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * const 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 * const 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 January 2016 in Esperanto?\n * const eoLocale = require('date-fns/locale/eo')\n * const result = formatDistanceToNowStrict(\n * new Date(2016, 0, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceToNowStrict(dirtyDate, options) {\n requiredArgs(1, arguments);\n return formatDistanceStrict(dirtyDate, Date.now(), options);\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","object","TypeError","property","cloneObject","MILLISECONDS_IN_MINUTE","MINUTES_IN_DAY","MINUTES_IN_MONTH","MINUTES_IN_YEAR","formatDistanceStrict","dirtyDate","dirtyBaseDate","options","_ref","_options$locale","_options$roundingMeth","defaultOptions","getDefaultOptions","locale","defaultLocale","formatDistance","RangeError","comparison","isNaN","localizeOptions","addSuffix","Boolean","roundingMethodFn","roundingMethod","String","Math","floor","ceil","round","unit","milliseconds","minutes","timezoneOffset","getTimezoneOffsetInMilliseconds","dstNormalizedMinutes","defaultUnit","seconds","roundedMinutes","hours","days","months","years","formatDistanceToNowStrict","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([[29],{50535:function(e,t,n){n.d(t,{y:function(){return c}});var r=n(28227),a=n(28735),i=n(53046),o=n(80184),c=function(e){var t=e.label,n=e.color,c=e.icon,s=(0,r.ff)("none","brightness(1.75)");return(0,o.jsxs)(a.Kq,{align:"center",direction:"row",filter:s,spacing:2,children:[(0,o.jsx)(i.Ee,{alt:"".concat(t," icon"),src:c,w:4}),(0,o.jsx)(a.xv,{color:n,fontWeight:"bold",children:t})]})}},2148:function(e,t,n){n.d(t,{N:function(){return o}});var r=n(81070),a=n(86617),i=n(80184),o=function(e){var t=e.children,n=e.language,o=a.dX.has(n),c=a.k8[n],s=o?"Click to view documentation in ".concat(c):"Documentation support for ".concat(c," is coming soon!");return(0,i.jsx)(r.u,{hasArrow:!0,label:s,placement:"top-start",children:(0,i.jsx)("span",{children:t})})}},64159:function(e,t,n){var r;n.d(t,{L:function(){return I},$:function(){return r}}),function(e){e.Wide="wide"}(r||(r={}));var a=n(1413),i=n(72791),o=n(28735),c=n(81070),s=n(11853),d=n(10297),l=n(19748),u=n(67003),f=n(79227),m=(0,n(88606).$)("packageCard",["author","description","downloads","languages","published","title","version","comment","wideContainer"]),h=n(80184),v=function(e){var t=e["data-testid"],n=e.tooltip,r=e.value;return(0,h.jsx)(c.u,{hasArrow:!0,isDisabled:!n,label:n,placement:"left",children:(0,h.jsx)(o.xv,{"data-testid":t,fontSize:"xs",zIndex:1,children:r})})},p=function(){var e,t,n,r=D(),a=r.author,i=r.metadata.date,o=r.name,c=(0,d.V)().data,p=null===c||void 0===c||null===(e=c.packages)||void 0===e||null===(t=e[o])||void 0===t||null===(n=t.downloads)||void 0===n?void 0:n.npm,x="string"===typeof a?a:a.name,g=new Date(i);return(0,h.jsxs)(h.Fragment,{children:[void 0!==p&&(0,h.jsx)(v,{"data-testid":m.downloads,tooltip:"Download numbers are periodically sourced from the npm registry",value:"".concat(p.toLocaleString()," weekly downloads")}),(0,h.jsx)(v,{"data-testid":m.published,value:(0,h.jsx)(f.q,{date:g,fontSize:"xs",formattedDate:(0,s.Z)(g,{addSuffix:!0})})}),(0,h.jsx)(v,{"data-testid":m.author,value:(0,h.jsxs)(h.Fragment,{children:["By"," ",(0,h.jsx)(u.O,{color:"link",to:(0,l.yc)({query:x}),children:x})]})})]})},x=n(29439),g=n(91523),j=n(59534),w=n(7991),b=n(77766),y=function(e){var t=e.comment;return(0,h.jsxs)(o.xv,{"data-testid":m.comment,fontSize:"md",lineHeight:"tall",noOfLines:4,children:[(0,h.jsxs)(o.xv,{as:"span",color:"blue.500",fontWeight:"bold",children:["Editor's note:"," "]}),t]})},k=function(){var e=(0,w.Z)(),t=(0,x.Z)(e,1)[0],n=D(),r=n.dataEvent,a=n.description,i=n.comment,c=n.constructFrameworks,s=n.name,d=n.version;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(o.AB,{as:g.rU,"data-event":r?(0,j.oJ)(r,"Package Card",s):void 0,to:(0,l.Mt)({name:s,version:d,language:t}),children:(0,h.jsxs)(o.kC,{align:"center",children:[(0,h.jsx)(b.u,{constructFrameworks:c,mr:2,zIndex:1}),(0,h.jsx)(o.X6,{as:"h3",color:"textPrimary","data-testid":m.title,fontSize:"md",fontWeight:"bold",wordBreak:"normal",children:s})]})}),i?(0,h.jsx)(y,{comment:i}):(0,h.jsx)(o.xv,{color:"textPrimary","data-testid":m.description,fontSize:"md",lineHeight:"tall",noOfLines:4,children:a||"No description available."})]})},S=n(98371),Z=n(50535),T=function(){var e,t,n=(null!==(e=null===(t=D())||void 0===t?void 0:t.metadata)&&void 0!==e?e:{}).packageTags,r=void 0===n?[]:n,i=(0,S.JA)(r),c=(0,x.Z)(i,1)[0];return c?(0,h.jsx)(o.xu,{fontSize:"xs",children:(0,h.jsx)(Z.y,(0,a.Z)({},c))}):null},C=n(86617),L=n(2148),z={sm:5,md:6,lg:8},P=function(e){var t=e.isRounded,n=void 0!==t&&t,r=e.languages,a=e.name,i=e.size,o=void 0===i?"md":i,c=e.version,s=Object.keys(null!==r&&void 0!==r?r:{});return(0,h.jsx)(h.Fragment,{children:Object.entries(C.kP).sort((function(e,t){var n=(0,x.Z)(e,1)[0],r=(0,x.Z)(t,1)[0];return C.a2.indexOf(n)-C.a2.indexOf(r)})).map((function(e){var t=(0,x.Z)(e,2),r=t[0],i=t[1],d=r,u=d===C.SQ.TypeScript||s.includes(d),f=d===C.SQ.TypeScript||C.dX.has(d);if(!u)return null;var m=i.name,v=i.icon,p=(0,h.jsx)(v,{"aria-label":"Supports ".concat(m),borderRadius:n?"50%":0,h:z[o],opacity:f?1:.2,w:z[o]});return(0,h.jsx)(L.N,{language:d,children:f?(0,h.jsx)(g.rU,{"aria-label":"View package docs for ".concat(d),to:(0,l.Mt)({name:a,version:c,language:d}),children:p}):p},d)}))})},q=function(){var e=D();return(0,h.jsx)(P,(0,a.Z)((0,a.Z)({},e),{},{size:"sm"}))},A=n(29988),E=function(){var e=D(),t=e.keywords,n=void 0===t?[]:t,r=e.metadata.packageTags,a=void 0===r?[]:r,i=(0,S.QX)({packageTags:a,keywords:n});return(0,h.jsx)(h.Fragment,{children:i.slice(0,10).map((function(e){var t=e.id,n=e.keyword,r=(n=void 0===n?{}:n).label,a=n.color;return(0,h.jsx)(A.X,{value:t,variant:a,children:r},t)}))})},F=function(){return(0,h.jsx)(o.fG,{_hover:{"> article":{bg:"hoverPrimary"}},children:(0,h.jsxs)(o.rj,{as:"article",bg:"bgSecondary",border:"base",borderRadius:"sm",boxShadow:"base",color:"textPrimary","data-testid":m.wideContainer,h:"full",minH:"12.5rem",templateColumns:{base:"1fr",lg:"1fr 14rem"},w:"full",children:[(0,h.jsxs)(o.kC,{direction:"column",justify:"space-between",overflow:"hidden",p:5,sx:{gap:"0.5rem"},children:[(0,h.jsx)(o.Kq,{spacing:3,children:(0,h.jsx)(k,{})}),(0,h.jsx)(o.kC,{align:"center",sx:{gap:"0.5rem"},wrap:"wrap",children:(0,h.jsx)(E,{})})]}),(0,h.jsxs)(o.kC,{align:{base:"end",lg:"initial"},borderLeft:{lg:"base"},borderTop:{base:"base",lg:"none"},direction:{base:"row",lg:"column"},justify:"space-between",p:5,sx:{gap:"0.5rem"},children:[(0,h.jsxs)(o.Kq,{spacing:1,children:[(0,h.jsx)(T,{}),(0,h.jsx)(o.Kq,{spacing:1,children:(0,h.jsx)(p,{})})]}),(0,h.jsx)(o.Kq,{"data-testid":m.languages,direction:"row",spacing:2,children:(0,h.jsx)(q,{})})]})]})})},O=(0,i.createContext)(null),D=function(){return(0,i.useContext)(O)},I=function(e){var t=e["data-event"],n=e.pkg,i=e.variant,o=void 0===i?r.Wide:i;return(0,h.jsx)(O.Provider,{value:(0,a.Z)((0,a.Z)({},n),{},{dataEvent:t}),children:o===r.Wide&&(0,h.jsx)(F,{})})}},29988:function(e,t,n){n.d(t,{X:function(){return l}});var r=n(1413),a=n(45987),i=n(96450),o=n(19748),c=n(67003),s=n(80184),d=["children","value","label","zIndex"],l=function(e){var t=e.children,n=e.value,l=e.label,u=void 0===l?n:l,f=e.zIndex,m=(0,a.Z)(e,d);return(0,s.jsx)(c.O,{"aria-label":"Tag: ".concat(u),to:(0,o.yc)({keywords:[n]}),zIndex:f,children:(0,s.jsx)(i.Vp,(0,r.Z)((0,r.Z)({_hover:{textDecoration:"underline"}},m),{},{children:(0,s.jsx)(i.Sn,{children:t})}))})}},41712:function(e,t,n){n.d(t,{T:function(){return d}});var r=n(72791),a=n(54270),i={contribute:{event:{name:"Contribute Load"}},home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},o=n(59534),c=n(56804),s=n(80184),d=(["default-src 'self' 'unsafe-inline' http://*.awsstatic.com;","connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;","frame-src http://aws.demdex.net http://dpm.demdex.net;","img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;","object-src 'none';","style-src 'self' 'unsafe-inline';"].join(" "),function(e){var t=e.children,n=e.meta,d=e.pageName,l=(0,o.aQ)(i[d]);(0,r.useEffect)((function(){l()}),[l]);var u=(0,c.E)("feeds")||[],f=n.suffix,m=void 0===f||f,h=n.title,v=n.description,p=m?"".concat(h," - Construct Hub"):h;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(a.q,{children:[!1,(0,s.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),(0,s.jsx)("meta",{charSet:"utf-8"}),u.map((function(e){var t=e.url,n=e.mimeType;return(0,s.jsx)("link",{href:t,rel:"alternate",type:n},t)})),(0,s.jsx)("title",{children:p}),(0,s.jsx)("meta",{content:p,property:"og:title"}),(0,s.jsx)("meta",{content:p,name:"twitter:title"}),(0,s.jsx)("meta",{content:"summary",name:"twitter:card"}),(0,s.jsx)("meta",{content:v,name:"description"}),(0,s.jsx)("meta",{content:v,property:"og:description"}),(0,s.jsx)("meta",{content:v,name:"twitter:description"})]}),t]})})},79227:function(e,t,n){n.d(t,{q:function(){return l}});var r=n(1413),a=n(45987),i=n(63209),o=n(28735),c=n(29158),s=n(80184),d=["date","format","formattedDate"],l=(0,i.Gp)((function(e,t){var n=e.date,i=e.format,l=e.formattedDate,u=(0,a.Z)(e,d);return(0,s.jsx)(o.xu,(0,r.Z)((0,r.Z)({as:"time",dateTime:n.toISOString(),ref:t},u),{},{children:null!==l&&void 0!==l?l:(0,c.Z)(n,null!==i&&void 0!==i?i:"")}))}));l.displayName="Time"},56804:function(e,t,n){n.d(t,{E:function(){return a}});var r=n(24026),a=function(e){var t=(0,r.Z)().data;return(null!==t&&void 0!==t?t:{})[e]}},7991:function(e,t,n){n.d(t,{Z:function(){return m}});var r=n(29439),a=n(72791),i=n(79271),o=n(86617),c=n(29499),s=n(4487),d=o.SQ.TypeScript,l="preferred-language",u=function(e){return null!=e&&o.dX.has(e)},f=function(e){if(u(e))return e;try{var t,n=null!==(t=localStorage.getItem(l))&&void 0!==t?t:"";if(u(n))return n}catch(r){}return d},m=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.updateUrl,n=e.updateSaved,o=(0,i.TH)(),d=o.pathname,m=o.hash,h=(0,i.k6)(),v=h.replace,p=(0,s.K)(),x=p.get(c.Tx.LANGUAGE),g=(0,a.useState)((function(){return f(x)})),j=(0,r.Z)(g,2),w=j[0],b=j[1];(0,a.useEffect)((function(){u(x)&&x!==w&&b(x)}),[x]),(0,a.useEffect)((function(){x!==w&&t&&(p.set(c.Tx.LANGUAGE,w),v({pathname:d,hash:m,search:p.toString()}))}),[w,t]);var y=(0,a.useCallback)((function(e){if(b(e),n)try{localStorage.setItem(l,e)}catch(t){}}),[n]);return(0,a.useMemo)((function(){return[w,y]}),[w,y])}},4487:function(e,t,n){n.d(t,{K:function(){return i}});var r=n(72791),a=n(79271),i=function(){var e=(0,a.TH)().search;return(0,r.useMemo)((function(){return new URLSearchParams(e)}),[e])}},98371:function(e,t,n){n.d(t,{JA:function(){return o},QX:function(){return c}});var r=n(1413),a=n(93433),i=n(9272),o=function(e){return!e||e.length<1?[]:e.reduce((function(e,t){return t.highlight?[].concat((0,a.Z)(e),[t.highlight]):e}),[])},c=function(e){for(var t=e.packageTags,n=e.keywords,o=new Array,c=new Set,s=0,d=[].concat((0,a.Z)(function(e){return(null!==e&&void 0!==e?e:[]).filter((function(e){var t;return Boolean(null===(t=e.keyword)||void 0===t?void 0:t.label)})).map((function(e){var t;return(0,r.Z)((0,r.Z)({},e),{},{id:null===(t=e.keyword)||void 0===t?void 0:t.label})}))}(t)),(0,a.Z)(function(e){return!e||e.length<1?[]:e.filter((function(e){return Boolean(e)&&!i.h.has(e)})).map((function(e){return{id:e,keyword:{label:e}}}))}(n)));s<d.length;s++){var l=d[s],u=l.keyword.label.toLowerCase();c.has(u)||(o.push(l),c.add(u))}return o}}}]);
2
- //# sourceMappingURL=29.1c8de512.chunk.js.map
1
+ "use strict";(self.webpackChunkconstruct_hub_webapp=self.webpackChunkconstruct_hub_webapp||[]).push([[29],{50535:function(e,t,n){n.d(t,{y:function(){return c}});var r=n(28227),a=n(28735),i=n(53046),o=n(80184),c=function(e){var t=e.label,n=e.color,c=e.icon,s=(0,r.ff)("none","brightness(1.75)");return(0,o.jsxs)(a.Kq,{align:"center",direction:"row",filter:s,spacing:2,children:[(0,o.jsx)(i.Ee,{alt:"".concat(t," icon"),src:c,w:4}),(0,o.jsx)(a.xv,{color:n,fontWeight:"bold",children:t})]})}},2148:function(e,t,n){n.d(t,{N:function(){return o}});var r=n(81070),a=n(86617),i=n(80184),o=function(e){var t=e.children,n=e.language,o=a.dX.has(n),c=a.k8[n],s=o?"Click to view documentation in ".concat(c):"Documentation support for ".concat(c," is coming soon!");return(0,i.jsx)(r.u,{hasArrow:!0,label:s,placement:"top-start",children:(0,i.jsx)("span",{children:t})})}},64159:function(e,t,n){var r;n.d(t,{L:function(){return I},$:function(){return r}}),function(e){e.Wide="wide"}(r||(r={}));var a=n(1413),i=n(72791),o=n(28735),c=n(81070),s=n(11853),d=n(10297),l=n(19748),u=n(67003),f=n(79227),m=(0,n(88606).$)("packageCard",["author","description","downloads","languages","published","title","version","comment","wideContainer"]),h=n(80184),v=function(e){var t=e["data-testid"],n=e.tooltip,r=e.value;return(0,h.jsx)(c.u,{hasArrow:!0,isDisabled:!n,label:n,placement:"left",children:(0,h.jsx)(o.xv,{"data-testid":t,fontSize:"xs",zIndex:1,children:r})})},p=function(){var e,t,n,r=D(),a=r.author,i=r.metadata.date,o=r.name,c=(0,d.V)().data,p=null===c||void 0===c||null===(e=c.packages)||void 0===e||null===(t=e[o])||void 0===t||null===(n=t.downloads)||void 0===n?void 0:n.npm,x="string"===typeof a?a:a.name,g=new Date(i);return(0,h.jsxs)(h.Fragment,{children:[void 0!==p&&(0,h.jsx)(v,{"data-testid":m.downloads,tooltip:"Download numbers are periodically sourced from the npm registry",value:"".concat(p.toLocaleString()," weekly downloads")}),(0,h.jsx)(v,{"data-testid":m.published,value:(0,h.jsx)(f.q,{date:g,fontSize:"xs",formattedDate:(0,s.Z)(g,{addSuffix:!0})})}),(0,h.jsx)(v,{"data-testid":m.author,value:(0,h.jsxs)(h.Fragment,{children:["By"," ",(0,h.jsx)(u.O,{color:"link",to:(0,l.yc)({query:x}),children:x})]})})]})},x=n(29439),g=n(91523),j=n(59534),w=n(7991),b=n(77766),y=function(e){var t=e.comment;return(0,h.jsxs)(o.xv,{"data-testid":m.comment,fontSize:"md",lineHeight:"tall",noOfLines:4,children:[(0,h.jsxs)(o.xv,{as:"span",color:"blue.500",fontWeight:"bold",children:["Editor's note:"," "]}),t]})},k=function(){var e=(0,w.Z)(),t=(0,x.Z)(e,1)[0],n=D(),r=n.dataEvent,a=n.description,i=n.comment,c=n.constructFrameworks,s=n.name,d=n.version;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(o.AB,{as:g.rU,"data-event":r?(0,j.oJ)(r,"Package Card",s):void 0,to:(0,l.Mt)({name:s,version:d,language:t}),children:(0,h.jsxs)(o.kC,{align:"center",children:[(0,h.jsx)(b.u,{constructFrameworks:c,mr:2,zIndex:1}),(0,h.jsx)(o.X6,{as:"h3",color:"textPrimary","data-testid":m.title,fontSize:"md",fontWeight:"bold",wordBreak:"normal",children:s})]})}),i?(0,h.jsx)(y,{comment:i}):(0,h.jsx)(o.xv,{color:"textPrimary","data-testid":m.description,fontSize:"md",lineHeight:"tall",noOfLines:4,children:a||"No description available."})]})},S=n(98371),Z=n(50535),T=function(){var e,t,n=(null!==(e=null===(t=D())||void 0===t?void 0:t.metadata)&&void 0!==e?e:{}).packageTags,r=void 0===n?[]:n,i=(0,S.JA)(r),c=(0,x.Z)(i,1)[0];return c?(0,h.jsx)(o.xu,{fontSize:"xs",children:(0,h.jsx)(Z.y,(0,a.Z)({},c))}):null},C=n(86617),L=n(2148),z={sm:5,md:6,lg:8},P=function(e){var t=e.isRounded,n=void 0!==t&&t,r=e.languages,a=e.name,i=e.size,o=void 0===i?"md":i,c=e.version,s=Object.keys(null!==r&&void 0!==r?r:{});return(0,h.jsx)(h.Fragment,{children:Object.entries(C.kP).sort((function(e,t){var n=(0,x.Z)(e,1)[0],r=(0,x.Z)(t,1)[0];return C.a2.indexOf(n)-C.a2.indexOf(r)})).map((function(e){var t=(0,x.Z)(e,2),r=t[0],i=t[1],d=r,u=d===C.SQ.TypeScript||s.includes(d),f=d===C.SQ.TypeScript||C.dX.has(d);if(!u)return null;var m=i.name,v=i.icon,p=(0,h.jsx)(v,{"aria-label":"Supports ".concat(m),borderRadius:n?"50%":0,h:z[o],opacity:f?1:.2,w:z[o]});return(0,h.jsx)(L.N,{language:d,children:f?(0,h.jsx)(g.rU,{"aria-label":"View package docs for ".concat(d),to:(0,l.Mt)({name:a,version:c,language:d}),children:p}):p},d)}))})},q=function(){var e=D();return(0,h.jsx)(P,(0,a.Z)((0,a.Z)({},e),{},{size:"sm"}))},A=n(29988),E=function(){var e=D(),t=e.keywords,n=void 0===t?[]:t,r=e.metadata.packageTags,a=void 0===r?[]:r,i=(0,S.QX)({packageTags:a,keywords:n});return(0,h.jsx)(h.Fragment,{children:i.slice(0,10).map((function(e){var t=e.id,n=e.keyword,r=(n=void 0===n?{}:n).label,a=n.color;return(0,h.jsx)(A.X,{value:t,variant:a,children:r},t)}))})},F=function(){return(0,h.jsx)(o.fG,{_hover:{"> article":{bg:"hoverPrimary"}},children:(0,h.jsxs)(o.rj,{as:"article",bg:"bgSecondary",border:"base",borderRadius:"sm",boxShadow:"base",color:"textPrimary","data-testid":m.wideContainer,h:"full",minH:"12.5rem",templateColumns:{base:"1fr",lg:"1fr 14rem"},w:"full",children:[(0,h.jsxs)(o.kC,{direction:"column",justify:"space-between",overflow:"hidden",p:5,sx:{gap:"0.5rem"},children:[(0,h.jsx)(o.Kq,{spacing:3,children:(0,h.jsx)(k,{})}),(0,h.jsx)(o.kC,{align:"center",sx:{gap:"0.5rem"},wrap:"wrap",children:(0,h.jsx)(E,{})})]}),(0,h.jsxs)(o.kC,{align:{base:"end",lg:"initial"},borderLeft:{lg:"base"},borderTop:{base:"base",lg:"none"},direction:{base:"row",lg:"column"},justify:"space-between",p:5,sx:{gap:"0.5rem"},children:[(0,h.jsxs)(o.Kq,{spacing:1,children:[(0,h.jsx)(T,{}),(0,h.jsx)(o.Kq,{spacing:1,children:(0,h.jsx)(p,{})})]}),(0,h.jsx)(o.Kq,{"data-testid":m.languages,direction:"row",spacing:2,children:(0,h.jsx)(q,{})})]})]})})},O=(0,i.createContext)(null),D=function(){return(0,i.useContext)(O)},I=function(e){var t=e["data-event"],n=e.pkg,i=e.variant,o=void 0===i?r.Wide:i;return(0,h.jsx)(O.Provider,{value:(0,a.Z)((0,a.Z)({},n),{},{dataEvent:t}),children:o===r.Wide&&(0,h.jsx)(F,{})})}},29988:function(e,t,n){n.d(t,{X:function(){return l}});var r=n(1413),a=n(45987),i=n(96450),o=n(19748),c=n(67003),s=n(80184),d=["children","value","label","zIndex"],l=function(e){var t=e.children,n=e.value,l=e.label,u=void 0===l?n:l,f=e.zIndex,m=(0,a.Z)(e,d);return(0,s.jsx)(c.O,{"aria-label":"Tag: ".concat(u),to:(0,o.yc)({keywords:[n]}),zIndex:f,children:(0,s.jsx)(i.Vp,(0,r.Z)((0,r.Z)({_hover:{textDecoration:"underline"}},m),{},{children:(0,s.jsx)(i.Sn,{children:t})}))})}},41712:function(e,t,n){n.d(t,{T:function(){return d}});var r=n(72791),a=n(54270),i={contribute:{event:{name:"Contribute Load"}},home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},o=n(59534),c=n(56804),s=n(80184),d=(["default-src 'self' 'unsafe-inline' http://*.awsstatic.com;","connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;","frame-src http://aws.demdex.net http://dpm.demdex.net;","img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;","object-src 'none';","style-src 'self' 'unsafe-inline';"].join(" "),function(e){var t=e.children,n=e.meta,d=e.pageName,l=(0,o.aQ)(i[d]);(0,r.useEffect)((function(){l()}),[l]);var u=(0,c.E)("feeds")||[],f=n.suffix,m=void 0===f||f,h=n.title,v=n.description,p=m?"".concat(h," - Construct Hub"):h;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(a.q,{children:[!1,(0,s.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),(0,s.jsx)("meta",{charSet:"utf-8"}),u.map((function(e){var t=e.url,n=e.mimeType;return(0,s.jsx)("link",{href:t,rel:"alternate",type:n},t)})),(0,s.jsx)("title",{children:p}),(0,s.jsx)("meta",{content:p,property:"og:title"}),(0,s.jsx)("meta",{content:p,name:"twitter:title"}),(0,s.jsx)("meta",{content:"summary",name:"twitter:card"}),(0,s.jsx)("meta",{content:v,name:"description"}),(0,s.jsx)("meta",{content:v,property:"og:description"}),(0,s.jsx)("meta",{content:v,name:"twitter:description"})]}),t]})})},79227:function(e,t,n){n.d(t,{q:function(){return l}});var r=n(1413),a=n(45987),i=n(31959),o=n(28735),c=n(29158),s=n(80184),d=["date","format","formattedDate"],l=(0,i.Gp)((function(e,t){var n=e.date,i=e.format,l=e.formattedDate,u=(0,a.Z)(e,d);return(0,s.jsx)(o.xu,(0,r.Z)((0,r.Z)({as:"time",dateTime:n.toISOString(),ref:t},u),{},{children:null!==l&&void 0!==l?l:(0,c.Z)(n,null!==i&&void 0!==i?i:"")}))}));l.displayName="Time"},56804:function(e,t,n){n.d(t,{E:function(){return a}});var r=n(24026),a=function(e){var t=(0,r.Z)().data;return(null!==t&&void 0!==t?t:{})[e]}},7991:function(e,t,n){n.d(t,{Z:function(){return m}});var r=n(29439),a=n(72791),i=n(79271),o=n(86617),c=n(29499),s=n(4487),d=o.SQ.TypeScript,l="preferred-language",u=function(e){return null!=e&&o.dX.has(e)},f=function(e){if(u(e))return e;try{var t,n=null!==(t=localStorage.getItem(l))&&void 0!==t?t:"";if(u(n))return n}catch(r){}return d},m=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.updateUrl,n=e.updateSaved,o=(0,i.TH)(),d=o.pathname,m=o.hash,h=(0,i.k6)(),v=h.replace,p=(0,s.K)(),x=p.get(c.Tx.LANGUAGE),g=(0,a.useState)((function(){return f(x)})),j=(0,r.Z)(g,2),w=j[0],b=j[1];(0,a.useEffect)((function(){u(x)&&x!==w&&b(x)}),[x]),(0,a.useEffect)((function(){x!==w&&t&&(p.set(c.Tx.LANGUAGE,w),v({pathname:d,hash:m,search:p.toString()}))}),[w,t]);var y=(0,a.useCallback)((function(e){if(b(e),n)try{localStorage.setItem(l,e)}catch(t){}}),[n]);return(0,a.useMemo)((function(){return[w,y]}),[w,y])}},4487:function(e,t,n){n.d(t,{K:function(){return i}});var r=n(72791),a=n(79271),i=function(){var e=(0,a.TH)().search;return(0,r.useMemo)((function(){return new URLSearchParams(e)}),[e])}},98371:function(e,t,n){n.d(t,{JA:function(){return o},QX:function(){return c}});var r=n(1413),a=n(93433),i=n(9272),o=function(e){return!e||e.length<1?[]:e.reduce((function(e,t){return t.highlight?[].concat((0,a.Z)(e),[t.highlight]):e}),[])},c=function(e){for(var t=e.packageTags,n=e.keywords,o=new Array,c=new Set,s=0,d=[].concat((0,a.Z)(function(e){return(null!==e&&void 0!==e?e:[]).filter((function(e){var t;return Boolean(null===(t=e.keyword)||void 0===t?void 0:t.label)})).map((function(e){var t;return(0,r.Z)((0,r.Z)({},e),{},{id:null===(t=e.keyword)||void 0===t?void 0:t.label})}))}(t)),(0,a.Z)(function(e){return!e||e.length<1?[]:e.filter((function(e){return Boolean(e)&&!i.h.has(e)})).map((function(e){return{id:e,keyword:{label:e}}}))}(n)));s<d.length;s++){var l=d[s],u=l.keyword.label.toLowerCase();c.has(u)||(o.push(l),c.add(u))}return o}}}]);
2
+ //# sourceMappingURL=29.4850c1e7.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static/js/29.1c8de512.chunk.js","mappings":"iNASaA,EAA+C,SAAC,GAItC,IAHrBC,EAGoB,EAHpBA,MACAC,EAEoB,EAFpBA,MACAC,EACoB,EADpBA,KAEMC,GAAaC,EAAAA,EAAAA,IAAkB,OAAQ,oBAC7C,OACE,UAAC,KAAD,CAAOC,MAAM,SAASC,UAAU,MAAMC,OAAQJ,EAAYK,QAAS,EAAnE,WACE,SAAC,KAAD,CAAOC,IAAG,UAAKT,EAAL,SAAmBU,IAAKR,EAAMS,EAAG,KAC3C,SAAC,KAAD,CAAMV,MAAOA,EAAOW,WAAW,OAA/B,SACGZ,MAIR,C,4FCXYa,EAET,SAAC,GAA4B,IAA1BC,EAAyB,EAAzBA,SAAUC,EAAe,EAAfA,SACTC,EAAcC,EAAAA,GAAAA,IAA6BF,GAC3CG,EAAWC,EAAAA,GAAkBJ,GAE7BK,EAAUJ,EAAW,yCACWE,GADX,oCAEMA,EAFN,oBAI3B,OACE,SAAC,IAAD,CAASG,UAAQ,EAACrB,MAAOoB,EAASE,UAAU,YAA5C,UACE,0BAAOR,KAGZ,C,wBC3BM,IAAKS,E,uDAAZ,SAAYA,GAAAA,EAAAA,KAAAA,MAAAA,CAAZ,CAAYA,IAAAA,EAAAA,CAAAA,I,sGCcZ,GAZgBC,E,SAAAA,GAAc,cAAe,CAC3C,SACA,cACA,YACA,YACA,YACA,QACA,UACA,UACA,kB,WCKIC,EAAyC,SAAC,GAAD,IAC9BC,EAD8B,EAC7C,eACAC,EAF6C,EAE7CA,QACAC,EAH6C,EAG7CA,MAH6C,OAK7C,SAAC,IAAD,CAASP,UAAQ,EAACQ,YAAaF,EAAS3B,MAAO2B,EAASL,UAAU,OAAlE,UAEE,SAAC,KAAD,CAAM,cAAaI,EAAYI,SAAS,KAAKC,OAAQ,EAArD,SACGH,KARwC,EAalCI,EAA6B,WAAO,IAAD,MAC9C,EAIIC,IAHFC,EADF,EACEA,OACYC,EAFd,EAEEC,SAAYD,KACZE,EAHF,EAGEA,KAGMC,GAASC,EAAAA,EAAAA,KAATD,KACFE,EAA6B,OAAGF,QAAH,IAAGA,GAAH,UAAGA,EAAMG,gBAAT,iBAAG,EAAiBJ,UAApB,iBAAG,EAAwBG,iBAA3B,aAAG,EAAmCE,IAEnEC,EAA+B,kBAAXT,EAAsBA,EAASA,EAAOG,KAC1DO,EAAc,IAAIC,KAAKV,GAE7B,OACE,qCACiBW,IAAdN,IACC,SAACf,EAAD,CACE,cAAasB,EAAAA,UACbpB,QAAQ,kEACRC,MAAK,UAAKY,EAAUQ,iBAAf,wBAGT,SAACvB,EAAD,CACE,cAAasB,EAAAA,UACbnB,OACE,SAACqB,EAAA,EAAD,CACEd,KAAMS,EACNd,SAAS,KACToB,eAAeC,EAAAA,EAAAA,GAA0BP,EAAa,CACpDQ,WAAW,SAKnB,SAAC3B,EAAD,CACE,cAAasB,EAAAA,OACbnB,OACE,qCACK,KACH,SAACyB,EAAA,EAAD,CACEpD,MAAM,OACNqD,IAAIC,EAAAA,EAAAA,IAAc,CAChBC,MAAOb,IAHX,SAMGA,WAOd,E,sDC7EYc,EAAuD,SAAC,GAE9D,IADLC,EACI,EADJA,QAEA,OACE,UAAC,KAAD,CACE,cAAaX,EAAAA,QACbjB,SAAS,KACT6B,WAAW,OACXC,UAAW,EAJb,WAME,UAAC,KAAD,CAAMC,GAAG,OAAO5D,MAAM,WAAWW,WAAW,OAA5C,2BACsB,OAErB8C,IAGN,ECJYI,EAA6B,WACxC,OAA0BC,EAAAA,EAAAA,KAAnBC,GAAP,eACA,EAOI/B,IANFgC,EADF,EACEA,UACAC,EAFF,EAEEA,YACAR,EAHF,EAGEA,QACAS,EAJF,EAIEA,oBACA9B,EALF,EAKEA,KACA+B,EANF,EAMEA,QAGF,OACE,iCACE,SAAC,KAAD,CACEP,GAAIQ,EAAAA,GACJ,aACEJ,GAAYK,EAAAA,EAAAA,IAAUL,EAAW,eAAgB5B,QAAQS,EAE3DQ,IAAIiB,EAAAA,EAAAA,IAAe,CACjBlC,KAAAA,EACA+B,QAAAA,EACArD,SAAUiD,IARd,UAWE,UAAC,KAAD,CAAM3D,MAAM,SAAZ,WACE,SAACmE,EAAA,EAAD,CACEL,oBAAqBA,EACrBM,GAAI,EACJ1C,OAAQ,KAEV,SAAC,KAAD,CACE8B,GAAG,KACH5D,MAAM,cACN,cAAa8C,EAAAA,MACbjB,SAAS,KACTlB,WAAW,OACX8D,UAAU,SANZ,SAQGrC,SAINqB,GACC,SAACD,EAAD,CAAaC,QAASA,KAEtB,SAAC,KAAD,CACEzD,MAAM,cACN,cAAa8C,EAAAA,YACbjB,SAAS,KACT6B,WAAW,OACXC,UAAW,EALb,SAOGM,GAAe,gCAKzB,E,sBCnEYnE,EAA+B,WAAO,IAAD,IAChD,uBAA6BkC,WAA7B,aAA6B,EAAkBG,gBAA/C,QAA2D,CAAC,GAApDuC,YAAAA,OAAR,MAAsB,GAAtB,EACA,GAAoBC,EAAAA,EAAAA,IAAeD,GAA5BE,GAAP,eAEA,OAAKA,GAGH,SAAC,KAAD,CAAK/C,SAAS,KAAd,UACE,SAAC,KAAD,UAAwB+C,MAJL,IAOxB,E,qBCNKC,EAAQ,CACZC,GAAI,EACJC,GAAI,EACJC,GAAI,GAWOC,EAA6D,SAAC,GAMpE,IAAD,IALJC,UAAAA,OAKI,SAJJC,EAII,EAJJA,UACMC,EAGF,EAHJhD,KAGI,IAFJiD,KAAAA,OAEI,MAFG,KAEH,EADJlB,EACI,EADJA,QAEMmB,EAAUC,OAAOC,KAAP,OAAYL,QAAZ,IAAYA,EAAAA,EAAa,CAAC,GAC1C,OACE,8BACGI,OAAOE,QAAQC,EAAAA,IAEbC,MACC,kBAAEC,GAAF,eAAUC,GAAV,sBACEC,EAAAA,GAAAA,QAAkBF,GAClBE,EAAAA,GAAAA,QAAkBD,EAFpB,IAIDE,KAAI,YAAmB,IAAD,eAAhBC,EAAgB,KAAVC,EAAU,KACfnF,EAAWkF,EAEXE,EACJpF,IAAaqF,EAAAA,GAAAA,YAAuBb,EAAQc,SAAStF,GAEjDuF,EACJvF,IAAaqF,EAAAA,GAAAA,YAEbnF,EAAAA,GAAAA,IAA6BF,GAE/B,IAAKoF,EAAsB,OAAO,KAElC,IAAQ9D,EAAqB6D,EAArB7D,KAAYkE,EAASL,EAAfhG,KAERA,GACJ,SAACqG,EAAD,CACE,gCAAwBlE,GACxBmE,aAAcrB,EAAY,MAAQ,EAClCsB,EAAG3B,EAAMQ,GACToB,QAASJ,EAA4B,EAAI,GACzC3F,EAAGmE,EAAMQ,KAIb,OACE,SAACzE,EAAA,EAAD,CAAuCE,SAAUA,EAAjD,SACGuF,GACC,SAAC,KAAD,CACE,6CAAqCvF,GACrCuC,IAAIiB,EAAAA,EAAAA,IAAe,CAAElC,KAAMgD,EAAajB,QAAAA,EAASrD,SAAAA,IAFnD,SAIGb,IAGHA,GATyBa,EAahC,KAGR,EChFY4F,EAA+B,WAC1C,IAAMC,EAAM3E,IACZ,OAAO,SAACiD,GAAD,kBAAsB0B,GAAtB,IAA2BtB,KAAK,OACxC,E,WCFYuB,EAA0B,WACrC,MAGI5E,IAHJ,IACE6E,SAAAA,OADF,MACa,GADb,MAEE1E,SAAYuC,YAAAA,OAFd,MAE4B,GAF5B,EAKMoC,GAAOC,EAAAA,EAAAA,IAAe,CAC1BrC,YAAAA,EACAmC,SAAAA,IAGF,OACE,8BACGC,EAAKE,MAAM,EAAG,IAAIjB,KAAI,gBAAGkB,EAAH,EAAGA,GAAH,IAAOC,QAAWnH,GAAlB,aAAmC,CAAC,EAApC,GAAkBA,MAAOC,EAAzB,EAAyBA,MAAzB,OACrB,SAACmH,EAAA,EAAD,CAAqBxF,MAAOsF,EAAIG,QAASpH,EAAzC,SACGD,GADckH,EADI,KAO5B,EChBYI,EAA8B,WACzC,OACE,SAAC,KAAD,CACEC,OAAQ,CACN,YAAa,CACXC,GAAI,iBAHV,UAOE,UAAC,KAAD,CACE3D,GAAG,UACH2D,GAAG,cACHC,OAAO,OACPjB,aAAa,KACbkB,UAAU,OACVzH,MAAM,cACN,cAAa8C,EAAAA,cACb0D,EAAE,OACFkB,KAAK,UACLC,gBAAiB,CAAEC,KAAM,MAAO5C,GAAI,aACpCtE,EAAE,OAXJ,WAcE,UAAC,KAAD,CACEL,UAAU,SACVwH,QAAQ,gBACRC,SAAS,SACTC,EAAG,EACHC,GAAI,CAAEC,IAAK,UALb,WAOE,SAAC,KAAD,CAAO1H,QAAS,EAAhB,UACE,SAACsD,EAAD,OAGF,SAAC,KAAD,CAAMzD,MAAM,SAAS4H,GAAI,CAAEC,IAAK,UAAYC,KAAK,OAAjD,UACE,SAACtB,EAAD,UAKJ,UAAC,KAAD,CACExG,MAAO,CAAEwH,KAAM,MAAO5C,GAAI,WAC1BmD,WAAY,CAAEnD,GAAI,QAClBoD,UAAW,CAAER,KAAM,OAAQ5C,GAAI,QAC/B3E,UAAW,CAAEuH,KAAM,MAAO5C,GAAI,UAC9B6C,QAAQ,gBACRE,EAAG,EACHC,GAAI,CAAEC,IAAK,UAPb,WASE,UAAC,KAAD,CAAO1H,QAAS,EAAhB,WACE,SAACT,EAAD,KACA,SAAC,KAAD,CAAOS,QAAS,EAAhB,UACE,SAACwB,EAAD,UAIJ,SAAC,KAAD,CAAO,cAAae,EAAAA,UAAmBzC,UAAU,MAAME,QAAS,EAAhE,UACE,SAACmG,EAAD,aAMX,ECxDK2B,GAAqBC,EAAAA,EAAAA,eAAuC,MAErDtG,EAAiB,kBAAMuG,EAAAA,EAAAA,YAAWF,EAAjB,EAEjBG,EAAmD,SAAC,GAI1D,IAHSxE,EAGV,EAHJ,cACA2C,EAEI,EAFJA,IAEI,IADJS,QAAAA,OACI,MADM9F,EAAgBmH,KACtB,EACJ,OACE,SAACJ,EAAmBK,SAApB,CAA6B/G,OAAK,kBAAOgF,GAAP,IAAY3C,UAAAA,IAA9C,SACGoD,IAAY9F,EAAgBmH,OAAQ,SAACpB,EAAD,KAG1C,C,qKCnBYF,EAAiD,SAAC,GAMxD,IALLtG,EAKI,EALJA,SACAc,EAII,EAJJA,MAII,IAHJ5B,MAAAA,OAGI,MAHI4B,EAGJ,EAFJG,EAEI,EAFJA,OACG6G,GACC,YACJ,OACE,SAACvF,EAAA,EAAD,CACE,4BAAoBrD,GACpBsD,IAAIC,EAAAA,EAAAA,IAAc,CAAEuD,SAAU,CAAClF,KAC/BG,OAAQA,EAHV,UAKE,SAAC,MAAD,gBACEwF,OAAQ,CACNsB,eAAgB,cAEdD,GAJN,cAME,SAAC,KAAD,UAAW9H,QAIlB,C,kFClCYgI,EAAW,CACtBC,WAAY,CACVC,MAAO,CACL3G,KAAM,oBAGV4G,KAAM,CACJD,MAAO,CACL3G,KAAM,cAGV6G,IAAK,CACHF,MAAO,CACL3G,KAAM,oCAGV8G,eAAgB,CACdH,MAAO,CACL3G,KAAM,yBAGV+G,OAAQ,CACNJ,MAAO,CACL3G,KAAM,gBAGVgH,UAAW,CACTL,MAAO,CACL3G,KAAM,oBAGViH,SAAU,CACRC,KAAM,CACJC,SAAU,aAEZR,MAAO,CACL3G,KAAM,mB,iCCTCoH,GATD,CACV,6DACA,wNACA,yDACA,qKACA,qBACA,qCACAC,KAAK,KAE2C,SAAC,GAI5C,IAHL5I,EAGI,EAHJA,SACA6I,EAEI,EAFJA,KACAC,EACI,EADJA,SAEMC,GAAgBC,EAAAA,EAAAA,IAAYhB,EAASc,KAE3CG,EAAAA,EAAAA,YAAU,WACRF,GACD,GAAE,CAACA,IAEJ,IAAMG,GAAWC,EAAAA,EAAAA,GAAe,UAAY,GAC5C,EAA8CN,EAAtCO,OAAAA,OAAR,SAAuBC,EAAuBR,EAAvBQ,MAAOjG,EAAgByF,EAAhBzF,YACxBkG,EAAiBF,EAAM,UAAMC,EAAN,oBAAgCA,EAE7D,OACE,iCACE,UAACE,EAAA,EAAD,YACGC,GAID,iBAAMC,QAAQ,sCAAsClI,KAAK,cACzD,iBAAMmI,QAAQ,UACbR,EAAShE,KAAI,gBAAGyE,EAAH,EAAGA,IAAKC,EAAR,EAAQA,SAAR,OACZ,iBAAMC,KAAMF,EAAeG,IAAI,YAAYC,KAAMH,GAA3BD,EADV,KAId,2BAAQL,KACR,iBAAMG,QAASH,EAAgBU,SAAS,cACxC,iBAAMP,QAASH,EAAgB/H,KAAK,mBACpC,iBAAMkI,QAAQ,UAAUlI,KAAK,kBAE7B,iBAAMkI,QAASrG,EAAa7B,KAAK,iBACjC,iBAAMkI,QAASrG,EAAa4G,SAAS,oBACrC,iBAAMP,QAASrG,EAAa7B,KAAK,2BAElCvB,IAGN,E,iKCxDYmC,GAAO8H,EAAAA,EAAAA,KAClB,WAA6DC,GAAS,IAAnE7I,EAAkE,EAAlEA,KAAc8I,EAAoD,EAA5DC,OAAsBhI,EAAsC,EAAtCA,cAAkBiI,GAAoB,YACnE,OACE,SAAC,MAAD,gBAAKtH,GAAG,OAAOuH,SAAUjJ,EAAKkJ,cAAeL,IAAKA,GAASG,GAA3D,oBACGjI,QADH,IACGA,EAAAA,GAAiBgI,EAAAA,EAAAA,GAAO/I,EAAD,OAAO8I,QAAP,IAAOA,EAAAA,EAAgB,MAGpD,IAGHhI,EAAKqI,YAAc,M,uEClBNrB,EAAiB,SAAyBsB,GACrD,IAAQjJ,GAASkJ,EAAAA,EAAAA,KAATlJ,KACR,OAAO,OAACA,QAAD,IAACA,EAAAA,EAAQ,CAAC,GAAGiJ,EACrB,C,4HCCKE,EAAcrF,EAAAA,GAAAA,WAEdsF,EAAY,qBAEZC,EAAc,SAAC1F,GAAD,OACV,MAARA,GAAgBhF,EAAAA,GAAAA,IAA6BgF,EAD3B,EAGd2F,EAAiB,SAACC,GAEtB,GAAIF,EAAYE,GACd,OAAOA,EAIT,IAAK,IAAD,EACIC,EAAU,UAAIC,aAAaC,QAAQN,UAAzB,QAAuC,GACvD,GAAIC,EAAYG,GAAa,OAAOA,CAGrC,CAFC,SAED,CAGD,OAAOL,CACR,EAaY1H,EAAc,WAAuC,IAAtCkI,EAAqC,uDAAP,CAAC,EACjDC,EAA2BD,EAA3BC,UAAWC,EAAgBF,EAAhBE,YACnB,GAA2BC,EAAAA,EAAAA,MAAnBC,EAAR,EAAQA,SAAUC,EAAlB,EAAkBA,KAClB,GAAoBC,EAAAA,EAAAA,MAAZC,EAAR,EAAQA,QACFC,GAASC,EAAAA,EAAAA,KACTb,EAAiBY,EAAOE,IAAIC,EAAAA,GAAAA,UAGlC,GAAgCC,EAAAA,EAAAA,WAAmB,kBACjDjB,EAAeC,EADkC,IAAnD,eAAO9K,EAAP,KAAiB+L,EAAjB,MAKA/C,EAAAA,EAAAA,YAAU,WACJ4B,EAAYE,IAAmBA,IAAmB9K,GACpD+L,EAAYjB,EAGf,GAAE,CAACA,KAGJ9B,EAAAA,EAAAA,YAAU,WACJ8B,IAAmB9K,GAAYmL,IACjCO,EAAOM,IAAIH,EAAAA,GAAAA,SAAuB7L,GAClCyL,EAAQ,CAAEH,SAAAA,EAAUC,KAAAA,EAAMlD,OAAQqD,EAAOO,aAG5C,GAAE,CAACjM,EAAUmL,IAEd,IAAMe,GAASC,EAAAA,EAAAA,cACb,SAACC,GAGC,GAFAL,EAAYK,GAERhB,EACF,IACEJ,aAAaqB,QAAQ1B,EAAWyB,EAGjC,CAFC,SAED,CAEJ,GACD,CAAChB,IAGH,OAAOkB,EAAAA,EAAAA,UAAQ,iBAAM,CAACtM,EAAUkM,EAAjB,GAAmC,CAAClM,EAAUkM,GAC9D,C,iFCrFYP,EAAiB,WAC5B,IAAQtD,GAAWgD,EAAAA,EAAAA,MAAXhD,OAER,OAAOiE,EAAAA,EAAAA,UAAQ,kBAAM,IAAIC,gBAAgBlE,EAA1B,GAAmC,CAACA,GACpD,C,oHCCYxE,EAAiB,SAACD,GAC7B,OAAKA,GAAeA,EAAY4I,OAAS,EAAU,GAE5C5I,EAAY6I,QACjB,SAACC,EAA2BC,GAC1B,OAAIA,EAAI7I,UACA,GAAN,eAAW4I,GAAX,CAAkBC,EAAI7I,YAGjB4I,CACR,GACD,GAEH,EAqCYzG,EAAiB,SAAC,GAU7B,IAJkB,IALlBrC,EAKiB,EALjBA,YACAmC,EAIiB,EAJjBA,SAKM6G,EAAa,IAAIC,MACjBC,EAAY,IAAIC,IAEtB,wBA1C4B,SAC5BnJ,GAEA,OAAO,OAACA,QAAD,IAACA,EAAAA,EAAe,IACpBpE,QAAO,SAACmN,GAAS,IAAD,EACf,OAAOK,QAAO,UAACL,EAAIvG,eAAL,aAAC,EAAanH,MAC7B,IACAgG,KAAI,SAAC0H,GAAD,qBAAC,UACDA,GADA,IAEHxG,GAAE,UAAEwG,EAAIvG,eAAN,aAAE,EAAanH,OAFd,GAIR,CAgCMgO,CAAerJ,KADpB,OA1BgC,SAACmC,GACjC,OAAKA,GAAYA,EAASyG,OAAS,EAAU,GAEtCzG,EACJvG,QAAO,SAACP,GAAD,OAAW+N,QAAQ/N,KAAWiO,EAAAA,EAAAA,IAAwBjO,EAAtD,IACPgG,KAAI,SAAChG,GAAD,MAAY,CACfkH,GAAIlH,EACJmH,QAAS,CACPnH,MAAAA,GAHC,GAMR,CAiBMkO,CAAmBpH,KAFxB,eAGG,CAHE,IAAM4G,EAAG,KAIN1N,EAAQ0N,EAAIvG,QAASnH,MAAMmO,cAC5BN,EAAUO,IAAIpO,KACjB2N,EAAWU,KAAKX,GAChBG,EAAUS,IAAItO,GAEjB,CAED,OAAO2N,CACR,C","sources":["components/Highlight/Highlight.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/EditorsNote.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","components/PackageTag/PackageTag.tsx","constants/pageInfo.ts","components/Page/Page.tsx","components/Time/Time.tsx","hooks/useConfigValue/useConfigValue.ts","hooks/useLanguage/useLanguage.ts","hooks/useQueryParams/useQueryParams.ts","util/package.ts"],"sourcesContent":["import { Stack, Image, Text, useColorModeValue } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n const brightness = useColorModeValue(\"none\", \"brightness(1.75)\");\n return (\n <Stack align=\"center\" direction=\"row\" filter={brightness} spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<\n LanguageSupportTooltipProps\n> = ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n};\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text, Tooltip } from \"@chakra-ui/react\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../hooks/useStats\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n tooltip?: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n const publishDate = new Date(date);\n\n return (\n <>\n {downloads !== undefined && (\n <Detail\n data-testid={testIds.downloads}\n tooltip=\"Download numbers are periodically sourced from the npm registry\"\n value={`${downloads.toLocaleString()} weekly downloads`}\n />\n )}\n <Detail\n data-testid={testIds.published}\n value={\n <Time\n date={publishDate}\n fontSize=\"xs\"\n formattedDate={formatDistanceToNowStrict(publishDate, {\n addSuffix: true,\n })}\n />\n }\n />\n <Detail\n data-testid={testIds.author}\n value={\n <>\n By{\" \"}\n <NavLink\n color=\"link\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n </>\n }\n />\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport const EditorsNote: FunctionComponent<{ comment?: string }> = ({\n comment,\n}) => {\n return (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text as=\"span\" color=\"blue.500\" fontWeight=\"bold\">\n Editor&apos;s note:{\" \"}\n </Text>\n {comment}\n </Text>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeBadge } from \"../CDKType\";\nimport { EditorsNote } from \"./EditorsNote\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n dataEvent,\n description,\n comment,\n constructFrameworks,\n name,\n version,\n } = usePackageCard();\n\n return (\n <>\n <LinkOverlay\n as={Link}\n data-event={\n dataEvent ? eventName(dataEvent, \"Package Card\", name) : undefined\n }\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n <CDKTypeBadge\n constructFrameworks={constructFrameworks}\n mr={2}\n zIndex={1}\n />\n <ChakraHeading\n as=\"h3\"\n color=\"textPrimary\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"normal\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n {comment ? (\n <EditorsNote comment={comment} />\n ) : (\n <Text\n color=\"textPrimary\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n )}\n </>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { highlightsFrom } from \"../../util/package\";\nimport { Highlight as HighlightComponent } from \"../Highlight\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Highlight: FunctionComponent = () => {\n const { packageTags = [] } = usePackageCard()?.metadata ?? {};\n const [highlight] = highlightsFrom(packageTags);\n\n if (!highlight) return null;\n\n return (\n <Box fontSize=\"xs\">\n <HighlightComponent {...highlight} />\n </Box>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { tagObjectsFrom } from \"../../util/package\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags = tagObjectsFrom({\n packageTags,\n keywords,\n });\n\n return (\n <>\n {tags.slice(0, 10).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Flex, Grid, LinkBox, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"hoverPrimary\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"bgSecondary\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"textPrimary\"\n data-testid={testIds.wideContainer}\n h=\"full\"\n minH=\"12.5rem\"\n templateColumns={{ base: \"1fr\", lg: \"1fr 14rem\" }}\n w=\"full\"\n >\n {/* Top / Left side of card */}\n <Flex\n direction=\"column\"\n justify=\"space-between\"\n overflow=\"hidden\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={3}>\n <Heading />\n </Stack>\n\n <Flex align=\"center\" sx={{ gap: \"0.5rem\" }} wrap=\"wrap\">\n <Tags />\n </Flex>\n </Flex>\n\n {/* Bottom / Right side of card */}\n <Flex\n align={{ base: \"end\", lg: \"initial\" }}\n borderLeft={{ lg: \"base\" }}\n borderTop={{ base: \"base\", lg: \"none\" }}\n direction={{ base: \"row\", lg: \"column\" }}\n justify=\"space-between\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={1}>\n <Highlight />\n <Stack spacing={1}>\n <Details />\n </Stack>\n </Stack>\n\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Flex>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n \"data-event\"?: string;\n pkg: ExtendedCatalogPackage;\n variant?: PackageCardType;\n}\n\ninterface PackageCardState extends ExtendedCatalogPackage {\n comment?: string;\n dataEvent?: string;\n}\n\nconst PackageCardContext = createContext<PackageCardState | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n \"data-event\": dataEvent,\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={{ ...pkg, dataEvent }}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ keywords: [value] })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","export const pageInfo = {\n contribute: {\n event: {\n name: \"Contribute Load\",\n },\n },\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\n// Should be the same as the \"real\" CSP, except most things come from HTTP\n// instead of HTTPS (because it is protocol-relative, and the dev site is\n// served over plain HTTP).\nconst csp = [\n \"default-src 'self' 'unsafe-inline' http://*.awsstatic.com;\",\n \"connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"frame-src http://aws.demdex.net http://dpm.demdex.net;\",\n \"img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"object-src 'none';\",\n \"style-src 'self' 'unsafe-inline';\",\n].join(\" \");\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const feedUrls = useConfigValue(\"feeds\") || [];\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta content={csp} httpEquiv=\"Content-Security-Policy\" />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n {feedUrls.map(({ url, mimeType }) => (\n <link href={url} key={url} rel=\"alternate\" type={mimeType} />\n ))}\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport type TimeOptions = {\n date: Date;\n format?: string;\n formattedDate?: string;\n};\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, formattedDate, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {formattedDate ?? format(date, formatString ?? \"\")}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { PackageHighlight, PackageTagConfig } from \"../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../constants/keywords\";\n\nexport interface TagObject extends PackageTagConfig {}\n\n/**\n * Reduces package tags to only return highlight tags\n */\nexport const highlightsFrom = (packageTags?: PackageTagConfig[]) => {\n if (!packageTags || packageTags.length < 1) return [];\n\n return packageTags.reduce(\n (accum: PackageHighlight[], tag: PackageTagConfig): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n\n return accum;\n },\n []\n );\n};\n\n/**\n * Maps packageTags to an array of TagObjects, which can be rendered by the PackageTags Component\n */\nexport const mapPackageTags = (\n packageTags?: PackageTagConfig[]\n): TagObject[] => {\n return (packageTags ?? [])\n .filter((tag) => {\n return Boolean(tag.keyword?.label);\n })\n .map((tag) => ({\n ...tag,\n id: tag.keyword?.label!,\n }));\n};\n\n/**\n * Maps keywords to an array of TagObjects, which can be rendered by the PackageTags component\n */\nexport const mapPackageKeywords = (keywords?: string[]): TagObject[] => {\n if (!keywords || keywords.length < 1) return [];\n\n return keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n }));\n};\n\n/**\n * Maps packageTags and keywords to a list of TagObjects, using mapPackageTags and mapPackageKeywords\n */\nexport const tagObjectsFrom = ({\n packageTags,\n keywords,\n}: {\n packageTags?: PackageTagConfig[];\n keywords?: string[];\n}): TagObject[] => {\n const tagObjects = new Array<TagObject>();\n const tagLabels = new Set<string>();\n\n for (const tag of [\n ...mapPackageTags(packageTags),\n ...mapPackageKeywords(keywords),\n ]) {\n const label = tag.keyword!.label.toLowerCase();\n if (!tagLabels.has(label)) {\n tagObjects.push(tag);\n tagLabels.add(label);\n }\n }\n\n return tagObjects;\n};\n"],"names":["Highlight","label","color","icon","brightness","useColorModeValue","align","direction","filter","spacing","alt","src","w","fontWeight","LanguageSupportTooltip","children","language","isSupported","TEMP_SUPPORTED_LANGUAGES","langName","LANGUAGE_NAME_MAP","message","hasArrow","placement","PackageCardType","createTestIds","Detail","dataTestid","tooltip","value","isDisabled","fontSize","zIndex","Details","usePackageCard","author","date","metadata","name","data","useStats","downloads","packages","npm","authorName","publishDate","Date","undefined","testIds","toLocaleString","Time","formattedDate","formatDistanceToNowStrict","addSuffix","NavLink","to","getSearchPath","query","EditorsNote","comment","lineHeight","noOfLines","as","Heading","useLanguage","currentLanguage","dataEvent","description","constructFrameworks","version","Link","eventName","getPackagePath","CDKType","mr","wordBreak","packageTags","highlightsFrom","highlight","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","left","right","LANGUAGES","map","lang","info","isSupportedByLibrary","Language","includes","isSupportedByConstructHub","Icon","borderRadius","h","opacity","Languages","pkg","Tags","keywords","tags","tagObjectsFrom","slice","id","keyword","PackageTag","variant","WideCard","_hover","bg","border","boxShadow","minH","templateColumns","base","justify","overflow","p","sx","gap","wrap","borderLeft","borderTop","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","tagProps","textDecoration","pageInfo","contribute","event","home","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","join","meta","pageName","trackPageView","usePageView","useEffect","feedUrls","useConfigValue","suffix","title","formattedTitle","Helmet","process","content","charSet","url","mimeType","href","rel","type","property","forwardRef","ref","formatString","format","boxProps","dateTime","toISOString","displayName","key","useConfig","defaultLang","LOCAL_KEY","isValidLang","getInitialLang","langFromParams","storedLang","localStorage","getItem","options","updateUrl","updateSaved","useLocation","pathname","hash","useHistory","replace","params","useQueryParams","get","QUERY_PARAMS","useState","setLanguage","set","toString","update","useCallback","val","setItem","useMemo","URLSearchParams","length","reduce","accum","tag","tagObjects","Array","tagLabels","Set","Boolean","mapPackageTags","KEYWORD_IGNORE_LIST","mapPackageKeywords","toLowerCase","has","push","add"],"sourceRoot":""}
1
+ {"version":3,"file":"static/js/29.4850c1e7.chunk.js","mappings":"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","sources":["components/Highlight/Highlight.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/EditorsNote.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","components/PackageTag/PackageTag.tsx","constants/pageInfo.ts","components/Page/Page.tsx","components/Time/Time.tsx","hooks/useConfigValue/useConfigValue.ts","hooks/useLanguage/useLanguage.ts","hooks/useQueryParams/useQueryParams.ts","util/package.ts"],"sourcesContent":["import { Stack, Image, Text, useColorModeValue } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n const brightness = useColorModeValue(\"none\", \"brightness(1.75)\");\n return (\n <Stack align=\"center\" direction=\"row\" filter={brightness} spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<\n LanguageSupportTooltipProps\n> = ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n};\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text, Tooltip } from \"@chakra-ui/react\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../hooks/useStats\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n tooltip?: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n const publishDate = new Date(date);\n\n return (\n <>\n {downloads !== undefined && (\n <Detail\n data-testid={testIds.downloads}\n tooltip=\"Download numbers are periodically sourced from the npm registry\"\n value={`${downloads.toLocaleString()} weekly downloads`}\n />\n )}\n <Detail\n data-testid={testIds.published}\n value={\n <Time\n date={publishDate}\n fontSize=\"xs\"\n formattedDate={formatDistanceToNowStrict(publishDate, {\n addSuffix: true,\n })}\n />\n }\n />\n <Detail\n data-testid={testIds.author}\n value={\n <>\n By{\" \"}\n <NavLink\n color=\"link\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n </>\n }\n />\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport const EditorsNote: FunctionComponent<{ comment?: string }> = ({\n comment,\n}) => {\n return (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text as=\"span\" color=\"blue.500\" fontWeight=\"bold\">\n Editor&apos;s note:{\" \"}\n </Text>\n {comment}\n </Text>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeBadge } from \"../CDKType\";\nimport { EditorsNote } from \"./EditorsNote\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n dataEvent,\n description,\n comment,\n constructFrameworks,\n name,\n version,\n } = usePackageCard();\n\n return (\n <>\n <LinkOverlay\n as={Link}\n data-event={\n dataEvent ? eventName(dataEvent, \"Package Card\", name) : undefined\n }\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n <CDKTypeBadge\n constructFrameworks={constructFrameworks}\n mr={2}\n zIndex={1}\n />\n <ChakraHeading\n as=\"h3\"\n color=\"textPrimary\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"normal\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n {comment ? (\n <EditorsNote comment={comment} />\n ) : (\n <Text\n color=\"textPrimary\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n )}\n </>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { highlightsFrom } from \"../../util/package\";\nimport { Highlight as HighlightComponent } from \"../Highlight\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Highlight: FunctionComponent = () => {\n const { packageTags = [] } = usePackageCard()?.metadata ?? {};\n const [highlight] = highlightsFrom(packageTags);\n\n if (!highlight) return null;\n\n return (\n <Box fontSize=\"xs\">\n <HighlightComponent {...highlight} />\n </Box>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { tagObjectsFrom } from \"../../util/package\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags = tagObjectsFrom({\n packageTags,\n keywords,\n });\n\n return (\n <>\n {tags.slice(0, 10).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Flex, Grid, LinkBox, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"hoverPrimary\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"bgSecondary\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"textPrimary\"\n data-testid={testIds.wideContainer}\n h=\"full\"\n minH=\"12.5rem\"\n templateColumns={{ base: \"1fr\", lg: \"1fr 14rem\" }}\n w=\"full\"\n >\n {/* Top / Left side of card */}\n <Flex\n direction=\"column\"\n justify=\"space-between\"\n overflow=\"hidden\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={3}>\n <Heading />\n </Stack>\n\n <Flex align=\"center\" sx={{ gap: \"0.5rem\" }} wrap=\"wrap\">\n <Tags />\n </Flex>\n </Flex>\n\n {/* Bottom / Right side of card */}\n <Flex\n align={{ base: \"end\", lg: \"initial\" }}\n borderLeft={{ lg: \"base\" }}\n borderTop={{ base: \"base\", lg: \"none\" }}\n direction={{ base: \"row\", lg: \"column\" }}\n justify=\"space-between\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={1}>\n <Highlight />\n <Stack spacing={1}>\n <Details />\n </Stack>\n </Stack>\n\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Flex>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n \"data-event\"?: string;\n pkg: ExtendedCatalogPackage;\n variant?: PackageCardType;\n}\n\ninterface PackageCardState extends ExtendedCatalogPackage {\n comment?: string;\n dataEvent?: string;\n}\n\nconst PackageCardContext = createContext<PackageCardState | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n \"data-event\": dataEvent,\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={{ ...pkg, dataEvent }}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ keywords: [value] })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","export const pageInfo = {\n contribute: {\n event: {\n name: \"Contribute Load\",\n },\n },\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\n// Should be the same as the \"real\" CSP, except most things come from HTTP\n// instead of HTTPS (because it is protocol-relative, and the dev site is\n// served over plain HTTP).\nconst csp = [\n \"default-src 'self' 'unsafe-inline' http://*.awsstatic.com;\",\n \"connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"frame-src http://aws.demdex.net http://dpm.demdex.net;\",\n \"img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"object-src 'none';\",\n \"style-src 'self' 'unsafe-inline';\",\n].join(\" \");\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const feedUrls = useConfigValue(\"feeds\") || [];\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta content={csp} httpEquiv=\"Content-Security-Policy\" />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n {feedUrls.map(({ url, mimeType }) => (\n <link href={url} key={url} rel=\"alternate\" type={mimeType} />\n ))}\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport type TimeOptions = {\n date: Date;\n format?: string;\n formattedDate?: string;\n};\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, formattedDate, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {formattedDate ?? format(date, formatString ?? \"\")}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { PackageHighlight, PackageTagConfig } from \"../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../constants/keywords\";\n\nexport interface TagObject extends PackageTagConfig {}\n\n/**\n * Reduces package tags to only return highlight tags\n */\nexport const highlightsFrom = (packageTags?: PackageTagConfig[]) => {\n if (!packageTags || packageTags.length < 1) return [];\n\n return packageTags.reduce(\n (accum: PackageHighlight[], tag: PackageTagConfig): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n\n return accum;\n },\n []\n );\n};\n\n/**\n * Maps packageTags to an array of TagObjects, which can be rendered by the PackageTags Component\n */\nexport const mapPackageTags = (\n packageTags?: PackageTagConfig[]\n): TagObject[] => {\n return (packageTags ?? [])\n .filter((tag) => {\n return Boolean(tag.keyword?.label);\n })\n .map((tag) => ({\n ...tag,\n id: tag.keyword?.label!,\n }));\n};\n\n/**\n * Maps keywords to an array of TagObjects, which can be rendered by the PackageTags component\n */\nexport const mapPackageKeywords = (keywords?: string[]): TagObject[] => {\n if (!keywords || keywords.length < 1) return [];\n\n return keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n }));\n};\n\n/**\n * Maps packageTags and keywords to a list of TagObjects, using mapPackageTags and mapPackageKeywords\n */\nexport const tagObjectsFrom = ({\n packageTags,\n keywords,\n}: {\n packageTags?: PackageTagConfig[];\n keywords?: string[];\n}): TagObject[] => {\n const tagObjects = new Array<TagObject>();\n const tagLabels = new Set<string>();\n\n for (const tag of [\n ...mapPackageTags(packageTags),\n ...mapPackageKeywords(keywords),\n ]) {\n const label = tag.keyword!.label.toLowerCase();\n if (!tagLabels.has(label)) {\n tagObjects.push(tag);\n tagLabels.add(label);\n }\n }\n\n return tagObjects;\n};\n"],"names":["Highlight","label","color","icon","brightness","useColorModeValue","align","direction","filter","spacing","alt","src","w","fontWeight","LanguageSupportTooltip","children","language","isSupported","TEMP_SUPPORTED_LANGUAGES","langName","LANGUAGE_NAME_MAP","message","hasArrow","placement","PackageCardType","createTestIds","Detail","dataTestid","tooltip","value","isDisabled","fontSize","zIndex","Details","usePackageCard","author","date","metadata","name","data","useStats","downloads","packages","npm","authorName","publishDate","Date","undefined","testIds","toLocaleString","Time","formattedDate","formatDistanceToNowStrict","addSuffix","NavLink","to","getSearchPath","query","EditorsNote","comment","lineHeight","noOfLines","as","Heading","useLanguage","currentLanguage","dataEvent","description","constructFrameworks","version","Link","eventName","getPackagePath","CDKType","mr","wordBreak","packageTags","highlightsFrom","highlight","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","left","right","LANGUAGES","map","lang","info","isSupportedByLibrary","Language","includes","isSupportedByConstructHub","Icon","borderRadius","h","opacity","Languages","pkg","Tags","keywords","tags","tagObjectsFrom","slice","id","keyword","PackageTag","variant","WideCard","_hover","bg","border","boxShadow","minH","templateColumns","base","justify","overflow","p","sx","gap","wrap","borderLeft","borderTop","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","tagProps","textDecoration","pageInfo","contribute","event","home","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","join","meta","pageName","trackPageView","usePageView","useEffect","feedUrls","useConfigValue","suffix","title","formattedTitle","Helmet","process","content","charSet","url","mimeType","href","rel","type","property","forwardRef","ref","formatString","format","boxProps","dateTime","toISOString","displayName","key","useConfig","defaultLang","LOCAL_KEY","isValidLang","getInitialLang","langFromParams","storedLang","localStorage","getItem","options","updateUrl","updateSaved","useLocation","pathname","hash","useHistory","replace","params","useQueryParams","get","QUERY_PARAMS","useState","setLanguage","set","toString","update","useCallback","val","setItem","useMemo","URLSearchParams","length","reduce","accum","tag","tagObjects","Array","tagLabels","Set","Boolean","mapPackageTags","KEYWORD_IGNORE_LIST","mapPackageKeywords","toLowerCase","has","push","add"],"sourceRoot":""}