@carbon/react 1.107.1 → 1.108.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +965 -965
  2. package/es/components/Button/Button.d.ts +2 -2
  3. package/es/components/ChatButton/ChatButton.d.ts +1 -1
  4. package/es/components/ChatButton/ChatButton.js +1 -1
  5. package/es/components/ComposedModal/ComposedModal.js +10 -5
  6. package/es/components/ErrorBoundary/ErrorBoundaryContext.d.ts +1 -1
  7. package/es/components/ErrorBoundary/ErrorBoundaryContext.js +1 -1
  8. package/es/components/FileUploader/FileUploader.d.ts +5 -0
  9. package/es/components/FileUploader/FileUploader.js +14 -6
  10. package/es/components/FileUploader/FileUploaderItem.d.ts +5 -1
  11. package/es/components/FileUploader/FileUploaderItem.js +4 -2
  12. package/es/components/FileUploader/Filename.d.ts +5 -1
  13. package/es/components/FileUploader/Filename.js +2 -1
  14. package/es/components/Menu/MenuItem.js +13 -5
  15. package/es/components/Modal/Modal.js +22 -12
  16. package/es/components/Modal/isTopmostVisibleModal.d.ts +7 -0
  17. package/es/components/Modal/isTopmostVisibleModal.js +21 -0
  18. package/es/components/MultiSelect/FilterableMultiSelect.js +9 -8
  19. package/es/components/MultiSelect/MultiSelect.js +9 -8
  20. package/es/components/MultiSelect/tools/isSelectAllItem.d.ts +9 -0
  21. package/es/components/MultiSelect/tools/isSelectAllItem.js +17 -0
  22. package/es/components/MultiSelect/tools/sorting.js +1 -1
  23. package/es/components/PageHeader/PageHeader.d.ts +4 -0
  24. package/es/components/PageHeader/PageHeader.js +18 -0
  25. package/es/components/PageHeader/index.d.ts +4 -0
  26. package/es/components/UIShell/SwitcherDivider.d.ts +2 -2
  27. package/es/components/UIShell/SwitcherDivider.js +2 -2
  28. package/es/internal/warning.d.ts +1 -1
  29. package/lib/components/Button/Button.d.ts +2 -2
  30. package/lib/components/ChatButton/ChatButton.d.ts +1 -1
  31. package/lib/components/ChatButton/ChatButton.js +1 -1
  32. package/lib/components/ComposedModal/ComposedModal.js +10 -5
  33. package/lib/components/ErrorBoundary/ErrorBoundaryContext.d.ts +1 -1
  34. package/lib/components/ErrorBoundary/ErrorBoundaryContext.js +1 -1
  35. package/lib/components/FileUploader/FileUploader.d.ts +5 -0
  36. package/lib/components/FileUploader/FileUploader.js +14 -6
  37. package/lib/components/FileUploader/FileUploaderItem.d.ts +5 -1
  38. package/lib/components/FileUploader/FileUploaderItem.js +4 -2
  39. package/lib/components/FileUploader/Filename.d.ts +5 -1
  40. package/lib/components/FileUploader/Filename.js +2 -1
  41. package/lib/components/Menu/MenuItem.js +12 -4
  42. package/lib/components/Modal/Modal.js +22 -12
  43. package/lib/components/Modal/isTopmostVisibleModal.d.ts +7 -0
  44. package/lib/components/Modal/isTopmostVisibleModal.js +21 -0
  45. package/lib/components/MultiSelect/FilterableMultiSelect.js +9 -8
  46. package/lib/components/MultiSelect/MultiSelect.js +9 -8
  47. package/lib/components/MultiSelect/tools/isSelectAllItem.d.ts +9 -0
  48. package/lib/components/MultiSelect/tools/isSelectAllItem.js +17 -0
  49. package/lib/components/MultiSelect/tools/sorting.js +3 -3
  50. package/lib/components/PageHeader/PageHeader.d.ts +4 -0
  51. package/lib/components/PageHeader/PageHeader.js +18 -0
  52. package/lib/components/PageHeader/index.d.ts +4 -0
  53. package/lib/components/UIShell/SwitcherDivider.d.ts +2 -2
  54. package/lib/components/UIShell/SwitcherDivider.js +2 -2
  55. package/lib/internal/warning.d.ts +1 -1
  56. package/lib/internal/warning.js +1 -1
  57. package/package.json +10 -10
@@ -24,6 +24,7 @@ const require_FormContext = require("../FluidForm/FormContext.js");
24
24
  const require_index$3 = require("../ListBox/index.js");
25
25
  const require_mergeRefs = require("../../tools/mergeRefs.js");
26
26
  const require_MultiSelectPropTypes = require("./MultiSelectPropTypes.js");
27
+ const require_isSelectAllItem = require("./tools/isSelectAllItem.js");
27
28
  const require_sorting = require("./tools/sorting.js");
28
29
  const require_Selection = require("../../internal/Selection.js");
29
30
  let classnames = require("classnames");
@@ -55,7 +56,7 @@ const MultiSelect = react.default.forwardRef(({ autoAlign = false, className: co
55
56
  return true;
56
57
  });
57
58
  }, [items]);
58
- const selectAll = filteredItems.some((item) => item.isSelectAll);
59
+ const selectAll = filteredItems.some(require_isSelectAllItem.isSelectAllItem);
59
60
  const prefix = require_usePrefix.usePrefix();
60
61
  const { isFluid } = (0, react.useContext)(require_FormContext.FormContext);
61
62
  const multiSelectInstanceId = require_useId.useId();
@@ -285,7 +286,7 @@ const MultiSelect = react.default.forwardRef(({ autoAlign = false, className: co
285
286
  const candidate = slug ?? decorator;
286
287
  const normalizedDecorator = require_utils.isComponentElement(candidate, require_index$1.AILabel) ? (0, react.cloneElement)(candidate, { size: "mini" }) : candidate;
287
288
  const itemsSelectedText = selectedItems.length > 0 && selectedItems.map((item) => item?.text);
288
- const selectedItemsLength = selectAll ? selectedItems.filter((item) => !item.isSelectAll).length : selectedItems.length;
289
+ const selectedItemsLength = selectAll ? selectedItems.filter((item) => !require_isSelectAllItem.isSelectAllItem(item)).length : selectedItems.length;
289
290
  const menuProps = (0, react.useMemo)(() => getMenuProps({
290
291
  ref: enableFloatingStyles ? refs.setFloating : null,
291
292
  hidden: !isOpen
@@ -299,9 +300,9 @@ const MultiSelect = react.default.forwardRef(({ autoAlign = false, className: co
299
300
  const labelProps = (0, react.isValidElement)(titleText) ? { id: allLabelProps.id } : allLabelProps;
300
301
  const getSelectionStats = (0, react.useCallback)((selectedItems, filteredItems) => {
301
302
  return {
302
- hasIndividualSelections: selectedItems.some((selected) => !selected.isSelectAll),
303
- nonSelectAllSelectedCount: selectedItems.filter((selected) => !selected.isSelectAll).length,
304
- totalSelectableCount: filteredItems.filter((item) => !item.isSelectAll && !item.disabled).length
303
+ hasIndividualSelections: selectedItems.some((selected) => !require_isSelectAllItem.isSelectAllItem(selected)),
304
+ nonSelectAllSelectedCount: selectedItems.filter((selected) => !require_isSelectAllItem.isSelectAllItem(selected)).length,
305
+ totalSelectableCount: filteredItems.filter((item) => !require_isSelectAllItem.isSelectAllItem(item) && !item.disabled).length
305
306
  };
306
307
  }, [selectedItems, filteredItems]);
307
308
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -377,15 +378,15 @@ const MultiSelect = react.default.forwardRef(({ autoAlign = false, className: co
377
378
  ...menuProps,
378
379
  children: isOpen && sortItems(filteredItems, sortOptions).map((item, index) => {
379
380
  const { hasIndividualSelections, nonSelectAllSelectedCount, totalSelectableCount } = getSelectionStats(selectedItems, filteredItems);
380
- const isChecked = item.isSelectAll ? nonSelectAllSelectedCount === totalSelectableCount && totalSelectableCount > 0 : selectedItems.some((selected) => (0, react_fast_compare.default)(selected, item));
381
- const isIndeterminate = item.isSelectAll && hasIndividualSelections && nonSelectAllSelectedCount < totalSelectableCount;
381
+ const isChecked = require_isSelectAllItem.isSelectAllItem(item) ? nonSelectAllSelectedCount === totalSelectableCount && totalSelectableCount > 0 : selectedItems.some((selected) => (0, react_fast_compare.default)(selected, item));
382
+ const isIndeterminate = require_isSelectAllItem.isSelectAllItem(item) && hasIndividualSelections && nonSelectAllSelectedCount < totalSelectableCount;
382
383
  const itemProps = getItemProps({
383
384
  item,
384
385
  ["aria-selected"]: isChecked
385
386
  });
386
387
  const itemText = itemToString(item);
387
388
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index$3.default.MenuItem, {
388
- isActive: isChecked && !item["isSelectAll"],
389
+ isActive: isChecked && !require_isSelectAllItem.isSelectAllItem(item),
389
390
  "aria-label": itemText,
390
391
  "aria-checked": isIndeterminate ? "mixed" : isChecked,
391
392
  isHighlighted: highlightedIndex === index,
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright IBM Corp. 2026
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ export declare const isSelectAllItem: (item: unknown) => item is {
8
+ isSelectAll?: boolean;
9
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright IBM Corp. 2016, 2026
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ //#region src/components/MultiSelect/tools/isSelectAllItem.ts
9
+ /**
10
+ * Copyright IBM Corp. 2026
11
+ *
12
+ * This source code is licensed under the Apache-2.0 license found in the
13
+ * LICENSE file in the root directory of this source tree.
14
+ */
15
+ const isSelectAllItem = (item) => typeof item === "object" && item !== null && "isSelectAll" in item;
16
+ //#endregion
17
+ exports.isSelectAllItem = isSelectAllItem;
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
+ const require_isSelectAllItem = require("./isSelectAllItem.js");
8
9
  //#region src/components/MultiSelect/tools/sorting.ts
9
- const isSelectAllItem = (item) => typeof item === "object" && item !== null && "isSelectAll" in item;
10
10
  /**
11
11
  * Use `localeCompare` with the `numeric` option enabled to sort two
12
12
  * alphanumeric strings.
@@ -17,8 +17,8 @@ const defaultCompareItems = (itemA, itemB, { locale }) => itemA.localeCompare(it
17
17
  */
18
18
  const defaultSortItems = (items, { selectedItems, itemToString, compareItems, locale }) => {
19
19
  return items.sort((itemA, itemB) => {
20
- if (isSelectAllItem(itemA) && itemA.isSelectAll) return -1;
21
- if (isSelectAllItem(itemB) && itemB.isSelectAll) return 1;
20
+ if (require_isSelectAllItem.isSelectAllItem(itemA) && itemA.isSelectAll) return -1;
21
+ if (require_isSelectAllItem.isSelectAllItem(itemB) && itemB.isSelectAll) return 1;
22
22
  const hasItemA = selectedItems.includes(itemA);
23
23
  const hasItemB = selectedItems.includes(itemB);
24
24
  if (hasItemA && !hasItemB) return -1;
@@ -4,6 +4,10 @@
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
+ /**
8
+ * @deprecated PageHeader has moved to Carbon for IBM Products.
9
+ * See https://github.com/carbon-design-system/carbon/issues/21926
10
+ */
7
11
  import React, { type ElementType } from 'react';
8
12
  import PropTypes from 'prop-types';
9
13
  import { TYPES } from '../Tag/Tag';
@@ -14,6 +14,7 @@ const require_AspectRatio = require("../AspectRatio/AspectRatio.js");
14
14
  const require_index = require("../Popover/index.js");
15
15
  const require_DefinitionTooltip = require("../Tooltip/DefinitionTooltip.js");
16
16
  const require_MenuItem = require("../Menu/MenuItem.js");
17
+ const require_deprecateComponent = require("../../prop-types/deprecateComponent.js");
17
18
  const require_Grid = require("../Grid/Grid.js");
18
19
  const require_Column = require("../Grid/Column.js");
19
20
  const require_index$1 = require("../MenuButton/index.js");
@@ -37,7 +38,18 @@ let _carbon_layout = require("@carbon/layout");
37
38
  * This source code is licensed under the Apache-2.0 license found in the
38
39
  * LICENSE file in the root directory of this source tree.
39
40
  */
41
+ /**
42
+ * @deprecated PageHeader has moved to Carbon for IBM Products.
43
+ * See https://github.com/carbon-design-system/carbon/issues/21926
44
+ */
45
+ const pageHeaderDeprecationMessage = (componentName) => `The \`${componentName}\` component in \`@carbon/react\` has been deprecated and moved to \`@carbon/ibm-products\`. See https://github.com/carbon-design-system/carbon/issues/21926`;
46
+ const usePageHeaderDeprecation = (componentName) => {
47
+ (0, react.useEffect)(() => {
48
+ require_deprecateComponent.deprecateComponent(componentName, pageHeaderDeprecationMessage(componentName));
49
+ }, [componentName]);
50
+ };
40
51
  const PageHeader = react.default.forwardRef(({ className, children, ...other }, ref) => {
52
+ usePageHeaderDeprecation("PageHeader");
41
53
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
42
54
  className: (0, classnames.default)({ [`${require_usePrefix.usePrefix()}--page-header`]: true }, className),
43
55
  ref,
@@ -47,6 +59,7 @@ const PageHeader = react.default.forwardRef(({ className, children, ...other },
47
59
  });
48
60
  PageHeader.displayName = "PageHeader";
49
61
  const PageHeaderBreadcrumbBar = react.default.forwardRef(({ border = true, className, children, renderIcon: IconElement, contentActions, contentActionsFlush, pageActions, pageActionsFlush, ...other }, ref) => {
62
+ usePageHeaderDeprecation("PageHeaderBreadcrumbBar");
50
63
  const prefix = require_usePrefix.usePrefix();
51
64
  const classNames = (0, classnames.default)({
52
65
  [`${prefix}--page-header__breadcrumb-bar`]: true,
@@ -83,6 +96,7 @@ const PageHeaderBreadcrumbBar = react.default.forwardRef(({ border = true, class
83
96
  });
84
97
  PageHeaderBreadcrumbBar.displayName = "PageHeaderBreadcrumbBar";
85
98
  const PageHeaderContent = react.default.forwardRef(({ className, children, title, renderIcon: IconElement, contextualActions, pageActions, ...other }, ref) => {
99
+ usePageHeaderDeprecation("PageHeaderContent");
86
100
  const prefix = require_usePrefix.usePrefix();
87
101
  const classNames = (0, classnames.default)({ [`${prefix}--page-header__content`]: true }, className);
88
102
  const titleRef = (0, react.useRef)(null);
@@ -145,6 +159,7 @@ PageHeaderContent.propTypes = {
145
159
  pageActions: prop_types.default.node
146
160
  };
147
161
  const PageHeaderContentPageActions = ({ className, children, menuButtonLabel = "Actions", actions, ...other }) => {
162
+ usePageHeaderDeprecation("PageHeaderContentPageActions");
148
163
  const classNames = (0, classnames.default)({ [`${require_usePrefix.usePrefix()}--page-header__content__page-actions`]: true }, className);
149
164
  const containerRef = (0, react.useRef)(null);
150
165
  const offsetRef = (0, react.useRef)(null);
@@ -198,6 +213,7 @@ PageHeaderContentPageActions.propTypes = {
198
213
  actions: prop_types.default.oneOfType([prop_types.default.node, prop_types.default.array])
199
214
  };
200
215
  const PageHeaderContentText = ({ className, children, subtitle, ...other }) => {
216
+ usePageHeaderDeprecation("PageHeaderContentText");
201
217
  const prefix = require_usePrefix.usePrefix();
202
218
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
203
219
  className: (0, classnames.default)({ [`${prefix}--page-header__content__body`]: true }, className),
@@ -216,6 +232,7 @@ PageHeaderContentText.propTypes = {
216
232
  subtitle: prop_types.default.string
217
233
  };
218
234
  const PageHeaderHeroImage = ({ className, children, ...other }) => {
235
+ usePageHeaderDeprecation("PageHeaderHeroImage");
219
236
  const classNames = (0, classnames.default)({ [`${require_usePrefix.usePrefix()}--page-header__hero-image`]: true }, className);
220
237
  const isLg = require_useMatchMedia.useMatchMedia(`(min-width: ${_carbon_layout.breakpoints.lg.width})`);
221
238
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AspectRatio.default, {
@@ -231,6 +248,7 @@ PageHeaderHeroImage.propTypes = {
231
248
  className: prop_types.default.string
232
249
  };
233
250
  const PageHeaderTabBar = react.default.forwardRef(({ className, children, tags = [], ...other }, ref) => {
251
+ usePageHeaderDeprecation("PageHeaderTabBar");
234
252
  const prefix = require_usePrefix.usePrefix();
235
253
  const classNames = (0, classnames.default)({ [`${prefix}--page-header__tab-bar`]: true }, className);
236
254
  const [openPopover, setOpenPopover] = (0, react.useState)(false);
@@ -4,5 +4,9 @@
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
+ /**
8
+ * @deprecated PageHeader has moved to Carbon for IBM Products.
9
+ * See https://github.com/carbon-design-system/carbon/issues/21926
10
+ */
7
11
  export { PageHeader, PageHeaderBreadcrumbBar, PageHeaderContent, PageHeaderContentPageActions, PageHeaderContentText, PageHeaderTabBar, PageHeaderHeroImage, Root, BreadcrumbBar, Content, ContentPageActions, ContentText, TabBar, HeroImage, } from './PageHeader';
8
12
  export type { PageHeaderProps, PageHeaderBreadcrumbBarProps, PageHeaderContentProps, PageHeaderContentPageActionsProps, PageHeaderContentTextProps, PageHeaderTabBarProps, PageHeaderHeroImageProps, } from './PageHeader';
@@ -7,7 +7,7 @@
7
7
  import PropTypes from 'prop-types';
8
8
  export interface SwitcherDividerProps {
9
9
  /**
10
- * Optionally provide a custom class to apply to the underlying `<li>` node
10
+ * Optionally provide a custom class to apply to the underlying `<hr>` node
11
11
  */
12
12
  className?: string;
13
13
  }
@@ -15,7 +15,7 @@ declare const SwitcherDivider: {
15
15
  ({ className: customClassName, ...other }: SwitcherDividerProps): import("react/jsx-runtime").JSX.Element;
16
16
  propTypes: {
17
17
  /**
18
- * Optionally provide a custom class to apply to the underlying `<li>` node
18
+ * Optionally provide a custom class to apply to the underlying `<hr>` node
19
19
  */
20
20
  className: PropTypes.Requireable<string>;
21
21
  };
@@ -23,10 +23,10 @@ let react_jsx_runtime = require("react/jsx-runtime");
23
23
  */
24
24
  const SwitcherDivider = ({ className: customClassName, ...other }) => {
25
25
  const classNames = (0, classnames.default)(`${require_usePrefix.usePrefix()}--switcher__item--divider`, { [customClassName || ""]: !!customClassName });
26
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", {
26
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", {
27
27
  ...other,
28
28
  className: classNames
29
- });
29
+ }) });
30
30
  };
31
31
  SwitcherDivider.propTypes = { className: prop_types.default.string };
32
32
  //#endregion
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2016, 2025
2
+ * Copyright IBM Corp. 2016, 2026
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -8,7 +8,7 @@
8
8
  const require_noopFn = require("./noopFn.js");
9
9
  //#region src/internal/warning.ts
10
10
  /**
11
- * Copyright IBM Corp. 2016, 2025
11
+ * Copyright IBM Corp. 2016, 2026
12
12
  *
13
13
  * This source code is licensed under the Apache-2.0 license found in the
14
14
  * LICENSE file in the root directory of this source tree.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@carbon/react",
3
3
  "description": "React components for the Carbon Design System",
4
- "version": "1.107.1",
4
+ "version": "1.108.0-rc.0",
5
5
  "license": "Apache-2.0",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -53,10 +53,10 @@
53
53
  "dependencies": {
54
54
  "@babel/runtime": "^7.27.3",
55
55
  "@carbon/feature-flags": "^1.3.0",
56
- "@carbon/icons-react": "^11.80.0",
57
- "@carbon/layout": "^11.52.0",
58
- "@carbon/styles": "^1.106.0",
59
- "@carbon/utilities": "^0.19.0",
56
+ "@carbon/icons-react": "^11.81.0-rc.0",
57
+ "@carbon/layout": "^11.53.0-rc.0",
58
+ "@carbon/styles": "^1.107.0-rc.0",
59
+ "@carbon/utilities": "^0.20.0-rc.0",
60
60
  "@floating-ui/react": "^0.27.4",
61
61
  "@ibm/telemetry-js": "^1.5.0",
62
62
  "classnames": "2.5.1",
@@ -79,7 +79,7 @@
79
79
  "@babel/preset-react": "^7.27.1",
80
80
  "@babel/preset-typescript": "^7.27.1",
81
81
  "@carbon/test-utils": "^10.41.0",
82
- "@carbon/themes": "^11.73.0",
82
+ "@carbon/themes": "^11.74.0-rc.0",
83
83
  "@figma/code-connect": "^1.4.2",
84
84
  "@stackblitz/sdk": "^1.11.0",
85
85
  "@storybook/addon-a11y": "^10.3.5",
@@ -94,7 +94,6 @@
94
94
  "babel-preset-carbon": "^0.8.0",
95
95
  "browserify-zlib": "^0.2.0",
96
96
  "browserslist-config-carbon": "^11.2.0",
97
- "clipboardy": "^4.0.0",
98
97
  "enquirer": "^2.3.6",
99
98
  "fast-glob": "^3.3.3",
100
99
  "fs-extra": "^11.0.0",
@@ -107,10 +106,11 @@
107
106
  "rimraf": "^6.0.1",
108
107
  "sass": "^1.93.2",
109
108
  "storybook": "^10.3.5",
110
- "storybook-addon-accessibility-checker": ">=9.2.0-rc.3",
109
+ "storybook-addon-accessibility-checker": ">=9.2.0-rc.4",
111
110
  "stream-browserify": "^3.0.0",
111
+ "tinyclip": "^0.1.12",
112
112
  "tsdown": "^0.21.0",
113
- "typescript-config-carbon": "^0.9.0",
113
+ "typescript-config-carbon": "^0.10.0-rc.0",
114
114
  "use-sync-external-store": "^1.5.0",
115
115
  "vite": "^7.1.2"
116
116
  },
@@ -125,5 +125,5 @@
125
125
  "**/*.scss",
126
126
  "**/*.css"
127
127
  ],
128
- "gitHead": "80f5039e553e19f4b540f914c35b8c3eaa8e41d3"
128
+ "gitHead": "3d219dfcc2a3da515016f7ce0e769d013c3a6c03"
129
129
  }