@synerise/ds-metric-card 1.2.10 → 1.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.2.11](https://github.com/Synerise/synerise-design/compare/@synerise/ds-metric-card@1.2.10...@synerise/ds-metric-card@1.2.11) (2026-03-24)
7
+
8
+ **Note:** Version bump only for package @synerise/ds-metric-card
9
+
6
10
  ## [1.2.10](https://github.com/Synerise/synerise-design/compare/@synerise/ds-metric-card@1.2.9...@synerise/ds-metric-card@1.2.10) (2026-03-20)
7
11
 
8
12
  **Note:** Version bump only for package @synerise/ds-metric-card
@@ -1,4 +1,4 @@
1
- import React from 'react';
2
- import type { MetricCardProps } from './MetricCard.types';
1
+ import { default as React } from 'react';
2
+ import { MetricCardProps } from './MetricCard.types';
3
3
  declare const MetricCard: ({ title, headerRightSide, hoverValue, displayValue, tooltip, tooltipConfig, greyBackground, isLoading, errorMessage, copyValue, texts, ...htmlAttributes }: MetricCardProps) => React.JSX.Element;
4
4
  export default MetricCard;
@@ -1,77 +1,53 @@
1
- var _excluded = ["title", "headerRightSide", "hoverValue", "displayValue", "tooltip", "tooltipConfig", "greyBackground", "isLoading", "errorMessage", "copyValue", "texts"];
2
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
4
- import React, { useMemo, useState } from 'react';
5
- import Icon, { InfoFillS } from '@synerise/ds-icon';
6
- import Tooltip from '@synerise/ds-tooltip';
7
- import { Text } from '@synerise/ds-typography';
8
- import * as S from './MetricCard.styles';
9
- var MetricCard = function MetricCard(_ref) {
10
- var title = _ref.title,
11
- headerRightSide = _ref.headerRightSide,
12
- hoverValue = _ref.hoverValue,
13
- displayValue = _ref.displayValue,
14
- tooltip = _ref.tooltip,
15
- tooltipConfig = _ref.tooltipConfig,
16
- greyBackground = _ref.greyBackground,
17
- isLoading = _ref.isLoading,
18
- errorMessage = _ref.errorMessage,
19
- copyValue = _ref.copyValue,
20
- texts = _ref.texts,
21
- htmlAttributes = _objectWithoutPropertiesLoose(_ref, _excluded);
22
- var hasValue = Boolean(hoverValue) || Boolean(displayValue);
23
- var tooltipVisible = Boolean(tooltip || tooltipConfig);
24
- var _useState = useState(false),
25
- hover = _useState[0],
26
- setHover = _useState[1];
27
- var content = useMemo(function () {
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useMemo } from "react";
3
+ import Icon, { InfoFillS } from "@synerise/ds-icon";
4
+ import Tooltip from "@synerise/ds-tooltip";
5
+ import { Text } from "@synerise/ds-typography";
6
+ import { MetricSkeleton, MetricInlineAlert, MetricValue, WrapperFormattedNumber, WrapperNumber, MetricContainer, MetricHeaderBar, TitleWrapper, IconWrapper, HeaderRightSide, MetricContent, WrapperCopyIcon, CopyIcon } from "./MetricCard.styles.js";
7
+ const MetricCard = ({
8
+ title,
9
+ headerRightSide,
10
+ hoverValue,
11
+ displayValue,
12
+ tooltip,
13
+ tooltipConfig,
14
+ greyBackground,
15
+ isLoading,
16
+ errorMessage,
17
+ copyValue,
18
+ texts,
19
+ ...htmlAttributes
20
+ }) => {
21
+ const hasValue = Boolean(hoverValue) || Boolean(displayValue);
22
+ const tooltipVisible = Boolean(tooltip || tooltipConfig);
23
+ const [hover, setHover] = useState(false);
24
+ const content = useMemo(() => {
28
25
  if (isLoading) {
29
- return /*#__PURE__*/React.createElement(S.MetricSkeleton, {
30
- size: "S",
31
- width: "M",
32
- height: 32,
33
- numberOfSkeletons: 1
34
- });
26
+ return /* @__PURE__ */ jsx(MetricSkeleton, { size: "S", width: "M", height: 32, numberOfSkeletons: 1 });
35
27
  }
36
- return errorMessage ? /*#__PURE__*/React.createElement(S.MetricInlineAlert, {
37
- type: "alert",
38
- message: errorMessage
39
- }) : /*#__PURE__*/React.createElement(S.MetricValue, {
40
- ellipsis: {
41
- tooltip: hoverValue || displayValue
42
- }
43
- }, /*#__PURE__*/React.createElement(S.WrapperFormattedNumber, null, displayValue), /*#__PURE__*/React.createElement(S.WrapperNumber, null, hoverValue || displayValue));
28
+ return errorMessage ? /* @__PURE__ */ jsx(MetricInlineAlert, { type: "alert", message: errorMessage }) : /* @__PURE__ */ jsxs(MetricValue, { ellipsis: {
29
+ tooltip: hoverValue || displayValue
30
+ }, children: [
31
+ /* @__PURE__ */ jsx(WrapperFormattedNumber, { children: displayValue }),
32
+ /* @__PURE__ */ jsx(WrapperNumber, { children: hoverValue || displayValue })
33
+ ] });
44
34
  }, [displayValue, errorMessage, hoverValue, isLoading]);
45
- return /*#__PURE__*/React.createElement(S.MetricContainer, _extends({
46
- p: "8px 8px 14px 24px",
47
- radius: 3,
48
- greyBackground: greyBackground
49
- }, htmlAttributes), /*#__PURE__*/React.createElement(S.MetricHeaderBar, null, /*#__PURE__*/React.createElement(S.TitleWrapper, {
50
- header: Boolean(headerRightSide)
51
- }, /*#__PURE__*/React.createElement(Text, {
52
- ellipsis: {
53
- tooltip: title
54
- }
55
- }, title), tooltipVisible && /*#__PURE__*/React.createElement(Tooltip, _extends({
56
- title: tooltip,
57
- placement: "top",
58
- trigger: "hover"
59
- }, tooltipConfig), /*#__PURE__*/React.createElement(S.IconWrapper, null, /*#__PURE__*/React.createElement(Icon, {
60
- size: 24,
61
- component: /*#__PURE__*/React.createElement(InfoFillS, null)
62
- })))), headerRightSide && /*#__PURE__*/React.createElement(S.HeaderRightSide, null, headerRightSide)), /*#__PURE__*/React.createElement(S.MetricContent, {
63
- "data-testid": "ds-metric-card",
64
- className: hover ? 'hovered' : '',
65
- onMouseEnter: function onMouseEnter() {
66
- return setHover(true);
67
- },
68
- onMouseLeave: function onMouseLeave() {
69
- return setHover(false);
70
- },
71
- copyable: hasValue
72
- }, content, typeof copyValue === 'string' && hover && /*#__PURE__*/React.createElement(S.WrapperCopyIcon, null, /*#__PURE__*/React.createElement(S.CopyIcon, {
73
- copyValue: copyValue,
74
- texts: texts
75
- }))));
35
+ return /* @__PURE__ */ jsxs(MetricContainer, { p: "8px 8px 14px 24px", radius: 3, greyBackground, ...htmlAttributes, children: [
36
+ /* @__PURE__ */ jsxs(MetricHeaderBar, { children: [
37
+ /* @__PURE__ */ jsxs(TitleWrapper, { header: Boolean(headerRightSide), children: [
38
+ /* @__PURE__ */ jsx(Text, { ellipsis: {
39
+ tooltip: title
40
+ }, children: title }),
41
+ tooltipVisible && /* @__PURE__ */ jsx(Tooltip, { title: tooltip, placement: "top", trigger: "hover", ...tooltipConfig, children: /* @__PURE__ */ jsx(IconWrapper, { children: /* @__PURE__ */ jsx(Icon, { size: 24, component: /* @__PURE__ */ jsx(InfoFillS, {}) }) }) })
42
+ ] }),
43
+ headerRightSide && /* @__PURE__ */ jsx(HeaderRightSide, { children: headerRightSide })
44
+ ] }),
45
+ /* @__PURE__ */ jsxs(MetricContent, { "data-testid": "ds-metric-card", className: hover ? "hovered" : "", onMouseEnter: () => setHover(true), onMouseLeave: () => setHover(false), copyable: hasValue, children: [
46
+ content,
47
+ typeof copyValue === "string" && hover && /* @__PURE__ */ jsx(WrapperCopyIcon, { children: /* @__PURE__ */ jsx(CopyIcon, { copyValue, texts }) })
48
+ ] })
49
+ ] });
50
+ };
51
+ export {
52
+ MetricCard as default
76
53
  };
77
- export default MetricCard;
@@ -1,23 +1,23 @@
1
- export declare const WrapperFormattedNumber: import("styled-components").StyledComponent<"div", any, {}, never>;
2
- export declare const WrapperNumber: import("styled-components").StyledComponent<"div", any, {}, never>;
3
- export declare const MetricContainer: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<Omit<import("@synerise/ds-panel").PanelProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>, any, {}, never>;
4
- export declare const CopyIcon: import("styled-components").StyledComponent<({ copyValue, texts, onMouseEnter, onMouseLeave, icon, placement, onCopy, onClick, ...rest }: import("@synerise/ds-copy-icon").CopyIconProps) => React.JSX.Element, any, {}, never>;
5
- export declare const MetricSkeleton: import("styled-components").StyledComponent<({ size, numberOfSkeletons, width, height, className, }: import("@synerise/ds-skeleton").SkeletonProps) => React.JSX.Element, any, {}, never>;
6
- export declare const MetricInlineAlert: import("styled-components").StyledComponent<({ className, type, message, withLink, withEmphasis, hoverButton, disabled, customIcon, ...rest }: import("@synerise/ds-inline-alert").InlineAlertProps) => React.JSX.Element, any, {}, never>;
7
- export declare const MetricContent: import("styled-components").StyledComponent<"div", any, {
1
+ export declare const WrapperFormattedNumber: import('styled-components').StyledComponent<"div", any, {}, never>;
2
+ export declare const WrapperNumber: import('styled-components').StyledComponent<"div", any, {}, never>;
3
+ export declare const MetricContainer: import('styled-components').StyledComponent<import('react').ForwardRefExoticComponent<Omit<import('@synerise/ds-panel').PanelProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>, any, {}, never>;
4
+ export declare const CopyIcon: import('styled-components').StyledComponent<({ copyValue, texts, onMouseEnter, onMouseLeave, icon, placement, onCopy, onClick, ...rest }: import('@synerise/ds-copy-icon').CopyIconProps) => React.JSX.Element, any, {}, never>;
5
+ export declare const MetricSkeleton: import('styled-components').StyledComponent<({ size, numberOfSkeletons, width, height, className, }: import('@synerise/ds-skeleton').SkeletonProps) => React.JSX.Element, any, {}, never>;
6
+ export declare const MetricInlineAlert: import('styled-components').StyledComponent<({ className, type, message, withLink, withEmphasis, hoverButton, disabled, customIcon, ...rest }: import('@synerise/ds-inline-alert').InlineAlertProps) => React.JSX.Element, any, {}, never>;
7
+ export declare const MetricContent: import('styled-components').StyledComponent<"div", any, {
8
8
  copyable?: boolean;
9
9
  }, never>;
10
- export declare const MetricValue: import("styled-components").StyledComponent<({ size, className, children, ellipsis, style, }: {
11
- size?: import("@synerise/ds-typography").TextSize;
12
- ellipsis?: import("@synerise/ds-typography/dist/Ellipsis").EllipsisProps;
13
- children?: import("react").ReactNode;
10
+ export declare const MetricValue: import('styled-components').StyledComponent<({ size, className, children, ellipsis, style, }: {
11
+ size?: import('@synerise/ds-typography').TextSize;
12
+ ellipsis?: import('@synerise/ds-typography/dist/Ellipsis').EllipsisProps;
13
+ children?: import('react').ReactNode;
14
14
  className?: string;
15
- style?: import("react").CSSProperties;
15
+ style?: import('react').CSSProperties;
16
16
  }) => React.JSX.Element, any, {}, never>;
17
- export declare const MetricHeaderBar: import("styled-components").StyledComponent<"div", any, {}, never>;
18
- export declare const TitleWrapper: import("styled-components").StyledComponent<"div", any, {
17
+ export declare const MetricHeaderBar: import('styled-components').StyledComponent<"div", any, {}, never>;
18
+ export declare const TitleWrapper: import('styled-components').StyledComponent<"div", any, {
19
19
  header?: boolean;
20
20
  }, never>;
21
- export declare const IconWrapper: import("styled-components").StyledComponent<"span", any, {}, never>;
22
- export declare const HeaderRightSide: import("styled-components").StyledComponent<"div", any, {}, never>;
23
- export declare const WrapperCopyIcon: import("styled-components").StyledComponent<"div", any, {}, never>;
21
+ export declare const IconWrapper: import('styled-components').StyledComponent<"span", any, {}, never>;
22
+ export declare const HeaderRightSide: import('styled-components').StyledComponent<"div", any, {}, never>;
23
+ export declare const WrapperCopyIcon: import('styled-components').StyledComponent<"div", any, {}, never>;
@@ -1,64 +1,75 @@
1
- import styled, { css } from 'styled-components';
2
- import Copy from '@synerise/ds-copy-icon';
3
- import InlineAlert from '@synerise/ds-inline-alert';
4
- import Panel from '@synerise/ds-panel';
5
- import Skeleton from '@synerise/ds-skeleton';
6
- import { Text } from '@synerise/ds-typography';
7
- export var WrapperFormattedNumber = styled.div.withConfig({
1
+ import styled, { css } from "styled-components";
2
+ import Copy from "@synerise/ds-copy-icon";
3
+ import InlineAlert from "@synerise/ds-inline-alert";
4
+ import Panel from "@synerise/ds-panel";
5
+ import Skeleton from "@synerise/ds-skeleton";
6
+ import { Text } from "@synerise/ds-typography";
7
+ const WrapperFormattedNumber = /* @__PURE__ */ styled.div.withConfig({
8
8
  displayName: "MetricCardstyles__WrapperFormattedNumber",
9
9
  componentId: "sc-1g748a8-0"
10
10
  })(["display:inline;"]);
11
- export var WrapperNumber = styled.div.withConfig({
11
+ const WrapperNumber = /* @__PURE__ */ styled.div.withConfig({
12
12
  displayName: "MetricCardstyles__WrapperNumber",
13
13
  componentId: "sc-1g748a8-1"
14
14
  })(["display:none;"]);
15
- export var MetricContainer = styled(Panel).withConfig({
15
+ const MetricContainer = /* @__PURE__ */ styled(Panel).withConfig({
16
16
  displayName: "MetricCardstyles__MetricContainer",
17
17
  componentId: "sc-1g748a8-2"
18
18
  })(["display:flex;flex-direction:column;gap:2px;width:100%;"]);
19
- export var CopyIcon = styled(Copy).withConfig({
19
+ const CopyIcon = /* @__PURE__ */ styled(Copy).withConfig({
20
20
  displayName: "MetricCardstyles__CopyIcon",
21
21
  componentId: "sc-1g748a8-3"
22
22
  })(["margin-left:8px;visibility:hidden;opacity:0;transition:opacity 0.15s ease;"]);
23
- export var MetricSkeleton = styled(Skeleton).withConfig({
23
+ const MetricSkeleton = /* @__PURE__ */ styled(Skeleton).withConfig({
24
24
  displayName: "MetricCardstyles__MetricSkeleton",
25
25
  componentId: "sc-1g748a8-4"
26
26
  })(["padding:0 0 2px;width:50%;"]);
27
- export var MetricInlineAlert = styled(InlineAlert).withConfig({
27
+ const MetricInlineAlert = /* @__PURE__ */ styled(InlineAlert).withConfig({
28
28
  displayName: "MetricCardstyles__MetricInlineAlert",
29
29
  componentId: "sc-1g748a8-5"
30
30
  })(["padding:8px 0 2px;"]);
31
- export var MetricContent = styled.div.withConfig({
31
+ const MetricContent = /* @__PURE__ */ styled.div.withConfig({
32
32
  displayName: "MetricCardstyles__MetricContent",
33
33
  componentId: "sc-1g748a8-6"
34
- })(["flex:1;min-width:0;display:flex;align-items:center;overflow:hidden;margin:0 4px 2px 0;", "{", "}&.hovered{", "{visibility:visible;opacity:1;}", "{display:none;}", "{display:inline;}}"], CopyIcon, function (props) {
34
+ })(["flex:1;min-width:0;display:flex;align-items:center;overflow:hidden;margin:0 4px 2px 0;", "{", "}&.hovered{", "{visibility:visible;opacity:1;}", "{display:none;}", "{display:inline;}}"], CopyIcon, (props) => {
35
35
  return props.copyable && css(["cursor:pointer;"]);
36
36
  }, CopyIcon, WrapperFormattedNumber, WrapperNumber);
37
- export var MetricValue = styled(Text).withConfig({
37
+ const MetricValue = /* @__PURE__ */ styled(Text).withConfig({
38
38
  displayName: "MetricCardstyles__MetricValue",
39
39
  componentId: "sc-1g748a8-7"
40
- })(["color:", ";font-size:32px;line-height:100%;padding-bottom:2px;align-items:center;cursor:pointer;font-weight:500;justify-content:start;"], function (props) {
41
- return props.theme.palette['grey-800'];
42
- });
43
- export var MetricHeaderBar = styled.div.withConfig({
40
+ })(["color:", ";font-size:32px;line-height:100%;padding-bottom:2px;align-items:center;cursor:pointer;font-weight:500;justify-content:start;"], (props) => props.theme.palette["grey-800"]);
41
+ const MetricHeaderBar = /* @__PURE__ */ styled.div.withConfig({
44
42
  displayName: "MetricCardstyles__MetricHeaderBar",
45
43
  componentId: "sc-1g748a8-8"
46
44
  })(["display:flex;align-items:center;justify-content:space-between;"]);
47
- export var TitleWrapper = styled.div.withConfig({
45
+ const TitleWrapper = /* @__PURE__ */ styled.div.withConfig({
48
46
  displayName: "MetricCardstyles__TitleWrapper",
49
47
  componentId: "sc-1g748a8-9"
50
48
  })(["flex:1;min-width:0;display:flex;align-items:center;min-height:32px;"]);
51
- export var IconWrapper = styled.span.withConfig({
49
+ const IconWrapper = /* @__PURE__ */ styled.span.withConfig({
52
50
  displayName: "MetricCardstyles__IconWrapper",
53
51
  componentId: "sc-1g748a8-10"
54
- })(["display:inline-block;color:", ";cursor:pointer;"], function (props) {
55
- return props.theme.palette['grey-400'];
56
- });
57
- export var HeaderRightSide = styled.div.withConfig({
52
+ })(["display:inline-block;color:", ";cursor:pointer;"], (props) => props.theme.palette["grey-400"]);
53
+ const HeaderRightSide = /* @__PURE__ */ styled.div.withConfig({
58
54
  displayName: "MetricCardstyles__HeaderRightSide",
59
55
  componentId: "sc-1g748a8-11"
60
56
  })(["flex-shrink:0;display:flex;align-items:center;"]);
61
- export var WrapperCopyIcon = styled.div.withConfig({
57
+ const WrapperCopyIcon = /* @__PURE__ */ styled.div.withConfig({
62
58
  displayName: "MetricCardstyles__WrapperCopyIcon",
63
59
  componentId: "sc-1g748a8-12"
64
- })(["flex-shrink:0;display:flex;align-items:center;"]);
60
+ })(["flex-shrink:0;display:flex;align-items:center;"]);
61
+ export {
62
+ CopyIcon,
63
+ HeaderRightSide,
64
+ IconWrapper,
65
+ MetricContainer,
66
+ MetricContent,
67
+ MetricHeaderBar,
68
+ MetricInlineAlert,
69
+ MetricSkeleton,
70
+ MetricValue,
71
+ TitleWrapper,
72
+ WrapperCopyIcon,
73
+ WrapperFormattedNumber,
74
+ WrapperNumber
75
+ };
@@ -1,6 +1,6 @@
1
- import { type ReactNode } from 'react';
2
- import { type TooltipProps } from '@synerise/ds-tooltip';
3
- import { type WithHTMLAttributes } from '@synerise/ds-utils';
1
+ import { ReactNode } from 'react';
2
+ import { TooltipProps } from '@synerise/ds-tooltip';
3
+ import { WithHTMLAttributes } from '@synerise/ds-utils';
4
4
  export type MetricCardProps = WithHTMLAttributes<HTMLDivElement, {
5
5
  title?: ReactNode;
6
6
  headerRightSide?: ReactNode;
@@ -1 +1 @@
1
- export {};
1
+
package/dist/index.js CHANGED
@@ -1 +1,4 @@
1
- export { default } from './MetricCard';
1
+ import { default as default2 } from "./MetricCard.js";
2
+ export {
3
+ default2 as default
4
+ };
package/dist/modules.d.js CHANGED
@@ -1 +1 @@
1
- import '@testing-library/jest-dom';
1
+ import "@testing-library/jest-dom";
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-metric-card",
3
- "version": "1.2.10",
3
+ "version": "1.2.11",
4
4
  "description": "MetricCard UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -16,10 +16,10 @@
16
16
  "access": "public"
17
17
  },
18
18
  "scripts": {
19
- "build": "pnpm run build:js && pnpm run build:css && pnpm run defs",
19
+ "build": "vite build",
20
20
  "build:css": "node ../../../scripts/style/less.js",
21
21
  "build:js": "babel --delete-dir-on-start --root-mode upward src --out-dir dist --extensions '.js,.ts,.tsx'",
22
- "build:watch": "pnpm run build:js -- --watch",
22
+ "build:watch": "vite build --watch",
23
23
  "defs": "tsc --declaration --outDir dist/ --emitDeclarationOnly",
24
24
  "prepublish": "pnpm run build",
25
25
  "types": "tsc --noEmit",
@@ -35,16 +35,16 @@
35
35
  ],
36
36
  "types": "dist/index.d.ts",
37
37
  "dependencies": {
38
- "@synerise/ds-copy-icon": "^1.2.1",
39
- "@synerise/ds-icon": "^1.15.0",
40
- "@synerise/ds-inline-alert": "^1.1.14",
41
- "@synerise/ds-panel": "^1.2.2",
42
- "@synerise/ds-skeleton": "^1.0.44",
43
- "@synerise/ds-tooltip": "^1.4.9",
44
- "@synerise/ds-typography": "^1.1.12"
38
+ "@synerise/ds-copy-icon": "^1.2.2",
39
+ "@synerise/ds-icon": "^1.15.1",
40
+ "@synerise/ds-inline-alert": "^1.1.15",
41
+ "@synerise/ds-panel": "^1.2.3",
42
+ "@synerise/ds-skeleton": "^1.0.45",
43
+ "@synerise/ds-tooltip": "^1.4.10",
44
+ "@synerise/ds-typography": "^1.1.13"
45
45
  },
46
46
  "devDependencies": {
47
- "@synerise/ds-utils": "^1.7.0"
47
+ "@synerise/ds-utils": "^1.7.1"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@synerise/ds-core": "*",
@@ -52,5 +52,5 @@
52
52
  "react-intl": ">=3.12.0 <= 6.8",
53
53
  "styled-components": "^5.3.3"
54
54
  },
55
- "gitHead": "8efc031fa688c0b87c7b3915bae93546bb63bcac"
55
+ "gitHead": "e4ecca8944fc9b41c1b9d59c8bcad5e5e2013225"
56
56
  }