diff --git a/.env.development b/.env.development index 6ed9c789..f54d0d9b 100644 --- a/.env.development +++ b/.env.development @@ -29,6 +29,8 @@ REACT_APP_NEON_AUTH_DISABLE_WS="true" REACT_APP_NEON_USE_GRAPHQL="true" REACT_APP_NEON_SHOW_AOP_VIEWER="true" REACT_APP_NEON_ENABLE_GLOBAL_SIGNIN_STATE="false" +# Option to disable fetching Drupal assets and utilize cached assets +REACT_APP_NEON_FETCH_DRUPAL_ASSETS="true" #------------------------------------------------------------------------------- # Third party APIs and options diff --git a/.eslintrc.json b/.eslintrc.json index b506fae5..e6aeca43 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -21,6 +21,7 @@ "src/**/__tests__", "src/**/__mocks__", "lib/", + "scripts/*.js", "config/", "jest.config.js", "server.js" diff --git a/lib/components/Bundles/BundleContentBuilder.d.ts b/lib/components/Bundles/BundleContentBuilder.d.ts new file mode 100644 index 00000000..b732bae3 --- /dev/null +++ b/lib/components/Bundles/BundleContentBuilder.d.ts @@ -0,0 +1,12 @@ +/// +import { IDataProductLike } from '../../types/internal'; +export interface IBundleContentBuilder { + getParentProductLink: (dataProduct: IDataProductLike, release?: string) => JSX.Element; + getBundledLink: () => JSX.Element; + buildManyParentsMainContent: (dataProducts: IDataProductLike[], release?: string) => JSX.Element; + buildDefaultTitleContent: (dataProduct: IDataProductLike, release?: string) => JSX.Element; + buildDefaultSplitTitleContent: (isRelease: boolean, terminalChar?: string) => JSX.Element; + buildDefaultSubTitleContent: (forwardAvailability: boolean, hasManyParents: boolean) => JSX.Element; +} +declare const BundleContentBuilder: IBundleContentBuilder; +export default BundleContentBuilder; diff --git a/lib/components/Bundles/BundleContentBuilder.js b/lib/components/Bundles/BundleContentBuilder.js new file mode 100644 index 00000000..95d983ac --- /dev/null +++ b/lib/components/Bundles/BundleContentBuilder.js @@ -0,0 +1,61 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _react = _interopRequireDefault(require("react")); +var _Link = _interopRequireDefault(require("@material-ui/core/Link")); +var _RouteService = _interopRequireDefault(require("../../service/RouteService")); +var _Theme = _interopRequireDefault(require("../Theme/Theme")); +var _typeUtil = require("../../util/typeUtil"); +var _ReleaseService = require("../../service/ReleaseService"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var BundleContentBuilder = { + getParentProductLink: function getParentProductLink(dataProduct, release) { + var isRelease = (0, _typeUtil.isStringNonEmpty)(release) && release !== _ReleaseService.LATEST_AND_PROVISIONAL; + var href = _RouteService.default.getProductDetailPath(dataProduct.productCode, isRelease ? release : undefined); + return /*#__PURE__*/_react.default.createElement(_Link.default, { + href: href, + target: "_blank" + }, "".concat(dataProduct.productName, " (").concat(dataProduct.productCode, ")")); + }, + getBundledLink: function getBundledLink() { + var href = _RouteService.default.getDataProductBundlesPath(); + return /*#__PURE__*/_react.default.createElement(_Link.default, { + href: href, + target: "_blank" + }, "bundled"); + }, + buildManyParentsMainContent: function buildManyParentsMainContent(dataProducts, release) { + return /*#__PURE__*/_react.default.createElement("ul", { + style: { + margin: _Theme.default.spacing(1, 0) + } + }, dataProducts.map(function (dataProduct) { + return /*#__PURE__*/_react.default.createElement("li", { + key: dataProduct.productCode + }, BundleContentBuilder.getParentProductLink(dataProduct, release)); + })); + }, + buildDefaultTitleContent: function buildDefaultTitleContent(dataProduct, release) { + var isRelease = (0, _typeUtil.isStringNonEmpty)(release) && release !== _ReleaseService.LATEST_AND_PROVISIONAL; + var bundleParentLink = BundleContentBuilder.getParentProductLink(dataProduct, isRelease ? release : undefined); + var bundledLink = BundleContentBuilder.getBundledLink(); + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "This data product ", isRelease ? 'release ' : '', "is ", bundledLink, " into ", bundleParentLink); + }, + buildDefaultSplitTitleContent: function buildDefaultSplitTitleContent(isRelease, terminalChar) { + var bundledLink = BundleContentBuilder.getBundledLink(); + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "This data product ", isRelease ? 'release ' : '', "is ", bundledLink, " into the following data product", isRelease ? ' releases' : 's', "".concat(terminalChar)); + }, + buildDefaultSubTitleContent: function buildDefaultSubTitleContent(forwardAvailability, hasManyParents) { + return ( + /*#__PURE__*/ + // eslint-disable-next-line react/jsx-no-useless-fragment + _react.default.createElement(_react.default.Fragment, null, forwardAvailability ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "It is not available as a standalone download. Data availability shown below reflects availability of the entire bundle.") : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "It is not available as a standalone download. Data availability information and data product download is only available through the bundle data ", hasManyParents ? 'products' : 'product', ".")) + ); + } +}; +Object.freeze(BundleContentBuilder); +var _default = BundleContentBuilder; +exports.default = _default; \ No newline at end of file diff --git a/lib/components/Bundles/BundleListItemIcon.d.ts b/lib/components/Bundles/BundleListItemIcon.d.ts new file mode 100644 index 00000000..9585d8c7 --- /dev/null +++ b/lib/components/Bundles/BundleListItemIcon.d.ts @@ -0,0 +1,6 @@ +import React from 'react'; +export interface BundleListItemIconProps { + isSplit?: boolean; +} +declare const BundleListItemIcon: React.FC; +export default BundleListItemIcon; diff --git a/lib/components/Bundles/BundleListItemIcon.js b/lib/components/Bundles/BundleListItemIcon.js new file mode 100644 index 00000000..b831e2df --- /dev/null +++ b/lib/components/Bundles/BundleListItemIcon.js @@ -0,0 +1,35 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _react = _interopRequireDefault(require("react")); +var _ListItemIcon = _interopRequireDefault(require("@material-ui/core/ListItemIcon")); +var _styles = require("@material-ui/core/styles"); +var _reactFontawesome = require("@fortawesome/react-fontawesome"); +var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons"); +var _Theme = _interopRequireDefault(require("../Theme/Theme")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var useStyles = (0, _styles.makeStyles)(function (theme) { + return { + bundleIcon: { + padding: '5px', + marginRight: theme.spacing(2) + } + }; +}); +var BundleListItemIcon = function BundleListItemIcon(props) { + var classes = useStyles(_Theme.default); + var isSplit = props.isSplit; + return /*#__PURE__*/_react.default.createElement(_ListItemIcon.default, null, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, { + icon: isSplit ? _freeSolidSvgIcons.faBoxesStacked : _freeSolidSvgIcons.faBox, + size: "2x", + className: classes.bundleIcon + })); +}; +BundleListItemIcon.defaultProps = { + isSplit: false +}; +var _default = BundleListItemIcon; +exports.default = _default; \ No newline at end of file diff --git a/lib/components/Bundles/DataProductBundleCard.d.ts b/lib/components/Bundles/DataProductBundleCard.d.ts new file mode 100644 index 00000000..ead2edd4 --- /dev/null +++ b/lib/components/Bundles/DataProductBundleCard.d.ts @@ -0,0 +1,19 @@ +import React from 'react'; +export interface DataProductBundleCardClasses { + card?: string; + cardContent?: string; + cardContentFlexContainer?: string; + cardContentContainer?: string; + cardIcon?: string; +} +export interface DataProductBundleCardProps { + titleContent?: React.ReactNode; + detailContent?: React.ReactNode; + subTitleContent?: React.ReactNode; + customContent?: React.ReactNode; + isSplit?: boolean; + showIcon?: boolean; + classes?: DataProductBundleCardClasses; +} +declare const DataProductBundleCard: React.FC; +export default DataProductBundleCard; diff --git a/lib/components/Bundles/DataProductBundleCard.js b/lib/components/Bundles/DataProductBundleCard.js new file mode 100644 index 00000000..a05b05bd --- /dev/null +++ b/lib/components/Bundles/DataProductBundleCard.js @@ -0,0 +1,106 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _react = _interopRequireDefault(require("react")); +var _Card = _interopRequireDefault(require("@material-ui/core/Card")); +var _CardContent = _interopRequireDefault(require("@material-ui/core/CardContent")); +var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); +var _styles = require("@material-ui/core/styles"); +var _reactFontawesome = require("@fortawesome/react-fontawesome"); +var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons"); +var _Theme = _interopRequireDefault(require("../Theme/Theme")); +var _typeUtil = require("../../util/typeUtil"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var useStyles = (0, _styles.makeStyles)(function (theme) { + return { + card: { + backgroundColor: _Theme.default.colors.GOLD[50], + borderColor: _Theme.default.colors.GOLD[200], + marginTop: theme.spacing(1) + }, + cardContent: { + padding: theme.spacing(2), + paddingBottom: "".concat(theme.spacing(2), "px !important") + }, + cardContentFlexContainer: { + display: 'flex', + alignItems: 'center', + padding: theme.spacing(2), + paddingBottom: "".concat(theme.spacing(2), "px !important") + }, + cardContentContainer: { + flexGrow: 1 + }, + cardIcon: { + color: theme.colors.GOLD[700], + padding: '5px', + fontSize: '2.3875em', + marginRight: theme.spacing(2) + }, + cardIconBoxesStacked: { + color: theme.colors.GOLD[700], + fontSize: '2.3875em', + marginRight: theme.spacing(2) + } + }; +}); +var DataProductBundleCard = function DataProductBundleCard(props) { + var classes = useStyles(_Theme.default); + var titleContent = props.titleContent, + subTitleContent = props.subTitleContent, + detailContent = props.detailContent, + customContent = props.customContent, + isSplit = props.isSplit, + showIcon = props.showIcon, + customClasses = props.classes; + var customCardClass = customClasses ? customClasses.card : undefined; + var customCardContentClass = customClasses ? customClasses.cardContent : undefined; + var customCardContentFlexContainerClass = customClasses ? customClasses.cardContentFlexContainer : undefined; + var customCardContentContainerClass = customClasses ? customClasses.cardContentContainer : undefined; + var customIconClass = customClasses ? customClasses.cardIcon : undefined; + var renderContent = function renderContent() { + if ((0, _typeUtil.exists)(customContent)) { + // eslint-disable-next-line react/jsx-no-useless-fragment + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customContent); + } + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !(0, _typeUtil.exists)(titleContent) ? null : /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: "subtitle2" + }, titleContent), !(0, _typeUtil.exists)(detailContent) ? null : + /*#__PURE__*/ + // eslint-disable-next-line react/jsx-no-useless-fragment + _react.default.createElement(_react.default.Fragment, null, detailContent), !(0, _typeUtil.exists)(subTitleContent) ? null : /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: "body2" + }, subTitleContent)); + }; + var renderCardContent = function renderCardContent() { + if (!showIcon) { + return renderContent(); + } + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, { + icon: isSplit ? _freeSolidSvgIcons.faBoxesStacked : _freeSolidSvgIcons.faBox, + size: "2x", + className: customIconClass || isSplit ? classes.cardIconBoxesStacked : classes.cardIcon + }), /*#__PURE__*/_react.default.createElement("div", { + className: customCardContentContainerClass || classes.cardContentContainer + }, renderContent())); + }; + return /*#__PURE__*/_react.default.createElement(_Card.default, { + className: customCardClass || classes.card + }, /*#__PURE__*/_react.default.createElement(_CardContent.default, { + className: showIcon ? customCardContentFlexContainerClass || classes.cardContentFlexContainer : customCardContentClass || classes.cardContent + }, renderCardContent())); +}; +DataProductBundleCard.defaultProps = { + titleContent: undefined, + detailContent: undefined, + subTitleContent: undefined, + customContent: undefined, + isSplit: false, + showIcon: true, + classes: undefined +}; +var _default = DataProductBundleCard; +exports.default = _default; \ No newline at end of file diff --git a/lib/components/Bundles/index.d.ts b/lib/components/Bundles/index.d.ts new file mode 100644 index 00000000..5028e08b --- /dev/null +++ b/lib/components/Bundles/index.d.ts @@ -0,0 +1 @@ +export { default } from "./DataProductBundleCard"; diff --git a/lib/components/Bundles/index.js b/lib/components/Bundles/index.js new file mode 100644 index 00000000..3e67f491 --- /dev/null +++ b/lib/components/Bundles/index.js @@ -0,0 +1,13 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "default", { + enumerable: true, + get: function get() { + return _DataProductBundleCard.default; + } +}); +var _DataProductBundleCard = _interopRequireDefault(require("./DataProductBundleCard")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/components/Bundles/package.json b/lib/components/Bundles/package.json new file mode 100644 index 00000000..aab5feb3 --- /dev/null +++ b/lib/components/Bundles/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "name": "bundles", + "main": "./DataProductBundleCard.tsx", + "module": "./DataProductBundleCard.tsx" +} diff --git a/lib/components/Citation/DataProductCitation/Actions.d.ts b/lib/components/Citation/DataProductCitation/Actions.d.ts index 1a69a0c9..9195cbdb 100644 --- a/lib/components/Citation/DataProductCitation/Actions.d.ts +++ b/lib/components/Citation/DataProductCitation/Actions.d.ts @@ -91,6 +91,7 @@ export interface FetchProductReleaseDoiFailedAction extends AnyAction { } export interface FetchProductReleaseDoiSucceededAction extends AnyAction { type: typeof ActionTypes.FETCH_PRODUCT_RELEASE_DOI_SUCCEEDED; + productCode: string; release: string; data: DataProductDoiStatus; } @@ -159,7 +160,7 @@ declare const ActionCreator: { fetchProductReleaseSucceeded: (release: string, data: ContextDataProduct) => FetchProductReleaseSucceededAction; fetchProductReleaseDoiStarted: (release: string) => FetchProductReleaseDoiStartedAction; fetchProductReleaseDoiFailed: (release: string, error: Nullable | string>) => FetchProductReleaseDoiFailedAction; - fetchProductReleaseDoiSucceeded: (release: string, data: DataProductDoiStatus) => FetchProductReleaseDoiSucceededAction; + fetchProductReleaseDoiSucceeded: (productCode: string, release: string, data: DataProductDoiStatus) => FetchProductReleaseDoiSucceededAction; fetchBundleParentStarted: (bundleParent: string) => FetchBundleParentStartedAction; fetchBundleParentFailed: (bundleParent: string, error: Nullable | string>) => FetchBundleParentFailedAction; fetchBundleParentSucceeded: (bundleParent: string, data: ContextDataProduct) => FetchBundleParentSucceededAction; diff --git a/lib/components/Citation/DataProductCitation/Actions.js b/lib/components/Citation/DataProductCitation/Actions.js index 3c3dbd00..b0f2ae86 100644 --- a/lib/components/Citation/DataProductCitation/Actions.js +++ b/lib/components/Citation/DataProductCitation/Actions.js @@ -122,9 +122,10 @@ var ActionCreator = { error: error }; }, - fetchProductReleaseDoiSucceeded: function fetchProductReleaseDoiSucceeded(release, data) { + fetchProductReleaseDoiSucceeded: function fetchProductReleaseDoiSucceeded(productCode, release, data) { return { type: ActionTypes.FETCH_PRODUCT_RELEASE_DOI_SUCCEEDED, + productCode: productCode, release: release, data: data }; diff --git a/lib/components/Citation/DataProductCitation/Context.d.ts b/lib/components/Citation/DataProductCitation/Context.d.ts index 1d1af934..052d954f 100644 --- a/lib/components/Citation/DataProductCitation/Context.d.ts +++ b/lib/components/Citation/DataProductCitation/Context.d.ts @@ -1,11 +1,11 @@ import React, { Dispatch } from 'react'; -import { DataProductCitationState } from './State'; import { AnyAction, Nullable, Undef } from '../../../types/core'; +import { DataProductCitationState } from './State'; export interface ProviderProps { productCode?: string; release?: Nullable; contextControlled?: boolean; - children?: React.ReactNode | React.ReactNodeArray; + children?: React.ReactNode | React.ReactNode[]; } declare const DataProductCitationContext: { Provider: React.FC; diff --git a/lib/components/Citation/DataProductCitation/Context.js b/lib/components/Citation/DataProductCitation/Context.js index e15a4069..c15a3e80 100644 --- a/lib/components/Citation/DataProductCitation/Context.js +++ b/lib/components/Citation/DataProductCitation/Context.js @@ -9,11 +9,11 @@ var _react = _interopRequireWildcard(require("react")); var _NeonApi = _interopRequireDefault(require("../../NeonApi/NeonApi")); var _NeonContext = _interopRequireDefault(require("../../NeonContext/NeonContext")); var _NeonGraphQL = _interopRequireDefault(require("../../NeonGraphQL/NeonGraphQL")); +var _typeUtil = require("../../../util/typeUtil"); var _Actions = _interopRequireDefault(require("./Actions")); var _Reducer = _interopRequireDefault(require("./Reducer")); var _Service = _interopRequireDefault(require("./Service")); var _State = require("./State"); -var _typeUtil = require("../../../util/typeUtil"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } @@ -167,7 +167,7 @@ var Provider = function Provider(props) { dispatch(_Actions.default.fetchProductReleaseDoiFailed(fetchRelease, 'Failed to fetch product release doi status')); return; } - dispatch(_Actions.default.fetchProductReleaseDoiSucceeded(fetchRelease, response.data)); + dispatch(_Actions.default.fetchProductReleaseDoiSucceeded(queryProductCode, fetchRelease, response.data)); }, error: function error(_error3) { dispatch(_Actions.default.fetchProductReleaseDoiFailed(fetchRelease, _error3)); diff --git a/lib/components/Citation/DataProductCitation/ItemView.d.ts b/lib/components/Citation/DataProductCitation/ItemView.d.ts new file mode 100644 index 00000000..bca4b934 --- /dev/null +++ b/lib/components/Citation/DataProductCitation/ItemView.d.ts @@ -0,0 +1,4 @@ +import React from 'react'; +import { DataProductCitationItemViewProps } from './ViewState'; +declare const DataProductCitationItemView: React.FC; +export default DataProductCitationItemView; diff --git a/lib/components/Citation/DataProductCitation/ItemView.js b/lib/components/Citation/DataProductCitation/ItemView.js new file mode 100644 index 00000000..f06522ba --- /dev/null +++ b/lib/components/Citation/DataProductCitation/ItemView.js @@ -0,0 +1,346 @@ +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _react = _interopRequireWildcard(require("react")); +var _reactCopyToClipboard = require("react-copy-to-clipboard"); +var _styles = require("@material-ui/core/styles"); +var _Alert = _interopRequireDefault(require("@material-ui/lab/Alert")); +var _Button = _interopRequireDefault(require("@material-ui/core/Button")); +var _Card = _interopRequireDefault(require("@material-ui/core/Card")); +var _CardActions = _interopRequireDefault(require("@material-ui/core/CardActions")); +var _CardContent = _interopRequireDefault(require("@material-ui/core/CardContent")); +var _CardHeader = _interopRequireDefault(require("@material-ui/core/CardHeader")); +var _CircularProgress = _interopRequireDefault(require("@material-ui/core/CircularProgress")); +var _Link = _interopRequireDefault(require("@material-ui/core/Link")); +var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip")); +var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); +var _Assignment = _interopRequireDefault(require("@material-ui/icons/Assignment")); +var _SaveAlt = _interopRequireDefault(require("@material-ui/icons/SaveAlt")); +var _BundleContentBuilder = _interopRequireDefault(require("../../Bundles/BundleContentBuilder")); +var _DataProductBundleCard = _interopRequireDefault(require("../../Bundles/DataProductBundleCard")); +var _CitationService = _interopRequireDefault(require("../../../service/CitationService")); +var _DataCiteService = _interopRequireWildcard(require("../../../service/DataCiteService")); +var _RouteService = _interopRequireDefault(require("../../../service/RouteService")); +var _Theme = _interopRequireDefault(require("../../Theme/Theme")); +var _ReleaseService = require("../../../service/ReleaseService"); +var _typeUtil = require("../../../util/typeUtil"); +var _Actions = _interopRequireDefault(require("./Actions")); +var _Context = _interopRequireDefault(require("./Context")); +var _Service = _interopRequireDefault(require("./Service")); +var _State = require("./State"); +var _ViewState = require("./ViewState"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +var useStyles = (0, _styles.makeStyles)(function (theme) { + return { + cardActions: { + flexWrap: 'wrap', + marginTop: theme.spacing(-1), + '&> *': { + marginLeft: '0px !important', + marginTop: theme.spacing(1) + }, + '&> :not(:last-child)': { + marginRight: theme.spacing(1) + } + }, + cardButton: { + padding: '5px 10px', + backgroundColor: '#fff', + whiteSpace: 'nowrap' + }, + cardButtonIcon: { + marginRight: theme.spacing(1) + }, + citationCard: { + marginTop: theme.spacing(2) + }, + citationText: { + fontFamily: 'monospace' + }, + citationTextOnly: { + color: theme.palette.grey[400] + }, + citationTextWithQualifier: { + marginTop: theme.spacing(1.5), + fontFamily: 'monospace' + }, + bundleTextOnlySpacer: { + marginBottom: theme.spacing(2) + }, + tombstoneBlurbCard: { + backgroundColor: _Theme.default.colors.BROWN[50], + borderColor: _Theme.default.colors.BROWN[300], + marginTop: theme.spacing(1) + }, + tombstoneBlurbCardTextOnly: { + backgroundColor: _Theme.default.colors.BROWN[50], + borderColor: _Theme.default.colors.BROWN[300], + marginTop: theme.spacing(1), + marginBottom: theme.spacing(2) + }, + tombstoneBlurbCardHeader: { + padding: theme.spacing(2), + paddingBottom: 0 + }, + tombstoneBlurbCardContent: { + padding: theme.spacing(2), + paddingTop: theme.spacing(1), + paddingBottom: '20px !important' + }, + tombstoneBlurb: { + fontSize: '0.8rem' + } + }; +}); +var DataProductCitationItemView = function DataProductCitationItemView(props) { + var showTextOnly = props.showTextOnly, + textOnlyProps = props.textOnlyProps, + citationItem = props.citationItem, + viewState = props.viewState, + hasManyParents = props.hasManyParents; + var classes = useStyles(_Theme.default); + var dispatch = _Context.default.useDataProductCitationContextDispatch(); + var appliedTextOnly = { + variant: 'caption', + cssClass: classes.citationTextOnly + }; + if ((0, _typeUtil.exists)(textOnlyProps)) { + appliedTextOnly = textOnlyProps; + } + var displayType = viewState.displayType, + isTombstoned = viewState.isTombstoned, + releases = viewState.releases, + citationDownloadsFetchStatus = viewState.citationDownloadsFetchStatus; + var releaseObject = citationItem.releaseObject, + doiUrl = citationItem.doiUrl, + citableBaseProduct = citationItem.citableBaseProduct, + citableReleaseProduct = citationItem.citableReleaseProduct, + bundleParentCode = citationItem.bundleParentCode; + var handleResetCitationDownloadsCb = (0, _react.useCallback)(function (provisionalCb, productCode) { + _Service.default.handleResetCitationDownloads(citationDownloadsFetchStatus, provisionalCb, productCode, dispatch); + }, [dispatch, citationDownloadsFetchStatus]); + var handleCitationDownloadCb = (0, _react.useCallback)(function (citationProduct, releaseCb, formatCb) { + var provisionalCb = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var coercedTarget = _extends({}, citationProduct); + var key = _Service.default.buildCitationDownloadKey(citationProduct, releaseCb, formatCb, provisionalCb); + var fullDoi = _Service.default.getReleaseDoi(releases, releaseCb); + if ((0, _typeUtil.isStringNonEmpty)(fullDoi) && (0, _typeUtil.isStringNonEmpty)(doiUrl) && fullDoi !== doiUrl) { + // In the case of multiple citations for a single product, we want to resolve + // to the specified DOI URL for this citation, but adhere to pulling + // from the set of releases in all other cases and to confirm a valid + // release is present. + fullDoi = doiUrl; + } + handleResetCitationDownloadsCb(provisionalCb, citationProduct.productCode); + if (dispatch) { + dispatch(_Actions.default.fetchCitationDownloadStarted(key)); + } + _DataCiteService.default.downloadCitation(formatCb, _DataCiteService.CitationDownloadType.DATA_PRODUCT, coercedTarget, fullDoi, releaseCb, function (data) { + if (dispatch) { + dispatch(_Actions.default.fetchCitationDownloadSucceeded(key)); + } + }, function (error) { + if (dispatch) { + dispatch(_Actions.default.fetchCitationDownloadFailed(key, 'Citation download failed')); + } + }); + }, [dispatch, releases, doiUrl, handleResetCitationDownloadsCb]); + var renderTombstoneNotice = function renderTombstoneNotice() { + if (!isTombstoned) { + return null; + } + var citationRelease = releaseObject; + var doiDisplay = ' '; + if (citationRelease.productDoi.url) { + var doiId = citationRelease.productDoi.url.split('/').slice(-2).join('/'); + doiDisplay = " (DOI:".concat(doiId, ") "); + } + var latestAvailableReleaseBlurb = null; + if (citableBaseProduct !== null && citableBaseProduct !== void 0 && citableBaseProduct.releases && (citableBaseProduct === null || citableBaseProduct === void 0 ? void 0 : citableBaseProduct.releases.length) > 0) { + var latestAvailableProductRelease = citableBaseProduct === null || citableBaseProduct === void 0 ? void 0 : citableBaseProduct.releases[0]; + if (latestAvailableProductRelease.release.localeCompare(citationRelease.release) !== 0) { + var dataProductDetailLink = /*#__PURE__*/_react.default.createElement(_Link.default, { + href: _RouteService.default.getProductDetailPath(citableBaseProduct.productCode) + }, "newer release"); + latestAvailableReleaseBlurb = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "has been replaced by a ", dataProductDetailLink, " and\xA0"); + } + } + var contactUsLink = /*#__PURE__*/_react.default.createElement(_Link.default, { + href: _RouteService.default.getContactUsPath() + }, "Contact Us"); + var tombstoneNote = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, citationRelease.release, " of this data product", doiDisplay, " ", latestAvailableReleaseBlurb, "is no longer available for download. If this specific release is needed for research purposes, please fill out the ", contactUsLink, " form."); + return /*#__PURE__*/_react.default.createElement(_Card.default, { + className: showTextOnly ? classes.tombstoneBlurbCardTextOnly : classes.tombstoneBlurbCard + }, /*#__PURE__*/_react.default.createElement(_CardHeader.default, { + className: classes.tombstoneBlurbCardHeader, + title: /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: "h6", + component: "h6" + }, "Release Notice") + }), /*#__PURE__*/_react.default.createElement(_CardContent.default, { + className: classes.tombstoneBlurbCardContent + }, /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: "body2", + color: "textSecondary", + className: classes.tombstoneBlurb + }, tombstoneNote))); + }; + var renderBundleParentLink = function renderBundleParentLink() { + if (!(0, _typeUtil.isStringNonEmpty)(bundleParentCode) || hasManyParents) { + return null; + } + var isReleaseDisplay = displayType === _ViewState.DisplayType.RELEASE; + var bundleParentName = isReleaseDisplay ? citableReleaseProduct.productName : citableBaseProduct.productName; + var titleContent; + var dataProductLike = { + productCode: bundleParentCode, + productName: bundleParentName + }; + var appliedRelease = isReleaseDisplay ? releaseObject.release : undefined; + if (isReleaseDisplay) { + titleContent = _BundleContentBuilder.default.buildDefaultTitleContent(dataProductLike, appliedRelease); + } else { + titleContent = _BundleContentBuilder.default.buildDefaultTitleContent(dataProductLike); + } + var subTitleContent = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "The ", isReleaseDisplay ? 'citation below refers' : 'citations below refer', " to that data product as this data product is not directly citable."); + return /*#__PURE__*/_react.default.createElement("div", { + className: showTextOnly ? classes.bundleTextOnlySpacer : undefined + }, /*#__PURE__*/_react.default.createElement(_DataProductBundleCard.default, { + showIcon: !hasManyParents, + isSplit: hasManyParents, + titleContent: titleContent, + subTitleContent: subTitleContent + })); + }; + var renderCitationCard = function renderCitationCard(release) { + var conditional = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var provisional = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var citationProduct = provisional ? citableBaseProduct : citableReleaseProduct; + var conditionalText = null; + var citationClassName = classes.citationText; + if (conditional) { + var provReleaseText = provisional ? 'If Provisional data are used, include:' : 'If Released data are used, include:'; + if (showTextOnly) { + conditionalText = /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: appliedTextOnly.variant, + component: "h6", + className: appliedTextOnly.cssClass + }, provReleaseText); + } else { + conditionalText = /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: "body1", + component: "h6" + }, provReleaseText); + } + citationClassName = classes.citationTextWithQualifier; + } + var citationReleaseObject = null; + if (!provisional) { + citationReleaseObject = releaseObject; + } + var citationText = _CitationService.default.buildDataProductCitationText(citationProduct, citationReleaseObject); + if (showTextOnly) { + return /*#__PURE__*/_react.default.createElement("div", null, conditionalText, /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: appliedTextOnly.variant, + component: "h6", + className: appliedTextOnly.cssClass + }, citationText)); + } + var isSectionDownloading = _Service.default.hasCitationDownloadStatus(citationDownloadsFetchStatus, provisional, citationProduct.productCode, _State.FetchStatus.FETCHING); + var downloadStatus; + if (_Service.default.hasCitationDownloadStatus(citationDownloadsFetchStatus, provisional, citationProduct.productCode, _State.FetchStatus.ERROR)) { + downloadStatus = /*#__PURE__*/_react.default.createElement(_Alert.default, { + severity: "error", + onClose: function onClose() { + return handleResetCitationDownloadsCb(provisional, citationProduct.productCode); + } + }, "Citation download encountered a problem"); + } else if (_Service.default.hasCitationDownloadStatus(citationDownloadsFetchStatus, provisional, citationProduct.productCode, _State.FetchStatus.SUCCESS)) { + downloadStatus = /*#__PURE__*/_react.default.createElement(_Alert.default, { + severity: "success", + onClose: function onClose() { + return handleResetCitationDownloadsCb(provisional, citationProduct.productCode); + } + }, "Citation downloaded"); + } + return /*#__PURE__*/_react.default.createElement(_Card.default, { + className: classes.citationCard + }, /*#__PURE__*/_react.default.createElement(_CardContent.default, null, conditionalText, /*#__PURE__*/_react.default.createElement(_Typography.default, { + variant: "body1", + className: citationClassName + }, citationText)), /*#__PURE__*/_react.default.createElement(_CardActions.default, { + className: classes.cardActions + }, /*#__PURE__*/_react.default.createElement(_Tooltip.default, { + placement: "bottom-start", + title: "Click to copy the above plain text citation to the clipboard" + }, /*#__PURE__*/_react.default.createElement(_reactCopyToClipboard.CopyToClipboard, { + text: citationText + }, /*#__PURE__*/_react.default.createElement(_Button.default, { + size: "small", + color: "primary", + variant: "outlined", + startIcon: /*#__PURE__*/_react.default.createElement(_Assignment.default, { + fontSize: "small", + className: classes.cardButtonIcon + }), + className: classes.cardButton + }, "Copy"))), _DataCiteService.default.getDataProductFormats().map(function (format) { + var key = _Service.default.buildCitationDownloadKey(citationProduct, release, format.shortName, provisional); + var isDownloading = !(0, _typeUtil.exists)(citationDownloadsFetchStatus[key]) ? false : citationDownloadsFetchStatus[key].status === _State.FetchStatus.FETCHING; + return /*#__PURE__*/_react.default.createElement(_Tooltip.default, { + key: format.shortName, + placement: "bottom-start", + title: "Click to download the ".concat(citationProduct.productCode, "/").concat(release, " citation as a ") + "file in ".concat(format.longName, " format") + }, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_Button.default, { + size: "small", + color: "primary", + variant: "outlined", + className: classes.cardButton, + disabled: isDownloading || isSectionDownloading, + startIcon: isDownloading ? /*#__PURE__*/_react.default.createElement(_CircularProgress.default, { + size: 18, + className: classes.cardButtonIcon + }) : /*#__PURE__*/_react.default.createElement(_SaveAlt.default, { + fontSize: "small", + className: classes.cardButtonIcon + }), + onClick: function onClick() { + handleCitationDownloadCb(citationProduct, release, format.shortName, provisional); + } + }, "Download (".concat(format.shortName, ")")))); + })), downloadStatus); + }; + var citationCard; + switch (displayType) { + case _ViewState.DisplayType.CONDITIONAL: + citationCard = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderCitationCard(_ReleaseService.PROVISIONAL_RELEASE, true, true), renderCitationCard(releaseObject.release, true, false)); + break; + case _ViewState.DisplayType.PROVISIONAL: + citationCard = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderCitationCard(_ReleaseService.PROVISIONAL_RELEASE, false, true)); + break; + case _ViewState.DisplayType.RELEASE: + citationCard = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderCitationCard(releaseObject.release, false, false)); + break; + case _ViewState.DisplayType.NOT_AVAILABLE: + default: + // eslint-disable-next-line react/jsx-no-useless-fragment + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null); + } + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderTombstoneNotice(), renderBundleParentLink(), citationCard); +}; +DataProductCitationItemView.defaultProps = { + showQuoteIcon: false, + disableConditional: false, + disableSkeleton: false, + showTextOnly: false, + textOnlyProps: undefined +}; +var _default = DataProductCitationItemView; +exports.default = _default; \ No newline at end of file diff --git a/lib/components/Citation/DataProductCitation/Reducer.js b/lib/components/Citation/DataProductCitation/Reducer.js index ec7373fa..b4db536f 100644 --- a/lib/components/Citation/DataProductCitation/Reducer.js +++ b/lib/components/Citation/DataProductCitation/Reducer.js @@ -5,11 +5,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; +var _ReleaseService = _interopRequireDefault(require("../../../service/ReleaseService")); +var _typeUtil = require("../../../util/typeUtil"); var _Service = _interopRequireDefault(require("./Service")); var _Actions = _interopRequireWildcard(require("./Actions")); var _State = require("./State"); -var _ReleaseService = _interopRequireDefault(require("../../../service/ReleaseService")); -var _typeUtil = require("../../../util/typeUtil"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -206,12 +206,23 @@ var Reducer = function Reducer(state, action) { release = fprdSucceededAction.release; productReleaseDoiStatus = fprdSucceededAction.data; newState.fetches.productReleaseDois[release].status = _State.FetchStatus.SUCCESS; - if ((0, _typeUtil.exists)(productReleaseDoiStatus) && (0, _typeUtil.exists)(productReleaseDoiStatus.status)) { + if (!(0, _typeUtil.exists)(productReleaseDoiStatus)) { + newState.data.productReleaseDois[release] = null; + } else if (Array.isArray(productReleaseDoiStatus)) { + if ((0, _typeUtil.existsNonEmpty)(productReleaseDoiStatus)) { + // eslint-disable-next-line max-len + newState.data.productReleaseDois[release] = productReleaseDoiStatus.filter(function (dpds) { + return (0, _typeUtil.exists)(dpds) && (0, _typeUtil.exists)(dpds.status); + }); + } else { + newState.data.productReleaseDois[release] = null; + } + } else if ((0, _typeUtil.exists)(productReleaseDoiStatus.status)) { newState.data.productReleaseDois[release] = productReleaseDoiStatus; } else { newState.data.productReleaseDois[release] = null; } - return _Service.default.calculateAppStatus(_Service.default.applyDoiStatusReleaseGlobally(newState, productReleaseDoiStatus)); + return _Service.default.calculateAppStatus(_Service.default.applyDoiStatusReleaseGlobally(newState, fprdSucceededAction.productCode, release, newState.data.productReleaseDois[release])); case _Actions.ActionTypes.FETCH_BUNDLE_PARENT_STARTED: fbpStartedAction = action; bundleParent = fbpStartedAction.bundleParent; diff --git a/lib/components/Citation/DataProductCitation/Service.d.ts b/lib/components/Citation/DataProductCitation/Service.d.ts index 56e14988..26d0e287 100644 --- a/lib/components/Citation/DataProductCitation/Service.d.ts +++ b/lib/components/Citation/DataProductCitation/Service.d.ts @@ -9,13 +9,13 @@ declare const Service: { calculateFetches: (state: DataProductCitationState) => DataProductCitationState; calculateAppStatus: (state: DataProductCitationState) => DataProductCitationState; applyReleasesGlobally: (state: DataProductCitationState, releases: DataProductRelease[]) => DataProductCitationState; - applyDoiStatusReleaseGlobally: (state: DataProductCitationState, doiStatus: DataProductDoiStatus) => DataProductCitationState; + applyDoiStatusReleaseGlobally: (state: DataProductCitationState, productCode: string, release: string, doiStatus: Nullable) => DataProductCitationState; calculateContextState: (newState: DataProductCitationState, neonContextState: UnknownRecord, release: Nullable, productCode: Nullable) => DataProductCitationState; useViewState: (state: DataProductCitationState, props: DataProductCitationViewProps) => DataProductCitationViewState; getReleaseObject: (releases: CitationRelease[], release: Nullable) => Nullable; getReleaseDoi: (releases: CitationRelease[], release: Nullable) => Nullable; buildCitationDownloadKey: (citationProduct: ContextDataProduct, releaseCb: string, formatCb: string, provisionalCb?: boolean) => string; - hasCitationDownloadStatus: (citationDownloadsFetchStatus: Record, provisionalCb: boolean, statusCb: FetchStatus) => boolean; - handleResetCitationDownloads: (citationDownloadsFetchStatus: Record, provisionalCb: boolean, dispatch: Undef>) => void; + hasCitationDownloadStatus: (citationDownloadsFetchStatus: Record, provisionalCb: boolean, productCode: string, statusCb: FetchStatus) => boolean; + handleResetCitationDownloads: (citationDownloadsFetchStatus: Record, provisionalCb: boolean, productCode: string, dispatch: Undef>) => void; }; export default Service; diff --git a/lib/components/Citation/DataProductCitation/Service.js b/lib/components/Citation/DataProductCitation/Service.js index ac8d944a..7be630fe 100644 --- a/lib/components/Citation/DataProductCitation/Service.js +++ b/lib/components/Citation/DataProductCitation/Service.js @@ -136,9 +136,15 @@ var applyReleasesGlobally = function applyReleasesGlobally(state, releases) { updatedState.data.releases = _ReleaseService.default.sortReleases(updatedState.data.releases); return updatedState; }; -var applyDoiStatusReleaseGlobally = function applyDoiStatusReleaseGlobally(state, doiStatus) { +var applyDoiStatusReleaseGlobally = function applyDoiStatusReleaseGlobally(state, productCode, release, doiStatus) { + var _updatedState$neonCon; + if (!(0, _typeUtil.exists)(doiStatus)) { + return state; + } var updatedState = _extends({}, state); - var transformedRelease = _ReleaseService.default.transformDoiStatusRelease(doiStatus); + // eslint-disable-next-line max-len + var appliedDoiStatus = _BundleService.default.determineAppliedBundleRelease((((_updatedState$neonCon = updatedState.neonContextState) === null || _updatedState$neonCon === void 0 ? void 0 : _updatedState$neonCon.data) || {}).bundles, release, productCode, doiStatus); + var transformedRelease = _ReleaseService.default.transformDoiStatusRelease(appliedDoiStatus); if (!(0, _typeUtil.exists)(transformedRelease)) { return updatedState; } @@ -213,13 +219,11 @@ var buildCitationDownloadKey = function buildCitationDownloadKey(citationProduct } return key; }; -var hasCitationDownloadStatus = function hasCitationDownloadStatus(citationDownloadsFetchStatus, provisionalCb, statusCb) { +var hasCitationDownloadStatus = function hasCitationDownloadStatus(citationDownloadsFetchStatus, provisionalCb, productCode, statusCb) { return Object.keys(citationDownloadsFetchStatus).some(function (k) { if (citationDownloadsFetchStatus[k]) { var shouldConsider = true; - if (!provisionalCb && k.includes(_ReleaseService.PROVISIONAL_RELEASE)) { - shouldConsider = false; - } else if (provisionalCb && !k.includes(_ReleaseService.PROVISIONAL_RELEASE)) { + if (!k.includes(productCode) || !provisionalCb && k.includes(_ReleaseService.PROVISIONAL_RELEASE) || provisionalCb && !k.includes(_ReleaseService.PROVISIONAL_RELEASE)) { shouldConsider = false; } if (shouldConsider && citationDownloadsFetchStatus[k].status === statusCb) { @@ -229,13 +233,11 @@ var hasCitationDownloadStatus = function hasCitationDownloadStatus(citationDownl return false; }); }; -var handleResetCitationDownloads = function handleResetCitationDownloads(citationDownloadsFetchStatus, provisionalCb, dispatch) { +var handleResetCitationDownloads = function handleResetCitationDownloads(citationDownloadsFetchStatus, provisionalCb, productCode, dispatch) { Object.keys(citationDownloadsFetchStatus).forEach(function (k) { if (citationDownloadsFetchStatus[k]) { var shouldReset = true; - if (!provisionalCb && k.includes(_ReleaseService.PROVISIONAL_RELEASE)) { - shouldReset = false; - } else if (provisionalCb && !k.includes(_ReleaseService.PROVISIONAL_RELEASE)) { + if (!k.includes(productCode) || !provisionalCb && k.includes(_ReleaseService.PROVISIONAL_RELEASE) || provisionalCb && !k.includes(_ReleaseService.PROVISIONAL_RELEASE)) { shouldReset = false; } if (shouldReset) { @@ -299,96 +301,186 @@ var useViewState = function useViewState(state, props) { } var hasAppliedReleaseDoi = (0, _typeUtil.isStringNonEmpty)(appliedReleaseDoi); var hideAppliedReleaseCitation = (0, _typeUtil.exists)(appliedReleaseObject) && appliedReleaseObject.showCitation === false; - // Determine tombstoned state + // Determine tombstoned state for entire citation + var hasProductReleaseDois = (0, _typeUtil.exists)(productReleaseDois) && (0, _typeUtil.isStringNonEmpty)(appliedRenderedReleaseTag) && (0, _typeUtil.exists)(productReleaseDois[appliedRenderedReleaseTag]); + var dataProductDoiStatus = null; var isTombstoned = false; - if ((0, _typeUtil.exists)(productReleaseDois) && (0, _typeUtil.isStringNonEmpty)(appliedRenderedReleaseTag) && (0, _typeUtil.exists)(productReleaseDois[appliedRenderedReleaseTag])) { - var dataProductDoiStatus = productReleaseDois[appliedRenderedReleaseTag]; - var doiStatusType = dataProductDoiStatus === null || dataProductDoiStatus === void 0 ? void 0 : dataProductDoiStatus.status; - isTombstoned = (0, _typeUtil.exists)(doiStatusType) && doiStatusType === _neonApi.DoiStatusType.TOMBSTONED; - } - // Identify whether or not viewing a bundled product with applicable DOI - // and capture the bundle DOI product code. - var hasBundleCode = (0, _typeUtil.existsNonEmpty)(bundle.parentCodes) && (0, _typeUtil.isStringNonEmpty)(bundle.doiProductCode); - var bundleParentCode = hasBundleCode ? bundle.doiProductCode : null; - var bundleProduct = null; - if (hasBundleCode && (0, _typeUtil.exists)(bundleParents[bundleParentCode])) { - bundleProduct = bundleParents[bundleParentCode]; - } - var hasBundleProduct = (0, _typeUtil.exists)(bundleProduct); - // Determines if the latest release has a bundle defined for this product. - var hasLatestReleaseBundle = false; - if (hasLatestRelease && (0, _typeUtil.exists)(baseProduct)) { - hasLatestReleaseBundle = _BundleService.default.isProductInBundle(bundlesContext, latestReleaseObject.release, baseProduct.productCode); - } - // Determine if the bundle product has data for the specified release. - var isBundleProductInRelease = true; - if (hasBundleProduct && hasSpecifiedRelease && !isAppliedReleaseLatestNonProv) { - var _bundleProduct; - var bundleHasRelease = (_bundleProduct = bundleProduct) === null || _bundleProduct === void 0 ? void 0 : _bundleProduct.releases.find(function (r) { - return r.release === appliedRenderedReleaseTag; - }); - isBundleProductInRelease = (0, _typeUtil.exists)(bundleHasRelease); - } - // Determine if the citable product should be the bundle container product - // or the currently specified product. - // eslint-disable-next-line max-len - var citableBaseProduct = hasBundleProduct && isBundleProductInRelease ? bundleProduct : baseProduct; - // Determine the product to use for citing within the applicable release - // and within the context of bundles. - var citableReleaseProduct = null; - if (hasAppliedReleaseDoi && !hideAppliedReleaseCitation) { - // If we're referencing latest release and provisional, and there isn't a bundle - // defined for the latest release, use base product for release citation - if (!hasSpecifiedRelease && !hasLatestReleaseBundle) { - citableReleaseProduct = baseProduct; + var determineDoiStatusTombstone = function determineDoiStatusTombstone(dpds) { + var tsResult = false; + if (!Array.isArray(dpds)) { + // eslint-disable-next-line max-len + var doiStatusType = dpds === null || dpds === void 0 ? void 0 : dpds.status; + tsResult = (0, _typeUtil.exists)(doiStatusType) && doiStatusType === _neonApi.DoiStatusType.TOMBSTONED; } else { - // Has a specified release, or if not, has latest release bundle. - // When a bundled product code is available for the given release, - // get the product for the parent code and release. - // Otherwise, the citable product is the current product for the specified - // release when available. - // eslint-disable-next-line no-lonely-if - if (hasBundleCode) { - var bpr = bundleParentReleases[bundleParentCode]; - if ((0, _typeUtil.exists)(bpr)) { - var product = bpr[appliedRenderedReleaseTag]; - if ((0, _typeUtil.exists)(product)) { - citableReleaseProduct = product; - } - } + tsResult = dpds.every(function (ds) { + if (!(0, _typeUtil.exists)(ds)) return false; + return ds.status === _neonApi.DoiStatusType.TOMBSTONED; + }); + } + return tsResult; + }; + if (hasProductReleaseDois) { + dataProductDoiStatus = productReleaseDois[appliedRenderedReleaseTag]; + isTombstoned = determineDoiStatusTombstone(dataProductDoiStatus); + } + // Identify whether or not viewing a bundled product with applicable DOI. + var hasBundleCode = (0, _typeUtil.existsNonEmpty)(bundle.parentCodes) && ((0, _typeUtil.isStringNonEmpty)(bundle.doiProductCode) || Array.isArray(bundle.doiProductCode) && (0, _typeUtil.existsNonEmpty)(bundle.doiProductCode)); + // Builds a citation item based on current state + // of release, specified bundle code when applicable. + var buildCitationItem = function buildCitationItem(bundleParentCode, bundleDpds) { + var item = { + releaseObject: null, + doiUrl: null, + citableBaseProduct: null, + citableReleaseProduct: null, + bundleParentCode: null, + isTombstoned: false + }; + var bundleProduct = null; + if (hasBundleCode && (0, _typeUtil.isStringNonEmpty)(bundleParentCode) && (0, _typeUtil.exists)(bundleParents[bundleParentCode])) { + bundleProduct = bundleParents[bundleParentCode]; + } + var hasBundleProduct = (0, _typeUtil.exists)(bundleProduct); + // Determines if the latest release has a bundle defined for this product. + var hasLatestReleaseBundle = false; + if (hasLatestRelease && (0, _typeUtil.exists)(baseProduct)) { + hasLatestReleaseBundle = _BundleService.default.isProductInBundle(bundlesContext, latestReleaseObject.release, baseProduct.productCode); + } + // Determine if the bundle product has data for the specified release. + var isBundleProductInRelease = true; + if (hasBundleProduct && hasSpecifiedRelease && !isAppliedReleaseLatestNonProv) { + var _bundleProduct; + var bundleHasRelease = (_bundleProduct = bundleProduct) === null || _bundleProduct === void 0 ? void 0 : _bundleProduct.releases.find(function (r) { + return r.release === appliedRenderedReleaseTag; + }); + isBundleProductInRelease = (0, _typeUtil.exists)(bundleHasRelease); + } + var itemReleaseObject = appliedReleaseObject; + var itemDoiUrl = appliedReleaseDoi; + var itemIsTombstoned = false; + // Determine if the citable product should be the bundle container product + // or the currently specified product. + // eslint-disable-next-line max-len + var citableBaseProduct = hasBundleProduct && isBundleProductInRelease ? bundleProduct : baseProduct; + // Determine the product to use for citing within the applicable release + // and within the context of bundles. + var citableReleaseProduct = null; + if (hasAppliedReleaseDoi && !hideAppliedReleaseCitation) { + // If we're referencing latest release and provisional, and there isn't a bundle + // defined for the latest release, use base product for release citation. + if (!hasSpecifiedRelease && !hasLatestReleaseBundle) { + citableReleaseProduct = baseProduct; } else { - var _product = productReleases[appliedRenderedReleaseTag]; - if ((0, _typeUtil.exists)(_product)) { - citableReleaseProduct = _product; + // Has a specified release, or if not, has latest release bundle. + // When a bundled product code is available for the given release, + // get the product for the parent code and release. + // Otherwise, the citable product is the current product for the specified + // release when available. + // eslint-disable-next-line no-lonely-if + if (hasBundleCode) { + var bpr = bundleParentReleases[bundleParentCode]; + if ((0, _typeUtil.exists)(bpr)) { + var product = bpr[appliedRenderedReleaseTag]; + if ((0, _typeUtil.exists)(product)) { + citableReleaseProduct = product; + } + } + } else { + var _product = productReleases[appliedRenderedReleaseTag]; + if ((0, _typeUtil.exists)(_product)) { + citableReleaseProduct = _product; + } } } } + // Determine release property states from current bundle. + if (hasBundleCode && (0, _typeUtil.isStringNonEmpty)(bundleParentCode) && (0, _typeUtil.exists)(bundleDpds)) { + var bundleCitationRelease = _ReleaseService.default.transformDoiStatusRelease(bundleDpds); + itemReleaseObject = bundleCitationRelease; + itemDoiUrl = bundleCitationRelease.productDoi.url; + itemIsTombstoned = determineDoiStatusTombstone(bundleDpds); + } + item.releaseObject = itemReleaseObject; + item.doiUrl = itemDoiUrl; + item.isTombstoned = itemIsTombstoned; + item.citableBaseProduct = citableBaseProduct; + item.citableReleaseProduct = citableReleaseProduct; + item.bundleParentCode = bundleParentCode; + return item; + }; + // Build set of applicable citation items for product, bundle + var items = []; + if (!hasBundleCode) { + var nonBundleItem = buildCitationItem(); + items.push(nonBundleItem); + } else if ((0, _typeUtil.isStringNonEmpty)(bundle.doiProductCode)) { + var bundleParentCode = bundle.doiProductCode; + var singleBundleItem = buildCitationItem(bundleParentCode); + items.push(singleBundleItem); + } else if (Array.isArray(bundle.doiProductCode) && (0, _typeUtil.existsNonEmpty)(bundle.doiProductCode)) { + var bundleParentCodes = bundle.doiProductCode; + if (hasProductReleaseDois && !Array.isArray(dataProductDoiStatus)) { + var _bundleParentCode = bundle.doiProductCode[0]; + var _singleBundleItem = buildCitationItem(_bundleParentCode); + items.push(_singleBundleItem); + } else { + bundleParentCodes.forEach(function (bundleParentCode) { + var bundleDpds; + if (hasProductReleaseDois && Array.isArray(dataProductDoiStatus)) { + bundleDpds = dataProductDoiStatus.find(function (ds) { + if (!(0, _typeUtil.exists)(ds)) return false; + return ds.productCode.localeCompare(bundleParentCode) === 0; + }); + } + // If we could not identify a matching DOI record for the bundle parent + // code, it is an invalid state, do not capture. + // This should not occur if bundles and DOIs are properly + // configured and data come across properly in API calls. + if ((0, _typeUtil.exists)(bundleDpds)) { + var bundleItem = buildCitationItem(bundleParentCode, bundleDpds); + items.push(bundleItem); + } else if (hasSpecifiedRelease && isAppliedReleaseLatestNonProv) { + var _bundleItem = buildCitationItem(bundleParentCode); + items.push(_bundleItem); + } + }); + } } // Determine if there's a valid product to generate the citation with. - var hasValidProduct = (0, _typeUtil.exists)(citableBaseProduct); - var hasValidReleaseProduct = (0, _typeUtil.exists)(citableReleaseProduct); + var hasValidProduct = items.some(function (item) { + return (0, _typeUtil.exists)(item.citableBaseProduct); + }); + var hasValidReleaseProduct = items.some(function (item) { + return (0, _typeUtil.exists)(item.citableReleaseProduct); + }); // Verify identified release product is in the applied release. var isCitableReleaseProductInRelease = false; // If looking at latest release non provisional, consider in release. if (isAppliedReleaseLatestNonProv) { isCitableReleaseProductInRelease = true; } else if (hasValidReleaseProduct) { - var _citableReleaseProduc; - var productHasRelease = (_citableReleaseProduc = citableReleaseProduct) === null || _citableReleaseProduc === void 0 ? void 0 : _citableReleaseProduc.releases.find(function (r) { - return r.release === appliedRenderedReleaseTag; + var productHasRelease = items.some(function (item) { + var _item$citableReleaseP; + var dpr = (_item$citableReleaseP = item.citableReleaseProduct) === null || _item$citableReleaseP === void 0 ? void 0 : _item$citableReleaseP.releases.find(function (r) { + return r.release === appliedRenderedReleaseTag; + }); + return (0, _typeUtil.exists)(dpr) || item.isTombstoned; }); - isCitableReleaseProductInRelease = (0, _typeUtil.exists)(productHasRelease) || isTombstoned; + isCitableReleaseProductInRelease = productHasRelease || isTombstoned; } // Determine the overall citation display status. var appliedStatus = status; var displayType = _ViewState.DisplayType.CONDITIONAL; var isReady = status === _State.ContextStatus.READY; var isError = status === _State.ContextStatus.ERROR; + var setErrorNotAvailable = function setErrorNotAvailable() { + appliedStatus = _State.ContextStatus.ERROR; + displayType = _ViewState.DisplayType.NOT_AVAILABLE; + }; if (isReady) { if (!hasValidProduct) { // If the context is ready and no product is identified, error state. - appliedStatus = _State.ContextStatus.ERROR; - displayType = _ViewState.DisplayType.NOT_AVAILABLE; + setErrorNotAvailable(); } else if (hasSpecifiedRelease) { // A release has been specified, determine validity. if (hideAppliedReleaseCitation && !isAppliedReleaseLatestNonProv) { @@ -409,8 +501,7 @@ var useViewState = function useViewState(state, props) { // If the component is ready and a release was specified but // failed to resolve the appropriate citable release product, // error state. - appliedStatus = _State.ContextStatus.ERROR; - displayType = _ViewState.DisplayType.NOT_AVAILABLE; + setErrorNotAvailable(); } } else if (isAppliedReleaseLatestNonProv) { displayType = _ViewState.DisplayType.PROVISIONAL; @@ -433,8 +524,7 @@ var useViewState = function useViewState(state, props) { } else if (!hasValidProduct || !hasValidReleaseProduct) { // If the component is ready and the display state is conditional // and a valid product and release product were not found, error state. - appliedStatus = _State.ContextStatus.ERROR; - displayType = _ViewState.DisplayType.NOT_AVAILABLE; + setErrorNotAvailable(); } } else if (isError) { if (hasSpecifiedRelease && isSpecifiedReleaseLatestNonProv) { @@ -446,14 +536,10 @@ var useViewState = function useViewState(state, props) { } return { status: appliedStatus, - releaseObject: appliedReleaseObject, - doiUrl: appliedReleaseDoi, + citationItems: items, releases: releases, - citableBaseProduct: citableBaseProduct, - citableReleaseProduct: citableReleaseProduct, displayType: displayType, isTombstoned: isTombstoned, - bundleParentCode: bundleParentCode, citationDownloadsFetchStatus: citationDownloadsFetchStatus }; }; diff --git a/lib/components/Citation/DataProductCitation/State.d.ts b/lib/components/Citation/DataProductCitation/State.d.ts index 120a918d..a2e4d340 100644 --- a/lib/components/Citation/DataProductCitation/State.d.ts +++ b/lib/components/Citation/DataProductCitation/State.d.ts @@ -41,7 +41,7 @@ export interface ContextDataProduct { export interface DataState { product: Nullable; productReleases: Record>; - productReleaseDois: Record>; + productReleaseDois: Record>; bundleParents: Record; bundleParentReleases: Record>; releases: CitationRelease[]; diff --git a/lib/components/Citation/DataProductCitation/View.js b/lib/components/Citation/DataProductCitation/View.js index cfe025d4..dcd1d499 100644 --- a/lib/components/Citation/DataProductCitation/View.js +++ b/lib/components/Citation/DataProductCitation/View.js @@ -1,78 +1,34 @@ "use strict"; -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _react = _interopRequireWildcard(require("react")); -var _reactCopyToClipboard = require("react-copy-to-clipboard"); +var _react = _interopRequireDefault(require("react")); var _styles = require("@material-ui/core/styles"); -var _Alert = _interopRequireDefault(require("@material-ui/lab/Alert")); -var _Button = _interopRequireDefault(require("@material-ui/core/Button")); -var _Card = _interopRequireDefault(require("@material-ui/core/Card")); -var _CardActions = _interopRequireDefault(require("@material-ui/core/CardActions")); -var _CardContent = _interopRequireDefault(require("@material-ui/core/CardContent")); -var _CardHeader = _interopRequireDefault(require("@material-ui/core/CardHeader")); -var _CircularProgress = _interopRequireDefault(require("@material-ui/core/CircularProgress")); var _Grid = _interopRequireDefault(require("@material-ui/core/Grid")); var _Link = _interopRequireDefault(require("@material-ui/core/Link")); var _Skeleton = _interopRequireDefault(require("@material-ui/lab/Skeleton")); -var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip")); var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); -var _Assignment = _interopRequireDefault(require("@material-ui/icons/Assignment")); -var _SaveAlt = _interopRequireDefault(require("@material-ui/icons/SaveAlt")); var _FormatQuote = _interopRequireDefault(require("@material-ui/icons/FormatQuote")); -var _Context = _interopRequireDefault(require("./Context")); -var _Service = _interopRequireDefault(require("./Service")); +var _BundleContentBuilder = _interopRequireDefault(require("../../Bundles/BundleContentBuilder")); +var _DataProductBundleCard = _interopRequireDefault(require("../../Bundles/DataProductBundleCard")); var _ErrorCard = _interopRequireDefault(require("../../Card/ErrorCard")); var _WarningCard = _interopRequireDefault(require("../../Card/WarningCard")); var _Theme = _interopRequireDefault(require("../../Theme/Theme")); -var _CitationService = _interopRequireDefault(require("../../../service/CitationService")); -var _DataCiteService = _interopRequireWildcard(require("../../../service/DataCiteService")); var _RouteService = _interopRequireDefault(require("../../../service/RouteService")); -var _ReleaseService = require("../../../service/ReleaseService"); var _typeUtil = require("../../../util/typeUtil"); -var _Actions = _interopRequireDefault(require("./Actions")); +var _Context = _interopRequireDefault(require("./Context")); +var _ItemView = _interopRequireDefault(require("./ItemView")); +var _Service = _interopRequireDefault(require("./Service")); var _State = require("./State"); var _ViewState = require("./ViewState"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var useStyles = (0, _styles.makeStyles)(function (theme) { return { - cardActions: { - flexWrap: 'wrap', - marginTop: theme.spacing(-1), - '&> *': { - marginLeft: '0px !important', - marginTop: theme.spacing(1) - }, - '&> :not(:last-child)': { - marginRight: theme.spacing(1) - } - }, - cardButton: { - padding: '5px 10px', - backgroundColor: '#fff', - whiteSpace: 'nowrap' - }, - cardButtonIcon: { - marginRight: theme.spacing(1) - }, - citationCard: { - marginTop: theme.spacing(2) - }, - citationText: { - fontFamily: 'monospace' - }, citationTextOnly: { - color: _Theme.default.palette.grey[400] - }, - citationTextWithQualifier: { - marginTop: theme.spacing(1.5), - fontFamily: 'monospace' + color: theme.palette.grey[400] }, calloutIcon: { color: theme.palette.grey[300], @@ -87,44 +43,8 @@ var useStyles = (0, _styles.makeStyles)(function (theme) { citationUseText: { flexGrow: 1 }, - bundleParentBlurbCard: { - backgroundColor: _Theme.default.colors.GOLD[50], - marginTop: theme.spacing(1) - }, - bundleParentBlurbCardTextOnly: { - backgroundColor: _Theme.default.colors.GOLD[50], - marginTop: theme.spacing(1), + itemContainer: { marginBottom: theme.spacing(2) - }, - bundleParentBlurbCardContent: { - padding: theme.spacing(2), - paddingBottom: '20px !important' - }, - bundleParentBlurb: { - fontStyle: 'italic', - fontSize: '0.8rem' - }, - tombstoneBlurbCard: { - backgroundColor: _Theme.default.colors.BROWN[50], - borderColor: _Theme.default.colors.BROWN[300], - marginTop: theme.spacing(1) - }, - tombstoneBlurbCardTextOnly: { - backgroundColor: _Theme.default.colors.GOLD[50], - marginTop: theme.spacing(1), - marginBottom: theme.spacing(2) - }, - tombstoneBlurbCardHeader: { - padding: theme.spacing(2), - paddingBottom: 0 - }, - tombstoneBlurbCardContent: { - padding: theme.spacing(2), - paddingTop: theme.spacing(1), - paddingBottom: '20px !important' - }, - tombstoneBlurb: { - fontSize: '0.8rem' } }; }); @@ -132,10 +52,10 @@ var DataProductCitationView = function DataProductCitationView(props) { var showQuoteIcon = props.showQuoteIcon, disableSkeleton = props.disableSkeleton, showTextOnly = props.showTextOnly, - textOnlyProps = props.textOnlyProps; + textOnlyProps = props.textOnlyProps, + showManyParents = props.showManyParents; var classes = useStyles(_Theme.default); var state = _Context.default.useDataProductCitationContextState(); - var dispatch = _Context.default.useDataProductCitationContextDispatch(); var appliedTextOnly = { variant: 'caption', cssClass: classes.citationTextOnly @@ -146,35 +66,23 @@ var DataProductCitationView = function DataProductCitationView(props) { var viewState = _Service.default.useViewState(state, props); var status = viewState.status, displayType = viewState.displayType, - isTombstoned = viewState.isTombstoned, - releases = viewState.releases, - releaseObject = viewState.releaseObject, - citableBaseProduct = viewState.citableBaseProduct, - citableReleaseProduct = viewState.citableReleaseProduct, - bundleParentCode = viewState.bundleParentCode, - citationDownloadsFetchStatus = viewState.citationDownloadsFetchStatus; - var handleResetCitationDownloadsCb = (0, _react.useCallback)(function (provisionalCb) { - _Service.default.handleResetCitationDownloads(citationDownloadsFetchStatus, provisionalCb, dispatch); - }, [dispatch, citationDownloadsFetchStatus]); - var handleCitationDownloadCb = (0, _react.useCallback)(function (citationProduct, releaseCb, formatCb) { - var provisionalCb = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - var coercedTarget = _extends({}, citationProduct); - var key = _Service.default.buildCitationDownloadKey(citationProduct, releaseCb, formatCb, provisionalCb); - var fullDoi = _Service.default.getReleaseDoi(releases, releaseCb); - handleResetCitationDownloadsCb(provisionalCb); - if (dispatch) { - dispatch(_Actions.default.fetchCitationDownloadStarted(key)); + citationItems = viewState.citationItems; + var bundleParentCodes = {}; + var hasManyParents = citationItems.length > 1; + citationItems.forEach(function (item) { + var _item$releaseObject; + if (!(0, _typeUtil.exists)(item) || !(0, _typeUtil.isStringNonEmpty)(item.bundleParentCode)) { + return; } - _DataCiteService.default.downloadCitation(formatCb, _DataCiteService.CitationDownloadType.DATA_PRODUCT, coercedTarget, fullDoi, releaseCb, function (data) { - if (dispatch) { - dispatch(_Actions.default.fetchCitationDownloadSucceeded(key)); - } - }, function (error) { - if (dispatch) { - dispatch(_Actions.default.fetchCitationDownloadFailed(key, 'Citation download failed')); - } - }); - }, [dispatch, releases, handleResetCitationDownloadsCb]); + var key = "".concat(item.bundleParentCode, ":").concat((_item$releaseObject = item.releaseObject) === null || _item$releaseObject === void 0 ? void 0 : _item$releaseObject.release); + if (!(0, _typeUtil.exists)(bundleParentCodes[key])) { + var _item$releaseObject2; + bundleParentCodes[key] = { + productCode: item.bundleParentCode, + release: ((_item$releaseObject2 = item.releaseObject) === null || _item$releaseObject2 === void 0 ? void 0 : _item$releaseObject2.release) || null + }; + } + }); var renderSkeleton = function renderSkeleton() { if (disableSkeleton) { // eslint-disable-next-line react/jsx-no-useless-fragment @@ -262,178 +170,66 @@ var DataProductCitationView = function DataProductCitationView(props) { className: classes.citationUseText }, blurb, "See ", dataPolicyLink, " for more info.")); }; - var renderTombstoneNotice = function renderTombstoneNotice() { - if (!isTombstoned) { - return null; - } - var citationRelease = releaseObject; - var doiDisplay = ' '; - if (citationRelease.productDoi.url) { - var doiId = citationRelease.productDoi.url.split('/').slice(-2).join('/'); - doiDisplay = " (DOI:".concat(doiId, ") "); - } - var latestAvailableReleaseBlurb = null; - if (citableBaseProduct !== null && citableBaseProduct !== void 0 && citableBaseProduct.releases && (citableBaseProduct === null || citableBaseProduct === void 0 ? void 0 : citableBaseProduct.releases.length) > 0) { - var latestAvailableProductRelease = citableBaseProduct === null || citableBaseProduct === void 0 ? void 0 : citableBaseProduct.releases[0]; - if (latestAvailableProductRelease.release.localeCompare(citationRelease.release) !== 0) { - var dataProductDetailLink = /*#__PURE__*/_react.default.createElement(_Link.default, { - href: _RouteService.default.getProductDetailPath(citableBaseProduct.productCode) - }, "newer release"); - latestAvailableReleaseBlurb = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "has been replaced by a ", dataProductDetailLink, " and\xA0"); - } - } - var contactUsLink = /*#__PURE__*/_react.default.createElement(_Link.default, { - href: _RouteService.default.getContactUsPath() - }, "Contact Us"); - var tombstoneNote = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, citationRelease.release, " of this data product", doiDisplay, " ", latestAvailableReleaseBlurb, "is no longer available for download. If this specific release is needed for research purposes, please fill out the ", contactUsLink, " form."); - return /*#__PURE__*/_react.default.createElement(_Card.default, { - className: showTextOnly ? classes.tombstoneBlurbCardTextOnly : classes.tombstoneBlurbCard - }, /*#__PURE__*/_react.default.createElement(_CardHeader.default, { - className: classes.tombstoneBlurbCardHeader, - title: /*#__PURE__*/_react.default.createElement(_Typography.default, { - variant: "h6", - component: "h6" - }, "Release Notice") - }), /*#__PURE__*/_react.default.createElement(_CardContent.default, { - className: classes.tombstoneBlurbCardContent - }, /*#__PURE__*/_react.default.createElement(_Typography.default, { - variant: "body2", - color: "textSecondary", - className: classes.tombstoneBlurb - }, tombstoneNote))); - }; - var renderBundleParentLink = function renderBundleParentLink() { - if (!(0, _typeUtil.isStringNonEmpty)(bundleParentCode)) { + var renderBundleParentsCard = function renderBundleParentsCard() { + var filteredCitationItems = citationItems.filter(function (item) { + return (0, _typeUtil.exists)(item) && (0, _typeUtil.exists)(item.citableBaseProduct) && (0, _typeUtil.exists)(item.citableReleaseProduct) && (0, _typeUtil.isStringNonEmpty)(item.bundleParentCode) && (0, _typeUtil.exists)(item.releaseObject); + }); + if (!(0, _typeUtil.existsNonEmpty)(filteredCitationItems) || filteredCitationItems.length <= 1) { return null; } var isReleaseDisplay = displayType === _ViewState.DisplayType.RELEASE; - var bundleParentName = isReleaseDisplay ? citableReleaseProduct.productName : citableBaseProduct.productName; - var bundleParentHref = _RouteService.default.getProductDetailPath(bundleParentCode); - if (isReleaseDisplay) { - bundleParentHref = _RouteService.default.getProductDetailPath(bundleParentCode, releaseObject.release); - } - var bundleParentLink = /*#__PURE__*/_react.default.createElement(_Link.default, { - href: bundleParentHref - }, "".concat(bundleParentName, " (").concat(bundleParentCode, ")")); - return /*#__PURE__*/_react.default.createElement(_Card.default, { - className: showTextOnly ? classes.bundleParentBlurbCardTextOnly : classes.bundleParentBlurbCard - }, /*#__PURE__*/_react.default.createElement(_CardContent.default, { - className: classes.bundleParentBlurbCardContent - }, /*#__PURE__*/_react.default.createElement(_Typography.default, { - variant: "body2", - color: "textSecondary", - className: classes.bundleParentBlurb - }, /*#__PURE__*/_react.default.createElement("b", null, "Note:"), " This product is bundled into ", bundleParentLink, ". The ", isReleaseDisplay ? 'citation below refers' : 'citations below refer', " to that product as this sub-product is not directly citable."))); - }; - var renderCitationCard = function renderCitationCard(release) { - var conditional = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var provisional = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var citationProduct = provisional ? citableBaseProduct : citableReleaseProduct; - var conditionalText = null; - var citationClassName = classes.citationText; - if (conditional) { - var provReleaseText = provisional ? 'If Provisional data are used, include:' : 'If Released data are used, include:'; - if (showTextOnly) { - conditionalText = /*#__PURE__*/_react.default.createElement(_Typography.default, { - variant: appliedTextOnly.variant, - component: "h6", - className: appliedTextOnly.cssClass - }, provReleaseText); - } else { - conditionalText = /*#__PURE__*/_react.default.createElement(_Typography.default, { - variant: "body1", - component: "h6" - }, provReleaseText); + var bundleNoteTerminalChar = !showManyParents ? '.' : ':'; + var titleContent = _BundleContentBuilder.default.buildDefaultSplitTitleContent(isReleaseDisplay, bundleNoteTerminalChar); + var detailContent = !showManyParents ? undefined : /*#__PURE__*/_react.default.createElement("ul", { + style: { + margin: _Theme.default.spacing(1, 0) } - citationClassName = classes.citationTextWithQualifier; - } - var citationReleaseObject = null; - if (!provisional) { - citationReleaseObject = releaseObject; - } - var citationText = _CitationService.default.buildDataProductCitationText(citationProduct, citationReleaseObject); - if (showTextOnly) { - return /*#__PURE__*/_react.default.createElement("div", null, conditionalText, /*#__PURE__*/_react.default.createElement(_Typography.default, { - variant: appliedTextOnly.variant, - component: "h6", - className: appliedTextOnly.cssClass - }, citationText)); - } - var isSectionDownloading = _Service.default.hasCitationDownloadStatus(citationDownloadsFetchStatus, provisional, _State.FetchStatus.FETCHING); - var downloadStatus; - if (_Service.default.hasCitationDownloadStatus(citationDownloadsFetchStatus, provisional, _State.FetchStatus.ERROR)) { - downloadStatus = /*#__PURE__*/_react.default.createElement(_Alert.default, { - severity: "error", - onClose: function onClose() { - return handleResetCitationDownloadsCb(provisional); - } - }, "Citation download encountered a problem"); - } else if (_Service.default.hasCitationDownloadStatus(citationDownloadsFetchStatus, provisional, _State.FetchStatus.SUCCESS)) { - downloadStatus = /*#__PURE__*/_react.default.createElement(_Alert.default, { - severity: "success", - onClose: function onClose() { - return handleResetCitationDownloadsCb(provisional); - } - }, "Citation downloaded"); + }, filteredCitationItems.map(function (item) { + var bundleParentName = isReleaseDisplay ? item.citableReleaseProduct.productName : item.citableBaseProduct.productName; + var bundleParentHref = _RouteService.default.getProductDetailPath(item.bundleParentCode); + if (isReleaseDisplay) { + bundleParentHref = _RouteService.default.getProductDetailPath(item.bundleParentCode, item.releaseObject.release); + } + return /*#__PURE__*/_react.default.createElement("li", { + key: bundleParentHref + }, /*#__PURE__*/_react.default.createElement(_Link.default, { + href: bundleParentHref, + target: "_blank" + }, "".concat(bundleParentName, " (").concat(item.bundleParentCode, ")"))); + })); + var subTitleContent = !showManyParents ? undefined : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Use either or both citations as appropriate."); + if (showManyParents && filteredCitationItems.length > 2) { + subTitleContent = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Use citations as appropriate."); } - return /*#__PURE__*/_react.default.createElement(_Card.default, { - className: classes.citationCard - }, /*#__PURE__*/_react.default.createElement(_CardContent.default, null, conditionalText, /*#__PURE__*/_react.default.createElement(_Typography.default, { - variant: "body1", - className: citationClassName - }, citationText)), /*#__PURE__*/_react.default.createElement(_CardActions.default, { - className: classes.cardActions - }, /*#__PURE__*/_react.default.createElement(_Tooltip.default, { - placement: "bottom-start", - title: "Click to copy the above plain text citation to the clipboard" - }, /*#__PURE__*/_react.default.createElement(_reactCopyToClipboard.CopyToClipboard, { - text: citationText - }, /*#__PURE__*/_react.default.createElement(_Button.default, { - size: "small", - color: "primary", - variant: "outlined", - startIcon: /*#__PURE__*/_react.default.createElement(_Assignment.default, { - fontSize: "small", - className: classes.cardButtonIcon - }), - className: classes.cardButton - }, "Copy"))), _DataCiteService.default.getDataProductFormats().map(function (format) { - var key = _Service.default.buildCitationDownloadKey(citationProduct, release, format.shortName, provisional); - var isDownloading = !(0, _typeUtil.exists)(citationDownloadsFetchStatus[key]) ? false : citationDownloadsFetchStatus[key].status === _State.FetchStatus.FETCHING; - return /*#__PURE__*/_react.default.createElement(_Tooltip.default, { - key: format.shortName, - placement: "bottom-start", - title: "Click to download the ".concat(citationProduct.productCode, "/").concat(release, " citation as a ") + "file in ".concat(format.longName, " format") - }, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_Button.default, { - size: "small", - color: "primary", - variant: "outlined", - className: classes.cardButton, - disabled: isDownloading || isSectionDownloading, - startIcon: isDownloading ? /*#__PURE__*/_react.default.createElement(_CircularProgress.default, { - size: 18, - className: classes.cardButtonIcon - }) : /*#__PURE__*/_react.default.createElement(_SaveAlt.default, { - fontSize: "small", - className: classes.cardButtonIcon - }), - onClick: function onClick() { - handleCitationDownloadCb(citationProduct, release, format.shortName, provisional); - } - }, "Download (".concat(format.shortName, ")")))); - })), downloadStatus); + return /*#__PURE__*/_react.default.createElement("div", { + className: classes.itemContainer + }, /*#__PURE__*/_react.default.createElement(_DataProductBundleCard.default, { + showIcon: true, + isSplit: hasManyParents, + titleContent: titleContent, + detailContent: detailContent, + subTitleContent: subTitleContent + })); + }; + var renderItems = function renderItems() { + return citationItems.map(function (item, index) { + return /*#__PURE__*/_react.default.createElement("div", { + className: classes.itemContainer + // eslint-disable-next-line react/no-array-index-key + , + key: "DataProductCitationItemKey-".concat(item.doiUrl || index) + }, /*#__PURE__*/_react.default.createElement(_ItemView.default, _extends({}, props, { + citationItem: item, + viewState: viewState, + hasManyParents: hasManyParents + }))); + }); }; var renderCitationDisplay = function renderCitationDisplay() { - var citationCard; switch (displayType) { case _ViewState.DisplayType.CONDITIONAL: - citationCard = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderCitationCard(_ReleaseService.PROVISIONAL_RELEASE, true, true), renderCitationCard(releaseObject.release, true, false)); - break; case _ViewState.DisplayType.PROVISIONAL: - citationCard = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderCitationCard(_ReleaseService.PROVISIONAL_RELEASE, false, true)); - break; case _ViewState.DisplayType.RELEASE: - citationCard = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderCitationCard(releaseObject.release, false, false)); break; case _ViewState.DisplayType.NOT_AVAILABLE: return renderNotAvailable(); @@ -441,7 +237,7 @@ var DataProductCitationView = function DataProductCitationView(props) { // Invalid state, return error state. return renderError(); } - return /*#__PURE__*/_react.default.createElement("div", null, renderCitationBlurb(), renderTombstoneNotice(), renderBundleParentLink(), citationCard); + return /*#__PURE__*/_react.default.createElement("div", null, renderCitationBlurb(), renderBundleParentsCard(), renderItems()); }; switch (status) { case _State.ContextStatus.INITIALIZING: @@ -461,7 +257,8 @@ DataProductCitationView.defaultProps = { disableConditional: false, disableSkeleton: false, showTextOnly: false, - textOnlyProps: undefined + textOnlyProps: undefined, + showManyParents: true }; var _default = DataProductCitationView; exports.default = _default; \ No newline at end of file diff --git a/lib/components/Citation/DataProductCitation/ViewState.d.ts b/lib/components/Citation/DataProductCitation/ViewState.d.ts index 79cf7049..213ee273 100644 --- a/lib/components/Citation/DataProductCitation/ViewState.d.ts +++ b/lib/components/Citation/DataProductCitation/ViewState.d.ts @@ -11,6 +11,12 @@ export interface DataProductCitationViewProps { disableSkeleton?: boolean; showTextOnly?: boolean; textOnlyProps?: CitationTextOnlyProps; + showManyParents?: boolean; +} +export interface DataProductCitationItemViewProps extends DataProductCitationViewProps { + citationItem: DataProductCitationItem; + viewState: DataProductCitationViewState; + hasManyParents: boolean; } export declare enum DisplayType { PROVISIONAL = "PROVISIONAL", @@ -18,15 +24,19 @@ export declare enum DisplayType { CONDITIONAL = "CONDITIONAL", NOT_AVAILABLE = "NOT_AVAILABLE" } -export interface DataProductCitationViewState { - status: ContextStatus; - displayType: DisplayType; - isTombstoned: boolean; - releases: CitationRelease[]; +export interface DataProductCitationItem { releaseObject: Nullable; doiUrl: Nullable; citableBaseProduct: Nullable; citableReleaseProduct: Nullable; bundleParentCode: Nullable; + isTombstoned: boolean; +} +export interface DataProductCitationViewState { + status: ContextStatus; + displayType: DisplayType; + isTombstoned: boolean; + releases: CitationRelease[]; + citationItems: DataProductCitationItem[]; citationDownloadsFetchStatus: Record; } diff --git a/lib/components/DataProductAvailability/AvailabilitySvgComponents.d.ts b/lib/components/DataProductAvailability/AvailabilitySvgComponents.d.ts index e188653b..71f33689 100644 --- a/lib/components/DataProductAvailability/AvailabilitySvgComponents.d.ts +++ b/lib/components/DataProductAvailability/AvailabilitySvgComponents.d.ts @@ -27,6 +27,15 @@ export const CELL_ATTRS: { nudge: number; fill: string; }; + tombstoned: { + stroke: null; + strokeWidth: null; + width: string; + height: string; + rx: string; + nudge: number; + fill: string; + }; 'not collected': { stroke: null; strokeWidth: null; diff --git a/lib/components/DataProductAvailability/AvailabilitySvgComponents.js b/lib/components/DataProductAvailability/AvailabilitySvgComponents.js index 38ef044b..c65be7a5 100644 --- a/lib/components/DataProductAvailability/AvailabilitySvgComponents.js +++ b/lib/components/DataProductAvailability/AvailabilitySvgComponents.js @@ -144,6 +144,14 @@ var CELL_ATTRS = { 'not available': _extends({ fill: _Theme.default.palette.grey[200] }, noStrokeAttrs), + tombstoned: _extends({ + // #708090 slate gray + // #5A6673 darker slate gray + // #727C8C more modified hue towards gray + // #272727 greyscale of available blue color (rgba(39, 39, 39, 0.9)) + // Theme.palette.grey[500] + fill: 'rgba(39, 39, 39, 0.9)' + }, noStrokeAttrs), 'not collected': _extends({ fill: _Theme.COLORS.GOLD[400] }, noStrokeAttrs), diff --git a/lib/components/DataProductAvailability/AvailabilityUtils.d.ts b/lib/components/DataProductAvailability/AvailabilityUtils.d.ts index 72bfeadb..f51370cc 100644 --- a/lib/components/DataProductAvailability/AvailabilityUtils.d.ts +++ b/lib/components/DataProductAvailability/AvailabilityUtils.d.ts @@ -38,6 +38,10 @@ export const VALID_ENHANCED_STATUSES: { title: string; description: string; }; + tombstoned: { + title: string; + description: string; + }; 'mixed some availability': { title: string; description: string; diff --git a/lib/components/DataProductAvailability/AvailabilityUtils.js b/lib/components/DataProductAvailability/AvailabilityUtils.js index 6a3dc0cb..3356938c 100644 --- a/lib/components/DataProductAvailability/AvailabilityUtils.js +++ b/lib/components/DataProductAvailability/AvailabilityUtils.js @@ -52,6 +52,10 @@ var VALID_ENHANCED_STATUSES = { title: 'Not Available', description: 'Data was neither expected nor collected' }, + tombstoned: { + title: 'No Longer Available', + description: 'Data is no longer available for download' + }, 'mixed some availability': { title: 'Mixed (Some Availability)', description: 'More than one status including at least one "Available" across sites / tables in the rollup (e.g. viewing states, all tables, etc.)' diff --git a/lib/components/DataProductAvailability/BasicAvailabilityInterface.d.ts b/lib/components/DataProductAvailability/BasicAvailabilityInterface.d.ts index 47efd180..02159370 100644 --- a/lib/components/DataProductAvailability/BasicAvailabilityInterface.d.ts +++ b/lib/components/DataProductAvailability/BasicAvailabilityInterface.d.ts @@ -27,6 +27,7 @@ declare namespace BasicAvailabilityInterface { const sortDirection: PropTypes.Requireable; const disableSelection: PropTypes.Requireable; const delineateRelease: PropTypes.Requireable; + const availabilityStatusType: PropTypes.Requireable; } namespace defaultProps { const siteCodes_1: never[]; @@ -43,6 +44,8 @@ declare namespace BasicAvailabilityInterface { export { disableSelection_1 as disableSelection }; const delineateRelease_1: boolean; export { delineateRelease_1 as delineateRelease }; + const availabilityStatusType_1: null; + export { availabilityStatusType_1 as availabilityStatusType }; } } import PropTypes from "prop-types"; diff --git a/lib/components/DataProductAvailability/BasicAvailabilityInterface.js b/lib/components/DataProductAvailability/BasicAvailabilityInterface.js index 90f4766f..f4cb754d 100644 --- a/lib/components/DataProductAvailability/BasicAvailabilityInterface.js +++ b/lib/components/DataProductAvailability/BasicAvailabilityInterface.js @@ -295,7 +295,8 @@ var BasicAvailabilityInterface = function BasicAvailabilityInterface(props) { contextSortDirection = _DownloadDataContext$3.availabilitySortDirection, dispatchSelection = _DownloadDataContext$2[1]; var disableSelection = props.disableSelection, - delineateRelease = props.delineateRelease; + delineateRelease = props.delineateRelease, + availabilityStatusType = props.availabilityStatusType; var selectionEnabled = !disableSelection && requiredSteps.some(function (step) { return step.key === 'sitesAndDateRange'; }); @@ -479,7 +480,7 @@ var BasicAvailabilityInterface = function BasicAvailabilityInterface(props) { views.states.rows[stateCode] = views.states.rows[stateCode] || {}; views.domains.rows[domainCode] = views.domains.rows[domainCode] || {}; availableMonths.forEach(function (month) { - var status = 'available'; + var status = availabilityStatusType || 'available'; if (delineateRelease && provAvailableMonths && provAvailableMonths.length > 0) { if (provAvailableMonths.includes(month)) { status = 'available-provisional'; @@ -506,7 +507,7 @@ var BasicAvailabilityInterface = function BasicAvailabilityInterface(props) { } views.products.rows[dataProductCode] = {}; availableMonths.forEach(function (month) { - var status = 'available'; + var status = availabilityStatusType || 'available'; if (delineateRelease && provAvailableMonths && provAvailableMonths.length > 0) { if (provAvailableMonths.includes(month)) { status = 'available-provisional'; @@ -719,6 +720,7 @@ var BasicAvailabilityInterface = function BasicAvailabilityInterface(props) { orientation: currentView === 'products' ? 'horizontal' : '', selectionEnabled: selectionEnabled, delineateRelease: delineateRelease, + availabilityStatusType: availabilityStatusType, style: { flexGrow: 1 } @@ -921,7 +923,8 @@ BasicAvailabilityInterface.propTypes = { sortMethod: _propTypes.default.oneOf(['sites', 'states', 'domains']), sortDirection: _propTypes.default.oneOf(['ASC', 'DESC']), disableSelection: _propTypes.default.bool, - delineateRelease: _propTypes.default.bool + delineateRelease: _propTypes.default.bool, + availabilityStatusType: _propTypes.default.oneOf(['available', 'tombstoned']) }; BasicAvailabilityInterface.defaultProps = { siteCodes: [], @@ -930,7 +933,8 @@ BasicAvailabilityInterface.defaultProps = { sortMethod: null, sortDirection: 'ASC', disableSelection: false, - delineateRelease: false + delineateRelease: false, + availabilityStatusType: null }; var _default = BasicAvailabilityInterface; exports.default = _default; \ No newline at end of file diff --git a/lib/components/DataProductAvailability/BasicAvailabilityKey.d.ts b/lib/components/DataProductAvailability/BasicAvailabilityKey.d.ts index f3aa22ef..8b0ddf96 100644 --- a/lib/components/DataProductAvailability/BasicAvailabilityKey.d.ts +++ b/lib/components/DataProductAvailability/BasicAvailabilityKey.d.ts @@ -7,6 +7,7 @@ declare namespace BasicAvailabilityKey { const orientation: PropTypes.Requireable; const selectionEnabled: PropTypes.Requireable; const delineateRelease: PropTypes.Requireable; + const availabilityStatusType: PropTypes.Requireable; } namespace defaultProps { const orientation_1: string; @@ -15,6 +16,8 @@ declare namespace BasicAvailabilityKey { export { selectionEnabled_1 as selectionEnabled }; const delineateRelease_1: boolean; export { delineateRelease_1 as delineateRelease }; + const availabilityStatusType_1: null; + export { availabilityStatusType_1 as availabilityStatusType }; } } export default BasicAvailabilityKey; diff --git a/lib/components/DataProductAvailability/BasicAvailabilityKey.js b/lib/components/DataProductAvailability/BasicAvailabilityKey.js index bd2b3cb5..c6661955 100644 --- a/lib/components/DataProductAvailability/BasicAvailabilityKey.js +++ b/lib/components/DataProductAvailability/BasicAvailabilityKey.js @@ -15,6 +15,8 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +var VERTICAL_STATUS_TYPES = ['tombstoned']; + /** Setup: CSS classes */ @@ -46,14 +48,15 @@ function BasicAvailabilityKey(props) { var classes = useStyles(_Theme.default); var orientation = props.orientation, selectionEnabled = props.selectionEnabled, - delineateRelease = props.delineateRelease; + delineateRelease = props.delineateRelease, + availabilityStatusType = props.availabilityStatusType; /** Render: Cells (Vertical Orientation) */ var renderVerticalCellLegend = function renderVerticalCellLegend() { var totalRows = delineateRelease ? 3 : 2; - var totalWidth = delineateRelease ? 180 : 90; + var totalWidth = delineateRelease || VERTICAL_STATUS_TYPES.includes(availabilityStatusType) ? 180 : 90; var rowHeight = _AvailabilityUtils.SVG.CELL_HEIGHT + 2 * _AvailabilityUtils.SVG.CELL_PADDING; var totalHeight = rowHeight * totalRows - _AvailabilityUtils.SVG.CELL_PADDING; var rowY = function rowY(row) { @@ -63,6 +66,39 @@ function BasicAvailabilityKey(props) { return rowY(row) + (_AvailabilityUtils.SVG.LABEL_FONT_SIZE - _AvailabilityUtils.SVG.CELL_PADDING + 1); }; var cellOffset = _AvailabilityUtils.SVG.CELL_WIDTH + 2 * _AvailabilityUtils.SVG.CELL_PADDING; + var renderAvailabilityStatusCell = function renderAvailabilityStatusCell() { + var tombstonedCell = _AvailabilitySvgComponents.CELL_ATTRS.tombstoned; + switch (availabilityStatusType) { + case 'tombstoned': + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("rect", { + x: 0, + y: rowY(0), + width: _AvailabilityUtils.SVG.CELL_WIDTH, + height: _AvailabilityUtils.SVG.CELL_HEIGHT, + rx: _AvailabilityUtils.SVG.CELL_RX, + fill: tombstonedCell.fill + }), /*#__PURE__*/_react.default.createElement("text", { + className: classes.legendText, + x: cellOffset, + y: rowLabelY(0) + }, "No Longer Available")); + case 'available': + default: + /* eslint-disable max-len */ + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("rect", { + x: 0, + y: rowY(0), + width: _AvailabilityUtils.SVG.CELL_WIDTH, + height: _AvailabilityUtils.SVG.CELL_HEIGHT, + rx: _AvailabilityUtils.SVG.CELL_RX, + fill: _Theme.default.palette.secondary.main + }), /*#__PURE__*/_react.default.createElement("text", { + className: classes.legendText, + x: cellOffset, + y: rowLabelY(0) + }, "Available")); + } + }; var renderProvisionalCell = function renderProvisionalCell() { if (!delineateRelease) { return null; @@ -89,18 +125,7 @@ function BasicAvailabilityKey(props) { width: totalWidth, height: totalHeight, className: classes.legendSvg - }, /*#__PURE__*/_react.default.createElement("rect", { - x: 0, - y: rowY(0), - width: _AvailabilityUtils.SVG.CELL_WIDTH, - height: _AvailabilityUtils.SVG.CELL_HEIGHT, - rx: _AvailabilityUtils.SVG.CELL_RX, - fill: _Theme.default.palette.secondary.main - }), /*#__PURE__*/_react.default.createElement("text", { - className: classes.legendText, - x: cellOffset, - y: rowLabelY(0) - }, "Available"), renderProvisionalCell(), /*#__PURE__*/_react.default.createElement("rect", { + }, renderAvailabilityStatusCell(), renderProvisionalCell(), /*#__PURE__*/_react.default.createElement("rect", { x: 0, y: rowY(delineateRelease ? 2 : 1), width: _AvailabilityUtils.SVG.CELL_WIDTH, @@ -128,6 +153,39 @@ function BasicAvailabilityKey(props) { }; var rowLabelY = _AvailabilityUtils.SVG.LABEL_FONT_SIZE - _AvailabilityUtils.SVG.CELL_PADDING + 1; var cellOffset = _AvailabilityUtils.SVG.CELL_WIDTH + 2 * _AvailabilityUtils.SVG.CELL_PADDING; + var renderAvailabilityStatusCell = function renderAvailabilityStatusCell() { + var tombstonedCell = _AvailabilitySvgComponents.CELL_ATTRS.tombstoned; + switch (availabilityStatusType) { + case 'tombstoned': + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("rect", { + x: columnX(0), + y: 0, + width: _AvailabilityUtils.SVG.CELL_WIDTH, + height: _AvailabilityUtils.SVG.CELL_HEIGHT, + rx: _AvailabilityUtils.SVG.CELL_RX, + fill: tombstonedCell.fill + }), /*#__PURE__*/_react.default.createElement("text", { + className: classes.legendText, + x: columnX(0) + cellOffset, + y: rowLabelY + }, "No Longer Available")); + case 'available': + default: + /* eslint-disable max-len */ + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("rect", { + x: columnX(0), + y: 0, + width: _AvailabilityUtils.SVG.CELL_WIDTH, + height: _AvailabilityUtils.SVG.CELL_HEIGHT, + rx: _AvailabilityUtils.SVG.CELL_RX, + fill: _Theme.default.palette.secondary.main + }), /*#__PURE__*/_react.default.createElement("text", { + className: classes.legendText, + x: columnX(0) + cellOffset, + y: rowLabelY + }, "Available")); + } + }; var renderProvisionalCell = function renderProvisionalCell() { if (!delineateRelease) { return null; @@ -154,18 +212,7 @@ function BasicAvailabilityKey(props) { width: totalWidth, height: totalHeight, className: classes.legendSvg - }, /*#__PURE__*/_react.default.createElement("rect", { - x: columnX(0), - y: 0, - width: _AvailabilityUtils.SVG.CELL_WIDTH, - height: _AvailabilityUtils.SVG.CELL_HEIGHT, - rx: _AvailabilityUtils.SVG.CELL_RX, - fill: _Theme.default.palette.secondary.main - }), /*#__PURE__*/_react.default.createElement("text", { - className: classes.legendText, - x: columnX(0) + cellOffset, - y: rowLabelY - }, "Available"), renderProvisionalCell(), /*#__PURE__*/_react.default.createElement("rect", { + }, renderAvailabilityStatusCell(), renderProvisionalCell(), /*#__PURE__*/_react.default.createElement("rect", { x: columnX(delineateRelease ? 2 : 1), y: 0, width: _AvailabilityUtils.SVG.CELL_WIDTH, @@ -252,7 +299,8 @@ function BasicAvailabilityKey(props) { /* eslint-enable max-len */ }; - return selectionEnabled || delineateRelease ? /*#__PURE__*/_react.default.createElement("div", { + var renderVerticalLegend = selectionEnabled || delineateRelease || VERTICAL_STATUS_TYPES.includes(availabilityStatusType); + return renderVerticalLegend ? /*#__PURE__*/_react.default.createElement("div", { className: classes.legendContainer }, renderCellLegend('vertical'), selectionEnabled ? renderSelectionLegend() : null) : /*#__PURE__*/_react.default.createElement("div", { className: classes.legendContainer @@ -261,10 +309,12 @@ function BasicAvailabilityKey(props) { BasicAvailabilityKey.propTypes = { orientation: _propTypes.default.string, selectionEnabled: _propTypes.default.bool, - delineateRelease: _propTypes.default.bool + delineateRelease: _propTypes.default.bool, + availabilityStatusType: _propTypes.default.oneOf(['available', 'tombstoned']) }; BasicAvailabilityKey.defaultProps = { orientation: '', selectionEnabled: false, - delineateRelease: false + delineateRelease: false, + availabilityStatusType: null }; \ No newline at end of file diff --git a/lib/components/DataProductAvailability/DataProductAvailability.js b/lib/components/DataProductAvailability/DataProductAvailability.js index a484aa4c..c253223f 100644 --- a/lib/components/DataProductAvailability/DataProductAvailability.js +++ b/lib/components/DataProductAvailability/DataProductAvailability.js @@ -39,7 +39,8 @@ DataProductAvailability.propTypes = { sortMethod: _propTypes.default.oneOf(['sites', 'states', 'domains']), sortDirection: _propTypes.default.oneOf(['ASC', 'DESC']), disableSelection: _propTypes.default.bool, - delineateRelease: _propTypes.default.bool + delineateRelease: _propTypes.default.bool, + availabilityStatusType: _propTypes.default.oneOf(['available', 'tombstoned']) }; DataProductAvailability.defaultProps = { sites: [], @@ -49,7 +50,8 @@ DataProductAvailability.defaultProps = { sortMethod: null, sortDirection: 'ASC', disableSelection: false, - delineateRelease: false + delineateRelease: false, + availabilityStatusType: null }; var WrappedDataProductAvailability = _Theme.default.getWrappedComponent(_NeonContext.default.getWrappedComponent(DataProductAvailability)); var _default = WrappedDataProductAvailability; diff --git a/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.d.ts b/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.d.ts index a00b5856..ac5cc61d 100644 --- a/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.d.ts +++ b/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.d.ts @@ -6,9 +6,7 @@ declare namespace EnhancedAvailabilityInterface { siteCode: PropTypes.Validator; tables: PropTypes.Validator<(PropTypes.InferProps<{ name: PropTypes.Validator; - description: PropTypes.Validator; /** - Context-Derived Stuff - */ + description: PropTypes.Validator; waitInterval: PropTypes.Validator; months: PropTypes.Validator<{ [x: string]: string | null | undefined; diff --git a/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.js b/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.js index c5384f35..8653e443 100644 --- a/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.js +++ b/lib/components/DataProductAvailability/EnhancedAvailabilityInterface.js @@ -11,12 +11,8 @@ var _lodash = require("lodash"); var _styles = require("@material-ui/core/styles"); var _useMediaQuery = _interopRequireDefault(require("@material-ui/core/useMediaQuery")); var _FormControl = _interopRequireDefault(require("@material-ui/core/FormControl")); -var _FormControlLabel = _interopRequireDefault(require("@material-ui/core/FormControlLabel")); -var _Hidden = _interopRequireDefault(require("@material-ui/core/Hidden")); var _MenuItem = _interopRequireDefault(require("@material-ui/core/MenuItem")); -var _OutlinedInput = _interopRequireDefault(require("@material-ui/core/OutlinedInput")); var _Select = _interopRequireDefault(require("@material-ui/core/Select")); -var _Switch = _interopRequireDefault(require("@material-ui/core/Switch")); var _ToggleButton = _interopRequireDefault(require("@material-ui/lab/ToggleButton")); var _ToggleButtonGroup = _interopRequireDefault(require("@material-ui/lab/ToggleButtonGroup")); var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); @@ -25,7 +21,6 @@ var _KeyboardArrowUp = _interopRequireDefault(require("@material-ui/icons/Keyboa var _AvailabilityContext = _interopRequireDefault(require("./AvailabilityContext")); var _AvailabilityPending = _interopRequireDefault(require("./AvailabilityPending")); var _FullWidthVisualization = _interopRequireDefault(require("../FullWidthVisualization/FullWidthVisualization")); -var _DownloadDataContext = _interopRequireDefault(require("../DownloadDataContext/DownloadDataContext")); var _NeonContext = _interopRequireDefault(require("../NeonContext/NeonContext")); var _Theme = _interopRequireDefault(require("../Theme/Theme")); var _EnhancedAvailabilityKey = _interopRequireDefault(require("./EnhancedAvailabilityKey")); @@ -90,17 +85,11 @@ var EnhancedAvailabilityInterface = function EnhancedAvailabilityInterface(props var availabilitySites = props.sites, other = _objectWithoutProperties(props, _excluded); var classes = useStyles(_Theme.default); - var atXs = (0, _useMediaQuery.default)(_Theme.default.breakpoints.only('xs')); - var atSm = (0, _useMediaQuery.default)(_Theme.default.breakpoints.only('sm')); var _NeonContext$useNeonC = _NeonContext.default.useNeonContextState(), _NeonContext$useNeonC2 = _slicedToArray(_NeonContext$useNeonC, 1), _NeonContext$useNeonC3 = _NeonContext$useNeonC2[0], - neonContextData = _NeonContext$useNeonC3.data, neonContextIsFinal = _NeonContext$useNeonC3.isFinal, neonContextHasError = _NeonContext$useNeonC3.hasError; - var allSites = neonContextData.sites, - allStates = neonContextData.states, - allDomains = neonContextData.domains; var SORT_DIRECTIONS = _AvailabilityContext.default.SORT_DIRECTIONS, useAvailabilityState = _AvailabilityContext.default.useAvailabilityState; var _useAvailabilityState = useAvailabilityState(), @@ -118,7 +107,6 @@ var EnhancedAvailabilityInterface = function EnhancedAvailabilityInterface(props /** Context-Derived Stuff */ - var downloadContextIsActive = false; var selectionEnabled = false; /** diff --git a/lib/components/Documents/DocumentViewer.js b/lib/components/Documents/DocumentViewer.js index d29d5796..8458159d 100644 --- a/lib/components/Documents/DocumentViewer.js +++ b/lib/components/Documents/DocumentViewer.js @@ -36,7 +36,7 @@ var useStyles = (0, _styles.makeStyles)(function (muiTheme) { }) ); }); -var noop = function noop() {}; +var noop = function noop() {/* NOOP */}; var breakpoints = [0, 675, 900, 1200]; var ratios = ['8:11', '3:4', '4:4', '4:3']; var calcAutoHeight = function calcAutoHeight(width) { diff --git a/lib/components/Documents/PdfDocumentViewer.js b/lib/components/Documents/PdfDocumentViewer.js index 2ab45508..75b071b5 100644 --- a/lib/components/Documents/PdfDocumentViewer.js +++ b/lib/components/Documents/PdfDocumentViewer.js @@ -53,7 +53,7 @@ var useStyles = (0, _styles.makeStyles)(function (muiTheme) { }) ); }); -var noop = function noop() {}; +var noop = function noop() {/* NOOP */}; var MIN_PDF_VIEWER_WIDTH = 800; var breakpoints = [0, 675, 900, 1200]; var ratios = ['8:11', '3:4', '4:4', '4:3']; diff --git a/lib/components/Error/ComponentErrorBoundary.d.ts b/lib/components/Error/ComponentErrorBoundary.d.ts index eeb5a0f1..02aa2abb 100644 --- a/lib/components/Error/ComponentErrorBoundary.d.ts +++ b/lib/components/Error/ComponentErrorBoundary.d.ts @@ -1,11 +1,13 @@ import React from 'react'; +import { FallbackProps } from 'react-error-boundary'; interface ErrorInfo { componentStack: string; } interface ComponentErrorBoundaryProps { - children: React.ReactNode | React.ReactNodeArray; + children: React.ReactNode | React.ReactNode[]; onReset?: (...args: Array) => void; onError?: (error: Error, info: ErrorInfo) => void; + fallbackComponent?: React.ComponentType; } declare const ComponentErrorBoundary: React.FC; export default ComponentErrorBoundary; diff --git a/lib/components/Error/ComponentErrorBoundary.js b/lib/components/Error/ComponentErrorBoundary.js index ad572f69..b82e4245 100644 --- a/lib/components/Error/ComponentErrorBoundary.js +++ b/lib/components/Error/ComponentErrorBoundary.js @@ -11,16 +11,18 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var ComponentErrorBoundary = function ComponentErrorBoundary(props) { var children = props.children, onReset = props.onReset, - onError = props.onError; + onError = props.onError, + fallbackComponent = props.fallbackComponent; return /*#__PURE__*/_react.default.createElement(_reactErrorBoundary.ErrorBoundary, { - FallbackComponent: _ComponentFallback.default, + FallbackComponent: fallbackComponent || _ComponentFallback.default, onReset: onReset, onError: onError }, children); }; ComponentErrorBoundary.defaultProps = { onReset: function onReset() {}, - onError: function onError(error, info) {} + onError: function onError(error, info) {}, + fallbackComponent: undefined }; var _default = ComponentErrorBoundary; exports.default = _default; \ No newline at end of file diff --git a/lib/components/Error/CustomComponentFallback.d.ts b/lib/components/Error/CustomComponentFallback.d.ts new file mode 100644 index 00000000..0933f604 --- /dev/null +++ b/lib/components/Error/CustomComponentFallback.d.ts @@ -0,0 +1,7 @@ +import React from 'react'; +import { FallbackProps } from 'react-error-boundary'; +interface CustomComponentFallbackProps extends FallbackProps { + FallbackComponent: React.ComponentType>; +} +declare const CustomComponentFallback: React.FC; +export default CustomComponentFallback; diff --git a/lib/components/Error/CustomComponentFallback.js b/lib/components/Error/CustomComponentFallback.js new file mode 100644 index 00000000..d3d10a4f --- /dev/null +++ b/lib/components/Error/CustomComponentFallback.js @@ -0,0 +1,14 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _react = _interopRequireDefault(require("react")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var CustomComponentFallback = function CustomComponentFallback(props) { + var FallbackComponent = props.FallbackComponent; + return /*#__PURE__*/_react.default.createElement(FallbackComponent, props); +}; +var _default = CustomComponentFallback; +exports.default = _default; \ No newline at end of file diff --git a/lib/components/NeonApi/NeonApi.d.ts b/lib/components/NeonApi/NeonApi.d.ts index 5351ebd5..11b0cbe5 100644 --- a/lib/components/NeonApi/NeonApi.d.ts +++ b/lib/components/NeonApi/NeonApi.d.ts @@ -16,6 +16,7 @@ declare namespace NeonApi { function getJson(url: string, callback: any, errorCallback: any, cancellationSubject$: any, headers?: Object | undefined): import("rxjs").Subscription; function getProductsObservable(): import("rxjs").Observable; function getProductObservable(productCode: string, release?: string): import("rxjs").Observable; + function getProductTombstoneAvailabilityObservable(productCode: string, release: string): import("rxjs").Observable; function getProductDoisObservable(productCode: string, release: string): import("rxjs").Observable; function getProductBundlesObservable(release?: string): import("rxjs").Observable; function getPrototypeDatasetsObservable(): import("rxjs").Observable; diff --git a/lib/components/NeonApi/NeonApi.js b/lib/components/NeonApi/NeonApi.js index 3f75c83d..baf57bd7 100644 --- a/lib/components/NeonApi/NeonApi.js +++ b/lib/components/NeonApi/NeonApi.js @@ -267,6 +267,18 @@ var NeonApi = { var path = release ? "".concat(root, "/").concat(productCode, "/").concat(release) : "".concat(root, "/").concat(productCode); return _getJsonObservable(path); }, + /** + * Gets the product tombstone availability endpoint + * RxJS Observable for the specified product code and release. + * @param {string} productCode The product code to get for. + * @param {string} release A release to scope the product. + * @return The RxJS Ajax Observable + */ + getProductTombstoneAvailabilityObservable: function getProductTombstoneAvailabilityObservable(productCode, release) { + var root = _NeonEnvironment.default.getFullApiPath('products'); + var path = "".concat(root, "/").concat(productCode, "/").concat(release, "/tombstone-data-availability"); + return _getJsonObservable(path); + }, /** * Gets the product DOI endpoint RxJS Observable for the specified product code and release. * @param {string} productCode The product code to get for. diff --git a/lib/components/NeonEnvironment/NeonEnvironment.d.ts b/lib/components/NeonEnvironment/NeonEnvironment.d.ts index b30ecb32..68d7df9e 100644 --- a/lib/components/NeonEnvironment/NeonEnvironment.d.ts +++ b/lib/components/NeonEnvironment/NeonEnvironment.d.ts @@ -23,6 +23,7 @@ export interface INeonEnvironment { showAopViewer: boolean; authDisableWs: boolean; enableGlobalSignInState: boolean; + fetchDrupalAssets: boolean; getRootApiPath: () => string; getRootGraphqlPath: () => string; getRootJsonLdPath: () => string; diff --git a/lib/components/NeonEnvironment/NeonEnvironment.js b/lib/components/NeonEnvironment/NeonEnvironment.js index afad941e..c15ee194 100644 --- a/lib/components/NeonEnvironment/NeonEnvironment.js +++ b/lib/components/NeonEnvironment/NeonEnvironment.js @@ -32,7 +32,7 @@ var requiredEnvironmentVars = ['REACT_APP_NEON_PATH_API', 'REACT_APP_NEON_PATH_P // required list this makes a complete set of all environment variables // this module will ever reference. exports.requiredEnvironmentVars = requiredEnvironmentVars; -var optionalEnvironmentVars = ['REACT_APP_NEON_PATH_LD_API', 'REACT_APP_NEON_PATH_DOWNLOAD_API', 'REACT_APP_NEON_AUTH_DISABLE_WS', 'REACT_APP_NEON_USE_GRAPHQL', 'REACT_APP_NEON_SHOW_AOP_VIEWER', 'REACT_APP_NEON_VISUS_PRODUCTS_BASE_URL', 'REACT_APP_NEON_VISUS_IFRAME_BASE_URL', 'REACT_APP_NEON_API_HOST_OVERRIDE', 'REACT_APP_NEON_WEB_HOST_OVERRIDE', 'REACT_APP_NEON_WS_HOST_OVERRIDE']; +var optionalEnvironmentVars = ['REACT_APP_NEON_PATH_LD_API', 'REACT_APP_NEON_PATH_DOWNLOAD_API', 'REACT_APP_NEON_AUTH_DISABLE_WS', 'REACT_APP_NEON_USE_GRAPHQL', 'REACT_APP_NEON_SHOW_AOP_VIEWER', 'REACT_APP_NEON_VISUS_PRODUCTS_BASE_URL', 'REACT_APP_NEON_VISUS_IFRAME_BASE_URL', 'REACT_APP_NEON_API_HOST_OVERRIDE', 'REACT_APP_NEON_WEB_HOST_OVERRIDE', 'REACT_APP_NEON_WS_HOST_OVERRIDE', 'REACT_APP_NEON_FETCH_DRUPAL_ASSETS']; exports.optionalEnvironmentVars = optionalEnvironmentVars; var EnvType = { DEV: 'development', @@ -48,6 +48,7 @@ var NeonEnvironment = { showAopViewer: process.env.REACT_APP_NEON_SHOW_AOP_VIEWER === 'true', authDisableWs: process.env.REACT_APP_NEON_AUTH_DISABLE_WS === 'true', enableGlobalSignInState: process.env.REACT_APP_NEON_ENABLE_GLOBAL_SIGNIN_STATE === 'true', + fetchDrupalAssets: process.env.REACT_APP_NEON_FETCH_DRUPAL_ASSETS !== 'false', getRootApiPath: function getRootApiPath() { return process.env.REACT_APP_NEON_PATH_API || '/api/v0'; }, diff --git a/lib/components/NeonFooter/NeonFooter.d.ts b/lib/components/NeonFooter/NeonFooter.d.ts index 3519c747..0d632d84 100644 --- a/lib/components/NeonFooter/NeonFooter.d.ts +++ b/lib/components/NeonFooter/NeonFooter.d.ts @@ -3,10 +3,13 @@ declare function NeonFooter(props: any): JSX.Element; declare namespace NeonFooter { namespace propTypes { const drupalCssLoaded: PropTypes.Requireable; + const showSkeleton: PropTypes.Requireable; } namespace defaultProps { const drupalCssLoaded_1: boolean; export { drupalCssLoaded_1 as drupalCssLoaded }; + const showSkeleton_1: boolean; + export { showSkeleton_1 as showSkeleton }; } } import PropTypes from "prop-types"; diff --git a/lib/components/NeonFooter/NeonFooter.js b/lib/components/NeonFooter/NeonFooter.js index ff803cfc..2aac518b 100644 --- a/lib/components/NeonFooter/NeonFooter.js +++ b/lib/components/NeonFooter/NeonFooter.js @@ -13,6 +13,7 @@ var _Skeleton = _interopRequireDefault(require("@material-ui/lab/Skeleton")); var _remoteAssetsMap = _interopRequireDefault(require("../../remoteAssetsMap/remoteAssetsMap")); var _drupalFooter = _interopRequireDefault(require("../../remoteAssets/drupal-footer.html")); var _NeonContext = _interopRequireWildcard(require("../NeonContext/NeonContext")); +var _NeonEnvironment = _interopRequireDefault(require("../NeonEnvironment/NeonEnvironment")); var _Theme = _interopRequireDefault(require("../Theme/Theme")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } @@ -34,7 +35,8 @@ var useStyles = (0, _styles.makeStyles)(function (theme) { }; }); var NeonFooter = function NeonFooter(props) { - var drupalCssLoaded = props.drupalCssLoaded; + var drupalCssLoaded = props.drupalCssLoaded, + showSkeleton = props.showSkeleton; var classes = useStyles(_Theme.default); var _NeonContext$useNeonC = _NeonContext.default.useNeonContextState(), _NeonContext$useNeonC2 = _slicedToArray(_NeonContext$useNeonC, 1), @@ -52,12 +54,25 @@ var NeonFooter = function NeonFooter(props) { renderMode = drupalCssLoaded ? 'drupal-fallback' : 'loading'; break; default: - renderMode = 'loading'; + if (!_NeonEnvironment.default.fetchDrupalAssets) { + renderMode = 'drupal-fallback'; + } else { + renderMode = 'loading'; + } break; } } + var renderFallback = function renderFallback() { + return /*#__PURE__*/_react.default.createElement("footer", { + id: "footer", + className: classes.footerContainer + }, (0, _htmlReactParser.default)(_drupalFooter.default)); + }; switch (renderMode) { case 'loading': + if (!showSkeleton) { + return renderFallback(); + } return /*#__PURE__*/_react.default.createElement("footer", { id: "footer" }, /*#__PURE__*/_react.default.createElement(_Skeleton.default, { @@ -71,17 +86,16 @@ var NeonFooter = function NeonFooter(props) { }, (0, _htmlReactParser.default)(footerHTML)); case 'drupal-fallback': default: - return /*#__PURE__*/_react.default.createElement("footer", { - id: "footer", - className: classes.footerContainer - }, (0, _htmlReactParser.default)(_drupalFooter.default)); + return renderFallback(); } }; NeonFooter.propTypes = { - drupalCssLoaded: _propTypes.default.bool + drupalCssLoaded: _propTypes.default.bool, + showSkeleton: _propTypes.default.bool }; NeonFooter.defaultProps = { - drupalCssLoaded: false + drupalCssLoaded: false, + showSkeleton: false }; var _default = NeonFooter; exports.default = _default; \ No newline at end of file diff --git a/lib/components/NeonHeader/NeonHeader.js b/lib/components/NeonHeader/NeonHeader.js index aba416de..edcd9b7b 100644 --- a/lib/components/NeonHeader/NeonHeader.js +++ b/lib/components/NeonHeader/NeonHeader.js @@ -19,6 +19,7 @@ var _NeonEnvironment = _interopRequireDefault(require("../NeonEnvironment/NeonEn var _NeonContext = _interopRequireWildcard(require("../NeonContext/NeonContext")); var _ApplicationMenu = _interopRequireDefault(require("./ApplicationMenu")); var _headerSearch = _interopRequireDefault(require("../../images/svg/header-search.svg")); +var _headerSearchHover = _interopRequireDefault(require("../../images/svg/header-search-hover.svg")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } @@ -92,6 +93,9 @@ var useStyles = (0, _styles.makeStyles)(function (theme) { headerContainerFallback: { '& li.siteSearch > a': { background: "url('".concat(_headerSearch.default, "') center center no-repeat !important") + }, + '& li.siteSearch > a:hover': { + background: "url('".concat(_headerSearchHover.default, "') center center no-repeat !important") } }, // Injecting these styles as a means of fixing up the search display @@ -300,7 +304,8 @@ var applyAttribute = function applyAttribute(nextAttribs, attribs, attr) { }; var NeonHeader = /*#__PURE__*/(0, _react.forwardRef)(function (props, headerRef) { var drupalCssLoaded = props.drupalCssLoaded, - unstickyDrupalHeader = props.unstickyDrupalHeader; + unstickyDrupalHeader = props.unstickyDrupalHeader, + showSkeleton = props.showSkeleton; var classes = useStyles(_Theme.default); var belowLg = (0, _useMediaQuery.default)(_Theme.default.breakpoints.down('md')); var _NeonContext$useNeonC = _NeonContext.default.useNeonContextState(), @@ -331,13 +336,38 @@ var NeonHeader = /*#__PURE__*/(0, _react.forwardRef)(function (props, headerRef) renderMode = drupalCssLoaded ? 'drupal-fallback' : 'loading'; break; default: - renderMode = 'loading'; + if (!_NeonEnvironment.default.fetchDrupalAssets) { + renderMode = 'drupal-fallback'; + } else { + renderMode = 'loading'; + } break; } } // Load header.js only after initial delayed render of the drupal header is complete (0, _react.useLayoutEffect)(function () { + if (!_NeonEnvironment.default.fetchDrupalAssets) { + _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return Promise.resolve().then(function () { + return _interopRequireWildcard(require('../../remoteAssets/drupal-header.js')); + }); + case 2: + setHeaderJsStatus(_NeonContext.FETCH_STATUS.SUCCESS); + case 3: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + return; + } if (!renderMode.includes('drupal') || headerJsStatus !== _NeonContext.FETCH_STATUS.AWAITING_CALL || !headerRenderDelayed || !drupalCssLoaded) { return; } @@ -348,23 +378,25 @@ var NeonHeader = /*#__PURE__*/(0, _react.forwardRef)(function (props, headerRef) setHeaderJsStatus(_NeonContext.FETCH_STATUS.SUCCESS); }; script.onerror = function () { - _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - return _regeneratorRuntime().wrap(function _callee$(_context) { + _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + return _regeneratorRuntime().wrap(function _callee2$(_context2) { while (1) { - switch (_context.prev = _context.next) { + switch (_context2.prev = _context2.next) { case 0: - _context.next = 2; + script.remove(); + // eslint-disable-next-line no-unused-expressions, import/extensions + _context2.next = 3; return Promise.resolve().then(function () { return _interopRequireWildcard(require('../../remoteAssets/drupal-header.js')); }); - case 2: - setHeaderJsStatus(_NeonContext.FETCH_STATUS.SUCCESS); case 3: + setHeaderJsStatus(_NeonContext.FETCH_STATUS.SUCCESS); + case 4: case "end": - return _context.stop(); + return _context2.stop(); } } - }, _callee); + }, _callee2); }))(); }; document.body.appendChild(script); @@ -397,7 +429,7 @@ var NeonHeader = /*#__PURE__*/(0, _react.forwardRef)(function (props, headerRef) }, [neonContextIsActive, appliedHtmlCheck, drupalCssLoaded, headerRenderDelayed]); // Render Loading - if (renderMode === 'loading') { + if (renderMode === 'loading' && showSkeleton) { return /*#__PURE__*/_react.default.createElement("header", { ref: headerRef, id: "header", @@ -445,7 +477,7 @@ var NeonHeader = /*#__PURE__*/(0, _react.forwardRef)(function (props, headerRef) if (unstickyDrupalHeader) { appliedClassName = "".concat(classes.unstickyHeader, " ").concat(classes.headerContainer); } - if (renderMode === 'drupal-fallback') { + if (renderMode === 'drupal-fallback' || renderMode === 'loading' && !showSkeleton) { appliedClassName = "".concat(appliedClassName, " ").concat(classes.headerContainerFallback); } var html = renderMode === 'drupal' ? headerHTML : _drupalHeader.default; @@ -457,11 +489,13 @@ var NeonHeader = /*#__PURE__*/(0, _react.forwardRef)(function (props, headerRef) }); NeonHeader.propTypes = { drupalCssLoaded: _propTypes.default.bool, - unstickyDrupalHeader: _propTypes.default.bool + unstickyDrupalHeader: _propTypes.default.bool, + showSkeleton: _propTypes.default.bool }; NeonHeader.defaultProps = { drupalCssLoaded: false, - unstickyDrupalHeader: true + unstickyDrupalHeader: true, + showSkeleton: false }; var _default = NeonHeader; exports.default = _default; \ No newline at end of file diff --git a/lib/components/NeonJsonLd/NeonJsonLd.d.ts b/lib/components/NeonJsonLd/NeonJsonLd.d.ts index 0b3870c9..de4fa760 100644 --- a/lib/components/NeonJsonLd/NeonJsonLd.d.ts +++ b/lib/components/NeonJsonLd/NeonJsonLd.d.ts @@ -5,7 +5,7 @@ declare namespace NeonJsonLd { function getRepoJsonLdObservable(): import("rxjs").Observable; function getProductJsonLdObservable(productCode: string, release: string): import("rxjs").Observable; function inject(data: Object | null | undefined, injectReleaseMeta?: boolean): void; - function injectReleaseMeta(data: Object | null | undefined): void; + function injectReleaseMeta(data: Object | null | undefined, metadataUseMultiParent?: boolean | undefined): void; function removeAllMetadata(): void; function removeJsonLdScript(): void; function removeReleaseMeta(): void; diff --git a/lib/components/NeonJsonLd/NeonJsonLd.js b/lib/components/NeonJsonLd/NeonJsonLd.js index d2f42eb6..fcee9ce1 100644 --- a/lib/components/NeonJsonLd/NeonJsonLd.js +++ b/lib/components/NeonJsonLd/NeonJsonLd.js @@ -65,51 +65,50 @@ var NeonJsonLd = { * JSON-LD object. * Assumes the object is a valid JSON object. * @param {Object|null|undefined} data The JSON-LD object to inject. + * @param {boolean|undefined} metadataUseMultiParent Optionally inject multi + * parent DOIs. */ injectReleaseMeta: function injectReleaseMeta(data) { + var metadataUseMultiParent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (!data) return; try { - var currentDoiBlock = document.head.querySelector('meta[name="citation_doi"]'); - var doiUrl = new URL(data.identifier); - var doiBlock = document.createElement('meta'); - doiBlock.setAttribute('name', 'citation_doi'); - doiBlock.setAttribute('content', doiUrl.pathname.slice(1, doiUrl.pathname.length)); - if (typeof currentDoiBlock !== 'undefined' && currentDoiBlock !== null) { - document.head.replaceChild(doiBlock, currentDoiBlock); - } else { - document.head.appendChild(doiBlock); - } - var currentTitleBlock = document.head.querySelector('meta[name="citation_title"]'); - var titleBlock = document.createElement('meta'); - titleBlock.setAttribute('name', 'citation_title'); - var addTitle = false; - if (typeof data.name === 'string' && data.name.length > 0) { - if (data.name.indexOf(NeonJsonLd.CITATION_AUTHOR) >= 0) { - var titleContent = data.name.replace(NeonJsonLd.CITATION_AUTHOR, '').trim(); - titleBlock.setAttribute('content', titleContent); + var metadataObjects = []; + if (Array.isArray(data)) { + if (!metadataUseMultiParent && data.length >= 1) { + metadataObjects = [data[0]]; } else { - titleBlock.setAttribute('content', data.name); - } - addTitle = true; - } - if (!addTitle) { - if (typeof currentTitleBlock !== 'undefined' && currentTitleBlock !== null) { - currentTitleBlock.remove(); + metadataObjects = data; } - } else if (typeof currentTitleBlock !== 'undefined' && currentTitleBlock !== null) { - document.head.replaceChild(titleBlock, currentTitleBlock); } else { - document.head.appendChild(titleBlock); + metadataObjects = [data]; } - var currentAuthorBlock = document.head.querySelector('meta[name="citation_author"]'); - var authorBlock = document.createElement('meta'); - authorBlock.setAttribute('name', 'citation_author'); - authorBlock.setAttribute('content', NeonJsonLd.CITATION_AUTHOR); - if (typeof currentAuthorBlock !== 'undefined' && currentAuthorBlock !== null) { - document.head.replaceChild(authorBlock, currentAuthorBlock); - } else { + NeonJsonLd.removeReleaseMeta(); + metadataObjects.forEach(function (metadataObject) { + var doiUrl = new URL(metadataObject.identifier); + var doiBlock = document.createElement('meta'); + doiBlock.setAttribute('name', 'citation_doi'); + doiBlock.setAttribute('content', doiUrl.pathname.slice(1, doiUrl.pathname.length)); + var titleBlock = document.createElement('meta'); + titleBlock.setAttribute('name', 'citation_title'); + var addTitle = false; + if (typeof metadataObject.name === 'string' && metadataObject.name.length > 0) { + if (metadataObject.name.indexOf(NeonJsonLd.CITATION_AUTHOR) >= 0) { + var titleContent = metadataObject.name.replace(NeonJsonLd.CITATION_AUTHOR, '').trim(); + titleBlock.setAttribute('content', titleContent); + } else { + titleBlock.setAttribute('content', metadataObject.name); + } + addTitle = true; + } + var authorBlock = document.createElement('meta'); + authorBlock.setAttribute('name', 'citation_author'); + authorBlock.setAttribute('content', NeonJsonLd.CITATION_AUTHOR); + document.head.appendChild(doiBlock); + if (addTitle) { + document.head.appendChild(titleBlock); + } document.head.appendChild(authorBlock); - } + }); } catch (e) { console.error(e); // eslint-disable-line no-console } @@ -141,17 +140,23 @@ var NeonJsonLd = { */ removeReleaseMeta: function removeReleaseMeta() { try { - var currentDoiBlock = document.head.querySelector('meta[name="citation_doi"]'); - if (typeof currentDoiBlock !== 'undefined' && currentDoiBlock !== null) { - currentDoiBlock.remove(); + var currentDoiBlocks = document.head.querySelectorAll('meta[name="citation_doi"]'); + if (typeof currentDoiBlocks !== 'undefined' && currentDoiBlocks !== null) { + currentDoiBlocks.forEach(function (currentDoiBlock) { + return currentDoiBlock === null || currentDoiBlock === void 0 ? void 0 : currentDoiBlock.remove(); + }); } - var currentTitleBlock = document.head.querySelector('meta[name="citation_title"]'); - if (typeof currentTitleBlock !== 'undefined' && currentTitleBlock !== null) { - currentTitleBlock.remove(); + var currentTitleBlocks = document.head.querySelectorAll('meta[name="citation_title"]'); + if (typeof currentTitleBlocks !== 'undefined' && currentTitleBlocks !== null) { + currentTitleBlocks.forEach(function (currentTitleBlock) { + return currentTitleBlock === null || currentTitleBlock === void 0 ? void 0 : currentTitleBlock.remove(); + }); } - var currentAuthorBlock = document.head.querySelector('meta[name="citation_author"]'); - if (typeof currentAuthorBlock !== 'undefined' && currentAuthorBlock !== null) { - currentAuthorBlock.remove(); + var currentAuthorBlocks = document.head.querySelectorAll('meta[name="citation_author"]'); + if (typeof currentAuthorBlocks !== 'undefined' && currentAuthorBlocks !== null) { + currentAuthorBlocks.forEach(function (currentAuthorBlock) { + return currentAuthorBlock === null || currentAuthorBlock === void 0 ? void 0 : currentAuthorBlock.remove(); + }); } } catch (e) { console.error(e); // eslint-disable-line no-console diff --git a/lib/components/NeonPage/NeonPage.d.ts b/lib/components/NeonPage/NeonPage.d.ts index 4ea0a6e3..fc23366c 100644 --- a/lib/components/NeonPage/NeonPage.d.ts +++ b/lib/components/NeonPage/NeonPage.d.ts @@ -20,6 +20,8 @@ declare namespace NeonPage { }> | null | undefined)[]>; export const customHeader: PropTypes.Requireable; export const customFooter: PropTypes.Requireable; + export const showHeaderSkeleton: PropTypes.Requireable; + export const showFooterSkeleton: PropTypes.Requireable; const error_1: PropTypes.Requireable; export { error_1 as error }; export const loading: PropTypes.Requireable; @@ -64,6 +66,10 @@ declare namespace NeonPage { export { customHeader_1 as customHeader }; const customFooter_1: null; export { customFooter_1 as customFooter }; + const showHeaderSkeleton_1: boolean; + export { showHeaderSkeleton_1 as showHeaderSkeleton }; + const showFooterSkeleton_1: boolean; + export { showFooterSkeleton_1 as showFooterSkeleton }; const error_2: null; export { error_2 as error }; const loading_1: null; diff --git a/lib/components/NeonPage/NeonPage.js b/lib/components/NeonPage/NeonPage.js index f130fda2..271ffa08 100644 --- a/lib/components/NeonPage/NeonPage.js +++ b/lib/components/NeonPage/NeonPage.js @@ -35,21 +35,20 @@ var _remoteAssetsMap = _interopRequireDefault(require("../../remoteAssetsMap/rem var _Theme = _interopRequireWildcard(require("../Theme/Theme")); var _NeonHeader = _interopRequireDefault(require("../NeonHeader/NeonHeader")); var _NeonFooter = _interopRequireDefault(require("../NeonFooter/NeonFooter")); +var _NeonEnvironment = _interopRequireDefault(require("../NeonEnvironment/NeonEnvironment")); var _NeonContext = _interopRequireWildcard(require("../NeonContext/NeonContext")); var _BrowserWarning = _interopRequireDefault(require("./BrowserWarning")); var _LiferayNotifications = _interopRequireDefault(require("./LiferayNotifications")); +var _DrupalAssetService = _interopRequireDefault(require("../../service/DrupalAssetService")); var _rxUtil = require("../../util/rxUtil"); var _liferayNotificationsUtil = require("../../util/liferayNotificationsUtil"); var _NSFNEONLogo = _interopRequireDefault(require("../../images/NSF-NEON-logo.png")); require("./styles.css"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } -function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, catch: function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } @@ -340,6 +339,8 @@ var NeonPage = function NeonPage(props) { breadcrumbs = props.breadcrumbs, customHeader = props.customHeader, customFooter = props.customFooter, + showHeaderSkeleton = props.showHeaderSkeleton, + showFooterSkeleton = props.showFooterSkeleton, error = props.error, loading = props.loading, notification = props.notification, @@ -383,7 +384,7 @@ var NeonPage = function NeonPage(props) { setOverlayDismissed = _useState2[1]; // Boolean - whether any Drupal assets are used; only false if both header and footer are custom - var useSomeDrupalAssets = !(customHeader && customFooter); + var useSomeDrupalAssets = _NeonEnvironment.default.fetchDrupalAssets && !(customHeader && customFooter); /** Continue Sidebar Setup @@ -499,44 +500,38 @@ var NeonPage = function NeonPage(props) { setDrupalCssStatus = _useState10[1]; (0, _react.useEffect)(function () { if (!useSomeDrupalAssets) { + setDrupalCssStatus(_NeonContext.FETCH_STATUS.SUCCESS); return; } if (drupalCssStatus !== _NeonContext.FETCH_STATUS.AWAITING_CALL) { return; } setDrupalCssStatus(_NeonContext.FETCH_STATUS.FETCHING); - var link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = _remoteAssetsMap.default[DRUPAL_THEME_CSS].url; - link.crossOrigin = 'anonymous'; - link.onload = function () { + fetch(_remoteAssetsMap.default[DRUPAL_THEME_CSS].url).then(function (response) { + if (!response.ok) { + throw new Error('Failed to fetch Drupal theme CSS'); + } + return response.text(); + }).then(function (data) { + var drupalStyle = document.createElement('style'); + var appliedData = _DrupalAssetService.default.cleanCss(data, true); + drupalStyle.textContent = appliedData; + document.head.appendChild(drupalStyle); + try { + var existingBlock = document.head.querySelector('link[data-meta="drupal-theme"]'); + if (typeof existingBlock !== 'undefined' && existingBlock !== null) { + existingBlock.remove(); + } + } catch (e) { + console.error(e); // eslint-disable-line no-console + } + setDrupalCssStatus(_NeonContext.FETCH_STATUS.SUCCESS); - }; - link.onerror = function () { - _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return Promise.resolve().then(function () { - return _interopRequireWildcard(require('../../remoteAssets/drupal-theme.css')); - }); - case 2: - // Assume this local import worked and still report the load as successful - // We do this because props on header and footer express whether the CSS is - // loaded and we want to simplify that as a boolean. The header and footer - // don't care where the CSS came from so long as it's there. - setDrupalCssStatus(_NeonContext.FETCH_STATUS.SUCCESS); - case 3: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - }; - document.body.appendChild(link); + }).catch(function (err) { + // eslint-disable-next-line no-console + console.error(err); + setDrupalCssStatus(_NeonContext.FETCH_STATUS.SUCCESS); + }); }, [useSomeDrupalAssets, drupalCssStatus, setDrupalCssStatus]); /** @@ -859,7 +854,8 @@ var NeonPage = function NeonPage(props) { unstickyDrupalHeader: unstickyDrupalHeader, notifications: notifications, onShowNotifications: handleShowNotifications, - drupalCssLoaded: drupalCssStatus === _NeonContext.FETCH_STATUS.SUCCESS + drupalCssLoaded: drupalCssStatus === _NeonContext.FETCH_STATUS.SUCCESS, + showSkeleton: showHeaderSkeleton }), /*#__PURE__*/_react.default.createElement(_Container.default, { className: classes.outerPageContainer, style: outerPageContainerStyles @@ -874,7 +870,8 @@ var NeonPage = function NeonPage(props) { notifications: notifications, onHideNotifications: handleHideNotifications }), /*#__PURE__*/_react.default.createElement(_BrowserWarning.default, null), customFooter ? /*#__PURE__*/_react.default.createElement("footer", null, customFooter) : /*#__PURE__*/_react.default.createElement(_NeonFooter.default, { - drupalCssLoaded: drupalCssStatus === _NeonContext.FETCH_STATUS.SUCCESS + drupalCssLoaded: drupalCssStatus === _NeonContext.FETCH_STATUS.SUCCESS, + showSkeleton: showFooterSkeleton }), renderLoading(), renderError()); }; var renderedPage = neonContextIsActive ? renderNeonPage() : /*#__PURE__*/_react.default.createElement(_NeonContext.default.Provider, _extends({ @@ -895,6 +892,8 @@ NeonPage.propTypes = { })), customHeader: _propTypes.default.node, customFooter: _propTypes.default.node, + showHeaderSkeleton: _propTypes.default.bool, + showFooterSkeleton: _propTypes.default.bool, error: _propTypes.default.string, loading: _propTypes.default.string, notification: _propTypes.default.string, @@ -927,6 +926,8 @@ NeonPage.defaultProps = { breadcrumbs: [], customHeader: null, customFooter: null, + showHeaderSkeleton: false, + showFooterSkeleton: false, error: null, loading: null, notification: null, diff --git a/lib/components/Theme/Theme.js b/lib/components/Theme/Theme.js index 0aa75ed8..c31738bf 100644 --- a/lib/components/Theme/Theme.js +++ b/lib/components/Theme/Theme.js @@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = exports.COLORS = void 0; var _react = _interopRequireDefault(require("react")); -require("@fontsource/inter/latin.css"); var _CssBaseline = _interopRequireDefault(require("@material-ui/core/CssBaseline")); var _styles = require("@material-ui/styles"); var _styles2 = require("@material-ui/core/styles"); diff --git a/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.d.ts b/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.d.ts index 2d1a1024..5e701c96 100644 --- a/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.d.ts +++ b/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.d.ts @@ -86,6 +86,7 @@ export namespace DEFAULT_STATE { export { continuousDateRange_1 as continuousDateRange }; const variables_1: never[]; export { variables_1 as variables }; + export const derivedVariableTable: {}; export const dateTimeVariable: null; const sites_1: never[]; export { sites_1 as sites }; @@ -119,41 +120,49 @@ export namespace DEFAULT_STATE { export const TIME_STEPS: { '1min': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; '2min': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; '5min': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; '15min': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; '30min': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; '60min': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; '0AQ': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; '1day': { key: string; + matchFileTableSuffix: string[]; tmi: string; seconds: number; }; @@ -217,6 +226,7 @@ export function getTestableItems(): { dateRange: null[]; continuousDateRange: never[]; variables: never[]; + derivedVariableTable: {}; dateTimeVariable: null; sites: never[]; timeStep: string; @@ -376,6 +386,7 @@ declare function useTimeSeriesViewerState(): { dateRange: null[]; continuousDateRange: never[]; variables: never[]; + derivedVariableTable: {}; dateTimeVariable: null; sites: never[]; timeStep: string; @@ -447,6 +458,7 @@ declare function useTimeSeriesViewerState(): { dateRange: null[]; continuousDateRange: never[]; variables: never[]; + derivedVariableTable: {}; dateTimeVariable: null; sites: never[]; timeStep: string; diff --git a/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.js b/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.js index c4bbf711..adecc926 100644 --- a/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.js +++ b/lib/components/TimeSeriesViewer/TimeSeriesViewerContext.js @@ -8,7 +8,7 @@ exports.summarizeTimeSteps = exports.getTestableItems = exports.default = export var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireWildcard(require("prop-types")); var _moment = _interopRequireDefault(require("moment")); -var _get2 = _interopRequireDefault(require("lodash/get")); +var _get = _interopRequireDefault(require("lodash/get")); var _uniqueId = _interopRequireDefault(require("lodash/uniqueId")); var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep")); var _papaparse = require("papaparse"); @@ -187,6 +187,7 @@ var DEFAULT_STATE = { dateRange: [null, null], continuousDateRange: [], variables: [], + derivedVariableTable: {}, dateTimeVariable: null, sites: [], timeStep: 'auto', @@ -222,41 +223,49 @@ var useTimeSeriesViewerState = function useTimeSeriesViewerState() { var TIME_STEPS = { '1min': { key: '1min', + matchFileTableSuffix: ['1min', '1_min', '1minute', '1_minute'], tmi: '001', seconds: 60 }, '2min': { key: '2min', + matchFileTableSuffix: ['2min', '2_min', '2minute', '2_minute', '2minutes', '2_minutes'], tmi: '002', seconds: 120 }, '5min': { key: '5min', + matchFileTableSuffix: ['5min', '5_min', '5minute', '5_minute', '5minutes', '5_minutes'], tmi: '005', seconds: 300 }, '15min': { key: '15min', + matchFileTableSuffix: ['15min', '15_min', '15minute', '15_minute', '15minutes', '15_minutes'], tmi: '015', seconds: 900 }, '30min': { key: '30min', + matchFileTableSuffix: ['30min', '30_min', '30minute', '30_minute', '30minutes', '30_minutes'], tmi: '030', seconds: 1800 }, '60min': { key: '60min', + matchFileTableSuffix: ['60min', '60_min', '60minute', '60_minute', '60minutes', '60_minutes'], tmi: '060', seconds: 3600 }, '0AQ': { key: '0AQ', + matchFileTableSuffix: ['0AQ', '0_AQ'], tmi: '100', seconds: 60 }, '1day': { key: '1day', + matchFileTableSuffix: ['1day', '1_day'], tmi: '01D', seconds: 86400 } @@ -268,11 +277,19 @@ var getTimeStep = function getTimeStep() { return TIME_STEPS[key].tmi === input; }) || null; }; +var matchTimeStepForTableName = function matchTimeStepForTableName(key) { + var tableName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var allowDefaultFallthrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + return tableName.endsWith("_".concat(key)) || TIME_STEPS[key].matchFileTableSuffix.some(function (suffix) { + return tableName.endsWith("_".concat(suffix)); + }) || allowDefaultFallthrough; +}; var getTimeStepForTableName = function getTimeStepForTableName() { var tableName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var useDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return Object.keys(TIME_STEPS).find(function (key) { - return tableName.endsWith("_".concat(key)); - }) || null; + return matchTimeStepForTableName(key, tableName); + }) || (useDefault ? 'default' : null); }; var summarizeTimeSteps = function summarizeTimeSteps(steps) { var timeStep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; @@ -318,6 +335,14 @@ var DATA_FILE_PARTS = { }); } }, + TABLE: { + offset: 9, + isValid: function isValid(p) { + return /^[\w]+$/.test(p) && Object.keys(TIME_STEPS).some(function (key) { + return matchTimeStepForTableName(key, p, true); + }); + } + }, MONTH: { offset: 10, isValid: function isValid(p) { @@ -517,6 +542,7 @@ var parseSiteMonthData = function parseSiteMonthData(site, files) { var month = parts[DATA_FILE_PARTS.MONTH.offset]; var packageType = parts[DATA_FILE_PARTS.PACKAGE_TYPE.offset]; var timeStep = getTimeStep(parts[DATA_FILE_PARTS.TIME_STEP.offset]); + var tableName = parts[DATA_FILE_PARTS.TABLE.offset]; // Timestep must be valid if (timeStep === null) { return; @@ -535,7 +561,10 @@ var parseSiteMonthData = function parseSiteMonthData(site, files) { if (!newSite.positions[position].data[month][packageType]) { newSite.positions[position].data[month][packageType] = {}; } - newSite.positions[position].data[month][packageType][timeStep] = { + if (!newSite.positions[position].data[month][packageType][timeStep]) { + newSite.positions[position].data[month][packageType][timeStep] = {}; + } + newSite.positions[position].data[month][packageType][timeStep][tableName] = { url: url, status: FETCH_STATUS.AWAITING_CALL, error: null, @@ -589,7 +618,7 @@ var parseSiteVariables = function parseSiteVariables(previousVariables, siteCode dataType = variable.dataType, units = variable.units, downloadPkg = variable.downloadPkg; - var timeStep = getTimeStepForTableName(table); + var timeStep = getTimeStepForTableName(table, true); var isSelectable = variable.dataType !== 'dateTime' && variable.units !== 'NA' && !/QF$/.test(fieldName); var canBeDefault = isSelectable && variable.downloadPkg !== 'expanded' && !/QM$/.test(fieldName); variablesSet.add(fieldName); @@ -707,6 +736,8 @@ var applyDefaultsToSelection = function applyDefaultsToSelection(state) { selection.sites[idx].positions.push(positions[0]); }); // Variables + selection.derivedVariableTable = {}; + var foundVarWithData = false; var hasVariablesSelected = Array.isArray(selection.variables) && selection.variables.length > 0; if (Object.keys(variables).length) { // Ensure the selection has at least one variable @@ -770,10 +801,32 @@ var applyDefaultsToSelection = function applyDefaultsToSelection(state) { positions = site.positions; positions.forEach(function (position) { selection.continuousDateRange.forEach(function (month) { - var series = lodashGet(product.sites[siteCode].positions[position], "data['".concat(month, "']['").concat(pkg, "']['").concat(dataTimeStep, "'].series['").concat(variable, "']")); + if (!variables[variable].tables) { + return; + } + var timeStepTables = lodashGet(product.sites[siteCode].positions[position], "data['".concat(month, "']['").concat(pkg, "']['").concat(dataTimeStep, "']"), {}); + // Attempt to find a table with data for the specified + // variable (associated tables) and time step + var tableWithSeries = Array.from(variables[variable].tables).find(function (table) { + var timeStepTable = timeStepTables[table]; + var variableTableTimeStep = getTimeStepForTableName(table, true); + if (timeStepTable && timeStepTable.series) { + if (variableTableTimeStep && variableTableTimeStep.localeCompare(dataTimeStep) === 0) { + var checkSeries = timeStepTable.series[variable]; + return checkSeries && checkSeries.count; + } + if (variableTableTimeStep === 'default') { + return true; + } + } + return false; + }); + var series = tableWithSeries ? timeStepTables[tableWithSeries].series[variable] : null; if (!series || !series.count) { return; } + foundVarWithData = true; + selection.derivedVariableTable[variable] = tableWithSeries; combinedSum += series.sum; combinedCount += series.count; monthCounts.push(series.count); @@ -807,20 +860,27 @@ var applyDefaultsToSelection = function applyDefaultsToSelection(state) { // We'll recurse through the variables available for the site/month/position until we find one // that works or show a meaningful error instructing the user to select a different site, // month, or position. - if (status === _constants.TIME_SERIES_VIEWER_STATUS.READY_FOR_SERIES && !hasVariablesSelected && selection.variables.length && selection.yAxes.y1.dataRange.every(function (x) { + if (status === _constants.TIME_SERIES_VIEWER_STATUS.READY_FOR_SERIES && (!hasVariablesSelected || !foundVarWithData && selection.isDefault) && selection.variables.length && selection.yAxes.y1.dataRange.every(function (x) { return x === null; })) { - invalidDefaultVariables.add(selection.variables[0]); - selection.variables = []; - return applyDefaultsToSelection(_extends({}, state, { - selection: selection - }), invalidDefaultVariables); + var allowedDefaultVars = Object.keys(variables).filter(function (v) { + return variables[v].canBeDefault; + }); + if (allowedDefaultVars.length > invalidDefaultVariables.size) { + invalidDefaultVariables.add(selection.variables[0]); + selection.variables = []; + return applyDefaultsToSelection(_extends({}, state, { + selection: selection + }), invalidDefaultVariables); + } } // Generate a new digest for effect comparison selection.digest = JSON.stringify({ sites: selection.sites, dateRange: selection.dateRange, - variables: selection.variables + variables: selection.variables, + qualityFlags: selection.qualityFlags, + timeStep: selection.timeStep }); return selection; }; @@ -850,11 +910,14 @@ var setDataFileFetchStatuses = function setDataFileFetchStatuses(state, fetches) position = fetch.position, month = fetch.month, downloadPkg = fetch.downloadPkg, - timeStep = fetch.timeStep; - if (!newState.product || !newState.product.sites || !newState.product.sites[siteCode] || !newState.product.sites[siteCode].positions || !newState.product.sites[siteCode].positions[position] || !newState.product.sites[siteCode].positions[position].data || !newState.product.sites[siteCode].positions[position].data[month] || !newState.product.sites[siteCode].positions[position].data[month][downloadPkg] || !newState.product.sites[siteCode].positions[position].data[month][downloadPkg][timeStep]) { + timeStep = fetch.timeStep, + table = fetch.table; + if (!newState.product || !newState.product.sites || !newState.product.sites[siteCode] || !newState.product.sites[siteCode].positions || !newState.product.sites[siteCode].positions[position] || !newState.product.sites[siteCode].positions[position].data || !newState.product.sites[siteCode].positions[position].data[month] || !newState.product.sites[siteCode].positions[position].data[month][downloadPkg] || !newState.product.sites[siteCode].positions[position].data[month][downloadPkg][timeStep] + // eslint-disable-next-line max-len + || !newState.product.sites[siteCode].positions[position].data[month][downloadPkg][timeStep][table]) { return; } - newState.product.sites[siteCode].positions[position].data[month][downloadPkg][timeStep].status = FETCH_STATUS.FETCHING; + newState.product.sites[siteCode].positions[position].data[month][downloadPkg][timeStep][table].status = FETCH_STATUS.FETCHING; }); return newState; }; @@ -1097,12 +1160,12 @@ var reducer = function reducer(state, action) { // Fetch Data Actions (Single File) case 'fetchDataFileFailed': - newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep].status = FETCH_STATUS.ERROR; - newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep].error = action.error; + newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep][action.table].status = FETCH_STATUS.ERROR; + newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep][action.table].error = action.error; return newState; case 'fetchDataFileSucceeded': - newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep].status = FETCH_STATUS.SUCCESS; - newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep].series = action.series; + newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep][action.table].status = FETCH_STATUS.SUCCESS; + newState.product.sites[action.siteCode].positions[action.position].data[action.month][action.downloadPkg][action.timeStep][action.table].series = action.series; return newState; // Core Selection Actions @@ -1191,11 +1254,13 @@ var reducer = function reducer(state, action) { case 'selectAllQualityFlags': newState.selection.isDefault = false; newState.selection.qualityFlags = Array.from(state.availableQualityFlags); + calcSelection(); calcStatus(); return newState; case 'selectNoneQualityFlags': newState.selection.isDefault = false; newState.selection.qualityFlags = []; + calcSelection(); calcStatus(); return newState; case 'selectToggleQualityFlag': @@ -1207,6 +1272,7 @@ var reducer = function reducer(state, action) { return qf !== action.qualityFlag; }); } + calcSelection(); calcStatus(); return newState; case 'selectTimeStep': @@ -1215,6 +1281,7 @@ var reducer = function reducer(state, action) { return state; } newState.selection.timeStep = action.timeStep; + calcSelection(); calcStatus(); return newState; case 'selectAddSite': @@ -1599,51 +1666,56 @@ var Provider = function Provider(props) { var downloadPkg = state.variables[variable].downloadPkg; positions.forEach(function (position) { continuousDateRange.forEach(function (month) { - var actionProps = { - siteCode: siteCode, - position: position, - month: month, - downloadPkg: downloadPkg, - timeStep: timeStep - }; // eslint-disable-next-line max-len var path = "sites['".concat(siteCode, "'].positions['").concat(position, "'].data['").concat(month, "']['").concat(downloadPkg, "']['").concat(timeStep, "']"); - var _get = (0, _get2.default)(state.product, path, {}), - url = _get.url, - status = _get.status; - // If the file isn't awaiting a fetch call then don't fetch it - if (!url || status !== FETCH_STATUS.AWAITING_CALL) { - return; - } - // Use the dataFetchTokens set to make sure we don't somehow add the same fetch twice - var previousSize = dataFetchTokens.size; - var token = "".concat(siteCode, ";").concat(position, ";").concat(month, ";").concat(downloadPkg, ";").concat(timeStep); - dataFetchTokens.add(token); - if (dataFetchTokens.size === previousSize) { - return; - } - // Save the action props to pass to the fetchDataFiles action to set all fetch statuses - dataActions.push(actionProps); - // Add a file fetch observable to the main list - dataFetches.push(fetchCSV(url).pipe((0, _rxjs.map)(function (response) { - return response.response; - }), (0, _rxjs.switchMap)(function (csv) { - return (0, _parseTimeSeriesData.default)({ - csv: csv, - variables: state.variables - }).then(function (series) { + var timeStepTables = (0, _get.default)(state.product, path, {}); + Object.keys(timeStepTables).forEach(function (tableName) { + var timeStepTable = timeStepTables[tableName]; + var url = timeStepTable.url, + status = timeStepTable.status; + // If the file isn't awaiting a fetch call then don't fetch it + if (!url || status !== FETCH_STATUS.AWAITING_CALL) { + return; + } + // Use the dataFetchTokens set to make sure we don't somehow add the same fetch twice + var previousSize = dataFetchTokens.size; + var token = "".concat(siteCode, ";").concat(position, ";").concat(month, ";").concat(downloadPkg, ";").concat(timeStep, ";").concat(tableName); + dataFetchTokens.add(token); + if (dataFetchTokens.size === previousSize) { + return; + } + // Save the action props to pass to the fetchDataFiles + // action to set all fetch statuses + var actionProps = { + siteCode: siteCode, + position: position, + month: month, + downloadPkg: downloadPkg, + timeStep: timeStep, + table: tableName + }; + dataActions.push(actionProps); + // Add a file fetch observable to the main list + dataFetches.push(fetchCSV(url).pipe((0, _rxjs.map)(function (response) { + return response.response; + }), (0, _rxjs.switchMap)(function (csv) { + return (0, _parseTimeSeriesData.default)({ + csv: csv, + variables: state.variables + }).then(function (series) { + dispatch(_extends({ + type: 'fetchDataFileSucceeded', + series: series + }, actionProps)); + }); + }), (0, _rxjs.catchError)(function (error) { dispatch(_extends({ - type: 'fetchDataFileSucceeded', - series: series + type: 'fetchDataFileFailed', + error: error.message }, actionProps)); - }); - }), (0, _rxjs.catchError)(function (error) { - dispatch(_extends({ - type: 'fetchDataFileFailed', - error: error.message - }, actionProps)); - return (0, _rxjs.of)(false); - }))); + return (0, _rxjs.of)(false); + }))); + }); }); }); }); diff --git a/lib/components/TimeSeriesViewer/TimeSeriesViewerGraph.js b/lib/components/TimeSeriesViewer/TimeSeriesViewerGraph.js index c669be24..4d6db751 100644 --- a/lib/components/TimeSeriesViewer/TimeSeriesViewerGraph.js +++ b/lib/components/TimeSeriesViewer/TimeSeriesViewerGraph.js @@ -467,7 +467,7 @@ function TimeSeriesViewerGraph() { for (var c = 2; c < row.length; c += 1) { if (!graphState.hiddenQualityFlags.has(qualityLabels[c])) { if (row[c] && row[c].some(function (v) { - return v !== 0; + return v !== 0 && v !== null; })) { canvas.fillStyle = QUALITY_COLORS[(c - 2) % 12]; // eslint-disable-line no-param-reassign, max-len canvas.fillRect(startX, y, endX - startX, h); diff --git a/lib/images/svg/header-search-hover.svg b/lib/images/svg/header-search-hover.svg new file mode 100644 index 00000000..3d021382 --- /dev/null +++ b/lib/images/svg/header-search-hover.svg @@ -0,0 +1,5 @@ + + + diff --git a/lib/parser/BundleParser.js b/lib/parser/BundleParser.js index 362c7fdb..860d1a25 100644 --- a/lib/parser/BundleParser.js +++ b/lib/parser/BundleParser.js @@ -52,9 +52,21 @@ var BundleParser = { bundleProducts[bundleProductCode].push(productCode); if (!(0, _typeUtil.exists)(isPrimaryBundle)) { doiLookup[productCode] = bundleProductCode; - } else if (isPrimaryBundle === true) { + } else { // Type check guard for positive boolean value, not non falsey - doiLookup[productCode] = bundleProductCode; + var primary = isPrimaryBundle === true; + var bundleParents = []; + if ((0, _typeUtil.exists)(doiLookup[productCode]) && Array.isArray(doiLookup[productCode])) { + bundleParents = doiLookup[productCode]; + if (primary) { + bundleParents.unshift(bundleProductCode); + } else { + bundleParents.push(bundleProductCode); + } + } else { + bundleParents.push(bundleProductCode); + } + doiLookup[productCode] = bundleParents; } // Indicate we've seen this product in more than one bundle // Must contain a previous entry that's set to false. diff --git a/lib/remoteAssets/drupal-header.html.d.ts b/lib/remoteAssets/drupal-header.html.d.ts index ec7b8a1a..ea8a8357 100644 --- a/lib/remoteAssets/drupal-header.html.d.ts +++ b/lib/remoteAssets/drupal-header.html.d.ts @@ -1,2 +1,2 @@ -declare const _default: "\n
\n
\n \n \n \n
\n \n\n
\n
\n
\n
\n \n \n \n\n\n \n\n
\n
\n \n
\n
\n

Search

\n \n\n
\n \n \n
\n
\n \n\n \n
\n
\n\n\n
\n\n
\n\n
\n\n
\n \n\n
\n
\n
\n
\n
\n\n\n"; +declare const _default: "\n
\n
\n \n \n \n
\n \n\n
\n
\n
\n
\n \n \n \n\n\n \n\n
\n
\n \n
\n
\n

Search

\n \n\n
\n \n \n
\n
\n \n\n \n
\n
\n\n\n
\n\n
\n\n
\n\n
\n \n\n
\n
\n
\n
\n
\n\n\n"; export default _default; diff --git a/lib/remoteAssets/drupal-header.html.js b/lib/remoteAssets/drupal-header.html.js index e6fb9e02..18858cf1 100644 --- a/lib/remoteAssets/drupal-header.html.js +++ b/lib/remoteAssets/drupal-header.html.js @@ -5,5 +5,5 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var html; -var _default = html = "\n
\n
\n \n \n \n
\n \n\n
\n
\n
\n
\n \n \n \n\n\n \n\n
\n
\n \n
\n
\n

Search

\n \n\n
\n \n \n
\n
\n \n\n \n
\n
\n\n\n
\n\n
\n\n
\n\n
\n \n\n
\n
\n
\n
\n
\n\n\n"; +var _default = html = "\n
\n
\n \n \n \n
\n \n\n
\n
\n
\n
\n \n \n \n\n\n \n\n
\n
\n \n
\n
\n

Search

\n \n\n
\n \n \n
\n
\n \n\n \n
\n
\n\n\n
\n\n
\n\n
\n\n
\n \n\n
\n
\n
\n
\n
\n\n\n"; exports.default = _default; \ No newline at end of file diff --git a/lib/remoteAssets/drupal-theme.css b/lib/remoteAssets/drupal-theme.css deleted file mode 100644 index 2ee26824..00000000 --- a/lib/remoteAssets/drupal-theme.css +++ /dev/null @@ -1,6533 +0,0 @@ -@charset "UTF-8"; -/** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ -/*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/** - * Settings - Breakpoints - * - 01 - Mapping - */ -/*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. -\*------------------------------------*/ -/** - * Settings - Breakpoints - * - 01 - Mapping - */ -/*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. -\*------------------------------------*/ -/** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ -/*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ -/*------------------------------------*\ - 01 - Imports -\*------------------------------------*/ -/*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/** - * Settings - Breakpoints - * - 01 - Mapping - */ -/*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. -\*------------------------------------*/ -/** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ -/*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ -/*------------------------------------*\ - 01 - Imports -\*------------------------------------*/ -/*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -/*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss -\*------------------------------------*/ -#header, #footer { - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #141516; - font-family: "Inter", sans-serif; - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * @file - * Utility classes to hide elements in different ways. - */ - /** - * Hide elements from all users. - * - * Used for elements which should not be immediately displayed to any user. An - * example would be collapsible details that will be expanded with a click - * from a user. The effect of this class can be toggled with the jQuery show() - * and hide() functions. - */ - /** - * Hide elements visually, but keep them available for screen readers. - * - * Used for information required for screen reader users to understand and use - * the site where visual display is undesirable. Information provided in this - * manner should be kept concise, to avoid unnecessary burden on the user. - * "!important" is used to prevent unintentional overrides. - */ - /** - * The .focusable class extends the .visually-hidden class to allow - * the element to be focusable when navigated to via the keyboard. - */ - /** - * Hide visually and from screen readers, but maintain layout. - */ - /** - * Global - Base - * Basic HTML tag styles and theme definitions. - * - * - 01 - Imports - * - 02 - Document - * - 03 - Headings - * - 04 - Copy - * - 05 - Lists - * - 06 - Links - * - 07 - Elements - * - 08 - Media - * - 09 - Admin - * - 10 - Jump Menu - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Document - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Headings - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Copy - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Lists - \*------------------------------------*/ - /*------------------------------------*\ - 06 - Links - \*------------------------------------*/ - /*------------------------------------*\ - 07 - Elements - \*------------------------------------*/ - /*------------------------------------*\ - 08 - Media - \*------------------------------------*/ - /*------------------------------------*\ - 09 - Admin - \*------------------------------------*/ - /*------------------------------------*\ - 10 - Jump Menu - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Settings - Breakpoints - * - 01 - Mapping - */ - /*------------------------------------*\ - 01 - Mapping - Default mapping of grid breakpoints, which is used in the function and mixin breakpoint files. An example of using - breakpoints in a file is by using the mixin with the name of a breakpoint: `@include bp-min(small) {}`. - - These breakpoints may be altered depending on the theme needs. - \*------------------------------------*/ - /** - * Functions - Breakpoints - * Breakpoint viewport sizes and media queries. Breakpoints are defined as a map of (name: minimum width), order from - * xsmall to xlarge: (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px). The map defined in the `$grid-breakpoints` - * global variable is used as the `$breakpoints` argument by default. - * - * - 01 - Breakpoint Next - * - 02 - Breakpoint Minimum - * - 03 - Breakpoint Maximum - * - 04 - Breakpoint Infix - */ - /*------------------------------------*\ - 01 - Breakpoint Next - Name of the next breakpoint, or null for the last breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - - @param $breakpoint-names: Breakpoints mapping names as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Breakpoint Minimum - Minimum breakpoint width. Null for the smallest (first) breakpoint. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Breakpoint Maximum - The maximum value is reduced by 0.02px to work around the limitations of `min-` and `max-` prefixes and viewports - with fractional widths. See https://www.w3.org/TR/mediaqueries-4/#mq-min-max. Uses 0.02px rather than 0.01px to work - around a current rounding bug in Safari. See https://bugs.webkit.org/show_bug.cgi?id=178261 - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Breakpoint Infix - Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. Useful for making - responsive utilities. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /** - * Mixins - Breakpoints - * Use these mixins mainly when defining media breakpoint specifications in theme files. Both settings and functions - * are imported here to supplement the mixins themselves. - * - * - 01 - Imports - * - 02 - Minimum Breakpoint - * - 03 - Maximum Breakpoint - * - 04 - Between Breakpoint - * - 05 - Only Breakpoint - */ - /*------------------------------------*\ - 01 - Imports - \*------------------------------------*/ - /*------------------------------------*\ - 02 - Minimum Breakpoint - Media/screen-size of at least the minimum breakpoint width -- apply to screen-sizes above the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 03 - Maximum Breakpoint - Media/screen-size of at most the maximum breakpoint width -- apply to screen-sizes below the breakpoint specified. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 04 - Between Breakpoint - Media/screen-size that spans multiple breakpoint widths -- apply to screen-sizes between the breakpoints specified. - - @param $lower: Selected minimum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $upper: Selected maximum breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ - /*------------------------------------*\ - 05 - Only Breakpoint - Media/screen-size between the breakpoint's minimum and maximum widths -- No minimum for the smallest breakpoint, and - no maximum for the largest one. - - @param $name: Selected breakpoint name as defined in partials/settings/_breakpoints.scss - - @param $breakpoints: Breakpoints mapping values as defined in partials/settings/_breakpoints.scss - \*------------------------------------*/ -} -#header html, #footer html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -#header body, #footer body { - margin: 0; -} -#header article, -#header aside, -#header details, -#header figcaption, -#header figure, -#header footer, -#header header, -#header hgroup, -#header main, -#header nav, -#header section, -#header summary, #footer article, -#footer aside, -#footer details, -#footer figcaption, -#footer figure, -#footer footer, -#footer header, -#footer hgroup, -#footer main, -#footer nav, -#footer section, -#footer summary { - display: block; -} -#header audio, -#header canvas, -#header progress, -#header video, #footer audio, -#footer canvas, -#footer progress, -#footer video { - display: inline-block; - vertical-align: baseline; -} -#header audio:not([controls]), #footer audio:not([controls]) { - display: none; - height: 0; -} -#header [hidden], -#header template, #footer [hidden], -#footer template { - display: none; -} -#header a, #footer a { - background: transparent; -} -#header a:active, -#header a:hover, #footer a:active, -#footer a:hover { - outline: 0; -} -#header abbr[title], #footer abbr[title] { - border-bottom: 1px dotted; -} -#header b, -#header strong, #footer b, -#footer strong { - font-weight: bold; -} -#header dfn, #footer dfn { - font-style: italic; -} -#header mark, #footer mark { - background: #ff0; - color: #000; -} -#header small, #footer small { - font-size: 80%; -} -#header sub, -#header sup, #footer sub, -#footer sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -#header sup, #footer sup { - top: -0.5em; -} -#header sub, #footer sub { - bottom: -0.25em; -} -#header img, #footer img { - border: 0; -} -#header svg:not(:root), #footer svg:not(:root) { - overflow: hidden; -} -#header hr, #footer hr { - box-sizing: border-box; - height: 0; -} -#header pre, #footer pre { - overflow: auto; - white-space: pre-wrap; - word-break: break-all; -} -#header code, -#header kbd, -#header pre, -#header samp, #footer code, -#footer kbd, -#footer pre, -#footer samp { - font-family: monospace, monospace; -} -#header table, #footer table { - border-collapse: collapse; - border-spacing: 0; -} -#header td, -#header th, #footer td, -#footer th { - padding: 0; -} -#header .hidden, #footer .hidden { - display: none; -} -#header .visually-hidden, #footer .visually-hidden { - position: absolute !important; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); - width: 1px; - height: 1px; - word-wrap: normal; -} -#header .visually-hidden.focusable:active, -#header .visually-hidden.focusable:focus, #footer .visually-hidden.focusable:active, -#footer .visually-hidden.focusable:focus { - position: static !important; - overflow: visible; - clip: auto; - width: auto; - height: auto; -} -#header .invisible, #footer .invisible { - visibility: hidden; -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header .isDesktop, #footer .isDesktop { - display: none !important; - } -} -@media (min-width: 992px) { - #header .isDesktop, #footer .isDesktop { - display: inherit; - } -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header .isMobile, #footer .isMobile { - display: inherit; - } -} -@media (min-width: 1200px) { - #header .isMobile, #footer .isMobile { - display: none !important; - } -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header .hiddenDesktop, #footer .hiddenDesktop { - display: inherit; - } -} -@media (min-width: 1200px) { - #header .hiddenDesktop, #footer .hiddenDesktop { - opacity: 0 !important; - visibility: hidden !important; - background: none !important; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-100.woff2") format("woff2"), url("../../../fonts/Inter/Inter-100.woff") format("woff"); */ - font-weight: 100; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-100-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-100-Italic.woff") format("woff"); */ - font-weight: 100; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-200.woff2") format("woff2"), url("../../../fonts/Inter/Inter-200.woff") format("woff"); */ - font-weight: 200; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-200-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-200-Italic.woff") format("woff"); */ - font-weight: 200; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-300.woff2") format("woff2"), url("../../../fonts/Inter/Inter-300.woff") format("woff"); */ - font-weight: 300; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-300-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-300-Italic.woff") format("woff"); */ - font-weight: 300; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-400.woff2") format("woff2"), url("../../../fonts/Inter/Inter-400.woff") format("woff"); */ - font-weight: 400; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-400-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-400-Italic.woff") format("woff"); */ - font-weight: 400; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-500.woff2") format("woff2"), url("../../../fonts/Inter/Inter-500.woff") format("woff"); */ - font-weight: 500; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-500-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-500-Italic.woff") format("woff"); */ - font-weight: 500; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-600.woff2") format("woff2"), url("../../../fonts/Inter/Inter-600.woff") format("woff"); */ - font-weight: 600; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-600-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-600-Italic.woff") format("woff"); */ - font-weight: 600; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-700.woff2") format("woff2"), url("../../../fonts/Inter/Inter-700.woff") format("woff"); */ - font-weight: 700; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-700-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-700-Italic.woff") format("woff"); */ - font-weight: 700; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-800.woff2") format("woff2"), url("../../../fonts/Inter/Inter-800.woff") format("woff"); */ - font-weight: 800; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-800-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-800-Italic.woff") format("woff"); */ - font-weight: 800; - font-style: italic; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-900.woff2") format("woff2"), url("../../../fonts/Inter/Inter-900.woff") format("woff"); */ - font-weight: 900; - font-style: normal; - font-display: swap; - } -} -@font-face { - #header, #footer { - font-family: "Inter"; -/* src: url("../../../fonts/Inter/Inter-900-Italic.woff2") format("woff2"), url("../../../fonts/Inter/Inter-900-Italic.woff") format("woff"); */ - font-weight: 900; - font-style: italic; - font-display: swap; - } -} -#header *, -#header *:before, -#header *:after, #footer *, -#footer *:before, -#footer *:after { - box-sizing: border-box; -} -#header html, #footer html { - font-size: 100%; -} -#header body, #footer body { - color: #141516; - font-family: "Inter", sans-serif; - font-feature-settings: "ss01", "ss03", "ss04"; - background: #fff !important; - overflow-x: hidden; -} -@media (min-width: 0px) { - #header body, #footer body { - font-size: 1.125rem; - } -} -@media (min-width: 600px) { - #header body, #footer body { - font-size: 1.25rem; - } -} -#header :focus, #footer :focus { - outline: 1px dashed rgba(253, 196, 0, 0.6); -} -#header :active, #footer :active { - outline: 0; -} -#header h1, #footer h1 { - font-weight: normal; - line-height: 1; - color: #000; - font-family: "Inter", sans-serif; - font-feature-settings: "ss01", "ss03", "ss04"; - margin: 1em 0; -} -@media (min-width: 0px) { - #header h1, #footer h1 { - font-size: 2.125rem; - } -} -@media (min-width: 600px) { - #header h1, #footer h1 { - font-size: 3.375rem; - } -} -#header h2, #footer h2 { - font-weight: normal; - line-height: 1; - color: #000; - font-family: "Inter", sans-serif; - font-feature-settings: "ss01", "ss03", "ss04"; - margin: 1em 0; -} -@media (min-width: 0px) { - #header h2, #footer h2 { - font-size: 1.375rem; - } -} -@media (min-width: 600px) { - #header h2, #footer h2 { - font-size: 1.875rem; - } -} -#header h3, #footer h3 { - font-weight: normal; - color: #000; - font-family: "Inter", sans-serif; - font-feature-settings: "ss01", "ss03", "ss04"; - margin: 1em 0; -} -@media (min-width: 0px) { - #header h3, #footer h3 { - font-size: 1.25rem; - } -} -@media (min-width: 600px) { - #header h3, #footer h3 { - font-size: 1.5rem; - } -} -#header h4, #footer h4 { - font-weight: normal; - line-height: 1; - color: #000; - font-family: "Inter", sans-serif; - font-feature-settings: "ss01", "ss03", "ss04"; - margin: 1em 0; -} -@media (min-width: 0px) { - #header h4, #footer h4 { - font-size: 1.125rem; - } -} -@media (min-width: 600px) { - #header h4, #footer h4 { - font-size: 1.25rem; - } -} -#header h5, #footer h5 { - font-weight: normal; - line-height: 1; - color: #000; - font-family: "Inter", sans-serif; - font-feature-settings: "ss01", "ss03", "ss04"; - margin: 1em 0; -} -@media (min-width: 0px) { - #header h5, #footer h5 { - font-size: 1rem; - } -} -@media (min-width: 600px) { - #header h5, #footer h5 { - font-size: 1.125rem; - } -} -#header h6, #footer h6 { - font-weight: normal; - line-height: 1; - color: #000; - font-family: "Inter", sans-serif; - font-feature-settings: "ss01", "ss03", "ss04"; - margin: 1em 0; -} -@media (min-width: 0px) { - #header h6, #footer h6 { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header h6, #footer h6 { - font-size: 1rem; - } -} -#header body.page-node-type-page .layout-content h1, #footer body.page-node-type-page .layout-content h1 { - margin: 0 0 1.875rem 0; -} -@media (min-width: 768px) { - #header body.page-node-type-page .layout-content h1, #footer body.page-node-type-page .layout-content h1 { - margin: 0 0 3.75rem 0; - } -} -#header body.page-node-type-update .layout-content h1, #footer body.page-node-type-update .layout-content h1 { - margin: 0 0 1.125rem 0; -} -@media (min-width: 768px) { - #header body.page-node-type-update .layout-content h1, #footer body.page-node-type-update .layout-content h1 { - margin: 0 0 1.5rem 0; - } -} -#header p, #footer p { - line-height: 1.6; - color: #000; - margin: 1em 0; -} -@media (min-width: 0px) { - #header p, #footer p { - font-size: 1rem; - } -} -@media (min-width: 600px) { - #header p, #footer p { - font-size: 1.125rem; - } -} -#header blockquote:not([class]), #footer blockquote:not([class]) { - border-left: solid 6px #0073CF; - margin: 2rem 0; - padding-left: 1.5rem; -} -@media (min-width: 992px) { - #header blockquote:not([class]), #footer blockquote:not([class]) { - margin: 4rem 0; - padding-left: 3.5rem; - } -} -#header blockquote:not([class]), -#header blockquote:not([class]) p, #footer blockquote:not([class]), -#footer blockquote:not([class]) p { - color: #000 !important; - font-size: 1.125rem; - font-style: italic; -} -@media (min-width: 992px) { - #header blockquote:not([class]), - #header blockquote:not([class]) p, #footer blockquote:not([class]), - #footer blockquote:not([class]) p { - font-size: 1.3125rem; - } -} -#header main ul:not([class]), -#header main ol:not([class]), -#header main dl:not([class]), #footer main ul:not([class]), -#footer main ol:not([class]), -#footer main dl:not([class]) { - margin: 1.25rem 0; - padding-left: 40px; -} -#header main li:not([class]), #footer main li:not([class]) { - margin-bottom: 0.625rem; - color: #565A5C; - display: block; - position: relative; - line-height: 1.6; -} -@media (min-width: 0px) { - #header main li:not([class]), #footer main li:not([class]) { - font-size: 1rem; - } -} -@media (min-width: 600px) { - #header main li:not([class]), #footer main li:not([class]) { - font-size: 1.125rem; - } -} -#header main li:not([class]):last-child, #footer main li:not([class]):last-child { - margin-bottom: 0; -} -#header main ul li:not([class]):after, #footer main ul li:not([class]):after { - color: #558807; - content: "•"; - display: block; - left: -25px; - position: absolute; - top: 0; -} -#header main ul li:not([class]) ul, #footer main ul li:not([class]) ul { - margin: 0.625rem 0; -} -#header main ol:not([class]), #footer main ol:not([class]) { - counter-reset: item; -} -#header main ol:not([class]) li:not([class]):before, #footer main ol:not([class]) li:not([class]):before { - content: counter(item) ". "; - counter-increment: item; - color: #558807; - left: -30px; - position: absolute; - top: 0; -} -#header dt, #footer dt { - font-weight: 600; -} -#header a:not([class]), #footer a:not([class]) { - color: #0073CF; -} -#header a:not([class]):active, #header a:not([class]):focus, #header a:not([class]):hover, #footer a:not([class]):active, #footer a:not([class]):focus, #footer a:not([class]):hover { - color: #0092E2; -} -h1 > #header a:not([class]), h2 > #header a:not([class]), h3 > #header a:not([class]), h4 > #header a:not([class]), h5 > #header a:not([class]), h6 > #header a:not([class]), h1 > #footer a:not([class]), h2 > #footer a:not([class]), h3 > #footer a:not([class]), h4 > #footer a:not([class]), h5 > #footer a:not([class]), h6 > #footer a:not([class]) { - text-decoration: none; -} -@media (min-width: 0px) and (max-width: 767.98px) { - #header a:not([class]), #footer a:not([class]) { - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-all; - } -} -#header hr:not([class]), #footer hr:not([class]) { - border: 0; - border-bottom: 1px solid #E4E6E7; -} -#header img, #footer img { - height: auto; - max-width: 100%; - display: block; -} -#header figure:not([class]), #footer figure:not([class]) { - margin: 0; -} -#header figure:not([class]) img, #footer figure:not([class]) img { - display: block; -} -#header figcaption, #footer figcaption { - margin: 1em 0; -} -#header div.responsive--video, -#header p.responsive--video, #footer div.responsive--video, -#footer p.responsive--video { - margin: 2.5rem 0 0 0; - overflow: hidden; - padding-top: 0.5652173913; - position: relative; - width: 100%; - min-height: 315px; - display: block; -} -#header div.responsive--video iframe, -#header p.responsive--video iframe, #footer div.responsive--video iframe, -#footer p.responsive--video iframe { - border: 0; - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; -} -#header .video-embed-field-responsive-video:after, #footer .video-embed-field-responsive-video:after { - display: none; -} -#header .toolbar .toolbar-bar, #footer .toolbar .toolbar-bar { - z-index: 3000 !important; -} -#header .ui-autocomplete, #footer .ui-autocomplete { - z-index: 9999; -} -#header .jumpmenu__heading a, #footer .jumpmenu__heading a { - font-weight: 500; - text-decoration: none; -} -@media (min-width: 0px) { - #header .jumpmenu__heading a, #footer .jumpmenu__heading a { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header .jumpmenu__heading a, #footer .jumpmenu__heading a { - font-size: 0.8125rem; - } -} -#header .jumpmenu__heading a.is-active, #footer .jumpmenu__heading a.is-active { - color: #565A5C; - text-decoration: none; -} -#header .jumpmenu__heading a:active, #header .jumpmenu__heading a:focus, #header .jumpmenu__heading a:hover, #footer .jumpmenu__heading a:active, #footer .jumpmenu__heading a:focus, #footer .jumpmenu__heading a:hover { - color: #0092E2; - text-decoration: underline; -} -#header .jumpmenu__heading a:visited, #footer .jumpmenu__heading a:visited { - color: #0073CF; - text-decoration: none; -} -#header .jumpmenu__heading a:visited.is-active, #footer .jumpmenu__heading a:visited.is-active { - color: #565A5C; -} -#header .layout, #footer .layout { - padding: 2.5rem 7.4074074074%; -} -@media (min-width: 1200px) { - #header .layout, #footer .layout { - padding: 3.75rem 7.4074074074%; - } -} -@media (min-width: 1620px) { - #header .layout, #footer .layout { - padding: 3.75rem 0; - } -} -#header body.path-frontpage .layout, #footer body.path-frontpage .layout { - padding: 2.5rem 7.4074074074%; -} -#header .layout-wide, #footer .layout-wide { - padding: 0; -} -#header .l--constrained, #footer .l--constrained { - box-sizing: border-box; - margin-left: auto; - margin-right: auto; - max-width: 1380px; -} -#header .l--narrow, #footer .l--narrow { - margin-left: auto; - margin-right: auto; - max-width: 960px; - width: 100%; -} -#header .l--gutters, #footer .l--gutters { - padding-left: 60px; - padding-right: 60px; -} -#header .l--offset-wide, #footer .l--offset-wide { - margin: 0 auto; - max-width: 1620px; - padding: 0 3.125rem 0 2.25rem; -} -#header .sidebar .l--offset-wide, #footer .sidebar .l--offset-wide { - padding: 0 2.25rem; -} -@media (min-width: 992px) { - #header .sidebar .l--offset-wide, #footer .sidebar .l--offset-wide { - padding: 0; - } -} -@media (min-width: 1200px) { - #header .sidebar .l--offset-wide, #footer .sidebar .l--offset-wide { - padding: 0; - } -} -#header .sidebar .page-content--wrapper .l--offset-wide, #footer .sidebar .page-content--wrapper .l--offset-wide { - padding: 0; -} -#header body.page-node-type-page .l--offset-wide.page__default--withSidebar-wrapper .l--constrained, #footer body.page-node-type-page .l--offset-wide.page__default--withSidebar-wrapper .l--constrained { - max-width: 1620px; - box-sizing: border-box; - width: 100%; - padding: 0 3.125rem 0 2.25rem; -} -#header .l--offset-full, #footer .l--offset-full { - margin: 0 auto; - max-width: 1620px; -} -#header .l--offset, #footer .l--offset { - padding-left: 7.4074074074%; - padding-right: 7.4074074074%; -} -@media (min-width: 1620px) { - #header .l--offset, #footer .l--offset { - padding-left: 120px; - padding-right: 120px; - } -} -#header .l--padded, #footer .l--padded { - padding-bottom: 60px; - padding-top: 60px; -} -#header .l--vertical-spacing, #footer .l--vertical-spacing { - margin: 2.5rem 0; - width: 100%; -} -@media (min-width: 1200px) { - #header .l--vertical-spacing, #footer .l--vertical-spacing { - margin: 3.75rem 0; - } -} -#header .l--wrapper, #footer .l--wrapper { - display: flex; - flex-direction: column; -} -@media (min-width: 992px) { - #header .l--wrapper, #footer .l--wrapper { - flex-direction: row; - } -} -@media (min-width: 992px) { - #header .l--wrapper .layout-sidebar, #footer .l--wrapper .layout-sidebar { - width: 300px; - flex: none; - order: 1; - } -} -#header .l--wrapper .layout-sidebar .sidebar--wrapper, #footer .l--wrapper .layout-sidebar .sidebar--wrapper { - margin: 1.875rem; -} -@media (min-width: 992px) { - #header .l--wrapper .layout-sidebar .sidebar--wrapper, #footer .l--wrapper .layout-sidebar .sidebar--wrapper { - margin: 1.875rem; - } -} -#header .l--wrapper .page-content--wrapper, #footer .l--wrapper .page-content--wrapper { - order: 2; - padding: 1.875rem 0; -} -@media (min-width: 992px) { - #header .l--wrapper .page-content--wrapper, #footer .l--wrapper .page-content--wrapper { - flex: 1; - padding: 4.875rem 1.875rem 3.75rem 3.75rem; - } -} -@media (min-width: 1200px) { - #header .l--wrapper .page-content--wrapper, #footer .l--wrapper .page-content--wrapper { - flex: 1; - padding: 4.875rem 1.875rem 3.75rem 3.75rem; - } -} -@media (min-width: 1440px) { - #header .l--wrapper .page-content--wrapper, #footer .l--wrapper .page-content--wrapper { - flex: 1; - padding: 4.875rem 1.875rem 4.5rem 7.5rem; - } -} -#header .l--2col-wrapper, #footer .l--2col-wrapper { - width: 100%; -} -@media (min-width: 992px) { - #header .l--2col-wrapper, #footer .l--2col-wrapper { - display: flex; - } -} -#header .l--2col-wrapper .page-content--main-content, #footer .l--2col-wrapper .page-content--main-content { - order: 1; - flex: 1; -} -#header .l--2col-wrapper .page-content--secondary, #footer .l--2col-wrapper .page-content--secondary { - border-top: 1px solid #D7D9D9; - margin-top: 1.875rem; - padding-top: 1.875rem; -} -@media (min-width: 992px) { - #header .l--2col-wrapper .page-content--secondary, #footer .l--2col-wrapper .page-content--secondary { - margin-top: 0; - padding-top: 0; - border-top: none; - margin-left: 3.75rem; - width: 180px; - flex: none; - order: 2; - } -} -@media (min-width: 1200px) { - #header .l--2col-wrapper .page-content--secondary, #footer .l--2col-wrapper .page-content--secondary { - margin-left: 7.5rem; - width: 240px; - } -} -#header .l--2col-wrapper .layout, #footer .l--2col-wrapper .layout { - padding-top: 0; -} -#header .l--1col-wrapper, #footer .l--1col-wrapper { - width: 100%; -} -#header .sticky, #footer .sticky { - position: static; - margin-bottom: 0; -} -@media (min-width: 992px) { - #header .sticky, #footer .sticky { - position: sticky; - top: 0; - margin-bottom: 3.75rem; - } -} -#header body.page-node-type-page .page-landing-page .paragraph--type--section:first-of-type .layout:first-of-type, #footer body.page-node-type-page .page-landing-page .paragraph--type--section:first-of-type .layout:first-of-type { - padding-top: 0; -} -#header body.page-node-type-page .page-full .page__default--content .layout.default-layout, #footer body.page-node-type-page .page-full .page__default--content .layout.default-layout { - padding-left: 0; - padding-right: 0; -} -#header main > .sidebar .paragraph--type--section .layout, #footer main > .sidebar .paragraph--type--section .layout { - padding-left: 0; - padding-right: 0; -} -#header .l--layout-onecolumn-contained .l--constrained, #footer .l--layout-onecolumn-contained .l--constrained { - max-width: 100%; -} -#header body.page-node-type-page h1.page__default--title, #footer body.page-node-type-page h1.page__default--title { - margin-bottom: 0; -} -#header body.page-node-type-update .page__default--body p, -#header body.page-node-type-page .page__default--body p, #footer body.page-node-type-update .page__default--body p, -#footer body.page-node-type-page .page__default--body p { - color: #565A5C; -} -#header body.page-node-type-update .page__default--body > p.intro-style:first-of-type, -#header body.page-node-type-update .field--name-body > p.intro-style:first-of-type, -#header body.page-node-type-page .page__default--body > p.intro-style:first-of-type, -#header body.page-node-type-page .field--name-body > p.intro-style:first-of-type, #footer body.page-node-type-update .page__default--body > p.intro-style:first-of-type, -#footer body.page-node-type-update .field--name-body > p.intro-style:first-of-type, -#footer body.page-node-type-page .page__default--body > p.intro-style:first-of-type, -#footer body.page-node-type-page .field--name-body > p.intro-style:first-of-type { - margin-top: 0; -} -#header body.page-node-type-update .page__default--body > p.intro-style, -#header body.page-node-type-update .field--name-body > p.intro-style, -#header body.page-node-type-page .page__default--body > p.intro-style, -#header body.page-node-type-page .field--name-body > p.intro-style, #footer body.page-node-type-update .page__default--body > p.intro-style, -#footer body.page-node-type-update .field--name-body > p.intro-style, -#footer body.page-node-type-page .page__default--body > p.intro-style, -#footer body.page-node-type-page .field--name-body > p.intro-style { - color: #141516; - line-height: 1.75; -} -@media (min-width: 0px) { - #header body.page-node-type-update .page__default--body > p.intro-style, - #header body.page-node-type-update .field--name-body > p.intro-style, - #header body.page-node-type-page .page__default--body > p.intro-style, - #header body.page-node-type-page .field--name-body > p.intro-style, #footer body.page-node-type-update .page__default--body > p.intro-style, - #footer body.page-node-type-update .field--name-body > p.intro-style, - #footer body.page-node-type-page .page__default--body > p.intro-style, - #footer body.page-node-type-page .field--name-body > p.intro-style { - font-size: 1.1875rem; - } -} -@media (min-width: 600px) { - #header body.page-node-type-update .page__default--body > p.intro-style, - #header body.page-node-type-update .field--name-body > p.intro-style, - #header body.page-node-type-page .page__default--body > p.intro-style, - #header body.page-node-type-page .field--name-body > p.intro-style, #footer body.page-node-type-update .page__default--body > p.intro-style, - #footer body.page-node-type-update .field--name-body > p.intro-style, - #footer body.page-node-type-page .page__default--body > p.intro-style, - #footer body.page-node-type-page .field--name-body > p.intro-style { - font-size: 1.3125rem; - } -} -#header .field--name-body > .embed:first-child figure, #footer .field--name-body > .embed:first-child figure { - margin-top: 0; -} -#header .align-left, #footer .align-left { - margin: 1.875rem 0; - float: none; -} -@media (min-width: 768px) { - #header .align-left, #footer .align-left { - float: left; - margin: 0 3.75rem 1.875rem 0; - max-width: 45%; - } -} -#header .align-right, #footer .align-right { - margin: 1.875rem 0; - float: none; -} -@media (min-width: 768px) { - #header .align-right, #footer .align-right { - float: right; - margin: 0 0 1.875rem 3.75rem; - max-width: 45%; - } -} -#header .align-center, #footer .align-center { - display: block; - margin: 1.875rem 0; -} -#header figure, #footer figure { - margin: 0; -} -#header figure img, #footer figure img { - width: 100%; -} -#header figure figcaption, #header figure .field--name-field-caption, #footer figure figcaption, #footer figure .field--name-field-caption { - margin: 0; - background: #F5F6F7; - border-radius: 0px 0px 6px 6px; - padding: 1.125rem 1.875rem; - font-size: 15px; - color: #565A5C; -} -#header figure figcaption p, #header figure .field--name-field-caption p, #footer figure figcaption p, #footer figure .field--name-field-caption p { - padding: 0; - margin: 0; - background: #F5F6F7; - border-radius: 0px 0px 6px 6px; - font-size: 15px; -} -#header article > figcaption, #footer article > figcaption { - margin: 0; -} -#header article > figcaption p, #footer article > figcaption p { - margin: 0; - background: #F5F6F7; - border-radius: 0px 0px 6px 6px; - padding: 1.125rem 1.875rem; - font-size: 15px; - color: #565A5C; -} -#header .field.field--type-image img, #footer .field.field--type-image img { - width: 100%; -} -#header .field.field--type-image, #footer .field.field--type-image { - margin-bottom: 0; -} -#header .field.field--type-image .field__item, #footer .field.field--type-image .field__item { - margin: 0; -} -#header .field.field--name-thumbnail img, #footer .field.field--name-thumbnail img { - width: auto; -} -#header input[type=file], #footer input[type=file] { - height: inherit; -} -#header input[type=checkbox]:not(.nav-trigger), #footer input[type=checkbox]:not(.nav-trigger) { - height: auto; -} -#header label, -#header legend, #footer label, -#footer legend { - margin: 1em 0; -} -#header select, #footer select { - appearance: none; - background: #f7f6f7; - border-color: #c3c1c3; - border-radius: 0; - height: 2.1875rem; - padding: 0 10px; - text-indent: 0.01px; - text-overflow: ""; -} -#header select::-ms-expand, #footer select::-ms-expand { - display: none; -} -#header button::-moz-focus-inner, -#header input::-moz-focus-inner, #footer button::-moz-focus-inner, -#footer input::-moz-focus-inner { - border: 0; - padding: 0; -} -#header input, #footer input { - line-height: normal; -} -#header input[type=checkbox]:not(.nav-trigger), -#header input[type=radio], #footer input[type=checkbox]:not(.nav-trigger), -#footer input[type=radio] { - box-sizing: border-box; - padding: 0; -} -#header input[type=number]::-webkit-inner-spin-button, -#header input[type=number]::-webkit-outer-spin-button, #footer input[type=number]::-webkit-inner-spin-button, -#footer input[type=number]::-webkit-outer-spin-button { - height: auto; -} -#header input[type=search], #footer input[type=search] { - -webkit-appearance: textfield; - box-sizing: border-box; -} -#header input[type=search]::-webkit-search-cancel-button, -#header input[type=search]::-webkit-search-decoration, #footer input[type=search]::-webkit-search-cancel-button, -#footer input[type=search]::-webkit-search-decoration { - -webkit-appearance: none; -} -#header fieldset, #footer fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} -#header legend, #footer legend { - border: 0; - padding: 0; -} -#header textarea, #footer textarea { - overflow: auto; -} -#header button, -#header input, -#header optgroup, -#header select, -#header textarea, #footer button, -#footer input, -#footer optgroup, -#footer select, -#footer textarea { - color: inherit; - font: inherit; - margin: 0; -} -#header button, #footer button { - overflow: visible; -} -#header button, -#header select, #footer button, -#footer select { - text-transform: none; -} -#header button, -#header html input[type=button], -#header input[type=reset], -#header input[type=submit], #footer button, -#footer html input[type=button], -#footer input[type=reset], -#footer input[type=submit] { - -webkit-appearance: button; - cursor: pointer; -} -#header button[disabled], -#header html input[disabled], #footer button[disabled], -#footer html input[disabled] { - cursor: default; -} -#header optgroup, #footer optgroup { - font-weight: bold; -} -#header .form-item, #footer .form-item { - margin: 1em 0; -} -#header .field, #footer .field { - margin-bottom: 2em; -} -#header .field:last-child, #footer .field:last-child { - margin-bottom: 0; -} -#header .field__label, #footer .field__label { - font-weight: bold; -} -#header .views-field.views-field-entity-browser-select, #footer .views-field.views-field-entity-browser-select { - padding-bottom: 0; - padding-top: 0; -} -#header .views-field.views-field-entity-browser-select .form-item, #footer .views-field.views-field-entity-browser-select .form-item { - margin: 0; -} -#header .views-field.views-field-entity-browser-select .visually-hidden, #footer .views-field.views-field-entity-browser-select .visually-hidden { - margin: 10px 0 0 -8px; - padding: 0; -} -#header .form-item label, #footer .form-item label { - font-weight: 600; - color: #000000; - display: block; - margin-bottom: 0.375rem; -} -@media (min-width: 0px) { - #header .form-item label, #footer .form-item label { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header .form-item label, #footer .form-item label { - font-size: 1rem; - } -} -#header input[type=text]:not(.MuiInputBase-input), -#header input[type=password]:not(.MuiInputBase-input), -#header input[type=date]:not(.MuiInputBase-input), -#header input[type=email]:not(.MuiInputBase-input), -#header input[type=number]:not(.MuiInputBase-input), -#header input[type=time]:not(.MuiInputBase-input), #footer input[type=text]:not(.MuiInputBase-input), -#footer input[type=password]:not(.MuiInputBase-input), -#footer input[type=date]:not(.MuiInputBase-input), -#footer input[type=email]:not(.MuiInputBase-input), -#footer input[type=number]:not(.MuiInputBase-input), -#footer input[type=time]:not(.MuiInputBase-input) { - height: 3rem; - background: #fff; - border: 1px solid #D7D9D9; - box-shadow: inset 0px 1px 0px #7C7F80; - border-radius: 2px; - padding: 0.75rem 1.125rem; - font-weight: normal; - color: #000; - transition: all 0.25s; -} -@media (min-width: 0px) { - #header input[type=text]:not(.MuiInputBase-input), - #header input[type=password]:not(.MuiInputBase-input), - #header input[type=date]:not(.MuiInputBase-input), - #header input[type=email]:not(.MuiInputBase-input), - #header input[type=number]:not(.MuiInputBase-input), - #header input[type=time]:not(.MuiInputBase-input), #footer input[type=text]:not(.MuiInputBase-input), - #footer input[type=password]:not(.MuiInputBase-input), - #footer input[type=date]:not(.MuiInputBase-input), - #footer input[type=email]:not(.MuiInputBase-input), - #footer input[type=number]:not(.MuiInputBase-input), - #footer input[type=time]:not(.MuiInputBase-input) { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header input[type=text]:not(.MuiInputBase-input), - #header input[type=password]:not(.MuiInputBase-input), - #header input[type=date]:not(.MuiInputBase-input), - #header input[type=email]:not(.MuiInputBase-input), - #header input[type=number]:not(.MuiInputBase-input), - #header input[type=time]:not(.MuiInputBase-input), #footer input[type=text]:not(.MuiInputBase-input), - #footer input[type=password]:not(.MuiInputBase-input), - #footer input[type=date]:not(.MuiInputBase-input), - #footer input[type=email]:not(.MuiInputBase-input), - #footer input[type=number]:not(.MuiInputBase-input), - #footer input[type=time]:not(.MuiInputBase-input) { - font-size: 1rem; - } -} -#header input[type=text]:not(.MuiInputBase-input):hover, -#header input[type=password]:not(.MuiInputBase-input):hover, -#header input[type=date]:not(.MuiInputBase-input):hover, -#header input[type=email]:not(.MuiInputBase-input):hover, -#header input[type=number]:not(.MuiInputBase-input):hover, -#header input[type=time]:not(.MuiInputBase-input):hover, #footer input[type=text]:not(.MuiInputBase-input):hover, -#footer input[type=password]:not(.MuiInputBase-input):hover, -#footer input[type=date]:not(.MuiInputBase-input):hover, -#footer input[type=email]:not(.MuiInputBase-input):hover, -#footer input[type=number]:not(.MuiInputBase-input):hover, -#footer input[type=time]:not(.MuiInputBase-input):hover { - box-shadow: none; - transition: all 0.25s; - border: 1px solid #0073CF !important; -} -#header input[type=text]:not(.MuiInputBase-input):active, #header input[type=text]:not(.MuiInputBase-input):focus, -#header input[type=password]:not(.MuiInputBase-input):active, -#header input[type=password]:not(.MuiInputBase-input):focus, -#header input[type=date]:not(.MuiInputBase-input):active, -#header input[type=date]:not(.MuiInputBase-input):focus, -#header input[type=email]:not(.MuiInputBase-input):active, -#header input[type=email]:not(.MuiInputBase-input):focus, -#header input[type=number]:not(.MuiInputBase-input):active, -#header input[type=number]:not(.MuiInputBase-input):focus, -#header input[type=time]:not(.MuiInputBase-input):active, -#header input[type=time]:not(.MuiInputBase-input):focus, #footer input[type=text]:not(.MuiInputBase-input):active, #footer input[type=text]:not(.MuiInputBase-input):focus, -#footer input[type=password]:not(.MuiInputBase-input):active, -#footer input[type=password]:not(.MuiInputBase-input):focus, -#footer input[type=date]:not(.MuiInputBase-input):active, -#footer input[type=date]:not(.MuiInputBase-input):focus, -#footer input[type=email]:not(.MuiInputBase-input):active, -#footer input[type=email]:not(.MuiInputBase-input):focus, -#footer input[type=number]:not(.MuiInputBase-input):active, -#footer input[type=number]:not(.MuiInputBase-input):focus, -#footer input[type=time]:not(.MuiInputBase-input):active, -#footer input[type=time]:not(.MuiInputBase-input):focus { - transition: all 0.25s; - border: 1px solid #0073CF !important; - box-shadow: 0px 0px 0px 4px #C4C4C4; - outline: none; -} -#header input[type=text]:not(.MuiInputBase-input):disabled, -#header input[type=password]:not(.MuiInputBase-input):disabled, -#header input[type=date]:not(.MuiInputBase-input):disabled, -#header input[type=email]:not(.MuiInputBase-input):disabled, -#header input[type=number]:not(.MuiInputBase-input):disabled, -#header input[type=time]:not(.MuiInputBase-input):disabled, #footer input[type=text]:not(.MuiInputBase-input):disabled, -#footer input[type=password]:not(.MuiInputBase-input):disabled, -#footer input[type=date]:not(.MuiInputBase-input):disabled, -#footer input[type=email]:not(.MuiInputBase-input):disabled, -#footer input[type=number]:not(.MuiInputBase-input):disabled, -#footer input[type=time]:not(.MuiInputBase-input):disabled { - color: #A2A4A3; - background: #F5F6F7; - border: 1px solid #D7D9D9; - box-sizing: border-box; - box-shadow: inset 0px 1px 0px #7C7F80; -} -#header .time-start, #footer .time-start { - display: flex; -} -#header textarea, #footer textarea { - background: #fff; - border: 1px solid #D7D9D9; - box-shadow: inset 0px 1px 0px #7C7F80; - border-radius: 2px; - padding: 0.75rem 1.125rem; - font-weight: normal; - color: #000; - transition: all 0.25s; -} -@media (min-width: 0px) { - #header textarea, #footer textarea { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header textarea, #footer textarea { - font-size: 1rem; - } -} -#header textarea:hover, #footer textarea:hover { - box-shadow: none; - transition: all 0.25s; - border: 1px solid #0073CF !important; -} -#header textarea:active, #header textarea:focus, #footer textarea:active, #footer textarea:focus { - transition: all 0.25s; - border: 1px solid #0073CF !important; - box-shadow: 0px 0px 0px 4px #C4C4C4; - outline: none; -} -#header textarea:disabled, #footer textarea:disabled { - color: #A2A4A3; - background: #F5F6F7; - border: 1px solid #D7D9D9; - box-sizing: border-box; - box-shadow: inset 0px 1px 0px #7C7F80; -} -#header select, #footer select { - height: 3rem; - background: #fff; - border: 1px solid #D7D9D9; - box-shadow: inset 0px -1px 0px #7C7F80; - border-radius: 2px; - padding: 0.75rem 2.25rem 0.75rem 1.125rem; - font-weight: normal; - color: #000; - transition: all 0.25s; - background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2210%22%20height%3D%226%22%20viewBox%3D%220%200%2010%206%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M9%201L5%205%201%201%22%20stroke%3D%22%230073CF%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E"); - background-position: 97% 50%; - background-repeat: no-repeat; -} -@media (min-width: 0px) { - #header select, #footer select { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header select, #footer select { - font-size: 1rem; - } -} -#header select:hover, #footer select:hover { - box-shadow: none; - transition: all 0.25s; - border: 1px solid #0073CF !important; -} -#header select:active, #header select:focus, #footer select:active, #footer select:focus { - transition: all 0.25s; - border: 1px solid #0073CF !important; - box-shadow: 0px 0px 0px 4px #C4C4C4; - outline: none; -} -#header select:disabled, #footer select:disabled { - color: #A2A4A3; - background: #F5F6F7; - border: 1px solid #D7D9D9; - box-sizing: border-box; - box-shadow: inset 0px 1px 0px #7C7F80; -} -#header .select2-selection.select2-selection--multiple, #footer .select2-selection.select2-selection--multiple { - background: #fff; - border: 1px solid #D7D9D9; - box-shadow: inset 0px -1px 0px #7C7F80; - border-radius: 2px; - font-weight: normal; - color: #000; - transition: all 0.25s; - background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2210%22%20height%3D%226%22%20viewBox%3D%220%200%2010%206%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M9%201L5%205%201%201%22%20stroke%3D%22%230073CF%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E"); - background-position: 97% 50%; - background-repeat: no-repeat; -} -@media (min-width: 0px) { - #header .select2-selection.select2-selection--multiple, #footer .select2-selection.select2-selection--multiple { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header .select2-selection.select2-selection--multiple, #footer .select2-selection.select2-selection--multiple { - font-size: 1rem; - } -} -#header .select2-selection.select2-selection--multiple:hover, #footer .select2-selection.select2-selection--multiple:hover { - box-shadow: none; - transition: all 0.25s; - border: 1px solid #0073CF !important; -} -#header .select2-selection.select2-selection--multiple:active, #header .select2-selection.select2-selection--multiple:focus, #footer .select2-selection.select2-selection--multiple:active, #footer .select2-selection.select2-selection--multiple:focus { - transition: all 0.25s; - border: 1px solid #0073CF !important; - box-shadow: 0px 0px 0px 4px #C4C4C4; - outline: none; -} -#header .select2-selection.select2-selection--multiple:disabled, #footer .select2-selection.select2-selection--multiple:disabled { - color: #A2A4A3; - background: #F5F6F7; - border: 1px solid #D7D9D9; - box-sizing: border-box; - box-shadow: inset 0px 1px 0px #7C7F80; -} -#header .select2-selection.select2-selection--multiple .select2-container--default .select2-results__option--highlighted[data-selected], #footer .select2-selection.select2-selection--multiple .select2-container--default .select2-results__option--highlighted[data-selected] { - background-color: #0073CF; - color: white; -} -#header .select2-selection.select2-selection--multiple .select2-selection__choice .select2-selection__choice__remove, #footer .select2-selection.select2-selection--multiple .select2-selection__choice .select2-selection__choice__remove { - padding: 0.1875rem; -} -#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close), -#header button.button.form-submit.ui-button, -#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res), -#header ::-webkit-file-upload-button, #footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close), -#footer button.button.form-submit.ui-button, -#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res), -#footer ::-webkit-file-upload-button { - color: #fff; - background: #0073CF; - border: 1px solid #0073CF; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25), 0px 1px 1px rgba(0, 0, 0, 0.25); - border-radius: 2px; - font-weight: bold; - font-size: 13px; - letter-spacing: 0.1em; - text-transform: uppercase; - padding: 0.75rem 1.125rem; - -webkit-appearance: none; - transition: all 0.25s; -} -#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):hover, -#header button.button.form-submit.ui-button:hover, -#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):hover, -#header ::-webkit-file-upload-button:hover, #footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):hover, -#footer button.button.form-submit.ui-button:hover, -#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):hover, -#footer ::-webkit-file-upload-button:hover { - transition: all 0.25s; - background: #0092E2; - border: 1px solid #0092E2; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25), 0px 1px 1px rgba(0, 0, 0, 0.25); -} -#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):active, #header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):focus, -#header button.button.form-submit.ui-button:active, -#header button.button.form-submit.ui-button:focus, -#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):active, -#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):focus, -#header ::-webkit-file-upload-button:active, -#header ::-webkit-file-upload-button:focus, #footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):active, #footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):focus, -#footer button.button.form-submit.ui-button:active, -#footer button.button.form-submit.ui-button:focus, -#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):active, -#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):focus, -#footer ::-webkit-file-upload-button:active, -#footer ::-webkit-file-upload-button:focus { - transition: all 0.25s; - background: #0092E2; - box-shadow: 0px 0px 0px 4px #C4C4C4; - border: 1px solid #0073CF; -} -#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):disabled, -#header button.button.form-submit.ui-button:disabled, -#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):disabled, -#header ::-webkit-file-upload-button:disabled, #footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):disabled, -#footer button.button.form-submit.ui-button:disabled, -#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):disabled, -#footer ::-webkit-file-upload-button:disabled { - background: #D7D9D9; - color: #A2A4A3; -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked), #header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked), #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked { - position: absolute; - left: -9999px; -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label, #header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label { - position: relative; - padding-left: 1.95em; - cursor: pointer; -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label:before, #header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label:before, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label:before, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label:before { - content: ""; - position: absolute; - left: 0; - top: 0; - width: 16px; - height: 16px; - border: 1px solid #D7D9D9; - background: #fff; - border-radius: 50%; -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label:after, #header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label:after, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label:after, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label:after { - content: ""; - background-image: url("data:image/svg+xml,%3Csvg%20width%3D%228%22%20height%3D%228%22%20viewBox%3D%220%200%208%208%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%228%22%20height%3D%228%22%20rx%3D%224%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E"); - background-position: center center; - background-repeat: no-repeat; - top: 4px; - left: 4px; - height: 8px; - width: 8px; - display: block; - position: absolute; -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label:after, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked) + label:after { - opacity: 0; - transform: scale(0); -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label:after, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked + label:after { - opacity: 1; - transform: scale(1); -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:not(:checked) + label:before, #header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:checked + label:before, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:not(:checked) + label:before, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:checked + label:before { - box-shadow: none; - border-color: #D7D9D9; - background-color: #fff; -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked:focus + label:before, #header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked):focus + label:before, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked:focus + label:before, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked):focus + label:before { - box-shadow: 0px 0px 0px 4px #C4C4C4; - border: 1px solid #0073CF; -} -#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input) + label:hover:before, #footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input) + label:hover:before { - border: 1px solid #0073CF !important; -} -#header .form-no-label .visually-hidden, #footer .form-no-label .visually-hidden { - overflow: initial; - text-indent: -10000px; - height: auto; - width: auto; -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked), #header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked), #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked { - position: absolute; - left: -9999px; -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label, #header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label { - position: relative; - padding-left: 1.95em; - cursor: pointer; - z-index: 1; -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label:before, #header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label:before, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label:before, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label:before { - content: ""; - position: absolute; - left: 0; - top: 0; - width: 16px; - height: 16px; - border: 1px solid #D7D9D9; - background: #fff; - border-radius: 2px; -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label:after, #header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label:after, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label:after, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label:after { - content: ""; - background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2211%22%20height%3D%228%22%20viewBox%3D%220%200%2011%208%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M1%204l3%203%206-6%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E"); - background-position: center center; - background-repeat: no-repeat; - top: 4px; - left: 3px; - height: 8px; - width: 11px; - display: block; - position: absolute; -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label:after, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked) + label:after { - opacity: 0; - transform: scale(0); -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label:after, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked + label:after { - opacity: 1; - transform: scale(1); -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:not(:checked) + label:before, #header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:checked + label:before, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:not(:checked) + label:before, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:checked + label:before { - box-shadow: none; - border-color: #D7D9D9; - background-color: #fff; -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked:focus + label:before, #header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked):focus + label:before, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked:focus + label:before, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked):focus + label:before { - box-shadow: 0px 0px 0px 4px #C4C4C4; - border: 1px solid #0073CF; -} -#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday) + label:hover:before, #footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday) + label:hover:before { - border: 1px solid #0073CF !important; -} -#header .webform-element-description, #footer .webform-element-description { - color: #565A5C; -} -@media (min-width: 0px) { - #header .webform-element-description, #footer .webform-element-description { - font-size: 0.875rem; - } -} -@media (min-width: 600px) { - #header .webform-element-description, #footer .webform-element-description { - font-size: 0.9375rem; - } -} -#header #linkit-editor-dialog-form, #footer #linkit-editor-dialog-form { - min-height: 400px; -} -#header .smartdate--time-inline, #footer .smartdate--time-inline { - display: flex; - grid-column-gap: 0.5em; - flex-direction: row; - flex-wrap: nowrap; - align-content: center; - align-items: baseline; - justify-content: flex-start; -} -#header .table-wrapper, #footer .table-wrapper { - display: grid; - overflow-x: auto; - background: linear-gradient(90deg, white 0%, rgba(255, 255, 255, 0)), linear-gradient(-90deg, white 0%, rgba(255, 255, 255, 0)) 100% 0, radial-gradient(farthest-side at 0% 50%, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0)), radial-gradient(farthest-side at 100% 50%, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0)) 100% 0%; - background-repeat: no-repeat; - background-color: #fff; - background-size: 100px 100%, 100px 100%, 14px 100%, 14px 100%; - background-attachment: local, local, scroll, scroll; -} -#header .table-wrapper::-webkit-scrollbar, #footer .table-wrapper::-webkit-scrollbar { - -webkit-appearance: none; - height: 10px; -} -#header .table-wrapper::-webkit-scrollbar-thumb, #footer .table-wrapper::-webkit-scrollbar-thumb { - border-radius: 3px; - background-color: rgba(0, 0, 0, 0.5); - -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); -} -#header table:not(.MuiTable-root), #footer table:not(.MuiTable-root) { - border-collapse: collapse; - border-spacing: 0; - caption-side: bottom; - text-align: left; - border: none; - color: #000; - vertical-align: top; - min-width: 100%; - margin: 0; -} -@media (min-width: 0px) { - #header table:not(.MuiTable-root), #footer table:not(.MuiTable-root) { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header table:not(.MuiTable-root), #footer table:not(.MuiTable-root) { - font-size: 0.8125rem; - } -} -#header table:not(.MuiTable-root) p, #footer table:not(.MuiTable-root) p { - font-size: inherit; - color: inherit; - line-height: inherit; -} -#header table:not(.MuiTable-root) th, #header table:not(.MuiTable-root) td, #footer table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) td { - border: none; -} -#header table:not(.MuiTable-root) thead th, #footer table:not(.MuiTable-root) thead th { - vertical-align: bottom; -} -#header table:not(.MuiTable-root) thead th a, #footer table:not(.MuiTable-root) thead th a { - padding: 0; -} -@media (min-width: 0px) { - #header table:not(.MuiTable-root) thead th a, #footer table:not(.MuiTable-root) thead th a { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header table:not(.MuiTable-root) thead th a, #footer table:not(.MuiTable-root) thead th a { - font-size: 0.8125rem; - } -} -#header table:not(.MuiTable-root) th, #header table:not(.MuiTable-root) td, #footer table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) td { - vertical-align: top; - padding: 0.625rem; -} -@media (min-width: 768px) { - #header table:not(.MuiTable-root) th, #header table:not(.MuiTable-root) td, #footer table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) td { - padding: 0.625rem 1rem; - } -} -@media (min-width: 992px) { - #header table:not(.MuiTable-root) th, #header table:not(.MuiTable-root) td, #footer table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) td { - padding: 1rem 1.25rem; - } -} -#header table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) th { - border-left: 1px solid #002C77; -} -#header table:not(.MuiTable-root) th:first-child, #footer table:not(.MuiTable-root) th:first-child { - border-left: none; -} -#header table:not(.MuiTable-root) td, #footer table:not(.MuiTable-root) td { - border-left: 1px solid #D7D9D9; -} -@media (min-width: 0px) { - #header table:not(.MuiTable-root) td, #footer table:not(.MuiTable-root) td { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header table:not(.MuiTable-root) td, #footer table:not(.MuiTable-root) td { - font-size: 0.8125rem; - } -} -#header table:not(.MuiTable-root) td a, #footer table:not(.MuiTable-root) td a { - line-height: 1.25; - color: #0073CF; -} -#header table:not(.MuiTable-root) td:first-child, #footer table:not(.MuiTable-root) td:first-child { - border-left: none; -} -#header table:not(.MuiTable-root) tr:nth-of-type(odd), #footer table:not(.MuiTable-root) tr:nth-of-type(odd) { - background-color: rgba(20, 21, 22, 0.04); -} -#header table:not(.MuiTable-root) tr:nth-of-type(even), #footer table:not(.MuiTable-root) tr:nth-of-type(even) { - background: none; -} -#header table:not(.MuiTable-root) caption, #footer table:not(.MuiTable-root) caption { - padding: 1rem; -} -#header table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) th { - color: #fff; - letter-spacing: 0.2em; - text-transform: uppercase; - background: #0073CF; - box-shadow: inset 0px -1px 0px #002C77; -} -@media (min-width: 0px) { - #header table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) th { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header table:not(.MuiTable-root) th, #footer table:not(.MuiTable-root) th { - font-size: 0.8125rem; - } -} -#header table:not(.MuiTable-root) th a, #footer table:not(.MuiTable-root) th a { - color: #fff; - text-decoration: none; - overflow-wrap: break-word; -} -#header code, #footer code { - font-family: monospace, serif; - display: inline; - border-radius: 3px; - padding: 0.1875rem 0.3125rem; - background: #ffffff; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); - color: #000; -} -#header pre code, #footer pre code { - display: block; - background: #E4E6E7; - border-radius: 3px; - padding: 0.2rem; -} -@media (min-width: 0px) { - #header pre code, #footer pre code { - font-size: 1rem; - } -} -@media (min-width: 600px) { - #header pre code, #footer pre code { - font-size: 1.125rem; - } -} -#header .hljs-comment, #header .hljs-quote, #footer .hljs-comment, #footer .hljs-quote { - color: #969896; -} -#header .hljs-variable, #header .hljs-template-variable, #header .hljs-tag, #header .hljs-name, #header .hljs-selector-id, #header .hljs-selector-class, #header .hljs-regexp, #header .hljs-deletion, #footer .hljs-variable, #footer .hljs-template-variable, #footer .hljs-tag, #footer .hljs-name, #footer .hljs-selector-id, #footer .hljs-selector-class, #footer .hljs-regexp, #footer .hljs-deletion { - color: #cc6666; -} -#header .hljs-number, #header .hljs-built_in, #header .hljs-builtin-name, #header .hljs-literal, #header .hljs-type, #header .hljs-params, #header .hljs-meta, #header .hljs-link, #footer .hljs-number, #footer .hljs-built_in, #footer .hljs-builtin-name, #footer .hljs-literal, #footer .hljs-type, #footer .hljs-params, #footer .hljs-meta, #footer .hljs-link { - color: #de935f; -} -#header .hljs-attribute, #footer .hljs-attribute { - color: #f0c674; -} -#header .hljs-string, #header .hljs-symbol, #header .hljs-bullet, #header .hljs-addition, #footer .hljs-string, #footer .hljs-symbol, #footer .hljs-bullet, #footer .hljs-addition { - color: #b5bd68; -} -#header .hljs-title, #header .hljs-section, #footer .hljs-title, #footer .hljs-section { - color: #81a2be; -} -#header .hljs-keyword, #header .hljs-selector-tag, #footer .hljs-keyword, #footer .hljs-selector-tag { - color: #b294bb; -} -#header .hljs, #footer .hljs { - font-family: monospace, serif; - display: inline; - border-radius: 3px; - padding: 0.1875rem 0.3125rem; - background: #ffffff; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); -} -#header pre .hljs, #footer pre .hljs { - display: block; - overflow-x: auto; - background: #1d1f21; - color: #c5c8c6; - padding: 1.25rem 1.875rem; - border-radius: 3px; -} -#header .hljs-emphasis, #footer .hljs-emphasis { - font-style: italic; -} -#header .hljs-strong, #footer .hljs-strong { - font-weight: bold; -} -#header #ds-objectives, #footer #ds-objectives { - background: #F3F8FB; - border: 1px solid #0073CF; - box-sizing: border-box; - border-radius: 3px; - padding: 0.75rem 0.9375rem; - margin: 1.875rem 0; -} -@media (min-width: 992px) { - #header #ds-objectives, #footer #ds-objectives { - padding: 1.5rem 1.875rem; - margin: 3.75rem 0; - } -} -#header #ds-objectives h3, #footer #ds-objectives h3 { - font-weight: bold; - letter-spacing: 0.2em; - text-transform: uppercase; - color: #000; - margin: 1.125rem 0 0.25rem 0; -} -@media (min-width: 0px) { - #header #ds-objectives h3, #footer #ds-objectives h3 { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header #ds-objectives h3, #footer #ds-objectives h3 { - font-size: 0.8125rem; - } -} -#header #ds-objectives h3:first-child, #footer #ds-objectives h3:first-child { - margin-top: 0; -} -#header #ds-objectives h2:first-child, #footer #ds-objectives h2:first-child { - margin-top: 0; -} -#header .link--button.link--arrow, #footer .link--button.link--arrow { - display: inline-block; - border: 1px solid #0073CF; - border-radius: 2px; - font-weight: bold; - line-height: 24px; - letter-spacing: 0.1em; - text-transform: uppercase; - text-decoration: none; - color: #0073CF; - margin: 1.875rem 0 0 0; - transition: all 0.25s; - padding: 0.5625rem 2.25rem 0.5625rem 1.125rem; -} -@media (min-width: 0px) { - #header .link--button.link--arrow, #footer .link--button.link--arrow { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header .link--button.link--arrow, #footer .link--button.link--arrow { - font-size: 0.8125rem; - } -} -@media (min-width: 992px) { - #header .link--button.link--arrow, #footer .link--button.link--arrow { - padding: 0.75rem 2.25rem 0.75rem 1.125rem; - } -} -#header .link--button.link--arrow svg, #footer .link--button.link--arrow svg { - transform: translateX(10px); - transition: all 0.25s; -} -#header .link--button.link--arrow svg .line, #footer .link--button.link--arrow svg .line { - stroke-dasharray: 11; - stroke-dashoffset: 11; - animation: arrowOut 0.1s linear forwards; -} -#header .link--button.link--arrow:hover, #header .link--button.link--arrow:active, #header .link--button.link--arrow:focus, #footer .link--button.link--arrow:hover, #footer .link--button.link--arrow:active, #footer .link--button.link--arrow:focus { - border: 1px solid #0092E2; - color: #0092E2; - transition: all 0.25s; - text-decoration: underline; -} -#header .link--button.link--arrow:hover svg, #header .link--button.link--arrow:active svg, #header .link--button.link--arrow:focus svg, #footer .link--button.link--arrow:hover svg, #footer .link--button.link--arrow:active svg, #footer .link--button.link--arrow:focus svg { - transform: translateX(15px); - transition: all 0.25s; -} -#header .link--button.link--arrow:hover svg .line, #header .link--button.link--arrow:active svg .line, #header .link--button.link--arrow:focus svg .line, #footer .link--button.link--arrow:hover svg .line, #footer .link--button.link--arrow:active svg .line, #footer .link--button.link--arrow:focus svg .line { - animation: arrowIn 0.15s linear forwards; -} -#header .link--button.link--arrow:hover svg path, #header .link--button.link--arrow:active svg path, #header .link--button.link--arrow:focus svg path, #footer .link--button.link--arrow:hover svg path, #footer .link--button.link--arrow:active svg path, #footer .link--button.link--arrow:focus svg path { - stroke: #0092E2; -} -#header .link--button.link--arrow.solid, #footer .link--button.link--arrow.solid { - background: #0073CF; - color: #fff; -} -#header .link--button.link--arrow.solid svg path, #footer .link--button.link--arrow.solid svg path { - stroke: #fff; -} -#header .link--button.link--arrow.no-borders, #footer .link--button.link--arrow.no-borders { - border: none; - padding: 0; - margin: 0; -} -#header #ds-challenge, #footer #ds-challenge { - background: rgba(85, 136, 7, 0.15); - border: 1px solid #558807; - box-sizing: border-box; - border-radius: 3px; - padding: 0.75rem 0.9375rem; - margin: 1.875rem 0; -} -@media (min-width: 992px) { - #header #ds-challenge, #footer #ds-challenge { - padding: 1.5rem 1.875rem; - margin: 3.75rem 0; - } -} -#header #ds-challenge h3, #footer #ds-challenge h3 { - font-weight: bold; - letter-spacing: 0.2em; - text-transform: uppercase; - color: #000; - margin: 1.125rem 0 0.25rem 0; -} -@media (min-width: 0px) { - #header #ds-challenge h3, #footer #ds-challenge h3 { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header #ds-challenge h3, #footer #ds-challenge h3 { - font-size: 0.8125rem; - } -} -#header #ds-challenge h3:first-child, #footer #ds-challenge h3:first-child { - margin-top: 0; -} -#header #ds-challenge h2:first-child, #footer #ds-challenge h2:first-child { - margin-top: 0; -} -#header #ds-dataTip, #footer #ds-dataTip { - background: #F5F6F7; - border: 1px solid #D7D9D9; - box-sizing: border-box; - border-radius: 3px; - padding: 0.75rem 0.9375rem; - margin: 1.875rem 0; -} -@media (min-width: 992px) { - #header #ds-dataTip, #footer #ds-dataTip { - padding: 1.5rem 1.875rem; - margin: 3.75rem 0; - } -} -#header #ds-dataTip h3, #footer #ds-dataTip h3 { - font-weight: bold; - letter-spacing: 0.2em; - text-transform: uppercase; - color: #000; - margin: 1.125rem 0 0.25rem 0; -} -@media (min-width: 0px) { - #header #ds-dataTip h3, #footer #ds-dataTip h3 { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header #ds-dataTip h3, #footer #ds-dataTip h3 { - font-size: 0.8125rem; - } -} -#header #ds-dataTip h3:first-child, #footer #ds-dataTip h3:first-child { - margin-top: 0; -} -#header #ds-dataTip h2:first-child, #footer #ds-dataTip h2:first-child { - margin-top: 0; -} -#header .field--name-field-display-mode.field--widget-entity-display-mode-select, -#header .field--type-entity-reference.field--name-field-image, -#header .field-group-html-element.other-content, -#header .js-form-item.js-form-type-vertical-tabs, -#header #edit-footer + #edit-actions, -#header .erl-disabled-items, -#header .entity-content-form-footer.form-wrapper, -#header form.node-update-form, -#header form.node-form:not(.node-page-edit-form), -#header form.node-confirm-form.confirmation, #footer .field--name-field-display-mode.field--widget-entity-display-mode-select, -#footer .field--type-entity-reference.field--name-field-image, -#footer .field-group-html-element.other-content, -#footer .js-form-item.js-form-type-vertical-tabs, -#footer #edit-footer + #edit-actions, -#footer .erl-disabled-items, -#footer .entity-content-form-footer.form-wrapper, -#footer form.node-update-form, -#footer form.node-form:not(.node-page-edit-form), -#footer form.node-confirm-form.confirmation { - margin-left: auto; - margin-right: auto; - max-width: 1380px; - padding-left: 1.875rem; - padding-right: 1.875rem; -} -@media (min-width: 992px) { - #header .field--name-field-display-mode.field--widget-entity-display-mode-select, - #header .field--type-entity-reference.field--name-field-image, - #header .field-group-html-element.other-content, - #header .js-form-item.js-form-type-vertical-tabs, - #header #edit-footer + #edit-actions, - #header .erl-disabled-items, - #header .entity-content-form-footer.form-wrapper, - #header form.node-update-form, - #header form.node-form:not(.node-page-edit-form), - #header form.node-confirm-form.confirmation, #footer .field--name-field-display-mode.field--widget-entity-display-mode-select, - #footer .field--type-entity-reference.field--name-field-image, - #footer .field-group-html-element.other-content, - #footer .js-form-item.js-form-type-vertical-tabs, - #footer #edit-footer + #edit-actions, - #footer .erl-disabled-items, - #footer .entity-content-form-footer.form-wrapper, - #footer form.node-update-form, - #footer form.node-form:not(.node-page-edit-form), - #footer form.node-confirm-form.confirmation { - padding-left: 3.125rem; - padding-right: 3.125rem; - } -} -#header #edit-footer + #edit-actions, -#header #node-page-edit-form > #edit-actions, -#header form.node-confirm-form.confirmation #edit-actions, #footer #edit-footer + #edit-actions, -#footer #node-page-edit-form > #edit-actions, -#footer form.node-confirm-form.confirmation #edit-actions { - margin-bottom: 1.875rem; -} -@media (min-width: 992px) { - #header #edit-footer + #edit-actions, - #header #node-page-edit-form > #edit-actions, - #header form.node-confirm-form.confirmation #edit-actions, #footer #edit-footer + #edit-actions, - #footer #node-page-edit-form > #edit-actions, - #footer form.node-confirm-form.confirmation #edit-actions { - margin-bottom: 3.75rem; - } -} -#header form.node-form .erl-item fieldset:not(.fieldgroup), #footer form.node-form .erl-item fieldset:not(.fieldgroup) { - margin: 0; - padding: 0; -} -#header form.node-form .erl-item .l--offset, #footer form.node-form .erl-item .l--offset { - padding: 0; -} -#header #node-page-edit-form .paragraphs-dropdown-action.button, -#header #node-page-form .paragraphs-dropdown-action.button, -#header form.node-update-form .paragraphs-dropdown-action.button, -#header form.node-form .paragraphs-dropdown-action.button, #footer #node-page-edit-form .paragraphs-dropdown-action.button, -#footer #node-page-form .paragraphs-dropdown-action.button, -#footer form.node-update-form .paragraphs-dropdown-action.button, -#footer form.node-form .paragraphs-dropdown-action.button { - color: #141516; -} -#header #node-page-edit-form .field--widget-paragraphs td, -#header #node-page-form .field--widget-paragraphs td, -#header form.node-update-form .field--widget-paragraphs td, -#header form.node-form .field--widget-paragraphs td, #footer #node-page-edit-form .field--widget-paragraphs td, -#footer #node-page-form .field--widget-paragraphs td, -#footer form.node-update-form .field--widget-paragraphs td, -#footer form.node-form .field--widget-paragraphs td { - padding: 0.75rem 1.125rem; -} -@media (min-width: 0px) { - #header #node-page-edit-form .field--widget-paragraphs .form-wrapper > h4, - #header #node-page-form .field--widget-paragraphs .form-wrapper > h4, - #header form.node-update-form .field--widget-paragraphs .form-wrapper > h4, - #header form.node-form .field--widget-paragraphs .form-wrapper > h4, #footer #node-page-edit-form .field--widget-paragraphs .form-wrapper > h4, - #footer #node-page-form .field--widget-paragraphs .form-wrapper > h4, - #footer form.node-update-form .field--widget-paragraphs .form-wrapper > h4, - #footer form.node-form .field--widget-paragraphs .form-wrapper > h4 { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header #node-page-edit-form .field--widget-paragraphs .form-wrapper > h4, - #header #node-page-form .field--widget-paragraphs .form-wrapper > h4, - #header form.node-update-form .field--widget-paragraphs .form-wrapper > h4, - #header form.node-form .field--widget-paragraphs .form-wrapper > h4, #footer #node-page-edit-form .field--widget-paragraphs .form-wrapper > h4, - #footer #node-page-form .field--widget-paragraphs .form-wrapper > h4, - #footer form.node-update-form .field--widget-paragraphs .form-wrapper > h4, - #footer form.node-form .field--widget-paragraphs .form-wrapper > h4 { - font-size: 1rem; - } -} -@media (min-width: 0px) { - #header #node-page-edit-form li, - #header #node-page-form li, - #header form.node-update-form li, - #header form.node-form li, #footer #node-page-edit-form li, - #footer #node-page-form li, - #footer form.node-update-form li, - #footer form.node-form li { - font-size: 0.9375rem; - } -} -@media (min-width: 600px) { - #header #node-page-edit-form li, - #header #node-page-form li, - #header form.node-update-form li, - #header form.node-form li, #footer #node-page-edit-form li, - #footer #node-page-form li, - #footer form.node-update-form li, - #footer form.node-form li { - font-size: 1rem; - } -} -#header #node-page-edit-form .field--name-field-content fieldset.erl-field > legend, -#header #node-page-form .field--name-field-content fieldset.erl-field > legend, -#header form.node-update-form .field--name-field-content fieldset.erl-field > legend, -#header form.node-form .field--name-field-content fieldset.erl-field > legend, #footer #node-page-edit-form .field--name-field-content fieldset.erl-field > legend, -#footer #node-page-form .field--name-field-content fieldset.erl-field > legend, -#footer form.node-update-form .field--name-field-content fieldset.erl-field > legend, -#footer form.node-form .field--name-field-content fieldset.erl-field > legend { - display: none; -} -#header #node-page-edit-form fieldset.erl-field, -#header #node-page-form fieldset.erl-field, -#header form.node-update-form fieldset.erl-field, -#header form.node-form fieldset.erl-field, #footer #node-page-edit-form fieldset.erl-field, -#footer #node-page-form fieldset.erl-field, -#footer form.node-update-form fieldset.erl-field, -#footer form.node-form fieldset.erl-field { - background: none; - padding: 0; - margin: 0; -} -#header #node-page-edit-form fieldset.erl-field .erl-layout .erl-item, #header #node-page-edit-form fieldset.erl-field .erl-disabled-items .erl-item, -#header #node-page-form fieldset.erl-field .erl-layout .erl-item, -#header #node-page-form fieldset.erl-field .erl-disabled-items .erl-item, -#header form.node-update-form fieldset.erl-field .erl-layout .erl-item, -#header form.node-update-form fieldset.erl-field .erl-disabled-items .erl-item, -#header form.node-form fieldset.erl-field .erl-layout .erl-item, -#header form.node-form fieldset.erl-field .erl-disabled-items .erl-item, #footer #node-page-edit-form fieldset.erl-field .erl-layout .erl-item, #footer #node-page-edit-form fieldset.erl-field .erl-disabled-items .erl-item, -#footer #node-page-form fieldset.erl-field .erl-layout .erl-item, -#footer #node-page-form fieldset.erl-field .erl-disabled-items .erl-item, -#footer form.node-update-form fieldset.erl-field .erl-layout .erl-item, -#footer form.node-update-form fieldset.erl-field .erl-disabled-items .erl-item, -#footer form.node-form fieldset.erl-field .erl-layout .erl-item, -#footer form.node-form fieldset.erl-field .erl-disabled-items .erl-item { - padding: 0; -} -#header #node-page-edit-form fieldset.erl-field .erl-layout-region, -#header #node-page-form fieldset.erl-field .erl-layout-region, -#header form.node-update-form fieldset.erl-field .erl-layout-region, -#header form.node-form fieldset.erl-field .erl-layout-region, #footer #node-page-edit-form fieldset.erl-field .erl-layout-region, -#footer #node-page-form fieldset.erl-field .erl-layout-region, -#footer form.node-update-form fieldset.erl-field .erl-layout-region, -#footer form.node-form fieldset.erl-field .erl-layout-region { - padding: 0; -} -#header #node-page-edit-form fieldset.erl-field .erl-item:hover > .layout-controls, #header #node-page-edit-form fieldset.erl-field .erl-item:hover > .erl-actions, -#header #node-page-form fieldset.erl-field .erl-item:hover > .layout-controls, -#header #node-page-form fieldset.erl-field .erl-item:hover > .erl-actions, -#header form.node-update-form fieldset.erl-field .erl-item:hover > .layout-controls, -#header form.node-update-form fieldset.erl-field .erl-item:hover > .erl-actions, -#header form.node-form fieldset.erl-field .erl-item:hover > .layout-controls, -#header form.node-form fieldset.erl-field .erl-item:hover > .erl-actions, #footer #node-page-edit-form fieldset.erl-field .erl-item:hover > .layout-controls, #footer #node-page-edit-form fieldset.erl-field .erl-item:hover > .erl-actions, -#footer #node-page-form fieldset.erl-field .erl-item:hover > .layout-controls, -#footer #node-page-form fieldset.erl-field .erl-item:hover > .erl-actions, -#footer form.node-update-form fieldset.erl-field .erl-item:hover > .layout-controls, -#footer form.node-update-form fieldset.erl-field .erl-item:hover > .erl-actions, -#footer form.node-form fieldset.erl-field .erl-item:hover > .layout-controls, -#footer form.node-form fieldset.erl-field .erl-item:hover > .erl-actions { - background: #f5f5f3; - z-index: 2; -} -#header #node-page-edit-form fieldset.erl-field .erl-layout.erl-item::before, -#header #node-page-form fieldset.erl-field .erl-layout.erl-item::before, -#header form.node-update-form fieldset.erl-field .erl-layout.erl-item::before, -#header form.node-form fieldset.erl-field .erl-layout.erl-item::before, #footer #node-page-edit-form fieldset.erl-field .erl-layout.erl-item::before, -#footer #node-page-form fieldset.erl-field .erl-layout.erl-item::before, -#footer form.node-update-form fieldset.erl-field .erl-layout.erl-item::before, -#footer form.node-form fieldset.erl-field .erl-layout.erl-item::before { - display: none; -} -#header #node-page-edit-form fieldset.erl-field .erl-layout-wrapper, -#header #node-page-edit-form fieldset.erl-field .erl-layout-wrapper:first-child .layout, -#header #node-page-form fieldset.erl-field .erl-layout-wrapper, -#header #node-page-form fieldset.erl-field .erl-layout-wrapper:first-child .layout, -#header form.node-update-form fieldset.erl-field .erl-layout-wrapper, -#header form.node-update-form fieldset.erl-field .erl-layout-wrapper:first-child .layout, -#header form.node-form fieldset.erl-field .erl-layout-wrapper, -#header form.node-form fieldset.erl-field .erl-layout-wrapper:first-child .layout, #footer #node-page-edit-form fieldset.erl-field .erl-layout-wrapper, -#footer #node-page-edit-form fieldset.erl-field .erl-layout-wrapper:first-child .layout, -#footer #node-page-form fieldset.erl-field .erl-layout-wrapper, -#footer #node-page-form fieldset.erl-field .erl-layout-wrapper:first-child .layout, -#footer form.node-update-form fieldset.erl-field .erl-layout-wrapper, -#footer form.node-update-form fieldset.erl-field .erl-layout-wrapper:first-child .layout, -#footer form.node-form fieldset.erl-field .erl-layout-wrapper, -#footer form.node-form fieldset.erl-field .erl-layout-wrapper:first-child .layout { - margin-top: 0; -} -#header #node-page-edit-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#header #node-page-edit-form fieldset.erl-field .erl-layout, -#header #node-page-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#header #node-page-form fieldset.erl-field .erl-layout, -#header form.node-update-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#header form.node-update-form fieldset.erl-field .erl-layout, -#header form.node-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#header form.node-form fieldset.erl-field .erl-layout, #footer #node-page-edit-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#footer #node-page-edit-form fieldset.erl-field .erl-layout, -#footer #node-page-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#footer #node-page-form fieldset.erl-field .erl-layout, -#footer form.node-update-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#footer form.node-update-form fieldset.erl-field .erl-layout, -#footer form.node-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout, -#footer form.node-form fieldset.erl-field .erl-layout { - padding-top: 0; -} -#header #node-page-edit-form .other-content, -#header #node-page-edit-form .js-form-type-vertical-tabs, -#header #node-page-edit-form .entity-content-form-footer, -#header #node-page-edit-form #edit-field-image-wrapper, -#header #node-page-edit-form #edit-field-display-mode-wrapper, -#header #node-page-form .other-content, -#header #node-page-form .js-form-type-vertical-tabs, -#header #node-page-form .entity-content-form-footer, -#header #node-page-form #edit-field-image-wrapper, -#header #node-page-form #edit-field-display-mode-wrapper, -#header form.node-update-form .other-content, -#header form.node-update-form .js-form-type-vertical-tabs, -#header form.node-update-form .entity-content-form-footer, -#header form.node-update-form #edit-field-image-wrapper, -#header form.node-update-form #edit-field-display-mode-wrapper, -#header form.node-form .other-content, -#header form.node-form .js-form-type-vertical-tabs, -#header form.node-form .entity-content-form-footer, -#header form.node-form #edit-field-image-wrapper, -#header form.node-form #edit-field-display-mode-wrapper, #footer #node-page-edit-form .other-content, -#footer #node-page-edit-form .js-form-type-vertical-tabs, -#footer #node-page-edit-form .entity-content-form-footer, -#footer #node-page-edit-form #edit-field-image-wrapper, -#footer #node-page-edit-form #edit-field-display-mode-wrapper, -#footer #node-page-form .other-content, -#footer #node-page-form .js-form-type-vertical-tabs, -#footer #node-page-form .entity-content-form-footer, -#footer #node-page-form #edit-field-image-wrapper, -#footer #node-page-form #edit-field-display-mode-wrapper, -#footer form.node-update-form .other-content, -#footer form.node-update-form .js-form-type-vertical-tabs, -#footer form.node-update-form .entity-content-form-footer, -#footer form.node-update-form #edit-field-image-wrapper, -#footer form.node-update-form #edit-field-display-mode-wrapper, -#footer form.node-form .other-content, -#footer form.node-form .js-form-type-vertical-tabs, -#footer form.node-form .entity-content-form-footer, -#footer form.node-form #edit-field-image-wrapper, -#footer form.node-form #edit-field-display-mode-wrapper { - margin: 1.875rem auto; - max-width: 1380px; - padding-left: 1.875rem; - padding-right: 1.875rem; -} -@media (min-width: 992px) { - #header #node-page-edit-form .other-content, - #header #node-page-edit-form .js-form-type-vertical-tabs, - #header #node-page-edit-form .entity-content-form-footer, - #header #node-page-edit-form #edit-field-image-wrapper, - #header #node-page-edit-form #edit-field-display-mode-wrapper, - #header #node-page-form .other-content, - #header #node-page-form .js-form-type-vertical-tabs, - #header #node-page-form .entity-content-form-footer, - #header #node-page-form #edit-field-image-wrapper, - #header #node-page-form #edit-field-display-mode-wrapper, - #header form.node-update-form .other-content, - #header form.node-update-form .js-form-type-vertical-tabs, - #header form.node-update-form .entity-content-form-footer, - #header form.node-update-form #edit-field-image-wrapper, - #header form.node-update-form #edit-field-display-mode-wrapper, - #header form.node-form .other-content, - #header form.node-form .js-form-type-vertical-tabs, - #header form.node-form .entity-content-form-footer, - #header form.node-form #edit-field-image-wrapper, - #header form.node-form #edit-field-display-mode-wrapper, #footer #node-page-edit-form .other-content, - #footer #node-page-edit-form .js-form-type-vertical-tabs, - #footer #node-page-edit-form .entity-content-form-footer, - #footer #node-page-edit-form #edit-field-image-wrapper, - #footer #node-page-edit-form #edit-field-display-mode-wrapper, - #footer #node-page-form .other-content, - #footer #node-page-form .js-form-type-vertical-tabs, - #footer #node-page-form .entity-content-form-footer, - #footer #node-page-form #edit-field-image-wrapper, - #footer #node-page-form #edit-field-display-mode-wrapper, - #footer form.node-update-form .other-content, - #footer form.node-update-form .js-form-type-vertical-tabs, - #footer form.node-update-form .entity-content-form-footer, - #footer form.node-update-form #edit-field-image-wrapper, - #footer form.node-update-form #edit-field-display-mode-wrapper, - #footer form.node-form .other-content, - #footer form.node-form .js-form-type-vertical-tabs, - #footer form.node-form .entity-content-form-footer, - #footer form.node-form #edit-field-image-wrapper, - #footer form.node-form #edit-field-display-mode-wrapper { - margin: 3.75rem auto; - padding-left: 3.125rem; - padding-right: 3.125rem; - } -} -#header #node-page-edit-form .button + .button, -#header #node-page-form .button + .button, -#header form.node-update-form .button + .button, -#header form.node-form .button + .button, #footer #node-page-edit-form .button + .button, -#footer #node-page-form .button + .button, -#footer form.node-update-form .button + .button, -#footer form.node-form .button + .button { - margin-left: 0.75rem; -} -#header #node-page-edit-form a.button--danger, -#header #node-page-edit-form button.button--danger, -#header #node-page-form a.button--danger, -#header #node-page-form button.button--danger, -#header form.node-update-form a.button--danger, -#header form.node-update-form button.button--danger, -#header form.node-form a.button--danger, -#header form.node-form button.button--danger, #footer #node-page-edit-form a.button--danger, -#footer #node-page-edit-form button.button--danger, -#footer #node-page-form a.button--danger, -#footer #node-page-form button.button--danger, -#footer form.node-update-form a.button--danger, -#footer form.node-update-form button.button--danger, -#footer form.node-form a.button--danger, -#footer form.node-form button.button--danger { - background: #D7D9D9; - color: #565A5C; - border: 1px solid #D7D9D9; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25), 0px 1px 1px rgba(0, 0, 0, 0.25); - border-radius: 2px; - font-weight: bold; - font-size: 13px; - letter-spacing: 0.1em; - text-transform: uppercase; - padding: 0.75rem 1.125rem; - -webkit-appearance: none; - transition: all 0.25s; - text-decoration: none; -} -#header #node-page-edit-form a.button--danger:hover, -#header #node-page-edit-form button.button--danger:hover, -#header #node-page-form a.button--danger:hover, -#header #node-page-form button.button--danger:hover, -#header form.node-update-form a.button--danger:hover, -#header form.node-update-form button.button--danger:hover, -#header form.node-form a.button--danger:hover, -#header form.node-form button.button--danger:hover, #footer #node-page-edit-form a.button--danger:hover, -#footer #node-page-edit-form button.button--danger:hover, -#footer #node-page-form a.button--danger:hover, -#footer #node-page-form button.button--danger:hover, -#footer form.node-update-form a.button--danger:hover, -#footer form.node-update-form button.button--danger:hover, -#footer form.node-form a.button--danger:hover, -#footer form.node-form button.button--danger:hover { - background: #F5F6F7; - transition: all 0.45s; - color: #565A5C; -} -#header #node-page-edit-form .filter-wrapper, -#header #node-page-form .filter-wrapper, -#header form.node-update-form .filter-wrapper, -#header form.node-form .filter-wrapper, #footer #node-page-edit-form .filter-wrapper, -#footer #node-page-form .filter-wrapper, -#footer form.node-update-form .filter-wrapper, -#footer form.node-form .filter-wrapper { - border-top: 1px solid #D7D9D9; -} -#header #node-page-edit-form textarea.text-full.form-textarea, -#header #node-page-edit-form input.form-autocomplete, -#header #node-page-form textarea.text-full.form-textarea, -#header #node-page-form input.form-autocomplete, -#header form.node-update-form textarea.text-full.form-textarea, -#header form.node-update-form input.form-autocomplete, -#header form.node-form textarea.text-full.form-textarea, -#header form.node-form input.form-autocomplete, #footer #node-page-edit-form textarea.text-full.form-textarea, -#footer #node-page-edit-form input.form-autocomplete, -#footer #node-page-form textarea.text-full.form-textarea, -#footer #node-page-form input.form-autocomplete, -#footer form.node-update-form textarea.text-full.form-textarea, -#footer form.node-update-form input.form-autocomplete, -#footer form.node-form textarea.text-full.form-textarea, -#footer form.node-form input.form-autocomplete { - width: 100%; - box-sizing: border-box; -} -#header #node-page-edit-form table.field-multiple-table th h4, -#header #node-page-form table.field-multiple-table th h4, -#header form.node-update-form table.field-multiple-table th h4, -#header form.node-form table.field-multiple-table th h4, #footer #node-page-edit-form table.field-multiple-table th h4, -#footer #node-page-form table.field-multiple-table th h4, -#footer form.node-update-form table.field-multiple-table th h4, -#footer form.node-form table.field-multiple-table th h4 { - color: #fff; - letter-spacing: 0.2em; - text-transform: uppercase; - background: #0073CF; - margin: 0; -} -@media (min-width: 0px) { - #header #node-page-edit-form table.field-multiple-table th h4, - #header #node-page-form table.field-multiple-table th h4, - #header form.node-update-form table.field-multiple-table th h4, - #header form.node-form table.field-multiple-table th h4, #footer #node-page-edit-form table.field-multiple-table th h4, - #footer #node-page-form table.field-multiple-table th h4, - #footer form.node-update-form table.field-multiple-table th h4, - #footer form.node-form table.field-multiple-table th h4 { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header #node-page-edit-form table.field-multiple-table th h4, - #header #node-page-form table.field-multiple-table th h4, - #header form.node-update-form table.field-multiple-table th h4, - #header form.node-form table.field-multiple-table th h4, #footer #node-page-edit-form table.field-multiple-table th h4, - #footer #node-page-form table.field-multiple-table th h4, - #footer form.node-update-form table.field-multiple-table th h4, - #footer form.node-form table.field-multiple-table th h4 { - font-size: 0.8125rem; - } -} -#header #node-page-edit-form .vertical-tabs .entity-meta.vertical-tabs__panes, -#header #node-page-form .vertical-tabs .entity-meta.vertical-tabs__panes, -#header form.node-update-form .vertical-tabs .entity-meta.vertical-tabs__panes, -#header form.node-form .vertical-tabs .entity-meta.vertical-tabs__panes, #footer #node-page-edit-form .vertical-tabs .entity-meta.vertical-tabs__panes, -#footer #node-page-form .vertical-tabs .entity-meta.vertical-tabs__panes, -#footer form.node-update-form .vertical-tabs .entity-meta.vertical-tabs__panes, -#footer form.node-form .vertical-tabs .entity-meta.vertical-tabs__panes { - padding: 1.25rem; -} -#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, -#header #node-page-form .vertical-tabs .vertical-tabs__menu-item, -#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item, -#header form.node-form .vertical-tabs .vertical-tabs__menu-item, #footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, -#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item, -#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item, -#footer form.node-form .vertical-tabs .vertical-tabs__menu-item { - font-size: 1rem; - background-color: #F5F6F7; -} -@media (min-width: 37.5em) { - #header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, - #header #node-page-form .vertical-tabs .vertical-tabs__menu-item, - #header form.node-update-form .vertical-tabs .vertical-tabs__menu-item, - #header form.node-form .vertical-tabs .vertical-tabs__menu-item, #footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, - #footer #node-page-form .vertical-tabs .vertical-tabs__menu-item, - #footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item, - #footer form.node-form .vertical-tabs .vertical-tabs__menu-item { - font-size: 1rem; - } -} -@media (min-width: 48em) { - #header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, - #header #node-page-form .vertical-tabs .vertical-tabs__menu-item, - #header form.node-update-form .vertical-tabs .vertical-tabs__menu-item, - #header form.node-form .vertical-tabs .vertical-tabs__menu-item, #footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, - #footer #node-page-form .vertical-tabs .vertical-tabs__menu-item, - #footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item, - #footer form.node-form .vertical-tabs .vertical-tabs__menu-item { - font-size: 0.9rem; - } -} -@media (min-width: 64em) { - #header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, - #header #node-page-form .vertical-tabs .vertical-tabs__menu-item, - #header form.node-update-form .vertical-tabs .vertical-tabs__menu-item, - #header form.node-form .vertical-tabs .vertical-tabs__menu-item, #footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item, - #footer #node-page-form .vertical-tabs .vertical-tabs__menu-item, - #footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item, - #footer form.node-form .vertical-tabs .vertical-tabs__menu-item { - font-size: 0.9rem; - } -} -#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item a, -#header #node-page-form .vertical-tabs .vertical-tabs__menu-item a, -#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item a, -#header form.node-form .vertical-tabs .vertical-tabs__menu-item a, #footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item a, -#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item a, -#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item a, -#footer form.node-form .vertical-tabs .vertical-tabs__menu-item a { - color: #777277; - padding: 1.125rem; -} -#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item.is-selected, -#header #node-page-form .vertical-tabs .vertical-tabs__menu-item.is-selected, -#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item.is-selected, -#header form.node-form .vertical-tabs .vertical-tabs__menu-item.is-selected, #footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item.is-selected, -#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item.is-selected, -#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item.is-selected, -#footer form.node-form .vertical-tabs .vertical-tabs__menu-item.is-selected { - border-right-width: 0; - background-color: #fff; -} -#header #node-page-edit-form .erl-layout-select .fieldset-wrapper > div, -#header #node-page-form .erl-layout-select .fieldset-wrapper > div, -#header form.node-update-form .erl-layout-select .fieldset-wrapper > div, -#header form.node-form .erl-layout-select .fieldset-wrapper > div, #footer #node-page-edit-form .erl-layout-select .fieldset-wrapper > div, -#footer #node-page-form .erl-layout-select .fieldset-wrapper > div, -#footer form.node-update-form .erl-layout-select .fieldset-wrapper > div, -#footer form.node-form .erl-layout-select .fieldset-wrapper > div { - display: flex; - flex-wrap: wrap; - align-content: flex-start; -} -#header #node-page-edit-form .erl-field .layout-radio-item .layout-icon-wrapper, -#header #node-page-form .erl-field .layout-radio-item .layout-icon-wrapper, -#header form.node-update-form .erl-field .layout-radio-item .layout-icon-wrapper, -#header form.node-form .erl-field .layout-radio-item .layout-icon-wrapper, #footer #node-page-edit-form .erl-field .layout-radio-item .layout-icon-wrapper, -#footer #node-page-form .erl-field .layout-radio-item .layout-icon-wrapper, -#footer form.node-update-form .erl-field .layout-radio-item .layout-icon-wrapper, -#footer form.node-form .erl-field .layout-radio-item .layout-icon-wrapper { - margin-top: 20px; -} -#header #node-page-edit-form details, -#header #node-page-form details, -#header form.node-update-form details, -#header form.node-form details, #footer #node-page-edit-form details, -#footer #node-page-form details, -#footer form.node-update-form details, -#footer form.node-form details { - margin-top: 1em; - margin-bottom: 1em; - border: 1px solid #bfbfbf; - border-radius: 3px; - background-color: #fcfcfa; - padding: 0.95em 1.45em; -} -#header #node-page-edit-form details summary, -#header #node-page-form details summary, -#header form.node-update-form details summary, -#header form.node-form details summary, #footer #node-page-edit-form details summary, -#footer #node-page-form details summary, -#footer form.node-update-form details summary, -#footer form.node-form details summary { - cursor: pointer; - color: #0074bd; - text-shadow: 0 1px 0 white; - text-transform: uppercase; - font-weight: bold; - display: block; - font-size: 0.8rem; -} -#header #node-page-edit-form details summary:focus, -#header #node-page-form details summary:focus, -#header form.node-update-form details summary:focus, -#header form.node-form details summary:focus, #footer #node-page-edit-form details summary:focus, -#footer #node-page-form details summary:focus, -#footer form.node-update-form details summary:focus, -#footer form.node-form details summary:focus { - color: #004f80; - text-decoration: underline; - outline: none; -} -#header #node-page-edit-form ul.tips, #header #node-page-edit-form div.description, #header #node-page-edit-form .form-item .description, -#header #node-page-form ul.tips, -#header #node-page-form div.description, -#header #node-page-form .form-item .description, -#header form.node-update-form ul.tips, -#header form.node-update-form div.description, -#header form.node-update-form .form-item .description, -#header form.node-form ul.tips, -#header form.node-form div.description, -#header form.node-form .form-item .description, #footer #node-page-edit-form ul.tips, #footer #node-page-edit-form div.description, #footer #node-page-edit-form .form-item .description, -#footer #node-page-form ul.tips, -#footer #node-page-form div.description, -#footer #node-page-form .form-item .description, -#footer form.node-update-form ul.tips, -#footer form.node-update-form div.description, -#footer form.node-update-form .form-item .description, -#footer form.node-form ul.tips, -#footer form.node-form div.description, -#footer form.node-form .form-item .description { - margin: 8px 0 0 0; - color: #595959; - font-size: 0.8rem; -} -#header #node-page-edit-form button.link.js-media-library-widget-toggle-weight, -#header #node-page-form button.link.js-media-library-widget-toggle-weight, -#header form.node-update-form button.link.js-media-library-widget-toggle-weight, -#header form.node-form button.link.js-media-library-widget-toggle-weight, #footer #node-page-edit-form button.link.js-media-library-widget-toggle-weight, -#footer #node-page-form button.link.js-media-library-widget-toggle-weight, -#footer form.node-update-form button.link.js-media-library-widget-toggle-weight, -#footer form.node-form button.link.js-media-library-widget-toggle-weight { - margin: 0; - padding: 0; - cursor: pointer; - border: 0; - background: transparent; - font-size: 0.9rem; - display: inline; - text-decoration: none; - color: #0074bd; - appearance: none; - position: absolute; - top: 20px; - right: 15px; -} -#header #node-page-edit-form fieldset:not(.fieldgroup):not(.erl-disabled-items), -#header #node-page-form fieldset:not(.fieldgroup):not(.erl-disabled-items), -#header form.node-update-form fieldset:not(.fieldgroup):not(.erl-disabled-items), -#header form.node-form fieldset:not(.fieldgroup):not(.erl-disabled-items), #footer #node-page-edit-form fieldset:not(.fieldgroup):not(.erl-disabled-items), -#footer #node-page-form fieldset:not(.fieldgroup):not(.erl-disabled-items), -#footer form.node-update-form fieldset:not(.fieldgroup):not(.erl-disabled-items), -#footer form.node-form fieldset:not(.fieldgroup):not(.erl-disabled-items) { - position: relative; - min-width: 0; - margin: 1em 0; - padding: 30px 18px 18px; - border-radius: 2px; -} -#header #node-page-edit-form .js-hide, -#header #node-page-form .js-hide, -#header form.node-update-form .js-hide, -#header form.node-form .js-hide, #footer #node-page-edit-form .js-hide, -#footer #node-page-form .js-hide, -#footer form.node-update-form .js-hide, -#footer form.node-form .js-hide { - display: none !important; -} -#header #node-page-edit-form tr.draggable td, -#header #node-page-form tr.draggable td, -#header form.node-update-form tr.draggable td, -#header form.node-form tr.draggable td, #footer #node-page-edit-form tr.draggable td, -#footer #node-page-form tr.draggable td, -#footer form.node-update-form tr.draggable td, -#footer form.node-form tr.draggable td { - font-size: 1rem; - vertical-align: middle; -} -#header #node-page-edit-form tr.draggable td a.tabledrag-handle, -#header #node-page-form tr.draggable td a.tabledrag-handle, -#header form.node-update-form tr.draggable td a.tabledrag-handle, -#header form.node-form tr.draggable td a.tabledrag-handle, #footer #node-page-edit-form tr.draggable td a.tabledrag-handle, -#footer #node-page-form tr.draggable td a.tabledrag-handle, -#footer form.node-update-form tr.draggable td a.tabledrag-handle, -#footer form.node-form tr.draggable td a.tabledrag-handle { - height: auto; -} -#header #node-page-edit-form tr.draggable td a.tabledrag-handle .handle, -#header #node-page-form tr.draggable td a.tabledrag-handle .handle, -#header form.node-update-form tr.draggable td a.tabledrag-handle .handle, -#header form.node-form tr.draggable td a.tabledrag-handle .handle, #footer #node-page-edit-form tr.draggable td a.tabledrag-handle .handle, -#footer #node-page-form tr.draggable td a.tabledrag-handle .handle, -#footer form.node-update-form tr.draggable td a.tabledrag-handle .handle, -#footer form.node-form tr.draggable td a.tabledrag-handle .handle { - height: 22px; -} -#header #node-page-edit-form .ui-dialog, -#header #node-page-form .ui-dialog, -#header form.node-update-form .ui-dialog, -#header form.node-form .ui-dialog, #footer #node-page-edit-form .ui-dialog, -#footer #node-page-form .ui-dialog, -#footer form.node-update-form .ui-dialog, -#footer form.node-form .ui-dialog { - box-shadow: 0 5px 60px rgba(19, 15, 19, 0.25), 0 1px 10px rgba(19, 15, 19, 0.5); - font-family: "IBM Plex Sans", Helvetica, "Helvetica Neue", Arial, sans-serif; - padding: 0; -} -#header #node-page-edit-form .ui-dialog .ui-dialog-titlebar, #header #node-page-edit-form .ui-draggable .ui-dialog-titlebar, -#header #node-page-form .ui-dialog .ui-dialog-titlebar, -#header #node-page-form .ui-draggable .ui-dialog-titlebar, -#header form.node-update-form .ui-dialog .ui-dialog-titlebar, -#header form.node-update-form .ui-draggable .ui-dialog-titlebar, -#header form.node-form .ui-dialog .ui-dialog-titlebar, -#header form.node-form .ui-draggable .ui-dialog-titlebar, #footer #node-page-edit-form .ui-dialog .ui-dialog-titlebar, #footer #node-page-edit-form .ui-draggable .ui-dialog-titlebar, -#footer #node-page-form .ui-dialog .ui-dialog-titlebar, -#footer #node-page-form .ui-draggable .ui-dialog-titlebar, -#footer form.node-update-form .ui-dialog .ui-dialog-titlebar, -#footer form.node-update-form .ui-draggable .ui-dialog-titlebar, -#footer form.node-form .ui-dialog .ui-dialog-titlebar, -#footer form.node-form .ui-draggable .ui-dialog-titlebar { - padding: 15px 30px; -} -#header #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close, -#header #node-page-form .ui-dialog .ui-dialog-titlebar-close, -#header form.node-update-form .ui-dialog .ui-dialog-titlebar-close, -#header form.node-form .ui-dialog .ui-dialog-titlebar-close, #footer #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close, -#footer #node-page-form .ui-dialog .ui-dialog-titlebar-close, -#footer form.node-update-form .ui-dialog .ui-dialog-titlebar-close, -#footer form.node-form .ui-dialog .ui-dialog-titlebar-close { - right: 30px; - top: 30px; - margin: 0; - padding: 0; - -webkit-transform: translate(50%, -50%); - transform: translate(50%, -50%); - background: none; - border: none; - height: 30px; - width: 30px; -} -#header #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close:hover, -#header #node-page-form .ui-dialog .ui-dialog-titlebar-close:hover, -#header form.node-update-form .ui-dialog .ui-dialog-titlebar-close:hover, -#header form.node-form .ui-dialog .ui-dialog-titlebar-close:hover, #footer #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close:hover, -#footer #node-page-form .ui-dialog .ui-dialog-titlebar-close:hover, -#footer form.node-update-form .ui-dialog .ui-dialog-titlebar-close:hover, -#footer form.node-form .ui-dialog .ui-dialog-titlebar-close:hover { - border: none; -} -#header #node-page-edit-form .ui-button .ui-icon, -#header #node-page-form .ui-button .ui-icon, -#header form.node-update-form .ui-button .ui-icon, -#header form.node-form .ui-button .ui-icon, #footer #node-page-edit-form .ui-button .ui-icon, -#footer #node-page-form .ui-button .ui-icon, -#footer form.node-update-form .ui-button .ui-icon, -#footer form.node-form .ui-button .ui-icon { - background: none; - height: 100%; - width: 100%; - margin: 0; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; - top: 0; - left: 0; -} -#header #node-page-edit-form .ui-button .ui-icon:before, -#header #node-page-form .ui-button .ui-icon:before, -#header form.node-update-form .ui-button .ui-icon:before, -#header form.node-form .ui-button .ui-icon:before, #footer #node-page-edit-form .ui-button .ui-icon:before, -#footer #node-page-form .ui-button .ui-icon:before, -#footer form.node-update-form .ui-button .ui-icon:before, -#footer form.node-form .ui-button .ui-icon:before { - content: ""; - height: 100%; - width: 2px; - position: absolute; - top: 0; - left: 50%; - margin-left: -1px; - background-color: #9d999d; -} -#header #node-page-edit-form .ui-button .ui-icon:after, -#header #node-page-form .ui-button .ui-icon:after, -#header form.node-update-form .ui-button .ui-icon:after, -#header form.node-form .ui-button .ui-icon:after, #footer #node-page-edit-form .ui-button .ui-icon:after, -#footer #node-page-form .ui-button .ui-icon:after, -#footer form.node-update-form .ui-button .ui-icon:after, -#footer form.node-form .ui-button .ui-icon:after { - content: ""; - height: 2px; - width: 100%; - position: absolute; - left: 0; - top: 50%; - margin-top: -1px; - background-color: #9d999d; -} -#header #node-page-edit-form .ui-button:hover .ui-icon, -#header #node-page-form .ui-button:hover .ui-icon, -#header form.node-update-form .ui-button:hover .ui-icon, -#header form.node-form .ui-button:hover .ui-icon, #footer #node-page-edit-form .ui-button:hover .ui-icon, -#footer #node-page-form .ui-button:hover .ui-icon, -#footer form.node-update-form .ui-button:hover .ui-icon, -#footer form.node-form .ui-button:hover .ui-icon { - background: none; -} -#header #node-page-edit-form .ui-button:hover .ui-icon:before, #header #node-page-edit-form .ui-button:hover .ui-icon:after, -#header #node-page-form .ui-button:hover .ui-icon:before, -#header #node-page-form .ui-button:hover .ui-icon:after, -#header form.node-update-form .ui-button:hover .ui-icon:before, -#header form.node-update-form .ui-button:hover .ui-icon:after, -#header form.node-form .ui-button:hover .ui-icon:before, -#header form.node-form .ui-button:hover .ui-icon:after, #footer #node-page-edit-form .ui-button:hover .ui-icon:before, #footer #node-page-edit-form .ui-button:hover .ui-icon:after, -#footer #node-page-form .ui-button:hover .ui-icon:before, -#footer #node-page-form .ui-button:hover .ui-icon:after, -#footer form.node-update-form .ui-button:hover .ui-icon:before, -#footer form.node-update-form .ui-button:hover .ui-icon:after, -#footer form.node-form .ui-button:hover .ui-icon:before, -#footer form.node-form .ui-button:hover .ui-icon:after { - background: #504b50; -} -#header #node-page-edit-form .ui-dialog .ui-dialog-title, -#header #node-page-form .ui-dialog .ui-dialog-title, -#header form.node-update-form .ui-dialog .ui-dialog-title, -#header form.node-form .ui-dialog .ui-dialog-title, #footer #node-page-edit-form .ui-dialog .ui-dialog-title, -#footer #node-page-form .ui-dialog .ui-dialog-title, -#footer form.node-update-form .ui-dialog .ui-dialog-title, -#footer form.node-form .ui-dialog .ui-dialog-title { - margin: 0; - line-height: 30px; -} -#header #node-page-edit-form .ui-dialog .ui-dialog-content, -#header #node-page-form .ui-dialog .ui-dialog-content, -#header form.node-update-form .ui-dialog .ui-dialog-content, -#header form.node-form .ui-dialog .ui-dialog-content, #footer #node-page-edit-form .ui-dialog .ui-dialog-content, -#footer #node-page-form .ui-dialog .ui-dialog-content, -#footer form.node-update-form .ui-dialog .ui-dialog-content, -#footer form.node-form .ui-dialog .ui-dialog-content { - padding: 30px; -} -#header #node-page-edit-form .ui-corner-all, #header #node-page-edit-form .ui-corner-bottom, #header #node-page-edit-form .ui-corner-left, #header #node-page-edit-form .ui-corner-bl, -#header #node-page-form .ui-corner-all, -#header #node-page-form .ui-corner-bottom, -#header #node-page-form .ui-corner-left, -#header #node-page-form .ui-corner-bl, -#header form.node-update-form .ui-corner-all, -#header form.node-update-form .ui-corner-bottom, -#header form.node-update-form .ui-corner-left, -#header form.node-update-form .ui-corner-bl, -#header form.node-form .ui-corner-all, -#header form.node-form .ui-corner-bottom, -#header form.node-form .ui-corner-left, -#header form.node-form .ui-corner-bl, #footer #node-page-edit-form .ui-corner-all, #footer #node-page-edit-form .ui-corner-bottom, #footer #node-page-edit-form .ui-corner-left, #footer #node-page-edit-form .ui-corner-bl, -#footer #node-page-form .ui-corner-all, -#footer #node-page-form .ui-corner-bottom, -#footer #node-page-form .ui-corner-left, -#footer #node-page-form .ui-corner-bl, -#footer form.node-update-form .ui-corner-all, -#footer form.node-update-form .ui-corner-bottom, -#footer form.node-update-form .ui-corner-left, -#footer form.node-update-form .ui-corner-bl, -#footer form.node-form .ui-corner-all, -#footer form.node-form .ui-corner-bottom, -#footer form.node-form .ui-corner-left, -#footer form.node-form .ui-corner-bl { - border: 0; - border-radius: 0; -} -#header #node-page-edit-form .ui-widget.ui-widget-content, -#header #node-page-form .ui-widget.ui-widget-content, -#header form.node-update-form .ui-widget.ui-widget-content, -#header form.node-form .ui-widget.ui-widget-content, #footer #node-page-edit-form .ui-widget.ui-widget-content, -#footer #node-page-form .ui-widget.ui-widget-content, -#footer form.node-update-form .ui-widget.ui-widget-content, -#footer form.node-form .ui-widget.ui-widget-content { - border: none; -} -#header #node-page-edit-form .horizontal-tabs, -#header #node-page-form .horizontal-tabs, -#header form.node-update-form .horizontal-tabs, -#header form.node-form .horizontal-tabs, #footer #node-page-edit-form .horizontal-tabs, -#footer #node-page-form .horizontal-tabs, -#footer form.node-update-form .horizontal-tabs, -#footer form.node-form .horizontal-tabs { - background: transparent; - border: none; - padding: 0; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list { - border-bottom: none; - margin: 0 -0.5rem; - padding: 0.5rem 0.5rem 0; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:before, #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list:before, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:before, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list:before, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list:after, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:before, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list:before, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:before, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list:before, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list:after { - content: " "; - display: table; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list:after, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list:after { - clear: both; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li { - display: block; - list-style: none; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li { - padding: 0; - float: left; - margin-right: 1px; - margin-bottom: 0; - margin-top: 0; - min-width: 0; - padding-left: 0; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li a, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li a, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li a, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li a { - display: block; - font-family: "IBM Plex Sans", Helvetica, "Helvetica Neue", Arial, sans-serif; - font-size: calc(13px + 2 * (100vw - 420px) / 860); - font-weight: 600; - letter-spacing: 0.05em; - padding: 0.5rem 1rem; - text-decoration: none; - text-transform: uppercase; - transition: all 0.15s ease-in-out; -} -@media screen and (min-width: 1280px) { - #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li a { - font-size: 15px; - } -} -@media screen and (max-width: 420px) { - #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li a, - #footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, - #footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li a { - font-size: 13px; - } -} -#header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a, -#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a, -#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a, -#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a, #footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a { - border-radius: 0; - background-color: #777277; - color: #e1e0e1; -} -#header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, #header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, -#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, -#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, -#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, #footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, #footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, -#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, -#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li.selected > a:hover, -#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list > li a:hover { - background-color: #9d999d; -} -#header #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a, -#header #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a, -#header form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a, -#header form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a, #footer #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a, -#footer form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a { - border-radius: 0; -} -#header #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#header #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#header form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#header form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, #footer #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#footer #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#footer form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover, -#footer form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a:hover { - background-color: #e1e0e1; -} -#header #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active, -#header #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active, -#header form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active, -#header form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active, #footer #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active, -#footer #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active, -#footer form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active, -#footer form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list > li a.is-active { - text-decoration: underline; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, #header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.selected > a, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li.is-active > a:hover { - background-color: #fff; - color: #261f26; -} -#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li:before, -#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li:before, -#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li:before, -#header form.node-form .horizontal-tabs ul.horizontal-tabs-list > li:before, #footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list > li:before, -#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list > li:before, -#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list > li:before, -#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list > li:before { - content: none; -} -#header #node-page-edit-form .horizontal-tabs .horizontal-tabs-pane, -#header #node-page-form .horizontal-tabs .horizontal-tabs-pane, -#header form.node-update-form .horizontal-tabs .horizontal-tabs-pane, -#header form.node-form .horizontal-tabs .horizontal-tabs-pane, #footer #node-page-edit-form .horizontal-tabs .horizontal-tabs-pane, -#footer #node-page-form .horizontal-tabs .horizontal-tabs-pane, -#footer form.node-update-form .horizontal-tabs .horizontal-tabs-pane, -#footer form.node-form .horizontal-tabs .horizontal-tabs-pane { - padding: 0; -} -#header #node-page-edit-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper, -#header #node-page-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper, -#header form.node-update-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper, -#header form.node-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper, #footer #node-page-edit-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper, -#footer #node-page-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper, -#footer form.node-update-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper, -#footer form.node-form .horizontal-tabs .horizontal-tabs-panes > details > .details-wrapper { - padding: 1.875rem 0; -} -#header #node-page-edit-form .entities-list .item-container, -#header #node-page-form .entities-list .item-container, -#header form.node-update-form .entities-list .item-container, -#header form.node-form .entities-list .item-container, #footer #node-page-edit-form .entities-list .item-container, -#footer #node-page-form .entities-list .item-container, -#footer form.node-update-form .entities-list .item-container, -#footer form.node-form .entities-list .item-container { - display: flex; - flex-wrap: wrap; - width: 40%; -} -#header #node-page-edit-form .entities-list .item-container figure, -#header #node-page-form .entities-list .item-container figure, -#header form.node-update-form .entities-list .item-container figure, -#header form.node-form .entities-list .item-container figure, #footer #node-page-edit-form .entities-list .item-container figure, -#footer #node-page-form .entities-list .item-container figure, -#footer form.node-update-form .entities-list .item-container figure, -#footer form.node-form .entities-list .item-container figure { - width: 100%; -} -#header #node-page-edit-form .entities-list .item-container > input.button, -#header #node-page-form .entities-list .item-container > input.button, -#header form.node-update-form .entities-list .item-container > input.button, -#header form.node-form .entities-list .item-container > input.button, #footer #node-page-edit-form .entities-list .item-container > input.button, -#footer #node-page-form .entities-list .item-container > input.button, -#footer form.node-update-form .entities-list .item-container > input.button, -#footer form.node-form .entities-list .item-container > input.button { - width: 50%; -} -#header #node-page-edit-form .entities-list .item-container > input.remove-button, -#header #node-page-form .entities-list .item-container > input.remove-button, -#header form.node-update-form .entities-list .item-container > input.remove-button, -#header form.node-form .entities-list .item-container > input.remove-button, #footer #node-page-edit-form .entities-list .item-container > input.remove-button, -#footer #node-page-form .entities-list .item-container > input.remove-button, -#footer form.node-update-form .entities-list .item-container > input.remove-button, -#footer form.node-form .entities-list .item-container > input.remove-button { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -#header #node-page-edit-form .entities-list .item-container > input.edit-button, -#header #node-page-form .entities-list .item-container > input.edit-button, -#header form.node-update-form .entities-list .item-container > input.edit-button, -#header form.node-form .entities-list .item-container > input.edit-button, #footer #node-page-edit-form .entities-list .item-container > input.edit-button, -#footer #node-page-form .entities-list .item-container > input.edit-button, -#footer form.node-update-form .entities-list .item-container > input.edit-button, -#footer form.node-form .entities-list .item-container > input.edit-button { - border-bottom-left-radius: 0; - border-top-left-radius: 0; - margin-left: -1px; -} -#header #node-page-edit-form .entities-list.sortable .item-container, -#header #node-page-form .entities-list.sortable .item-container, -#header form.node-update-form .entities-list.sortable .item-container, -#header form.node-form .entities-list.sortable .item-container, #footer #node-page-edit-form .entities-list.sortable .item-container, -#footer #node-page-form .entities-list.sortable .item-container, -#footer form.node-update-form .entities-list.sortable .item-container, -#footer form.node-form .entities-list.sortable .item-container { - margin: 2px; - padding: 12px; -} -#header #node-page-edit-form .entities-list.sortable .item-container:hover, -#header #node-page-form .entities-list.sortable .item-container:hover, -#header form.node-update-form .entities-list.sortable .item-container:hover, -#header form.node-form .entities-list.sortable .item-container:hover, #footer #node-page-edit-form .entities-list.sortable .item-container:hover, -#footer #node-page-form .entities-list.sortable .item-container:hover, -#footer form.node-update-form .entities-list.sortable .item-container:hover, -#footer form.node-form .entities-list.sortable .item-container:hover { - opacity: 1; -} -#header #node-page-edit-form .entities-list.sortable .item-container:hover figure, -#header #node-page-form .entities-list.sortable .item-container:hover figure, -#header form.node-update-form .entities-list.sortable .item-container:hover figure, -#header form.node-form .entities-list.sortable .item-container:hover figure, #footer #node-page-edit-form .entities-list.sortable .item-container:hover figure, -#footer #node-page-form .entities-list.sortable .item-container:hover figure, -#footer form.node-update-form .entities-list.sortable .item-container:hover figure, -#footer form.node-form .entities-list.sortable .item-container:hover figure { - background-color: #fff; -} -#header #node-page-edit-form .js-pager__items, -#header #node-page-form .js-pager__items, -#header form.node-update-form .js-pager__items, -#header form.node-form .js-pager__items, #footer #node-page-edit-form .js-pager__items, -#footer #node-page-form .js-pager__items, -#footer form.node-update-form .js-pager__items, -#footer form.node-form .js-pager__items { - list-style-type: none; - margin: 0; - padding: 0; -} -#header #node-page-edit-form .views-infinite-scroll-content-wrapper + .js-pager__items, -#header #node-page-form .views-infinite-scroll-content-wrapper + .js-pager__items, -#header form.node-update-form .views-infinite-scroll-content-wrapper + .js-pager__items, -#header form.node-form .views-infinite-scroll-content-wrapper + .js-pager__items, #footer #node-page-edit-form .views-infinite-scroll-content-wrapper + .js-pager__items, -#footer #node-page-form .views-infinite-scroll-content-wrapper + .js-pager__items, -#footer form.node-update-form .views-infinite-scroll-content-wrapper + .js-pager__items, -#footer form.node-form .views-infinite-scroll-content-wrapper + .js-pager__items { - margin-top: 0.75rem; -} -#header #node-page-edit-form .js-form-type-checkbox:not(:last-child), -#header #node-page-form .js-form-type-checkbox:not(:last-child), -#header form.node-update-form .js-form-type-checkbox:not(:last-child), -#header form.node-form .js-form-type-checkbox:not(:last-child), #footer #node-page-edit-form .js-form-type-checkbox:not(:last-child), -#footer #node-page-form .js-form-type-checkbox:not(:last-child), -#footer form.node-update-form .js-form-type-checkbox:not(:last-child), -#footer form.node-form .js-form-type-checkbox:not(:last-child) { - margin-bottom: 0.375rem; -} -#header #node-page-edit-form .js-form-type-checkbox:not(:first-child), -#header #node-page-form .js-form-type-checkbox:not(:first-child), -#header form.node-update-form .js-form-type-checkbox:not(:first-child), -#header form.node-form .js-form-type-checkbox:not(:first-child), #footer #node-page-edit-form .js-form-type-checkbox:not(:first-child), -#footer #node-page-form .js-form-type-checkbox:not(:first-child), -#footer form.node-update-form .js-form-type-checkbox:not(:first-child), -#footer form.node-form .js-form-type-checkbox:not(:first-child) { - margin-top: 0.375rem; -} -#header #node-page-edit-form .entity-browser-media-browser-form, -#header #node-page-form .entity-browser-media-browser-form, -#header form.node-update-form .entity-browser-media-browser-form, -#header form.node-form .entity-browser-media-browser-form, #footer #node-page-edit-form .entity-browser-media-browser-form, -#footer #node-page-form .entity-browser-media-browser-form, -#footer form.node-update-form .entity-browser-media-browser-form, -#footer form.node-form .entity-browser-media-browser-form { - padding-bottom: 4.5rem; -} -#header #node-page-edit-form .eb-media + .form-actions.form-wrapper, -#header #node-page-form .eb-media + .form-actions.form-wrapper, -#header form.node-update-form .eb-media + .form-actions.form-wrapper, -#header form.node-form .eb-media + .form-actions.form-wrapper, #footer #node-page-edit-form .eb-media + .form-actions.form-wrapper, -#footer #node-page-form .eb-media + .form-actions.form-wrapper, -#footer form.node-update-form .eb-media + .form-actions.form-wrapper, -#footer form.node-form .eb-media + .form-actions.form-wrapper { - background-color: #504b50; - margin-top: 0; - padding: 0.75rem; - position: fixed; - bottom: 0; - left: 0; - right: 0; -} -#header #node-page-edit-form .entity-browser-iframe-container, -#header #node-page-form .entity-browser-iframe-container, -#header form.node-update-form .entity-browser-iframe-container, -#header form.node-form .entity-browser-iframe-container, #footer #node-page-edit-form .entity-browser-iframe-container, -#footer #node-page-form .entity-browser-iframe-container, -#footer form.node-update-form .entity-browser-iframe-container, -#footer form.node-form .entity-browser-iframe-container { - position: relative; -} -#header #node-page-edit-form .entity-browser-iframe-container iframe, -#header #node-page-form .entity-browser-iframe-container iframe, -#header form.node-update-form .entity-browser-iframe-container iframe, -#header form.node-form .entity-browser-iframe-container iframe, #footer #node-page-edit-form .entity-browser-iframe-container iframe, -#footer #node-page-form .entity-browser-iframe-container iframe, -#footer form.node-update-form .entity-browser-iframe-container iframe, -#footer form.node-form .entity-browser-iframe-container iframe { - display: block; -} -#header #node-page-edit-form .entity-browser-iframe-container:before, -#header #node-page-form .entity-browser-iframe-container:before, -#header form.node-update-form .entity-browser-iframe-container:before, -#header form.node-form .entity-browser-iframe-container:before, #footer #node-page-edit-form .entity-browser-iframe-container:before, -#footer #node-page-form .entity-browser-iframe-container:before, -#footer form.node-update-form .entity-browser-iframe-container:before, -#footer form.node-form .entity-browser-iframe-container:before { - content: ""; - box-shadow: 0 0 5px inset rgba(19, 15, 19, 0.25); - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; - z-index: 504; - pointer-events: none; -} -#header #node-page-edit-form .page-node-add dl, -#header #node-page-form .page-node-add dl, -#header form.node-update-form .page-node-add dl, -#header form.node-form .page-node-add dl, #footer #node-page-edit-form .page-node-add dl, -#footer #node-page-form .page-node-add dl, -#footer form.node-update-form .page-node-add dl, -#footer form.node-form .page-node-add dl { - border-bottom: 1px dotted #c3c1c3; - padding-bottom: 0.9rem; -} -#header #node-page-edit-form .page-node-add dl dt, #header #node-page-edit-form .page-node-add dl dd, -#header #node-page-form .page-node-add dl dt, -#header #node-page-form .page-node-add dl dd, -#header form.node-update-form .page-node-add dl dt, -#header form.node-update-form .page-node-add dl dd, -#header form.node-form .page-node-add dl dt, -#header form.node-form .page-node-add dl dd, #footer #node-page-edit-form .page-node-add dl dt, #footer #node-page-edit-form .page-node-add dl dd, -#footer #node-page-form .page-node-add dl dt, -#footer #node-page-form .page-node-add dl dd, -#footer form.node-update-form .page-node-add dl dt, -#footer form.node-update-form .page-node-add dl dd, -#footer form.node-form .page-node-add dl dt, -#footer form.node-form .page-node-add dl dd { - font-size: calc(14px + 4 * (100vw - 320px) / 1360); -} -@media screen and (min-width: 1680px) { - #header #node-page-edit-form .page-node-add dl dt, #header #node-page-edit-form .page-node-add dl dd, - #header #node-page-form .page-node-add dl dt, - #header #node-page-form .page-node-add dl dd, - #header form.node-update-form .page-node-add dl dt, - #header form.node-update-form .page-node-add dl dd, - #header form.node-form .page-node-add dl dt, - #header form.node-form .page-node-add dl dd, #footer #node-page-edit-form .page-node-add dl dt, #footer #node-page-edit-form .page-node-add dl dd, - #footer #node-page-form .page-node-add dl dt, - #footer #node-page-form .page-node-add dl dd, - #footer form.node-update-form .page-node-add dl dt, - #footer form.node-update-form .page-node-add dl dd, - #footer form.node-form .page-node-add dl dt, - #footer form.node-form .page-node-add dl dd { - font-size: 18px; - } -} -@media screen and (max-width: 320px) { - #header #node-page-edit-form .page-node-add dl dt, #header #node-page-edit-form .page-node-add dl dd, - #header #node-page-form .page-node-add dl dt, - #header #node-page-form .page-node-add dl dd, - #header form.node-update-form .page-node-add dl dt, - #header form.node-update-form .page-node-add dl dd, - #header form.node-form .page-node-add dl dt, - #header form.node-form .page-node-add dl dd, #footer #node-page-edit-form .page-node-add dl dt, #footer #node-page-edit-form .page-node-add dl dd, - #footer #node-page-form .page-node-add dl dt, - #footer #node-page-form .page-node-add dl dd, - #footer form.node-update-form .page-node-add dl dt, - #footer form.node-update-form .page-node-add dl dd, - #footer form.node-form .page-node-add dl dt, - #footer form.node-form .page-node-add dl dd { - font-size: 14px; - } -} -#header #node-page-edit-form .page-node-add dl dt, -#header #node-page-form .page-node-add dl dt, -#header form.node-update-form .page-node-add dl dt, -#header form.node-form .page-node-add dl dt, #footer #node-page-edit-form .page-node-add dl dt, -#footer #node-page-form .page-node-add dl dt, -#footer form.node-update-form .page-node-add dl dt, -#footer form.node-form .page-node-add dl dt { - border-top: 1px dotted #c3c1c3; - padding-top: 1.125rem; - margin-top: 1.125rem; -} -#header #node-page-edit-form .page-node-add dl dt:first-child, -#header #node-page-form .page-node-add dl dt:first-child, -#header form.node-update-form .page-node-add dl dt:first-child, -#header form.node-form .page-node-add dl dt:first-child, #footer #node-page-edit-form .page-node-add dl dt:first-child, -#footer #node-page-form .page-node-add dl dt:first-child, -#footer form.node-update-form .page-node-add dl dt:first-child, -#footer form.node-form .page-node-add dl dt:first-child { - margin-top: 0; -} -#header #node-page-edit-form .page-node-add dl dt a, -#header #node-page-form .page-node-add dl dt a, -#header form.node-update-form .page-node-add dl dt a, -#header form.node-form .page-node-add dl dt a, #footer #node-page-edit-form .page-node-add dl dt a, -#footer #node-page-form .page-node-add dl dt a, -#footer form.node-update-form .page-node-add dl dt a, -#footer form.node-form .page-node-add dl dt a { - color: #130f13; - display: block; - font-weight: 500; -} -#header #node-page-edit-form .page-node-add dl dd, -#header #node-page-form .page-node-add dl dd, -#header form.node-update-form .page-node-add dl dd, -#header form.node-form .page-node-add dl dd, #footer #node-page-edit-form .page-node-add dl dd, -#footer #node-page-form .page-node-add dl dd, -#footer form.node-update-form .page-node-add dl dd, -#footer form.node-form .page-node-add dl dd { - color: #777277; - margin: 0; - width: 80%; -} -@media (min-width: 48em) { - #header #node-page-edit-form .page-node-add dl, - #header #node-page-form .page-node-add dl, - #header form.node-update-form .page-node-add dl, - #header form.node-form .page-node-add dl, #footer #node-page-edit-form .page-node-add dl, - #footer #node-page-form .page-node-add dl, - #footer form.node-update-form .page-node-add dl, - #footer form.node-form .page-node-add dl { - display: flex; - flex-wrap: wrap; - } - #header #node-page-edit-form .page-node-add dl dt, - #header #node-page-form .page-node-add dl dt, - #header form.node-update-form .page-node-add dl dt, - #header form.node-form .page-node-add dl dt, #footer #node-page-edit-form .page-node-add dl dt, - #footer #node-page-form .page-node-add dl dt, - #footer form.node-update-form .page-node-add dl dt, - #footer form.node-form .page-node-add dl dt { - width: 20%; - } - #header #node-page-edit-form .page-node-add dl dd, - #header #node-page-form .page-node-add dl dd, - #header form.node-update-form .page-node-add dl dd, - #header form.node-form .page-node-add dl dd, #footer #node-page-edit-form .page-node-add dl dd, - #footer #node-page-form .page-node-add dl dd, - #footer form.node-update-form .page-node-add dl dd, - #footer form.node-form .page-node-add dl dd { - border-top: 1px dotted #c3c1c3; - padding-top: 1.125rem; - margin-top: 1.125rem; - width: 80%; - } - #header #node-page-edit-form .page-node-add dl dt:first-child + dd, - #header #node-page-form .page-node-add dl dt:first-child + dd, - #header form.node-update-form .page-node-add dl dt:first-child + dd, - #header form.node-form .page-node-add dl dt:first-child + dd, #footer #node-page-edit-form .page-node-add dl dt:first-child + dd, - #footer #node-page-form .page-node-add dl dt:first-child + dd, - #footer form.node-update-form .page-node-add dl dt:first-child + dd, - #footer form.node-form .page-node-add dl dt:first-child + dd { - margin-top: 0; - } -} -#header #node-page-edit-form .paragraph--type--webform h2, -#header #node-page-form .paragraph--type--webform h2, -#header form.node-update-form .paragraph--type--webform h2, -#header form.node-form .paragraph--type--webform h2, #footer #node-page-edit-form .paragraph--type--webform h2, -#footer #node-page-form .paragraph--type--webform h2, -#footer form.node-update-form .paragraph--type--webform h2, -#footer form.node-form .paragraph--type--webform h2 { - margin-bottom: 3.75rem; -} -#header #node-page-edit-form .paragraph--type--webform .form-item:not(:last-child), -#header #node-page-form .paragraph--type--webform .form-item:not(:last-child), -#header form.node-update-form .paragraph--type--webform .form-item:not(:last-child), -#header form.node-form .paragraph--type--webform .form-item:not(:last-child), #footer #node-page-edit-form .paragraph--type--webform .form-item:not(:last-child), -#footer #node-page-form .paragraph--type--webform .form-item:not(:last-child), -#footer form.node-update-form .paragraph--type--webform .form-item:not(:last-child), -#footer form.node-form .paragraph--type--webform .form-item:not(:last-child) { - margin-bottom: 3.75rem; -} -#header #node-page-edit-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label, -#header #node-page-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label, -#header form.node-update-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label, -#header form.node-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label, #footer #node-page-edit-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label, -#footer #node-page-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label, -#footer form.node-update-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label, -#footer form.node-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label { - display: none; -} -#header #node-page-edit-form .cke_bottom, -#header #node-page-form .cke_bottom, -#header form.node-update-form .cke_bottom, -#header form.node-form .cke_bottom, #footer #node-page-edit-form .cke_bottom, -#footer #node-page-form .cke_bottom, -#footer form.node-update-form .cke_bottom, -#footer form.node-form .cke_bottom { - display: none !important; -} -#header .field--widget-entity-reference-layout-widget .erl-field-item--layout, #footer .field--widget-entity-reference-layout-widget .erl-field-item--layout { - border: 1px solid #c3c1c3; -} -#header .field--widget-entity-reference-layout-widget .reversed .erl-field-item--layout, #footer .field--widget-entity-reference-layout-widget .reversed .erl-field-item--layout { - border-color: rgba(255, 255, 255, 0.5); -} -#header .field--widget-entity-reference-layout-widget .reversed .erl-layout-section .erl-field-item, #footer .field--widget-entity-reference-layout-widget .reversed .erl-layout-section .erl-field-item { - border-color: rgba(255, 255, 255, 0.5); -} -#header .field--widget-entity-reference-layout-widget .erl-layout-section, #footer .field--widget-entity-reference-layout-widget .erl-layout-section { - border: 1px dashed #c3c1c3; -} -#header .field--widget-entity-reference-layout-widget .reversed .erl-layout-section, #footer .field--widget-entity-reference-layout-widget .reversed .erl-layout-section { - border-color: rgba(255, 255, 255, 0.5); -} -#header .field--widget-entity-reference-layout-widget .erl-layout-section:hover, #footer .field--widget-entity-reference-layout-widget .erl-layout-section:hover { - border: 1px solid #9d999d; -} -#header .field--widget-entity-reference-layout-widget .reversed .erl-layout-section:hover, #footer .field--widget-entity-reference-layout-widget .reversed .erl-layout-section:hover { - border-color: rgba(255, 255, 255, 0.5); -} -#header .js-component, #footer .js-component { - position: relative; - z-index: 1; -} -#header .views-element-container, #footer .views-element-container { - margin-bottom: 1.875rem; -} -@media (min-width: 1200px) { - #header .views-element-container, #footer .views-element-container { - margin-bottom: 3.75rem; - } -} -#header .paragraph--type--section .layout .l__region .views-element-container, #footer .paragraph--type--section .layout .l__region .views-element-container { - margin-bottom: 0; -} -#header .view--empty, #footer .view--empty { - margin-top: 1.875rem; -} -@media (min-width: 1200px) { - #header .view--empty, #footer .view--empty { - margin-top: 3.75rem; - } -} -#header .view--empty p, #footer .view--empty p { - color: #565A5C; - font-weight: normal; - line-height: 1.5; -} -@media (min-width: 0px) { - #header .view--empty p, #footer .view--empty p { - font-size: 1rem; - } -} -@media (min-width: 600px) { - #header .view--empty p, #footer .view--empty p { - font-size: 1.125rem; - } -} -#header .view--empty p:first-child, #footer .view--empty p:first-child { - margin-top: 0; -} -#header .view--empty p:last-child, #footer .view--empty p:last-child { - margin-bottom: 0; -} -@media (min-width: 0px) { - #header .views-view-grid.cols-3, #footer .views-view-grid.cols-3 { - font-size: 0.75rem; - } -} -@media (min-width: 600px) { - #header .views-view-grid.cols-3, #footer .views-view-grid.cols-3 { - font-size: 0.8125rem; - } -} -#header .views-view-grid.cols-3 .views-col, #footer .views-view-grid.cols-3 .views-col { - border-left: 1px solid #D7D9D9; - padding: 1rem 1.25rem; -} -#header .views-view-grid.cols-3 .views-col:first-child, #footer .views-view-grid.cols-3 .views-col:first-child { - border-left: none; -} -#header .views-view-grid.cols-3 .views-row, #footer .views-view-grid.cols-3 .views-row { - margin-bottom: 0; -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header .js-prevent-scroll, #footer .js-prevent-scroll { - height: 100%; - overflow: hidden; - position: fixed; - width: 100%; - } -} -#header .header, #footer .header { - background-color: #fff; - position: fixed; - top: 0; - width: 100%; - z-index: 100; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25), 0px 1px 1px rgba(0, 0, 0, 0.25); -} -#header .header__inner, #footer .header__inner { - height: 120px; - background-color: #fff; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: space-between; -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header .header__inner, #footer .header__inner { - align-items: center; - height: 60px; - } -} -#header [id], #footer [id] { - scroll-margin-top: 120px; -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header [id], #footer [id] { - scroll-margin-top: 60px; - } -} -#header .header__logo, #footer .header__logo { - align-items: center; - display: flex; - justify-content: center; - padding: 0; - width: 88px; - z-index: 1; -} -#header .header__logo a, -#header .header__logo img, #footer .header__logo a, -#footer .header__logo img { - display: block; - width: 100%; -} -@media (min-width: 992px) { - #header .header__logo, #footer .header__logo { - margin: 24px 0; - width: 140px; - } -} -@media (min-width: 1200px) { - #header .header__logo, #footer .header__logo { - margin: 24px 0; - width: 140px; - } -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header .header__site-navigation, #footer .header__site-navigation { - width: 100%; - top: 60px; - bottom: 0; - left: 0; - right: 0; - z-index: -1; - position: fixed; - } -} -@media (min-width: 1200px) { - #header .header__site-navigation, #footer .header__site-navigation { - align-items: flex-end; - align-items: center; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - } -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header body.user-logged-in .header__site-navigation, #footer body.user-logged-in .header__site-navigation { - top: 99px; - } -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header body.toolbar-fixed.toolbar-tray-open .header__site-navigation, #footer body.toolbar-fixed.toolbar-tray-open .header__site-navigation { - top: 138px; - } -} -#header .header__utilities, #footer .header__utilities { - display: flex; - flex-direction: column; - height: 90px; - justify-content: flex-end; - margin-bottom: 22px; - width: 126px; -} -@media (min-width: 992px) and (max-width: 1199.98px) { - #header .header__utilities, #footer .header__utilities { - height: 66px; - width: 90px; - } -} -#header .nav-trigger, #footer .nav-trigger { - clip: rect(0, 0, 0, 0); - position: absolute; -} -#header label[for=nav-trigger], #footer label[for=nav-trigger] { - cursor: pointer; - height: 30px; - margin: auto; - position: absolute; - right: 30px; - width: 30px; - z-index: 2; -} -@media (min-width: 1200px) { - #header label[for=nav-trigger], #footer label[for=nav-trigger] { - display: none; - } -} -#header .nav-trigger__icon, #footer .nav-trigger__icon { - margin: auto; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; -} -#header .nav-trigger__icon path, #footer .nav-trigger__icon path { - fill: #0073CF; -} -#header .nav-trigger__icon--expand, #footer .nav-trigger__icon--expand { - opacity: 1; - position: absolute; - transform: rotate(0) scale(1); - transition: all 0.2s ease-in-out; - margin: auto; - top: 0; - left: 0; - bottom: 0; - right: 0; -} -#header .nav-trigger__icon--collapse, #footer .nav-trigger__icon--collapse { - margin: auto; - opacity: 0; - position: absolute; - transform: rotate(-90deg) scale(0); - transition: all 0.2s ease-in-out; -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header .header__site-navigation, #footer .header__site-navigation { - opacity: 0; - transform: translateY(-100%); - transition: all 0.3s ease-in-out; - } - #header .nav-trigger:checked ~ .header__site-navigation, #footer .nav-trigger:checked ~ .header__site-navigation { - opacity: 1; - overflow-y: auto; - transform: translateY(0); - } - #header .nav-trigger:checked ~ label .nav-trigger__icon--collapse, #footer .nav-trigger:checked ~ label .nav-trigger__icon--collapse { - opacity: 1; - transform: rotate(0) scale(1); - } - #header .nav-trigger:checked ~ label .nav-trigger__icon--expand, #footer .nav-trigger:checked ~ label .nav-trigger__icon--expand { - opacity: 0; - transform: rotate(90deg) scale(0); - } -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header nav#block-neon-main-menu > ul, #footer nav#block-neon-main-menu > ul { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); - width: 100%; - overflow-x: hidden; - margin: 0; - height: 100%; - padding: 0; - background: #fff; - } - #header nav#block-neon-main-menu > ul li, #footer nav#block-neon-main-menu > ul li { - margin: 12px auto; - padding: 15px 30px 18px 24px; - border-left: 6px #fff solid; - transition: all 250ms ease-in-out; - display: flex; - justify-content: space-between; - align-items: center; - } - #header nav#block-neon-main-menu > ul li.menu__item.menu__item--expanded:hover, #footer nav#block-neon-main-menu > ul li.menu__item.menu__item--expanded:hover { - border-left: 6px #0073CF solid; - transition: all 250ms ease-in-out; - } - #header nav#block-neon-main-menu > ul li a, #footer nav#block-neon-main-menu > ul li a { - text-decoration: none; - font-size: 18px; - line-height: 30px; - font-weight: 600; - display: inline-block; - color: #0073CF; - } - #header nav#block-neon-main-menu > ul li > .arrow, #footer nav#block-neon-main-menu > ul li > .arrow { - right: 26px; - transition: all 150ms ease-in-out; - border-radius: 3px; - height: 24px; - width: 24px; - margin-top: 0; - border: 0; - background: none; - appearance: none; - clip: initial; - opacity: 1; - visibility: visible; - transform: rotate(-90deg); - } - #header nav#block-neon-main-menu > ul li > .arrow svg, #footer nav#block-neon-main-menu > ul li > .arrow svg { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - #header nav#block-neon-main-menu > ul li > .arrow svg path, #footer nav#block-neon-main-menu > ul li > .arrow svg path { - stroke: #0073CF; - } - #header nav#block-neon-main-menu > ul li > .arrow:hover, #header nav#block-neon-main-menu > ul li > .arrow:focus-within, #header nav#block-neon-main-menu > ul li > .arrow:focus, #header nav#block-neon-main-menu > ul li > .arrow:active, #footer nav#block-neon-main-menu > ul li > .arrow:hover, #footer nav#block-neon-main-menu > ul li > .arrow:focus-within, #footer nav#block-neon-main-menu > ul li > .arrow:focus, #footer nav#block-neon-main-menu > ul li > .arrow:active { - background: none; - position: absolute !important; - } - #header nav#block-neon-main-menu > ul > li.myAccount, #header nav#block-neon-main-menu > ul > li.siteSearch, #footer nav#block-neon-main-menu > ul > li.myAccount, #footer nav#block-neon-main-menu > ul > li.siteSearch { - background: #F5F6F7; - margin: 0; - border: none; - } - #header nav#block-neon-main-menu > ul > li.myAccount, #footer nav#block-neon-main-menu > ul > li.myAccount { - flex: none; - width: 100%; - text-align: center; - } - #header nav#block-neon-main-menu > ul > li.myAccount a, #footer nav#block-neon-main-menu > ul > li.myAccount a { - padding: 6px 12px; - color: #565a5c; - letter-spacing: 1.2px; - text-transform: uppercase; - background: #E4E6E7; - border: 1px solid #E4E6E7; - border-radius: 2px; - font-weight: 600; - font-size: 12px; - text-decoration: none; - transition: all 150ms ease; - } - #header nav#block-neon-main-menu > ul > li.myAccount a:hover, #footer nav#block-neon-main-menu > ul > li.myAccount a:hover { - color: #0073CF; - transition: all 300ms ease; - } - #header nav#block-neon-main-menu > ul > li.menu__item.menu__item--expanded.over > .subNavWrapper.depthZero, #footer nav#block-neon-main-menu > ul > li.menu__item.menu__item--expanded.over > .subNavWrapper.depthZero { - transform: translateZ(0) translateX(0); - background: #002C77; - display: flex; - flex-direction: column; - } - #header nav#block-neon-main-menu ul[data-depth="0"] ul, #footer nav#block-neon-main-menu ul[data-depth="0"] ul { - background: #002C77; - transition: transform 120ms; - height: 100%; - } - #header nav#block-neon-main-menu ul[data-depth="0"] ul li, #footer nav#block-neon-main-menu ul[data-depth="0"] ul li { - padding: 15px 30px 15px 24px; - color: #C2DEEA; - border-left: 6px #002C77 solid; - font-weight: normal; - display: flex; - justify-content: space-between; - align-items: center; - } - #header nav#block-neon-main-menu ul[data-depth="0"] ul li a, #footer nav#block-neon-main-menu ul[data-depth="0"] ul li a { - color: #C2DEEA; - font-weight: normal; - } - #header nav#block-neon-main-menu ul[data-depth="0"] ul .mini-arrow, #footer nav#block-neon-main-menu ul[data-depth="0"] ul .mini-arrow { - right: 26px; - border-radius: 3px; - height: 48px; - width: 48px; - margin-top: 0; - border: 0; - background: none; - appearance: none; - display: flex; - justify-content: center; - align-items: center; - } - #header nav#block-neon-main-menu ul[data-depth="0"], #footer nav#block-neon-main-menu ul[data-depth="0"] { - visibility: visible; - width: 100%; - position: fixed; - right: 0; - -webkit-overflow-scrolling: touch; - z-index: 1; - transform: translateX(0) translateZ(0); - } - #header nav#block-neon-main-menu ul[data-depth="1"], #footer nav#block-neon-main-menu ul[data-depth="1"] { - top: 0px; - left: 0; - position: absolute; - width: 100%; - margin: 0; - padding: 0; - } - #header nav#block-neon-main-menu ul[data-depth="1"] > li.active ul[data-depth="2"], #footer nav#block-neon-main-menu ul[data-depth="1"] > li.active ul[data-depth="2"] { - transform: translateZ(0) translateX(0%); - transition: transform 0.3s; - } - #header nav#block-neon-main-menu ul[data-depth="2"], #footer nav#block-neon-main-menu ul[data-depth="2"] { - top: 0px; - left: 0; - position: absolute; - width: 100%; - margin: 0; - padding: 0; - transform: translateZ(0) translateX(100%); - } - #header nav#block-neon-main-menu ul[data-depth="2"] > li.active ul[data-depth="3"], #footer nav#block-neon-main-menu ul[data-depth="2"] > li.active ul[data-depth="3"] { - transform: translateZ(0) translateX(0%); - } - #header nav#block-neon-main-menu ul[data-depth="3"], #footer nav#block-neon-main-menu ul[data-depth="3"] { - top: 0px; - left: 0; - position: absolute; - width: 100%; - margin: 0; - padding: 0; - transform: translateZ(0) translateX(100%); - } - #header nav#block-neon-main-menu ul[data-depth="3"] > li.active ul[data-depth="4"], #footer nav#block-neon-main-menu ul[data-depth="3"] > li.active ul[data-depth="4"] { - transform: translateZ(0) translateX(0%); - } - #header nav#block-neon-main-menu ul[data-depth="4"], #footer nav#block-neon-main-menu ul[data-depth="4"] { - top: 0px; - left: 0; - position: absolute; - width: 100%; - margin: 0; - padding: 0; - transform: translateZ(0) translateX(100%); - } - #header nav#block-neon-main-menu ul[data-depth="4"] > li.active ul[data-depth="5"], #footer nav#block-neon-main-menu ul[data-depth="4"] > li.active ul[data-depth="5"] { - transform: translateZ(0) translateX(0%); - } - #header nav#block-neon-main-menu ul[data-depth="5"], #footer nav#block-neon-main-menu ul[data-depth="5"] { - top: 0px; - left: 0; - position: absolute; - width: 100%; - margin: 0; - padding: 0; - transform: translateZ(0) translateX(100%); - } - #header nav#block-neon-main-menu .subNavWrapper, #footer nav#block-neon-main-menu .subNavWrapper { - position: fixed; - top: 0; - right: 0; - left: 0; - height: 100%; - overflow: auto; - -webkit-overflow-scrolling: touch; - z-index: 1; - transition: transform 150ms; - transform: translateZ(0) translateX(100%); - } - #header nav#block-neon-main-menu .subNavWrapper .innerSubNavWrapper, #footer nav#block-neon-main-menu .subNavWrapper .innerSubNavWrapper { - height: 100%; - width: 100%; - position: relative; - overflow: hidden; - order: 2; - } - #header nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper, #footer nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper { - order: 1; - width: 100%; - } - #header nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper .mobileBack, #footer nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper .mobileBack { - background: #fff; - border-radius: 3px; - border: none; - width: 30px; - height: 30px; - margin: 18px 0 0 30px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - } -} -@media (min-width: 1200px) { - #header .subNavWrapper ul[data-depth="1"] .expandable:not(.active) ul, #footer .subNavWrapper ul[data-depth="1"] .expandable:not(.active) ul { - height: 0; - overflow: hidden; - } - #header .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="2"], - #header .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="3"], - #header .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="4"], - #header .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="5"], #footer .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="2"], - #footer .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="3"], - #footer .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="4"], - #footer .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="5"] { - height: auto; - overflow: visible; - } - #header .header__menu-main, #footer .header__menu-main { - height: 100%; - display: flex; - align-items: center; - } - #header nav#block-neon-main-menu, #footer nav#block-neon-main-menu { - height: 100%; - display: flex; - align-items: center; - position: inherit !important; - } - #header nav#block-neon-main-menu > ul.menu--main, #footer nav#block-neon-main-menu > ul.menu--main { - display: flex; - height: 100%; - align-items: stretch; - margin: 0; - padding: 0; - } - #header nav#block-neon-main-menu > ul.menu--main > li, #footer nav#block-neon-main-menu > ul.menu--main > li { - display: flex; - flex-direction: column; - margin-right: 50px; - align-items: center; - justify-content: center; - border-bottom: 6px solid #fff; - } - #header nav#block-neon-main-menu > ul.menu--main > li:last-child, #footer nav#block-neon-main-menu > ul.menu--main > li:last-child { - margin-right: 0; - } - #header nav#block-neon-main-menu > ul.menu--main > li > a:not([myAccount]), #header nav#block-neon-main-menu > ul.menu--main > li > a:not([siteSearch]), #footer nav#block-neon-main-menu > ul.menu--main > li > a:not([myAccount]), #footer nav#block-neon-main-menu > ul.menu--main > li > a:not([siteSearch]) { - font-weight: 600; - font-size: 18px; - color: #0073CF; - text-decoration: none; - padding-top: 6px; - padding-bottom: 6px; - margin-top: 42px; - margin-bottom: auto; - } - #header nav#block-neon-main-menu > ul.menu--main > li:not(.menu__item--expanded) > a, #footer nav#block-neon-main-menu > ul.menu--main > li:not(.menu__item--expanded) > a { - margin-bottom: auto; - } - #header nav#block-neon-main-menu > ul.menu--main > li.menu__item--expanded:hover .arrow, #header nav#block-neon-main-menu > ul.menu--main > li.menu__item--expanded:focus-within .arrow, #header nav#block-neon-main-menu > ul.menu--main > li.menu__item--expanded:focus .arrow, #footer nav#block-neon-main-menu > ul.menu--main > li.menu__item--expanded:hover .arrow, #footer nav#block-neon-main-menu > ul.menu--main > li.menu__item--expanded:focus-within .arrow, #footer nav#block-neon-main-menu > ul.menu--main > li.menu__item--expanded:focus .arrow { - transition: all 0.2s ease-in-out; - clip: initial; - opacity: 1; - visibility: visible; - z-index: 4; - background: #0073CF; - } - #header nav#block-neon-main-menu > ul.menu--main > li > .arrow, #footer nav#block-neon-main-menu > ul.menu--main > li > .arrow { - opacity: 0; - visibility: hidden; - background: none; - width: calc(100% - 14px); - border: 0; - text-align: center; - display: block; - position: relative !important; - bottom: -37px; - height: 34px; - border-radius: 0 0 3px 3px; - z-index: 0; - transition: all 0.2s ease-in-out; - } - #header nav#block-neon-main-menu > ul.menu--main > li > .arrow svg, #footer nav#block-neon-main-menu > ul.menu--main > li > .arrow svg { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - #header nav#block-neon-main-menu > ul.menu--main > li > .arrow.hidden, #footer nav#block-neon-main-menu > ul.menu--main > li > .arrow.hidden { - display: none !important; - } - #header nav#block-neon-main-menu > ul.menu--main > li.over, #footer nav#block-neon-main-menu > ul.menu--main > li.over { - border-bottom: 6px solid #0073CF; - } - #header nav#block-neon-main-menu > ul.menu--main > li.myAccount, #footer nav#block-neon-main-menu > ul.menu--main > li.myAccount { - flex: none; - width: 100%; - margin: 0 0 25px 0; - } - #header nav#block-neon-main-menu > ul.menu--main > li.myAccount a, #footer nav#block-neon-main-menu > ul.menu--main > li.myAccount a { - padding: 6px 12px; - color: #565a5c; - letter-spacing: 1.2px; - line-height: 18px; - text-transform: uppercase; - background: #E4E6E7; - border: 1px solid #E4E6E7; - border-radius: 2px; - font-weight: 600; - font-size: 12px; - text-decoration: none; - transition: all 250ms ease; - margin-bottom: auto; - } - #header nav#block-neon-main-menu > ul.menu--main > li.myAccount a:hover, #footer nav#block-neon-main-menu > ul.menu--main > li.myAccount a:hover { - color: #0073CF; - transition: all 300ms ease; - background: #fff; - border: 1px solid #fff; - } -} -@media (min-width: 1200px) and (min-width: 768px) { - #header nav#block-neon-main-menu > ul.menu--main > li.myAccount, #footer nav#block-neon-main-menu > ul.menu--main > li.myAccount { - width: auto; - margin: 0 30px 0 0; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu > ul.menu--main > li.siteSearch, #footer nav#block-neon-main-menu > ul.menu--main > li.siteSearch { - margin-right: 0; - flex: none; - width: 20px; - } - #header nav#block-neon-main-menu > ul.menu--main > li.siteSearch a, #footer nav#block-neon-main-menu > ul.menu--main > li.siteSearch a { - text-indent: 100%; - white-space: nowrap; - overflow: hidden; - position: relative; - display: block; - margin-bottom: auto; -/* background: url("../../../../images/icons/search.svg") center center no-repeat; */ - } - #header nav#block-neon-main-menu > ul.menu--main > li.siteSearch a:before, #header nav#block-neon-main-menu > ul.menu--main > li.siteSearch a:after, #footer nav#block-neon-main-menu > ul.menu--main > li.siteSearch a:before, #footer nav#block-neon-main-menu > ul.menu--main > li.siteSearch a:after { - content: ""; -/* background: url("../../../../images/icons/search_hover.svg"); */ - width: 0; - height: 0; - display: none; - } - #header nav#block-neon-main-menu > ul.menu--main > li.siteSearch a:hover, #footer nav#block-neon-main-menu > ul.menu--main > li.siteSearch a:hover { -/* background: url("../../../../images/icons/search_hover.svg") no-repeat center center; */ - } -} -@media (min-width: 1200px) { - #header .subNavWrapper, #footer .subNavWrapper { - visibility: hidden; - opacity: 0; - white-space: nowrap; - transition: opacity 0.2s ease-in-out; - left: 0; - z-index: -1; - top: 120px; - position: fixed; - margin: 0; - width: 100%; - height: 100%; - background: #002C77; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 1px rgba(0, 0, 0, 0.25); - } - #header .subNavWrapper .subNavLabelWrapper, #footer .subNavWrapper .subNavLabelWrapper { - padding: 1.875rem 2.25rem 1.875rem 1.875rem; - border-bottom: 1px solid #0073CF; - order: 1; - position: relative; - flex: none; - display: flex; - justify-content: flex-start; - } - #header .subNavWrapper .subNavLabelWrapper h3, #footer .subNavWrapper .subNavLabelWrapper h3 { - font-weight: 300; - line-height: 0.8; - padding: 0; - margin: 0 0 0 0.3125rem; - color: #fff; - white-space: normal; - } -} -@media (min-width: 1200px) and (min-width: 0px) { - #header .subNavWrapper .subNavLabelWrapper h3, #footer .subNavWrapper .subNavLabelWrapper h3 { - font-size: 1.5rem; - } -} -@media (min-width: 1200px) and (min-width: 600px) { - #header .subNavWrapper .subNavLabelWrapper h3, #footer .subNavWrapper .subNavLabelWrapper h3 { - font-size: 2.25rem; - } -} -@media (min-width: 1200px) { - #header .subNavWrapper .subNavLabelWrapper .subNavClose, #footer .subNavWrapper .subNavLabelWrapper .subNavClose { - top: 40px; - left: 40px; - cursor: pointer; - background: none; - border: none; - appearance: none; - } -} -@media (min-width: 1200px) { - #header .subNavWrapper .innerSubNavWrapper, #footer .subNavWrapper .innerSubNavWrapper { - height: 100%; - flex: none; - position: relative; - order: 2; - } -} -@media (min-width: 1200px) { - #header .subNavWrapper.depthOne .innerSubNavWrapper:before, #footer .subNavWrapper.depthOne .innerSubNavWrapper:before { - content: ""; - border-left: 1px solid #0073CF; - background: #00235f; - position: absolute; - top: 0; - left: 33.3333333333%; - width: 100%; - height: 100%; - } -} -@media (min-width: 1200px) { - #header .subNavWrapper.depthThree .innerSubNavWrapper:after, #footer .subNavWrapper.depthThree .innerSubNavWrapper:after { - content: ""; - border-left: 1px solid #0073CF; - position: absolute; - top: 0; - right: 0; - background: #001c4c; - width: 33.3333333333%; - height: 100%; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper, #footer nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper { - transition: opacity 0.2s ease-in-out; - opacity: 1; - visibility: visible; - z-index: 3; - } - #header nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper ul[data-depth="1"], #footer nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper ul[data-depth="1"] { - opacity: 1; - visibility: visible; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul li, #footer nav#block-neon-main-menu ul.menu--main li ul li { - display: block; - color: #F5F6F7; - } - #header nav#block-neon-main-menu ul.menu--main li ul li a, #footer nav#block-neon-main-menu ul.menu--main li ul li a { - display: inline-block; - color: #F5F6F7; - text-decoration: none; - } - #header nav#block-neon-main-menu ul.menu--main li ul li span, #footer nav#block-neon-main-menu ul.menu--main li ul li span { - display: inline-block; - color: #F5F6F7; - } - #header nav#block-neon-main-menu ul.menu--main li ul li > ul li, #header nav#block-neon-main-menu ul.menu--main li ul li > ul a, #header nav#block-neon-main-menu ul.menu--main li ul li > ul span, #footer nav#block-neon-main-menu ul.menu--main li ul li > ul li, #footer nav#block-neon-main-menu ul.menu--main li ul li > ul a, #footer nav#block-neon-main-menu ul.menu--main li ul li > ul span { - font-size: 15px; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"], #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] { - top: 12px; - position: absolute; - width: 33.3%; - margin: 0; - padding: 0; - opacity: 0; - visibility: hidden; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li { - padding: 16px 60px; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:last-child, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:last-child { - margin-bottom: 0px; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable .mini-arrow, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable .mini-arrow { - position: absolute; - padding-right: 26px; - right: 0; - transition: all 250ms ease-in-out; - border-radius: 3px; - height: 48px; - width: 48px; - margin-top: -12px; - border: 0; - background: none; - appearance: none; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable .mini-arrow svg, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable .mini-arrow svg { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable:hover, #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable.active, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable:hover, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable.active { - transition: background-color 250ms ease-in-out; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable:hover > a, #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable.active > a, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable:hover > a, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable.active > a { - color: #fff; - text-shadow: 0 0 0.65px #fff, 0 0 0.65px #fff; - border-bottom: 2px solid #fff; - transition: all 200ms ease-in-out; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable.active, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li.expandable.active { - background: linear-gradient(0deg, rgba(0, 115, 207, 0.2), rgba(0, 115, 207, 0.2)), #002C77; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li > a, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li > a { - text-decoration: none; - font-weight: normal; - font-size: 18px; - line-height: 24px; - border-bottom: 2px solid #002C77; - transition: all 250ms ease-in-out; - border: none; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:hover, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:hover { - transition: all 250ms ease-in-out; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:hover > a, #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:hover > span, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:hover > a, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"] > li:hover > span { - color: #fff; - transition: all 200ms ease-in-out; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"], - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"], #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"], - #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] { - margin: 0; - padding: 0; - width: 100%; - visibility: hidden; - opacity: 0; - top: 0; - left: calc(108% + 2px); - position: absolute; - transition: all 150ms ease-in-out; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li, - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li, - #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li { - padding: 0; - margin: 0; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li.expandable .mini-arrow, - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li.expandable .mini-arrow, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li.expandable .mini-arrow, - #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li.expandable .mini-arrow { - margin-top: 0; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li > a, - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li > a, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li > a, - #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li > a { - font-size: 15px; - padding: 25px 60px 12px 60px; - margin: 0; - font-weight: 600; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li:not([class]) > a, - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li:not([class]) > a, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li:not([class]) > a, - #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li:not([class]) > a { - padding: 22px 60px 20px 60px; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li:not([class]):not(:last-child) > a, - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li:not([class]):not(:last-child) > a, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li:not([class]):not(:last-child) > a, - #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li:not([class]):not(:last-child) > a { - position: relative; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li:not([class]):not(:last-child) > a:after, - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li:not([class]):not(:last-child) > a:after, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"] > li:not([class]):not(:last-child) > a:after, - #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"] > li:not([class]):not(:last-child) > a:after { - content: ""; - width: 100%; - height: 1px; - background: #004b97; - position: absolute; - left: 60px; - bottom: 0; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"], #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] { - margin: 0; - padding: 0; - border-bottom: 1px solid #004b97; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li { - padding: 0; - margin: 0; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li > a, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li > a { - font-size: 15px; - padding: 10px 0 10px 90px; - margin: 0; - position: relative; - font-weight: 400; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li > a:before, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li > a:before { - content: ""; - width: 10px; - height: 1px; - background: #F5F6F7; - position: absolute; - left: 60px; - top: 20px; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable { - cursor: pointer; - display: flex; - justify-content: space-between; - align-items: center; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable button.mini-arrow.focusable, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable button.mini-arrow.focusable { - position: relative; - right: unset; - margin: 0; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable.active, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable.active { - background: linear-gradient(0deg, rgba(0, 115, 207, 0.2), rgba(0, 115, 207, 0.2)), #002C77; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable:hover, #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable.active, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable:hover, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable.active { - transition: background-color 250ms ease-in-out; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable:hover > a, #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable.active > a, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable:hover > a, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li.expandable.active > a { - color: #fff; - text-shadow: 0 0 0.65px #fff, 0 0 0.65px #fff; - transition: all 200ms ease-in-out; - display: inline-block; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li:not([class]):after, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"] > li:not([class]):after { - display: none; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"], #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] { - width: 100%; - margin: 0; - padding: 0; - visibility: hidden; - opacity: 0; - top: 0; - left: calc(100% + 1px); - position: absolute; - transition: all 150ms ease-in-out; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li a, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li a { - width: 100%; - } - #header nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li.expandable:before, #footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li.expandable:before { - display: none; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"], #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] { - margin: 0; - padding: 0; - border-bottom: 1px solid #004b97; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li { - padding: 0; - margin: 0; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li > a, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li > a { - font-size: 15px; - padding: 10px 0 10px 90px; - margin: 0; - position: relative; - font-weight: 400; - transition: all 200ms ease-in-out; - width: 100%; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li > a:hover, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li > a:hover { - text-shadow: 0 0 0.65px #fff, 0 0 0.65px #fff; - transition: all 200ms ease-in-out; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li > a:before, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li > a:before { - content: ""; - width: 10px; - height: 1px; - background: #F5F6F7; - position: absolute; - left: 60px; - top: 20px; - } - #header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li:last-child > a:last-child, #footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"] > li:last-child > a:last-child { - position: relative; - padding-bottom: 20px; - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul li.active > ul[data-depth="2"], #footer nav#block-neon-main-menu ul.menu--main li ul li.active > ul[data-depth="2"] { - transition: all 150ms ease-out; - opacity: 1; - visibility: visible; - left: calc(100% + 2px); - } -} -@media (min-width: 1200px) { - #header nav#block-neon-main-menu ul.menu--main li ul li.active ul li.active > ul[data-depth="4"], #footer nav#block-neon-main-menu ul.menu--main li ul li.active ul li.active > ul[data-depth="4"] { - transition: all 150ms ease-out; - opacity: 1; - visibility: visible; - z-index: 1; - left: calc(100% + 2px); - } -} -#header .header__search, #footer .header__search { - background: #F5F6F7; - position: relative; - z-index: 1; - transition: all 0.2s ease-in-out; - opacity: 1; - visibility: visible; -} -#header .header__search.visually-hidden, #footer .header__search.visually-hidden { - visibility: hidden; - opacity: 0; - transition: all 0.2s ease-in-out; -} -@media (min-width: 0px) and (max-width: 1199.98px) { - #header nav#block-neon-main-menu > ul > li.myAccount, #footer nav#block-neon-main-menu > ul > li.myAccount { - padding: 1.5rem 0 0 0; - } - #header nav#block-neon-main-menu > ul > li.myAccount a, #footer nav#block-neon-main-menu > ul > li.myAccount a { - margin: 0 auto; - } -} -@media (min-width: 1200px) { - #header #root nav#block-neon-main-menu > ul.menu--main > li, #footer #root nav#block-neon-main-menu > ul.menu--main > li { - height: 100%; - } - #header #header nav#block-neon-main-menu > ul.menu--main > li, #footer #header nav#block-neon-main-menu > ul.menu--main > li { - height: 100%; - } - #header body:not([class]) nav#block-neon-main-menu > ul.menu--main > li, #footer body:not([class]) nav#block-neon-main-menu > ul.menu--main > li { - height: 100%; - } -} -#header li.myAccount, #footer li.myAccount { - display: none !important; -} -#header .ui-dialog.entity-browser-modal, #footer .ui-dialog.entity-browser-modal { - z-index: 3001; -} -#header .ui-widget-overlay, #footer .ui-widget-overlay { - opacity: 0.9; -} -#header .js-media-library-item-preview .field--name-thumbnail img, #footer .js-media-library-item-preview .field--name-thumbnail img { - width: auto !important; -} -#header .authContainer, #footer .authContainer { - text-align: right; - position: absolute; - z-index: 10; - border: 1px solid #0073cf; -} -#header .authContainer .openid-connect-login-form form > div, #footer .authContainer .openid-connect-login-form form > div { - border: none; -} -#header .authContainer .openid-connect-login-form .form-submit, #footer .authContainer .openid-connect-login-form .form-submit { - border: none; - background: none; -} -@media (max-width: 1199.95px) { - #header .authContainer, #footer .authContainer { - top: 13px; - right: 72px; - border: 1px solid #0073cf; - } - #header .authContainer a, #header .authContainer .form-submit, #footer .authContainer a, #footer .authContainer .form-submit { - display: inline-block; - color: #0073cf !important; - font-size: 0.55rem !important; - font-family: "Inter", Helvetica, Arial, sans-serif !important; - font-weight: 600 !important; - line-height: 1.75 !important; - white-space: nowrap; - text-transform: uppercase !important; - text-decoration: none; - padding: 5px 10px; - } - #header .authContainer a:hover, #header .authContainer .form-submit:hover, #footer .authContainer a:hover, #footer .authContainer .form-submit:hover { - text-decoration: underline; - } - #header .authContainer *:first-child, #footer .authContainer *:first-child { - border-right: 1px solid; - border-top-left-radius: 0px; - } - #header .authContainer *:last-child, #footer .authContainer *:last-child { - border-right: none; - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; - } -} -@media (min-width: 1200px) { - #header .authContainer, #footer .authContainer { - padding: 0px; - top: -1px; - right: 0px; - border: 1px solid #0073cf; - } - #header .authContainer a, #header .authContainer .form-submit, #footer .authContainer a, #footer .authContainer .form-submit { - display: inline-block; - color: #0073cf !important; - font-size: 0.55rem !important; - font-family: "Inter", Helvetica, Arial, sans-serif !important; - font-weight: 600 !important; - line-height: 1.75 !important; - white-space: nowrap; - text-transform: uppercase !important; - text-decoration: none; - padding: 5px 10px; - } - #header .authContainer a:hover, #header .authContainer .form-submit:hover, #footer .authContainer a:hover, #footer .authContainer .form-submit:hover { - text-decoration: underline; - } - #header .authContainer *:first-child, #footer .authContainer *:first-child { - border-right: 1px solid; - border-top-left-radius: 0px; - } - #header .authContainer *:last-child, #footer .authContainer *:last-child { - border-right: none; - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; - } -} -#header .footer-top__wrapper, #footer .footer-top__wrapper { - background-color: #352723; - color: #E4E6E7; -} -#header .footer-top__wrapper .footer-top__inner, #footer .footer-top__wrapper .footer-top__inner { - display: flex; - padding-top: 30px; - padding-bottom: 20px; - flex-direction: column; -} -@media (min-width: 500px) { - #header .footer-top__wrapper .footer-top__inner, #footer .footer-top__wrapper .footer-top__inner { - justify-content: space-between; - align-items: center; - } -} -@media (min-width: 768px) { - #header .footer-top__wrapper .footer-top__inner, #footer .footer-top__wrapper .footer-top__inner { - flex-direction: row; - } -} -#header .footer-top__logo-social, #footer .footer-top__logo-social { - display: flex; - flex-direction: column; - flex: none; - width: auto; - margin-bottom: 15px; -} -@media (min-width: 500px) { - #header .footer-top__logo-social, #footer .footer-top__logo-social { - justify-content: space-between; - align-items: center; - flex-direction: row; - margin-bottom: 0; - } -} -@media (min-width: 768px) { - #header .footer-top__logo-social, #footer .footer-top__logo-social { - flex-direction: column; - margin-right: 30px; - } -} -@media (min-width: 992px) { - #header .footer-top__logo-social, #footer .footer-top__logo-social { - flex-direction: row; - } -} -@media (min-width: 1200px) { - #header .footer-top__logo-social, #footer .footer-top__logo-social { - margin-right: 60px; - } -} -#header .footer-top__logo, #footer .footer-top__logo { - margin-bottom: 10px; -} -@media (min-width: 500px) { - #header .footer-top__logo, #footer .footer-top__logo { - margin-right: 30px; - } -} -@media (min-width: 992px) { - #header .footer-top__logo, #footer .footer-top__logo { - margin-bottom: 0; - } -} -@media (min-width: 1200px) { - #header .footer-top__logo, #footer .footer-top__logo { - margin-right: 60px; - } -} -@media (min-width: 1440px) { - #header .footer-top__logo, #footer .footer-top__logo { - margin-right: 80px; - } -} -#header .footer-top__social, #footer .footer-top__social { - display: flex; - align-items: center; -} -#header .footer-top__social h4, #footer .footer-top__social h4 { - margin: 0; - font-size: 14px; - line-height: 25px; - color: #E4E6E7; - font-weight: 400; -} -#header .footer-top__social ul, #footer .footer-top__social ul { - display: flex; - align-items: baseline; - margin: 0; - padding: 0; -} -#header .footer-top__social ul li, #footer .footer-top__social ul li { - display: block; -} -#header .footer-top__social ul li svg, #footer .footer-top__social ul li svg { - fill: #C2DEEA; - width: 16px; - transition: all 0.25s; -} -#header .footer-top__social ul li a, #footer .footer-top__social ul li a { - display: block; - padding: 0 10px; -} -#header .footer-top__social ul li a:hover svg, #footer .footer-top__social ul li a:hover svg { - fill: #0073CF; - transition: all 0.3s; -} -#header .footer-top__social ul li.facebook svg, #footer .footer-top__social ul li.facebook svg { - height: 20px; -} -#header .footer-top__newsletter, #footer .footer-top__newsletter { - display: flex; - flex-direction: column; - margin-bottom: 15px; -} -@media (min-width: 500px) { - #header .footer-top__newsletter, #footer .footer-top__newsletter { - align-items: center; - flex-direction: row; - } -} -#header .footer-top__newsletter .footer-top__newsletter-text h4, #footer .footer-top__newsletter .footer-top__newsletter-text h4 { - color: #E4E6E7; - font-family: "Inter", sans-serif; - font-weight: 400; - line-height: 25px; - margin: 0; -} -@media (min-width: 600px) { - #header .footer-top__newsletter .footer-top__newsletter-text h4, #footer .footer-top__newsletter .footer-top__newsletter-text h4 { - font-size: 20px; - } -} -#header .footer-top__newsletter .footer-top__newsletter-text p, #footer .footer-top__newsletter .footer-top__newsletter-text p { - font-size: 14px; - line-height: 25px; - color: #E4E6E7; - margin: 10px 0 0; -} -#header .footer-top__newsletter .footer-top__newsletter-btn, #footer .footer-top__newsletter .footer-top__newsletter-btn { - flex: none; - margin-top: 20px; -} -@media (min-width: 500px) { - #header .footer-top__newsletter .footer-top__newsletter-btn, #footer .footer-top__newsletter .footer-top__newsletter-btn { - margin-top: 0; - margin-left: 30px; - } -} -@media (min-width: 1440px) { - #header .footer-top__newsletter .footer-top__newsletter-btn, #footer .footer-top__newsletter .footer-top__newsletter-btn { - margin-left: 60px; - } -} -#header .footer-top__newsletter .footer-top__newsletter-btn a, #footer .footer-top__newsletter .footer-top__newsletter-btn a { - font-family: "Inter", sans-serif; - font-weight: 600; - font-size: 12px; - line-height: 18px; - color: #F5F6F7; - letter-spacing: 2.4px; - text-transform: uppercase; - padding: 12px 22px 12px 18px; - border: 1px solid #F5F6F7; - border-radius: 2px; - display: inline-block; - text-decoration: none; - transition: all 0.25s; -} -#header .footer-top__newsletter .footer-top__newsletter-btn a svg, #footer .footer-top__newsletter .footer-top__newsletter-btn a svg { - transform: translateX(-4px); - transition: all 0.25s; -} -#header .footer-top__newsletter .footer-top__newsletter-btn a svg .line, #footer .footer-top__newsletter .footer-top__newsletter-btn a svg .line { - stroke-dasharray: 11; - stroke-dashoffset: 11; - animation: arrowOut 0.1s linear forwards; -} -#header .footer-top__newsletter .footer-top__newsletter-btn a:hover, #header .footer-top__newsletter .footer-top__newsletter-btn a:active, #header .footer-top__newsletter .footer-top__newsletter-btn a:focus, #footer .footer-top__newsletter .footer-top__newsletter-btn a:hover, #footer .footer-top__newsletter .footer-top__newsletter-btn a:active, #footer .footer-top__newsletter .footer-top__newsletter-btn a:focus { - border: 1px solid #fff; - color: #352723; - background-color: #fff; - transition: all 0.25s; -} -#header .footer-top__newsletter .footer-top__newsletter-btn a:hover svg, #header .footer-top__newsletter .footer-top__newsletter-btn a:active svg, #header .footer-top__newsletter .footer-top__newsletter-btn a:focus svg, #footer .footer-top__newsletter .footer-top__newsletter-btn a:hover svg, #footer .footer-top__newsletter .footer-top__newsletter-btn a:active svg, #footer .footer-top__newsletter .footer-top__newsletter-btn a:focus svg { - transform: translateX(6px); - transition: all 0.25s; -} -#header .footer-top__newsletter .footer-top__newsletter-btn a:hover svg .line, #header .footer-top__newsletter .footer-top__newsletter-btn a:active svg .line, #header .footer-top__newsletter .footer-top__newsletter-btn a:focus svg .line, #footer .footer-top__newsletter .footer-top__newsletter-btn a:hover svg .line, #footer .footer-top__newsletter .footer-top__newsletter-btn a:active svg .line, #footer .footer-top__newsletter .footer-top__newsletter-btn a:focus svg .line { - animation: arrowIn 0.15s linear forwards; -} -#header .footer-top__newsletter .footer-top__newsletter-btn a:hover svg path, #header .footer-top__newsletter .footer-top__newsletter-btn a:active svg path, #header .footer-top__newsletter .footer-top__newsletter-btn a:focus svg path, #footer .footer-top__newsletter .footer-top__newsletter-btn a:hover svg path, #footer .footer-top__newsletter .footer-top__newsletter-btn a:active svg path, #footer .footer-top__newsletter .footer-top__newsletter-btn a:focus svg path { - stroke: #352723; -} -@keyframes arrowIn { - from { - stroke-dashoffset: 11; - } - to { - stroke-dashoffset: 0; - } -} -@keyframes arrowOut { - from { - stroke-dashoffset: 0; - } - to { - stroke-dashoffset: 11; - } -} -#header .footer-bottom__wrapper, #footer .footer-bottom__wrapper { - color: #fff; -/* background: #4B372E url("../../../../images/footer_bottom_rip.png") repeat-x center top; */ - padding-top: 30px; -} -#header .footer-bottom__wrapper .footer-bottom__inner, #footer .footer-bottom__wrapper .footer-bottom__inner { - justify-content: space-between; - padding-top: 30px; - padding-bottom: 55px; -} -@media (min-width: 992px) { - #header .footer-bottom__wrapper .footer-bottom__inner, #footer .footer-bottom__wrapper .footer-bottom__inner { - display: flex; - flex-wrap: wrap; - } -} -#header #block-footer .menu--footer, #footer #block-footer .menu--footer { - display: flex; - justify-content: flex-start; - flex-wrap: wrap; - align-items: center; - margin: 0 0 35px 0; - padding: 0; -} -#header #block-footer .menu--footer li, #footer #block-footer .menu--footer li { - display: block; - margin-right: 30px; -} -#header #block-footer .menu--footer li:last-child, #footer #block-footer .menu--footer li:last-child { - margin-right: 0; -} -#header #block-footer .menu--footer li a, #footer #block-footer .menu--footer li a { - color: #C2DEEA; - font-size: 14px; - line-height: 25px; - font-weight: 600; - text-decoration: none; - border-bottom: solid 1px #C2DEEA; - transition: all 250ms ease; -} -#header #block-footer .menu--footer li a:hover, #footer #block-footer .menu--footer li a:hover { - transition: all 300ms ease; - color: #fff; - border-bottom: none; -} -#header #block-footer .menu--footer li.myAccount, #footer #block-footer .menu--footer li.myAccount { - flex: none; - width: 100%; - margin: 0 0 25px 0; -} -#header #block-footer .menu--footer li.myAccount a, #footer #block-footer .menu--footer li.myAccount a { - padding: 6px 12px; - color: #565A5C; - letter-spacing: 1.2px; - text-transform: uppercase; - background: #E4E6E7; - border: 1px solid #E4E6E7; - border-radius: 2px; - font-weight: 600; - font-size: 12px; - text-decoration: none; - transition: all 250ms ease; -} -#header #block-footer .menu--footer li.myAccount a:hover, #footer #block-footer .menu--footer li.myAccount a:hover { - color: #0073CF; - transition: all 300ms ease; - background: #ffffff; - border: 1px solid #ffffff; -} -@media (min-width: 768px) { - #header #block-footer .menu--footer li.myAccount, #footer #block-footer .menu--footer li.myAccount { - width: auto; - margin: 0 30px 0 0; - } -} -@media (min-width: 992px) { - #header #block-footer .menu--footer, #footer #block-footer .menu--footer { - margin: 0; - } -} -#header .footer-bottom__copyright p, #footer .footer-bottom__copyright p { - font-size: 14px; - line-height: 25px; - color: #fff; - margin: 0; -} -#header .footer-bottom__message, #footer .footer-bottom__message { - margin: 30px 0 0 0; - flex: none; - width: 100%; -} -#header .footer-bottom__message p, #footer .footer-bottom__message p { - color: #fff; - font-size: 14px; - line-height: 25px; - margin: 0 0 10px 0; -} -#header .footer-bottom__message p:last-child, #footer .footer-bottom__message p:last-child { - margin: 0; -} \ No newline at end of file diff --git a/lib/service/BundleService.d.ts b/lib/service/BundleService.d.ts index 6ccc8b19..1b884ba9 100644 --- a/lib/service/BundleService.d.ts +++ b/lib/service/BundleService.d.ts @@ -1,6 +1,7 @@ import { Nullable } from '../types/core'; import { BundleContext } from '../types/neonContext'; import { CitationBundleState } from '../types/internal'; +import { DataProductDoiStatus } from '../types/neonApi'; export interface IBundleService { /** * Determines if the product is defined as a container or child within a bundle. @@ -61,7 +62,7 @@ export interface IBundleService { * @param productCode The product code to query with. * @return The bundle product code when available. */ - getBundleProductCode: (context: BundleContext, release: string, productCode: string) => Nullable; + getBundleProductCode: (context: BundleContext, release: string, productCode: string) => Nullable; /** * Determines if the product should forward availability for the bundle. * @param context The context to derive lookups from. @@ -72,11 +73,11 @@ export interface IBundleService { */ shouldForwardAvailability: (context: BundleContext, release: string, productCode: string, bundleProductCode: string) => boolean; /** - * Gets the owning split bundle product code. + * Gets the owning split bundle product codes. * @param context The context to derive lookups from. * @param release The release to get bundles for. * @param productCode The product code to query with. - * @return The bundle product code when available. + * @return The bundle product codes when available. */ getSplitProductBundles: (context: BundleContext, release: string, productCode: string) => string[]; /** @@ -95,6 +96,15 @@ export interface IBundleService { * @return The applicable bundle status for citations. */ determineCitationBundle: (context: BundleContext, release: Nullable, productCode: string) => CitationBundleState; + /** + * Determines the applicable bundle release. + * @param context The context to derive from. + * @param release The release to get bundles for. + * @param productCode The product code to query with. + * @param doiStatus The DOI status for the product, release. + * @returns The applicable bundle release. + */ + determineAppliedBundleRelease: (context: BundleContext, release: string, productCode: string, doiStatus: Nullable) => Nullable; } declare const BundleService: IBundleService; export default BundleService; diff --git a/lib/service/BundleService.js b/lib/service/BundleService.js index bc469f0f..6ad83dd4 100644 --- a/lib/service/BundleService.js +++ b/lib/service/BundleService.js @@ -56,6 +56,9 @@ var BundleService = { if (!(0, _typeUtil.exists)(context) || !(0, _typeUtil.exists)(context.bundleDoiLookup) || !(0, _typeUtil.exists)(context.bundleDoiLookup[release])) { return false; } + if (Array.isArray(context.bundleDoiLookup[release][productCode])) { + return (0, _typeUtil.existsNonEmpty)(context.bundleDoiLookup[release][productCode]); + } return (0, _typeUtil.isStringNonEmpty)(context.bundleDoiLookup[release][productCode]); }, isBundledProduct: function isBundledProduct(context, release, productCode) { @@ -72,7 +75,10 @@ var BundleService = { return null; } var bundledProductCode = context.bundleDoiLookup[release][productCode]; - if (!(0, _typeUtil.isStringNonEmpty)(bundledProductCode)) { + if (Array.isArray(bundledProductCode) && !(0, _typeUtil.existsNonEmpty)(bundledProductCode)) { + return null; + } + if (!Array.isArray(bundledProductCode) && !(0, _typeUtil.isStringNonEmpty)(bundledProductCode)) { return null; } return bundledProductCode; @@ -83,7 +89,7 @@ var BundleService = { if (!(0, _typeUtil.exists)(context) || !(0, _typeUtil.exists)(context.splitProducts) || !(0, _typeUtil.exists)(context.splitProducts[release]) || !(0, _typeUtil.exists)(context.bundleProductsForwardAvailability) || !(0, _typeUtil.exists)(context.bundleProductsForwardAvailability[release])) { return false; } - return context.splitProducts[release][productCode].every(function (splitToProduct) { + return context.splitProducts[release][productCode].some(function (splitToProduct) { return context.bundleProductsForwardAvailability[release][splitToProduct]; }); } @@ -127,7 +133,7 @@ var BundleService = { var isBundleChild = BundleService.isProductInBundle(context, bundleRelease, productCode); if (isBundleChild) { bundleParentCode = BundleService.getBundleProductCode(context, bundleRelease, productCode); - var hasManyParents = isBundleChild && BundleService.isSplitProduct(context, bundleRelease, productCode); + var hasManyParents = BundleService.isSplitProduct(context, bundleRelease, productCode); if (hasManyParents) { bundleParentCodes = BundleService.getSplitProductBundles(context, bundleRelease, productCode); } else { @@ -141,6 +147,49 @@ var BundleService = { parentCodes: bundleParentCodes, doiProductCode: bundleParentCode }; + }, + determineAppliedBundleRelease: function determineAppliedBundleRelease(context, release, productCode, doiStatus) { + if (!(0, _typeUtil.exists)(doiStatus)) { + return null; + } + var appliedDoiStatus; + var bundleParentCodes = null; + if ((0, _typeUtil.exists)(context)) { + bundleParentCodes = BundleService.getBundleProductCode(context, release, productCode); + } + if (!Array.isArray(doiStatus)) { + if (!(0, _typeUtil.exists)(bundleParentCodes)) { + appliedDoiStatus = doiStatus; + } else { + var checkProductCode; + if (Array.isArray(bundleParentCodes)) { + // eslint-disable-next-line prefer-destructuring + checkProductCode = bundleParentCodes[0]; + } else { + checkProductCode = bundleParentCodes; + } + var checkDoiStatus = doiStatus; + if ((0, _typeUtil.exists)(doiStatus) && checkProductCode.localeCompare(checkDoiStatus.productCode) === 0 && release.localeCompare(checkDoiStatus.release) === 0) { + appliedDoiStatus = doiStatus; + } + } + } else if (!(0, _typeUtil.exists)(bundleParentCodes)) { + appliedDoiStatus = doiStatus.find(function (ds) { + return (0, _typeUtil.exists)(ds) && productCode.localeCompare(ds.productCode) === 0 && release.localeCompare(ds.release) === 0; + }); + } else { + var _checkProductCode; + if (Array.isArray(bundleParentCodes)) { + // eslint-disable-next-line prefer-destructuring + _checkProductCode = bundleParentCodes[0]; + } else { + _checkProductCode = bundleParentCodes; + } + appliedDoiStatus = doiStatus.find(function (ds) { + return (0, _typeUtil.exists)(ds) && _checkProductCode.localeCompare(ds.productCode) === 0 && release.localeCompare(ds.release) === 0; + }); + } + return appliedDoiStatus; } }; Object.freeze(BundleService); diff --git a/lib/service/DrupalAssetService.d.ts b/lib/service/DrupalAssetService.d.ts new file mode 100644 index 00000000..c972deb9 --- /dev/null +++ b/lib/service/DrupalAssetService.d.ts @@ -0,0 +1,11 @@ +export interface IDrupalAssetService { + /** + * Cleans the CSS of relative URLs and converts where appropriate + * @param content The content to scrub + * @param replaceRelativeUrlsWithRoot Option to replace relative URLs with full + * @returns The scrubbed content + */ + cleanCss: (content: string, replaceRelativeUrlsWithRoot?: boolean) => string; +} +declare const DrupalAssetService: IDrupalAssetService; +export default DrupalAssetService; diff --git a/lib/service/DrupalAssetService.js b/lib/service/DrupalAssetService.js new file mode 100644 index 00000000..abead3ab --- /dev/null +++ b/lib/service/DrupalAssetService.js @@ -0,0 +1,52 @@ +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _NeonEnvironment = _interopRequireDefault(require("../components/NeonEnvironment")); +var _typeUtil = require("../util/typeUtil"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _wrapRegExp() { _wrapRegExp = function _wrapRegExp(re, groups) { return new BabelRegExp(re, void 0, groups); }; var _super = RegExp.prototype, _groups = new WeakMap(); function BabelRegExp(re, flags, groups) { var _this = new RegExp(re, flags); return _groups.set(_this, groups || _groups.get(re)), _setPrototypeOf(_this, BabelRegExp.prototype); } function buildGroups(result, re) { var g = _groups.get(re); return Object.keys(g).reduce(function (groups, name) { var i = g[name]; if ("number" == typeof i) groups[name] = result[i];else { for (var k = 0; void 0 === result[i[k]] && k + 1 < i.length;) { k++; } groups[name] = result[i[k]]; } return groups; }, Object.create(null)); } return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) { var result = _super.exec.call(this, str); if (result) { result.groups = buildGroups(result, this); var indices = result.indices; indices && (indices.groups = buildGroups(indices, this)); } return result; }, BabelRegExp.prototype[Symbol.replace] = function (str, substitution) { if ("string" == typeof substitution) { var groups = _groups.get(this); return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) { var group = groups[name]; return "$" + (Array.isArray(group) ? group.join("$") : group); })); } if ("function" == typeof substitution) { var _this = this; return _super[Symbol.replace].call(this, str, function () { var args = arguments; return "object" != _typeof(args[args.length - 1]) && (args = [].slice.call(args)).push(buildGroups(args, _this)), substitution.apply(this, args); }); } return _super[Symbol.replace].call(this, str, substitution); }, _wrapRegExp.apply(this, arguments); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +var DrupalAssetService = { + cleanCss: function cleanCss(content) { + var replaceRelativeUrlsWithRoot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var scrubbedContent = content; + if (!(0, _typeUtil.isStringNonEmpty)(scrubbedContent)) { + return scrubbedContent; + } + var matches = scrubbedContent.match(/^(.*url\(["']((?!data|https)).*)$/mg); + if (!(0, _typeUtil.exists)(matches)) { + return scrubbedContent; + } + matches.forEach(function (match) { + var shouldCommentMatch = true; + if (replaceRelativeUrlsWithRoot) { + var _groups2, _groups3; + var relativeUrlRegex = /*#__PURE__*/_wrapRegExp(/(url\(["']\.\.\/\.\.\/\.\.\/\.\.\/(images\/.+)["']\))/, { + relative: 1, + path: 2 + }); + var matchesRelative = relativeUrlRegex.exec(match); + if ((0, _typeUtil.exists)(matchesRelative) && matchesRelative.length > 0 && (0, _typeUtil.exists)(matchesRelative.groups) && (0, _typeUtil.isStringNonEmpty)((_groups2 = matchesRelative.groups) === null || _groups2 === void 0 ? void 0 : _groups2.relative) && (0, _typeUtil.isStringNonEmpty)((_groups3 = matchesRelative.groups) === null || _groups3 === void 0 ? void 0 : _groups3.path)) { + var _groups4, _groups5; + var replaceRelative = (_groups4 = matchesRelative.groups) === null || _groups4 === void 0 ? void 0 : _groups4.relative; + var replaceRelativePath = (_groups5 = matchesRelative.groups) === null || _groups5 === void 0 ? void 0 : _groups5.path; + var replaceWith = "url(\"".concat(_NeonEnvironment.default.getWebHost(), "/themes/custom/neon/").concat(replaceRelativePath, "\")"); + scrubbedContent = scrubbedContent.replace(replaceRelative, replaceWith); + shouldCommentMatch = false; + } + } + if (shouldCommentMatch) { + var replacement = match.endsWith('}') ? "/* ".concat(match.slice(0, -1), " */ }") : "/* ".concat(match, " */"); + scrubbedContent = scrubbedContent.replace(match, replacement); + } + }); + return scrubbedContent; + } +}; +var _default = DrupalAssetService; +exports.default = _default; \ No newline at end of file diff --git a/lib/service/ReleaseService.d.ts b/lib/service/ReleaseService.d.ts index 6015cbea..d618b582 100644 --- a/lib/service/ReleaseService.d.ts +++ b/lib/service/ReleaseService.d.ts @@ -46,7 +46,7 @@ export interface IReleaseService { * @param doiStatus The DOI status representation * @return The transformed release like representation */ - transformDoiStatusRelease: (doiStatus: DataProductDoiStatus) => Nullable; + transformDoiStatusRelease: (doiStatus: Nullable) => Nullable; } declare const ReleaseService: IReleaseService; export default ReleaseService; diff --git a/lib/service/ReleaseService.js b/lib/service/ReleaseService.js index 6ba9b86f..ad3f6026 100644 --- a/lib/service/ReleaseService.js +++ b/lib/service/ReleaseService.js @@ -110,15 +110,16 @@ var ReleaseService = { if (!(0, _typeUtil.exists)(doiStatus)) { return null; } + var appliedDoiStatus = doiStatus; var transformed = { url: '', productDoi: { - url: doiStatus.url, - generationDate: doiStatus.generationDate + url: appliedDoiStatus.url, + generationDate: appliedDoiStatus.generationDate }, - release: doiStatus.release, - generationDate: doiStatus.releaseGenerationDate, - description: doiStatus.release, + release: appliedDoiStatus.release, + generationDate: appliedDoiStatus.releaseGenerationDate, + description: appliedDoiStatus.release, showCitation: true, showDoi: true, showViz: false diff --git a/lib/service/RouteService.d.ts b/lib/service/RouteService.d.ts index 580534ba..725cf26f 100644 --- a/lib/service/RouteService.d.ts +++ b/lib/service/RouteService.d.ts @@ -82,6 +82,11 @@ export interface IRouteService { * @returns */ getDataAvailabilityPath: () => string; + /** + * Gets the path to the data product bundles information page + * @returns + */ + getDataProductBundlesPath: () => string; /** * Gets the path to the NEONUtilities data stack in R page * @returns diff --git a/lib/service/RouteService.js b/lib/service/RouteService.js index 4be95622..94088fad 100644 --- a/lib/service/RouteService.js +++ b/lib/service/RouteService.js @@ -56,6 +56,9 @@ var RouteService = { getDataAvailabilityPath: function getDataAvailabilityPath() { return "".concat(_NeonEnvironment.default.getWebHost(), "/data-samples/data-management/data-availability"); }, + getDataProductBundlesPath: function getDataProductBundlesPath() { + return "".concat(_NeonEnvironment.default.getWebHost(), "/data-samples/data-management/data-product-bundles"); + }, getNeonUtilitiesDataStackRPath: function getNeonUtilitiesDataStackRPath() { return "".concat(_NeonEnvironment.default.getWebHost(), "/resources/learning-hub/tutorials/neondatastackr"); }, diff --git a/lib/types/internal.d.ts b/lib/types/internal.d.ts index bc24c633..fc7c67f7 100644 --- a/lib/types/internal.d.ts +++ b/lib/types/internal.d.ts @@ -1,4 +1,8 @@ import { Nullable } from './core'; +export interface IDataProductLike { + productCode: string; + productName: string; +} export interface IReleaseLike { release: string; generationDate: string; @@ -17,7 +21,7 @@ export interface Release extends IReleaseLike { } export interface CitationBundleState { parentCodes: string[]; - doiProductCode: Nullable; + doiProductCode: Nullable; } export interface SensorPosition { horVer: string; diff --git a/lib/types/neonContext.d.ts b/lib/types/neonContext.d.ts index 1066e5a1..eec7908b 100644 --- a/lib/types/neonContext.d.ts +++ b/lib/types/neonContext.d.ts @@ -17,16 +17,16 @@ export interface BundleContext { bundleProductsForwardAvailability: Record>; /** * Defines the set of bundled products, to the container product - * that should provide the DOI for the bundled product. + * that should provide the DOI(s) for the bundled product. * { * "RELEASE": { - * "PRODUCT_CODE": "BUNDLE_PRODUCT_CODE", + * "PRODUCT_CODE": "BUNDLE_PRODUCT_CODE" OR ["BUNDLE_PRODUCT_CODE", "BUNDLE_PRODUCT_CODE"], * }, * } * This lookup can also be utilized to determine whether or not * a product exists within a bundle. */ - bundleDoiLookup: Record>; + bundleDoiLookup: Record>; /** * Defines the set of products that should be presented as "split", * defined as products that now exist in more than one product, diff --git a/lib/workers/generateTimeSeriesGraphData.js b/lib/workers/generateTimeSeriesGraphData.js index dd4efce6..de9bbc91 100644 --- a/lib/workers/generateTimeSeriesGraphData.js +++ b/lib/workers/generateTimeSeriesGraphData.js @@ -185,6 +185,7 @@ function generateTimeSeriesGraphData() { dateTimeVariable = _inData$selection.dateTimeVariable, qualityFlags = _inData$selection.qualityFlags, sites = _inData$selection.sites, + derivedVariableTable = _inData$selection.derivedVariableTable, selectedTimeStep = _inData$selection.timeStep, selectedVariables = _inData$selection.variables; // Optionally toggle to allow a purely positional mapping @@ -337,6 +338,13 @@ function generateTimeSeriesGraphData() { ticker += seconds * 1000; currentMonth = tickerToMonth(ticker); } + var derivedVariableTables = []; + Object.keys(derivedVariableTable).forEach(function (k) { + var v = derivedVariableTable[k]; + if (!derivedVariableTables.includes(v)) { + derivedVariableTables.push(v); + } + }); /** Build the rest of the data structure and labels using selection values @@ -386,22 +394,24 @@ function generateTimeSeriesGraphData() { return; } // 0 is x, so this should always be 1 or greater var pkg = stateVariables[variable].downloadPkg; + var derivedTableName = derivedVariableTable[variable]; var posData = product.sites[siteCode].positions[position].data; // Null-fill if this site/position/month/variable has // neither series data nor dateTime data - if (!posData[month] || !posData[month][pkg] || !posData[month][pkg][timeStep] || !posData[month][pkg][timeStep].series[variable] || !posData[month][pkg][timeStep].series[dateTimeVariable]) { + if (!posData[month] || !posData[month][pkg] || !posData[month][pkg][timeStep] || !posData[month][pkg][timeStep][derivedTableName] || !posData[month][pkg][timeStep][derivedTableName].series[variable] || !posData[month][pkg][timeStep][derivedTableName].series[dateTimeVariable]) { for (var t = monthIdx; t < monthIdx + monthStepCount; t += 1) { newData[t][columnIdx] = null; } return; } // This site/position/month/variable series exists, so add it into the data set - var seriesStepCount = posData[month][pkg][timeStep].series[variable].data.length; + // eslint-disable-next-line max-len + var seriesStepCount = posData[month][pkg][timeStep][derivedTableName].series[variable].data.length; // Series and month data lengths are identical (as expected): // Stream values directly in without matching timestamps if (ALLOW_POSITIONAL_TS_MAPPING) { if (seriesStepCount === monthStepCount) { - posData[month][pkg][timeStep].series[variable].data.forEach(function (d, datumIdx) { + posData[month][pkg][timeStep][derivedTableName].series[variable].data.forEach(function (d, datumIdx) { newData[datumIdx + monthIdx][columnIdx] = d; }); return; @@ -412,7 +422,7 @@ function generateTimeSeriesGraphData() { // exceed month step count if (ALLOW_POSITIONAL_TS_TRUNCATION) { if (seriesStepCount >= monthStepCount) { - posData[month][pkg][timeStep].series[variable].data.forEach(function (d, datumIdx) { + posData[month][pkg][timeStep][derivedTableName].series[variable].data.forEach(function (d, datumIdx) { if (datumIdx >= monthStepCount) { return; } @@ -433,14 +443,15 @@ function generateTimeSeriesGraphData() { // that the next value won't be found before the last found index in the series data, // allowing us to optimize the search in this scenario. var lastIdx = 0; - var dtVarData = posData[month][pkg][timeStep].series[dateTimeVariable].data; + // eslint-disable-next-line max-len + var dtVarData = posData[month][pkg][timeStep][derivedTableName].series[dateTimeVariable].data; for (var _t = monthIdx; _t < monthIdx + monthStepCount; _t += 1) { var dataIdx = findTimestampIdx(dtVarData, newData[_t][0].getTime(), lastIdx); if (dataIdx === -1) { newData[_t][columnIdx] = null; } else { lastIdx = dataIdx + 1; - newData[_t][columnIdx] = posData[month][pkg][timeStep].series[variable].data[dataIdx]; + newData[_t][columnIdx] = posData[month][pkg][timeStep][derivedTableName].series[variable].data[dataIdx]; } } }); @@ -451,22 +462,28 @@ function generateTimeSeriesGraphData() { if (columnIdx < 2) { return; } // 0 is start and 1 is end - var pkg = stateVariables[qf].downloadPkg; + var _stateVariables$qf = stateVariables[qf], + pkg = _stateVariables$qf.downloadPkg, + qfTables = _stateVariables$qf.tables; + var derivedTableName = !qfTables ? null : Array.from(qfTables).find(function (qfTable) { + return derivedVariableTables.includes(qfTable); + }); var posData = product.sites[siteCode].positions[position].data; // If this site/position/month/variable has no series data then fill with nulls - if (!posData[month] || !posData[month][pkg] || !posData[month][pkg][timeStep] || !posData[month][pkg][timeStep].series[qf]) { + if (!posData[month] || !posData[month][pkg] || !posData[month][pkg][timeStep] || !posData[month][pkg][timeStep][derivedTableName] || !posData[month][pkg][timeStep][derivedTableName].series[qf]) { for (var t = monthIdx; t < monthIdx + monthStepCount; t += 1) { newQualityData[t][columnIdx] = getQFNullFill(); } return; } // This site/position/month/qf series exists, so add it into the quality data set - var seriesStepCount = posData[month][pkg][timeStep].series[qf].data.length; + // eslint-disable-next-line max-len + var seriesStepCount = posData[month][pkg][timeStep][derivedTableName].series[qf].data.length; // Series and month data lengths are identical as expected so we can stream // values directly in without matching timestamps if (ALLOW_POSITIONAL_TS_MAPPING) { if (seriesStepCount === monthStepCount) { - posData[month][pkg][timeStep].series[qf].data.forEach(function (d, datumIdx) { + posData[month][pkg][timeStep][derivedTableName].series[qf].data.forEach(function (d, datumIdx) { var t = datumIdx + monthIdx; if (!Array.isArray(newQualityData[t][columnIdx])) { newQualityData[t][columnIdx] = []; @@ -481,7 +498,7 @@ function generateTimeSeriesGraphData() { // exceed month step count if (ALLOW_POSITIONAL_TS_TRUNCATION) { if (seriesStepCount > monthStepCount) { - posData[month][pkg][timeStep].series[qf].data.forEach(function (d, datumIdx) { + posData[month][pkg][timeStep][derivedTableName].series[qf].data.forEach(function (d, datumIdx) { if (datumIdx >= monthStepCount) { return; } @@ -502,14 +519,15 @@ function generateTimeSeriesGraphData() { // that the next value won't be found before the last found index in the series data, // allowing us to optimize the search in this scenario. var lastIdx = 0; - var dtVarData = posData[month][pkg][timeStep].series[dateTimeVariable].data; + // eslint-disable-next-line max-len + var dtVarData = posData[month][pkg][timeStep][derivedTableName].series[dateTimeVariable].data; for (var _t2 = monthIdx; _t2 < monthIdx + monthStepCount; _t2 += 1) { var dataIdx = findTimestampIdx(dtVarData, newQualityData[_t2][0].getTime(), lastIdx); if (dataIdx === -1) { newQualityData[_t2][columnIdx] = getQFNullFill(); } else { lastIdx = dataIdx + 1; - var d = typeof posData[month][pkg][timeStep].series[qf].data[dataIdx] !== 'undefined' ? posData[month][pkg][timeStep].series[qf].data[dataIdx] : null; + var d = typeof posData[month][pkg][timeStep][derivedTableName].series[qf].data[dataIdx] !== 'undefined' ? posData[month][pkg][timeStep][derivedTableName].series[qf].data[dataIdx] : null; if (!Array.isArray(newQualityData[_t2][columnIdx])) { newQualityData[_t2][columnIdx] = []; } diff --git a/package-lock.json b/package-lock.json index eec1ac27..cc676bb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,18 @@ { "name": "portal-core-components", - "version": "2.0.1", + "version": "2.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "portal-core-components", - "version": "2.0.1", + "version": "2.1.0", "dependencies": { "@date-io/moment": "^1.3.13", - "@fontsource/inter": "^4.5.14", + "@fortawesome/fontawesome-svg-core": "^6.3.0", + "@fortawesome/free-regular-svg-icons": "^6.3.0", + "@fortawesome/free-solid-svg-icons": "^6.3.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "~4.0.0-alpha.61", @@ -78,6 +81,8 @@ "@jest/globals": "^29.3.1", "@testing-library/react-hooks": "^8.0.1", "@typescript-eslint/parser": "^5.45.0", + "commander": "^9.4.1", + "cssnano": "^5.1.14", "eslint": "^8.28.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", @@ -86,7 +91,10 @@ "express": "^4.18.2", "html-loader": "^4.2.0", "jest-canvas-mock": "^2.4.0", + "jsdom": "^20.0.3", "node-fetch": "^3.3.0", + "postcss": "^8.4.20", + "prettier": "^2.8.1", "react-scripts": "^5.0.1", "react-test-renderer": "^17.0.2", "typescript": "~4.9.3", @@ -142,6 +150,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -2556,10 +2573,62 @@ "@floating-ui/core": "^1.0.2" } }, - "node_modules/@fontsource/inter": { - "version": "4.5.14", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.14.tgz", - "integrity": "sha512-JDC9AocdPLuGsASkvWw9hS5gtHE7K9dOwL98XLrk5yjYqxy4uVnScG58NUvFMJDVJRl/7c8Wnap6PEs+7Zvj1Q==" + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", + "integrity": "sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz", + "integrity": "sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.3.0.tgz", + "integrity": "sha512-cZnwiVHZ51SVzWHOaNCIA+u9wevZjCuAGSvSYpNlm6A4H4Vhwh8481Bf/5rwheIC3fFKlgXxLKaw8Xeroz8Ntg==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz", + "integrity": "sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.7", @@ -5095,12 +5164,12 @@ } }, "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/@trysound/sax": { @@ -6032,23 +6101,20 @@ } }, "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dev": true, "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, "engines": { "node": ">=0.4.0" } @@ -7508,12 +7574,12 @@ } }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", "dev": true, "engines": { - "node": ">= 6" + "node": "^12.20.0 || >=14" } }, "node_modules/common-path-prefix": { @@ -8245,9 +8311,9 @@ "dev": true }, "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", "dev": true }, "node_modules/cssstyle": { @@ -8370,17 +8436,17 @@ } }, "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/date-fns": { @@ -8726,24 +8792,15 @@ ] }, "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "dev": true, "dependencies": { - "webidl-conversions": "^5.0.0" + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/domhandler": { @@ -10453,9 +10510,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -11017,15 +11074,15 @@ } }, "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "dependencies": { - "whatwg-encoding": "^1.0.5" + "whatwg-encoding": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/html-entities": { @@ -11081,15 +11138,6 @@ "node": "^14.13.1 || >=16.0.0" } }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/html-react-parser": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.4.tgz", @@ -11242,12 +11290,12 @@ } }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "dependencies": { - "@tootallnate/once": "1", + "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, @@ -13296,6 +13344,15 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/jest-environment-jsdom/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -13305,6 +13362,28 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-environment-jsdom/node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -13354,6 +13433,61 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-environment-jsdom/node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jest-environment-jsdom/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13363,6 +13497,32 @@ "node": ">=8" } }, + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", @@ -13413,6 +13573,58 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/jest-environment-jsdom/node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -13439,6 +13651,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-environment-jsdom/node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-environment-jsdom/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -13460,6 +13684,95 @@ "node": ">=8" } }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "node_modules/jest-environment-node": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", @@ -16847,41 +17160,40 @@ } }, "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "peerDependencies": { "canvas": "^2.5.0" @@ -16892,12 +17204,6 @@ } } }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -18503,9 +18809,9 @@ "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" }, "node_modules/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", "dev": true, "funding": [ { @@ -19757,6 +20063,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -21131,15 +21452,15 @@ "dev": true }, "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, "dependencies": { "xmlchars": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=v12.22.7" } }, "node_modules/scheduler": { @@ -22428,15 +22749,15 @@ } }, "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "dependencies": { "punycode": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/tryer": { @@ -22869,15 +23190,15 @@ } }, "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, "dependencies": { - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/walker": { @@ -22928,12 +23249,12 @@ } }, "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "engines": { - "node": ">=10.4" + "node": ">=12" } }, "node_modules/webpack": { @@ -23176,27 +23497,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-manifest-plugin": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", @@ -23285,12 +23585,27 @@ } }, "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "dependencies": { - "iconv-lite": "0.4.24" + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/whatwg-fetch": { @@ -23300,23 +23615,25 @@ "dev": true }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/which": { @@ -23770,12 +24087,12 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -23791,10 +24108,13 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/xmlchars": { "version": "2.2.0", diff --git a/package.json b/package.json index ecb5312f..6239b1f4 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,15 @@ { "name": "portal-core-components", - "version": "2.0.1", + "version": "2.1.0", "main": "./lib/index.js", "private": true, "homepage": "http://localhost:3010/core-components", "dependencies": { "@date-io/moment": "^1.3.13", - "@fontsource/inter": "^4.5.14", + "@fortawesome/fontawesome-svg-core": "^6.3.0", + "@fortawesome/free-regular-svg-icons": "^6.3.0", + "@fortawesome/free-solid-svg-icons": "^6.3.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "~4.0.0-alpha.61", @@ -64,12 +67,22 @@ "zod": "^3.20.2" }, "peerDependencies": { + "commander": "^9.4.1", + "cssnano": "^5.1.14", + "jsdom": "^20.0.3", + "node-fetch": "^3.3.0", + "postcss": "^8.4.20", + "prettier": "^2.8.1", "worker-loader": "^3.0.8" }, "peerDependenciesMeta": { - "worker-loader": { - "optional": true - } + "commander": { "optional": true }, + "cssnano": { "optional": true }, + "jsdom": { "optional": true }, + "node-fetch": { "optional": true }, + "postcss": { "optional": true }, + "prettier": { "optional": true }, + "worker-loader": { "optional": true } }, "devDependencies": { "@babel/cli": "^7.19.3", @@ -83,6 +96,8 @@ "@jest/globals": "^29.3.1", "@testing-library/react-hooks": "^8.0.1", "@typescript-eslint/parser": "^5.45.0", + "commander": "^9.4.1", + "cssnano": "^5.1.14", "eslint": "^8.28.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", @@ -91,7 +106,10 @@ "express": "^4.18.2", "html-loader": "^4.2.0", "jest-canvas-mock": "^2.4.0", + "jsdom": "^20.0.3", "node-fetch": "^3.3.0", + "postcss": "^8.4.20", + "prettier": "^2.8.1", "react-scripts": "^5.0.1", "react-test-renderer": "^17.0.2", "typescript": "~4.9.3", @@ -111,7 +129,7 @@ "lib:clean": "(rm -r ./lib || true) && (rm -r ./src/lib_components/remoteAssets/* || true)", "lib:clean-build": "npm run lib:clean && npm run lib", "lib:types": "npx tsc --project tsconfig.d.json", - "lib:pre-process": "node ./scripts/lib/lib-cache-remote-assets.js", + "lib:pre-process": "node ./scripts/lib/lib-cache-remote-assets.js --prettify-index --css-replace-relative-urls", "lib:post-cleanup": "npm run lib:post-clean-styleGuides && npm run lib:post-clean-img && npm run lib:post-clean-tests && node ./scripts/lib/lib-fix-worker-babel.js", "lib:post-clean-styleGuides": "rm ./lib/components/**/StyleGuide.*", "lib:post-clean-img": "rm -r ./lib/components/SiteMap/png && rm -r ./lib/components/SiteMap/svg_source && rm -r ./lib/components/DataThemeIcon/svg_source", diff --git a/public/assets/css/drupal-fonts.css b/public/assets/css/drupal-fonts.css new file mode 100644 index 00000000..31845e14 --- /dev/null +++ b/public/assets/css/drupal-fonts.css @@ -0,0 +1,72 @@ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 100; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-100.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-100.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 200; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-200.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-200.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 300; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-300.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-300.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-400.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-400.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 500; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-500.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-500.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 600; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-600.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-600.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 700; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-700.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-700.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 800; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-800.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-800.woff') format('woff'); +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 900; + src: url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-900.woff2') format('woff2'), + url('https://www.neonscience.org/themes/custom/neon/fonts/Inter/Inter-900.woff') format('woff'); +} diff --git a/public/assets/css/drupal-theme.936428363449d98e7b7de4eb4218d349.min.css b/public/assets/css/drupal-theme.936428363449d98e7b7de4eb4218d349.min.css new file mode 100644 index 00000000..f35b5e80 --- /dev/null +++ b/public/assets/css/drupal-theme.936428363449d98e7b7de4eb4218d349.min.css @@ -0,0 +1,2 @@ +@charset "UTF-8";#footer,#header{color:#141516;font-family:Inter,sans-serif}#footer,#footer html,#header,#header html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#footer html,#header html{font-family:sans-serif}#footer body,#header body{margin:0}#footer article,#footer aside,#footer details,#footer figcaption,#footer figure,#footer footer,#footer header,#footer hgroup,#footer main,#footer nav,#footer section,#footer summary,#header article,#header aside,#header details,#header figcaption,#header figure,#header footer,#header header,#header hgroup,#header main,#header nav,#header section,#header summary{display:block}#footer audio,#footer canvas,#footer progress,#footer video,#header audio,#header canvas,#header progress,#header video{display:inline-block;vertical-align:baseline}#footer audio:not([controls]),#header audio:not([controls]){display:none;height:0}#footer [hidden],#footer template,#header [hidden],#header template{display:none}#footer a,#header a{background:transparent}#footer a:active,#footer a:hover,#header a:active,#header a:hover{outline:0}#footer abbr[title],#header abbr[title]{border-bottom:1px dotted}#footer b,#footer strong,#header b,#header strong{font-weight:700}#footer dfn,#header dfn{font-style:italic}#footer mark,#header mark{background:#ff0;color:#000}#footer small,#header small{font-size:80%}#footer sub,#footer sup,#header sub,#header sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}#footer sup,#header sup{top:-.5em}#footer sub,#header sub{bottom:-.25em}#footer img,#header img{border:0}#footer svg:not(:root),#header svg:not(:root){overflow:hidden}#footer hr,#header hr{box-sizing:border-box;height:0}#footer pre,#header pre{overflow:auto;white-space:pre-wrap;word-break:break-all}#footer code,#footer kbd,#footer pre,#footer samp,#header code,#header kbd,#header pre,#header samp{font-family:monospace,monospace}#footer table,#header table{border-collapse:collapse;border-spacing:0}#footer td,#footer th,#header td,#header th{padding:0}#footer .hidden,#header .hidden{display:none}#footer .visually-hidden,#header .visually-hidden{clip:rect(1px,1px,1px,1px);word-wrap:normal;height:1px;overflow:hidden;position:absolute!important;width:1px}#footer .visually-hidden.focusable:active,#footer .visually-hidden.focusable:focus,#header .visually-hidden.focusable:active,#header .visually-hidden.focusable:focus{clip:auto;height:auto;overflow:visible;position:static!important;width:auto}#footer .invisible,#header .invisible{visibility:hidden}@media (min-width:0px) and (max-width:1199.98px){#footer .isDesktop,#header .isDesktop{display:none!important}}@media (min-width:992px){#footer .isDesktop,#header .isDesktop{display:inherit}}@media (min-width:0px) and (max-width:1199.98px){#footer .isMobile,#header .isMobile{display:inherit}}@media (min-width:1200px){#footer .isMobile,#header .isMobile{display:none!important}}@media (min-width:0px) and (max-width:1199.98px){#footer .hiddenDesktop,#header .hiddenDesktop{display:inherit}}@media (min-width:1200px){#footer .hiddenDesktop,#header .hiddenDesktop{background:none!important;opacity:0!important;visibility:hidden!important}}@font-face{#footer,#header{font-display:swap;font-family:Inter;font-style:normal;font-style:italic;font-weight:100;font-weight:200;font-weight:300;font-weight:400;font-weight:500;font-weight:600;font-weight:700;font-weight:800;font-weight:900}}#footer *,#footer :after,#footer :before,#header *,#header :after,#header :before{box-sizing:border-box}#footer html,#header html{font-size:100%}#footer body,#header body{font-feature-settings:"ss01","ss03","ss04";background:#fff!important;color:#141516;font-family:Inter,sans-serif;overflow-x:hidden}@media (min-width:0px){#footer body,#header body{font-size:1.125rem}}@media (min-width:600px){#footer body,#header body{font-size:1.25rem}}#footer :focus,#header :focus{outline:1px dashed rgba(253,196,0,.6)}#footer :active,#header :active{outline:0}#footer h1,#header h1{font-feature-settings:"ss01","ss03","ss04";color:#000;font-family:Inter,sans-serif;font-weight:400;line-height:1;margin:1em 0}@media (min-width:0px){#footer h1,#header h1{font-size:2.125rem}}@media (min-width:600px){#footer h1,#header h1{font-size:3.375rem}}#footer h2,#header h2{font-feature-settings:"ss01","ss03","ss04";color:#000;font-family:Inter,sans-serif;font-weight:400;line-height:1;margin:1em 0}@media (min-width:0px){#footer h2,#header h2{font-size:1.375rem}}@media (min-width:600px){#footer h2,#header h2{font-size:1.875rem}}#footer h3,#header h3{font-feature-settings:"ss01","ss03","ss04";color:#000;font-family:Inter,sans-serif;font-weight:400;margin:1em 0}@media (min-width:0px){#footer h3,#header h3{font-size:1.25rem}}@media (min-width:600px){#footer h3,#header h3{font-size:1.5rem}}#footer h4,#header h4{font-feature-settings:"ss01","ss03","ss04";color:#000;font-family:Inter,sans-serif;font-weight:400;line-height:1;margin:1em 0}@media (min-width:0px){#footer h4,#header h4{font-size:1.125rem}}@media (min-width:600px){#footer h4,#header h4{font-size:1.25rem}}#footer h5,#header h5{font-feature-settings:"ss01","ss03","ss04";color:#000;font-family:Inter,sans-serif;font-weight:400;line-height:1;margin:1em 0}@media (min-width:0px){#footer h5,#header h5{font-size:1rem}}@media (min-width:600px){#footer h5,#header h5{font-size:1.125rem}}#footer h6,#header h6{font-feature-settings:"ss01","ss03","ss04";color:#000;font-family:Inter,sans-serif;font-weight:400;line-height:1;margin:1em 0}@media (min-width:0px){#footer h6,#header h6{font-size:.9375rem}}@media (min-width:600px){#footer h6,#header h6{font-size:1rem}}#footer body.page-node-type-page .layout-content h1,#header body.page-node-type-page .layout-content h1{margin:0 0 1.875rem}@media (min-width:768px){#footer body.page-node-type-page .layout-content h1,#header body.page-node-type-page .layout-content h1{margin:0 0 3.75rem}}#footer body.page-node-type-update .layout-content h1,#header body.page-node-type-update .layout-content h1{margin:0 0 1.125rem}@media (min-width:768px){#footer body.page-node-type-update .layout-content h1,#header body.page-node-type-update .layout-content h1{margin:0 0 1.5rem}}#footer p,#header p{color:#000;line-height:1.6;margin:1em 0}@media (min-width:0px){#footer p,#header p{font-size:1rem}}@media (min-width:600px){#footer p,#header p{font-size:1.125rem}}#footer blockquote:not([class]),#header blockquote:not([class]){border-left:6px solid #0073cf;margin:2rem 0;padding-left:1.5rem}@media (min-width:992px){#footer blockquote:not([class]),#header blockquote:not([class]){margin:4rem 0;padding-left:3.5rem}}#footer blockquote:not([class]),#footer blockquote:not([class]) p,#header blockquote:not([class]),#header blockquote:not([class]) p{color:#000!important;font-size:1.125rem;font-style:italic}@media (min-width:992px){#footer blockquote:not([class]),#footer blockquote:not([class]) p,#header blockquote:not([class]),#header blockquote:not([class]) p{font-size:1.3125rem}}#footer main dl:not([class]),#footer main ol:not([class]),#footer main ul:not([class]),#header main dl:not([class]),#header main ol:not([class]),#header main ul:not([class]){margin:1.25rem 0;padding-left:40px}#footer main li:not([class]),#header main li:not([class]){color:#565a5c;display:block;line-height:1.6;margin-bottom:.625rem;position:relative}@media (min-width:0px){#footer main li:not([class]),#header main li:not([class]){font-size:1rem}}@media (min-width:600px){#footer main li:not([class]),#header main li:not([class]){font-size:1.125rem}}#footer main li:not([class]):last-child,#header main li:not([class]):last-child{margin-bottom:0}#footer main ul li:not([class]):after,#header main ul li:not([class]):after{color:#558807;content:"•";display:block;left:-25px;position:absolute;top:0}#footer main ul li:not([class]) ul,#header main ul li:not([class]) ul{margin:.625rem 0}#footer main ol:not([class]),#header main ol:not([class]){counter-reset:item}#footer main ol:not([class]) li:not([class]):before,#header main ol:not([class]) li:not([class]):before{color:#558807;content:counter(item) ". ";counter-increment:item;left:-30px;position:absolute;top:0}#footer dt,#header dt{font-weight:600}#footer a:not([class]),#header a:not([class]){color:#0073cf}#footer a:not([class]):active,#footer a:not([class]):focus,#footer a:not([class]):hover,#header a:not([class]):active,#header a:not([class]):focus,#header a:not([class]):hover{color:#0092e2}h1>#footer a:not([class]),h1>#header a:not([class]),h2>#footer a:not([class]),h2>#header a:not([class]),h3>#footer a:not([class]),h3>#header a:not([class]),h4>#footer a:not([class]),h4>#header a:not([class]),h5>#footer a:not([class]),h5>#header a:not([class]),h6>#footer a:not([class]),h6>#header a:not([class]){text-decoration:none}@media (min-width:0px) and (max-width:767.98px){#footer a:not([class]),#header a:not([class]){word-wrap:break-word;overflow-wrap:break-word;word-break:break-all}}#footer hr:not([class]),#header hr:not([class]){border:0;border-bottom:1px solid #e4e6e7}#footer img,#header img{display:block;height:auto;max-width:100%}#footer figure:not([class]),#header figure:not([class]){margin:0}#footer figure:not([class]) img,#header figure:not([class]) img{display:block}#footer figcaption,#header figcaption{margin:1em 0}#footer div.responsive--video,#footer p.responsive--video,#header div.responsive--video,#header p.responsive--video{display:block;margin:2.5rem 0 0;max-width:560px;position:relative;width:100%}#footer div.responsive--video iframe,#footer p.responsive--video iframe,#header div.responsive--video iframe,#header p.responsive--video iframe{border:0;left:0;top:0;width:100%}#footer .video-embed-field-responsive-video:after,#header .video-embed-field-responsive-video:after{display:none}#footer .toolbar .toolbar-bar,#header .toolbar .toolbar-bar{z-index:3000!important}#footer .ui-autocomplete,#header .ui-autocomplete{z-index:9999}#footer .jumpmenu__heading a,#header .jumpmenu__heading a{font-weight:500;text-decoration:none}@media (min-width:0px){#footer .jumpmenu__heading a,#header .jumpmenu__heading a{font-size:.75rem}}@media (min-width:600px){#footer .jumpmenu__heading a,#header .jumpmenu__heading a{font-size:.8125rem}}#footer .jumpmenu__heading a.is-active,#header .jumpmenu__heading a.is-active{color:#565a5c;text-decoration:none}#footer .jumpmenu__heading a:active,#footer .jumpmenu__heading a:focus,#footer .jumpmenu__heading a:hover,#header .jumpmenu__heading a:active,#header .jumpmenu__heading a:focus,#header .jumpmenu__heading a:hover{color:#0092e2;text-decoration:underline}#footer .jumpmenu__heading a:visited,#header .jumpmenu__heading a:visited{color:#0073cf;text-decoration:none}#footer .jumpmenu__heading a:visited.is-active,#header .jumpmenu__heading a:visited.is-active{color:#565a5c}#footer .layout,#header .layout{padding:2.5rem 7.4074074074%}@media (min-width:1200px){#footer .layout,#header .layout{padding:3.75rem 7.4074074074%}}@media (min-width:1620px){#footer .layout,#header .layout{padding:3.75rem 0}}#footer body.path-frontpage .layout,#header body.path-frontpage .layout{padding:2.5rem 7.4074074074%}#footer .layout-wide,#header .layout-wide{padding:0}#footer .l--constrained,#header .l--constrained{box-sizing:border-box;margin-left:auto;margin-right:auto;max-width:1380px}#footer .l--narrow,#header .l--narrow{margin-left:auto;margin-right:auto;max-width:960px;width:100%}#footer .l--gutters,#header .l--gutters{padding-left:60px;padding-right:60px}#footer .l--offset-wide,#header .l--offset-wide{margin:0 auto;max-width:1620px;padding:0 3.125rem 0 2.25rem}#footer .sidebar .l--offset-wide,#header .sidebar .l--offset-wide{padding:0 2.25rem}@media (min-width:992px){#footer .sidebar .l--offset-wide,#header .sidebar .l--offset-wide{padding:0}}@media (min-width:1200px){#footer .sidebar .l--offset-wide,#header .sidebar .l--offset-wide{padding:0}}#footer .sidebar .page-content--wrapper .l--offset-wide,#header .sidebar .page-content--wrapper .l--offset-wide{padding:0}#footer body.page-node-type-page .l--offset-wide.page__default--withSidebar-wrapper .l--constrained,#header body.page-node-type-page .l--offset-wide.page__default--withSidebar-wrapper .l--constrained{box-sizing:border-box;max-width:1620px;padding:0 3.125rem 0 2.25rem;width:100%}#footer .l--offset-full,#header .l--offset-full{margin:0 auto;max-width:1620px}#footer .l--offset,#header .l--offset{padding-left:7.4074074074%;padding-right:7.4074074074%}@media (min-width:1620px){#footer .l--offset,#header .l--offset{padding-left:120px;padding-right:120px}}#footer .l--padded,#header .l--padded{padding-bottom:60px;padding-top:60px}#footer .l--vertical-spacing,#header .l--vertical-spacing{margin:2.5rem 0;width:100%}@media (min-width:1200px){#footer .l--vertical-spacing,#header .l--vertical-spacing{margin:3.75rem 0}}#footer .l--wrapper,#header .l--wrapper{display:flex;flex-direction:column}@media (min-width:992px){#footer .l--wrapper,#header .l--wrapper{flex-direction:row}#footer .l--wrapper .layout-sidebar,#header .l--wrapper .layout-sidebar{flex:none;order:1;width:300px}}#footer .l--wrapper .layout-sidebar .sidebar--wrapper,#header .l--wrapper .layout-sidebar .sidebar--wrapper{margin:1.875rem}@media (min-width:992px){#footer .l--wrapper .layout-sidebar .sidebar--wrapper,#header .l--wrapper .layout-sidebar .sidebar--wrapper{margin:1.875rem}}#footer .l--wrapper .page-content--wrapper,#header .l--wrapper .page-content--wrapper{order:2;padding:1.875rem 0}@media (min-width:992px){#footer .l--wrapper .page-content--wrapper,#header .l--wrapper .page-content--wrapper{flex:1;padding:4.875rem 1.875rem 3.75rem 3.75rem}}@media (min-width:1200px){#footer .l--wrapper .page-content--wrapper,#header .l--wrapper .page-content--wrapper{flex:1;padding:4.875rem 1.875rem 3.75rem 3.75rem}}@media (min-width:1440px){#footer .l--wrapper .page-content--wrapper,#header .l--wrapper .page-content--wrapper{flex:1;padding:4.875rem 1.875rem 4.5rem 7.5rem}}#footer .l--2col-wrapper,#header .l--2col-wrapper{width:100%}@media (min-width:992px){#footer .l--2col-wrapper,#header .l--2col-wrapper{display:flex}}#footer .l--2col-wrapper .page-content--main-content,#header .l--2col-wrapper .page-content--main-content{flex:1;order:1}#footer .l--2col-wrapper .page-content--secondary,#header .l--2col-wrapper .page-content--secondary{border-top:1px solid #d7d9d9;margin-top:1.875rem;padding-top:1.875rem}@media (min-width:992px){#footer .l--2col-wrapper .page-content--secondary,#header .l--2col-wrapper .page-content--secondary{border-top:none;flex:none;margin-left:3.75rem;margin-top:0;order:2;padding-top:0;width:180px}}@media (min-width:1200px){#footer .l--2col-wrapper .page-content--secondary,#header .l--2col-wrapper .page-content--secondary{margin-left:7.5rem;width:240px}}#footer .l--2col-wrapper .layout,#header .l--2col-wrapper .layout{padding-top:0}#footer .l--1col-wrapper,#header .l--1col-wrapper{width:100%}#footer .sticky,#header .sticky{margin-bottom:0;position:static}@media (min-width:992px){#footer .sticky,#header .sticky{margin-bottom:3.75rem;position:sticky;top:0}}#footer body.page-node-type-page .page-landing-page .paragraph--type--section:first-of-type .layout:first-of-type,#header body.page-node-type-page .page-landing-page .paragraph--type--section:first-of-type .layout:first-of-type{padding-top:0}#footer body.page-node-type-page .page-full .page__default--content .layout.default-layout,#footer main>.sidebar .paragraph--type--section .layout,#header body.page-node-type-page .page-full .page__default--content .layout.default-layout,#header main>.sidebar .paragraph--type--section .layout{padding-left:0;padding-right:0}#footer .l--layout-onecolumn-contained .l--constrained,#header .l--layout-onecolumn-contained .l--constrained{max-width:100%}#footer body.page-node-type-page h1.page__default--title,#header body.page-node-type-page h1.page__default--title{margin-bottom:0}#footer body.page-node-type-page .page__default--body p,#footer body.page-node-type-update .page__default--body p,#header body.page-node-type-page .page__default--body p,#header body.page-node-type-update .page__default--body p{color:#565a5c}#footer body.page-node-type-page .field--name-body>p.intro-style:first-of-type,#footer body.page-node-type-page .page__default--body>p.intro-style:first-of-type,#footer body.page-node-type-update .field--name-body>p.intro-style:first-of-type,#footer body.page-node-type-update .page__default--body>p.intro-style:first-of-type,#header body.page-node-type-page .field--name-body>p.intro-style:first-of-type,#header body.page-node-type-page .page__default--body>p.intro-style:first-of-type,#header body.page-node-type-update .field--name-body>p.intro-style:first-of-type,#header body.page-node-type-update .page__default--body>p.intro-style:first-of-type{margin-top:0}#footer body.page-node-type-page .field--name-body>p.intro-style,#footer body.page-node-type-page .page__default--body>p.intro-style,#footer body.page-node-type-update .field--name-body>p.intro-style,#footer body.page-node-type-update .page__default--body>p.intro-style,#header body.page-node-type-page .field--name-body>p.intro-style,#header body.page-node-type-page .page__default--body>p.intro-style,#header body.page-node-type-update .field--name-body>p.intro-style,#header body.page-node-type-update .page__default--body>p.intro-style{color:#141516;line-height:1.75}@media (min-width:0px){#footer body.page-node-type-page .field--name-body>p.intro-style,#footer body.page-node-type-page .page__default--body>p.intro-style,#footer body.page-node-type-update .field--name-body>p.intro-style,#footer body.page-node-type-update .page__default--body>p.intro-style,#header body.page-node-type-page .field--name-body>p.intro-style,#header body.page-node-type-page .page__default--body>p.intro-style,#header body.page-node-type-update .field--name-body>p.intro-style,#header body.page-node-type-update .page__default--body>p.intro-style{font-size:1.1875rem}}@media (min-width:600px){#footer body.page-node-type-page .field--name-body>p.intro-style,#footer body.page-node-type-page .page__default--body>p.intro-style,#footer body.page-node-type-update .field--name-body>p.intro-style,#footer body.page-node-type-update .page__default--body>p.intro-style,#header body.page-node-type-page .field--name-body>p.intro-style,#header body.page-node-type-page .page__default--body>p.intro-style,#header body.page-node-type-update .field--name-body>p.intro-style,#header body.page-node-type-update .page__default--body>p.intro-style{font-size:1.3125rem}}#footer .field--name-body>.embed:first-child figure,#header .field--name-body>.embed:first-child figure{margin-top:0}#footer .align-left,#header .align-left{float:none;margin:1.875rem 0}@media (min-width:768px){#footer .align-left,#header .align-left{float:left;margin:0 3.75rem 1.875rem 0;max-width:45%}}#footer .align-right,#header .align-right{float:none;margin:1.875rem 0}@media (min-width:768px){#footer .align-right,#header .align-right{float:right;margin:0 0 1.875rem 3.75rem;max-width:45%}}#footer .align-center,#header .align-center{display:block;margin:1.875rem 0}#footer figure,#header figure{margin:0}#footer figure img,#header figure img{width:100%}#footer figure .field--name-field-caption,#footer figure figcaption,#header figure .field--name-field-caption,#header figure figcaption{background:#f5f6f7;border-radius:0 0 6px 6px;color:#565a5c;font-size:15px;margin:0;padding:1.125rem 1.875rem}#footer figure .field--name-field-caption p,#footer figure figcaption p,#header figure .field--name-field-caption p,#header figure figcaption p{background:#f5f6f7;border-radius:0 0 6px 6px;font-size:15px;margin:0;padding:0}#footer article>figcaption,#header article>figcaption{margin:0}#footer article>figcaption p,#header article>figcaption p{background:#f5f6f7;border-radius:0 0 6px 6px;color:#565a5c;font-size:15px;margin:0;padding:1.125rem 1.875rem}#footer .field.field--type-image img,#header .field.field--type-image img{width:100%}#footer .field.field--type-image,#header .field.field--type-image{margin-bottom:0}#footer .field.field--type-image .field__item,#header .field.field--type-image .field__item{margin:0}#footer .field.field--name-thumbnail img,#header .field.field--name-thumbnail img{width:auto}#footer input[type=file],#header input[type=file]{height:inherit}#footer input[type=checkbox]:not(.nav-trigger),#header input[type=checkbox]:not(.nav-trigger){height:auto}#footer label,#footer legend,#header label,#header legend{margin:1em 0}#footer select,#header select{appearance:none;background:#f7f6f7;border-color:#c3c1c3;border-radius:0;height:2.1875rem;padding:0 10px;text-indent:.01px;text-overflow:""}#footer select::-ms-expand,#header select::-ms-expand{display:none}#footer button::-moz-focus-inner,#footer input::-moz-focus-inner,#header button::-moz-focus-inner,#header input::-moz-focus-inner{border:0;padding:0}#footer input,#header input{line-height:normal}#footer input[type=checkbox]:not(.nav-trigger),#footer input[type=radio],#header input[type=checkbox]:not(.nav-trigger),#header input[type=radio]{box-sizing:border-box;padding:0}#footer input[type=number]::-webkit-inner-spin-button,#footer input[type=number]::-webkit-outer-spin-button,#header input[type=number]::-webkit-inner-spin-button,#header input[type=number]::-webkit-outer-spin-button{height:auto}#footer input[type=search],#header input[type=search]{-webkit-appearance:textfield;box-sizing:border-box}#footer input[type=search]::-webkit-search-cancel-button,#footer input[type=search]::-webkit-search-decoration,#header input[type=search]::-webkit-search-cancel-button,#header input[type=search]::-webkit-search-decoration{-webkit-appearance:none}#footer fieldset,#header fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}#footer legend,#header legend{border:0;padding:0}#footer textarea,#header textarea{overflow:auto}#footer button,#footer input,#footer optgroup,#footer select,#footer textarea,#header button,#header input,#header optgroup,#header select,#header textarea{color:inherit;font:inherit;margin:0}#footer button,#header button{overflow:visible}#footer button,#footer select,#header button,#header select{text-transform:none}#footer button,#footer html input[type=button],#footer input[type=reset],#footer input[type=submit],#header button,#header html input[type=button],#header input[type=reset],#header input[type=submit]{-webkit-appearance:button;cursor:pointer}#footer button[disabled],#footer html input[disabled],#header button[disabled],#header html input[disabled]{cursor:default}#footer optgroup,#header optgroup{font-weight:700}#footer .form-item,#header .form-item{margin:1em 0}#footer .field,#header .field{margin-bottom:2em}#footer .field:last-child,#header .field:last-child{margin-bottom:0}#footer .field__label,#header .field__label{font-weight:700}#footer .views-field.views-field-entity-browser-select,#header .views-field.views-field-entity-browser-select{padding-bottom:0;padding-top:0}#footer .views-field.views-field-entity-browser-select .form-item,#header .views-field.views-field-entity-browser-select .form-item{margin:0}#footer .views-field.views-field-entity-browser-select .visually-hidden,#header .views-field.views-field-entity-browser-select .visually-hidden{margin:10px 0 0 -8px;padding:0}#footer .form-item label,#header .form-item label{color:#000;display:block;font-weight:600;margin-bottom:.375rem}@media (min-width:0px){#footer .form-item label,#header .form-item label{font-size:.9375rem}}@media (min-width:600px){#footer .form-item label,#header .form-item label{font-size:1rem}}#footer input[type=date]:not(.MuiInputBase-input),#footer input[type=email]:not(.MuiInputBase-input),#footer input[type=number]:not(.MuiInputBase-input),#footer input[type=password]:not(.MuiInputBase-input),#footer input[type=text]:not(.MuiInputBase-input),#footer input[type=time]:not(.MuiInputBase-input),#header input[type=date]:not(.MuiInputBase-input),#header input[type=email]:not(.MuiInputBase-input),#header input[type=number]:not(.MuiInputBase-input),#header input[type=password]:not(.MuiInputBase-input),#header input[type=text]:not(.MuiInputBase-input),#header input[type=time]:not(.MuiInputBase-input){background:#fff;border:1px solid #d7d9d9;border-radius:2px;box-shadow:inset 0 1px 0 #7c7f80;color:#000;font-weight:400;height:3rem;padding:.75rem 1.125rem;transition:all .25s}@media (min-width:0px){#footer input[type=date]:not(.MuiInputBase-input),#footer input[type=email]:not(.MuiInputBase-input),#footer input[type=number]:not(.MuiInputBase-input),#footer input[type=password]:not(.MuiInputBase-input),#footer input[type=text]:not(.MuiInputBase-input),#footer input[type=time]:not(.MuiInputBase-input),#header input[type=date]:not(.MuiInputBase-input),#header input[type=email]:not(.MuiInputBase-input),#header input[type=number]:not(.MuiInputBase-input),#header input[type=password]:not(.MuiInputBase-input),#header input[type=text]:not(.MuiInputBase-input),#header input[type=time]:not(.MuiInputBase-input){font-size:.9375rem}}@media (min-width:600px){#footer input[type=date]:not(.MuiInputBase-input),#footer input[type=email]:not(.MuiInputBase-input),#footer input[type=number]:not(.MuiInputBase-input),#footer input[type=password]:not(.MuiInputBase-input),#footer input[type=text]:not(.MuiInputBase-input),#footer input[type=time]:not(.MuiInputBase-input),#header input[type=date]:not(.MuiInputBase-input),#header input[type=email]:not(.MuiInputBase-input),#header input[type=number]:not(.MuiInputBase-input),#header input[type=password]:not(.MuiInputBase-input),#header input[type=text]:not(.MuiInputBase-input),#header input[type=time]:not(.MuiInputBase-input){font-size:1rem}}#footer input[type=date]:not(.MuiInputBase-input):hover,#footer input[type=email]:not(.MuiInputBase-input):hover,#footer input[type=number]:not(.MuiInputBase-input):hover,#footer input[type=password]:not(.MuiInputBase-input):hover,#footer input[type=text]:not(.MuiInputBase-input):hover,#footer input[type=time]:not(.MuiInputBase-input):hover,#header input[type=date]:not(.MuiInputBase-input):hover,#header input[type=email]:not(.MuiInputBase-input):hover,#header input[type=number]:not(.MuiInputBase-input):hover,#header input[type=password]:not(.MuiInputBase-input):hover,#header input[type=text]:not(.MuiInputBase-input):hover,#header input[type=time]:not(.MuiInputBase-input):hover{border:1px solid #0073cf!important;box-shadow:none;transition:all .25s}#footer input[type=date]:not(.MuiInputBase-input):active,#footer input[type=date]:not(.MuiInputBase-input):focus,#footer input[type=email]:not(.MuiInputBase-input):active,#footer input[type=email]:not(.MuiInputBase-input):focus,#footer input[type=number]:not(.MuiInputBase-input):active,#footer input[type=number]:not(.MuiInputBase-input):focus,#footer input[type=password]:not(.MuiInputBase-input):active,#footer input[type=password]:not(.MuiInputBase-input):focus,#footer input[type=text]:not(.MuiInputBase-input):active,#footer input[type=text]:not(.MuiInputBase-input):focus,#footer input[type=time]:not(.MuiInputBase-input):active,#footer input[type=time]:not(.MuiInputBase-input):focus,#header input[type=date]:not(.MuiInputBase-input):active,#header input[type=date]:not(.MuiInputBase-input):focus,#header input[type=email]:not(.MuiInputBase-input):active,#header input[type=email]:not(.MuiInputBase-input):focus,#header input[type=number]:not(.MuiInputBase-input):active,#header input[type=number]:not(.MuiInputBase-input):focus,#header input[type=password]:not(.MuiInputBase-input):active,#header input[type=password]:not(.MuiInputBase-input):focus,#header input[type=text]:not(.MuiInputBase-input):active,#header input[type=text]:not(.MuiInputBase-input):focus,#header input[type=time]:not(.MuiInputBase-input):active,#header input[type=time]:not(.MuiInputBase-input):focus{border:1px solid #0073cf!important;box-shadow:0 0 0 4px #c4c4c4;outline:none;transition:all .25s}#footer input[type=date]:not(.MuiInputBase-input):disabled,#footer input[type=email]:not(.MuiInputBase-input):disabled,#footer input[type=number]:not(.MuiInputBase-input):disabled,#footer input[type=password]:not(.MuiInputBase-input):disabled,#footer input[type=text]:not(.MuiInputBase-input):disabled,#footer input[type=time]:not(.MuiInputBase-input):disabled,#header input[type=date]:not(.MuiInputBase-input):disabled,#header input[type=email]:not(.MuiInputBase-input):disabled,#header input[type=number]:not(.MuiInputBase-input):disabled,#header input[type=password]:not(.MuiInputBase-input):disabled,#header input[type=text]:not(.MuiInputBase-input):disabled,#header input[type=time]:not(.MuiInputBase-input):disabled{background:#f5f6f7;border:1px solid #d7d9d9;box-shadow:inset 0 1px 0 #7c7f80;box-sizing:border-box;color:#a2a4a3}#footer .time-start,#header .time-start{display:flex}#footer textarea,#header textarea{background:#fff;border:1px solid #d7d9d9;border-radius:2px;box-shadow:inset 0 1px 0 #7c7f80;color:#000;font-weight:400;padding:.75rem 1.125rem;transition:all .25s}@media (min-width:0px){#footer textarea,#header textarea{font-size:.9375rem}}@media (min-width:600px){#footer textarea,#header textarea{font-size:1rem}}#footer textarea:hover,#header textarea:hover{border:1px solid #0073cf!important;box-shadow:none;transition:all .25s}#footer textarea:active,#footer textarea:focus,#header textarea:active,#header textarea:focus{border:1px solid #0073cf!important;box-shadow:0 0 0 4px #c4c4c4;outline:none;transition:all .25s}#footer textarea:disabled,#header textarea:disabled{background:#f5f6f7;border:1px solid #d7d9d9;box-shadow:inset 0 1px 0 #7c7f80;box-sizing:border-box;color:#a2a4a3}#footer select,#header select{background:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 1 5 5 1 1' stroke='%230073CF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:97% 50%;background-repeat:no-repeat;border:1px solid #d7d9d9;border-radius:2px;box-shadow:inset 0 -1px 0 #7c7f80;color:#000;font-weight:400;height:3rem;padding:.75rem 2.25rem .75rem 1.125rem;transition:all .25s}@media (min-width:0px){#footer select,#header select{font-size:.9375rem}}@media (min-width:600px){#footer select,#header select{font-size:1rem}}#footer select:hover,#header select:hover{border:1px solid #0073cf!important;box-shadow:none;transition:all .25s}#footer select:active,#footer select:focus,#header select:active,#header select:focus{border:1px solid #0073cf!important;box-shadow:0 0 0 4px #c4c4c4;outline:none;transition:all .25s}#footer select:disabled,#header select:disabled{background:#f5f6f7;border:1px solid #d7d9d9;box-shadow:inset 0 1px 0 #7c7f80;box-sizing:border-box;color:#a2a4a3}#footer .select2-selection.select2-selection--multiple,#header .select2-selection.select2-selection--multiple{background:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 1 5 5 1 1' stroke='%230073CF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:97% 50%;background-repeat:no-repeat;border:1px solid #d7d9d9;border-radius:2px;box-shadow:inset 0 -1px 0 #7c7f80;color:#000;font-weight:400;transition:all .25s}@media (min-width:0px){#footer .select2-selection.select2-selection--multiple,#header .select2-selection.select2-selection--multiple{font-size:.9375rem}}@media (min-width:600px){#footer .select2-selection.select2-selection--multiple,#header .select2-selection.select2-selection--multiple{font-size:1rem}}#footer .select2-selection.select2-selection--multiple:hover,#header .select2-selection.select2-selection--multiple:hover{border:1px solid #0073cf!important;box-shadow:none;transition:all .25s}#footer .select2-selection.select2-selection--multiple:active,#footer .select2-selection.select2-selection--multiple:focus,#header .select2-selection.select2-selection--multiple:active,#header .select2-selection.select2-selection--multiple:focus{border:1px solid #0073cf!important;box-shadow:0 0 0 4px #c4c4c4;outline:none;transition:all .25s}#footer .select2-selection.select2-selection--multiple:disabled,#header .select2-selection.select2-selection--multiple:disabled{background:#f5f6f7;border:1px solid #d7d9d9;box-shadow:inset 0 1px 0 #7c7f80;box-sizing:border-box;color:#a2a4a3}#footer .select2-selection.select2-selection--multiple .select2-container--default .select2-results__option--highlighted[data-selected],#header .select2-selection.select2-selection--multiple .select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073cf;color:#fff}#footer .select2-selection.select2-selection--multiple .select2-selection__choice .select2-selection__choice__remove,#header .select2-selection.select2-selection--multiple .select2-selection__choice .select2-selection__choice__remove{padding:.1875rem}#footer ::-webkit-file-upload-button,#footer button.button.form-submit.ui-button,#footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close),#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res),#header ::-webkit-file-upload-button,#header button.button.form-submit.ui-button,#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close),#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res){-webkit-appearance:none;background:#0073cf;border:1px solid #0073cf;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.25),0 1px 1px rgba(0,0,0,.25);color:#fff;font-size:13px;font-weight:700;letter-spacing:.1em;padding:.75rem 1.125rem;text-transform:uppercase;transition:all .25s}#footer ::-webkit-file-upload-button:hover,#footer button.button.form-submit.ui-button:hover,#footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):hover,#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):hover,#header ::-webkit-file-upload-button:hover,#header button.button.form-submit.ui-button:hover,#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):hover,#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):hover{background:#0092e2;border:1px solid #0092e2;box-shadow:0 1px 3px rgba(0,0,0,.25),0 1px 1px rgba(0,0,0,.25);transition:all .25s}#footer ::-webkit-file-upload-button:active,#footer ::-webkit-file-upload-button:focus,#footer button.button.form-submit.ui-button:active,#footer button.button.form-submit.ui-button:focus,#footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):active,#footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):focus,#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):active,#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):focus,#header ::-webkit-file-upload-button:active,#header ::-webkit-file-upload-button:focus,#header button.button.form-submit.ui-button:active,#header button.button.form-submit.ui-button:focus,#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):active,#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):focus,#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):active,#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):focus{background:#0092e2;border:1px solid #0073cf;box-shadow:0 0 0 4px #c4c4c4;transition:all .25s}#footer ::-webkit-file-upload-button:disabled,#footer button.button.form-submit.ui-button:disabled,#footer button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):disabled,#footer input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):disabled,#header ::-webkit-file-upload-button:disabled,#header button.button.form-submit.ui-button:disabled,#header button:not(.paragraphs-dropdown-togagle) :not(.erl-edit) :not(.ui-button) :not(.button--danger) :not(.layout-paragraphs-add-content__toggle) :not(.layout-handle) :not(.layout-up) :not(.layout-down) :not(.layout-handle) :not(.trigger) :not(.toolbar-item) :not(.toolbar-icon) :not(.MuiButtonBase-root) :not(.MuiLink-root) :not(.filter--trigger) :not(.filter--trigger-secondary) :not(.filter--trigger-tutorials) :not(.paragraphs-dropdown-toggle) :not(.isDesktop) :not(.subNavClose) :not(.focusable) :not(.mini-arrow) :not(.button--search) :not(.button__search-close):disabled,#header input[type=submit] :not(.paragraphs-dropdown-action) :not(.erl-edit) :not(.erl-remove) :not(#edit-submit-staff) :not(#edit-submit-blog) :not(.button--search) :not(.search-form__button) :not(#edit-submit-flight-res):disabled{background:#d7d9d9;color:#a2a4a3}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked,#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked),#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked){left:-9999px;position:absolute}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label,#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label{cursor:pointer;padding-left:1.95em;position:relative}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label:before,#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label:before,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label:before,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label:before{background:#fff;border:1px solid #d7d9d9;border-radius:50%;content:"";height:16px;left:0;position:absolute;top:0;width:16px}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label:after,#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label:after,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label:after,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='8' height='8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='8' height='8' rx='4' fill='%23000'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;content:"";display:block;height:8px;left:4px;position:absolute;top:4px;width:8px}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label:after,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked)+label:after{opacity:0;transform:scale(0)}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label:after,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked+label:after{opacity:1;transform:scale(1)}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:checked+label:before,#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:not(:checked)+label:before,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:checked+label:before,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):disabled:not(:checked)+label:before{background-color:#fff;border-color:#d7d9d9;box-shadow:none}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked:focus+label:before,#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked):focus+label:before,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):checked:focus+label:before,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input):not(:checked):focus+label:before{border:1px solid #0073cf;box-shadow:0 0 0 4px #c4c4c4}#footer form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input)+label:hover:before,#header form:not(.layout-paragraphs-component-form) input[type=radio]:not(.rlglc-input)+label:hover:before{border:1px solid #0073cf!important}#footer .form-no-label .visually-hidden,#header .form-no-label .visually-hidden{height:auto;overflow:initial;text-indent:-10000px;width:auto}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked,#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked),#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked){left:-9999px;position:absolute}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label,#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label{cursor:pointer;padding-left:1.95em;position:relative;z-index:1}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label:before,#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label:before,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label:before,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label:before{background:#fff;border:1px solid #d7d9d9;border-radius:2px;content:"";height:16px;left:0;position:absolute;top:0;width:16px}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label:after,#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label:after,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label:after,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m1 4 3 3 6-6' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;content:"";display:block;height:8px;left:3px;position:absolute;top:4px;width:11px}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label:after,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked)+label:after{opacity:0;transform:scale(0)}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label:after,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked+label:after{opacity:1;transform:scale(1)}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:checked+label:before,#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:not(:checked)+label:before,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:checked+label:before,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):disabled:not(:checked)+label:before{background-color:#fff;border-color:#d7d9d9;box-shadow:none}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked:focus+label:before,#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked):focus+label:before,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):checked:focus+label:before,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday):not(:checked):focus+label:before{border:1px solid #0073cf;box-shadow:0 0 0 4px #c4c4c4}#footer input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday)+label:hover:before,#header input[type=checkbox]:not(.nav-trigger):not(.rlglc-input):not(.allday)+label:hover:before{border:1px solid #0073cf!important}#footer .webform-element-description,#header .webform-element-description{color:#565a5c}@media (min-width:0px){#footer .webform-element-description,#header .webform-element-description{font-size:.875rem}}@media (min-width:600px){#footer .webform-element-description,#header .webform-element-description{font-size:.9375rem}}#footer #linkit-editor-dialog-form,#header #linkit-editor-dialog-form{min-height:400px}#footer .smartdate--time-inline,#header .smartdate--time-inline{grid-column-gap:.5em;align-content:center;align-items:baseline;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:flex-start}#footer .table-wrapper,#header .table-wrapper{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0)),linear-gradient(-90deg,#fff,hsla(0,0%,100%,0)) 100% 0,radial-gradient(farthest-side at 0 50%,rgba(0,0,0,.2),transparent),radial-gradient(farthest-side at 100% 50%,rgba(0,0,0,.2),transparent) 100% 0;background-attachment:local,local,scroll,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100px 100%,100px 100%,14px 100%,14px 100%;display:grid;overflow-x:auto}#footer .table-wrapper::-webkit-scrollbar,#header .table-wrapper::-webkit-scrollbar{-webkit-appearance:none;height:10px}#footer .table-wrapper::-webkit-scrollbar-thumb,#header .table-wrapper::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.5);border-radius:3px;-webkit-box-shadow:0 0 1px hsla(0,0%,100%,.5)}#footer table:not(.MuiTable-root),#header table:not(.MuiTable-root){border:none;border-collapse:collapse;border-spacing:0;caption-side:bottom;color:#000;margin:0;min-width:100%;text-align:left;vertical-align:top}@media (min-width:0px){#footer table:not(.MuiTable-root),#header table:not(.MuiTable-root){font-size:.75rem}}@media (min-width:600px){#footer table:not(.MuiTable-root),#header table:not(.MuiTable-root){font-size:.8125rem}}#footer table:not(.MuiTable-root) p,#header table:not(.MuiTable-root) p{color:inherit;font-size:inherit;line-height:inherit}#footer table:not(.MuiTable-root) td,#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) td,#header table:not(.MuiTable-root) th{border:none}#footer table:not(.MuiTable-root) thead th,#header table:not(.MuiTable-root) thead th{vertical-align:bottom}#footer table:not(.MuiTable-root) thead th a,#header table:not(.MuiTable-root) thead th a{padding:0}@media (min-width:0px){#footer table:not(.MuiTable-root) thead th a,#header table:not(.MuiTable-root) thead th a{font-size:.75rem}}@media (min-width:600px){#footer table:not(.MuiTable-root) thead th a,#header table:not(.MuiTable-root) thead th a{font-size:.8125rem}}#footer table:not(.MuiTable-root) td,#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) td,#header table:not(.MuiTable-root) th{padding:.625rem;vertical-align:top}@media (min-width:768px){#footer table:not(.MuiTable-root) td,#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) td,#header table:not(.MuiTable-root) th{padding:.625rem 1rem}}@media (min-width:992px){#footer table:not(.MuiTable-root) td,#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) td,#header table:not(.MuiTable-root) th{padding:1rem 1.25rem}}#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) th{border-left:1px solid #002c77}#footer table:not(.MuiTable-root) th:first-child,#header table:not(.MuiTable-root) th:first-child{border-left:none}#footer table:not(.MuiTable-root) td,#header table:not(.MuiTable-root) td{border-left:1px solid #d7d9d9}@media (min-width:0px){#footer table:not(.MuiTable-root) td,#header table:not(.MuiTable-root) td{font-size:.75rem}}@media (min-width:600px){#footer table:not(.MuiTable-root) td,#header table:not(.MuiTable-root) td{font-size:.8125rem}}#footer table:not(.MuiTable-root) td a,#header table:not(.MuiTable-root) td a{color:#0073cf;line-height:1.25}#footer table:not(.MuiTable-root) td:first-child,#header table:not(.MuiTable-root) td:first-child{border-left:none}#footer table:not(.MuiTable-root) tr:nth-of-type(odd),#header table:not(.MuiTable-root) tr:nth-of-type(odd){background-color:rgba(20,21,22,.04)}#footer table:not(.MuiTable-root) tr:nth-of-type(2n),#header table:not(.MuiTable-root) tr:nth-of-type(2n){background:none}#footer table:not(.MuiTable-root) caption,#header table:not(.MuiTable-root) caption{padding:1rem}#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) th{background:#0073cf;box-shadow:inset 0 -1px 0 #002c77;color:#fff;letter-spacing:.2em;text-transform:uppercase}@media (min-width:0px){#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) th{font-size:.75rem}}@media (min-width:600px){#footer table:not(.MuiTable-root) th,#header table:not(.MuiTable-root) th{font-size:.8125rem}}#footer table:not(.MuiTable-root) th a,#header table:not(.MuiTable-root) th a{color:#fff;overflow-wrap:break-word;text-decoration:none}#footer code,#header code{background:#fff;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.1);color:#000;display:inline;font-family:monospace,serif;padding:.1875rem .3125rem}#footer pre code,#header pre code{background:#e4e6e7;border-radius:3px;display:block;padding:.2rem}@media (min-width:0px){#footer pre code,#header pre code{font-size:1rem}}@media (min-width:600px){#footer pre code,#header pre code{font-size:1.125rem}}#footer .hljs-comment,#footer .hljs-quote,#header .hljs-comment,#header .hljs-quote{color:#969896}#footer .hljs-deletion,#footer .hljs-name,#footer .hljs-regexp,#footer .hljs-selector-class,#footer .hljs-selector-id,#footer .hljs-tag,#footer .hljs-template-variable,#footer .hljs-variable,#header .hljs-deletion,#header .hljs-name,#header .hljs-regexp,#header .hljs-selector-class,#header .hljs-selector-id,#header .hljs-tag,#header .hljs-template-variable,#header .hljs-variable{color:#c66}#footer .hljs-built_in,#footer .hljs-builtin-name,#footer .hljs-link,#footer .hljs-literal,#footer .hljs-meta,#footer .hljs-number,#footer .hljs-params,#footer .hljs-type,#header .hljs-built_in,#header .hljs-builtin-name,#header .hljs-link,#header .hljs-literal,#header .hljs-meta,#header .hljs-number,#header .hljs-params,#header .hljs-type{color:#de935f}#footer .hljs-attribute,#header .hljs-attribute{color:#f0c674}#footer .hljs-addition,#footer .hljs-bullet,#footer .hljs-string,#footer .hljs-symbol,#header .hljs-addition,#header .hljs-bullet,#header .hljs-string,#header .hljs-symbol{color:#b5bd68}#footer .hljs-section,#footer .hljs-title,#header .hljs-section,#header .hljs-title{color:#81a2be}#footer .hljs-keyword,#footer .hljs-selector-tag,#header .hljs-keyword,#header .hljs-selector-tag{color:#b294bb}#footer .hljs,#header .hljs{background:#fff;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.1);display:inline;font-family:monospace,serif;padding:.1875rem .3125rem}#footer pre .hljs,#header pre .hljs{background:#1d1f21;border-radius:3px;color:#c5c8c6;display:block;overflow-x:auto;padding:1.25rem 1.875rem}#footer .hljs-emphasis,#header .hljs-emphasis{font-style:italic}#footer .hljs-strong,#header .hljs-strong{font-weight:700}#footer #ds-objectives,#header #ds-objectives{background:#f3f8fb;border:1px solid #0073cf;border-radius:3px;box-sizing:border-box;margin:1.875rem 0;padding:.75rem .9375rem}@media (min-width:992px){#footer #ds-objectives,#header #ds-objectives{margin:3.75rem 0;padding:1.5rem 1.875rem}}#footer #ds-objectives h3,#header #ds-objectives h3{color:#000;font-weight:700;letter-spacing:.2em;margin:1.125rem 0 .25rem;text-transform:uppercase}@media (min-width:0px){#footer #ds-objectives h3,#header #ds-objectives h3{font-size:.75rem}}@media (min-width:600px){#footer #ds-objectives h3,#header #ds-objectives h3{font-size:.8125rem}}#footer #ds-objectives h2:first-child,#footer #ds-objectives h3:first-child,#header #ds-objectives h2:first-child,#header #ds-objectives h3:first-child{margin-top:0}#footer .link--button.link--arrow,#header .link--button.link--arrow{border:1px solid #0073cf;border-radius:2px;color:#0073cf;display:inline-block;font-weight:700;letter-spacing:.1em;line-height:24px;margin:1.875rem 0 0;padding:.5625rem 2.25rem .5625rem 1.125rem;text-decoration:none;text-transform:uppercase;transition:all .25s}@media (min-width:0px){#footer .link--button.link--arrow,#header .link--button.link--arrow{font-size:.75rem}}@media (min-width:600px){#footer .link--button.link--arrow,#header .link--button.link--arrow{font-size:.8125rem}}@media (min-width:992px){#footer .link--button.link--arrow,#header .link--button.link--arrow{padding:.75rem 2.25rem .75rem 1.125rem}}#footer .link--button.link--arrow svg,#header .link--button.link--arrow svg{transform:translateX(10px);transition:all .25s}#footer .link--button.link--arrow svg .line,#header .link--button.link--arrow svg .line{stroke-dasharray:11;stroke-dashoffset:11;animation:arrowOut .1s linear forwards}#footer .link--button.link--arrow:active,#footer .link--button.link--arrow:focus,#footer .link--button.link--arrow:hover,#header .link--button.link--arrow:active,#header .link--button.link--arrow:focus,#header .link--button.link--arrow:hover{border:1px solid #0092e2;color:#0092e2;text-decoration:underline;transition:all .25s}#footer .link--button.link--arrow:active svg,#footer .link--button.link--arrow:focus svg,#footer .link--button.link--arrow:hover svg,#header .link--button.link--arrow:active svg,#header .link--button.link--arrow:focus svg,#header .link--button.link--arrow:hover svg{transform:translateX(15px);transition:all .25s}#footer .link--button.link--arrow:active svg .line,#footer .link--button.link--arrow:focus svg .line,#footer .link--button.link--arrow:hover svg .line,#header .link--button.link--arrow:active svg .line,#header .link--button.link--arrow:focus svg .line,#header .link--button.link--arrow:hover svg .line{animation:arrowIn .15s linear forwards}#footer .link--button.link--arrow:active svg path,#footer .link--button.link--arrow:focus svg path,#footer .link--button.link--arrow:hover svg path,#header .link--button.link--arrow:active svg path,#header .link--button.link--arrow:focus svg path,#header .link--button.link--arrow:hover svg path{stroke:#0092e2}#footer .link--button.link--arrow.solid,#header .link--button.link--arrow.solid{background:#0073cf;color:#fff}#footer .link--button.link--arrow.solid svg path,#header .link--button.link--arrow.solid svg path{stroke:#fff}#footer .link--button.link--arrow.no-borders,#header .link--button.link--arrow.no-borders{border:none;margin:0;padding:0}#footer #ds-challenge,#header #ds-challenge{background:rgba(85,136,7,.15);border:1px solid #558807;border-radius:3px;box-sizing:border-box;margin:1.875rem 0;padding:.75rem .9375rem}@media (min-width:992px){#footer #ds-challenge,#header #ds-challenge{margin:3.75rem 0;padding:1.5rem 1.875rem}}#footer #ds-challenge h3,#header #ds-challenge h3{color:#000;font-weight:700;letter-spacing:.2em;margin:1.125rem 0 .25rem;text-transform:uppercase}@media (min-width:0px){#footer #ds-challenge h3,#header #ds-challenge h3{font-size:.75rem}}@media (min-width:600px){#footer #ds-challenge h3,#header #ds-challenge h3{font-size:.8125rem}}#footer #ds-challenge h2:first-child,#footer #ds-challenge h3:first-child,#header #ds-challenge h2:first-child,#header #ds-challenge h3:first-child{margin-top:0}#footer #ds-dataTip,#header #ds-dataTip{background:#f5f6f7;border:1px solid #d7d9d9;border-radius:3px;box-sizing:border-box;margin:1.875rem 0;padding:.75rem .9375rem}@media (min-width:992px){#footer #ds-dataTip,#header #ds-dataTip{margin:3.75rem 0;padding:1.5rem 1.875rem}}#footer #ds-dataTip h3,#header #ds-dataTip h3{color:#000;font-weight:700;letter-spacing:.2em;margin:1.125rem 0 .25rem;text-transform:uppercase}@media (min-width:0px){#footer #ds-dataTip h3,#header #ds-dataTip h3{font-size:.75rem}}@media (min-width:600px){#footer #ds-dataTip h3,#header #ds-dataTip h3{font-size:.8125rem}}#footer #ds-dataTip h2:first-child,#footer #ds-dataTip h3:first-child,#header #ds-dataTip h2:first-child,#header #ds-dataTip h3:first-child{margin-top:0}#footer #edit-footer+#edit-actions,#footer .entity-content-form-footer.form-wrapper,#footer .erl-disabled-items,#footer .field--name-field-display-mode.field--widget-entity-display-mode-select,#footer .field--type-entity-reference.field--name-field-image,#footer .field-group-html-element.other-content,#footer .js-form-item.js-form-type-vertical-tabs,#footer form.node-confirm-form.confirmation,#footer form.node-form:not(.node-page-edit-form),#footer form.node-update-form,#header #edit-footer+#edit-actions,#header .entity-content-form-footer.form-wrapper,#header .erl-disabled-items,#header .field--name-field-display-mode.field--widget-entity-display-mode-select,#header .field--type-entity-reference.field--name-field-image,#header .field-group-html-element.other-content,#header .js-form-item.js-form-type-vertical-tabs,#header form.node-confirm-form.confirmation,#header form.node-form:not(.node-page-edit-form),#header form.node-update-form{margin-left:auto;margin-right:auto;max-width:1380px;padding-left:1.875rem;padding-right:1.875rem}@media (min-width:992px){#footer #edit-footer+#edit-actions,#footer .entity-content-form-footer.form-wrapper,#footer .erl-disabled-items,#footer .field--name-field-display-mode.field--widget-entity-display-mode-select,#footer .field--type-entity-reference.field--name-field-image,#footer .field-group-html-element.other-content,#footer .js-form-item.js-form-type-vertical-tabs,#footer form.node-confirm-form.confirmation,#footer form.node-form:not(.node-page-edit-form),#footer form.node-update-form,#header #edit-footer+#edit-actions,#header .entity-content-form-footer.form-wrapper,#header .erl-disabled-items,#header .field--name-field-display-mode.field--widget-entity-display-mode-select,#header .field--type-entity-reference.field--name-field-image,#header .field-group-html-element.other-content,#header .js-form-item.js-form-type-vertical-tabs,#header form.node-confirm-form.confirmation,#header form.node-form:not(.node-page-edit-form),#header form.node-update-form{padding-left:3.125rem;padding-right:3.125rem}}#footer #edit-footer+#edit-actions,#footer #node-page-edit-form>#edit-actions,#footer form.node-confirm-form.confirmation #edit-actions,#header #edit-footer+#edit-actions,#header #node-page-edit-form>#edit-actions,#header form.node-confirm-form.confirmation #edit-actions{margin-bottom:1.875rem}@media (min-width:992px){#footer #edit-footer+#edit-actions,#footer #node-page-edit-form>#edit-actions,#footer form.node-confirm-form.confirmation #edit-actions,#header #edit-footer+#edit-actions,#header #node-page-edit-form>#edit-actions,#header form.node-confirm-form.confirmation #edit-actions{margin-bottom:3.75rem}}#footer form.node-form .erl-item fieldset:not(.fieldgroup),#header form.node-form .erl-item fieldset:not(.fieldgroup){margin:0;padding:0}#footer form.node-form .erl-item .l--offset,#header form.node-form .erl-item .l--offset{padding:0}#footer #node-page-edit-form .paragraphs-dropdown-action.button,#footer #node-page-form .paragraphs-dropdown-action.button,#footer form.node-form .paragraphs-dropdown-action.button,#footer form.node-update-form .paragraphs-dropdown-action.button,#header #node-page-edit-form .paragraphs-dropdown-action.button,#header #node-page-form .paragraphs-dropdown-action.button,#header form.node-form .paragraphs-dropdown-action.button,#header form.node-update-form .paragraphs-dropdown-action.button{color:#141516}#footer #node-page-edit-form .field--widget-paragraphs td,#footer #node-page-form .field--widget-paragraphs td,#footer form.node-form .field--widget-paragraphs td,#footer form.node-update-form .field--widget-paragraphs td,#header #node-page-edit-form .field--widget-paragraphs td,#header #node-page-form .field--widget-paragraphs td,#header form.node-form .field--widget-paragraphs td,#header form.node-update-form .field--widget-paragraphs td{padding:.75rem 1.125rem}@media (min-width:0px){#footer #node-page-edit-form .field--widget-paragraphs .form-wrapper>h4,#footer #node-page-form .field--widget-paragraphs .form-wrapper>h4,#footer form.node-form .field--widget-paragraphs .form-wrapper>h4,#footer form.node-update-form .field--widget-paragraphs .form-wrapper>h4,#header #node-page-edit-form .field--widget-paragraphs .form-wrapper>h4,#header #node-page-form .field--widget-paragraphs .form-wrapper>h4,#header form.node-form .field--widget-paragraphs .form-wrapper>h4,#header form.node-update-form .field--widget-paragraphs .form-wrapper>h4{font-size:.9375rem}}@media (min-width:600px){#footer #node-page-edit-form .field--widget-paragraphs .form-wrapper>h4,#footer #node-page-form .field--widget-paragraphs .form-wrapper>h4,#footer form.node-form .field--widget-paragraphs .form-wrapper>h4,#footer form.node-update-form .field--widget-paragraphs .form-wrapper>h4,#header #node-page-edit-form .field--widget-paragraphs .form-wrapper>h4,#header #node-page-form .field--widget-paragraphs .form-wrapper>h4,#header form.node-form .field--widget-paragraphs .form-wrapper>h4,#header form.node-update-form .field--widget-paragraphs .form-wrapper>h4{font-size:1rem}}@media (min-width:0px){#footer #node-page-edit-form li,#footer #node-page-form li,#footer form.node-form li,#footer form.node-update-form li,#header #node-page-edit-form li,#header #node-page-form li,#header form.node-form li,#header form.node-update-form li{font-size:.9375rem}}@media (min-width:600px){#footer #node-page-edit-form li,#footer #node-page-form li,#footer form.node-form li,#footer form.node-update-form li,#header #node-page-edit-form li,#header #node-page-form li,#header form.node-form li,#header form.node-update-form li{font-size:1rem}}#footer #node-page-edit-form .field--name-field-content fieldset.erl-field>legend,#footer #node-page-form .field--name-field-content fieldset.erl-field>legend,#footer form.node-form .field--name-field-content fieldset.erl-field>legend,#footer form.node-update-form .field--name-field-content fieldset.erl-field>legend,#header #node-page-edit-form .field--name-field-content fieldset.erl-field>legend,#header #node-page-form .field--name-field-content fieldset.erl-field>legend,#header form.node-form .field--name-field-content fieldset.erl-field>legend,#header form.node-update-form .field--name-field-content fieldset.erl-field>legend{display:none}#footer #node-page-edit-form fieldset.erl-field,#footer #node-page-form fieldset.erl-field,#footer form.node-form fieldset.erl-field,#footer form.node-update-form fieldset.erl-field,#header #node-page-edit-form fieldset.erl-field,#header #node-page-form fieldset.erl-field,#header form.node-form fieldset.erl-field,#header form.node-update-form fieldset.erl-field{background:none;margin:0;padding:0}#footer #node-page-edit-form fieldset.erl-field .erl-disabled-items .erl-item,#footer #node-page-edit-form fieldset.erl-field .erl-layout .erl-item,#footer #node-page-edit-form fieldset.erl-field .erl-layout-region,#footer #node-page-form fieldset.erl-field .erl-disabled-items .erl-item,#footer #node-page-form fieldset.erl-field .erl-layout .erl-item,#footer #node-page-form fieldset.erl-field .erl-layout-region,#footer form.node-form fieldset.erl-field .erl-disabled-items .erl-item,#footer form.node-form fieldset.erl-field .erl-layout .erl-item,#footer form.node-form fieldset.erl-field .erl-layout-region,#footer form.node-update-form fieldset.erl-field .erl-disabled-items .erl-item,#footer form.node-update-form fieldset.erl-field .erl-layout .erl-item,#footer form.node-update-form fieldset.erl-field .erl-layout-region,#header #node-page-edit-form fieldset.erl-field .erl-disabled-items .erl-item,#header #node-page-edit-form fieldset.erl-field .erl-layout .erl-item,#header #node-page-edit-form fieldset.erl-field .erl-layout-region,#header #node-page-form fieldset.erl-field .erl-disabled-items .erl-item,#header #node-page-form fieldset.erl-field .erl-layout .erl-item,#header #node-page-form fieldset.erl-field .erl-layout-region,#header form.node-form fieldset.erl-field .erl-disabled-items .erl-item,#header form.node-form fieldset.erl-field .erl-layout .erl-item,#header form.node-form fieldset.erl-field .erl-layout-region,#header form.node-update-form fieldset.erl-field .erl-disabled-items .erl-item,#header form.node-update-form fieldset.erl-field .erl-layout .erl-item,#header form.node-update-form fieldset.erl-field .erl-layout-region{padding:0}#footer #node-page-edit-form fieldset.erl-field .erl-item:hover>.erl-actions,#footer #node-page-edit-form fieldset.erl-field .erl-item:hover>.layout-controls,#footer #node-page-form fieldset.erl-field .erl-item:hover>.erl-actions,#footer #node-page-form fieldset.erl-field .erl-item:hover>.layout-controls,#footer form.node-form fieldset.erl-field .erl-item:hover>.erl-actions,#footer form.node-form fieldset.erl-field .erl-item:hover>.layout-controls,#footer form.node-update-form fieldset.erl-field .erl-item:hover>.erl-actions,#footer form.node-update-form fieldset.erl-field .erl-item:hover>.layout-controls,#header #node-page-edit-form fieldset.erl-field .erl-item:hover>.erl-actions,#header #node-page-edit-form fieldset.erl-field .erl-item:hover>.layout-controls,#header #node-page-form fieldset.erl-field .erl-item:hover>.erl-actions,#header #node-page-form fieldset.erl-field .erl-item:hover>.layout-controls,#header form.node-form fieldset.erl-field .erl-item:hover>.erl-actions,#header form.node-form fieldset.erl-field .erl-item:hover>.layout-controls,#header form.node-update-form fieldset.erl-field .erl-item:hover>.erl-actions,#header form.node-update-form fieldset.erl-field .erl-item:hover>.layout-controls{background:#f5f5f3;z-index:2}#footer #node-page-edit-form fieldset.erl-field .erl-layout.erl-item:before,#footer #node-page-form fieldset.erl-field .erl-layout.erl-item:before,#footer form.node-form fieldset.erl-field .erl-layout.erl-item:before,#footer form.node-update-form fieldset.erl-field .erl-layout.erl-item:before,#header #node-page-edit-form fieldset.erl-field .erl-layout.erl-item:before,#header #node-page-form fieldset.erl-field .erl-layout.erl-item:before,#header form.node-form fieldset.erl-field .erl-layout.erl-item:before,#header form.node-update-form fieldset.erl-field .erl-layout.erl-item:before{display:none}#footer #node-page-edit-form fieldset.erl-field .erl-layout-wrapper,#footer #node-page-edit-form fieldset.erl-field .erl-layout-wrapper:first-child .layout,#footer #node-page-form fieldset.erl-field .erl-layout-wrapper,#footer #node-page-form fieldset.erl-field .erl-layout-wrapper:first-child .layout,#footer form.node-form fieldset.erl-field .erl-layout-wrapper,#footer form.node-form fieldset.erl-field .erl-layout-wrapper:first-child .layout,#footer form.node-update-form fieldset.erl-field .erl-layout-wrapper,#footer form.node-update-form fieldset.erl-field .erl-layout-wrapper:first-child .layout,#header #node-page-edit-form fieldset.erl-field .erl-layout-wrapper,#header #node-page-edit-form fieldset.erl-field .erl-layout-wrapper:first-child .layout,#header #node-page-form fieldset.erl-field .erl-layout-wrapper,#header #node-page-form fieldset.erl-field .erl-layout-wrapper:first-child .layout,#header form.node-form fieldset.erl-field .erl-layout-wrapper,#header form.node-form fieldset.erl-field .erl-layout-wrapper:first-child .layout,#header form.node-update-form fieldset.erl-field .erl-layout-wrapper,#header form.node-update-form fieldset.erl-field .erl-layout-wrapper:first-child .layout{margin-top:0}#footer #node-page-edit-form fieldset.erl-field .erl-layout,#footer #node-page-edit-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout,#footer #node-page-form fieldset.erl-field .erl-layout,#footer #node-page-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout,#footer form.node-form fieldset.erl-field .erl-layout,#footer form.node-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout,#footer form.node-update-form fieldset.erl-field .erl-layout,#footer form.node-update-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout,#header #node-page-edit-form fieldset.erl-field .erl-layout,#header #node-page-edit-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout,#header #node-page-form fieldset.erl-field .erl-layout,#header #node-page-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout,#header form.node-form fieldset.erl-field .erl-layout,#header form.node-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout,#header form.node-update-form fieldset.erl-field .erl-layout,#header form.node-update-form fieldset.erl-field .erl-layout-wrapper .erl-item:first-child .paragraph--type--section .layout{padding-top:0}#footer #node-page-edit-form #edit-field-display-mode-wrapper,#footer #node-page-edit-form #edit-field-image-wrapper,#footer #node-page-edit-form .entity-content-form-footer,#footer #node-page-edit-form .js-form-type-vertical-tabs,#footer #node-page-edit-form .other-content,#footer #node-page-form #edit-field-display-mode-wrapper,#footer #node-page-form #edit-field-image-wrapper,#footer #node-page-form .entity-content-form-footer,#footer #node-page-form .js-form-type-vertical-tabs,#footer #node-page-form .other-content,#footer form.node-form #edit-field-display-mode-wrapper,#footer form.node-form #edit-field-image-wrapper,#footer form.node-form .entity-content-form-footer,#footer form.node-form .js-form-type-vertical-tabs,#footer form.node-form .other-content,#footer form.node-update-form #edit-field-display-mode-wrapper,#footer form.node-update-form #edit-field-image-wrapper,#footer form.node-update-form .entity-content-form-footer,#footer form.node-update-form .js-form-type-vertical-tabs,#footer form.node-update-form .other-content,#header #node-page-edit-form #edit-field-display-mode-wrapper,#header #node-page-edit-form #edit-field-image-wrapper,#header #node-page-edit-form .entity-content-form-footer,#header #node-page-edit-form .js-form-type-vertical-tabs,#header #node-page-edit-form .other-content,#header #node-page-form #edit-field-display-mode-wrapper,#header #node-page-form #edit-field-image-wrapper,#header #node-page-form .entity-content-form-footer,#header #node-page-form .js-form-type-vertical-tabs,#header #node-page-form .other-content,#header form.node-form #edit-field-display-mode-wrapper,#header form.node-form #edit-field-image-wrapper,#header form.node-form .entity-content-form-footer,#header form.node-form .js-form-type-vertical-tabs,#header form.node-form .other-content,#header form.node-update-form #edit-field-display-mode-wrapper,#header form.node-update-form #edit-field-image-wrapper,#header form.node-update-form .entity-content-form-footer,#header form.node-update-form .js-form-type-vertical-tabs,#header form.node-update-form .other-content{margin:1.875rem auto;max-width:1380px;padding-left:1.875rem;padding-right:1.875rem}@media (min-width:992px){#footer #node-page-edit-form #edit-field-display-mode-wrapper,#footer #node-page-edit-form #edit-field-image-wrapper,#footer #node-page-edit-form .entity-content-form-footer,#footer #node-page-edit-form .js-form-type-vertical-tabs,#footer #node-page-edit-form .other-content,#footer #node-page-form #edit-field-display-mode-wrapper,#footer #node-page-form #edit-field-image-wrapper,#footer #node-page-form .entity-content-form-footer,#footer #node-page-form .js-form-type-vertical-tabs,#footer #node-page-form .other-content,#footer form.node-form #edit-field-display-mode-wrapper,#footer form.node-form #edit-field-image-wrapper,#footer form.node-form .entity-content-form-footer,#footer form.node-form .js-form-type-vertical-tabs,#footer form.node-form .other-content,#footer form.node-update-form #edit-field-display-mode-wrapper,#footer form.node-update-form #edit-field-image-wrapper,#footer form.node-update-form .entity-content-form-footer,#footer form.node-update-form .js-form-type-vertical-tabs,#footer form.node-update-form .other-content,#header #node-page-edit-form #edit-field-display-mode-wrapper,#header #node-page-edit-form #edit-field-image-wrapper,#header #node-page-edit-form .entity-content-form-footer,#header #node-page-edit-form .js-form-type-vertical-tabs,#header #node-page-edit-form .other-content,#header #node-page-form #edit-field-display-mode-wrapper,#header #node-page-form #edit-field-image-wrapper,#header #node-page-form .entity-content-form-footer,#header #node-page-form .js-form-type-vertical-tabs,#header #node-page-form .other-content,#header form.node-form #edit-field-display-mode-wrapper,#header form.node-form #edit-field-image-wrapper,#header form.node-form .entity-content-form-footer,#header form.node-form .js-form-type-vertical-tabs,#header form.node-form .other-content,#header form.node-update-form #edit-field-display-mode-wrapper,#header form.node-update-form #edit-field-image-wrapper,#header form.node-update-form .entity-content-form-footer,#header form.node-update-form .js-form-type-vertical-tabs,#header form.node-update-form .other-content{margin:3.75rem auto;padding-left:3.125rem;padding-right:3.125rem}}#footer #node-page-edit-form .button+.button,#footer #node-page-form .button+.button,#footer form.node-form .button+.button,#footer form.node-update-form .button+.button,#header #node-page-edit-form .button+.button,#header #node-page-form .button+.button,#header form.node-form .button+.button,#header form.node-update-form .button+.button{margin-left:.75rem}#footer #node-page-edit-form a.button--danger,#footer #node-page-edit-form button.button--danger,#footer #node-page-form a.button--danger,#footer #node-page-form button.button--danger,#footer form.node-form a.button--danger,#footer form.node-form button.button--danger,#footer form.node-update-form a.button--danger,#footer form.node-update-form button.button--danger,#header #node-page-edit-form a.button--danger,#header #node-page-edit-form button.button--danger,#header #node-page-form a.button--danger,#header #node-page-form button.button--danger,#header form.node-form a.button--danger,#header form.node-form button.button--danger,#header form.node-update-form a.button--danger,#header form.node-update-form button.button--danger{-webkit-appearance:none;background:#d7d9d9;border:1px solid #d7d9d9;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.25),0 1px 1px rgba(0,0,0,.25);color:#565a5c;font-size:13px;font-weight:700;letter-spacing:.1em;padding:.75rem 1.125rem;text-decoration:none;text-transform:uppercase;transition:all .25s}#footer #node-page-edit-form a.button--danger:hover,#footer #node-page-edit-form button.button--danger:hover,#footer #node-page-form a.button--danger:hover,#footer #node-page-form button.button--danger:hover,#footer form.node-form a.button--danger:hover,#footer form.node-form button.button--danger:hover,#footer form.node-update-form a.button--danger:hover,#footer form.node-update-form button.button--danger:hover,#header #node-page-edit-form a.button--danger:hover,#header #node-page-edit-form button.button--danger:hover,#header #node-page-form a.button--danger:hover,#header #node-page-form button.button--danger:hover,#header form.node-form a.button--danger:hover,#header form.node-form button.button--danger:hover,#header form.node-update-form a.button--danger:hover,#header form.node-update-form button.button--danger:hover{background:#f5f6f7;color:#565a5c;transition:all .45s}#footer #node-page-edit-form .filter-wrapper,#footer #node-page-form .filter-wrapper,#footer form.node-form .filter-wrapper,#footer form.node-update-form .filter-wrapper,#header #node-page-edit-form .filter-wrapper,#header #node-page-form .filter-wrapper,#header form.node-form .filter-wrapper,#header form.node-update-form .filter-wrapper{border-top:1px solid #d7d9d9}#footer #node-page-edit-form input.form-autocomplete,#footer #node-page-edit-form textarea.text-full.form-textarea,#footer #node-page-form input.form-autocomplete,#footer #node-page-form textarea.text-full.form-textarea,#footer form.node-form input.form-autocomplete,#footer form.node-form textarea.text-full.form-textarea,#footer form.node-update-form input.form-autocomplete,#footer form.node-update-form textarea.text-full.form-textarea,#header #node-page-edit-form input.form-autocomplete,#header #node-page-edit-form textarea.text-full.form-textarea,#header #node-page-form input.form-autocomplete,#header #node-page-form textarea.text-full.form-textarea,#header form.node-form input.form-autocomplete,#header form.node-form textarea.text-full.form-textarea,#header form.node-update-form input.form-autocomplete,#header form.node-update-form textarea.text-full.form-textarea{box-sizing:border-box;width:100%}#footer #node-page-edit-form table.field-multiple-table th h4,#footer #node-page-form table.field-multiple-table th h4,#footer form.node-form table.field-multiple-table th h4,#footer form.node-update-form table.field-multiple-table th h4,#header #node-page-edit-form table.field-multiple-table th h4,#header #node-page-form table.field-multiple-table th h4,#header form.node-form table.field-multiple-table th h4,#header form.node-update-form table.field-multiple-table th h4{background:#0073cf;color:#fff;letter-spacing:.2em;margin:0;text-transform:uppercase}@media (min-width:0px){#footer #node-page-edit-form table.field-multiple-table th h4,#footer #node-page-form table.field-multiple-table th h4,#footer form.node-form table.field-multiple-table th h4,#footer form.node-update-form table.field-multiple-table th h4,#header #node-page-edit-form table.field-multiple-table th h4,#header #node-page-form table.field-multiple-table th h4,#header form.node-form table.field-multiple-table th h4,#header form.node-update-form table.field-multiple-table th h4{font-size:.75rem}}@media (min-width:600px){#footer #node-page-edit-form table.field-multiple-table th h4,#footer #node-page-form table.field-multiple-table th h4,#footer form.node-form table.field-multiple-table th h4,#footer form.node-update-form table.field-multiple-table th h4,#header #node-page-edit-form table.field-multiple-table th h4,#header #node-page-form table.field-multiple-table th h4,#header form.node-form table.field-multiple-table th h4,#header form.node-update-form table.field-multiple-table th h4{font-size:.8125rem}}#footer #node-page-edit-form .vertical-tabs .entity-meta.vertical-tabs__panes,#footer #node-page-form .vertical-tabs .entity-meta.vertical-tabs__panes,#footer form.node-form .vertical-tabs .entity-meta.vertical-tabs__panes,#footer form.node-update-form .vertical-tabs .entity-meta.vertical-tabs__panes,#header #node-page-edit-form .vertical-tabs .entity-meta.vertical-tabs__panes,#header #node-page-form .vertical-tabs .entity-meta.vertical-tabs__panes,#header form.node-form .vertical-tabs .entity-meta.vertical-tabs__panes,#header form.node-update-form .vertical-tabs .entity-meta.vertical-tabs__panes{padding:1.25rem}#footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item{background-color:#f5f6f7;font-size:1rem}@media (min-width:37.5em){#footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item{font-size:1rem}}@media (min-width:48em){#footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item{font-size:.9rem}}@media (min-width:64em){#footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-form .vertical-tabs .vertical-tabs__menu-item,#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item,#header #node-page-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-form .vertical-tabs .vertical-tabs__menu-item,#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item{font-size:.9rem}}#footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item a,#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item a,#footer form.node-form .vertical-tabs .vertical-tabs__menu-item a,#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item a,#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item a,#header #node-page-form .vertical-tabs .vertical-tabs__menu-item a,#header form.node-form .vertical-tabs .vertical-tabs__menu-item a,#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item a{color:#777277;padding:1.125rem}#footer #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item.is-selected,#footer #node-page-form .vertical-tabs .vertical-tabs__menu-item.is-selected,#footer form.node-form .vertical-tabs .vertical-tabs__menu-item.is-selected,#footer form.node-update-form .vertical-tabs .vertical-tabs__menu-item.is-selected,#header #node-page-edit-form .vertical-tabs .vertical-tabs__menu-item.is-selected,#header #node-page-form .vertical-tabs .vertical-tabs__menu-item.is-selected,#header form.node-form .vertical-tabs .vertical-tabs__menu-item.is-selected,#header form.node-update-form .vertical-tabs .vertical-tabs__menu-item.is-selected{background-color:#fff;border-right-width:0}#footer #node-page-edit-form .erl-layout-select .fieldset-wrapper>div,#footer #node-page-form .erl-layout-select .fieldset-wrapper>div,#footer form.node-form .erl-layout-select .fieldset-wrapper>div,#footer form.node-update-form .erl-layout-select .fieldset-wrapper>div,#header #node-page-edit-form .erl-layout-select .fieldset-wrapper>div,#header #node-page-form .erl-layout-select .fieldset-wrapper>div,#header form.node-form .erl-layout-select .fieldset-wrapper>div,#header form.node-update-form .erl-layout-select .fieldset-wrapper>div{align-content:flex-start;display:flex;flex-wrap:wrap}#footer #node-page-edit-form .erl-field .layout-radio-item .layout-icon-wrapper,#footer #node-page-form .erl-field .layout-radio-item .layout-icon-wrapper,#footer form.node-form .erl-field .layout-radio-item .layout-icon-wrapper,#footer form.node-update-form .erl-field .layout-radio-item .layout-icon-wrapper,#header #node-page-edit-form .erl-field .layout-radio-item .layout-icon-wrapper,#header #node-page-form .erl-field .layout-radio-item .layout-icon-wrapper,#header form.node-form .erl-field .layout-radio-item .layout-icon-wrapper,#header form.node-update-form .erl-field .layout-radio-item .layout-icon-wrapper{margin-top:20px}#footer #node-page-edit-form details,#footer #node-page-form details,#footer form.node-form details,#footer form.node-update-form details,#header #node-page-edit-form details,#header #node-page-form details,#header form.node-form details,#header form.node-update-form details{background-color:#fcfcfa;border:1px solid #bfbfbf;border-radius:3px;margin-bottom:1em;margin-top:1em;padding:.95em 1.45em}#footer #node-page-edit-form details summary,#footer #node-page-form details summary,#footer form.node-form details summary,#footer form.node-update-form details summary,#header #node-page-edit-form details summary,#header #node-page-form details summary,#header form.node-form details summary,#header form.node-update-form details summary{color:#0074bd;cursor:pointer;display:block;font-size:.8rem;font-weight:700;text-shadow:0 1px 0 #fff;text-transform:uppercase}#footer #node-page-edit-form details summary:focus,#footer #node-page-form details summary:focus,#footer form.node-form details summary:focus,#footer form.node-update-form details summary:focus,#header #node-page-edit-form details summary:focus,#header #node-page-form details summary:focus,#header form.node-form details summary:focus,#header form.node-update-form details summary:focus{color:#004f80;outline:none;text-decoration:underline}#footer #node-page-edit-form .form-item .description,#footer #node-page-edit-form div.description,#footer #node-page-edit-form ul.tips,#footer #node-page-form .form-item .description,#footer #node-page-form div.description,#footer #node-page-form ul.tips,#footer form.node-form .form-item .description,#footer form.node-form div.description,#footer form.node-form ul.tips,#footer form.node-update-form .form-item .description,#footer form.node-update-form div.description,#footer form.node-update-form ul.tips,#header #node-page-edit-form .form-item .description,#header #node-page-edit-form div.description,#header #node-page-edit-form ul.tips,#header #node-page-form .form-item .description,#header #node-page-form div.description,#header #node-page-form ul.tips,#header form.node-form .form-item .description,#header form.node-form div.description,#header form.node-form ul.tips,#header form.node-update-form .form-item .description,#header form.node-update-form div.description,#header form.node-update-form ul.tips{color:#595959;font-size:.8rem;margin:8px 0 0}#footer #node-page-edit-form button.link.js-media-library-widget-toggle-weight,#footer #node-page-form button.link.js-media-library-widget-toggle-weight,#footer form.node-form button.link.js-media-library-widget-toggle-weight,#footer form.node-update-form button.link.js-media-library-widget-toggle-weight,#header #node-page-edit-form button.link.js-media-library-widget-toggle-weight,#header #node-page-form button.link.js-media-library-widget-toggle-weight,#header form.node-form button.link.js-media-library-widget-toggle-weight,#header form.node-update-form button.link.js-media-library-widget-toggle-weight{appearance:none;background:transparent;border:0;color:#0074bd;cursor:pointer;display:inline;font-size:.9rem;margin:0;padding:0;position:absolute;right:15px;text-decoration:none;top:20px}#footer #node-page-edit-form fieldset:not(.fieldgroup):not(.erl-disabled-items),#footer #node-page-form fieldset:not(.fieldgroup):not(.erl-disabled-items),#footer form.node-form fieldset:not(.fieldgroup):not(.erl-disabled-items),#footer form.node-update-form fieldset:not(.fieldgroup):not(.erl-disabled-items),#header #node-page-edit-form fieldset:not(.fieldgroup):not(.erl-disabled-items),#header #node-page-form fieldset:not(.fieldgroup):not(.erl-disabled-items),#header form.node-form fieldset:not(.fieldgroup):not(.erl-disabled-items),#header form.node-update-form fieldset:not(.fieldgroup):not(.erl-disabled-items){border-radius:2px;margin:1em 0;min-width:0;padding:30px 18px 18px;position:relative}#footer #node-page-edit-form .js-hide,#footer #node-page-form .js-hide,#footer form.node-form .js-hide,#footer form.node-update-form .js-hide,#header #node-page-edit-form .js-hide,#header #node-page-form .js-hide,#header form.node-form .js-hide,#header form.node-update-form .js-hide{display:none!important}#footer #node-page-edit-form tr.draggable td,#footer #node-page-form tr.draggable td,#footer form.node-form tr.draggable td,#footer form.node-update-form tr.draggable td,#header #node-page-edit-form tr.draggable td,#header #node-page-form tr.draggable td,#header form.node-form tr.draggable td,#header form.node-update-form tr.draggable td{font-size:1rem;vertical-align:middle}#footer #node-page-edit-form tr.draggable td a.tabledrag-handle,#footer #node-page-form tr.draggable td a.tabledrag-handle,#footer form.node-form tr.draggable td a.tabledrag-handle,#footer form.node-update-form tr.draggable td a.tabledrag-handle,#header #node-page-edit-form tr.draggable td a.tabledrag-handle,#header #node-page-form tr.draggable td a.tabledrag-handle,#header form.node-form tr.draggable td a.tabledrag-handle,#header form.node-update-form tr.draggable td a.tabledrag-handle{height:auto}#footer #node-page-edit-form tr.draggable td a.tabledrag-handle .handle,#footer #node-page-form tr.draggable td a.tabledrag-handle .handle,#footer form.node-form tr.draggable td a.tabledrag-handle .handle,#footer form.node-update-form tr.draggable td a.tabledrag-handle .handle,#header #node-page-edit-form tr.draggable td a.tabledrag-handle .handle,#header #node-page-form tr.draggable td a.tabledrag-handle .handle,#header form.node-form tr.draggable td a.tabledrag-handle .handle,#header form.node-update-form tr.draggable td a.tabledrag-handle .handle{height:22px}#footer #node-page-edit-form .ui-dialog,#footer #node-page-form .ui-dialog,#footer form.node-form .ui-dialog,#footer form.node-update-form .ui-dialog,#header #node-page-edit-form .ui-dialog,#header #node-page-form .ui-dialog,#header form.node-form .ui-dialog,#header form.node-update-form .ui-dialog{box-shadow:0 5px 60px rgba(19,15,19,.25),0 1px 10px rgba(19,15,19,.5);font-family:IBM Plex Sans,Helvetica,Helvetica Neue,Arial,sans-serif;padding:0}#footer #node-page-edit-form .ui-dialog .ui-dialog-titlebar,#footer #node-page-edit-form .ui-draggable .ui-dialog-titlebar,#footer #node-page-form .ui-dialog .ui-dialog-titlebar,#footer #node-page-form .ui-draggable .ui-dialog-titlebar,#footer form.node-form .ui-dialog .ui-dialog-titlebar,#footer form.node-form .ui-draggable .ui-dialog-titlebar,#footer form.node-update-form .ui-dialog .ui-dialog-titlebar,#footer form.node-update-form .ui-draggable .ui-dialog-titlebar,#header #node-page-edit-form .ui-dialog .ui-dialog-titlebar,#header #node-page-edit-form .ui-draggable .ui-dialog-titlebar,#header #node-page-form .ui-dialog .ui-dialog-titlebar,#header #node-page-form .ui-draggable .ui-dialog-titlebar,#header form.node-form .ui-dialog .ui-dialog-titlebar,#header form.node-form .ui-draggable .ui-dialog-titlebar,#header form.node-update-form .ui-dialog .ui-dialog-titlebar,#header form.node-update-form .ui-draggable .ui-dialog-titlebar{padding:15px 30px}#footer #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close,#footer #node-page-form .ui-dialog .ui-dialog-titlebar-close,#footer form.node-form .ui-dialog .ui-dialog-titlebar-close,#footer form.node-update-form .ui-dialog .ui-dialog-titlebar-close,#header #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close,#header #node-page-form .ui-dialog .ui-dialog-titlebar-close,#header form.node-form .ui-dialog .ui-dialog-titlebar-close,#header form.node-update-form .ui-dialog .ui-dialog-titlebar-close{background:none;border:none;height:30px;margin:0;padding:0;right:30px;top:30px;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);width:30px}#footer #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close:hover,#footer #node-page-form .ui-dialog .ui-dialog-titlebar-close:hover,#footer form.node-form .ui-dialog .ui-dialog-titlebar-close:hover,#footer form.node-update-form .ui-dialog .ui-dialog-titlebar-close:hover,#header #node-page-edit-form .ui-dialog .ui-dialog-titlebar-close:hover,#header #node-page-form .ui-dialog .ui-dialog-titlebar-close:hover,#header form.node-form .ui-dialog .ui-dialog-titlebar-close:hover,#header form.node-update-form .ui-dialog .ui-dialog-titlebar-close:hover{border:none}#footer #node-page-edit-form .ui-button .ui-icon,#footer #node-page-form .ui-button .ui-icon,#footer form.node-form .ui-button .ui-icon,#footer form.node-update-form .ui-button .ui-icon,#header #node-page-edit-form .ui-button .ui-icon,#header #node-page-form .ui-button .ui-icon,#header form.node-form .ui-button .ui-icon,#header form.node-update-form .ui-button .ui-icon{background:none;height:100%;left:0;margin:0;top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%;width:100%}#footer #node-page-edit-form .ui-button .ui-icon:before,#footer #node-page-form .ui-button .ui-icon:before,#footer form.node-form .ui-button .ui-icon:before,#footer form.node-update-form .ui-button .ui-icon:before,#header #node-page-edit-form .ui-button .ui-icon:before,#header #node-page-form .ui-button .ui-icon:before,#header form.node-form .ui-button .ui-icon:before,#header form.node-update-form .ui-button .ui-icon:before{background-color:#9d999d;content:"";height:100%;left:50%;margin-left:-1px;position:absolute;top:0;width:2px}#footer #node-page-edit-form .ui-button .ui-icon:after,#footer #node-page-form .ui-button .ui-icon:after,#footer form.node-form .ui-button .ui-icon:after,#footer form.node-update-form .ui-button .ui-icon:after,#header #node-page-edit-form .ui-button .ui-icon:after,#header #node-page-form .ui-button .ui-icon:after,#header form.node-form .ui-button .ui-icon:after,#header form.node-update-form .ui-button .ui-icon:after{background-color:#9d999d;content:"";height:2px;left:0;margin-top:-1px;position:absolute;top:50%;width:100%}#footer #node-page-edit-form .ui-button:hover .ui-icon,#footer #node-page-form .ui-button:hover .ui-icon,#footer form.node-form .ui-button:hover .ui-icon,#footer form.node-update-form .ui-button:hover .ui-icon,#header #node-page-edit-form .ui-button:hover .ui-icon,#header #node-page-form .ui-button:hover .ui-icon,#header form.node-form .ui-button:hover .ui-icon,#header form.node-update-form .ui-button:hover .ui-icon{background:none}#footer #node-page-edit-form .ui-button:hover .ui-icon:after,#footer #node-page-edit-form .ui-button:hover .ui-icon:before,#footer #node-page-form .ui-button:hover .ui-icon:after,#footer #node-page-form .ui-button:hover .ui-icon:before,#footer form.node-form .ui-button:hover .ui-icon:after,#footer form.node-form .ui-button:hover .ui-icon:before,#footer form.node-update-form .ui-button:hover .ui-icon:after,#footer form.node-update-form .ui-button:hover .ui-icon:before,#header #node-page-edit-form .ui-button:hover .ui-icon:after,#header #node-page-edit-form .ui-button:hover .ui-icon:before,#header #node-page-form .ui-button:hover .ui-icon:after,#header #node-page-form .ui-button:hover .ui-icon:before,#header form.node-form .ui-button:hover .ui-icon:after,#header form.node-form .ui-button:hover .ui-icon:before,#header form.node-update-form .ui-button:hover .ui-icon:after,#header form.node-update-form .ui-button:hover .ui-icon:before{background:#504b50}#footer #node-page-edit-form .ui-dialog .ui-dialog-title,#footer #node-page-form .ui-dialog .ui-dialog-title,#footer form.node-form .ui-dialog .ui-dialog-title,#footer form.node-update-form .ui-dialog .ui-dialog-title,#header #node-page-edit-form .ui-dialog .ui-dialog-title,#header #node-page-form .ui-dialog .ui-dialog-title,#header form.node-form .ui-dialog .ui-dialog-title,#header form.node-update-form .ui-dialog .ui-dialog-title{line-height:30px;margin:0}#footer #node-page-edit-form .ui-dialog .ui-dialog-content,#footer #node-page-form .ui-dialog .ui-dialog-content,#footer form.node-form .ui-dialog .ui-dialog-content,#footer form.node-update-form .ui-dialog .ui-dialog-content,#header #node-page-edit-form .ui-dialog .ui-dialog-content,#header #node-page-form .ui-dialog .ui-dialog-content,#header form.node-form .ui-dialog .ui-dialog-content,#header form.node-update-form .ui-dialog .ui-dialog-content{padding:30px}#footer #node-page-edit-form .ui-corner-all,#footer #node-page-edit-form .ui-corner-bl,#footer #node-page-edit-form .ui-corner-bottom,#footer #node-page-edit-form .ui-corner-left,#footer #node-page-form .ui-corner-all,#footer #node-page-form .ui-corner-bl,#footer #node-page-form .ui-corner-bottom,#footer #node-page-form .ui-corner-left,#footer form.node-form .ui-corner-all,#footer form.node-form .ui-corner-bl,#footer form.node-form .ui-corner-bottom,#footer form.node-form .ui-corner-left,#footer form.node-update-form .ui-corner-all,#footer form.node-update-form .ui-corner-bl,#footer form.node-update-form .ui-corner-bottom,#footer form.node-update-form .ui-corner-left,#header #node-page-edit-form .ui-corner-all,#header #node-page-edit-form .ui-corner-bl,#header #node-page-edit-form .ui-corner-bottom,#header #node-page-edit-form .ui-corner-left,#header #node-page-form .ui-corner-all,#header #node-page-form .ui-corner-bl,#header #node-page-form .ui-corner-bottom,#header #node-page-form .ui-corner-left,#header form.node-form .ui-corner-all,#header form.node-form .ui-corner-bl,#header form.node-form .ui-corner-bottom,#header form.node-form .ui-corner-left,#header form.node-update-form .ui-corner-all,#header form.node-update-form .ui-corner-bl,#header form.node-update-form .ui-corner-bottom,#header form.node-update-form .ui-corner-left{border:0;border-radius:0}#footer #node-page-edit-form .ui-widget.ui-widget-content,#footer #node-page-form .ui-widget.ui-widget-content,#footer form.node-form .ui-widget.ui-widget-content,#footer form.node-update-form .ui-widget.ui-widget-content,#header #node-page-edit-form .ui-widget.ui-widget-content,#header #node-page-form .ui-widget.ui-widget-content,#header form.node-form .ui-widget.ui-widget-content,#header form.node-update-form .ui-widget.ui-widget-content{border:none}#footer #node-page-edit-form .horizontal-tabs,#footer #node-page-form .horizontal-tabs,#footer form.node-form .horizontal-tabs,#footer form.node-update-form .horizontal-tabs,#header #node-page-edit-form .horizontal-tabs,#header #node-page-form .horizontal-tabs,#header form.node-form .horizontal-tabs,#header form.node-update-form .horizontal-tabs{background:transparent;border:none;padding:0}#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list{border-bottom:none;margin:0 -.5rem;padding:.5rem .5rem 0}#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after,#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:before,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list:before,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list:after,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list:before,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:before,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:before,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list:before,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list:after,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list:before,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:before{content:" ";display:table}#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list:after,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list:after,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list:after,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list:after,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list:after{clear:both}#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li{display:block;float:left;list-style:none;margin-bottom:0;margin-right:1px;margin-top:0;min-width:0;padding:0}#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a{display:block;font-family:IBM Plex Sans,Helvetica,Helvetica Neue,Arial,sans-serif;font-size:calc(12.02326px + .23256vw);font-weight:600;letter-spacing:.05em;padding:.5rem 1rem;text-decoration:none;text-transform:uppercase;transition:all .15s ease-in-out}@media screen and (min-width:1280px){#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a{font-size:15px}}@media screen and (max-width:420px){#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a{font-size:13px}}#footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a{background-color:#777277;border-radius:0;color:#e1e0e1}#footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#footer #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover,#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#footer #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover,#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#footer form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover,#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#footer form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover,#header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header #node-page-edit-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover,#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header #node-page-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover,#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header form.node-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover,#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header form.node-update-form .tabs--primary .horizontal-tabs ul.horizontal-tabs-list>li.selected>a:hover{background-color:#9d999d}#footer #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a,#footer #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a,#footer form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a,#header #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a,#header form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a{border-radius:0}#footer #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#footer #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#footer form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#footer form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover,#header form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a:hover{background-color:#e1e0e1}#footer #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active,#footer #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active,#footer form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active,#footer form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active,#header #node-page-edit-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active,#header #node-page-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active,#header form.node-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active,#header form.node-update-form .tabs--secondary .horizontal-tabs ul.horizontal-tabs-list>li a.is-active{text-decoration:underline}#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.is-active>a:hover,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li.selected>a{background-color:#fff;color:#261f26}#footer #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li:before,#footer #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li:before,#footer form.node-form .horizontal-tabs ul.horizontal-tabs-list>li:before,#footer form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li:before,#header #node-page-edit-form .horizontal-tabs ul.horizontal-tabs-list>li:before,#header #node-page-form .horizontal-tabs ul.horizontal-tabs-list>li:before,#header form.node-form .horizontal-tabs ul.horizontal-tabs-list>li:before,#header form.node-update-form .horizontal-tabs ul.horizontal-tabs-list>li:before{content:none}#footer #node-page-edit-form .horizontal-tabs .horizontal-tabs-pane,#footer #node-page-form .horizontal-tabs .horizontal-tabs-pane,#footer form.node-form .horizontal-tabs .horizontal-tabs-pane,#footer form.node-update-form .horizontal-tabs .horizontal-tabs-pane,#header #node-page-edit-form .horizontal-tabs .horizontal-tabs-pane,#header #node-page-form .horizontal-tabs .horizontal-tabs-pane,#header form.node-form .horizontal-tabs .horizontal-tabs-pane,#header form.node-update-form .horizontal-tabs .horizontal-tabs-pane{padding:0}#footer #node-page-edit-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper,#footer #node-page-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper,#footer form.node-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper,#footer form.node-update-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper,#header #node-page-edit-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper,#header #node-page-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper,#header form.node-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper,#header form.node-update-form .horizontal-tabs .horizontal-tabs-panes>details>.details-wrapper{padding:1.875rem 0}#footer #node-page-edit-form .entities-list .item-container,#footer #node-page-form .entities-list .item-container,#footer form.node-form .entities-list .item-container,#footer form.node-update-form .entities-list .item-container,#header #node-page-edit-form .entities-list .item-container,#header #node-page-form .entities-list .item-container,#header form.node-form .entities-list .item-container,#header form.node-update-form .entities-list .item-container{display:flex;flex-wrap:wrap;width:40%}#footer #node-page-edit-form .entities-list .item-container figure,#footer #node-page-form .entities-list .item-container figure,#footer form.node-form .entities-list .item-container figure,#footer form.node-update-form .entities-list .item-container figure,#header #node-page-edit-form .entities-list .item-container figure,#header #node-page-form .entities-list .item-container figure,#header form.node-form .entities-list .item-container figure,#header form.node-update-form .entities-list .item-container figure{width:100%}#footer #node-page-edit-form .entities-list .item-container>input.button,#footer #node-page-form .entities-list .item-container>input.button,#footer form.node-form .entities-list .item-container>input.button,#footer form.node-update-form .entities-list .item-container>input.button,#header #node-page-edit-form .entities-list .item-container>input.button,#header #node-page-form .entities-list .item-container>input.button,#header form.node-form .entities-list .item-container>input.button,#header form.node-update-form .entities-list .item-container>input.button{width:50%}#footer #node-page-edit-form .entities-list .item-container>input.remove-button,#footer #node-page-form .entities-list .item-container>input.remove-button,#footer form.node-form .entities-list .item-container>input.remove-button,#footer form.node-update-form .entities-list .item-container>input.remove-button,#header #node-page-edit-form .entities-list .item-container>input.remove-button,#header #node-page-form .entities-list .item-container>input.remove-button,#header form.node-form .entities-list .item-container>input.remove-button,#header form.node-update-form .entities-list .item-container>input.remove-button{border-bottom-right-radius:0;border-top-right-radius:0}#footer #node-page-edit-form .entities-list .item-container>input.edit-button,#footer #node-page-form .entities-list .item-container>input.edit-button,#footer form.node-form .entities-list .item-container>input.edit-button,#footer form.node-update-form .entities-list .item-container>input.edit-button,#header #node-page-edit-form .entities-list .item-container>input.edit-button,#header #node-page-form .entities-list .item-container>input.edit-button,#header form.node-form .entities-list .item-container>input.edit-button,#header form.node-update-form .entities-list .item-container>input.edit-button{border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}#footer #node-page-edit-form .entities-list.sortable .item-container,#footer #node-page-form .entities-list.sortable .item-container,#footer form.node-form .entities-list.sortable .item-container,#footer form.node-update-form .entities-list.sortable .item-container,#header #node-page-edit-form .entities-list.sortable .item-container,#header #node-page-form .entities-list.sortable .item-container,#header form.node-form .entities-list.sortable .item-container,#header form.node-update-form .entities-list.sortable .item-container{margin:2px;padding:12px}#footer #node-page-edit-form .entities-list.sortable .item-container:hover,#footer #node-page-form .entities-list.sortable .item-container:hover,#footer form.node-form .entities-list.sortable .item-container:hover,#footer form.node-update-form .entities-list.sortable .item-container:hover,#header #node-page-edit-form .entities-list.sortable .item-container:hover,#header #node-page-form .entities-list.sortable .item-container:hover,#header form.node-form .entities-list.sortable .item-container:hover,#header form.node-update-form .entities-list.sortable .item-container:hover{opacity:1}#footer #node-page-edit-form .entities-list.sortable .item-container:hover figure,#footer #node-page-form .entities-list.sortable .item-container:hover figure,#footer form.node-form .entities-list.sortable .item-container:hover figure,#footer form.node-update-form .entities-list.sortable .item-container:hover figure,#header #node-page-edit-form .entities-list.sortable .item-container:hover figure,#header #node-page-form .entities-list.sortable .item-container:hover figure,#header form.node-form .entities-list.sortable .item-container:hover figure,#header form.node-update-form .entities-list.sortable .item-container:hover figure{background-color:#fff}#footer #node-page-edit-form .js-pager__items,#footer #node-page-form .js-pager__items,#footer form.node-form .js-pager__items,#footer form.node-update-form .js-pager__items,#header #node-page-edit-form .js-pager__items,#header #node-page-form .js-pager__items,#header form.node-form .js-pager__items,#header form.node-update-form .js-pager__items{list-style-type:none;margin:0;padding:0}#footer #node-page-edit-form .views-infinite-scroll-content-wrapper+.js-pager__items,#footer #node-page-form .views-infinite-scroll-content-wrapper+.js-pager__items,#footer form.node-form .views-infinite-scroll-content-wrapper+.js-pager__items,#footer form.node-update-form .views-infinite-scroll-content-wrapper+.js-pager__items,#header #node-page-edit-form .views-infinite-scroll-content-wrapper+.js-pager__items,#header #node-page-form .views-infinite-scroll-content-wrapper+.js-pager__items,#header form.node-form .views-infinite-scroll-content-wrapper+.js-pager__items,#header form.node-update-form .views-infinite-scroll-content-wrapper+.js-pager__items{margin-top:.75rem}#footer #node-page-edit-form .js-form-type-checkbox:not(:last-child),#footer #node-page-form .js-form-type-checkbox:not(:last-child),#footer form.node-form .js-form-type-checkbox:not(:last-child),#footer form.node-update-form .js-form-type-checkbox:not(:last-child),#header #node-page-edit-form .js-form-type-checkbox:not(:last-child),#header #node-page-form .js-form-type-checkbox:not(:last-child),#header form.node-form .js-form-type-checkbox:not(:last-child),#header form.node-update-form .js-form-type-checkbox:not(:last-child){margin-bottom:.375rem}#footer #node-page-edit-form .js-form-type-checkbox:not(:first-child),#footer #node-page-form .js-form-type-checkbox:not(:first-child),#footer form.node-form .js-form-type-checkbox:not(:first-child),#footer form.node-update-form .js-form-type-checkbox:not(:first-child),#header #node-page-edit-form .js-form-type-checkbox:not(:first-child),#header #node-page-form .js-form-type-checkbox:not(:first-child),#header form.node-form .js-form-type-checkbox:not(:first-child),#header form.node-update-form .js-form-type-checkbox:not(:first-child){margin-top:.375rem}#footer #node-page-edit-form .entity-browser-media-browser-form,#footer #node-page-form .entity-browser-media-browser-form,#footer form.node-form .entity-browser-media-browser-form,#footer form.node-update-form .entity-browser-media-browser-form,#header #node-page-edit-form .entity-browser-media-browser-form,#header #node-page-form .entity-browser-media-browser-form,#header form.node-form .entity-browser-media-browser-form,#header form.node-update-form .entity-browser-media-browser-form{padding-bottom:4.5rem}#footer #node-page-edit-form .eb-media+.form-actions.form-wrapper,#footer #node-page-form .eb-media+.form-actions.form-wrapper,#footer form.node-form .eb-media+.form-actions.form-wrapper,#footer form.node-update-form .eb-media+.form-actions.form-wrapper,#header #node-page-edit-form .eb-media+.form-actions.form-wrapper,#header #node-page-form .eb-media+.form-actions.form-wrapper,#header form.node-form .eb-media+.form-actions.form-wrapper,#header form.node-update-form .eb-media+.form-actions.form-wrapper{background-color:#504b50;bottom:0;left:0;margin-top:0;padding:.75rem;position:fixed;right:0}#footer #node-page-edit-form .entity-browser-iframe-container,#footer #node-page-form .entity-browser-iframe-container,#footer form.node-form .entity-browser-iframe-container,#footer form.node-update-form .entity-browser-iframe-container,#header #node-page-edit-form .entity-browser-iframe-container,#header #node-page-form .entity-browser-iframe-container,#header form.node-form .entity-browser-iframe-container,#header form.node-update-form .entity-browser-iframe-container{position:relative}#footer #node-page-edit-form .entity-browser-iframe-container iframe,#footer #node-page-form .entity-browser-iframe-container iframe,#footer form.node-form .entity-browser-iframe-container iframe,#footer form.node-update-form .entity-browser-iframe-container iframe,#header #node-page-edit-form .entity-browser-iframe-container iframe,#header #node-page-form .entity-browser-iframe-container iframe,#header form.node-form .entity-browser-iframe-container iframe,#header form.node-update-form .entity-browser-iframe-container iframe{display:block}#footer #node-page-edit-form .entity-browser-iframe-container:before,#footer #node-page-form .entity-browser-iframe-container:before,#footer form.node-form .entity-browser-iframe-container:before,#footer form.node-update-form .entity-browser-iframe-container:before,#header #node-page-edit-form .entity-browser-iframe-container:before,#header #node-page-form .entity-browser-iframe-container:before,#header form.node-form .entity-browser-iframe-container:before,#header form.node-update-form .entity-browser-iframe-container:before{box-shadow:inset 0 0 5px rgba(19,15,19,.25);content:"";height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:504}#footer #node-page-edit-form .page-node-add dl,#footer #node-page-form .page-node-add dl,#footer form.node-form .page-node-add dl,#footer form.node-update-form .page-node-add dl,#header #node-page-edit-form .page-node-add dl,#header #node-page-form .page-node-add dl,#header form.node-form .page-node-add dl,#header form.node-update-form .page-node-add dl{border-bottom:1px dotted #c3c1c3;padding-bottom:.9rem}#footer #node-page-edit-form .page-node-add dl dd,#footer #node-page-edit-form .page-node-add dl dt,#footer #node-page-form .page-node-add dl dd,#footer #node-page-form .page-node-add dl dt,#footer form.node-form .page-node-add dl dd,#footer form.node-form .page-node-add dl dt,#footer form.node-update-form .page-node-add dl dd,#footer form.node-update-form .page-node-add dl dt,#header #node-page-edit-form .page-node-add dl dd,#header #node-page-edit-form .page-node-add dl dt,#header #node-page-form .page-node-add dl dd,#header #node-page-form .page-node-add dl dt,#header form.node-form .page-node-add dl dd,#header form.node-form .page-node-add dl dt,#header form.node-update-form .page-node-add dl dd,#header form.node-update-form .page-node-add dl dt{font-size:calc(13.05882px + .29412vw)}@media screen and (min-width:1680px){#footer #node-page-edit-form .page-node-add dl dd,#footer #node-page-edit-form .page-node-add dl dt,#footer #node-page-form .page-node-add dl dd,#footer #node-page-form .page-node-add dl dt,#footer form.node-form .page-node-add dl dd,#footer form.node-form .page-node-add dl dt,#footer form.node-update-form .page-node-add dl dd,#footer form.node-update-form .page-node-add dl dt,#header #node-page-edit-form .page-node-add dl dd,#header #node-page-edit-form .page-node-add dl dt,#header #node-page-form .page-node-add dl dd,#header #node-page-form .page-node-add dl dt,#header form.node-form .page-node-add dl dd,#header form.node-form .page-node-add dl dt,#header form.node-update-form .page-node-add dl dd,#header form.node-update-form .page-node-add dl dt{font-size:18px}}@media screen and (max-width:320px){#footer #node-page-edit-form .page-node-add dl dd,#footer #node-page-edit-form .page-node-add dl dt,#footer #node-page-form .page-node-add dl dd,#footer #node-page-form .page-node-add dl dt,#footer form.node-form .page-node-add dl dd,#footer form.node-form .page-node-add dl dt,#footer form.node-update-form .page-node-add dl dd,#footer form.node-update-form .page-node-add dl dt,#header #node-page-edit-form .page-node-add dl dd,#header #node-page-edit-form .page-node-add dl dt,#header #node-page-form .page-node-add dl dd,#header #node-page-form .page-node-add dl dt,#header form.node-form .page-node-add dl dd,#header form.node-form .page-node-add dl dt,#header form.node-update-form .page-node-add dl dd,#header form.node-update-form .page-node-add dl dt{font-size:14px}}#footer #node-page-edit-form .page-node-add dl dt,#footer #node-page-form .page-node-add dl dt,#footer form.node-form .page-node-add dl dt,#footer form.node-update-form .page-node-add dl dt,#header #node-page-edit-form .page-node-add dl dt,#header #node-page-form .page-node-add dl dt,#header form.node-form .page-node-add dl dt,#header form.node-update-form .page-node-add dl dt{border-top:1px dotted #c3c1c3;margin-top:1.125rem;padding-top:1.125rem}#footer #node-page-edit-form .page-node-add dl dt:first-child,#footer #node-page-form .page-node-add dl dt:first-child,#footer form.node-form .page-node-add dl dt:first-child,#footer form.node-update-form .page-node-add dl dt:first-child,#header #node-page-edit-form .page-node-add dl dt:first-child,#header #node-page-form .page-node-add dl dt:first-child,#header form.node-form .page-node-add dl dt:first-child,#header form.node-update-form .page-node-add dl dt:first-child{margin-top:0}#footer #node-page-edit-form .page-node-add dl dt a,#footer #node-page-form .page-node-add dl dt a,#footer form.node-form .page-node-add dl dt a,#footer form.node-update-form .page-node-add dl dt a,#header #node-page-edit-form .page-node-add dl dt a,#header #node-page-form .page-node-add dl dt a,#header form.node-form .page-node-add dl dt a,#header form.node-update-form .page-node-add dl dt a{color:#130f13;display:block;font-weight:500}#footer #node-page-edit-form .page-node-add dl dd,#footer #node-page-form .page-node-add dl dd,#footer form.node-form .page-node-add dl dd,#footer form.node-update-form .page-node-add dl dd,#header #node-page-edit-form .page-node-add dl dd,#header #node-page-form .page-node-add dl dd,#header form.node-form .page-node-add dl dd,#header form.node-update-form .page-node-add dl dd{color:#777277;margin:0;width:80%}@media (min-width:48em){#footer #node-page-edit-form .page-node-add dl,#footer #node-page-form .page-node-add dl,#footer form.node-form .page-node-add dl,#footer form.node-update-form .page-node-add dl,#header #node-page-edit-form .page-node-add dl,#header #node-page-form .page-node-add dl,#header form.node-form .page-node-add dl,#header form.node-update-form .page-node-add dl{display:flex;flex-wrap:wrap}#footer #node-page-edit-form .page-node-add dl dt,#footer #node-page-form .page-node-add dl dt,#footer form.node-form .page-node-add dl dt,#footer form.node-update-form .page-node-add dl dt,#header #node-page-edit-form .page-node-add dl dt,#header #node-page-form .page-node-add dl dt,#header form.node-form .page-node-add dl dt,#header form.node-update-form .page-node-add dl dt{width:20%}#footer #node-page-edit-form .page-node-add dl dd,#footer #node-page-form .page-node-add dl dd,#footer form.node-form .page-node-add dl dd,#footer form.node-update-form .page-node-add dl dd,#header #node-page-edit-form .page-node-add dl dd,#header #node-page-form .page-node-add dl dd,#header form.node-form .page-node-add dl dd,#header form.node-update-form .page-node-add dl dd{border-top:1px dotted #c3c1c3;margin-top:1.125rem;padding-top:1.125rem;width:80%}#footer #node-page-edit-form .page-node-add dl dt:first-child+dd,#footer #node-page-form .page-node-add dl dt:first-child+dd,#footer form.node-form .page-node-add dl dt:first-child+dd,#footer form.node-update-form .page-node-add dl dt:first-child+dd,#header #node-page-edit-form .page-node-add dl dt:first-child+dd,#header #node-page-form .page-node-add dl dt:first-child+dd,#header form.node-form .page-node-add dl dt:first-child+dd,#header form.node-update-form .page-node-add dl dt:first-child+dd{margin-top:0}}#footer #node-page-edit-form .paragraph--type--webform .form-item:not(:last-child),#footer #node-page-edit-form .paragraph--type--webform h2,#footer #node-page-form .paragraph--type--webform .form-item:not(:last-child),#footer #node-page-form .paragraph--type--webform h2,#footer form.node-form .paragraph--type--webform .form-item:not(:last-child),#footer form.node-form .paragraph--type--webform h2,#footer form.node-update-form .paragraph--type--webform .form-item:not(:last-child),#footer form.node-update-form .paragraph--type--webform h2,#header #node-page-edit-form .paragraph--type--webform .form-item:not(:last-child),#header #node-page-edit-form .paragraph--type--webform h2,#header #node-page-form .paragraph--type--webform .form-item:not(:last-child),#header #node-page-form .paragraph--type--webform h2,#header form.node-form .paragraph--type--webform .form-item:not(:last-child),#header form.node-form .paragraph--type--webform h2,#header form.node-update-form .paragraph--type--webform .form-item:not(:last-child),#header form.node-update-form .paragraph--type--webform h2{margin-bottom:3.75rem}#footer #node-page-edit-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label,#footer #node-page-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label,#footer form.node-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label,#footer form.node-update-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label,#header #node-page-edit-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label,#header #node-page-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label,#header form.node-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label,#header form.node-update-form .entity-type-text.ui-dialog-content .field--name-field-content .js-form-type-textarea label{display:none}#footer #node-page-edit-form .cke_bottom,#footer #node-page-form .cke_bottom,#footer form.node-form .cke_bottom,#footer form.node-update-form .cke_bottom,#header #node-page-edit-form .cke_bottom,#header #node-page-form .cke_bottom,#header form.node-form .cke_bottom,#header form.node-update-form .cke_bottom{display:none!important}#footer .field--widget-entity-reference-layout-widget .erl-field-item--layout,#header .field--widget-entity-reference-layout-widget .erl-field-item--layout{border:1px solid #c3c1c3}#footer .field--widget-entity-reference-layout-widget .reversed .erl-field-item--layout,#footer .field--widget-entity-reference-layout-widget .reversed .erl-layout-section .erl-field-item,#header .field--widget-entity-reference-layout-widget .reversed .erl-field-item--layout,#header .field--widget-entity-reference-layout-widget .reversed .erl-layout-section .erl-field-item{border-color:hsla(0,0%,100%,.5)}#footer .field--widget-entity-reference-layout-widget .erl-layout-section,#header .field--widget-entity-reference-layout-widget .erl-layout-section{border:1px dashed #c3c1c3}#footer .field--widget-entity-reference-layout-widget .reversed .erl-layout-section,#header .field--widget-entity-reference-layout-widget .reversed .erl-layout-section{border-color:hsla(0,0%,100%,.5)}#footer .field--widget-entity-reference-layout-widget .erl-layout-section:hover,#header .field--widget-entity-reference-layout-widget .erl-layout-section:hover{border:1px solid #9d999d}#footer .field--widget-entity-reference-layout-widget .reversed .erl-layout-section:hover,#header .field--widget-entity-reference-layout-widget .reversed .erl-layout-section:hover{border-color:hsla(0,0%,100%,.5)}#footer .js-component,#header .js-component{position:relative;z-index:1}#footer .views-element-container,#header .views-element-container{margin-bottom:1.875rem}@media (min-width:1200px){#footer .views-element-container,#header .views-element-container{margin-bottom:3.75rem}}#footer .paragraph--type--section .layout .l__region .views-element-container,#header .paragraph--type--section .layout .l__region .views-element-container{margin-bottom:0}#footer .view--empty,#header .view--empty{margin-top:1.875rem}@media (min-width:1200px){#footer .view--empty,#header .view--empty{margin-top:3.75rem}}#footer .view--empty p,#header .view--empty p{color:#565a5c;font-weight:400;line-height:1.5}@media (min-width:0px){#footer .view--empty p,#header .view--empty p{font-size:1rem}}@media (min-width:600px){#footer .view--empty p,#header .view--empty p{font-size:1.125rem}}#footer .view--empty p:first-child,#header .view--empty p:first-child{margin-top:0}#footer .view--empty p:last-child,#header .view--empty p:last-child{margin-bottom:0}@media (min-width:0px){#footer .views-view-grid.cols-3,#header .views-view-grid.cols-3{font-size:.75rem}}@media (min-width:600px){#footer .views-view-grid.cols-3,#header .views-view-grid.cols-3{font-size:.8125rem}}#footer .views-view-grid.cols-3 .views-col,#header .views-view-grid.cols-3 .views-col{border-left:1px solid #d7d9d9;padding:1rem 1.25rem}#footer .views-view-grid.cols-3 .views-col:first-child,#header .views-view-grid.cols-3 .views-col:first-child{border-left:none}#footer .views-view-grid.cols-3 .views-row,#header .views-view-grid.cols-3 .views-row{margin-bottom:0}@media (min-width:0px) and (max-width:1199.98px){#footer .js-prevent-scroll,#header .js-prevent-scroll{height:100%;overflow:hidden;position:fixed;width:100%}}#footer .header,#header .header{background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25),0 1px 1px rgba(0,0,0,.25);position:fixed;top:0;width:100%;z-index:100}#footer .header__inner,#header .header__inner{background-color:#fff;display:flex;flex-direction:row;flex-wrap:nowrap;height:120px;justify-content:space-between}@media (min-width:0px) and (max-width:1199.98px){#footer .header__inner,#header .header__inner{align-items:center;height:60px}}#footer [id],#header [id]{scroll-margin-top:120px}@media (min-width:0px) and (max-width:1199.98px){#footer [id],#header [id]{scroll-margin-top:60px}}#footer .header__logo,#header .header__logo{align-items:center;display:flex;justify-content:center;padding:0;width:88px;z-index:1}#footer .header__logo a,#footer .header__logo img,#header .header__logo a,#header .header__logo img{display:block;width:100%}@media (min-width:992px){#footer .header__logo,#header .header__logo{margin:24px 0;width:140px}}@media (min-width:1200px){#footer .header__logo,#header .header__logo{margin:24px 0;width:140px}}@media (min-width:0px) and (max-width:1199.98px){#footer .header__site-navigation,#header .header__site-navigation{bottom:0;left:0;position:fixed;right:0;top:60px;width:100%;z-index:-1}}@media (min-width:1200px){#footer .header__site-navigation,#header .header__site-navigation{align-items:flex-end;align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap}}@media (min-width:0px) and (max-width:1199.98px){#footer body.user-logged-in .header__site-navigation,#header body.user-logged-in .header__site-navigation{top:99px}#footer body.toolbar-fixed.toolbar-tray-open .header__site-navigation,#header body.toolbar-fixed.toolbar-tray-open .header__site-navigation{top:138px}}#footer .header__utilities,#header .header__utilities{display:flex;flex-direction:column;height:90px;justify-content:flex-end;margin-bottom:22px;width:126px}@media (min-width:992px) and (max-width:1199.98px){#footer .header__utilities,#header .header__utilities{height:66px;width:90px}}#footer .nav-trigger,#header .nav-trigger{clip:rect(0,0,0,0);position:absolute}#footer label[for=nav-trigger],#header label[for=nav-trigger]{cursor:pointer;height:30px;margin:auto;position:absolute;right:30px;width:30px;z-index:2}@media (min-width:1200px){#footer label[for=nav-trigger],#header label[for=nav-trigger]{display:none}}#footer .nav-trigger__icon,#header .nav-trigger__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}#footer .nav-trigger__icon path,#header .nav-trigger__icon path{fill:#0073cf}#footer .nav-trigger__icon--expand,#header .nav-trigger__icon--expand{bottom:0;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;transform:rotate(0) scale(1);transition:all .2s ease-in-out}#footer .nav-trigger__icon--collapse,#header .nav-trigger__icon--collapse{margin:auto;opacity:0;position:absolute;transform:rotate(-90deg) scale(0);transition:all .2s ease-in-out}@media (min-width:0px) and (max-width:1199.98px){#footer .header__site-navigation,#header .header__site-navigation{opacity:0;transform:translateY(-100%);transition:all .3s ease-in-out}#footer .nav-trigger:checked~.header__site-navigation,#header .nav-trigger:checked~.header__site-navigation{opacity:1;overflow-y:auto;transform:translateY(0)}#footer .nav-trigger:checked~label .nav-trigger__icon--collapse,#header .nav-trigger:checked~label .nav-trigger__icon--collapse{opacity:1;transform:rotate(0) scale(1)}#footer .nav-trigger:checked~label .nav-trigger__icon--expand,#header .nav-trigger:checked~label .nav-trigger__icon--expand{opacity:0;transform:rotate(90deg) scale(0)}#footer nav#block-neon-main-menu>ul,#header nav#block-neon-main-menu>ul{background:#fff;box-shadow:0 2px 4px rgba(0,0,0,.5);height:100%;margin:0;overflow-x:hidden;padding:0;width:100%}#footer nav#block-neon-main-menu>ul li,#header nav#block-neon-main-menu>ul li{align-items:center;border-left:6px solid #fff;display:flex;justify-content:space-between;margin:12px auto;padding:15px 30px 18px 24px;transition:all .25s ease-in-out}#footer nav#block-neon-main-menu>ul li.menu__item.menu__item--expanded:hover,#header nav#block-neon-main-menu>ul li.menu__item.menu__item--expanded:hover{border-left:6px solid #0073cf;transition:all .25s ease-in-out}#footer nav#block-neon-main-menu>ul li a,#header nav#block-neon-main-menu>ul li a{color:#0073cf;display:inline-block;font-size:18px;font-weight:600;line-height:30px;text-decoration:none}#footer nav#block-neon-main-menu>ul li>.arrow,#header nav#block-neon-main-menu>ul li>.arrow{clip:auto;appearance:none;background:none;border:0;border-radius:3px;height:24px;margin-top:0;opacity:1;right:26px;transform:rotate(-90deg);transition:all .15s ease-in-out;visibility:visible;width:24px}#footer nav#block-neon-main-menu>ul li>.arrow svg,#header nav#block-neon-main-menu>ul li>.arrow svg{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}#footer nav#block-neon-main-menu>ul li>.arrow svg path,#header nav#block-neon-main-menu>ul li>.arrow svg path{stroke:#0073cf}}@media (min-width:0px) and (max-width:1199.98px){#footer nav#block-neon-main-menu>ul li>.arrow:active,#footer nav#block-neon-main-menu>ul li>.arrow:focus,#footer nav#block-neon-main-menu>ul li>.arrow:focus-within,#footer nav#block-neon-main-menu>ul li>.arrow:hover,#header nav#block-neon-main-menu>ul li>.arrow:active,#header nav#block-neon-main-menu>ul li>.arrow:focus,#header nav#block-neon-main-menu>ul li>.arrow:focus-within,#header nav#block-neon-main-menu>ul li>.arrow:hover{background:none;position:absolute!important}#footer nav#block-neon-main-menu>ul>li.myAccount,#footer nav#block-neon-main-menu>ul>li.siteSearch,#header nav#block-neon-main-menu>ul>li.myAccount,#header nav#block-neon-main-menu>ul>li.siteSearch{background:#f5f6f7;border:none;margin:0}#footer nav#block-neon-main-menu>ul>li.myAccount,#header nav#block-neon-main-menu>ul>li.myAccount{flex:none;text-align:center;width:100%}#footer nav#block-neon-main-menu>ul>li.myAccount a,#header nav#block-neon-main-menu>ul>li.myAccount a{background:#e4e6e7;border:1px solid #e4e6e7;border-radius:2px;color:#565a5c;font-size:12px;font-weight:600;letter-spacing:1.2px;padding:6px 12px;text-decoration:none;text-transform:uppercase;transition:all .15s ease}#footer nav#block-neon-main-menu>ul>li.myAccount a:hover,#header nav#block-neon-main-menu>ul>li.myAccount a:hover{color:#0073cf;transition:all .3s ease}#footer nav#block-neon-main-menu>ul>li.menu__item.menu__item--expanded.over>.subNavWrapper.depthZero,#header nav#block-neon-main-menu>ul>li.menu__item.menu__item--expanded.over>.subNavWrapper.depthZero{background:#002c77;display:flex;flex-direction:column;transform:translateZ(0) translateX(0)}#footer nav#block-neon-main-menu ul[data-depth="0"] ul,#header nav#block-neon-main-menu ul[data-depth="0"] ul{background:#002c77;height:100%;transition:transform .12s}#footer nav#block-neon-main-menu ul[data-depth="0"] ul li,#header nav#block-neon-main-menu ul[data-depth="0"] ul li{align-items:center;border-left:6px solid #002c77;color:#c2deea;display:flex;font-weight:400;justify-content:space-between;padding:15px 30px 15px 24px}#footer nav#block-neon-main-menu ul[data-depth="0"] ul li a,#header nav#block-neon-main-menu ul[data-depth="0"] ul li a{color:#c2deea;font-weight:400}#footer nav#block-neon-main-menu ul[data-depth="0"] ul .mini-arrow,#header nav#block-neon-main-menu ul[data-depth="0"] ul .mini-arrow{align-items:center;appearance:none;background:none;border:0;border-radius:3px;display:flex;height:48px;justify-content:center;margin-top:0;right:26px;width:48px}#footer nav#block-neon-main-menu ul[data-depth="0"],#header nav#block-neon-main-menu ul[data-depth="0"]{-webkit-overflow-scrolling:touch;position:fixed;right:0;transform:translateX(0) translateZ(0);visibility:visible;width:100%;z-index:1}#footer nav#block-neon-main-menu ul[data-depth="1"],#header nav#block-neon-main-menu ul[data-depth="1"]{left:0;margin:0;padding:0;position:absolute;top:0;width:100%}#footer nav#block-neon-main-menu ul[data-depth="1"]>li.active ul[data-depth="2"],#header nav#block-neon-main-menu ul[data-depth="1"]>li.active ul[data-depth="2"]{transform:translateZ(0) translateX(0);transition:transform .3s}#footer nav#block-neon-main-menu ul[data-depth="2"],#header nav#block-neon-main-menu ul[data-depth="2"]{left:0;margin:0;padding:0;position:absolute;top:0;transform:translateZ(0) translateX(100%);width:100%}#footer nav#block-neon-main-menu ul[data-depth="2"]>li.active ul[data-depth="3"],#header nav#block-neon-main-menu ul[data-depth="2"]>li.active ul[data-depth="3"]{transform:translateZ(0) translateX(0)}#footer nav#block-neon-main-menu ul[data-depth="3"],#header nav#block-neon-main-menu ul[data-depth="3"]{left:0;margin:0;padding:0;position:absolute;top:0;transform:translateZ(0) translateX(100%);width:100%}#footer nav#block-neon-main-menu ul[data-depth="3"]>li.active ul[data-depth="4"],#header nav#block-neon-main-menu ul[data-depth="3"]>li.active ul[data-depth="4"]{transform:translateZ(0) translateX(0)}#footer nav#block-neon-main-menu ul[data-depth="4"],#header nav#block-neon-main-menu ul[data-depth="4"]{left:0;margin:0;padding:0;position:absolute;top:0;transform:translateZ(0) translateX(100%);width:100%}#footer nav#block-neon-main-menu ul[data-depth="4"]>li.active ul[data-depth="5"],#header nav#block-neon-main-menu ul[data-depth="4"]>li.active ul[data-depth="5"]{transform:translateZ(0) translateX(0)}#footer nav#block-neon-main-menu ul[data-depth="5"],#header nav#block-neon-main-menu ul[data-depth="5"]{left:0;margin:0;padding:0;position:absolute;top:0;transform:translateZ(0) translateX(100%);width:100%}#footer nav#block-neon-main-menu .subNavWrapper,#header nav#block-neon-main-menu .subNavWrapper{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow:auto;position:fixed;right:0;top:0;transform:translateZ(0) translateX(100%);transition:transform .15s;z-index:1}#footer nav#block-neon-main-menu .subNavWrapper .innerSubNavWrapper,#header nav#block-neon-main-menu .subNavWrapper .innerSubNavWrapper{height:100%;order:2;overflow:hidden;position:relative;width:100%}#footer nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper,#header nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper{order:1;width:100%}#footer nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper .mobileBack,#header nav#block-neon-main-menu .subNavWrapper .subNavLabelWrapper .mobileBack{align-items:center;background:#fff;border:none;border-radius:3px;display:flex;flex-direction:column;height:30px;justify-content:center;margin:18px 0 0 30px;width:30px}}@media (min-width:1200px){#footer .subNavWrapper ul[data-depth="1"] .expandable:not(.active) ul,#header .subNavWrapper ul[data-depth="1"] .expandable:not(.active) ul{height:0;overflow:hidden}#footer .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="2"],#footer .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="3"],#footer .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="4"],#footer .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="5"],#header .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="2"],#header .subNavWrapper ul[data-depth="1"] li.active ul[data-depth="3"],#header .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="4"],#header .subNavWrapper ul[data-depth="3"] li.active ul[data-depth="5"]{height:auto;overflow:visible}#footer .header__menu-main,#header .header__menu-main{align-items:center;display:flex;height:100%}#footer nav#block-neon-main-menu,#header nav#block-neon-main-menu{align-items:center;display:flex;height:100%;position:inherit!important}#footer nav#block-neon-main-menu>ul.menu--main,#header nav#block-neon-main-menu>ul.menu--main{align-items:stretch;display:flex;height:100%;margin:0;padding:0}#footer nav#block-neon-main-menu>ul.menu--main>li,#header nav#block-neon-main-menu>ul.menu--main>li{align-items:center;border-bottom:6px solid #fff;display:flex;flex-direction:column;justify-content:center;margin-right:50px}#footer nav#block-neon-main-menu>ul.menu--main>li:last-child,#header nav#block-neon-main-menu>ul.menu--main>li:last-child{margin-right:0}#footer nav#block-neon-main-menu>ul.menu--main>li>a:not([myAccount]),#footer nav#block-neon-main-menu>ul.menu--main>li>a:not([siteSearch]),#header nav#block-neon-main-menu>ul.menu--main>li>a:not([myAccount]),#header nav#block-neon-main-menu>ul.menu--main>li>a:not([siteSearch]){color:#0073cf;font-size:18px;font-weight:600;margin-bottom:auto;margin-top:42px;padding-bottom:6px;padding-top:6px;text-decoration:none}#footer nav#block-neon-main-menu>ul.menu--main>li:not(.menu__item--expanded)>a,#header nav#block-neon-main-menu>ul.menu--main>li:not(.menu__item--expanded)>a{margin-bottom:auto}#footer nav#block-neon-main-menu>ul.menu--main>li.menu__item--expanded:focus .arrow,#footer nav#block-neon-main-menu>ul.menu--main>li.menu__item--expanded:focus-within .arrow,#footer nav#block-neon-main-menu>ul.menu--main>li.menu__item--expanded:hover .arrow,#header nav#block-neon-main-menu>ul.menu--main>li.menu__item--expanded:focus .arrow,#header nav#block-neon-main-menu>ul.menu--main>li.menu__item--expanded:focus-within .arrow,#header nav#block-neon-main-menu>ul.menu--main>li.menu__item--expanded:hover .arrow{clip:auto;background:#0073cf;opacity:1;transition:all .2s ease-in-out;visibility:visible;z-index:4}#footer nav#block-neon-main-menu>ul.menu--main>li>.arrow,#header nav#block-neon-main-menu>ul.menu--main>li>.arrow{background:none;border:0;border-radius:0 0 3px 3px;bottom:-37px;display:block;height:34px;opacity:0;position:relative!important;text-align:center;transition:all .2s ease-in-out;visibility:hidden;width:calc(100% - 14px);z-index:0}#footer nav#block-neon-main-menu>ul.menu--main>li>.arrow svg,#header nav#block-neon-main-menu>ul.menu--main>li>.arrow svg{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}#footer nav#block-neon-main-menu>ul.menu--main>li>.arrow.hidden,#header nav#block-neon-main-menu>ul.menu--main>li>.arrow.hidden{display:none!important}#footer nav#block-neon-main-menu>ul.menu--main>li.over,#header nav#block-neon-main-menu>ul.menu--main>li.over{border-bottom:6px solid #0073cf}#footer nav#block-neon-main-menu>ul.menu--main>li.myAccount,#header nav#block-neon-main-menu>ul.menu--main>li.myAccount{flex:none;margin:0 0 25px;width:100%}#footer nav#block-neon-main-menu>ul.menu--main>li.myAccount a,#header nav#block-neon-main-menu>ul.menu--main>li.myAccount a{background:#e4e6e7;border:1px solid #e4e6e7;border-radius:2px;color:#565a5c;font-size:12px;font-weight:600;letter-spacing:1.2px;line-height:18px;margin-bottom:auto;padding:6px 12px;text-decoration:none;text-transform:uppercase;transition:all .25s ease}#footer nav#block-neon-main-menu>ul.menu--main>li.myAccount a:hover,#header nav#block-neon-main-menu>ul.menu--main>li.myAccount a:hover{background:#fff;border:1px solid #fff;color:#0073cf;transition:all .3s ease}}@media (min-width:1200px) and (min-width:768px){#footer nav#block-neon-main-menu>ul.menu--main>li.myAccount,#header nav#block-neon-main-menu>ul.menu--main>li.myAccount{margin:0 30px 0 0;width:auto}}@media (min-width:1200px){#footer nav#block-neon-main-menu>ul.menu--main>li.siteSearch,#header nav#block-neon-main-menu>ul.menu--main>li.siteSearch{flex:none;margin-right:0;width:20px}#footer nav#block-neon-main-menu>ul.menu--main>li.siteSearch a,#header nav#block-neon-main-menu>ul.menu--main>li.siteSearch a{background:url(https://www.neonscience.org/themes/custom/neon/images/icons/search.svg) 50% no-repeat;display:block;margin-bottom:auto;overflow:hidden;position:relative;text-indent:100%;white-space:nowrap}#footer nav#block-neon-main-menu>ul.menu--main>li.siteSearch a:after,#footer nav#block-neon-main-menu>ul.menu--main>li.siteSearch a:before,#header nav#block-neon-main-menu>ul.menu--main>li.siteSearch a:after,#header nav#block-neon-main-menu>ul.menu--main>li.siteSearch a:before{background:url(https://www.neonscience.org/themes/custom/neon/images/icons/search_hover.svg);content:"";display:none;height:0;width:0}#footer nav#block-neon-main-menu>ul.menu--main>li.siteSearch a:hover,#header nav#block-neon-main-menu>ul.menu--main>li.siteSearch a:hover{background:url(https://www.neonscience.org/themes/custom/neon/images/icons/search_hover.svg) no-repeat 50%}#footer .subNavWrapper,#header .subNavWrapper{background:#002c77;box-shadow:inset 0 1px 3px rgba(0,0,0,.25),inset 0 1px 1px rgba(0,0,0,.25);display:flex;flex-direction:column;height:100%;left:0;margin:0;opacity:0;overflow-x:hidden;overflow-y:auto;position:fixed;top:120px;transition:opacity .2s ease-in-out;visibility:hidden;white-space:nowrap;width:100%;z-index:-1}#footer .subNavWrapper .subNavLabelWrapper,#header .subNavWrapper .subNavLabelWrapper{border-bottom:1px solid #0073cf;display:flex;flex:none;justify-content:flex-start;order:1;padding:1.875rem 2.25rem 1.875rem 1.875rem;position:relative}#footer .subNavWrapper .subNavLabelWrapper h3,#header .subNavWrapper .subNavLabelWrapper h3{color:#fff;font-weight:300;line-height:.8;margin:0 0 0 .3125rem;padding:0;white-space:normal}}@media (min-width:1200px) and (min-width:0px){#footer .subNavWrapper .subNavLabelWrapper h3,#header .subNavWrapper .subNavLabelWrapper h3{font-size:1.5rem}}@media (min-width:1200px) and (min-width:600px){#footer .subNavWrapper .subNavLabelWrapper h3,#header .subNavWrapper .subNavLabelWrapper h3{font-size:2.25rem}}@media (min-width:1200px){#footer .subNavWrapper .subNavLabelWrapper .subNavClose,#header .subNavWrapper .subNavLabelWrapper .subNavClose{appearance:none;background:none;border:none;cursor:pointer;left:40px;top:40px}#footer .subNavWrapper .innerSubNavWrapper,#header .subNavWrapper .innerSubNavWrapper{flex:none;height:100%;order:2;position:relative}#footer .subNavWrapper.depthOne .innerSubNavWrapper:before,#header .subNavWrapper.depthOne .innerSubNavWrapper:before{background:#00235f;border-left:1px solid #0073cf;content:"";height:100%;left:33.3333333333%;position:absolute;top:0;width:100%}#footer .subNavWrapper.depthThree .innerSubNavWrapper:after,#header .subNavWrapper.depthThree .innerSubNavWrapper:after{background:#001c4c;border-left:1px solid #0073cf;content:"";height:100%;position:absolute;right:0;top:0;width:33.3333333333%}#footer nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper,#header nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper{opacity:1;transition:opacity .2s ease-in-out;visibility:visible;z-index:3}#footer nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper ul[data-depth="1"],#header nav#block-neon-main-menu ul.menu--main li.over .subNavWrapper ul[data-depth="1"]{opacity:1;visibility:visible}#footer nav#block-neon-main-menu ul.menu--main li ul li,#header nav#block-neon-main-menu ul.menu--main li ul li{color:#f5f6f7;display:block}#footer nav#block-neon-main-menu ul.menu--main li ul li a,#header nav#block-neon-main-menu ul.menu--main li ul li a{color:#f5f6f7;display:inline-block;text-decoration:none}#footer nav#block-neon-main-menu ul.menu--main li ul li span,#header nav#block-neon-main-menu ul.menu--main li ul li span{color:#f5f6f7;display:inline-block}#footer nav#block-neon-main-menu ul.menu--main li ul li>ul a,#footer nav#block-neon-main-menu ul.menu--main li ul li>ul li,#footer nav#block-neon-main-menu ul.menu--main li ul li>ul span,#header nav#block-neon-main-menu ul.menu--main li ul li>ul a,#header nav#block-neon-main-menu ul.menu--main li ul li>ul li,#header nav#block-neon-main-menu ul.menu--main li ul li>ul span{font-size:15px}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"],#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]{margin:0;opacity:0;padding:0;position:absolute;top:12px;visibility:hidden;width:33.3%}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li{padding:16px 60px}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:last-child,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:last-child{margin-bottom:0}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable .mini-arrow,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable .mini-arrow{appearance:none;background:none;border:0;border-radius:3px;height:48px;margin-top:-12px;padding-right:26px;position:absolute;right:0;transition:all .25s ease-in-out;width:48px}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable .mini-arrow svg,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable .mini-arrow svg{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable.active,#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable:hover,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable.active,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable:hover{transition:background-color .25s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable.active>a,#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable:hover>a,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable.active>a,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable:hover>a{border-bottom:2px solid #fff;color:#fff;text-shadow:0 0 .65px #fff,0 0 .65px #fff;transition:all .2s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable.active,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li.expandable.active{background:linear-gradient(0deg,rgba(0,115,207,.2),rgba(0,115,207,.2)),#002c77}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li>a,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li>a{border:none;font-size:18px;font-weight:400;line-height:24px;text-decoration:none;transition:all .25s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:hover,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:hover{transition:all .25s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:hover>a,#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:hover>span,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:hover>a,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="1"]>li:hover>span{color:#fff;transition:all .2s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"],#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"],#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"],#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]{left:calc(108% + 2px);margin:0;opacity:0;padding:0;position:absolute;top:0;transition:all .15s ease-in-out;visibility:hidden;width:100%}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li{margin:0;padding:0}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li.expandable .mini-arrow,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li.expandable .mini-arrow,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li.expandable .mini-arrow,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li.expandable .mini-arrow{margin-top:0}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li>a,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li>a{font-size:15px;font-weight:600;margin:0;padding:25px 60px 12px}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li:not([class])>a,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li:not([class])>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li:not([class])>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li:not([class])>a{padding:22px 60px 20px}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li:not([class]):not(:last-child)>a,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li:not([class]):not(:last-child)>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li:not([class]):not(:last-child)>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li:not([class]):not(:last-child)>a{position:relative}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li:not([class]):not(:last-child)>a:after,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li:not([class]):not(:last-child)>a:after,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="2"]>li:not([class]):not(:last-child)>a:after,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="4"]>li:not([class]):not(:last-child)>a:after{background:#004b97;bottom:0;content:"";height:1px;left:60px;position:absolute;width:100%}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"],#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]{border-bottom:1px solid #004b97;margin:0;padding:0}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li{margin:0;padding:0}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li>a{font-size:15px;font-weight:400;margin:0;padding:10px 0 10px 90px;position:relative}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li>a:before,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li>a:before{background:#f5f6f7;content:"";height:1px;left:60px;position:absolute;top:20px;width:10px}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable{align-items:center;cursor:pointer;display:flex;justify-content:space-between}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable button.mini-arrow.focusable,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable button.mini-arrow.focusable{margin:0;position:relative;right:unset}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable.active,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable.active{background:linear-gradient(0deg,rgba(0,115,207,.2),rgba(0,115,207,.2)),#002c77}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable.active,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable:hover,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable.active,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable:hover{transition:background-color .25s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable.active>a,#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable:hover>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable.active>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li.expandable:hover>a{color:#fff;display:inline-block;text-shadow:0 0 .65px #fff,0 0 .65px #fff;transition:all .2s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li:not([class]):after,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="3"]>li:not([class]):after{display:none}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"],#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"]{left:calc(100% + 1px);margin:0;opacity:0;padding:0;position:absolute;top:0;transition:all .15s ease-in-out;visibility:hidden;width:100%}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li a,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li a{width:100%}#footer nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li.expandable:before,#header nav#block-neon-main-menu ul.menu--main li ul[data-depth="4"] li.expandable:before{display:none}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"],#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]{border-bottom:1px solid #004b97;margin:0;padding:0}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li{margin:0;padding:0}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li>a,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li>a{font-size:15px;font-weight:400;margin:0;padding:10px 0 10px 90px;position:relative;transition:all .2s ease-in-out;width:100%}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li>a:hover,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li>a:hover{text-shadow:0 0 .65px #fff,0 0 .65px #fff;transition:all .2s ease-in-out}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li>a:before,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li>a:before{background:#f5f6f7;content:"";height:1px;left:60px;position:absolute;top:20px;width:10px}#footer nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li:last-child>a:last-child,#header nav#block-neon-main-menu ul.menu--main li ul li ul[data-depth="5"]>li:last-child>a:last-child{padding-bottom:20px;position:relative}#footer nav#block-neon-main-menu ul.menu--main li ul li.active>ul[data-depth="2"],#header nav#block-neon-main-menu ul.menu--main li ul li.active>ul[data-depth="2"]{left:calc(100% + 2px);opacity:1;transition:all .15s ease-out;visibility:visible}#footer nav#block-neon-main-menu ul.menu--main li ul li.active ul li.active>ul[data-depth="4"],#header nav#block-neon-main-menu ul.menu--main li ul li.active ul li.active>ul[data-depth="4"]{left:calc(100% + 2px);opacity:1;transition:all .15s ease-out;visibility:visible;z-index:1}}#footer .header__search,#header .header__search{background:#f5f6f7;opacity:1;position:relative;transition:all .2s ease-in-out;visibility:visible;z-index:1}#footer .header__search.visually-hidden,#header .header__search.visually-hidden{opacity:0;transition:all .2s ease-in-out;visibility:hidden}@media (min-width:0px) and (max-width:1199.98px){#footer nav#block-neon-main-menu>ul>li.myAccount,#header nav#block-neon-main-menu>ul>li.myAccount{padding:1.5rem 0 0}#footer nav#block-neon-main-menu>ul>li.myAccount a,#header nav#block-neon-main-menu>ul>li.myAccount a{margin:0 auto}}@media (min-width:1200px){#footer #header nav#block-neon-main-menu>ul.menu--main>li,#footer #root nav#block-neon-main-menu>ul.menu--main>li,#footer body:not([class]) nav#block-neon-main-menu>ul.menu--main>li,#header #header nav#block-neon-main-menu>ul.menu--main>li,#header #root nav#block-neon-main-menu>ul.menu--main>li,#header body:not([class]) nav#block-neon-main-menu>ul.menu--main>li{height:100%}}#footer li.myAccount,#header li.myAccount{display:none!important}#footer .ui-dialog.entity-browser-modal,#header .ui-dialog.entity-browser-modal{z-index:3001}#footer .ui-widget-overlay,#header .ui-widget-overlay{opacity:.9}#footer .js-media-library-item-preview .field--name-thumbnail img,#header .js-media-library-item-preview .field--name-thumbnail img{width:auto!important}#footer .authContainer,#header .authContainer{border:1px solid #0073cf;position:absolute;text-align:right;z-index:10}#footer .authContainer .openid-connect-login-form form>div,#header .authContainer .openid-connect-login-form form>div{border:none}#footer .authContainer .openid-connect-login-form .form-submit,#header .authContainer .openid-connect-login-form .form-submit{background:none;border:none}@media (max-width:1199.95px){#footer .authContainer,#header .authContainer{border:1px solid #0073cf;right:72px;top:13px}#footer .authContainer .form-submit,#footer .authContainer a,#header .authContainer .form-submit,#header .authContainer a{color:#0073cf!important;display:inline-block;font-family:Inter,Helvetica,Arial,sans-serif!important;font-size:.55rem!important;font-weight:600!important;line-height:1.75!important;padding:5px 10px;text-decoration:none;text-transform:uppercase!important;white-space:nowrap}#footer .authContainer .form-submit:hover,#footer .authContainer a:hover,#header .authContainer .form-submit:hover,#header .authContainer a:hover{text-decoration:underline}#footer .authContainer :first-child,#header .authContainer :first-child{border-right:1px solid;border-top-left-radius:0}#footer .authContainer :last-child,#header .authContainer :last-child{border-bottom-right-radius:0;border-right:none;border-top-right-radius:0}}@media (min-width:1200px){#footer .authContainer,#header .authContainer{border:1px solid #0073cf;padding:0;right:0;top:-1px}#footer .authContainer .form-submit,#footer .authContainer a,#header .authContainer .form-submit,#header .authContainer a{color:#0073cf!important;display:inline-block;font-family:Inter,Helvetica,Arial,sans-serif!important;font-size:.55rem!important;font-weight:600!important;line-height:1.75!important;padding:5px 10px;text-decoration:none;text-transform:uppercase!important;white-space:nowrap}#footer .authContainer .form-submit:hover,#footer .authContainer a:hover,#header .authContainer .form-submit:hover,#header .authContainer a:hover{text-decoration:underline}#footer .authContainer :first-child,#header .authContainer :first-child{border-right:1px solid;border-top-left-radius:0}#footer .authContainer :last-child,#header .authContainer :last-child{border-bottom-right-radius:0;border-right:none;border-top-right-radius:0}}#footer .footer-top__wrapper,#header .footer-top__wrapper{background-color:#352723;color:#e4e6e7}#footer .footer-top__wrapper .footer-top__inner,#header .footer-top__wrapper .footer-top__inner{display:flex;flex-direction:column;padding-bottom:20px;padding-top:30px}@media (min-width:500px){#footer .footer-top__wrapper .footer-top__inner,#header .footer-top__wrapper .footer-top__inner{align-items:center;justify-content:space-between}}@media (min-width:768px){#footer .footer-top__wrapper .footer-top__inner,#header .footer-top__wrapper .footer-top__inner{flex-direction:row}}#footer .footer-top__logo-social,#header .footer-top__logo-social{display:flex;flex:none;flex-direction:column;margin-bottom:15px;width:auto}@media (min-width:500px){#footer .footer-top__logo-social,#header .footer-top__logo-social{align-items:center;flex-direction:row;justify-content:space-between;margin-bottom:0}}@media (min-width:768px){#footer .footer-top__logo-social,#header .footer-top__logo-social{flex-direction:column;margin-right:30px}}@media (min-width:992px){#footer .footer-top__logo-social,#header .footer-top__logo-social{flex-direction:row}}@media (min-width:1200px){#footer .footer-top__logo-social,#header .footer-top__logo-social{margin-right:60px}}#footer .footer-top__logo,#header .footer-top__logo{margin-bottom:10px}@media (min-width:500px){#footer .footer-top__logo,#header .footer-top__logo{margin-right:30px}}@media (min-width:992px){#footer .footer-top__logo,#header .footer-top__logo{margin-bottom:0}}@media (min-width:1200px){#footer .footer-top__logo,#header .footer-top__logo{margin-right:60px}}@media (min-width:1440px){#footer .footer-top__logo,#header .footer-top__logo{margin-right:80px}}#footer .footer-top__social,#header .footer-top__social{align-items:center;display:flex}#footer .footer-top__social h4,#header .footer-top__social h4{color:#e4e6e7;font-size:14px;font-weight:400;line-height:25px;margin:0}#footer .footer-top__social ul,#header .footer-top__social ul{align-items:baseline;display:flex;margin:0;padding:0}#footer .footer-top__social ul li,#header .footer-top__social ul li{display:block}#footer .footer-top__social ul li svg,#header .footer-top__social ul li svg{fill:#c2deea;transition:all .25s;width:16px}#footer .footer-top__social ul li a,#header .footer-top__social ul li a{display:block;padding:0 10px}#footer .footer-top__social ul li a:hover svg,#header .footer-top__social ul li a:hover svg{fill:#0073cf;transition:all .3s}#footer .footer-top__social ul li.facebook svg,#header .footer-top__social ul li.facebook svg{height:20px}#footer .footer-top__newsletter,#header .footer-top__newsletter{display:flex;flex-direction:column;margin-bottom:15px}@media (min-width:500px){#footer .footer-top__newsletter,#header .footer-top__newsletter{align-items:center;flex-direction:row}}#footer .footer-top__newsletter .footer-top__newsletter-text h4,#header .footer-top__newsletter .footer-top__newsletter-text h4{color:#e4e6e7;font-family:Inter,sans-serif;font-weight:400;line-height:25px;margin:0}@media (min-width:600px){#footer .footer-top__newsletter .footer-top__newsletter-text h4,#header .footer-top__newsletter .footer-top__newsletter-text h4{font-size:20px}}#footer .footer-top__newsletter .footer-top__newsletter-text p,#header .footer-top__newsletter .footer-top__newsletter-text p{color:#e4e6e7;font-size:14px;line-height:25px;margin:10px 0 0}#footer .footer-top__newsletter .footer-top__newsletter-btn,#header .footer-top__newsletter .footer-top__newsletter-btn{flex:none;margin-top:20px}@media (min-width:500px){#footer .footer-top__newsletter .footer-top__newsletter-btn,#header .footer-top__newsletter .footer-top__newsletter-btn{margin-left:30px;margin-top:0}}@media (min-width:1440px){#footer .footer-top__newsletter .footer-top__newsletter-btn,#header .footer-top__newsletter .footer-top__newsletter-btn{margin-left:60px}}#footer .footer-top__newsletter .footer-top__newsletter-btn a,#header .footer-top__newsletter .footer-top__newsletter-btn a{border:1px solid #f5f6f7;border-radius:2px;color:#f5f6f7;display:inline-block;font-family:Inter,sans-serif;font-size:12px;font-weight:600;letter-spacing:2.4px;line-height:18px;padding:12px 22px 12px 18px;text-decoration:none;text-transform:uppercase;transition:all .25s}#footer .footer-top__newsletter .footer-top__newsletter-btn a svg,#header .footer-top__newsletter .footer-top__newsletter-btn a svg{transform:translateX(-4px);transition:all .25s}#footer .footer-top__newsletter .footer-top__newsletter-btn a svg .line,#header .footer-top__newsletter .footer-top__newsletter-btn a svg .line{stroke-dasharray:11;stroke-dashoffset:11;animation:arrowOut .1s linear forwards}#footer .footer-top__newsletter .footer-top__newsletter-btn a:active,#footer .footer-top__newsletter .footer-top__newsletter-btn a:focus,#footer .footer-top__newsletter .footer-top__newsletter-btn a:hover,#header .footer-top__newsletter .footer-top__newsletter-btn a:active,#header .footer-top__newsletter .footer-top__newsletter-btn a:focus,#header .footer-top__newsletter .footer-top__newsletter-btn a:hover{background-color:#fff;border:1px solid #fff;color:#352723;transition:all .25s}#footer .footer-top__newsletter .footer-top__newsletter-btn a:active svg,#footer .footer-top__newsletter .footer-top__newsletter-btn a:focus svg,#footer .footer-top__newsletter .footer-top__newsletter-btn a:hover svg,#header .footer-top__newsletter .footer-top__newsletter-btn a:active svg,#header .footer-top__newsletter .footer-top__newsletter-btn a:focus svg,#header .footer-top__newsletter .footer-top__newsletter-btn a:hover svg{transform:translateX(6px);transition:all .25s}#footer .footer-top__newsletter .footer-top__newsletter-btn a:active svg .line,#footer .footer-top__newsletter .footer-top__newsletter-btn a:focus svg .line,#footer .footer-top__newsletter .footer-top__newsletter-btn a:hover svg .line,#header .footer-top__newsletter .footer-top__newsletter-btn a:active svg .line,#header .footer-top__newsletter .footer-top__newsletter-btn a:focus svg .line,#header .footer-top__newsletter .footer-top__newsletter-btn a:hover svg .line{animation:arrowIn .15s linear forwards}#footer .footer-top__newsletter .footer-top__newsletter-btn a:active svg path,#footer .footer-top__newsletter .footer-top__newsletter-btn a:focus svg path,#footer .footer-top__newsletter .footer-top__newsletter-btn a:hover svg path,#header .footer-top__newsletter .footer-top__newsletter-btn a:active svg path,#header .footer-top__newsletter .footer-top__newsletter-btn a:focus svg path,#header .footer-top__newsletter .footer-top__newsletter-btn a:hover svg path{stroke:#352723}@keyframes arrowIn{0%{stroke-dashoffset:11}to{stroke-dashoffset:0}}@keyframes arrowOut{0%{stroke-dashoffset:0}to{stroke-dashoffset:11}}#footer .footer-bottom__wrapper,#header .footer-bottom__wrapper{background:#4b372e url(https://www.neonscience.org/themes/custom/neon/images/footer_bottom_rip.png) repeat-x top;color:#fff;padding-top:30px}#footer .footer-bottom__wrapper .footer-bottom__inner,#header .footer-bottom__wrapper .footer-bottom__inner{justify-content:space-between;padding-bottom:55px;padding-top:30px}@media (min-width:992px){#footer .footer-bottom__wrapper .footer-bottom__inner,#header .footer-bottom__wrapper .footer-bottom__inner{display:flex;flex-wrap:wrap}}#footer #block-footer .menu--footer,#header #block-footer .menu--footer{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start;margin:0 0 35px;padding:0}#footer #block-footer .menu--footer li,#header #block-footer .menu--footer li{display:block;margin-right:30px}#footer #block-footer .menu--footer li:last-child,#header #block-footer .menu--footer li:last-child{margin-right:0}#footer #block-footer .menu--footer li a,#header #block-footer .menu--footer li a{border-bottom:1px solid #c2deea;color:#c2deea;font-size:14px;font-weight:600;line-height:25px;text-decoration:none;transition:all .25s ease}#footer #block-footer .menu--footer li a:hover,#header #block-footer .menu--footer li a:hover{border-bottom:none;color:#fff;transition:all .3s ease}#footer #block-footer .menu--footer li.myAccount,#header #block-footer .menu--footer li.myAccount{flex:none;margin:0 0 25px;width:100%}#footer #block-footer .menu--footer li.myAccount a,#header #block-footer .menu--footer li.myAccount a{background:#e4e6e7;border:1px solid #e4e6e7;border-radius:2px;color:#565a5c;font-size:12px;font-weight:600;letter-spacing:1.2px;padding:6px 12px;text-decoration:none;text-transform:uppercase;transition:all .25s ease}#footer #block-footer .menu--footer li.myAccount a:hover,#header #block-footer .menu--footer li.myAccount a:hover{background:#fff;border:1px solid #fff;color:#0073cf;transition:all .3s ease}@media (min-width:768px){#footer #block-footer .menu--footer li.myAccount,#header #block-footer .menu--footer li.myAccount{margin:0 30px 0 0;width:auto}}@media (min-width:992px){#footer #block-footer .menu--footer,#header #block-footer .menu--footer{margin:0}}#footer .footer-bottom__copyright p,#header .footer-bottom__copyright p{color:#fff;font-size:14px;line-height:25px;margin:0}#footer .footer-bottom__message,#header .footer-bottom__message{flex:none;margin:30px 0 0;width:100%}#footer .footer-bottom__message p,#header .footer-bottom__message p{color:#fff;font-size:14px;line-height:25px;margin:0 0 10px}#footer .footer-bottom__message p:last-child,#header .footer-bottom__message p:last-child{margin:0} +/*# sourceMappingURL=drupal-theme.936428363449d98e7b7de4eb4218d349.min.css.map */ \ No newline at end of file diff --git a/public/index.html b/public/index.html index e6ba2123..de4a20b9 100644 --- a/public/index.html +++ b/public/index.html @@ -1,44 +1,68 @@ + + NEON | Portal Core Components + + + + + + + + + + + + + + + + + - - NEON | Portal Core Components - - - - - - - - - - - - - - - - - - - - -
- - + + + + + +
+ diff --git a/scripts/lib/lib-cache-remote-assets.js b/scripts/lib/lib-cache-remote-assets.js index 8aafe7b0..b849ceda 100644 --- a/scripts/lib/lib-cache-remote-assets.js +++ b/scripts/lib/lib-cache-remote-assets.js @@ -12,11 +12,89 @@ process.on('unhandledRejection', err => { import fs from 'fs'; import fetch from 'node-fetch'; import path, { dirname } from 'path'; +import crypto from 'crypto'; +import postcss from 'postcss'; +import cssnano from 'cssnano'; +import jsdom from 'jsdom'; +import prettier from 'prettier'; +import { Command } from 'commander'; import { fileURLToPath } from 'url'; +import packageJson from '../../package.json' assert { type: 'json' }; + const __dirname = dirname(fileURLToPath(import.meta.url)); -const CACHED_REMOTE_ASSETS_PATH = path.join(__dirname, '../../src/lib_components/remoteAssets'); +const program = new Command(); +program.usage('Usage: node lib-cache-remote-assets.js [options]') + .version(packageJson.version) + .option( + '--prettify-index', + 'option to prettify css file', + ) + .option( + '--css-replace-relative-urls', + 'option to replace relative urls when appropriate', + ) + .option( + '--css-prevent-minify', + 'option to prevent minifying css file', + ) + .option( + '--css-generate-source-map', + 'option to generate a source map file for CSS file', + ) + .option( + '--generate-public-assets-only', + 'option to generate public folder assets only', + ) + .option( + '--use-current-working-dir', + 'option to utilize the current working directory to derive paths', + ) + .option( + '--cwd-relative-remote-assets-path ', + 'when --use-current-working-dir is specified, and not --generate-public-assets-only, ' + + 'a current working directory relative path must be specified for non-public remote assets', + ) + .option( + '--cwd-relative-public-dir-path ', + 'when --use-current-working-dir is specified, a current working directory relative ' + + 'path must be specified for public assets', + ); +program.parse(process.argv); +const config = program.opts(); + +let CACHED_REMOTE_ASSETS_PATH = path.join(__dirname, '../../src/lib_components/remoteAssets'); +let PUBLIC_OUTPUT_PATH = path.join(__dirname, '../../public'); +let PUBLIC_ASSETS_CSS_OUTPUT_PATH = path.join(PUBLIC_OUTPUT_PATH, 'assets/css'); + +if (config.useCurrentWorkingDir) { + if (!config.generatePublicAssetsOnly) { + if ((config.cwdRelativeRemoteAssetsPath === null) + || (config.cwdRelativeRemoteAssetsPath === undefined) + || (config.cwdRelativeRemoteAssetsPath.length <= 0)) { + console.error('Invalid command arguments. --cwd-relative-remote-assets-path must be specified'); + process.exit(9); + } + CACHED_REMOTE_ASSETS_PATH = path.join(process.cwd(), config.cwdRelativeRemoteAssetsPath); + } + if ((config.cwdRelativePublicDirPath === null) + || (config.cwdRelativePublicDirPath === undefined) + || (config.cwdRelativePublicDirPath.length <= 0)) { + console.error('Invalid command arguments. --cwd-relative-public-dir-path must be specified'); + process.exit(9); + } + PUBLIC_OUTPUT_PATH = path.join(process.cwd(), config.cwdRelativePublicDirPath); + PUBLIC_ASSETS_CSS_OUTPUT_PATH = path.join(PUBLIC_OUTPUT_PATH, 'assets/css'); +} + +if (config.useCurrentWorkingDir) { + console.log(`Current working directory:\n\t${process.cwd()}`); +} +if (!config.generatePublicAssetsOnly) { + console.log(`Remote assets path:\n\t${CACHED_REMOTE_ASSETS_PATH}`); +} +console.log(`Public directory path:\n\t${PUBLIC_OUTPUT_PATH}\n`); const REMOTE_ASSET_PATHS = { DRUPAL_THEME_CSS: '/themes/custom/neon/dist/css/components/theme/theme.css', @@ -32,23 +110,32 @@ const REMOTE_ASSET_NAMES = { DRUPAL_FOOTER_HTML: 'drupal-footer.html', }; +const MAKE_HASHED_FILENAMES = [REMOTE_ASSET_NAMES.DRUPAL_THEME_CSS]; +const MAKE_MINIMIZED_FILENAMES = [REMOTE_ASSET_NAMES.DRUPAL_THEME_CSS]; + +const WEB_HOST_URL = 'https://www.neonscience.org'; + // When fetching cached remote assets, reference production const REMOTE_ASSETS_CACHE = { DRUPAL_THEME_CSS: { name: REMOTE_ASSET_NAMES.DRUPAL_THEME_CSS, - url: `https://www.neonscience.org${REMOTE_ASSET_PATHS.DRUPAL_THEME_CSS}`, + url: `${WEB_HOST_URL}${REMOTE_ASSET_PATHS.DRUPAL_THEME_CSS}`, + public: true, }, DRUPAL_HEADER_JS: { name: REMOTE_ASSET_NAMES.DRUPAL_HEADER_JS, - url: `https://www.neonscience.org${REMOTE_ASSET_PATHS.DRUPAL_HEADER_JS}`, + url: `${WEB_HOST_URL}${REMOTE_ASSET_PATHS.DRUPAL_HEADER_JS}`, + public: false, }, DRUPAL_HEADER_HTML: { name: REMOTE_ASSET_NAMES.DRUPAL_HEADER_HTML, - url: `https://www.neonscience.org${REMOTE_ASSET_PATHS.DRUPAL_HEADER_HTML}`, + url: `${WEB_HOST_URL}${REMOTE_ASSET_PATHS.DRUPAL_HEADER_HTML}`, + public: false, }, DRUPAL_FOOTER_HTML: { name: REMOTE_ASSET_NAMES.DRUPAL_FOOTER_HTML, - url: `https://www.neonscience.org${REMOTE_ASSET_PATHS.DRUPAL_FOOTER_HTML}`, + url: `${WEB_HOST_URL}${REMOTE_ASSET_PATHS.DRUPAL_FOOTER_HTML}`, + public: false, }, }; @@ -63,10 +150,29 @@ const sanitizeContent = (key, content) => { // DRUPAL_THEME_CSS - comment out all styles with relative path URLs (these will always fail) case REMOTE_ASSETS_CACHE.DRUPAL_THEME_CSS.KEY: content.match(/^(.*url\([\"\']((?!data)).*)$/mg).forEach((match) => { - const replacement = match.endsWith('}') - ? `/* ${match.slice(0, -1)} */ }` - : `/* ${match} */`; - content = content.replace(match, replacement); + let shouldCommentMatch = true; + if (config.cssReplaceRelativeUrls) { + const relativeUrlRegex = /(?url\(["']\.\.\/\.\.\/\.\.\/\.\.\/(?images\/.+)["']\))/; + const matchesRelative = relativeUrlRegex.exec(match); + if (matchesRelative + && (matchesRelative.length > 0) + && matchesRelative.groups + && matchesRelative.groups?.relative + && matchesRelative.groups?.path + ) { + const replaceRelative = matchesRelative.groups?.relative; + const replaceRelativePath = matchesRelative.groups?.path; + const replaceWith = `url("${WEB_HOST_URL}/themes/custom/neon/${replaceRelativePath}")`; + content = content.replace(replaceRelative, replaceWith); + shouldCommentMatch = false; + } + } + if (shouldCommentMatch) { + const replacement = match.endsWith('}') + ? `/* ${match.slice(0, -1)} */ }` + : `/* ${match} */`; + content = content.replace(match, replacement); + } }); return content; // HTML files - convert to JS module that exports a string of the HTML content @@ -80,32 +186,150 @@ const sanitizeContent = (key, content) => { } }; +/** + * Minimizes the specified content from fileName to minFileName; + * @param {*} content + * @param {*} fileName + * @param {*} minFileName + * @returns + */ +const minimizeContent = async (content, fileName, minFileName) => { + const resultPromise = await postcss([cssnano()]) + .process(content, { from: fileName, to: minFileName, map: { inline: false } }); + return resultPromise; +}; + +/** + * Inject the file contents hash into the filename as the last segment + * before the file extension. + * This assumes the filename has an extension. + * @param {*} name + * @param {*} content + * @param {*} algo + */ +const makeHashedFilename = (name, content, algo = 'md5') => { + const hash = crypto.createHash(algo); + hash.update(content); + const hexDigest = hash.digest('hex'); + const nameParts = name.split('.'); + const ext = nameParts.pop(); + return `${nameParts.join('.')}.${hexDigest}.${ext}`; +}; + +/** + * Inject the 'min' infix into the filename as the last segment + * before the file extension. + * This assumes the filename has an extension. + * @param {*} name + */ +const makeMinimizedFilename = (name) => { + const nameParts = name.split('.'); + const ext = nameParts.pop(); + return `${nameParts.join('.')}.min.${ext}`; +}; + +const writeContent = async (key, content, fileName) => { + const destination = path.join(CACHED_REMOTE_ASSETS_PATH, fileName); + switch (key) { + case REMOTE_ASSETS_CACHE.DRUPAL_THEME_CSS.KEY: + const cachedFiles = fs.readdirSync(CACHED_REMOTE_ASSETS_PATH); + const assetFiles = fs.readdirSync(PUBLIC_ASSETS_CSS_OUTPUT_PATH); + cachedFiles.forEach((cachedFileName) => { + if (cachedFileName.startsWith('drupal-theme')) { + const rmFile = path.join(CACHED_REMOTE_ASSETS_PATH, cachedFileName); + fs.rmSync(rmFile); + } + }); + assetFiles.forEach((assetFileName) => { + if (assetFileName.startsWith('drupal-theme')) { + const rmFile = path.join(PUBLIC_ASSETS_CSS_OUTPUT_PATH, assetFileName); + fs.rmSync(rmFile); + } + }); + fs.writeFileSync(destination, content, { encoding: 'utf8' }); + const cssAssetDes = path.join(PUBLIC_ASSETS_CSS_OUTPUT_PATH, fileName); + const cssAssetDesMap = path.join(PUBLIC_ASSETS_CSS_OUTPUT_PATH, `${fileName}.map`); + let minContentResultCss = content; + let minContentResultMap = null; + if (!config.cssPreventMinify) { + const minContentResult = await minimizeContent(content, destination, cssAssetDes); + minContentResultCss = minContentResult.css; + minContentResultMap = minContentResult.map; + } + fs.writeFileSync(cssAssetDes, minContentResultCss, { encoding: 'utf8' }); + if (config.cssGenerateSourceMap && minContentResultMap) { + fs.writeFileSync(cssAssetDesMap, minContentResultMap.toString(), { encoding: 'utf8' }); + } + fs.rmSync(destination); + const indexFilePath = path.join(PUBLIC_OUTPUT_PATH, 'index.html'); + if (fs.existsSync(indexFilePath)) { + const indexFileData = fs.readFileSync(indexFilePath); + const dom = new jsdom.JSDOM(indexFileData); + const drupalThemeNode = dom.window.document.head + .querySelector('link[data-meta="drupal-theme"]'); + if (drupalThemeNode) { + drupalThemeNode.setAttribute('href', `%PUBLIC_URL%/assets/css/${fileName}`) + } + let indexFileOutput = dom.serialize(); + if (config.prettifyIndex) { + indexFileOutput = prettier.format(indexFileOutput, { parser: 'html', printWidth: 100 }); + } + fs.writeFileSync(indexFilePath, indexFileOutput, { encoding: 'utf8' }); + } + break; + case REMOTE_ASSETS_CACHE.DRUPAL_HEADER_HTML.KEY: + case REMOTE_ASSETS_CACHE.DRUPAL_FOOTER_HTML.KEY: + default: + fs.writeFileSync(destination, content, { encoding: 'utf8' }); + break; + } +}; + +const processContent = async (key, name, res, resolve) => { + const sanitizedContent = sanitizeContent(key, res); + let cachedFileName = name; + if (cachedFileName.endsWith('.html')) { + cachedFileName = `${cachedFileName}.js`; + } else if (MAKE_HASHED_FILENAMES.includes(name)) { + cachedFileName = makeHashedFilename(cachedFileName, sanitizedContent); + } + if (MAKE_MINIMIZED_FILENAMES.includes(name)) { + switch (key) { + case REMOTE_ASSETS_CACHE.DRUPAL_THEME_CSS.KEY: + if (!config.cssPreventMinify) { + cachedFileName = makeMinimizedFilename(cachedFileName); + } + break; + default: + break; + } + } + writeContent(key, sanitizedContent, cachedFileName); + console.log(`* Completed: ${name} (saved as ${cachedFileName})`); + resolve(true); +}; + Object.keys(REMOTE_ASSETS_CACHE) .filter((key) => key !== 'default') + .filter((key) => { + if (!config.generatePublicAssetsOnly) { + return true; + } + return REMOTE_ASSETS_CACHE[key].public; + }) .forEach((key) => { const { name, url } = REMOTE_ASSETS_CACHE[key]; console.log(`* Fetching: ${name}`); const promise = fetch(url) .then((res) => { - if (res.status >= 400) { throw new Error(`${res.status} ${res.statusText}`); } + if (res.status >= 400) { + throw new Error(`${res.status} ${res.statusText}`); + } return res.text(); }) .then((res) => { return new Promise((resolve, reject) => { - let cachedFileName = name; - let savedAs = ''; - if (cachedFileName.endsWith('.html')) { - cachedFileName = `${cachedFileName}.js`; - savedAs = ` (saved as ${cachedFileName})`; - } - const destination = path.join(CACHED_REMOTE_ASSETS_PATH, cachedFileName); - fs.writeFileSync( - destination, - sanitizeContent(key, res), - { encoding:'utf8' }, - ); - console.log(`* Completed: ${name}${savedAs}`); - resolve(true); + processContent(key, name, res, resolve); }); }) .catch((error) => { diff --git a/scripts/package.json b/scripts/package.json new file mode 100644 index 00000000..3dbc1ca5 --- /dev/null +++ b/scripts/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/scripts/sync-assets.js b/scripts/sync-assets.js new file mode 100644 index 00000000..677c4bfa --- /dev/null +++ b/scripts/sync-assets.js @@ -0,0 +1,112 @@ +'use strict'; + +process.env.NODE_ENV = 'DEVELOPMENT'; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +import fs from 'fs'; +import path, { dirname } from 'path'; +import jsdom from 'jsdom'; +import prettier from 'prettier'; +import { Command } from 'commander'; +import { fileURLToPath } from 'url'; + +import packageJson from '../package.json' assert { type: 'json' }; + +const program = new Command(); +program.usage('Usage: node sync-assets.js [options]') + .version(packageJson.version) + .option( + '--cwd-relative-public-dir-path ', + 'public folder path relative to current working directory', + ) + .option( + '--prettify-index', + 'option to prettify css file', + ); +program.parse(process.argv); +const config = program.opts(); + +if ((config.cwdRelativePublicDirPath === null) + || (config.cwdRelativePublicDirPath === undefined) + || (config.cwdRelativePublicDirPath.length <= 0) +) { + console.error('Invalid command arguments. --cwd-relative-public-dir-path must be specified'); + process.exit(9); +} + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const CORE_COMPONENTS_PUBLIC_CSS_ASSETS_PATH = path.join(__dirname, '../public/assets/css'); + +const PUBLIC_OUTPUT_PATH = path.join(process.cwd(), config.cwdRelativePublicDirPath); +const PUBLIC_ASSETS_CSS_OUTPUT_PATH = path.join(PUBLIC_OUTPUT_PATH, 'assets/css'); + +console.log(`Current working directory:\n\t${process.cwd()}`); +console.log(`Assets to sync from directory:\n\t${CORE_COMPONENTS_PUBLIC_CSS_ASSETS_PATH}`); +console.log(`Public directory path:\n\t${PUBLIC_OUTPUT_PATH}\n`); + +console.log('Synching assets...\n'); + +const SYNC_CSS_ASSET_PREFIX = { + DRUPAL_THEME: 'drupal-theme', + DRUPAL_FONTS: 'drupal-fonts', +}; +const SYNC_CSS_ASSET_INDEX = { + DRUPAL_THEME: { + prefix: 'drupal-theme', + dataMeta: 'drupal-theme', + }, +}; + +const syncCssAssets = () => { + const currentAssetFiles = fs.readdirSync(PUBLIC_ASSETS_CSS_OUTPUT_PATH); + currentAssetFiles.forEach((assetFileName) => { + Object.keys(SYNC_CSS_ASSET_PREFIX).forEach((assetKey) => { + const prefix = SYNC_CSS_ASSET_PREFIX[assetKey]; + if (assetFileName.startsWith(prefix)) { + const rmFile = path.join(PUBLIC_ASSETS_CSS_OUTPUT_PATH, assetFileName); + fs.rmSync(rmFile); + } + }); + }); + const assetFiles = fs.readdirSync(CORE_COMPONENTS_PUBLIC_CSS_ASSETS_PATH); + assetFiles.forEach((assetFileName) => { + Object.keys(SYNC_CSS_ASSET_PREFIX).forEach((assetKey) => { + const prefix = SYNC_CSS_ASSET_PREFIX[assetKey]; + if (assetFileName.startsWith(prefix)) { + const createFile = path.join(PUBLIC_ASSETS_CSS_OUTPUT_PATH, assetFileName); + const syncFile = path.join(CORE_COMPONENTS_PUBLIC_CSS_ASSETS_PATH, assetFileName); + const syncFileData = fs.readFileSync(syncFile); + fs.writeFileSync(createFile, syncFileData, { encoding: 'utf8' }); + } + }); + Object.keys(SYNC_CSS_ASSET_INDEX).forEach((assetKey) => { + const assetIndex = SYNC_CSS_ASSET_INDEX[assetKey]; + if (assetFileName.startsWith(assetIndex.prefix)) { + const indexFilePath = path.join(PUBLIC_OUTPUT_PATH, 'index.html'); + if (fs.existsSync(indexFilePath)) { + const indexFileData = fs.readFileSync(indexFilePath); + const dom = new jsdom.JSDOM(indexFileData); + const assetNode = dom.window.document.head + .querySelector(`link[data-meta="${assetIndex.dataMeta}"]`); + if (assetNode) { + assetNode.setAttribute('href', `%PUBLIC_URL%/assets/css/${assetFileName}`) + } + let indexFileOutput = dom.serialize(); + if (config.prettifyIndex) { + indexFileOutput = prettier.format(indexFileOutput, { parser: 'html', printWidth: 100 }); + } + fs.writeFileSync(indexFilePath, indexFileOutput, { encoding: 'utf8' }); + } + } + }); + }); +}; + +syncCssAssets(); diff --git a/src/lib_components/components/Bundles/BundleContentBuilder.tsx b/src/lib_components/components/Bundles/BundleContentBuilder.tsx new file mode 100644 index 00000000..2d7b5ebb --- /dev/null +++ b/src/lib_components/components/Bundles/BundleContentBuilder.tsx @@ -0,0 +1,124 @@ +import React from 'react'; + +import Link from '@material-ui/core/Link'; + +import RouteService from '../../service/RouteService'; +import Theme from '../Theme/Theme'; +import { IDataProductLike } from '../../types/internal'; +import { isStringNonEmpty } from '../../util/typeUtil'; +import { LATEST_AND_PROVISIONAL } from '../../service/ReleaseService'; + +export interface IBundleContentBuilder { + getParentProductLink: (dataProduct: IDataProductLike, release?: string) => JSX.Element; + + getBundledLink: () => JSX.Element; + + buildManyParentsMainContent: (dataProducts: IDataProductLike[], release?: string) => JSX.Element; + + buildDefaultTitleContent: (dataProduct: IDataProductLike, release?: string) => JSX.Element; + + buildDefaultSplitTitleContent: (isRelease: boolean, terminalChar?: string) => JSX.Element; + + buildDefaultSubTitleContent: ( + forwardAvailability: boolean, + hasManyParents: boolean, + ) => JSX.Element; +} + +const BundleContentBuilder: IBundleContentBuilder = { + getParentProductLink: (dataProduct: IDataProductLike, release?: string): JSX.Element => { + const isRelease = isStringNonEmpty(release) && (release !== LATEST_AND_PROVISIONAL); + const href = RouteService.getProductDetailPath( + dataProduct.productCode, + isRelease ? release : undefined, + ); + return ( + + {`${dataProduct.productName} (${dataProduct.productCode})`} + + ); + }, + + getBundledLink: (): JSX.Element => { + const href = RouteService.getDataProductBundlesPath(); + return ( + + bundled + + ); + }, + + buildManyParentsMainContent: ( + dataProducts: IDataProductLike[], + release?: string, + ): JSX.Element => (( +
    + {dataProducts.map((dataProduct: IDataProductLike) => ( +
  • + {BundleContentBuilder.getParentProductLink(dataProduct, release)} +
  • + ))} +
+ )), + + buildDefaultTitleContent: (dataProduct: IDataProductLike, release?: string): JSX.Element => { + const isRelease = isStringNonEmpty(release) && (release !== LATEST_AND_PROVISIONAL); + const bundleParentLink: JSX.Element = BundleContentBuilder.getParentProductLink( + dataProduct, + isRelease ? release : undefined, + ); + const bundledLink: JSX.Element = BundleContentBuilder.getBundledLink(); + return ( + <> + {/* eslint-disable react/jsx-one-expression-per-line */} + This data product {isRelease ? 'release ' : ''}is {bundledLink} into {bundleParentLink} + {/* eslint-enable react/jsx-one-expression-per-line */} + + ); + }, + + buildDefaultSplitTitleContent: (isRelease: boolean, terminalChar?: string): JSX.Element => { + const bundledLink: JSX.Element = BundleContentBuilder.getBundledLink(); + return ( + <> + {/* eslint-disable react/jsx-one-expression-per-line */} + This data product {isRelease ? 'release ' : ''}is {bundledLink} into the + following data product{isRelease ? ' releases' : 's'}{`${terminalChar}`} + {/* eslint-enable react/jsx-one-expression-per-line */} + + ); + }, + + buildDefaultSubTitleContent: ( + forwardAvailability: boolean, + hasManyParents: boolean, + ): JSX.Element => (( + // eslint-disable-next-line react/jsx-no-useless-fragment + <> + {forwardAvailability ? ( + <> + It is not available as a standalone download. Data availability shown + below reflects availability of the entire bundle. + + ) : ( + <> + {/* eslint-disable react/jsx-one-expression-per-line */} + It is not available as a standalone download. + Data availability information and data product download is only available through + the bundle data {hasManyParents ? 'products' : 'product'}. + {/* eslint-enable react/jsx-one-expression-per-line */} + + )} + + )), +}; + +Object.freeze(BundleContentBuilder); + +export default BundleContentBuilder; diff --git a/src/lib_components/components/Bundles/BundleListItemIcon.tsx b/src/lib_components/components/Bundles/BundleListItemIcon.tsx new file mode 100644 index 00000000..d23bc9bc --- /dev/null +++ b/src/lib_components/components/Bundles/BundleListItemIcon.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import { makeStyles } from '@material-ui/core/styles'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBox, faBoxesStacked } from '@fortawesome/free-solid-svg-icons'; + +import Theme from '../Theme/Theme'; +import { NeonTheme } from '../Theme/types'; + +const useStyles = makeStyles((theme: NeonTheme) => ({ + bundleIcon: { + padding: '5px', + marginRight: theme.spacing(2), + }, +})); + +export interface BundleListItemIconProps { + isSplit?: boolean; +} + +const BundleListItemIcon: React.FC = ( + props: BundleListItemIconProps, +): JSX.Element => { + const classes = useStyles(Theme); + const { isSplit }: BundleListItemIconProps = props; + return ( + + + + ); +}; + +BundleListItemIcon.defaultProps = { + isSplit: false, +}; + +export default BundleListItemIcon; diff --git a/src/lib_components/components/Bundles/DataProductBundleCard.tsx b/src/lib_components/components/Bundles/DataProductBundleCard.tsx new file mode 100644 index 00000000..b8a95113 --- /dev/null +++ b/src/lib_components/components/Bundles/DataProductBundleCard.tsx @@ -0,0 +1,162 @@ +import React from 'react'; + +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; + +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBox, faBoxesStacked } from '@fortawesome/free-solid-svg-icons'; + +import Theme from '../Theme/Theme'; +import { NeonTheme } from '../Theme/types'; +import { exists } from '../../util/typeUtil'; + +const useStyles = makeStyles((theme: NeonTheme) => ({ + card: { + backgroundColor: (Theme as NeonTheme).colors.GOLD[50], + borderColor: (Theme as NeonTheme).colors.GOLD[200], + marginTop: theme.spacing(1), + }, + cardContent: { + padding: theme.spacing(2), + paddingBottom: `${theme.spacing(2)}px !important`, + }, + cardContentFlexContainer: { + display: 'flex', + alignItems: 'center', + padding: theme.spacing(2), + paddingBottom: `${theme.spacing(2)}px !important`, + }, + cardContentContainer: { + flexGrow: 1, + }, + cardIcon: { + color: theme.colors.GOLD[700], + padding: '5px', + fontSize: '2.3875em', + marginRight: theme.spacing(2), + }, + cardIconBoxesStacked: { + color: theme.colors.GOLD[700], + fontSize: '2.3875em', + marginRight: theme.spacing(2), + }, +})); + +export interface DataProductBundleCardClasses { + card?: string; + cardContent?: string; + cardContentFlexContainer?: string; + cardContentContainer?: string; + cardIcon?: string; +} + +export interface DataProductBundleCardProps { + titleContent?: React.ReactNode; + detailContent?: React.ReactNode; + subTitleContent?: React.ReactNode; + customContent?: React.ReactNode; + isSplit?: boolean; + showIcon?: boolean; + classes?: DataProductBundleCardClasses; +} + +const DataProductBundleCard: React.FC = ( + props: DataProductBundleCardProps, +): JSX.Element => { + const classes = useStyles(Theme); + const { + titleContent, + subTitleContent, + detailContent, + customContent, + isSplit, + showIcon, + classes: customClasses, + }: DataProductBundleCardProps = props; + const customCardClass: string|undefined = customClasses + ? customClasses.card + : undefined; + const customCardContentClass: string|undefined = customClasses + ? customClasses.cardContent + : undefined; + const customCardContentFlexContainerClass: string|undefined = customClasses + ? customClasses.cardContentFlexContainer + : undefined; + const customCardContentContainerClass: string|undefined = customClasses + ? customClasses.cardContentContainer + : undefined; + const customIconClass: string|undefined = customClasses + ? customClasses.cardIcon + : undefined; + + const renderContent = (): JSX.Element => { + if (exists(customContent)) { + // eslint-disable-next-line react/jsx-no-useless-fragment + return (<>{customContent}); + } + return ( + <> + {!exists(titleContent) ? null : ( + + {titleContent} + + )} + {!exists(detailContent) ? null : ( + // eslint-disable-next-line react/jsx-no-useless-fragment + <>{detailContent} + )} + {!exists(subTitleContent) ? null : ( + + {subTitleContent} + + )} + + ); + }; + + const renderCardContent = (): JSX.Element => { + if (!showIcon) { + return renderContent(); + } + return ( + <> + +
+ {renderContent()} +
+ + ); + }; + + return ( + + + {renderCardContent()} + + + ); +}; + +DataProductBundleCard.defaultProps = { + titleContent: undefined, + detailContent: undefined, + subTitleContent: undefined, + customContent: undefined, + isSplit: false, + showIcon: true, + classes: undefined, +}; + +export default DataProductBundleCard; diff --git a/src/lib_components/components/Bundles/index.d.ts b/src/lib_components/components/Bundles/index.d.ts new file mode 100644 index 00000000..e8a5a6da --- /dev/null +++ b/src/lib_components/components/Bundles/index.d.ts @@ -0,0 +1 @@ +export { default } from './DataProductBundleCard'; diff --git a/src/lib_components/components/Bundles/index.js b/src/lib_components/components/Bundles/index.js new file mode 100644 index 00000000..e8a5a6da --- /dev/null +++ b/src/lib_components/components/Bundles/index.js @@ -0,0 +1 @@ +export { default } from './DataProductBundleCard'; diff --git a/src/lib_components/components/Bundles/package.json b/src/lib_components/components/Bundles/package.json new file mode 100644 index 00000000..aab5feb3 --- /dev/null +++ b/src/lib_components/components/Bundles/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "name": "bundles", + "main": "./DataProductBundleCard.tsx", + "module": "./DataProductBundleCard.tsx" +} diff --git a/src/lib_components/components/Citation/DataProductCitation/Actions.ts b/src/lib_components/components/Citation/DataProductCitation/Actions.ts index fecf3a2f..62bed53f 100644 --- a/src/lib_components/components/Citation/DataProductCitation/Actions.ts +++ b/src/lib_components/components/Citation/DataProductCitation/Actions.ts @@ -99,6 +99,7 @@ export interface FetchProductReleaseDoiFailedAction extends AnyAction { } export interface FetchProductReleaseDoiSucceededAction extends AnyAction { type: typeof ActionTypes.FETCH_PRODUCT_RELEASE_DOI_SUCCEEDED; + productCode: string; release: string; data: DataProductDoiStatus; } @@ -265,10 +266,12 @@ const ActionCreator = { error, }), fetchProductReleaseDoiSucceeded: ( + productCode: string, release: string, data: DataProductDoiStatus, ): FetchProductReleaseDoiSucceededAction => ({ type: ActionTypes.FETCH_PRODUCT_RELEASE_DOI_SUCCEEDED, + productCode, release, data, }), diff --git a/src/lib_components/components/Citation/DataProductCitation/Context.tsx b/src/lib_components/components/Citation/DataProductCitation/Context.tsx index b36000cd..8a23169e 100644 --- a/src/lib_components/components/Citation/DataProductCitation/Context.tsx +++ b/src/lib_components/components/Citation/DataProductCitation/Context.tsx @@ -14,6 +14,10 @@ import NeonApi from '../../NeonApi/NeonApi'; import NeonContext from '../../NeonContext/NeonContext'; import NeonGraphQL from '../../NeonGraphQL/NeonGraphQL'; +import { exists, isStringNonEmpty } from '../../../util/typeUtil'; +import { AnyAction, Nullable, Undef } from '../../../types/core'; +import { DataProductDoiStatus, NeonApiResponse } from '../../../types/neonApi'; + import ActionCreator from './Actions'; import Reducer from './Reducer'; import Service from './Service'; @@ -24,10 +28,6 @@ import { getDefaultState, } from './State'; -import { exists, isStringNonEmpty } from '../../../util/typeUtil'; -import { AnyAction, Nullable, Undef } from '../../../types/core'; -import { DataProductDoiStatus, NeonApiResponse } from '../../../types/neonApi'; - const StateContext = createContext(getDefaultState()); const DispatchContext = createContext>>(undefined); @@ -88,7 +88,7 @@ export interface ProviderProps { productCode?: string; release?: Nullable; contextControlled?: boolean; - children?: React.ReactNode | React.ReactNodeArray; + children?: React.ReactNode | React.ReactNode[]; } const Provider: React.FC = (props: ProviderProps): JSX.Element => { @@ -236,6 +236,7 @@ const Provider: React.FC = (props: ProviderProps): JSX.Element => return; } dispatch(ActionCreator.fetchProductReleaseDoiSucceeded( + queryProductCode, fetchRelease, response.data, )); diff --git a/src/lib_components/components/Citation/DataProductCitation/ItemView.tsx b/src/lib_components/components/Citation/DataProductCitation/ItemView.tsx new file mode 100644 index 00000000..78d82a6a --- /dev/null +++ b/src/lib_components/components/Citation/DataProductCitation/ItemView.tsx @@ -0,0 +1,527 @@ +/* eslint-disable react/jsx-fragments */ +import React, { useCallback } from 'react'; + +import { CopyToClipboard } from 'react-copy-to-clipboard'; + +import { makeStyles } from '@material-ui/core/styles'; +import Alert from '@material-ui/lab/Alert'; +import Button from '@material-ui/core/Button'; +import Card from '@material-ui/core/Card'; +import CardActions from '@material-ui/core/CardActions'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Link from '@material-ui/core/Link'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; + +import CopyIcon from '@material-ui/icons/Assignment'; +import DownloadIcon from '@material-ui/icons/SaveAlt'; + +import BundleContentBuilder from '../../Bundles/BundleContentBuilder'; +import DataProductBundleCard from '../../Bundles/DataProductBundleCard'; +import CitationService from '../../../service/CitationService'; +import DataCiteService, { + CitationDownloadType, CitationFormat, +} from '../../../service/DataCiteService'; +import RouteService from '../../../service/RouteService'; +import Theme from '../../Theme/Theme'; +import { PROVISIONAL_RELEASE } from '../../../service/ReleaseService'; +import { exists, isStringNonEmpty } from '../../../util/typeUtil'; +import { Nullable, Undef, UnknownRecord } from '../../../types/core'; +import { DataProductRelease } from '../../../types/neonApi'; +import { IDataProductLike } from '../../../types/internal'; +import { NeonTheme } from '../../Theme/types'; + +import ActionCreator from './Actions'; +import DataProductCitationContext from './Context'; +import Service from './Service'; +import { + CitationRelease, + ContextDataProduct, + FetchStatus, +} from './State'; +import { + DataProductCitationViewState, + DataProductCitationItemViewProps, + DisplayType, + CitationTextOnlyProps, + DataProductCitationItem, +} from './ViewState'; + +const useStyles = makeStyles((theme: NeonTheme) => ({ + cardActions: { + flexWrap: 'wrap', + marginTop: theme.spacing(-1), + '&> *': { + marginLeft: '0px !important', + marginTop: theme.spacing(1), + }, + '&> :not(:last-child)': { + marginRight: theme.spacing(1), + }, + }, + cardButton: { + padding: '5px 10px', + backgroundColor: '#fff', + whiteSpace: 'nowrap', + }, + cardButtonIcon: { + marginRight: theme.spacing(1), + }, + citationCard: { + marginTop: theme.spacing(2), + }, + citationText: { + fontFamily: 'monospace', + }, + citationTextOnly: { + color: theme.palette.grey[400], + }, + citationTextWithQualifier: { + marginTop: theme.spacing(1.5), + fontFamily: 'monospace', + }, + bundleTextOnlySpacer: { + marginBottom: theme.spacing(2), + }, + tombstoneBlurbCard: { + backgroundColor: (Theme as NeonTheme).colors.BROWN[50], + borderColor: (Theme as NeonTheme).colors.BROWN[300], + marginTop: theme.spacing(1), + }, + tombstoneBlurbCardTextOnly: { + backgroundColor: (Theme as NeonTheme).colors.BROWN[50], + borderColor: (Theme as NeonTheme).colors.BROWN[300], + marginTop: theme.spacing(1), + marginBottom: theme.spacing(2), + }, + tombstoneBlurbCardHeader: { + padding: theme.spacing(2), + paddingBottom: 0, + }, + tombstoneBlurbCardContent: { + padding: theme.spacing(2), + paddingTop: theme.spacing(1), + paddingBottom: '20px !important', + }, + tombstoneBlurb: { + fontSize: '0.8rem', + }, +})); + +const DataProductCitationItemView: React.FC = ( + props: DataProductCitationItemViewProps, +): JSX.Element => { + const { + showTextOnly, + textOnlyProps, + citationItem, + viewState, + hasManyParents, + }: DataProductCitationItemViewProps = props; + const classes = useStyles(Theme); + const dispatch = DataProductCitationContext.useDataProductCitationContextDispatch(); + + let appliedTextOnly: CitationTextOnlyProps = { + variant: 'caption', + cssClass: classes.citationTextOnly, + }; + if (exists(textOnlyProps)) { + appliedTextOnly = textOnlyProps as CitationTextOnlyProps; + } + + const { + displayType, + isTombstoned, + releases, + citationDownloadsFetchStatus, + }: DataProductCitationViewState = viewState; + const { + releaseObject, + doiUrl, + citableBaseProduct, + citableReleaseProduct, + bundleParentCode, + }: DataProductCitationItem = citationItem; + + const handleResetCitationDownloadsCb = useCallback( + (provisionalCb: boolean, productCode: string): void => { + Service.handleResetCitationDownloads( + citationDownloadsFetchStatus, + provisionalCb, + productCode, + dispatch, + ); + }, + [dispatch, citationDownloadsFetchStatus], + ); + const handleCitationDownloadCb = useCallback(( + citationProduct: ContextDataProduct, + releaseCb: string, + formatCb: string, + provisionalCb = true, + ): void => { + const coercedTarget: UnknownRecord = { + ...citationProduct, + }; + const key: string = Service.buildCitationDownloadKey( + citationProduct, + releaseCb, + formatCb, + provisionalCb, + ); + let fullDoi: Nullable = Service.getReleaseDoi(releases, releaseCb); + if (isStringNonEmpty(fullDoi) && isStringNonEmpty(doiUrl) && (fullDoi !== doiUrl)) { + // In the case of multiple citations for a single product, we want to resolve + // to the specified DOI URL for this citation, but adhere to pulling + // from the set of releases in all other cases and to confirm a valid + // release is present. + fullDoi = doiUrl; + } + handleResetCitationDownloadsCb(provisionalCb, citationProduct.productCode); + if (dispatch) { + dispatch(ActionCreator.fetchCitationDownloadStarted(key)); + } + DataCiteService.downloadCitation( + formatCb, + CitationDownloadType.DATA_PRODUCT, + coercedTarget, + fullDoi as string, + releaseCb, + (data: string): void => { + if (dispatch) { + dispatch(ActionCreator.fetchCitationDownloadSucceeded(key)); + } + }, + (error: unknown): void => { + if (dispatch) { + dispatch(ActionCreator.fetchCitationDownloadFailed(key, 'Citation download failed')); + } + }, + ); + }, [dispatch, releases, doiUrl, handleResetCitationDownloadsCb]); + + const renderTombstoneNotice = (): Nullable => { + if (!isTombstoned) { + return null; + } + const citationRelease: CitationRelease = (releaseObject as CitationRelease); + let doiDisplay = ' '; + if (citationRelease.productDoi.url) { + const doiId: string = citationRelease.productDoi.url.split('/').slice(-2).join('/'); + doiDisplay = ` (DOI:${doiId}) `; + } + let latestAvailableReleaseBlurb: JSX.Element|null = null; + if (citableBaseProduct?.releases && (citableBaseProduct?.releases.length > 0)) { + const latestAvailableProductRelease: DataProductRelease = citableBaseProduct?.releases[0]; + if (latestAvailableProductRelease.release.localeCompare(citationRelease.release) !== 0) { + const dataProductDetailLink: JSX.Element = ( + + newer release + + ); + latestAvailableReleaseBlurb = ( + <> + {/* eslint-disable react/jsx-one-expression-per-line, max-len */} + has been replaced by a {dataProductDetailLink} and  + {/* eslint-enable react/jsx-one-expression-per-line, max-len */} + + ); + } + } + const contactUsLink: JSX.Element = ( + + Contact Us + + ); + const tombstoneNote: JSX.Element = ( + <> + {/* eslint-disable react/jsx-one-expression-per-line, max-len */} + {citationRelease.release} of this data product + {doiDisplay} {latestAvailableReleaseBlurb}is no longer available for download. + If this specific release is needed for research purposes, please fill out + the {contactUsLink} form. + {/* eslint-enable react/jsx-one-expression-per-line, max-len */} + + ); + return ( + + Release Notice)} + /> + + + {tombstoneNote} + + + + ); + }; + + const renderBundleParentLink = (): Nullable => { + if (!isStringNonEmpty(bundleParentCode) || hasManyParents) { + return null; + } + const isReleaseDisplay = (displayType === DisplayType.RELEASE); + const bundleParentName: string = isReleaseDisplay + ? (citableReleaseProduct as ContextDataProduct).productName + : (citableBaseProduct as ContextDataProduct).productName; + let titleContent; + const dataProductLike: IDataProductLike = { + productCode: bundleParentCode as string, + productName: bundleParentName, + }; + const appliedRelease: Undef = isReleaseDisplay + ? (releaseObject as CitationRelease).release as string + : undefined; + if (isReleaseDisplay) { + titleContent = BundleContentBuilder.buildDefaultTitleContent( + dataProductLike, + appliedRelease, + ); + } else { + titleContent = BundleContentBuilder.buildDefaultTitleContent(dataProductLike); + } + const subTitleContent = ( + <> + {/* eslint-disable react/jsx-one-expression-per-line */} + The {isReleaseDisplay ? 'citation below refers' : 'citations below refer'} to + that data product as this data product is not directly citable. + {/* eslint-enable react/jsx-one-expression-per-line */} + + ); + return ( +
+ +
+ ); + }; + + const renderCitationCard = ( + release: string, + conditional = false, + provisional = false, + ): JSX.Element => { + const citationProduct: ContextDataProduct = provisional + ? citableBaseProduct as ContextDataProduct + : citableReleaseProduct as ContextDataProduct; + let conditionalText = null; + let citationClassName = classes.citationText; + if (conditional) { + const provReleaseText = provisional + ? 'If Provisional data are used, include:' + : 'If Released data are used, include:'; + if (showTextOnly) { + conditionalText = ( + + {provReleaseText} + + ); + } else { + conditionalText = ( + + {provReleaseText} + + ); + } + citationClassName = classes.citationTextWithQualifier; + } + let citationReleaseObject: Nullable = null; + if (!provisional) { + citationReleaseObject = (releaseObject as CitationRelease); + } + const citationText: string = CitationService.buildDataProductCitationText( + citationProduct, + citationReleaseObject, + ); + if (showTextOnly) { + return ( +
+ {conditionalText} + + {citationText} + +
+ ); + } + const isSectionDownloading: boolean = Service.hasCitationDownloadStatus( + citationDownloadsFetchStatus, + provisional, + citationProduct.productCode, + FetchStatus.FETCHING, + ); + let downloadStatus: Nullable; + if ( + Service.hasCitationDownloadStatus( + citationDownloadsFetchStatus, + provisional, + citationProduct.productCode, + FetchStatus.ERROR, + ) + ) { + downloadStatus = ( + handleResetCitationDownloadsCb(provisional, citationProduct.productCode)} + > + Citation download encountered a problem + + ); + } else if ( + Service.hasCitationDownloadStatus( + citationDownloadsFetchStatus, + provisional, + citationProduct.productCode, + FetchStatus.SUCCESS, + ) + ) { + downloadStatus = ( + handleResetCitationDownloadsCb(provisional, citationProduct.productCode)} + > + Citation downloaded + + ); + } + return ( + + + {conditionalText} + + {citationText} + + + + + + + + + {DataCiteService.getDataProductFormats().map((format: CitationFormat): JSX.Element => { + const key: string = Service.buildCitationDownloadKey( + citationProduct, + release, + format.shortName, + provisional, + ); + const isDownloading: boolean = !exists(citationDownloadsFetchStatus[key]) + ? false + : citationDownloadsFetchStatus[key].status === FetchStatus.FETCHING; + return ( + + + + + + ); + })} + + {downloadStatus} + + ); + }; + + let citationCard: JSX.Element; + switch (displayType) { + case DisplayType.CONDITIONAL: + citationCard = ( + + {renderCitationCard(PROVISIONAL_RELEASE, true, true)} + {renderCitationCard((releaseObject as CitationRelease).release, true, false)} + + ); + break; + case DisplayType.PROVISIONAL: + citationCard = ( + + {renderCitationCard(PROVISIONAL_RELEASE, false, true)} + + ); + break; + case DisplayType.RELEASE: + citationCard = ( + + {renderCitationCard((releaseObject as CitationRelease).release, false, false)} + + ); + break; + case DisplayType.NOT_AVAILABLE: + default: + // eslint-disable-next-line react/jsx-no-useless-fragment + return <>; + } + return ( + <> + {renderTombstoneNotice()} + {renderBundleParentLink()} + {citationCard} + + ); +}; + +DataProductCitationItemView.defaultProps = { + showQuoteIcon: false, + disableConditional: false, + disableSkeleton: false, + showTextOnly: false, + textOnlyProps: undefined, +}; + +export default DataProductCitationItemView; diff --git a/src/lib_components/components/Citation/DataProductCitation/Reducer.ts b/src/lib_components/components/Citation/DataProductCitation/Reducer.ts index ad6bcfcc..7dc20305 100644 --- a/src/lib_components/components/Citation/DataProductCitation/Reducer.ts +++ b/src/lib_components/components/Citation/DataProductCitation/Reducer.ts @@ -1,3 +1,8 @@ +import ReleaseService from '../../../service/ReleaseService'; +import { Nullable, UnknownRecord } from '../../../types/core'; +import { exists, existsNonEmpty, isStringNonEmpty } from '../../../util/typeUtil'; +import { DataProductDoiStatus } from '../../../types/neonApi'; + import Service from './Service'; import ActionCreator, { ActionTypes, @@ -36,10 +41,6 @@ import { FetchStatusState, getDefaultState, } from './State'; -import ReleaseService from '../../../service/ReleaseService'; -import { Nullable, UnknownRecord } from '../../../types/core'; -import { exists, isStringNonEmpty } from '../../../util/typeUtil'; -import { DataProductDoiStatus } from '../../../types/neonApi'; const reinitialize = ( state: DataProductCitationState, @@ -150,7 +151,7 @@ const Reducer = ( errorResult = resolveError(action as ErrorActionTypes, newState); } let product: ContextDataProduct; - let productReleaseDoiStatus: DataProductDoiStatus; + let productReleaseDoiStatus: DataProductDoiStatus|DataProductDoiStatus[]; let release: string; let bundleParent: string; let fetchStatusState: FetchStatusState; @@ -282,13 +283,30 @@ const Reducer = ( release = fprdSucceededAction.release; productReleaseDoiStatus = fprdSucceededAction.data; newState.fetches.productReleaseDois[release].status = FetchStatus.SUCCESS; - if (exists(productReleaseDoiStatus) && exists(productReleaseDoiStatus.status)) { - newState.data.productReleaseDois[release] = productReleaseDoiStatus; + if (!exists(productReleaseDoiStatus)) { + newState.data.productReleaseDois[release] = null; + } else if (Array.isArray(productReleaseDoiStatus)) { + if (existsNonEmpty(productReleaseDoiStatus)) { + // eslint-disable-next-line max-len + newState.data.productReleaseDois[release] = (productReleaseDoiStatus as DataProductDoiStatus[]) + .filter((dpds: DataProductDoiStatus): boolean => ( + exists(dpds) && exists(dpds.status) + )); + } else { + newState.data.productReleaseDois[release] = null; + } + } else if (exists(productReleaseDoiStatus.status)) { + newState.data.productReleaseDois[release] = productReleaseDoiStatus as DataProductDoiStatus; } else { newState.data.productReleaseDois[release] = null; } return Service.calculateAppStatus( - Service.applyDoiStatusReleaseGlobally(newState, productReleaseDoiStatus), + Service.applyDoiStatusReleaseGlobally( + newState, + fprdSucceededAction.productCode, + release, + newState.data.productReleaseDois[release], + ), ); case ActionTypes.FETCH_BUNDLE_PARENT_STARTED: diff --git a/src/lib_components/components/Citation/DataProductCitation/Service.ts b/src/lib_components/components/Citation/DataProductCitation/Service.ts index 81c0d2a2..1e292a37 100644 --- a/src/lib_components/components/Citation/DataProductCitation/Service.ts +++ b/src/lib_components/components/Citation/DataProductCitation/Service.ts @@ -1,4 +1,5 @@ import { Dispatch } from 'react'; + import BundleService from '../../../service/BundleService'; import ReleaseService, { PROVISIONAL_RELEASE } from '../../../service/ReleaseService'; import { @@ -11,8 +12,8 @@ import { CitationBundleState, IReleaseLike } from '../../../types/internal'; import { DataProductDoiStatus, DataProductRelease, DoiStatusType } from '../../../types/neonApi'; import { BundleContext } from '../../../types/neonContext'; import { exists, existsNonEmpty, isStringNonEmpty } from '../../../util/typeUtil'; -import ActionCreator from './Actions'; +import ActionCreator from './Actions'; import { FetchStatus, ContextStatus, @@ -26,6 +27,7 @@ import { DataProductCitationViewProps, DataProductCitationViewState, DisplayType, + DataProductCitationItem, } from './ViewState'; const fetchIsInStatus = (fetchObject: Nullable, status: string): boolean => ( @@ -171,12 +173,24 @@ const applyReleasesGlobally = ( const applyDoiStatusReleaseGlobally = ( state: DataProductCitationState, - doiStatus: DataProductDoiStatus, + productCode: string, + release: string, + doiStatus: Nullable, ): DataProductCitationState => { + if (!exists(doiStatus)) { + return state; + } const updatedState: DataProductCitationState = { ...state }; - const transformedRelease: Nullable = ReleaseService.transformDoiStatusRelease( + // eslint-disable-next-line max-len + const appliedDoiStatus: Nullable = BundleService.determineAppliedBundleRelease( + ((updatedState.neonContextState?.data as UnknownRecord || {})).bundles as BundleContext, + release, + productCode, doiStatus, ); + const transformedRelease: Nullable = ReleaseService.transformDoiStatusRelease( + appliedDoiStatus, + ); if (!exists(transformedRelease)) { return updatedState; } @@ -282,14 +296,16 @@ const buildCitationDownloadKey = ( const hasCitationDownloadStatus = ( citationDownloadsFetchStatus: Record, provisionalCb: boolean, + productCode: string, statusCb: FetchStatus, ): boolean => ( Object.keys(citationDownloadsFetchStatus).some((k: string): boolean => { if (citationDownloadsFetchStatus[k]) { let shouldConsider = true; - if (!provisionalCb && k.includes(PROVISIONAL_RELEASE)) { - shouldConsider = false; - } else if (provisionalCb && !k.includes(PROVISIONAL_RELEASE)) { + if (!k.includes(productCode) + || (!provisionalCb && k.includes(PROVISIONAL_RELEASE)) + || (provisionalCb && !k.includes(PROVISIONAL_RELEASE)) + ) { shouldConsider = false; } if (shouldConsider && (citationDownloadsFetchStatus[k].status === statusCb)) { @@ -302,14 +318,16 @@ const hasCitationDownloadStatus = ( const handleResetCitationDownloads = ( citationDownloadsFetchStatus: Record, provisionalCb: boolean, + productCode: string, dispatch: Undef>, ): void => { Object.keys(citationDownloadsFetchStatus).forEach((k: string): void => { if (citationDownloadsFetchStatus[k]) { let shouldReset = true; - if (!provisionalCb && k.includes(PROVISIONAL_RELEASE)) { - shouldReset = false; - } else if (provisionalCb && !k.includes(PROVISIONAL_RELEASE)) { + if (!k.includes(productCode) + || (!provisionalCb && k.includes(PROVISIONAL_RELEASE)) + || (provisionalCb && !k.includes(PROVISIONAL_RELEASE)) + ) { shouldReset = false; } if (shouldReset) { @@ -397,111 +415,216 @@ const useViewState = ( const hasAppliedReleaseDoi: boolean = isStringNonEmpty(appliedReleaseDoi); const hideAppliedReleaseCitation: boolean = exists(appliedReleaseObject) && ((appliedReleaseObject as CitationRelease).showCitation === false); - // Determine tombstoned state + // Determine tombstoned state for entire citation + const hasProductReleaseDois: boolean = exists(productReleaseDois) + && isStringNonEmpty(appliedRenderedReleaseTag) + && exists(productReleaseDois[appliedRenderedReleaseTag as string]); + let dataProductDoiStatus: Nullable = null; let isTombstoned: boolean = false; - if (exists(productReleaseDois) - && isStringNonEmpty(appliedRenderedReleaseTag) - && exists(productReleaseDois[appliedRenderedReleaseTag as string])) { - const dataProductDoiStatus: Nullable = productReleaseDois[ - appliedRenderedReleaseTag as string - ]; - const doiStatusType: Nullable = dataProductDoiStatus?.status; - isTombstoned = (exists(doiStatusType) && (doiStatusType === DoiStatusType.TOMBSTONED)); - } - // Identify whether or not viewing a bundled product with applicable DOI - // and capture the bundle DOI product code. - const hasBundleCode: boolean = existsNonEmpty(bundle.parentCodes) - && isStringNonEmpty(bundle.doiProductCode); - const bundleParentCode: Nullable = hasBundleCode - ? bundle.doiProductCode - : null; - let bundleProduct: Nullable = null; - if (hasBundleCode && exists(bundleParents[bundleParentCode as string])) { - bundleProduct = bundleParents[bundleParentCode as string]; - } - const hasBundleProduct: boolean = exists(bundleProduct); - // Determines if the latest release has a bundle defined for this product. - let hasLatestReleaseBundle: boolean = false; - if (hasLatestRelease && exists(baseProduct)) { - hasLatestReleaseBundle = BundleService.isProductInBundle( - bundlesContext, - (latestReleaseObject as CitationRelease).release, - (baseProduct as ContextDataProduct).productCode, - ); - } - // Determine if the bundle product has data for the specified release. - let isBundleProductInRelease: boolean = true; - if (hasBundleProduct && hasSpecifiedRelease && !isAppliedReleaseLatestNonProv) { - const bundleHasRelease: Undef = bundleProduct?.releases.find( - (r: DataProductRelease): boolean => r.release === appliedRenderedReleaseTag, + const determineDoiStatusTombstone = ( + dpds: DataProductDoiStatus|DataProductDoiStatus[], + ): boolean => { + let tsResult = false; + if (!Array.isArray(dpds)) { + // eslint-disable-next-line max-len + const doiStatusType: Nullable = (dpds as Nullable)?.status; + tsResult = (exists(doiStatusType) && (doiStatusType === DoiStatusType.TOMBSTONED)); + } else { + tsResult = dpds.every((ds: DataProductDoiStatus): boolean => { + if (!exists(ds)) return false; + return (ds.status === DoiStatusType.TOMBSTONED); + }); + } + return tsResult; + }; + if (hasProductReleaseDois) { + dataProductDoiStatus = productReleaseDois[appliedRenderedReleaseTag as string]; + isTombstoned = determineDoiStatusTombstone( + dataProductDoiStatus as DataProductDoiStatus|DataProductDoiStatus[], ); - isBundleProductInRelease = exists(bundleHasRelease); } - // Determine if the citable product should be the bundle container product - // or the currently specified product. - // eslint-disable-next-line max-len - const citableBaseProduct: Nullable = hasBundleProduct && isBundleProductInRelease - ? bundleProduct - : baseProduct; - // Determine the product to use for citing within the applicable release - // and within the context of bundles. - let citableReleaseProduct: Nullable = null; - if (hasAppliedReleaseDoi && !hideAppliedReleaseCitation) { - // If we're referencing latest release and provisional, and there isn't a bundle - // defined for the latest release, use base product for release citation - if (!hasSpecifiedRelease && !hasLatestReleaseBundle) { - citableReleaseProduct = baseProduct; - } else { - // Has a specified release, or if not, has latest release bundle. - // When a bundled product code is available for the given release, - // get the product for the parent code and release. - // Otherwise, the citable product is the current product for the specified - // release when available. - // eslint-disable-next-line no-lonely-if - if (hasBundleCode) { - const bpr: Record> = bundleParentReleases[ - bundleParentCode as string - ]; - if (exists(bpr)) { - const product: Nullable = bpr[appliedRenderedReleaseTag as string]; + // Identify whether or not viewing a bundled product with applicable DOI. + const hasBundleCode: boolean = existsNonEmpty(bundle.parentCodes) + && (isStringNonEmpty(bundle.doiProductCode) + || (Array.isArray(bundle.doiProductCode) && existsNonEmpty(bundle.doiProductCode))); + // Builds a citation item based on current state + // of release, specified bundle code when applicable. + const buildCitationItem = ( + bundleParentCode?: string, + bundleDpds?: DataProductDoiStatus, + ): DataProductCitationItem => { + const item: DataProductCitationItem = { + releaseObject: null, + doiUrl: null, + citableBaseProduct: null, + citableReleaseProduct: null, + bundleParentCode: null, + isTombstoned: false, + }; + let bundleProduct: Nullable = null; + if (hasBundleCode + && isStringNonEmpty(bundleParentCode) + && exists(bundleParents[bundleParentCode as string])) { + bundleProduct = bundleParents[bundleParentCode as string]; + } + const hasBundleProduct: boolean = exists(bundleProduct); + // Determines if the latest release has a bundle defined for this product. + let hasLatestReleaseBundle: boolean = false; + if (hasLatestRelease && exists(baseProduct)) { + hasLatestReleaseBundle = BundleService.isProductInBundle( + bundlesContext, + (latestReleaseObject as CitationRelease).release, + (baseProduct as ContextDataProduct).productCode, + ); + } + // Determine if the bundle product has data for the specified release. + let isBundleProductInRelease: boolean = true; + if (hasBundleProduct && hasSpecifiedRelease && !isAppliedReleaseLatestNonProv) { + const bundleHasRelease: Undef = bundleProduct?.releases.find( + (r: DataProductRelease): boolean => r.release === appliedRenderedReleaseTag, + ); + isBundleProductInRelease = exists(bundleHasRelease); + } + let itemReleaseObject: Nullable = appliedReleaseObject; + let itemDoiUrl: Nullable = appliedReleaseDoi; + let itemIsTombstoned: boolean = false; + // Determine if the citable product should be the bundle container product + // or the currently specified product. + // eslint-disable-next-line max-len + const citableBaseProduct: Nullable = hasBundleProduct && isBundleProductInRelease + ? bundleProduct + : baseProduct; + // Determine the product to use for citing within the applicable release + // and within the context of bundles. + let citableReleaseProduct: Nullable = null; + if (hasAppliedReleaseDoi && !hideAppliedReleaseCitation) { + // If we're referencing latest release and provisional, and there isn't a bundle + // defined for the latest release, use base product for release citation. + if (!hasSpecifiedRelease && !hasLatestReleaseBundle) { + citableReleaseProduct = baseProduct; + } else { + // Has a specified release, or if not, has latest release bundle. + // When a bundled product code is available for the given release, + // get the product for the parent code and release. + // Otherwise, the citable product is the current product for the specified + // release when available. + // eslint-disable-next-line no-lonely-if + if (hasBundleCode) { + const bpr: Record> = bundleParentReleases[ + bundleParentCode as string + ]; + if (exists(bpr)) { + const product: Nullable = bpr[appliedRenderedReleaseTag as string]; + if (exists(product)) { + citableReleaseProduct = product; + } + } + } else { + const product: Nullable = productReleases[ + appliedRenderedReleaseTag as string + ]; if (exists(product)) { citableReleaseProduct = product; } } - } else { - const product: Nullable = productReleases[ - appliedRenderedReleaseTag as string - ]; - if (exists(product)) { - citableReleaseProduct = product; - } } } + // Determine release property states from current bundle. + if (hasBundleCode + && isStringNonEmpty(bundleParentCode) + && exists(bundleDpds)) { + const bundleCitationRelease: CitationRelease = ReleaseService.transformDoiStatusRelease( + bundleDpds, + ) as CitationRelease; + itemReleaseObject = bundleCitationRelease; + itemDoiUrl = bundleCitationRelease.productDoi.url; + itemIsTombstoned = determineDoiStatusTombstone(bundleDpds as DataProductDoiStatus); + } + item.releaseObject = itemReleaseObject; + item.doiUrl = itemDoiUrl; + item.isTombstoned = itemIsTombstoned; + item.citableBaseProduct = citableBaseProduct; + item.citableReleaseProduct = citableReleaseProduct; + item.bundleParentCode = bundleParentCode; + return item; + }; + // Build set of applicable citation items for product, bundle + const items: DataProductCitationItem[] = []; + if (!hasBundleCode) { + const nonBundleItem: DataProductCitationItem = buildCitationItem(); + items.push(nonBundleItem); + } else if (isStringNonEmpty(bundle.doiProductCode)) { + const bundleParentCode: string = bundle.doiProductCode as string; + const singleBundleItem: DataProductCitationItem = buildCitationItem(bundleParentCode); + items.push(singleBundleItem); + } else if (Array.isArray(bundle.doiProductCode) && existsNonEmpty(bundle.doiProductCode)) { + const bundleParentCodes: string[] = bundle.doiProductCode; + if (hasProductReleaseDois && !Array.isArray(dataProductDoiStatus)) { + const bundleParentCode: string = bundle.doiProductCode[0]; + const singleBundleItem: DataProductCitationItem = buildCitationItem(bundleParentCode); + items.push(singleBundleItem); + } else { + bundleParentCodes.forEach((bundleParentCode: string): void => { + let bundleDpds: Undef; + if (hasProductReleaseDois && Array.isArray(dataProductDoiStatus)) { + bundleDpds = dataProductDoiStatus.find((ds: DataProductDoiStatus): boolean => { + if (!exists(ds)) return false; + return ds.productCode.localeCompare(bundleParentCode) === 0; + }); + } + // If we could not identify a matching DOI record for the bundle parent + // code, it is an invalid state, do not capture. + // This should not occur if bundles and DOIs are properly + // configured and data come across properly in API calls. + if (exists(bundleDpds)) { + const bundleItem: DataProductCitationItem = buildCitationItem( + bundleParentCode, + bundleDpds, + ); + items.push(bundleItem); + } else if (hasSpecifiedRelease && isAppliedReleaseLatestNonProv) { + const bundleItem: DataProductCitationItem = buildCitationItem( + bundleParentCode, + ); + items.push(bundleItem); + } + }); + } } // Determine if there's a valid product to generate the citation with. - const hasValidProduct: boolean = exists(citableBaseProduct); - const hasValidReleaseProduct: boolean = exists(citableReleaseProduct); + const hasValidProduct: boolean = items.some( + (item: DataProductCitationItem): boolean => exists(item.citableBaseProduct), + ); + const hasValidReleaseProduct: boolean = items.some( + (item: DataProductCitationItem): boolean => exists(item.citableReleaseProduct), + ); // Verify identified release product is in the applied release. let isCitableReleaseProductInRelease: boolean = false; // If looking at latest release non provisional, consider in release. if (isAppliedReleaseLatestNonProv) { isCitableReleaseProductInRelease = true; } else if (hasValidReleaseProduct) { - const productHasRelease: Undef = citableReleaseProduct?.releases.find( - (r: DataProductRelease): boolean => r.release === appliedRenderedReleaseTag, - ); - isCitableReleaseProductInRelease = exists(productHasRelease) || isTombstoned; + const productHasRelease: boolean = items.some((item: DataProductCitationItem): boolean => { + const dpr: Undef = item.citableReleaseProduct?.releases.find( + (r: DataProductRelease): boolean => r.release === appliedRenderedReleaseTag, + ); + return exists(dpr) || item.isTombstoned; + }); + isCitableReleaseProductInRelease = productHasRelease || isTombstoned; } // Determine the overall citation display status. let appliedStatus: ContextStatus = status; let displayType: DisplayType = DisplayType.CONDITIONAL; const isReady: boolean = (status === ContextStatus.READY); const isError: boolean = (status === ContextStatus.ERROR); + const setErrorNotAvailable = (): void => { + appliedStatus = ContextStatus.ERROR; + displayType = DisplayType.NOT_AVAILABLE; + }; if (isReady) { if (!hasValidProduct) { // If the context is ready and no product is identified, error state. - appliedStatus = ContextStatus.ERROR; - displayType = DisplayType.NOT_AVAILABLE; + setErrorNotAvailable(); } else if (hasSpecifiedRelease) { // A release has been specified, determine validity. if (hideAppliedReleaseCitation && !isAppliedReleaseLatestNonProv) { @@ -522,8 +645,7 @@ const useViewState = ( // If the component is ready and a release was specified but // failed to resolve the appropriate citable release product, // error state. - appliedStatus = ContextStatus.ERROR; - displayType = DisplayType.NOT_AVAILABLE; + setErrorNotAvailable(); } } else if (isAppliedReleaseLatestNonProv) { displayType = DisplayType.PROVISIONAL; @@ -546,8 +668,7 @@ const useViewState = ( } else if (!hasValidProduct || !hasValidReleaseProduct) { // If the component is ready and the display state is conditional // and a valid product and release product were not found, error state. - appliedStatus = ContextStatus.ERROR; - displayType = DisplayType.NOT_AVAILABLE; + setErrorNotAvailable(); } } else if (isError) { if (hasSpecifiedRelease && isSpecifiedReleaseLatestNonProv) { @@ -559,14 +680,10 @@ const useViewState = ( } return { status: appliedStatus, - releaseObject: appliedReleaseObject, - doiUrl: appliedReleaseDoi, + citationItems: items, releases, - citableBaseProduct, - citableReleaseProduct, displayType, isTombstoned, - bundleParentCode, citationDownloadsFetchStatus, }; }; diff --git a/src/lib_components/components/Citation/DataProductCitation/State.ts b/src/lib_components/components/Citation/DataProductCitation/State.ts index 0cdf78b1..bf12153d 100644 --- a/src/lib_components/components/Citation/DataProductCitation/State.ts +++ b/src/lib_components/components/Citation/DataProductCitation/State.ts @@ -55,7 +55,7 @@ export interface ContextDataProduct { export interface DataState { product: Nullable; productReleases: Record>; - productReleaseDois: Record>; + productReleaseDois: Record>; bundleParents: Record; bundleParentReleases: Record>; releases: CitationRelease[]; diff --git a/src/lib_components/components/Citation/DataProductCitation/View.tsx b/src/lib_components/components/Citation/DataProductCitation/View.tsx index e7e4d62a..586d0c6c 100644 --- a/src/lib_components/components/Citation/DataProductCitation/View.tsx +++ b/src/lib_components/components/Citation/DataProductCitation/View.tsx @@ -1,89 +1,47 @@ -/* eslint-disable react/jsx-fragments */ -import React, { useCallback } from 'react'; - -import { CopyToClipboard } from 'react-copy-to-clipboard'; +import React from 'react'; import { makeStyles } from '@material-ui/core/styles'; -import Alert from '@material-ui/lab/Alert'; -import Button from '@material-ui/core/Button'; -import Card from '@material-ui/core/Card'; -import CardActions from '@material-ui/core/CardActions'; -import CardContent from '@material-ui/core/CardContent'; -import CardHeader from '@material-ui/core/CardHeader'; -import CircularProgress from '@material-ui/core/CircularProgress'; import Grid from '@material-ui/core/Grid'; import Link from '@material-ui/core/Link'; import Skeleton from '@material-ui/lab/Skeleton'; -import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; -import CopyIcon from '@material-ui/icons/Assignment'; -import DownloadIcon from '@material-ui/icons/SaveAlt'; import QuoteIcon from '@material-ui/icons/FormatQuote'; -import DataProductCitationContext from './Context'; -import Service from './Service'; +import BundleContentBuilder from '../../Bundles/BundleContentBuilder'; +import DataProductBundleCard from '../../Bundles/DataProductBundleCard'; import ErrorCard from '../../Card/ErrorCard'; import WarningCard from '../../Card/WarningCard'; import Theme from '../../Theme/Theme'; -import CitationService from '../../../service/CitationService'; -import DataCiteService, { - CitationDownloadType, CitationFormat, -} from '../../../service/DataCiteService'; import RouteService from '../../../service/RouteService'; -import { PROVISIONAL_RELEASE } from '../../../service/ReleaseService'; -import { exists, isStringNonEmpty } from '../../../util/typeUtil'; - -import ActionCreator from './Actions'; import { NeonTheme } from '../../Theme/types'; +import { Nullable } from '../../../types/core'; +import { + exists, + existsNonEmpty, + isStringNonEmpty, +} from '../../../util/typeUtil'; + +import DataProductCitationContext from './Context'; +import DataProductCitationItemView from './ItemView'; +import Service from './Service'; import { CitationRelease, ContextDataProduct, ContextStatus, - FetchStatus, } from './State'; import { DataProductCitationViewState, DataProductCitationViewProps, DisplayType, CitationTextOnlyProps, + DataProductCitationItem, } from './ViewState'; -import { Nullable, UnknownRecord } from '../../../types/core'; -import { DataProductRelease } from '../../../types/neonApi'; const useStyles = makeStyles((theme: NeonTheme) => ({ - cardActions: { - flexWrap: 'wrap', - marginTop: theme.spacing(-1), - '&> *': { - marginLeft: '0px !important', - marginTop: theme.spacing(1), - }, - '&> :not(:last-child)': { - marginRight: theme.spacing(1), - }, - }, - cardButton: { - padding: '5px 10px', - backgroundColor: '#fff', - whiteSpace: 'nowrap', - }, - cardButtonIcon: { - marginRight: theme.spacing(1), - }, - citationCard: { - marginTop: theme.spacing(2), - }, - citationText: { - fontFamily: 'monospace', - }, citationTextOnly: { - color: Theme.palette.grey[400], - }, - citationTextWithQualifier: { - marginTop: theme.spacing(1.5), - fontFamily: 'monospace', + color: theme.palette.grey[400], }, calloutIcon: { color: theme.palette.grey[300], @@ -98,45 +56,9 @@ const useStyles = makeStyles((theme: NeonTheme) => ({ citationUseText: { flexGrow: 1, }, - bundleParentBlurbCard: { - backgroundColor: (Theme as NeonTheme).colors.GOLD[50], - marginTop: theme.spacing(1), - }, - bundleParentBlurbCardTextOnly: { - backgroundColor: (Theme as NeonTheme).colors.GOLD[50], - marginTop: theme.spacing(1), + itemContainer: { marginBottom: theme.spacing(2), }, - bundleParentBlurbCardContent: { - padding: theme.spacing(2), - paddingBottom: '20px !important', - }, - bundleParentBlurb: { - fontStyle: 'italic', - fontSize: '0.8rem', - }, - tombstoneBlurbCard: { - backgroundColor: (Theme as NeonTheme).colors.BROWN[50], - borderColor: (Theme as NeonTheme).colors.BROWN[300], - marginTop: theme.spacing(1), - }, - tombstoneBlurbCardTextOnly: { - backgroundColor: (Theme as NeonTheme).colors.GOLD[50], - marginTop: theme.spacing(1), - marginBottom: theme.spacing(2), - }, - tombstoneBlurbCardHeader: { - padding: theme.spacing(2), - paddingBottom: 0, - }, - tombstoneBlurbCardContent: { - padding: theme.spacing(2), - paddingTop: theme.spacing(1), - paddingBottom: '20px !important', - }, - tombstoneBlurb: { - fontSize: '0.8rem', - }, })); const DataProductCitationView: React.FC = ( @@ -147,10 +69,10 @@ const DataProductCitationView: React.FC = ( disableSkeleton, showTextOnly, textOnlyProps, + showManyParents, }: DataProductCitationViewProps = props; const classes = useStyles(Theme); const state = DataProductCitationContext.useDataProductCitationContextState(); - const dispatch = DataProductCitationContext.useDataProductCitationContextDispatch(); let appliedTextOnly: CitationTextOnlyProps = { variant: 'caption', @@ -164,56 +86,22 @@ const DataProductCitationView: React.FC = ( const { status, displayType, - isTombstoned, - releases, - releaseObject, - citableBaseProduct, - citableReleaseProduct, - bundleParentCode, - citationDownloadsFetchStatus, + citationItems, }: DataProductCitationViewState = viewState; - - const handleResetCitationDownloadsCb = useCallback((provisionalCb: boolean): void => { - Service.handleResetCitationDownloads(citationDownloadsFetchStatus, provisionalCb, dispatch); - }, [dispatch, citationDownloadsFetchStatus]); - const handleCitationDownloadCb = useCallback(( - citationProduct: ContextDataProduct, - releaseCb: string, - formatCb: string, - provisionalCb = true, - ): void => { - const coercedTarget: UnknownRecord = { - ...citationProduct, - }; - const key: string = Service.buildCitationDownloadKey( - citationProduct, - releaseCb, - formatCb, - provisionalCb, - ); - const fullDoi: Nullable = Service.getReleaseDoi(releases, releaseCb); - handleResetCitationDownloadsCb(provisionalCb); - if (dispatch) { - dispatch(ActionCreator.fetchCitationDownloadStarted(key)); + const bundleParentCodes: Record>> = {}; + const hasManyParents = (citationItems.length > 1); + citationItems.forEach((item: DataProductCitationItem): void => { + if (!exists(item) || !isStringNonEmpty(item.bundleParentCode)) { + return; } - DataCiteService.downloadCitation( - formatCb, - CitationDownloadType.DATA_PRODUCT, - coercedTarget, - fullDoi as string, - releaseCb, - (data: string): void => { - if (dispatch) { - dispatch(ActionCreator.fetchCitationDownloadSucceeded(key)); - } - }, - (error: unknown): void => { - if (dispatch) { - dispatch(ActionCreator.fetchCitationDownloadFailed(key, 'Citation download failed')); - } - }, - ); - }, [dispatch, releases, handleResetCitationDownloadsCb]); + const key = `${item.bundleParentCode}:${item.releaseObject?.release}`; + if (!exists(bundleParentCodes[key])) { + bundleParentCodes[key] = { + productCode: item.bundleParentCode as string, + release: item.releaseObject?.release || null, + }; + } + }); const renderSkeleton = (): JSX.Element => { if (disableSkeleton) { @@ -314,292 +202,94 @@ const DataProductCitationView: React.FC = ( ); }; - const renderTombstoneNotice = (): Nullable => { - if (!isTombstoned) { - return null; - } - const citationRelease: CitationRelease = (releaseObject as CitationRelease); - let doiDisplay = ' '; - if (citationRelease.productDoi.url) { - const doiId: string = citationRelease.productDoi.url.split('/').slice(-2).join('/'); - doiDisplay = ` (DOI:${doiId}) `; - } - let latestAvailableReleaseBlurb: JSX.Element|null = null; - if (citableBaseProduct?.releases && (citableBaseProduct?.releases.length > 0)) { - const latestAvailableProductRelease: DataProductRelease = citableBaseProduct?.releases[0]; - if (latestAvailableProductRelease.release.localeCompare(citationRelease.release) !== 0) { - const dataProductDetailLink: JSX.Element = ( - - newer release - - ); - latestAvailableReleaseBlurb = ( - <> - {/* eslint-disable react/jsx-one-expression-per-line, max-len */} - has been replaced by a {dataProductDetailLink} and  - {/* eslint-enable react/jsx-one-expression-per-line, max-len */} - - ); - } - } - const contactUsLink: JSX.Element = ( - - Contact Us - - ); - const tombstoneNote: JSX.Element = ( - <> - {/* eslint-disable react/jsx-one-expression-per-line, max-len */} - {citationRelease.release} of this data product - {doiDisplay} {latestAvailableReleaseBlurb}is no longer available for download. - If this specific release is needed for research purposes, please fill out - the {contactUsLink} form. - {/* eslint-enable react/jsx-one-expression-per-line, max-len */} - - ); - return ( - - Release Notice)} - /> - - - {tombstoneNote} - - - - ); - }; - - const renderBundleParentLink = (): Nullable => { - if (!isStringNonEmpty(bundleParentCode)) { + const renderBundleParentsCard = (): Nullable => { + const filteredCitationItems: DataProductCitationItem[] = citationItems + .filter((item: DataProductCitationItem): boolean => ( + exists(item) + && exists(item.citableBaseProduct) + && exists(item.citableReleaseProduct) + && isStringNonEmpty(item.bundleParentCode) + && exists(item.releaseObject) + )); + if (!existsNonEmpty(filteredCitationItems) || (filteredCitationItems.length <= 1)) { return null; } const isReleaseDisplay = (displayType === DisplayType.RELEASE); - const bundleParentName: string = isReleaseDisplay - ? (citableReleaseProduct as ContextDataProduct).productName - : (citableBaseProduct as ContextDataProduct).productName; - let bundleParentHref: string = RouteService.getProductDetailPath(bundleParentCode as string); - if (isReleaseDisplay) { - bundleParentHref = RouteService.getProductDetailPath( - bundleParentCode as string, - (releaseObject as CitationRelease).release as string, - ); - } - const bundleParentLink: JSX.Element = ( - - {`${bundleParentName} (${bundleParentCode})`} - - ); - return ( - - - - {/* eslint-disable react/jsx-one-expression-per-line, max-len */} - Note: This product is bundled into {bundleParentLink}. - The {isReleaseDisplay ? 'citation below refers' : 'citations below refer'} to - that product as this sub-product is not directly citable. - {/* eslint-enable react/jsx-one-expression-per-line, max-len */} - - - + const bundleNoteTerminalChar = !showManyParents + ? '.' + : ':'; + const titleContent: JSX.Element = BundleContentBuilder.buildDefaultSplitTitleContent( + isReleaseDisplay, + bundleNoteTerminalChar, ); - }; - - const renderCitationCard = ( - release: string, - conditional = false, - provisional = false, - ): JSX.Element => { - const citationProduct: ContextDataProduct = provisional - ? citableBaseProduct as ContextDataProduct - : citableReleaseProduct as ContextDataProduct; - let conditionalText = null; - let citationClassName = classes.citationText; - if (conditional) { - const provReleaseText = provisional - ? 'If Provisional data are used, include:' - : 'If Released data are used, include:'; - if (showTextOnly) { - conditionalText = ( - - {provReleaseText} - - ); - } else { - conditionalText = ( - - {provReleaseText} - - ); - } - citationClassName = classes.citationTextWithQualifier; - } - let citationReleaseObject: Nullable = null; - if (!provisional) { - citationReleaseObject = (releaseObject as CitationRelease); - } - const citationText: string = CitationService.buildDataProductCitationText( - citationProduct, - citationReleaseObject, + const detailContent = !showManyParents ? undefined : ( +
    + {filteredCitationItems.map((item: DataProductCitationItem): JSX.Element => { + const bundleParentName: string = isReleaseDisplay + ? (item.citableReleaseProduct as ContextDataProduct).productName + : (item.citableBaseProduct as ContextDataProduct).productName; + let bundleParentHref: string = RouteService.getProductDetailPath( + item.bundleParentCode as string, + ); + if (isReleaseDisplay) { + bundleParentHref = RouteService.getProductDetailPath( + item.bundleParentCode as string, + (item.releaseObject as CitationRelease).release as string, + ); + } + return ( +
  • + + {`${bundleParentName} (${item.bundleParentCode})`} + +
  • + ); + })} +
); - if (showTextOnly) { - return ( -
- {conditionalText} - - {citationText} - -
- ); - } - const isSectionDownloading: boolean = Service.hasCitationDownloadStatus( - citationDownloadsFetchStatus, - provisional, - FetchStatus.FETCHING, + let subTitleContent = !showManyParents ? undefined : ( + <>Use either or both citations as appropriate. ); - let downloadStatus: Nullable; - if ( - Service.hasCitationDownloadStatus( - citationDownloadsFetchStatus, - provisional, - FetchStatus.ERROR, - ) - ) { - downloadStatus = ( - handleResetCitationDownloadsCb(provisional)}> - Citation download encountered a problem - - ); - } else if ( - Service.hasCitationDownloadStatus( - citationDownloadsFetchStatus, - provisional, - FetchStatus.SUCCESS, - ) - ) { - downloadStatus = ( - handleResetCitationDownloadsCb(provisional)}> - Citation downloaded - + if (showManyParents && (filteredCitationItems.length > 2)) { + subTitleContent = ( + <>Use citations as appropriate. ); } return ( - - - {conditionalText} - - {citationText} - - - - - - - - - {DataCiteService.getDataProductFormats().map((format: CitationFormat): JSX.Element => { - const key: string = Service.buildCitationDownloadKey( - citationProduct, - release, - format.shortName, - provisional, - ); - const isDownloading: boolean = !exists(citationDownloadsFetchStatus[key]) - ? false - : citationDownloadsFetchStatus[key].status === FetchStatus.FETCHING; - return ( - - - - - - ); - })} - - {downloadStatus} - +
+ +
); }; + const renderItems = (): JSX.Element[] => ( + citationItems.map((item: DataProductCitationItem, index: number): JSX.Element => ( +
+ +
+ )) + ); + const renderCitationDisplay = (): JSX.Element => { - let citationCard: JSX.Element; switch (displayType) { case DisplayType.CONDITIONAL: - citationCard = ( - - {renderCitationCard(PROVISIONAL_RELEASE, true, true)} - {renderCitationCard((releaseObject as CitationRelease).release, true, false)} - - ); - break; case DisplayType.PROVISIONAL: - citationCard = ( - - {renderCitationCard(PROVISIONAL_RELEASE, false, true)} - - ); - break; case DisplayType.RELEASE: - citationCard = ( - - {renderCitationCard((releaseObject as CitationRelease).release, false, false)} - - ); break; case DisplayType.NOT_AVAILABLE: return renderNotAvailable(); @@ -610,9 +300,8 @@ const DataProductCitationView: React.FC = ( return (
{renderCitationBlurb()} - {renderTombstoneNotice()} - {renderBundleParentLink()} - {citationCard} + {renderBundleParentsCard()} + {renderItems()}
); }; @@ -637,6 +326,7 @@ DataProductCitationView.defaultProps = { disableSkeleton: false, showTextOnly: false, textOnlyProps: undefined, + showManyParents: true, }; export default DataProductCitationView; diff --git a/src/lib_components/components/Citation/DataProductCitation/ViewState.ts b/src/lib_components/components/Citation/DataProductCitation/ViewState.ts index 453ce547..1616e884 100644 --- a/src/lib_components/components/Citation/DataProductCitation/ViewState.ts +++ b/src/lib_components/components/Citation/DataProductCitation/ViewState.ts @@ -18,6 +18,13 @@ export interface DataProductCitationViewProps { disableSkeleton?: boolean; showTextOnly?: boolean; textOnlyProps?: CitationTextOnlyProps; + showManyParents?: boolean; +} + +export interface DataProductCitationItemViewProps extends DataProductCitationViewProps { + citationItem: DataProductCitationItem; + viewState: DataProductCitationViewState; + hasManyParents: boolean; } export enum DisplayType { @@ -27,15 +34,20 @@ export enum DisplayType { NOT_AVAILABLE = 'NOT_AVAILABLE', } -export interface DataProductCitationViewState { - status: ContextStatus; - displayType: DisplayType; - isTombstoned: boolean; - releases: CitationRelease[]; +export interface DataProductCitationItem { releaseObject: Nullable; doiUrl: Nullable; citableBaseProduct: Nullable; citableReleaseProduct: Nullable; bundleParentCode: Nullable; + isTombstoned: boolean; +} + +export interface DataProductCitationViewState { + status: ContextStatus; + displayType: DisplayType; + isTombstoned: boolean; + releases: CitationRelease[]; + citationItems: DataProductCitationItem[]; citationDownloadsFetchStatus: Record; } diff --git a/src/lib_components/components/Citation/StyleGuide.tsx b/src/lib_components/components/Citation/StyleGuide.tsx index d37af33a..4ffe19f0 100644 --- a/src/lib_components/components/Citation/StyleGuide.tsx +++ b/src/lib_components/components/Citation/StyleGuide.tsx @@ -42,11 +42,14 @@ import ReleaseFilter from '../ReleaseFilter/ReleaseFilter'; import ReleaseService from '../../service/ReleaseService'; import Theme from '../Theme/Theme'; import { Release } from '../../types/internal'; -import { isStringNonEmpty } from '../../util/typeUtil'; +import { exists, existsNonEmpty, isStringNonEmpty } from '../../util/typeUtil'; import { + DataProductCitationItem, DataProductCitationViewProps, DataProductCitationViewState, } from './DataProductCitation/ViewState'; +import { Nullable } from '../../types/core'; +import { CitationRelease } from './DataProductCitation/State'; const useStyles = makeStyles((theme) => ({ divider: { @@ -230,9 +233,14 @@ const DataProductCitationDemo = (): JSX.Element => { stateCtx, DataProductCitationView.defaultProps as DataProductCitationViewProps, ); - const { - releaseObject: appliedCitationReleaseObject, - }: DataProductCitationViewState = viewState; + const { citationItems }: DataProductCitationViewState = viewState; + const appliedItem: Nullable = existsNonEmpty(citationItems) + ? citationItems[0] + : null; + let appliedCitationReleaseObject: Nullable = null; + if (exists(appliedItem)) { + appliedCitationReleaseObject = (appliedItem as DataProductCitationItem).releaseObject; + } // eslint-disable-next-line max-len const citationDispatch = DataProductCitationContext.useDataProductCitationContextDispatch() as Dispatch; const fetchAllProducts$ = (NeonGraphQL.getAllDataProducts() as Observable>) diff --git a/src/lib_components/components/DataProductAvailability/AvailabilitySvgComponents.jsx b/src/lib_components/components/DataProductAvailability/AvailabilitySvgComponents.jsx index 77214a7b..be4af278 100644 --- a/src/lib_components/components/DataProductAvailability/AvailabilitySvgComponents.jsx +++ b/src/lib_components/components/DataProductAvailability/AvailabilitySvgComponents.jsx @@ -110,6 +110,15 @@ export const CELL_ATTRS = { fill: Theme.palette.grey[200], ...noStrokeAttrs, }, + tombstoned: { + // #708090 slate gray + // #5A6673 darker slate gray + // #727C8C more modified hue towards gray + // #272727 greyscale of available blue color (rgba(39, 39, 39, 0.9)) + // Theme.palette.grey[500] + fill: 'rgba(39, 39, 39, 0.9)', + ...noStrokeAttrs, + }, 'not collected': { fill: COLORS.GOLD[400], ...noStrokeAttrs, diff --git a/src/lib_components/components/DataProductAvailability/AvailabilityUtils.js b/src/lib_components/components/DataProductAvailability/AvailabilityUtils.js index 5cef5b30..3365cb7c 100644 --- a/src/lib_components/components/DataProductAvailability/AvailabilityUtils.js +++ b/src/lib_components/components/DataProductAvailability/AvailabilityUtils.js @@ -46,6 +46,10 @@ export const VALID_ENHANCED_STATUSES = { title: 'Not Available', description: 'Data was neither expected nor collected', }, + tombstoned: { + title: 'No Longer Available', + description: 'Data is no longer available for download', + }, 'mixed some availability': { title: 'Mixed (Some Availability)', description: 'More than one status including at least one "Available" across sites / tables in the rollup (e.g. viewing states, all tables, etc.)', diff --git a/src/lib_components/components/DataProductAvailability/BasicAvailabilityInterface.jsx b/src/lib_components/components/DataProductAvailability/BasicAvailabilityInterface.jsx index a2d8d882..281076d9 100644 --- a/src/lib_components/components/DataProductAvailability/BasicAvailabilityInterface.jsx +++ b/src/lib_components/components/DataProductAvailability/BasicAvailabilityInterface.jsx @@ -246,7 +246,7 @@ const BasicAvailabilityInterface = (props) => { dispatchSelection, ] = DownloadDataContext.useDownloadDataState(); - const { disableSelection, delineateRelease } = props; + const { disableSelection, delineateRelease, availabilityStatusType } = props; const selectionEnabled = !disableSelection && requiredSteps.some((step) => step.key === 'sitesAndDateRange'); @@ -407,7 +407,7 @@ const BasicAvailabilityInterface = (props) => { views.states.rows[stateCode] = views.states.rows[stateCode] || {}; views.domains.rows[domainCode] = views.domains.rows[domainCode] || {}; availableMonths.forEach((month) => { - let status = 'available'; + let status = availabilityStatusType || 'available'; if (delineateRelease && provAvailableMonths && (provAvailableMonths.length > 0)) { if (provAvailableMonths.includes(month)) { status = 'available-provisional'; @@ -430,7 +430,7 @@ const BasicAvailabilityInterface = (props) => { } views.products.rows[dataProductCode] = {}; availableMonths.forEach((month) => { - let status = 'available'; + let status = availabilityStatusType || 'available'; if (delineateRelease && provAvailableMonths && (provAvailableMonths.length > 0)) { if (provAvailableMonths.includes(month)) { status = 'available-provisional'; @@ -653,6 +653,7 @@ const BasicAvailabilityInterface = (props) => { orientation={currentView === 'products' ? 'horizontal' : ''} selectionEnabled={selectionEnabled} delineateRelease={delineateRelease} + availabilityStatusType={availabilityStatusType} style={{ flexGrow: 1 }} /> @@ -829,6 +830,7 @@ BasicAvailabilityInterface.propTypes = { sortDirection: PropTypes.oneOf(['ASC', 'DESC']), disableSelection: PropTypes.bool, delineateRelease: PropTypes.bool, + availabilityStatusType: PropTypes.oneOf(['available', 'tombstoned']), }; BasicAvailabilityInterface.defaultProps = { @@ -839,6 +841,7 @@ BasicAvailabilityInterface.defaultProps = { sortDirection: 'ASC', disableSelection: false, delineateRelease: false, + availabilityStatusType: null, }; export default BasicAvailabilityInterface; diff --git a/src/lib_components/components/DataProductAvailability/BasicAvailabilityKey.jsx b/src/lib_components/components/DataProductAvailability/BasicAvailabilityKey.jsx index ddf651c5..2f4b2605 100644 --- a/src/lib_components/components/DataProductAvailability/BasicAvailabilityKey.jsx +++ b/src/lib_components/components/DataProductAvailability/BasicAvailabilityKey.jsx @@ -8,6 +8,8 @@ import { CELL_ATTRS } from './AvailabilitySvgComponents'; import Theme, { COLORS } from '../Theme/Theme'; +const VERTICAL_STATUS_TYPES = ['tombstoned']; + /** Setup: CSS classes */ @@ -35,19 +37,65 @@ const useStyles = makeStyles((theme) => ({ */ export default function BasicAvailabilityKey(props) { const classes = useStyles(Theme); - const { orientation, selectionEnabled, delineateRelease } = props; + const { + orientation, + selectionEnabled, + delineateRelease, + availabilityStatusType, + } = props; /** Render: Cells (Vertical Orientation) */ const renderVerticalCellLegend = () => { const totalRows = delineateRelease ? 3 : 2; - const totalWidth = delineateRelease ? 180 : 90; + const totalWidth = delineateRelease || VERTICAL_STATUS_TYPES.includes(availabilityStatusType) + ? 180 + : 90; const rowHeight = SVG.CELL_HEIGHT + (2 * SVG.CELL_PADDING); const totalHeight = (rowHeight * totalRows) - SVG.CELL_PADDING; const rowY = (row) => row * rowHeight; const rowLabelY = (row) => rowY(row) + (SVG.LABEL_FONT_SIZE - SVG.CELL_PADDING + 1); const cellOffset = SVG.CELL_WIDTH + (2 * SVG.CELL_PADDING); + const renderAvailabilityStatusCell = () => { + const tombstonedCell = CELL_ATTRS.tombstoned; + switch (availabilityStatusType) { + case 'tombstoned': + return ( + <> + + + No Longer Available + + + ); + case 'available': + default: + /* eslint-disable max-len */ + return ( + <> + + + Available + + + ); + } + }; const renderProvisionalCell = () => { if (!delineateRelease) { return null; @@ -75,10 +123,7 @@ export default function BasicAvailabilityKey(props) { /* eslint-disable max-len */ return ( - - - Available - + {renderAvailabilityStatusCell()} {renderProvisionalCell()} @@ -100,6 +145,45 @@ export default function BasicAvailabilityKey(props) { const columnX = (col) => col * columnWidth; const rowLabelY = (SVG.LABEL_FONT_SIZE - SVG.CELL_PADDING + 1); const cellOffset = SVG.CELL_WIDTH + (2 * SVG.CELL_PADDING); + const renderAvailabilityStatusCell = () => { + const tombstonedCell = CELL_ATTRS.tombstoned; + switch (availabilityStatusType) { + case 'tombstoned': + return ( + <> + + + No Longer Available + + + ); + case 'available': + default: + /* eslint-disable max-len */ + return ( + <> + + + Available + + + ); + } + }; const renderProvisionalCell = () => { if (!delineateRelease) { return null; @@ -127,10 +211,7 @@ export default function BasicAvailabilityKey(props) { /* eslint-disable max-len */ return ( - - - Available - + {renderAvailabilityStatusCell()} {renderProvisionalCell()} @@ -187,8 +268,10 @@ export default function BasicAvailabilityKey(props) { ); /* eslint-enable max-len */ }; - - return selectionEnabled || delineateRelease ? ( + const renderVerticalLegend = selectionEnabled + || delineateRelease + || VERTICAL_STATUS_TYPES.includes(availabilityStatusType); + return renderVerticalLegend ? (
{renderCellLegend('vertical')} {selectionEnabled ? ( @@ -206,10 +289,12 @@ BasicAvailabilityKey.propTypes = { orientation: PropTypes.string, selectionEnabled: PropTypes.bool, delineateRelease: PropTypes.bool, + availabilityStatusType: PropTypes.oneOf(['available', 'tombstoned']), }; BasicAvailabilityKey.defaultProps = { orientation: '', selectionEnabled: false, delineateRelease: false, + availabilityStatusType: null, }; diff --git a/src/lib_components/components/DataProductAvailability/DataProductAvailability.jsx b/src/lib_components/components/DataProductAvailability/DataProductAvailability.jsx index ec6b8202..1270797f 100644 --- a/src/lib_components/components/DataProductAvailability/DataProductAvailability.jsx +++ b/src/lib_components/components/DataProductAvailability/DataProductAvailability.jsx @@ -35,6 +35,7 @@ DataProductAvailability.propTypes = { sortDirection: PropTypes.oneOf(['ASC', 'DESC']), disableSelection: PropTypes.bool, delineateRelease: PropTypes.bool, + availabilityStatusType: PropTypes.oneOf(['available', 'tombstoned']), }; DataProductAvailability.defaultProps = { @@ -46,6 +47,7 @@ DataProductAvailability.defaultProps = { sortDirection: 'ASC', disableSelection: false, delineateRelease: false, + availabilityStatusType: null, }; const WrappedDataProductAvailability = Theme.getWrappedComponent( diff --git a/src/lib_components/components/DataProductAvailability/EnhancedAvailabilityInterface.jsx b/src/lib_components/components/DataProductAvailability/EnhancedAvailabilityInterface.jsx index 4684e5bc..4d336fbb 100644 --- a/src/lib_components/components/DataProductAvailability/EnhancedAvailabilityInterface.jsx +++ b/src/lib_components/components/DataProductAvailability/EnhancedAvailabilityInterface.jsx @@ -4,7 +4,6 @@ import React, { useCallback, useEffect, useRef, - useState, } from 'react'; import PropTypes from 'prop-types'; @@ -14,12 +13,8 @@ import { makeStyles } from '@material-ui/core/styles'; import useMediaQuery from '@material-ui/core/useMediaQuery'; import FormControl from '@material-ui/core/FormControl'; -import FormControlLabel from '@material-ui/core/FormControlLabel'; -import Hidden from '@material-ui/core/Hidden'; import MenuItem from '@material-ui/core/MenuItem'; -import OutlinedInput from '@material-ui/core/OutlinedInput'; import Select from '@material-ui/core/Select'; -import Switch from '@material-ui/core/Switch'; import ToggleButton from '@material-ui/lab/ToggleButton'; import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup'; import Typography from '@material-ui/core/Typography'; @@ -30,13 +25,12 @@ import DescIcon from '@material-ui/icons/KeyboardArrowUp'; import AvailabilityContext from './AvailabilityContext'; import AvailabilityPending from './AvailabilityPending'; import FullWidthVisualization from '../FullWidthVisualization/FullWidthVisualization'; -import DownloadDataContext from '../DownloadDataContext/DownloadDataContext'; import NeonContext from '../NeonContext/NeonContext'; import Theme from '../Theme/Theme'; import EnhancedAvailabilityKey from './EnhancedAvailabilityKey'; import EnhancedAvailabilityGrid from './EnhancedAvailabilityGrid'; -import { SVG, TIME, AvailabilityPropTypes } from './AvailabilityUtils'; +import { SVG, AvailabilityPropTypes } from './AvailabilityUtils'; import { SvgDefs } from './AvailabilitySvgComponents'; const preStyle = { @@ -83,14 +77,10 @@ const EnhancedAvailabilityInterface = (props) => { const { sites: availabilitySites, ...other } = props; const classes = useStyles(Theme); - const atXs = useMediaQuery(Theme.breakpoints.only('xs')); - const atSm = useMediaQuery(Theme.breakpoints.only('sm')); const [ - { data: neonContextData, isFinal: neonContextIsFinal, hasError: neonContextHasError }, + { isFinal: neonContextIsFinal, hasError: neonContextHasError }, ] = NeonContext.useNeonContextState(); - const { sites: allSites, states: allStates, domains: allDomains } = neonContextData; - const { SORT_DIRECTIONS, useAvailabilityState } = AvailabilityContext; const [availabilityState, availabilityDispatch] = useAvailabilityState(); const { @@ -106,7 +96,6 @@ const EnhancedAvailabilityInterface = (props) => { /** Context-Derived Stuff */ - const downloadContextIsActive = false; const selectionEnabled = false; /** diff --git a/src/lib_components/components/DataProductAvailability/StyleGuide.jsx b/src/lib_components/components/DataProductAvailability/StyleGuide.jsx index 60da1855..b954bbd9 100644 --- a/src/lib_components/components/DataProductAvailability/StyleGuide.jsx +++ b/src/lib_components/components/DataProductAvailability/StyleGuide.jsx @@ -412,6 +412,47 @@ const productData = {...}; `} + + Availability Status Types + + + The DataProductAvailability visualization can show various status types + to adapt to different kinds of availability displays. + + + Valid status types: available, tombstoned + + + Default view: available + + + The availability status type shown below is tombstoned + + + + + + {` +import DataProductAvailability from 'portal-core-components/lib/components/DataProductAvailability'; + +const siteCodes = [...]; + + + `} + + Enhanced Data Product Availability Chart diff --git a/src/lib_components/components/DataProductAvailability/__tests__/__snapshots__/AvailabilitySvgComponents.jsx.snap b/src/lib_components/components/DataProductAvailability/__tests__/__snapshots__/AvailabilitySvgComponents.jsx.snap index b4e3edb2..4774d249 100644 --- a/src/lib_components/components/DataProductAvailability/__tests__/__snapshots__/AvailabilitySvgComponents.jsx.snap +++ b/src/lib_components/components/DataProductAvailability/__tests__/__snapshots__/AvailabilitySvgComponents.jsx.snap @@ -143,6 +143,19 @@ exports[`DataProductAvailability - AvailabilitySvgComponents renders JsxCell cor /> `; +exports[`DataProductAvailability - AvailabilitySvgComponents renders JsxCell correctly for every status JsxCell for status: tombstoned 1`] = ` + +`; + exports[`DataProductAvailability - AvailabilitySvgComponents renders SvgDefs correctly 1`] = ` {}; +const noop = () => { /* NOOP */ }; const breakpoints: number[] = [0, 675, 900, 1200]; const ratios: string[] = ['8:11', '3:4', '4:4', '4:3']; diff --git a/src/lib_components/components/Documents/PdfDocumentViewer.tsx b/src/lib_components/components/Documents/PdfDocumentViewer.tsx index a5d2b162..40b9a1d7 100644 --- a/src/lib_components/components/Documents/PdfDocumentViewer.tsx +++ b/src/lib_components/components/Documents/PdfDocumentViewer.tsx @@ -66,7 +66,7 @@ export interface PdfDocumentViewerProps { fullUrlPath?: string; } -const noop = () => {}; +const noop = () => { /* NOOP */ }; const MIN_PDF_VIEWER_WIDTH = 800; diff --git a/src/lib_components/components/Error/ComponentErrorBoundary.tsx b/src/lib_components/components/Error/ComponentErrorBoundary.tsx index dbfaaf35..8b9ebcbd 100644 --- a/src/lib_components/components/Error/ComponentErrorBoundary.tsx +++ b/src/lib_components/components/Error/ComponentErrorBoundary.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { ErrorBoundary } from 'react-error-boundary'; +import { ErrorBoundary, FallbackProps } from 'react-error-boundary'; import ComponentFallback from './ComponentFallback'; @@ -9,9 +9,10 @@ interface ErrorInfo { } interface ComponentErrorBoundaryProps { - children: React.ReactNode | React.ReactNodeArray; + children: React.ReactNode | React.ReactNode[]; onReset?: (...args: Array) => void; onError?: (error: Error, info: ErrorInfo) => void; + fallbackComponent?: React.ComponentType; } const ComponentErrorBoundary: React.FC = ( @@ -21,10 +22,11 @@ const ComponentErrorBoundary: React.FC = ( children, onReset, onError, + fallbackComponent, }: ComponentErrorBoundaryProps = props; return ( @@ -36,6 +38,7 @@ const ComponentErrorBoundary: React.FC = ( ComponentErrorBoundary.defaultProps = { onReset: (...args: Array): void => {}, onError: (error: Error, info: ErrorInfo): void => {}, + fallbackComponent: undefined, }; export default ComponentErrorBoundary; diff --git a/src/lib_components/components/Error/CustomComponentFallback.tsx b/src/lib_components/components/Error/CustomComponentFallback.tsx new file mode 100644 index 00000000..c49700b5 --- /dev/null +++ b/src/lib_components/components/Error/CustomComponentFallback.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +import { FallbackProps } from 'react-error-boundary'; + +interface CustomComponentFallbackProps extends FallbackProps { + FallbackComponent: React.ComponentType>; +} + +const CustomComponentFallback: React.FC = ( + props: CustomComponentFallbackProps, +): JSX.Element => { + const { FallbackComponent }: CustomComponentFallbackProps = props; + return ( + + ); +}; + +export default CustomComponentFallback; diff --git a/src/lib_components/components/NeonApi/NeonApi.js b/src/lib_components/components/NeonApi/NeonApi.js index f0ca7e23..fd668979 100644 --- a/src/lib_components/components/NeonApi/NeonApi.js +++ b/src/lib_components/components/NeonApi/NeonApi.js @@ -260,6 +260,19 @@ const NeonApi = { return getJsonObservable(path); }, + /** + * Gets the product tombstone availability endpoint + * RxJS Observable for the specified product code and release. + * @param {string} productCode The product code to get for. + * @param {string} release A release to scope the product. + * @return The RxJS Ajax Observable + */ + getProductTombstoneAvailabilityObservable: (productCode, release) => { + const root = NeonEnvironment.getFullApiPath('products'); + const path = `${root}/${productCode}/${release}/tombstone-data-availability`; + return getJsonObservable(path); + }, + /** * Gets the product DOI endpoint RxJS Observable for the specified product code and release. * @param {string} productCode The product code to get for. diff --git a/src/lib_components/components/NeonEnvironment/NeonEnvironment.ts b/src/lib_components/components/NeonEnvironment/NeonEnvironment.ts index 1dca6a74..b000a454 100644 --- a/src/lib_components/components/NeonEnvironment/NeonEnvironment.ts +++ b/src/lib_components/components/NeonEnvironment/NeonEnvironment.ts @@ -46,6 +46,7 @@ export const optionalEnvironmentVars = [ 'REACT_APP_NEON_API_HOST_OVERRIDE', 'REACT_APP_NEON_WEB_HOST_OVERRIDE', 'REACT_APP_NEON_WS_HOST_OVERRIDE', + 'REACT_APP_NEON_FETCH_DRUPAL_ASSETS', ]; const EnvType = { @@ -69,6 +70,7 @@ export interface INeonEnvironment { showAopViewer: boolean; authDisableWs: boolean; enableGlobalSignInState: boolean; + fetchDrupalAssets: boolean; getRootApiPath: () => string; getRootGraphqlPath: () => string; @@ -134,6 +136,7 @@ const NeonEnvironment: INeonEnvironment = { showAopViewer: process.env.REACT_APP_NEON_SHOW_AOP_VIEWER === 'true', authDisableWs: process.env.REACT_APP_NEON_AUTH_DISABLE_WS === 'true', enableGlobalSignInState: process.env.REACT_APP_NEON_ENABLE_GLOBAL_SIGNIN_STATE === 'true', + fetchDrupalAssets: process.env.REACT_APP_NEON_FETCH_DRUPAL_ASSETS !== 'false', getRootApiPath: () => process.env.REACT_APP_NEON_PATH_API || '/api/v0', getRootGraphqlPath: () => process.env.REACT_APP_NEON_PATH_PUBLIC_GRAPHQL || '/graphql', diff --git a/src/lib_components/components/NeonFooter/NeonFooter.jsx b/src/lib_components/components/NeonFooter/NeonFooter.jsx index b36a9764..84f55e73 100644 --- a/src/lib_components/components/NeonFooter/NeonFooter.jsx +++ b/src/lib_components/components/NeonFooter/NeonFooter.jsx @@ -8,6 +8,7 @@ import Skeleton from '@material-ui/lab/Skeleton'; import REMOTE_ASSETS from '../../remoteAssetsMap/remoteAssetsMap'; import DRUPAL_FOOTER_HTML_FALLBACK from '../../remoteAssets/drupal-footer.html'; import NeonContext, { FETCH_STATUS } from '../NeonContext/NeonContext'; +import NeonEnvironment from '../NeonEnvironment/NeonEnvironment'; import Theme from '../Theme/Theme'; const DRUPAL_FOOTER_HTML = REMOTE_ASSETS.DRUPAL_FOOTER_HTML.KEY; @@ -21,7 +22,7 @@ const useStyles = makeStyles((theme) => ({ })); const NeonFooter = (props) => { - const { drupalCssLoaded } = props; + const { drupalCssLoaded, showSkeleton } = props; const classes = useStyles(Theme); const [{ isActive: neonContextIsActive, @@ -39,13 +40,26 @@ const NeonFooter = (props) => { renderMode = drupalCssLoaded ? 'drupal-fallback' : 'loading'; break; default: - renderMode = 'loading'; + if (!NeonEnvironment.fetchDrupalAssets) { + renderMode = 'drupal-fallback'; + } else { + renderMode = 'loading'; + } break; } } + const renderFallback = () => (( +
+ {HTMLReactParser(DRUPAL_FOOTER_HTML_FALLBACK)} +
+ )); + switch (renderMode) { case 'loading': + if (!showSkeleton) { + return renderFallback(); + } return (
@@ -61,20 +75,18 @@ const NeonFooter = (props) => { case 'drupal-fallback': default: - return ( -
- {HTMLReactParser(DRUPAL_FOOTER_HTML_FALLBACK)} -
- ); + return renderFallback(); } }; NeonFooter.propTypes = { drupalCssLoaded: PropTypes.bool, + showSkeleton: PropTypes.bool, }; NeonFooter.defaultProps = { drupalCssLoaded: false, + showSkeleton: false, }; export default NeonFooter; diff --git a/src/lib_components/components/NeonFooter/__tests__/__snapshots__/NeonFooter.jsx.snap b/src/lib_components/components/NeonFooter/__tests__/__snapshots__/NeonFooter.jsx.snap index dcbd4476..21adebce 100644 --- a/src/lib_components/components/NeonFooter/__tests__/__snapshots__/NeonFooter.jsx.snap +++ b/src/lib_components/components/NeonFooter/__tests__/__snapshots__/NeonFooter.jsx.snap @@ -23,33 +23,23 @@ exports[`NeonFooter renders with drupalCssLoaded prop and success NeonContext st exports[`NeonFooter renders with no props and active/fetching NeonContext state 1`] = `
-
+
+ MOCK-FALLBACK-DRUPAL-FOOTER-HTML +
`; exports[`NeonFooter renders with no props and error NeonContext state 1`] = `
- +
+ MOCK-FALLBACK-DRUPAL-FOOTER-HTML +
`; @@ -66,16 +56,11 @@ exports[`NeonFooter renders with no props and inactive NeonContext state 1`] = ` exports[`NeonFooter renders with no props and success NeonContext state 1`] = `
- +
+ MOCK-FALLBACK-DRUPAL-FOOTER-HTML +
`; diff --git a/src/lib_components/components/NeonHeader/NeonHeader.jsx b/src/lib_components/components/NeonHeader/NeonHeader.jsx index de6250c1..4461ecda 100644 --- a/src/lib_components/components/NeonHeader/NeonHeader.jsx +++ b/src/lib_components/components/NeonHeader/NeonHeader.jsx @@ -17,6 +17,7 @@ import NeonContext, { FETCH_STATUS } from '../NeonContext/NeonContext'; import ApplicationMenu from './ApplicationMenu'; import HeaderSearchSvg from '../../images/svg/header-search.svg'; +import HeaderSearchHoverSvg from '../../images/svg/header-search-hover.svg'; const DRUPAL_HEADER_HTML = REMOTE_ASSETS.DRUPAL_HEADER_HTML.KEY; @@ -79,6 +80,9 @@ const useStyles = makeStyles((theme) => ({ '& li.siteSearch > a': { background: `url('${HeaderSearchSvg}') center center no-repeat !important`, }, + '& li.siteSearch > a:hover': { + background: `url('${HeaderSearchHoverSvg}') center center no-repeat !important`, + }, }, // Injecting these styles as a means of fixing up the search display // Ideally, this CSS comes from Drupal and is removed from here... @@ -302,6 +306,7 @@ const NeonHeader = forwardRef((props, headerRef) => { const { drupalCssLoaded, unstickyDrupalHeader, + showSkeleton, } = props; const classes = useStyles(Theme); const belowLg = useMediaQuery(Theme.breakpoints.down('md')); @@ -330,13 +335,25 @@ const NeonHeader = forwardRef((props, headerRef) => { renderMode = drupalCssLoaded ? 'drupal-fallback' : 'loading'; break; default: - renderMode = 'loading'; + if (!NeonEnvironment.fetchDrupalAssets) { + renderMode = 'drupal-fallback'; + } else { + renderMode = 'loading'; + } break; } } // Load header.js only after initial delayed render of the drupal header is complete useLayoutEffect(() => { + if (!NeonEnvironment.fetchDrupalAssets) { + (async () => { + // eslint-disable-next-line no-unused-expressions, import/extensions + await import('../../remoteAssets/drupal-header.js'); + setHeaderJsStatus(FETCH_STATUS.SUCCESS); + })(); + return; + } if ( !renderMode.includes('drupal') || headerJsStatus !== FETCH_STATUS.AWAITING_CALL || !headerRenderDelayed || !drupalCssLoaded @@ -349,6 +366,7 @@ const NeonHeader = forwardRef((props, headerRef) => { }; script.onerror = () => { (async () => { + script.remove(); // eslint-disable-next-line no-unused-expressions, import/extensions await import('../../remoteAssets/drupal-header.js'); setHeaderJsStatus(FETCH_STATUS.SUCCESS); @@ -385,7 +403,7 @@ const NeonHeader = forwardRef((props, headerRef) => { ]); // Render Loading - if (renderMode === 'loading') { + if ((renderMode === 'loading') && showSkeleton) { return (
} customFooter={
Header
}> + Header} customFooter={
Header
} showHeaderSkeleton showFooterSkeleton>
content
, ).toJSON(); @@ -78,7 +84,7 @@ describe('NeonPage', () => { }); test('renders with custom sidebar content', () => { const tree = renderer.create( - Sidebar}> + Sidebar} showHeaderSkeleton showFooterSkeleton>
content
, ).toJSON(); @@ -86,7 +92,7 @@ describe('NeonPage', () => { }); test('renders sidebar items as skeletons when in appropriate state', () => { const tree = renderer.create( - Sidebar} sidebarTitle="foo" loading="Loading"> + Sidebar} sidebarTitle="foo" loading="Loading" showHeaderSkeleton showFooterSkeleton>
content
, ).toJSON(); @@ -107,6 +113,8 @@ describe('NeonPage', () => { sidebarTitle="foo" sidebarSubtitle="bar" sidebarLinksAdditionalContent={
More
} + showHeaderSkeleton + showFooterSkeleton >
content
, @@ -127,6 +135,8 @@ describe('NeonPage', () => { sidebarUnsticky sidebarContainerClassName="sidebarClassName" sidebarLinksAsStandaloneChildren + showHeaderSkeleton + showFooterSkeleton >
content
, diff --git a/src/lib_components/components/NeonPage/__tests__/__snapshots__/NeonPage.jsx.snap b/src/lib_components/components/NeonPage/__tests__/__snapshots__/NeonPage.jsx.snap index 2a9ed33d..b873318f 100644 --- a/src/lib_components/components/NeonPage/__tests__/__snapshots__/NeonPage.jsx.snap +++ b/src/lib_components/components/NeonPage/__tests__/__snapshots__/NeonPage.jsx.snap @@ -2,24 +2,24 @@ exports[`NeonPage NeonErrorPage 1`] = `
NEON Data Portal

@@ -31,7 +31,7 @@ exports[`NeonPage NeonErrorPage 1`] = `

fail @@ -210,7 +210,7 @@ Array [ /> ,