@webiny/app-admin-rmwc 0.0.0-unstable.c2780f51fe → 0.0.0-unstable.c7dec08bb0

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.
@@ -6,18 +6,27 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.DialogContainer = void 0;
9
+ var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
9
11
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
13
  var _get3 = _interopRequireDefault(require("lodash/get"));
11
14
  var _react = _interopRequireWildcard(require("react"));
12
15
  var _useUi = require("@webiny/app/hooks/useUi");
13
16
  var _Dialog = require("@webiny/ui/Dialog");
14
17
  var _Button = require("@webiny/ui/Button");
15
18
  var DialogContainer = function DialogContainer() {
19
+ var _ui$dialog;
16
20
  var ui = (0, _useUi.useUi)();
21
+ var _useState = (0, _react.useState)(false),
22
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
23
+ isLoading = _useState2[0],
24
+ setIsLoading = _useState2[1];
17
25
  var message = (0, _get3.default)(ui, "dialog.message");
18
26
  var _get2 = (0, _get3.default)(ui, "dialog.options", {}),
19
27
  dataTestId = _get2.dataTestId,
20
28
  title = _get2.title,
29
+ loading = _get2.loading,
21
30
  _get2$actions = _get2.actions,
22
31
  actions = _get2$actions === void 0 ? {
23
32
  cancel: null,
@@ -33,18 +42,55 @@ var DialogContainer = function DialogContainer() {
33
42
  });
34
43
  });
35
44
  }, [ui]);
45
+ /**
46
+ * We need this part because message can change while the dialog is opened and in loading state.
47
+ */
48
+ (0, _react.useEffect)(function () {
49
+ setIsLoading(false);
50
+ }, [ui === null || ui === void 0 ? void 0 : (_ui$dialog = ui.dialog) === null || _ui$dialog === void 0 ? void 0 : _ui$dialog.message]);
51
+ var handleConfirm = /*#__PURE__*/function () {
52
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee() {
53
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
54
+ while (1) switch (_context.prev = _context.next) {
55
+ case 0:
56
+ if (actions.accept.onClick) {
57
+ _context.next = 4;
58
+ break;
59
+ }
60
+ /**
61
+ * Should not happen as users should define "accept.onClick" function, but just in case lets show the information.
62
+ * Possible to happen in development process.
63
+ */
64
+ console.info("There is no actions.accept.onClick callback defined.");
65
+ hideDialog();
66
+ return _context.abrupt("return");
67
+ case 4:
68
+ setIsLoading(true);
69
+ _context.next = 7;
70
+ return actions.accept.onClick();
71
+ case 7:
72
+ setIsLoading(false);
73
+ hideDialog();
74
+ case 9:
75
+ case "end":
76
+ return _context.stop();
77
+ }
78
+ }, _callee);
79
+ }));
80
+ return function handleConfirm() {
81
+ return _ref.apply(this, arguments);
82
+ };
83
+ }();
36
84
  return /*#__PURE__*/_react.default.createElement(_Dialog.Dialog, {
37
85
  open: !!message,
38
86
  onClose: hideDialog,
39
87
  "data-testid": dataTestId,
40
88
  style: style
41
- }, title && /*#__PURE__*/_react.default.createElement(_Dialog.DialogTitle, null, title), /*#__PURE__*/_react.default.createElement(_Dialog.DialogContent, null, message), /*#__PURE__*/_react.default.createElement(_Dialog.DialogActions, null, actions.cancel && /*#__PURE__*/_react.default.createElement(_Dialog.DialogAccept, {
89
+ }, isLoading ? loading : null, title && /*#__PURE__*/_react.default.createElement(_Dialog.DialogTitle, null, title), /*#__PURE__*/_react.default.createElement(_Dialog.DialogContent, null, message), /*#__PURE__*/_react.default.createElement(_Dialog.DialogActions, null, actions.cancel && /*#__PURE__*/_react.default.createElement(_Dialog.DialogAccept, {
42
90
  onClick: actions.cancel.onClick
43
91
  }, actions.cancel.label), actions.accept && /*#__PURE__*/_react.default.createElement(_Button.ButtonPrimary, {
44
- onClick: function onClick() {
45
- actions.accept.onClick();
46
- hideDialog();
47
- }
92
+ "data-testid": "confirmationdialog-confirm-action",
93
+ onClick: handleConfirm
48
94
  }, actions.accept.label)));
49
95
  };
50
96
  exports.DialogContainer = DialogContainer;
@@ -1 +1 @@
1
- {"version":3,"names":["DialogContainer","ui","useUi","message","dataTestId","title","actions","cancel","accept","label","style","hideDialog","useCallback","setState","dialog","onClick"],"sources":["Dialog.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { get } from \"lodash\";\nimport { useUi } from \"@webiny/app/hooks/useUi\";\nimport { Dialog, DialogAccept, DialogTitle, DialogActions, DialogContent } from \"@webiny/ui/Dialog\";\nimport { ButtonPrimary } from \"@webiny/ui/Button\";\n\nexport const DialogContainer: React.FC = () => {\n const ui = useUi();\n const message: React.ReactNode = get(ui, \"dialog.message\");\n const {\n dataTestId,\n title,\n actions = { cancel: null, accept: { label: \"OK\" } },\n style\n } = get(ui, \"dialog.options\", {});\n\n const hideDialog = useCallback(() => {\n ui.setState(ui => ({ ...ui, dialog: null }));\n }, [ui]);\n\n return (\n <Dialog open={!!message} onClose={hideDialog} data-testid={dataTestId} style={style}>\n {title && <DialogTitle>{title}</DialogTitle>}\n <DialogContent>{message}</DialogContent>\n <DialogActions>\n {actions.cancel && (\n <DialogAccept onClick={actions.cancel.onClick}>\n {actions.cancel.label}\n </DialogAccept>\n )}\n {actions.accept && (\n <ButtonPrimary\n onClick={() => {\n actions.accept.onClick();\n hideDialog();\n }}\n >\n {actions.accept.label}\n </ButtonPrimary>\n )}\n </DialogActions>\n </Dialog>\n );\n};\n"],"mappings":";;;;;;;;;;AAAA;AAEA;AACA;AACA;AAEO,IAAMA,eAAyB,GAAG,SAA5BA,eAAyB,GAAS;EAC3C,IAAMC,EAAE,GAAG,IAAAC,YAAK,GAAE;EAClB,IAAMC,OAAwB,GAAG,mBAAIF,EAAE,EAAE,gBAAgB,CAAC;EAC1D,YAKI,mBAAIA,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAJ7BG,UAAU,SAAVA,UAAU;IACVC,KAAK,SAALA,KAAK;IAAA,sBACLC,OAAO;IAAPA,OAAO,8BAAG;MAAEC,MAAM,EAAE,IAAI;MAAEC,MAAM,EAAE;QAAEC,KAAK,EAAE;MAAK;IAAE,CAAC;IACnDC,KAAK,SAALA,KAAK;EAGT,IAAMC,UAAU,GAAG,IAAAC,kBAAW,EAAC,YAAM;IACjCX,EAAE,CAACY,QAAQ,CAAC,UAAAZ,EAAE;MAAA,mEAAUA,EAAE;QAAEa,MAAM,EAAE;MAAI;IAAA,CAAG,CAAC;EAChD,CAAC,EAAE,CAACb,EAAE,CAAC,CAAC;EAER,oBACI,6BAAC,cAAM;IAAC,IAAI,EAAE,CAAC,CAACE,OAAQ;IAAC,OAAO,EAAEQ,UAAW;IAAC,eAAaP,UAAW;IAAC,KAAK,EAAEM;EAAM,GAC/EL,KAAK,iBAAI,6BAAC,mBAAW,QAAEA,KAAK,CAAe,eAC5C,6BAAC,qBAAa,QAAEF,OAAO,CAAiB,eACxC,6BAAC,qBAAa,QACTG,OAAO,CAACC,MAAM,iBACX,6BAAC,oBAAY;IAAC,OAAO,EAAED,OAAO,CAACC,MAAM,CAACQ;EAAQ,GACzCT,OAAO,CAACC,MAAM,CAACE,KAAK,CAE5B,EACAH,OAAO,CAACE,MAAM,iBACX,6BAAC,qBAAa;IACV,OAAO,EAAE,mBAAM;MACXF,OAAO,CAACE,MAAM,CAACO,OAAO,EAAE;MACxBJ,UAAU,EAAE;IAChB;EAAE,GAEDL,OAAO,CAACE,MAAM,CAACC,KAAK,CAE5B,CACW,CACX;AAEjB,CAAC;AAAC"}
1
+ {"version":3,"names":["DialogContainer","ui","useUi","useState","isLoading","setIsLoading","message","dataTestId","title","loading","actions","cancel","accept","label","style","hideDialog","useCallback","setState","dialog","useEffect","handleConfirm","onClick","console","info"],"sources":["Dialog.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from \"react\";\nimport { get } from \"lodash\";\nimport { useUi } from \"@webiny/app/hooks/useUi\";\nimport { Dialog, DialogAccept, DialogActions, DialogContent, DialogTitle } from \"@webiny/ui/Dialog\";\nimport { ButtonPrimary } from \"@webiny/ui/Button\";\n\nexport const DialogContainer: React.FC = () => {\n const ui = useUi();\n const [isLoading, setIsLoading] = useState(false);\n const message: React.ReactNode = get(ui, \"dialog.message\");\n const {\n dataTestId,\n title,\n loading,\n actions = { cancel: null, accept: { label: \"OK\" } },\n style\n } = get(ui, \"dialog.options\", {});\n\n const hideDialog = useCallback(() => {\n ui.setState(ui => ({ ...ui, dialog: null }));\n }, [ui]);\n /**\n * We need this part because message can change while the dialog is opened and in loading state.\n */\n useEffect(() => {\n setIsLoading(false);\n }, [ui?.dialog?.message]);\n\n const handleConfirm = async () => {\n if (!actions.accept.onClick) {\n /**\n * Should not happen as users should define \"accept.onClick\" function, but just in case lets show the information.\n * Possible to happen in development process.\n */\n console.info(\"There is no actions.accept.onClick callback defined.\");\n hideDialog();\n return;\n }\n setIsLoading(true);\n await actions.accept.onClick();\n setIsLoading(false);\n hideDialog();\n };\n\n return (\n <Dialog open={!!message} onClose={hideDialog} data-testid={dataTestId} style={style}>\n {isLoading ? loading : null}\n {title && <DialogTitle>{title}</DialogTitle>}\n <DialogContent>{message}</DialogContent>\n <DialogActions>\n {actions.cancel && (\n <DialogAccept onClick={actions.cancel.onClick}>\n {actions.cancel.label}\n </DialogAccept>\n )}\n {actions.accept && (\n <ButtonPrimary\n data-testid={\"confirmationdialog-confirm-action\"}\n onClick={handleConfirm}\n >\n {actions.accept.label}\n </ButtonPrimary>\n )}\n </DialogActions>\n </Dialog>\n );\n};\n"],"mappings":";;;;;;;;;;;;;AAAA;AAEA;AACA;AACA;AAEO,IAAMA,eAAyB,GAAG,SAA5BA,eAAyB,GAAS;EAAA;EAC3C,IAAMC,EAAE,GAAG,IAAAC,YAAK,GAAE;EAClB,gBAAkC,IAAAC,eAAQ,EAAC,KAAK,CAAC;IAAA;IAA1CC,SAAS;IAAEC,YAAY;EAC9B,IAAMC,OAAwB,GAAG,mBAAIL,EAAE,EAAE,gBAAgB,CAAC;EAC1D,YAMI,mBAAIA,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAL7BM,UAAU,SAAVA,UAAU;IACVC,KAAK,SAALA,KAAK;IACLC,OAAO,SAAPA,OAAO;IAAA,sBACPC,OAAO;IAAPA,OAAO,8BAAG;MAAEC,MAAM,EAAE,IAAI;MAAEC,MAAM,EAAE;QAAEC,KAAK,EAAE;MAAK;IAAE,CAAC;IACnDC,KAAK,SAALA,KAAK;EAGT,IAAMC,UAAU,GAAG,IAAAC,kBAAW,EAAC,YAAM;IACjCf,EAAE,CAACgB,QAAQ,CAAC,UAAAhB,EAAE;MAAA,mEAAUA,EAAE;QAAEiB,MAAM,EAAE;MAAI;IAAA,CAAG,CAAC;EAChD,CAAC,EAAE,CAACjB,EAAE,CAAC,CAAC;EACR;AACJ;AACA;EACI,IAAAkB,gBAAS,EAAC,YAAM;IACZd,YAAY,CAAC,KAAK,CAAC;EACvB,CAAC,EAAE,CAACJ,EAAE,aAAFA,EAAE,qCAAFA,EAAE,CAAEiB,MAAM,+CAAV,WAAYZ,OAAO,CAAC,CAAC;EAEzB,IAAMc,aAAa;IAAA,kGAAG;MAAA;QAAA;UAAA;YAAA,IACbV,OAAO,CAACE,MAAM,CAACS,OAAO;cAAA;cAAA;YAAA;YACvB;AACZ;AACA;AACA;YACYC,OAAO,CAACC,IAAI,CAAC,sDAAsD,CAAC;YACpER,UAAU,EAAE;YAAC;UAAA;YAGjBV,YAAY,CAAC,IAAI,CAAC;YAAC;YAAA,OACbK,OAAO,CAACE,MAAM,CAACS,OAAO,EAAE;UAAA;YAC9BhB,YAAY,CAAC,KAAK,CAAC;YACnBU,UAAU,EAAE;UAAC;UAAA;YAAA;QAAA;MAAA;IAAA,CAChB;IAAA,gBAdKK,aAAa;MAAA;IAAA;EAAA,GAclB;EAED,oBACI,6BAAC,cAAM;IAAC,IAAI,EAAE,CAAC,CAACd,OAAQ;IAAC,OAAO,EAAES,UAAW;IAAC,eAAaR,UAAW;IAAC,KAAK,EAAEO;EAAM,GAC/EV,SAAS,GAAGK,OAAO,GAAG,IAAI,EAC1BD,KAAK,iBAAI,6BAAC,mBAAW,QAAEA,KAAK,CAAe,eAC5C,6BAAC,qBAAa,QAAEF,OAAO,CAAiB,eACxC,6BAAC,qBAAa,QACTI,OAAO,CAACC,MAAM,iBACX,6BAAC,oBAAY;IAAC,OAAO,EAAED,OAAO,CAACC,MAAM,CAACU;EAAQ,GACzCX,OAAO,CAACC,MAAM,CAACE,KAAK,CAE5B,EACAH,OAAO,CAACE,MAAM,iBACX,6BAAC,qBAAa;IACV,eAAa,mCAAoC;IACjD,OAAO,EAAEQ;EAAc,GAEtBV,OAAO,CAACE,MAAM,CAACC,KAAK,CAE5B,CACW,CACX;AAEjB,CAAC;AAAC"}
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ /// <reference types="react" />
3
+ /// <reference types="web" />
4
+ export declare const Dialog: import("@emotion/styled").StyledComponent<{
5
+ theme?: import("@emotion/react").Theme | undefined;
6
+ as?: import("react").ElementType<any> | undefined;
7
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.Dialog = void 0;
8
+ var _styled = _interopRequireDefault(require("@emotion/styled"));
9
+ var Dialog = /*#__PURE__*/(0, _styled.default)("div", {
10
+ label: "Dialog",
11
+ target: "eruevcs0"
12
+ })("background-color:rgba(0,0,0,0.32);height:100%;width:100%;position:fixed;z-index:2312321;top:0;.dialog{position:fixed;top:350px;left:50%;transform:translate(-50%,-50%);background-color:white;width:700px;height:500px;z-index:auto;box-shadow:0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12);> ul{overflow-y:scroll;height:444px;margin-bottom:10px;> li{.section-title{bottom-bottom:1px solid var(--mdc-theme-on-background);padding:10px 15px 5px 15px;}ul{li{padding:10px 15px;cursor:pointer;&.focused{background-color:var(--mdc-theme-background);}.section-item-title{margin-bottom:3px;color:var(--mdc-theme-primary);}.section-item-description{color:var(--mdc-theme-text-primary-on-background);}}}}}}");
13
+ exports.Dialog = Dialog;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Dialog","styled"],"sources":["Dialog.tsx"],"sourcesContent":["import styled from \"@emotion/styled\";\n\nexport const Dialog = styled.div`\n background-color: rgba(0, 0, 0, 0.32);\n height: 100%;\n width: 100%;\n position: fixed;\n z-index: 2312321;\n top: 0;\n\n .dialog {\n position: fixed;\n top: 350px;\n left: 50%;\n /* bring your own prefixes */\n transform: translate(-50%, -50%);\n background-color: white;\n width: 700px;\n height: 500px;\n z-index: auto;\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14),\n 0px 9px 46px 8px rgba(0, 0, 0, 0.12);\n\n > ul {\n overflow-y: scroll;\n height: 444px;\n margin-bottom: 10px;\n\n > li {\n .section-title {\n bottom-bottom: 1px solid var(--mdc-theme-on-background);\n padding: 10px 15px 5px 15px;\n }\n\n ul {\n li {\n padding: 10px 15px;\n cursor: pointer;\n\n &.focused {\n background-color: var(--mdc-theme-background);\n }\n\n .section-item-title {\n margin-bottom: 3px;\n color: var(--mdc-theme-primary);\n }\n\n .section-item-description {\n color: var(--mdc-theme-text-primary-on-background);\n }\n }\n }\n }\n }\n }\n`;\n"],"mappings":";;;;;;;AAAA;AAEO,IAAMA,MAAM,oBAAGC,eAAM;EAAA;EAAA;AAAA,kvBAsD3B;AAAC"}
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare const OmniSearch: () => JSX.Element | null;
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.OmniSearch = void 0;
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _appAdmin = require("@webiny/app-admin");
14
+ var _reactRouter = require("@webiny/react-router");
15
+ var _utils = require("@webiny/app/utils");
16
+ var _search = require("@material-design-icons/svg/outlined/search.svg");
17
+ var _reactHotkeyz = require("react-hotkeyz");
18
+ var _Input = require("@webiny/ui/Input");
19
+ var _Typography = require("@webiny/ui/Typography");
20
+ var _Dialog = require("./OmniSearch/Dialog");
21
+ // @ts-ignore Library doesn't have types.
22
+
23
+ var getIndexedItemsList = function getIndexedItemsList(items) {
24
+ var lastUsedItemIndex = 0;
25
+ return items.map(function (itemsSection) {
26
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, itemsSection), {}, {
27
+ items: itemsSection.items.map(function (item) {
28
+ var index = lastUsedItemIndex++;
29
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
30
+ index: index
31
+ });
32
+ })
33
+ });
34
+ });
35
+ };
36
+ var getItemFromIndexedItemsList = function getItemFromIndexedItemsList(itemsSections, index) {
37
+ if (index < 0) {
38
+ return null;
39
+ }
40
+ for (var i = 0; i < itemsSections.length; i++) {
41
+ var itemsSection = itemsSections[i];
42
+ for (var j = 0; j < itemsSection.items.length; j++) {
43
+ var item = itemsSection.items[j];
44
+ if (item.index === index) {
45
+ return item;
46
+ }
47
+ }
48
+ }
49
+ return null;
50
+ };
51
+ var OmniSearch = function OmniSearch() {
52
+ var _useState = (0, _react.useState)(false),
53
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
54
+ omniSearchVisible = _useState2[0],
55
+ setShowOmniSearch = _useState2[1];
56
+ var _useState3 = (0, _react.useState)(""),
57
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
58
+ filter = _useState4[0],
59
+ setFilter = _useState4[1];
60
+ var _useState5 = (0, _react.useState)(0),
61
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
62
+ focusedItemIndex = _useState6[0],
63
+ focusItemAtIndex = _useState6[1];
64
+ var _useNavigation = (0, _appAdmin.useNavigation)(),
65
+ menuItems = _useNavigation.menuItems;
66
+ var _useSnackbar = (0, _appAdmin.useSnackbar)(),
67
+ showSnackbar = _useSnackbar.showSnackbar;
68
+ var navigate = (0, _reactRouter.useNavigate)();
69
+ var showOmniSearch = (0, _react.useCallback)(function () {
70
+ setShowOmniSearch(true);
71
+ }, []);
72
+ var hideOmniSearch = (0, _react.useCallback)(function () {
73
+ setShowOmniSearch(false);
74
+ setFilter("");
75
+ }, []);
76
+ var onFilter = (0, _react.useCallback)(function (searchString) {
77
+ setFilter(searchString);
78
+ focusItemAtIndex(0);
79
+ }, []);
80
+ var selectItem = (0, _react.useCallback)(function (item) {
81
+ if (item.link) {
82
+ navigate(item.link);
83
+ } else if (item.callback) {
84
+ item.callback();
85
+ }
86
+ hideOmniSearch();
87
+ }, []);
88
+
89
+ // TODO: should be pulled from registered plugins.
90
+ var fullItemsList = (0, _react.useMemo)(function () {
91
+ return [{
92
+ id: "apps",
93
+ title: "Apps",
94
+ items: menuItems.map(function (level1Item) {
95
+ return (0, _toConsumableArray2.default)(level1Item.children.map(function (level2Item) {
96
+ return (0, _toConsumableArray2.default)(level2Item.children.map(function (child) {
97
+ var description = [level1Item.label, level2Item.label].join(" / ");
98
+ return {
99
+ id: description + child.label,
100
+ title: child.label,
101
+ description: description,
102
+ link: child.path
103
+ };
104
+ }));
105
+ })).flat();
106
+ }).flat()
107
+ }, {
108
+ id: "other",
109
+ title: "Other",
110
+ items: [{
111
+ id: "back",
112
+ title: "← Back",
113
+ description: "Navigates to the previous page.",
114
+ callback: function callback() {
115
+ navigate(-1);
116
+ }
117
+ }]
118
+ }, (0, _utils.getTenantId)() && {
119
+ id: "development",
120
+ title: "Development",
121
+ items: [{
122
+ id: "copy-tenant-id",
123
+ title: "Copy current tenant ID",
124
+ description: "Copies current tenant ID into clipboard.",
125
+ callback: function callback() {
126
+ navigator.clipboard.writeText((0, _utils.getTenantId)());
127
+ showSnackbar("Tenant ID copied to clipboard.");
128
+ }
129
+ }]
130
+ }].filter(Boolean);
131
+ }, [menuItems]);
132
+ var filteredIndexedItemsList = (0, _react.useMemo)(function () {
133
+ if (!filter) {
134
+ return getIndexedItemsList(fullItemsList);
135
+ }
136
+ var filteredItems1stPass = fullItemsList.map(function (itemsSection) {
137
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, itemsSection), {}, {
138
+ items: itemsSection.items.filter(function (item) {
139
+ var _item$title;
140
+ return (_item$title = item.title) === null || _item$title === void 0 ? void 0 : _item$title.toLowerCase().includes(filter.toLowerCase());
141
+ })
142
+ });
143
+ });
144
+ var filteredItems2ndPass = filteredItems1stPass.filter(function (itemsSection) {
145
+ return itemsSection.items.length > 0;
146
+ });
147
+ return getIndexedItemsList(filteredItems2ndPass);
148
+ }, [fullItemsList, filter]);
149
+ var selectFocusedItem = (0, _react.useCallback)(function () {
150
+ var focusedItem = getItemFromIndexedItemsList(filteredIndexedItemsList, focusedItemIndex);
151
+ if (focusedItem) {
152
+ selectItem(focusedItem);
153
+ }
154
+ }, [filteredIndexedItemsList, focusedItemIndex]);
155
+ var focusNextItem = (0, _react.useCallback)(function () {
156
+ var nextIndex = focusedItemIndex + 1;
157
+ var itemToFocus = getItemFromIndexedItemsList(filteredIndexedItemsList, nextIndex);
158
+ if (itemToFocus) {
159
+ focusItemAtIndex(itemToFocus.index);
160
+ }
161
+ }, [filteredIndexedItemsList, focusedItemIndex]);
162
+ var focusPrevItem = (0, _react.useCallback)(function () {
163
+ var prevIndex = focusedItemIndex - 1;
164
+ var itemToFocus = getItemFromIndexedItemsList(filteredIndexedItemsList, prevIndex);
165
+ if (itemToFocus) {
166
+ focusItemAtIndex(itemToFocus.index);
167
+ }
168
+ }, [filteredIndexedItemsList, focusedItemIndex]);
169
+ (0, _reactHotkeyz.useHotkeys)({
170
+ zIndex: 1000,
171
+ keys: {
172
+ "mod+k": showOmniSearch,
173
+ esc: hideOmniSearch
174
+ }
175
+ });
176
+ (0, _reactHotkeyz.useHotkeys)({
177
+ zIndex: 1000,
178
+ keys: {
179
+ enter: selectFocusedItem,
180
+ arrowUp: focusPrevItem,
181
+ arrowDown: focusNextItem
182
+ },
183
+ disabled: !omniSearchVisible
184
+ });
185
+ if (!omniSearchVisible) {
186
+ return null;
187
+ }
188
+ var renderedResults = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Nothing to show.");
189
+ if (filteredIndexedItemsList.length > 0) {
190
+ renderedResults = /*#__PURE__*/_react.default.createElement("ul", null, filteredIndexedItemsList.map(function (itemsSection) {
191
+ return /*#__PURE__*/_react.default.createElement("li", {
192
+ key: itemsSection.id
193
+ }, /*#__PURE__*/_react.default.createElement("div", {
194
+ className: "section-title"
195
+ }, /*#__PURE__*/_react.default.createElement(_Typography.Typography, {
196
+ use: "overline"
197
+ }, itemsSection.title)), /*#__PURE__*/_react.default.createElement("div", {
198
+ className: "section-items"
199
+ }, /*#__PURE__*/_react.default.createElement("ul", null, itemsSection.items.map(function (item) {
200
+ var isFocused = item.index === focusedItemIndex;
201
+ return /*#__PURE__*/_react.default.createElement("li", {
202
+ className: isFocused ? "focused" : "",
203
+ key: item.id,
204
+ onClick: function onClick() {
205
+ return selectFocusedItem();
206
+ },
207
+ onMouseEnter: function onMouseEnter() {
208
+ return focusItemAtIndex(item.index);
209
+ }
210
+ }, /*#__PURE__*/_react.default.createElement("div", {
211
+ className: "section-item-title"
212
+ }, item.title), /*#__PURE__*/_react.default.createElement(_Typography.Typography, {
213
+ use: "caption",
214
+ className: "section-item-description"
215
+ }, item.description));
216
+ }))));
217
+ }));
218
+ }
219
+ return /*#__PURE__*/_react.default.createElement(_Dialog.Dialog, null, /*#__PURE__*/_react.default.createElement("div", {
220
+ className: "dialog"
221
+ }, /*#__PURE__*/_react.default.createElement("div", {
222
+ className: "search-input"
223
+ }, /*#__PURE__*/_react.default.createElement(_Input.Input, {
224
+ icon: /*#__PURE__*/_react.default.createElement(_search.ReactComponent, null),
225
+ placeholder: "Search...",
226
+ autoFocus: true,
227
+ value: filter,
228
+ onChange: onFilter
229
+ })), renderedResults));
230
+ };
231
+ exports.OmniSearch = OmniSearch;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getIndexedItemsList","items","lastUsedItemIndex","map","itemsSection","item","index","getItemFromIndexedItemsList","itemsSections","i","length","j","OmniSearch","useState","omniSearchVisible","setShowOmniSearch","filter","setFilter","focusedItemIndex","focusItemAtIndex","useNavigation","menuItems","useSnackbar","showSnackbar","navigate","useNavigate","showOmniSearch","useCallback","hideOmniSearch","onFilter","searchString","selectItem","link","callback","fullItemsList","useMemo","id","title","level1Item","children","level2Item","child","description","label","join","path","flat","getTenantId","navigator","clipboard","writeText","Boolean","filteredIndexedItemsList","filteredItems1stPass","toLowerCase","includes","filteredItems2ndPass","selectFocusedItem","focusedItem","focusNextItem","nextIndex","itemToFocus","focusPrevItem","prevIndex","useHotkeys","zIndex","keys","esc","enter","arrowUp","arrowDown","disabled","renderedResults","isFocused"],"sources":["OmniSearch.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport { useNavigation } from \"@webiny/app-admin\";\nimport { useNavigate } from \"@webiny/react-router\";\nimport { useSnackbar } from \"@webiny/app-admin\";\nimport { getTenantId } from \"@webiny/app/utils\";\nimport { ReactComponent as SearchIcon } from \"@material-design-icons/svg/outlined/search.svg\";\n\n// @ts-ignore Library doesn't have types.\nimport { useHotkeys } from \"react-hotkeyz\";\nimport { Input } from \"@webiny/ui/Input\";\nimport { Typography } from \"@webiny/ui/Typography\";\n\nimport { Dialog } from \"./OmniSearch/Dialog\";\n\ninterface Item {\n id: string;\n title: string;\n description: string;\n link?: string;\n callback?: () => void | Promise<void>;\n}\n\ninterface ItemsSection {\n id: string;\n title: string;\n items: Item[];\n}\n\ninterface IndexedItem extends Item {\n index: number;\n}\n\ninterface IndexedItemsSection extends Omit<ItemsSection, \"items\"> {\n id: string;\n title: string;\n items: IndexedItem[];\n}\n\nconst getIndexedItemsList = (items: ItemsSection[]): IndexedItemsSection[] => {\n let lastUsedItemIndex = 0;\n return items.map(itemsSection => {\n return {\n ...itemsSection,\n items: itemsSection.items.map(item => {\n const index = lastUsedItemIndex++;\n return {\n ...item,\n index\n };\n })\n };\n });\n};\n\nconst getItemFromIndexedItemsList = (\n itemsSections: IndexedItemsSection[],\n index: number\n): IndexedItem | null => {\n if (index < 0) {\n return null;\n }\n\n for (let i = 0; i < itemsSections.length; i++) {\n const itemsSection = itemsSections[i];\n for (let j = 0; j < itemsSection.items.length; j++) {\n const item = itemsSection.items[j];\n if (item.index === index) {\n return item;\n }\n }\n }\n\n return null;\n};\n\nexport const OmniSearch = () => {\n const [omniSearchVisible, setShowOmniSearch] = useState(false);\n const [filter, setFilter] = useState(\"\");\n const [focusedItemIndex, focusItemAtIndex] = useState(0);\n const { menuItems } = useNavigation();\n const { showSnackbar } = useSnackbar();\n const navigate = useNavigate();\n const showOmniSearch = useCallback(() => {\n setShowOmniSearch(true);\n }, []);\n\n const hideOmniSearch = useCallback(() => {\n setShowOmniSearch(false);\n setFilter(\"\");\n }, []);\n\n const onFilter = useCallback(searchString => {\n setFilter(searchString);\n focusItemAtIndex(0);\n }, []);\n\n const selectItem = useCallback((item: Item) => {\n if (item.link) {\n navigate(item.link);\n } else if (item.callback) {\n item.callback();\n }\n\n hideOmniSearch();\n }, []);\n\n // TODO: should be pulled from registered plugins.\n const fullItemsList = useMemo<ItemsSection[]>(() => {\n return [\n {\n id: \"apps\",\n title: \"Apps\",\n items: menuItems\n .map(level1Item => {\n return [\n ...level1Item.children.map(level2Item => {\n return [\n ...level2Item.children.map(child => {\n const description = [\n level1Item.label,\n level2Item.label\n ].join(\" / \");\n\n return {\n id: description + child.label,\n title: child.label!,\n description,\n link: child.path\n };\n })\n ];\n })\n ].flat();\n })\n .flat()\n },\n {\n id: \"other\",\n title: \"Other\",\n items: [\n {\n id: \"back\",\n title: \"← Back\",\n description: \"Navigates to the previous page.\",\n callback: () => {\n navigate(-1);\n }\n }\n ]\n },\n getTenantId() && {\n id: \"development\",\n title: \"Development\",\n items: [\n {\n id: \"copy-tenant-id\",\n title: \"Copy current tenant ID\",\n description: \"Copies current tenant ID into clipboard.\",\n callback: () => {\n navigator.clipboard.writeText(getTenantId()!);\n showSnackbar(\"Tenant ID copied to clipboard.\");\n }\n }\n ]\n }\n ].filter(Boolean) as ItemsSection[];\n }, [menuItems]);\n\n const filteredIndexedItemsList = useMemo(() => {\n if (!filter) {\n return getIndexedItemsList(fullItemsList);\n }\n\n const filteredItems1stPass = fullItemsList.map(itemsSection => {\n return {\n ...itemsSection,\n items: itemsSection.items.filter(item => {\n return item.title?.toLowerCase().includes(filter.toLowerCase());\n })\n };\n });\n\n const filteredItems2ndPass = filteredItems1stPass.filter(\n itemsSection => itemsSection.items.length > 0\n );\n\n return getIndexedItemsList(filteredItems2ndPass);\n }, [fullItemsList, filter]);\n\n const selectFocusedItem = useCallback(() => {\n const focusedItem = getItemFromIndexedItemsList(filteredIndexedItemsList, focusedItemIndex);\n if (focusedItem) {\n selectItem(focusedItem);\n }\n }, [filteredIndexedItemsList, focusedItemIndex]);\n\n const focusNextItem = useCallback(() => {\n const nextIndex = focusedItemIndex + 1;\n const itemToFocus = getItemFromIndexedItemsList(filteredIndexedItemsList, nextIndex);\n if (itemToFocus) {\n focusItemAtIndex(itemToFocus.index);\n }\n }, [filteredIndexedItemsList, focusedItemIndex]);\n\n const focusPrevItem = useCallback(() => {\n const prevIndex = focusedItemIndex - 1;\n const itemToFocus = getItemFromIndexedItemsList(filteredIndexedItemsList, prevIndex);\n if (itemToFocus) {\n focusItemAtIndex(itemToFocus.index);\n }\n }, [filteredIndexedItemsList, focusedItemIndex]);\n\n useHotkeys({\n zIndex: 1000,\n keys: {\n \"mod+k\": showOmniSearch,\n esc: hideOmniSearch\n }\n });\n\n useHotkeys({\n zIndex: 1000,\n keys: {\n enter: selectFocusedItem,\n arrowUp: focusPrevItem,\n arrowDown: focusNextItem\n },\n disabled: !omniSearchVisible\n });\n\n if (!omniSearchVisible) {\n return null;\n }\n\n let renderedResults = <>Nothing to show.</>;\n if (filteredIndexedItemsList.length > 0) {\n renderedResults = (\n <ul>\n {filteredIndexedItemsList.map(itemsSection => (\n <li key={itemsSection.id}>\n <div className={\"section-title\"}>\n <Typography use={\"overline\"}>{itemsSection.title}</Typography>\n </div>\n <div className={\"section-items\"}>\n <ul>\n {itemsSection.items.map(item => {\n const isFocused = item.index === focusedItemIndex;\n return (\n <li\n className={isFocused ? \"focused\" : \"\"}\n key={item.id}\n onClick={() => selectFocusedItem()}\n onMouseEnter={() => focusItemAtIndex(item.index)}\n >\n <div className={\"section-item-title\"}>{item.title}</div>\n <Typography\n use={\"caption\"}\n className={\"section-item-description\"}\n >\n {item.description}\n </Typography>\n </li>\n );\n })}\n </ul>\n </div>\n </li>\n ))}\n </ul>\n );\n }\n\n return (\n <Dialog>\n <div className={\"dialog\"}>\n <div className={\"search-input\"}>\n <Input\n icon={<SearchIcon />}\n placeholder={\"Search...\"}\n autoFocus\n value={filter}\n onChange={onFilter}\n />\n </div>\n {renderedResults}\n </div>\n </Dialog>\n );\n};\n"],"mappings":"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"}
@@ -10,6 +10,8 @@ var _appAdmin = require("@webiny/app-admin/");
10
10
  var _Snackbar = _interopRequireDefault(require("./Snackbar"));
11
11
  var _Dialog = require("./Dialog");
12
12
  var _base = require("@rmwc/base");
13
+ var _featureFlags = require("@webiny/feature-flags");
14
+ var _OmniSearch = require("./OmniSearch");
13
15
  /**
14
16
  * Dialogs, Menus and Snackbars require a container to be rendered, and we want to place it outside of
15
17
  * any other views that are constructed by developers. We need these 2 containers to always be
@@ -23,7 +25,7 @@ var OverlaysHOC = function OverlaysHOC(Component) {
23
25
  zIndex: 30,
24
26
  position: "absolute"
25
27
  }
26
- }, /*#__PURE__*/_react.default.createElement(_Snackbar.default, null)), /*#__PURE__*/_react.default.createElement(_base.Portal, null), /*#__PURE__*/_react.default.createElement(_Dialog.DialogContainer, null));
28
+ }, /*#__PURE__*/_react.default.createElement(_Snackbar.default, null)), /*#__PURE__*/_react.default.createElement(_base.Portal, null), /*#__PURE__*/_react.default.createElement(_Dialog.DialogContainer, null), _featureFlags.featureFlags.experimentalAdminOmniSearch && /*#__PURE__*/_react.default.createElement(_OmniSearch.OmniSearch, null));
27
29
  };
28
30
  };
29
31
  var Overlays = function Overlays() {
@@ -1 +1 @@
1
- {"version":3,"names":["OverlaysHOC","Component","Overlays","children","zIndex","position"],"sources":["index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"@webiny/app-admin/\";\nimport Snackbar from \"./Snackbar\";\nimport { DialogContainer } from \"./Dialog\";\nimport { Portal } from \"@rmwc/base\";\n\n/**\n * Dialogs, Menus and Snackbars require a container to be rendered, and we want to place it outside of\n * any other views that are constructed by developers. We need these 2 containers to always be\n * present, even if there is no <Layout> mounted.\n */\nconst OverlaysHOC = (Component: React.FC): React.FC => {\n return function Overlays({ children }) {\n return (\n <Component>\n {children}\n <div style={{ zIndex: 30, position: \"absolute\" }}>\n <Snackbar />\n </div>\n <Portal />\n <DialogContainer />\n </Component>\n );\n };\n};\n\nexport const Overlays: React.FC = () => {\n /**\n * TODO @ts-refactor @pavel\n */\n // @ts-ignore\n return <Provider hoc={OverlaysHOC} />;\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA,IAAMA,WAAW,GAAG,SAAdA,WAAW,CAAIC,SAAmB,EAAe;EACnD,OAAO,SAASC,QAAQ,OAAe;IAAA,IAAZC,QAAQ,QAARA,QAAQ;IAC/B,oBACI,6BAAC,SAAS,QACLA,QAAQ,eACT;MAAK,KAAK,EAAE;QAAEC,MAAM,EAAE,EAAE;QAAEC,QAAQ,EAAE;MAAW;IAAE,gBAC7C,6BAAC,iBAAQ,OAAG,CACV,eACN,6BAAC,YAAM,OAAG,eACV,6BAAC,uBAAe,OAAG,CACX;EAEpB,CAAC;AACL,CAAC;AAEM,IAAMH,QAAkB,GAAG,SAArBA,QAAkB,GAAS;EACpC;AACJ;AACA;EACI;EACA,oBAAO,6BAAC,kBAAQ;IAAC,GAAG,EAAEF;EAAY,EAAG;AACzC,CAAC;AAAC"}
1
+ {"version":3,"names":["OverlaysHOC","Component","Overlays","children","zIndex","position","featureFlags","experimentalAdminOmniSearch"],"sources":["index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"@webiny/app-admin/\";\nimport Snackbar from \"./Snackbar\";\nimport { DialogContainer } from \"./Dialog\";\nimport { Portal } from \"@rmwc/base\";\nimport { featureFlags } from \"@webiny/feature-flags\";\nimport { OmniSearch } from \"./OmniSearch\";\n\n/**\n * Dialogs, Menus and Snackbars require a container to be rendered, and we want to place it outside of\n * any other views that are constructed by developers. We need these 2 containers to always be\n * present, even if there is no <Layout> mounted.\n */\nconst OverlaysHOC = (Component: React.FC): React.FC => {\n return function Overlays({ children }) {\n return (\n <Component>\n {children}\n <div style={{ zIndex: 30, position: \"absolute\" }}>\n <Snackbar />\n </div>\n <Portal />\n <DialogContainer />\n {featureFlags.experimentalAdminOmniSearch && <OmniSearch />}\n </Component>\n );\n };\n};\n\nexport const Overlays: React.FC = () => {\n /**\n * TODO @ts-refactor @pavel\n */\n // @ts-ignore\n return <Provider hoc={OverlaysHOC} />;\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA,IAAMA,WAAW,GAAG,SAAdA,WAAW,CAAIC,SAAmB,EAAe;EACnD,OAAO,SAASC,QAAQ,OAAe;IAAA,IAAZC,QAAQ,QAARA,QAAQ;IAC/B,oBACI,6BAAC,SAAS,QACLA,QAAQ,eACT;MAAK,KAAK,EAAE;QAAEC,MAAM,EAAE,EAAE;QAAEC,QAAQ,EAAE;MAAW;IAAE,gBAC7C,6BAAC,iBAAQ,OAAG,CACV,eACN,6BAAC,YAAM,OAAG,eACV,6BAAC,uBAAe,OAAG,EAClBC,0BAAY,CAACC,2BAA2B,iBAAI,6BAAC,sBAAU,OAAG,CACnD;EAEpB,CAAC;AACL,CAAC;AAEM,IAAML,QAAkB,GAAG,SAArBA,QAAkB,GAAS;EACpC;AACJ;AACA;EACI;EACA,oBAAO,6BAAC,kBAAQ;IAAC,GAAG,EAAEF;EAAY,EAAG;AACzC,CAAC;AAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-admin-rmwc",
3
- "version": "0.0.0-unstable.c2780f51fe",
3
+ "version": "0.0.0-unstable.c7dec08bb0",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -11,38 +11,41 @@
11
11
  "dependencies": {
12
12
  "@babel/runtime": "7.20.13",
13
13
  "@emotion/styled": "11.10.6",
14
+ "@material-design-icons/svg": "0.12.1",
14
15
  "@rmwc/base": "7.0.3",
15
16
  "@rmwc/provider": "7.0.3",
16
17
  "@types/react": "17.0.39",
17
- "@webiny/app": "0.0.0-unstable.c2780f51fe",
18
- "@webiny/app-admin": "0.0.0-unstable.c2780f51fe",
19
- "@webiny/app-plugin-admin-welcome-screen": "0.0.0-unstable.c2780f51fe",
20
- "@webiny/app-security": "0.0.0-unstable.c2780f51fe",
21
- "@webiny/plugins": "0.0.0-unstable.c2780f51fe",
22
- "@webiny/react-router": "0.0.0-unstable.c2780f51fe",
23
- "@webiny/ui": "0.0.0-unstable.c2780f51fe",
18
+ "@webiny/app": "0.0.0-unstable.c7dec08bb0",
19
+ "@webiny/app-admin": "0.0.0-unstable.c7dec08bb0",
20
+ "@webiny/app-plugin-admin-welcome-screen": "0.0.0-unstable.c7dec08bb0",
21
+ "@webiny/app-security": "0.0.0-unstable.c7dec08bb0",
22
+ "@webiny/feature-flags": "0.0.0-unstable.c7dec08bb0",
23
+ "@webiny/plugins": "0.0.0-unstable.c7dec08bb0",
24
+ "@webiny/react-router": "0.0.0-unstable.c7dec08bb0",
25
+ "@webiny/ui": "0.0.0-unstable.c7dec08bb0",
24
26
  "classnames": "2.3.2",
25
27
  "emotion": "10.0.27",
26
28
  "lodash": "4.17.21",
27
29
  "react": "17.0.2",
28
30
  "react-dom": "17.0.2",
29
31
  "react-helmet": "6.1.0",
32
+ "react-hotkeyz": "1.0.4",
30
33
  "react-transition-group": "4.4.5",
31
34
  "store": "2.0.12"
32
35
  },
33
36
  "devDependencies": {
34
- "@babel/cli": "^7.19.3",
35
- "@babel/core": "^7.19.3",
36
- "@babel/preset-env": "^7.19.4",
37
- "@babel/preset-react": "^7.0.0",
38
- "@babel/preset-typescript": "^7.18.6",
39
- "@types/react-helmet": "^6.1.5",
40
- "@webiny/cli": "^0.0.0-unstable.c2780f51fe",
41
- "@webiny/project-utils": "^0.0.0-unstable.c2780f51fe",
42
- "babel-plugin-emotion": "^9.2.8",
43
- "babel-plugin-named-asset-import": "^1.0.0-next.3e165448",
44
- "rimraf": "^3.0.2",
45
- "ttypescript": "^1.5.12",
37
+ "@babel/cli": "7.20.7",
38
+ "@babel/core": "7.20.12",
39
+ "@babel/preset-env": "7.20.2",
40
+ "@babel/preset-react": "7.18.6",
41
+ "@babel/preset-typescript": "7.18.6",
42
+ "@types/react-helmet": "6.1.6",
43
+ "@webiny/cli": "0.0.0-unstable.c7dec08bb0",
44
+ "@webiny/project-utils": "0.0.0-unstable.c7dec08bb0",
45
+ "babel-plugin-emotion": "9.2.11",
46
+ "babel-plugin-named-asset-import": "1.0.0-next.fb6e6f70",
47
+ "rimraf": "3.0.2",
48
+ "ttypescript": "1.5.15",
46
49
  "typescript": "4.7.4"
47
50
  },
48
51
  "publishConfig": {
@@ -58,5 +61,5 @@
58
61
  "removeViewBox": false
59
62
  }
60
63
  },
61
- "gitHead": "c2780f51fe628e1ef0f6b55c2bce9b74d3470d79"
64
+ "gitHead": "c7dec08bb095467cca6a61381bd399d66b7bb147"
62
65
  }