@micromag/editor 0.3.538 → 0.3.539

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/lib/index.js ADDED
@@ -0,0 +1,4103 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
6
+ var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
7
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
8
+ var core = require('@micromag/core');
9
+ var components = require('@micromag/core/components');
10
+ var contexts = require('@micromag/core/contexts');
11
+ var hooks = require('@micromag/core/hooks');
12
+ var utils = require('@micromag/core/utils');
13
+ var classNames = require('classnames');
14
+ var PropTypes = require('prop-types');
15
+ var React = require('react');
16
+ var reactIntl = require('react-intl');
17
+ var _toArray = require('@babel/runtime/helpers/toArray');
18
+ var _createForOfIteratorHelper = require('@babel/runtime/helpers/createForOfIteratorHelper');
19
+ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
20
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
21
+ var regexparam = require('regexparam');
22
+ var index_js = require('use-sync-external-store/shim/index.js');
23
+ var pathToRegexp = require('path-to-regexp');
24
+ var mitt = require('mitt');
25
+ var reactTransitionGroup = require('react-transition-group');
26
+ var faCogs = require('@fortawesome/free-solid-svg-icons/faCogs');
27
+ var faEllipsisV = require('@fortawesome/free-solid-svg-icons/faEllipsisV');
28
+ var reactFontawesome = require('@fortawesome/react-fontawesome');
29
+ var fields = require('@micromag/fields');
30
+ var uuid = require('uuid');
31
+ var size = require('@folklore/size');
32
+ var viewer = require('@micromag/viewer');
33
+ var faPlus = require('@fortawesome/free-solid-svg-icons/faPlus');
34
+ var faTimesCircle = require('@fortawesome/free-solid-svg-icons/faTimesCircle');
35
+ var isString = require('lodash/isString');
36
+ var isFunction = require('lodash/isFunction');
37
+ var reactSortablejs = require('react-sortablejs');
38
+ var core$1 = require('@dnd-kit/core');
39
+ var sortable = require('@dnd-kit/sortable');
40
+ var reactDom = require('react-dom');
41
+ var utilities = require('@dnd-kit/utilities');
42
+ var faAngleDown = require('@fortawesome/free-solid-svg-icons/faAngleDown');
43
+ var faGripLines = require('@fortawesome/free-solid-svg-icons/faGripLines');
44
+ var faTimes = require('@fortawesome/free-solid-svg-icons/faTimes');
45
+ var orderBy = require('lodash/orderBy');
46
+ var uppy = require('@panneau/uppy');
47
+ var screens = require('@micromag/screens');
48
+
49
+ function _interopNamespaceDefault(e) {
50
+ var n = Object.create(null);
51
+ if (e) {
52
+ Object.keys(e).forEach(function (k) {
53
+ if (k !== 'default') {
54
+ var d = Object.getOwnPropertyDescriptor(e, k);
55
+ Object.defineProperty(n, k, d.get ? d : {
56
+ enumerable: true,
57
+ get: function () { return e[k]; }
58
+ });
59
+ }
60
+ });
61
+ }
62
+ n.default = e;
63
+ return Object.freeze(n);
64
+ }
65
+
66
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
67
+
68
+ var useEffect = React__namespace.useEffect,
69
+ useLayoutEffect = React__namespace.useLayoutEffect,
70
+ useRef = React__namespace.useRef;
71
+
72
+ // React.useInsertionEffect is not available in React <18
73
+ // This hack fixes a transpilation issue on some apps
74
+ var useBuiltinInsertionEffect = React__namespace['useInsertion' + 'Effect'];
75
+
76
+ // Copied from:
77
+ // https://github.com/facebook/react/blob/main/packages/shared/ExecutionEnvironment.js
78
+ var canUseDOM = !!(typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined");
79
+
80
+ // Copied from:
81
+ // https://github.com/reduxjs/react-redux/blob/master/src/utils/useIsomorphicLayoutEffect.ts
82
+ // "React currently throws a warning when using useLayoutEffect on the server.
83
+ // To get around it, we can conditionally useEffect on the server (no-op) and
84
+ // useLayoutEffect in the browser."
85
+ var useIsomorphicLayoutEffect = canUseDOM ? useLayoutEffect : useEffect;
86
+
87
+ // useInsertionEffect is already a noop on the server.
88
+ // See: https://github.com/facebook/react/blob/main/packages/react-server/src/ReactFizzHooks.js
89
+ var useInsertionEffect = useBuiltinInsertionEffect || useIsomorphicLayoutEffect;
90
+
91
+ // Userland polyfill while we wait for the forthcoming
92
+ // https://github.com/reactjs/rfcs/blob/useevent/text/0000-useevent.md
93
+ // Note: "A high-fidelity polyfill for useEvent is not possible because
94
+ // there is no lifecycle or Hook in React that we can use to switch
95
+ // .current at the right timing."
96
+ // So we will have to make do with this "close enough" approach for now.
97
+ var useEvent = function useEvent(fn) {
98
+ var ref = useRef([fn, function () {
99
+ return ref[0].apply(ref, arguments);
100
+ }]).current;
101
+ // Per Dan Abramov: useInsertionEffect executes marginally closer to the
102
+ // correct timing for ref synchronization than useLayoutEffect on React 18.
103
+ // See: https://github.com/facebook/react/pull/25881#issuecomment-1356244360
104
+ useInsertionEffect(function () {
105
+ ref[0] = fn;
106
+ });
107
+ return ref[1];
108
+ };
109
+
110
+ /**
111
+ * History API docs @see https://developer.mozilla.org/en-US/docs/Web/API/History
112
+ */
113
+ var eventPopstate = "popstate";
114
+ var eventPushState = "pushState";
115
+ var eventReplaceState = "replaceState";
116
+ var eventHashchange = "hashchange";
117
+ var events = [eventPopstate, eventPushState, eventReplaceState, eventHashchange];
118
+ var subscribeToLocationUpdates = function subscribeToLocationUpdates(callback) {
119
+ for (var _i = 0, _events = events; _i < _events.length; _i++) {
120
+ var event = _events[_i];
121
+ addEventListener(event, callback);
122
+ }
123
+ return function () {
124
+ for (var _i2 = 0, _events2 = events; _i2 < _events2.length; _i2++) {
125
+ var _event = _events2[_i2];
126
+ removeEventListener(_event, callback);
127
+ }
128
+ };
129
+ };
130
+ var useLocationProperty = function useLocationProperty(fn, ssrFn) {
131
+ return index_js.useSyncExternalStore(subscribeToLocationUpdates, fn, ssrFn);
132
+ };
133
+ var currentSearch = function currentSearch() {
134
+ return location.search;
135
+ };
136
+ var useSearch = function useSearch() {
137
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
138
+ _ref$ssrSearch = _ref.ssrSearch,
139
+ ssrSearch = _ref$ssrSearch === void 0 ? "" : _ref$ssrSearch;
140
+ return useLocationProperty(currentSearch, function () {
141
+ return ssrSearch;
142
+ });
143
+ };
144
+ var currentPathname = function currentPathname() {
145
+ return location.pathname;
146
+ };
147
+ var usePathname = function usePathname() {
148
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
149
+ ssrPath = _ref2.ssrPath;
150
+ return useLocationProperty(currentPathname, ssrPath ? function () {
151
+ return ssrPath;
152
+ } : currentPathname);
153
+ };
154
+ var navigate = function navigate(to) {
155
+ var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
156
+ _ref3$replace = _ref3.replace,
157
+ replace = _ref3$replace === void 0 ? false : _ref3$replace,
158
+ _ref3$state = _ref3.state,
159
+ state = _ref3$state === void 0 ? null : _ref3$state;
160
+ return history[replace ? eventReplaceState : eventPushState](state, "", to);
161
+ };
162
+
163
+ // the 2nd argument of the `useBrowserLocation` return value is a function
164
+ // that allows to perform a navigation.
165
+ var useBrowserLocation = function useBrowserLocation() {
166
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
167
+ return [usePathname(opts), navigate];
168
+ };
169
+ var patchKey = Symbol["for"]("wouter_v3");
170
+
171
+ // While History API does have `popstate` event, the only
172
+ // proper way to listen to changes via `push/replaceState`
173
+ // is to monkey-patch these methods.
174
+ //
175
+ // See https://stackoverflow.com/a/4585031
176
+ if (typeof history !== "undefined" && typeof window[patchKey] === "undefined") {
177
+ var _loop = function _loop() {
178
+ var type = _arr[_i3];
179
+ var original = history[type];
180
+ // TODO: we should be using unstable_batchedUpdates to avoid multiple re-renders,
181
+ // however that will require an additional peer dependency on react-dom.
182
+ // See: https://github.com/reactwg/react-18/discussions/86#discussioncomment-1567149
183
+ history[type] = function () {
184
+ var result = original.apply(this, arguments);
185
+ var event = new Event(type);
186
+ event.arguments = arguments;
187
+ dispatchEvent(event);
188
+ return result;
189
+ };
190
+ };
191
+ for (var _i3 = 0, _arr = [eventPushState, eventReplaceState]; _i3 < _arr.length; _i3++) {
192
+ _loop();
193
+ }
194
+
195
+ // patch history object only once
196
+ // See: https://github.com/molefrog/wouter/issues/167
197
+ Object.defineProperty(window, patchKey, {
198
+ value: true
199
+ });
200
+ }
201
+
202
+ var _excluded$d = ["children"],
203
+ _excluded2$1 = ["path", "nest", "match"],
204
+ _excluded3 = ["to", "href", "onClick", "asChild", "children", "className", "replace", "state"];
205
+
206
+ /*
207
+ * Transforms `path` into its relative `base` version
208
+ * If base isn't part of the path provided returns absolute path e.g. `~/app`
209
+ */
210
+ var relativePath = function relativePath() {
211
+ var base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
212
+ var path = arguments.length > 1 ? arguments[1] : undefined;
213
+ return !path.toLowerCase().indexOf(base.toLowerCase()) ? path.slice(base.length) || "/" : "~" + path;
214
+ };
215
+ var absolutePath = function absolutePath(to) {
216
+ var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
217
+ return to[0] === "~" ? to.slice(1) : base + to;
218
+ };
219
+
220
+ /*
221
+ * decodes escape sequences such as %20
222
+ */
223
+ var unescape = function unescape(str) {
224
+ try {
225
+ return decodeURI(str);
226
+ } catch (_e) {
227
+ // fail-safe mode: if string can't be decoded do nothing
228
+ return str;
229
+ }
230
+ };
231
+
232
+ /*
233
+ * Router and router context. Router is a lightweight object that represents the current
234
+ * routing options: how location is managed, base path etc.
235
+ *
236
+ * There is a default router present for most of the use cases, however it can be overridden
237
+ * via the <Router /> component.
238
+ */
239
+
240
+ var defaultRouter = {
241
+ hook: useBrowserLocation,
242
+ searchHook: useSearch,
243
+ parser: regexparam.parse,
244
+ base: "",
245
+ // this option is used to override the current location during SSR
246
+ ssrPath: undefined,
247
+ ssrSearch: undefined,
248
+ // customizes how `href` props are transformed for <Link />
249
+ hrefs: function hrefs(x) {
250
+ return x;
251
+ }
252
+ };
253
+ var RouterCtx = React.createContext(defaultRouter);
254
+
255
+ // gets the closest parent router from the context
256
+ var useRouter = function useRouter() {
257
+ return React.useContext(RouterCtx);
258
+ };
259
+
260
+ /**
261
+ * Parameters context. Used by `useParams()` to get the
262
+ * matched params from the innermost `Route` component.
263
+ */
264
+
265
+ var ParamsCtx = React.createContext({});
266
+
267
+ /*
268
+ * Part 1, Hooks API: useRoute and useLocation
269
+ */
270
+
271
+ // Internal version of useLocation to avoid redundant useRouter calls
272
+
273
+ var useLocationFromRouter = function useLocationFromRouter(router) {
274
+ var _router$hook = router.hook(router),
275
+ _router$hook2 = _slicedToArray(_router$hook, 2),
276
+ location = _router$hook2[0],
277
+ navigate = _router$hook2[1];
278
+
279
+ // the function reference should stay the same between re-renders, so that
280
+ // it can be passed down as an element prop without any performance concerns.
281
+ // (This is achieved via `useEvent`.)
282
+ return [unescape(relativePath(router.base, location)), useEvent(function (to, navOpts) {
283
+ return navigate(absolutePath(to, router.base), navOpts);
284
+ })];
285
+ };
286
+ var useLocation = function useLocation() {
287
+ return useLocationFromRouter(useRouter());
288
+ };
289
+ var matchRoute = function matchRoute(parser, route, path, loose) {
290
+ // when parser is in "loose" mode, `$base` is equal to the
291
+ // first part of the route that matches the pattern
292
+ // (e.g. for pattern `/a/:b` and path `/a/1/2/3` the `$base` is `a/1`)
293
+ // we use this for route nesting
294
+ var _parser = parser(route || "*", loose),
295
+ pattern = _parser.pattern,
296
+ keys = _parser.keys;
297
+ var _ref = pattern.exec(path) || [],
298
+ _ref2 = _toArray(_ref),
299
+ $base = _ref2[0],
300
+ matches = _ref2.slice(1);
301
+ return $base !== undefined ? [true,
302
+ // an object with parameters matched, e.g. { foo: "bar" } for "/:foo"
303
+ // we "zip" two arrays here to construct the object
304
+ // ["foo"], ["bar"] → { foo: "bar" }
305
+ Object.fromEntries(keys.map(function (key, i) {
306
+ return [key, matches[i]];
307
+ }))].concat(_toConsumableArray(loose ? [$base] : [])) : [false, null];
308
+ };
309
+
310
+ /*
311
+ * Part 2, Low Carb Router API: Router, Route, Link, Switch
312
+ */
313
+
314
+ var Router = function Router(_ref3) {
315
+ var _props$ssrPath$split, _props$ssrPath, _props$hrefs, _props$hook;
316
+ var children = _ref3.children,
317
+ props = _objectWithoutProperties(_ref3, _excluded$d);
318
+ // the router we will inherit from - it is the closest router in the tree,
319
+ // unless the custom `hook` is provided (in that case it's the default one)
320
+ var parent_ = useRouter();
321
+ var parent = props.hook ? defaultRouter : parent_;
322
+
323
+ // holds to the context value: the router object
324
+ var value = parent;
325
+
326
+ // when `ssrPath` contains a `?` character, we can extract the search from it
327
+ var _ref4 = (_props$ssrPath$split = (_props$ssrPath = props.ssrPath) === null || _props$ssrPath === void 0 ? void 0 : _props$ssrPath.split("?")) !== null && _props$ssrPath$split !== void 0 ? _props$ssrPath$split : [],
328
+ _ref5 = _slicedToArray(_ref4, 2),
329
+ path = _ref5[0],
330
+ search = _ref5[1];
331
+ if (search) props.ssrSearch = search, props.ssrPath = path;
332
+
333
+ // hooks can define their own `href` formatter (e.g. for hash location)
334
+ props.hrefs = (_props$hrefs = props.hrefs) !== null && _props$hrefs !== void 0 ? _props$hrefs : (_props$hook = props.hook) === null || _props$hook === void 0 ? void 0 : _props$hook.hrefs;
335
+
336
+ // what is happening below: to avoid unnecessary rerenders in child components,
337
+ // we ensure that the router object reference is stable, unless there are any
338
+ // changes that require reload (e.g. `base` prop changes -> all components that
339
+ // get the router from the context should rerender, even if the component is memoized).
340
+ // the expected behaviour is:
341
+ //
342
+ // 1) when the resulted router is no different from the parent, use parent
343
+ // 2) if the custom `hook` prop is provided, we always inherit from the
344
+ // default router instead. this resets all previously overridden options.
345
+ // 3) when the router is customized here, it should stay stable between renders
346
+ var ref = React.useRef({}),
347
+ prev = ref.current,
348
+ next = prev;
349
+ for (var k in parent) {
350
+ var option = k === "base" ? /* base is special case, it is appended to the parent's base */
351
+ parent[k] + (props[k] || "") : props[k] || parent[k];
352
+ if (prev === next && option !== next[k]) {
353
+ ref.current = next = _objectSpread({}, next);
354
+ }
355
+ next[k] = option;
356
+
357
+ // the new router is no different from the parent, use parent
358
+ if (option !== parent[k]) value = next;
359
+ }
360
+ return React.createElement(RouterCtx.Provider, {
361
+ value: value,
362
+ children: children
363
+ });
364
+ };
365
+ var h_route = function h_route(_ref6, params) {
366
+ var children = _ref6.children,
367
+ component = _ref6.component;
368
+ // React-Router style `component` prop
369
+ if (component) return React.createElement(component, {
370
+ params: params
371
+ });
372
+
373
+ // support render prop or plain children
374
+ return typeof children === "function" ? children(params) : children;
375
+ };
376
+ var Route = function Route(_ref7) {
377
+ var path = _ref7.path,
378
+ nest = _ref7.nest,
379
+ match = _ref7.match,
380
+ renderProps = _objectWithoutProperties(_ref7, _excluded2$1);
381
+ var router = useRouter();
382
+ var _useLocationFromRoute = useLocationFromRouter(router),
383
+ _useLocationFromRoute2 = _slicedToArray(_useLocationFromRoute, 1),
384
+ location = _useLocationFromRoute2[0];
385
+ var _ref8 = // `match` is a special prop to give up control to the parent,
386
+ // it is used by the `Switch` to avoid double matching
387
+ match !== null && match !== void 0 ? match : matchRoute(router.parser, path, location, nest),
388
+ _ref9 = _slicedToArray(_ref8, 3),
389
+ matches = _ref9[0],
390
+ params = _ref9[1],
391
+ base = _ref9[2];
392
+ if (!matches) return null;
393
+ var children = base ? React.createElement(Router, {
394
+ base: base
395
+ }, h_route(renderProps, params)) : h_route(renderProps, params);
396
+ return React.createElement(ParamsCtx.Provider, {
397
+ value: params,
398
+ children: children
399
+ });
400
+ };
401
+ React.forwardRef(function (props, ref) {
402
+ var router = useRouter();
403
+ var _useLocationFromRoute3 = useLocationFromRouter(router),
404
+ _useLocationFromRoute4 = _slicedToArray(_useLocationFromRoute3, 2),
405
+ path = _useLocationFromRoute4[0],
406
+ navigate = _useLocationFromRoute4[1];
407
+ var to = props.to,
408
+ _props$href = props.href,
409
+ _href = _props$href === void 0 ? to : _props$href,
410
+ _onClick = props.onClick,
411
+ asChild = props.asChild,
412
+ children = props.children,
413
+ cls = props.className;
414
+ props.replace;
415
+ props.state;
416
+ var restProps = _objectWithoutProperties(props, _excluded3);
417
+ var onClick = useEvent(function (event) {
418
+ // ignores the navigation when clicked using right mouse button or
419
+ // by holding a special modifier key: ctrl, command, win, alt, shift
420
+ if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey || event.button !== 0) return;
421
+ _onClick === null || _onClick === void 0 || _onClick(event);
422
+ if (!event.defaultPrevented) {
423
+ event.preventDefault();
424
+ navigate(_href, props);
425
+ }
426
+ });
427
+
428
+ // handle nested routers and absolute paths
429
+ var href = router.hrefs(_href[0] === "~" ? _href.slice(1) : router.base + _href, router // pass router as a second argument for convinience
430
+ );
431
+ return asChild && React.isValidElement(children) ? React.cloneElement(children, {
432
+ onClick: onClick,
433
+ href: href
434
+ }) : React.createElement("a", _objectSpread(_objectSpread({}, restProps), {}, {
435
+ onClick: onClick,
436
+ href: href,
437
+ // `className` can be a function to apply the class if this link is active
438
+ className: cls !== null && cls !== void 0 && cls.call ? cls(path === href) : cls,
439
+ children: children,
440
+ ref: ref
441
+ }));
442
+ });
443
+ var flattenChildren = function flattenChildren(children) {
444
+ return Array.isArray(children) ? children.flatMap(function (c) {
445
+ return flattenChildren(c && c.type === React.Fragment ? c.props.children : c);
446
+ }) : [children];
447
+ };
448
+ var Switch = function Switch(_ref10) {
449
+ var children = _ref10.children,
450
+ location = _ref10.location;
451
+ var router = useRouter();
452
+ var _useLocationFromRoute5 = useLocationFromRouter(router),
453
+ _useLocationFromRoute6 = _slicedToArray(_useLocationFromRoute5, 1),
454
+ originalLocation = _useLocationFromRoute6[0];
455
+ var _iterator = _createForOfIteratorHelper(flattenChildren(children)),
456
+ _step;
457
+ try {
458
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
459
+ var element = _step.value;
460
+ var match = 0;
461
+ if (React.isValidElement(element) &&
462
+ // we don't require an element to be of type Route,
463
+ // but we do require it to contain a truthy `path` prop.
464
+ // this allows to use different components that wrap Route
465
+ // inside of a switch, for example <AnimatedRoute />.
466
+ (match = matchRoute(router.parser, element.props.path, location || originalLocation, element.props.nest))[0]) return React.cloneElement(element, {
467
+ match: match
468
+ });
469
+ }
470
+ } catch (err) {
471
+ _iterator.e(err);
472
+ } finally {
473
+ _iterator.f();
474
+ }
475
+ return null;
476
+ };
477
+
478
+ ({
479
+ children: PropTypes.node.isRequired,
480
+ routes: PropTypes.objectOf(PropTypes.string).isRequired,
481
+ basePath: PropTypes.string
482
+ });
483
+ function parseLocation(location) {
484
+ var search = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
485
+ var hash = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
486
+ var _split = (location || '').split('?', 2),
487
+ _split2 = _slicedToArray(_split, 2),
488
+ pathname = _split2[0],
489
+ _split2$ = _split2[1],
490
+ searchFromPath = _split2$ === void 0 ? null : _split2$;
491
+ var _split3 = (searchFromPath || '').split('#', 2),
492
+ _split4 = _slicedToArray(_split3, 2),
493
+ searchWithoutHash = _split4[0],
494
+ _split4$ = _split4[1],
495
+ hashFromPath = _split4$ === void 0 ? null : _split4$;
496
+ return {
497
+ pathname: pathname !== '' ? pathname : '/',
498
+ search: search || searchWithoutHash || null,
499
+ hash: hash || hashFromPath || null
500
+ };
501
+ }
502
+ function useMemoryRouter() {
503
+ var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
504
+ _ref3$path = _ref3.path,
505
+ path = _ref3$path === void 0 ? '/' : _ref3$path,
506
+ _ref3$static = _ref3["static"],
507
+ staticLocation = _ref3$static === void 0 ? false : _ref3$static;
508
+ _ref3.record;
509
+ var currentPath = parseLocation(path);
510
+ var emitter = mitt();
511
+ var navigateImplementation = function navigateImplementation(newPath) {
512
+ var newParsedPath = parseLocation(newPath);
513
+ currentPath = newParsedPath;
514
+ emitter.emit('navigate', path);
515
+ };
516
+ var navigate = !staticLocation ? navigateImplementation : function () {
517
+ return null;
518
+ };
519
+ var subscribe = function subscribe(cb) {
520
+ emitter.on('navigate', cb);
521
+ return function () {
522
+ return emitter.off('navigate', cb);
523
+ };
524
+ };
525
+ function reset() {
526
+ navigateImplementation(path);
527
+ }
528
+ var locationHook = function locationHook() {
529
+ return [React.useSyncExternalStore(subscribe, function () {
530
+ return currentPath.pathname;
531
+ }), navigate];
532
+ };
533
+ var searchHook = function searchHook() {
534
+ return React.useSyncExternalStore(subscribe, function () {
535
+ return currentPath.search || '';
536
+ });
537
+ };
538
+ return {
539
+ hook: locationHook,
540
+ searchHook: searchHook,
541
+ reset: reset,
542
+ navigate: navigate
543
+ };
544
+ }
545
+ function useRouteMatcher() {
546
+ var router = useRouter();
547
+ var _useLocation3 = useLocation(),
548
+ _useLocation4 = _slicedToArray(_useLocation3, 1),
549
+ location = _useLocation4[0];
550
+ var matcher = React.useCallback(function (route) {
551
+ var specificLocation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
552
+ var path = specificLocation || location;
553
+ // when parser is in "loose" mode, `$base` is equal to the
554
+ // first part of the route that matches the pattern
555
+ // (e.g. for pattern `/a/:b` and path `/a/1/2/3` the `$base` is `a/1`)
556
+ // we use this for route nesting
557
+ var _router$parser = router.parser(route || '*'),
558
+ pattern = _router$parser.pattern,
559
+ keys = _router$parser.keys;
560
+ var _ref4 = pattern.exec(path) || [],
561
+ _ref5 = _toArray(_ref4),
562
+ $base = _ref5[0],
563
+ matches = _ref5.slice(1);
564
+ return $base !== undefined ? [true,
565
+ // an object with parameters matched, e.g. { foo: "bar" } for "/:foo"
566
+ // we "zip" two arrays here to construct the object
567
+ // ["foo"], ["bar"] → { foo: "bar" }
568
+ Object.fromEntries(keys.map(function (key, i) {
569
+ return [key, matches[i]];
570
+ }))] : [false];
571
+ }, [router, location]);
572
+ return matcher;
573
+ }
574
+ function createPathToRegexpParser(opts) {
575
+ return function (fullPath, loose) {
576
+ var path = fullPath.replace(/^(https?:\/\/[^/]+)\/?/, '/');
577
+ var keys = [];
578
+ var isWildcard = path.match(/(\/|^)\*$/) !== null;
579
+ var pattern = pathToRegexp.pathToRegexp(isWildcard ? path.replace(/(\/|^)\*$/, '$1(.*)') : path, keys, _objectSpread({
580
+ end: !loose && !isWildcard
581
+ }, opts));
582
+ return {
583
+ pattern: pattern,
584
+ // `pathToRegexp` returns some metadata about the keys,
585
+ // we want to strip it to just an array of keys
586
+ keys: keys.map(function (k) {
587
+ return k.name;
588
+ })
589
+ };
590
+ };
591
+ }
592
+
593
+ var useRouteParams = function useRouteParams() {
594
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
595
+ _ref$screenOnly = _ref.screenOnly,
596
+ screenOnly = _ref$screenOnly === void 0 ? false : _ref$screenOnly;
597
+ var routes = contexts.useRoutes();
598
+ var _useLocation = useLocation(),
599
+ _useLocation2 = _slicedToArray(_useLocation, 1),
600
+ location = _useLocation2[0];
601
+ var matcher = useRouteMatcher();
602
+ var _useMemo = React.useMemo(function () {
603
+ var paths = screenOnly ? [routes.screen, '/:screen/*', '*'] : [routes['screen.field.form'], routes['screen.field'], routes.screen, '*'];
604
+ return paths.reduce(function (currentParams, path) {
605
+ if (currentParams !== null) {
606
+ return currentParams;
607
+ }
608
+ var _matcher = matcher(path),
609
+ _matcher2 = _slicedToArray(_matcher, 2),
610
+ _matcher2$ = _matcher2[0],
611
+ match = _matcher2$ === void 0 ? false : _matcher2$,
612
+ params = _matcher2[1];
613
+ return match ? params : currentParams;
614
+ }, null) || {};
615
+ }, [routes, screenOnly, location, matcher]),
616
+ _useMemo$screen = _useMemo.screen,
617
+ screen = _useMemo$screen === void 0 ? null : _useMemo$screen,
618
+ _useMemo$field = _useMemo.field,
619
+ field = _useMemo$field === void 0 ? null : _useMemo$field,
620
+ _useMemo$form = _useMemo.form,
621
+ form = _useMemo$form === void 0 ? null : _useMemo$form;
622
+ var routeParams = React.useMemo(function () {
623
+ return screenOnly ? {
624
+ url: location,
625
+ screen: screen
626
+ } : {
627
+ url: location,
628
+ screen: screen,
629
+ field: field,
630
+ form: form
631
+ };
632
+ }, [screenOnly, location, screen, field, form]);
633
+ return routeParams;
634
+ };
635
+
636
+ var useFormTransition = function useFormTransition(url, screenIndex, styles) {
637
+ var lastPageRef = React.useRef({
638
+ url: url,
639
+ screenIndex: screenIndex
640
+ });
641
+ var direction = React.useMemo(function () {
642
+ var _lastPageRef$current = lastPageRef.current,
643
+ lastScreenIndex = _lastPageRef$current.screenIndex,
644
+ lastUrl = _lastPageRef$current.url;
645
+ lastPageRef.current.url = url;
646
+ lastPageRef.current.screenIndex = screenIndex;
647
+ if (screenIndex !== lastScreenIndex) {
648
+ // return screenIndex > lastScreenIndex ? 'bottom' : 'top';
649
+ return null;
650
+ }
651
+ var urlSplit = url.split('/');
652
+ var lastUrlSplit = lastUrl.split('/');
653
+ var currentPartsCount = urlSplit.length;
654
+ var previousPartsCount = lastUrlSplit.length;
655
+ var isSettings = urlSplit[currentPartsCount - 1] === 'settings';
656
+ var wasSettings = lastUrlSplit[previousPartsCount - 1] === 'settings';
657
+ currentPartsCount -= isSettings ? 1 : 0;
658
+ previousPartsCount -= wasSettings ? 1 : 0;
659
+ return currentPartsCount >= previousPartsCount ? 'right' : 'left';
660
+ }, [url, screenIndex]);
661
+ var transitionClassNames = React.useMemo(function () {
662
+ return {
663
+ enter: classNames(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, styles.enterRight, direction === 'right'), styles.enterLeft, direction === 'left'), styles.enterTop, direction === 'top'), styles.enterBottom, direction === 'bottom')) || 'none',
664
+ enterActive: classNames(_defineProperty(_defineProperty({}, styles.enterActiveHorizontal, direction === 'left' || direction === 'right'), styles.enterActiveVertical, direction === 'top' || direction === 'bottom')) || 'none',
665
+ exit: styles.exit || 'none',
666
+ exitActive: classNames(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, styles.exitActiveRight, direction === 'right'), styles.exitActiveLeft, direction === 'left'), styles.exitActiveTop, direction === 'top'), styles.exitActiveBottom, direction === 'bottom')) || 'none'
667
+ };
668
+ }, [direction, screenIndex]);
669
+ return {
670
+ direction: direction,
671
+ classNames: transitionClassNames,
672
+ timeout: direction === 'left' || direction === 'right' ? 300 : 10
673
+ };
674
+ };
675
+
676
+ var createScreen = function createScreen(definition) {
677
+ var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
678
+ var finalDefinition = isString(definition) ? {
679
+ id: definition
680
+ } : definition;
681
+ var id = finalDefinition.id;
682
+ var screenFields = utils.getScreenFieldsWithStates(finalDefinition);
683
+ var defaultValueFields = screenFields.reduce(function (all, curr) {
684
+ var _ref = curr || {},
685
+ _ref$name = _ref.name,
686
+ name = _ref$name === void 0 ? null : _ref$name,
687
+ _ref$defaultValue = _ref.defaultValue,
688
+ defaultValue = _ref$defaultValue === void 0 ? null : _ref$defaultValue;
689
+ var newAll = _objectSpread({}, all);
690
+ if (name !== null && defaultValue !== null) {
691
+ newAll[name] = defaultValue;
692
+ }
693
+ return newAll;
694
+ }, {});
695
+ return _objectSpread(_objectSpread(_objectSpread({
696
+ type: id
697
+ }, defaultValueFields), data), {}, {
698
+ id: uuid.v1()
699
+ });
700
+ };
701
+ var createScreen$1 = createScreen;
702
+
703
+ var _excluded$c = ["components"];
704
+ var deleteScreen = function deleteScreen(story, screenId) {
705
+ var _ref = story || {},
706
+ _ref$components = _ref.components,
707
+ components = _ref$components === void 0 ? [] : _ref$components,
708
+ currentValue = _objectWithoutProperties(_ref, _excluded$c);
709
+ return _objectSpread(_objectSpread({}, currentValue), {}, {
710
+ components: components.filter(function (_ref2) {
711
+ var id = _ref2.id;
712
+ return id !== screenId;
713
+ })
714
+ });
715
+ };
716
+
717
+ var _excluded$b = ["components"];
718
+ var duplicateScreen = function duplicateScreen(story, screenId) {
719
+ var screenIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
720
+ var _ref = story || {},
721
+ _ref$components = _ref.components,
722
+ components = _ref$components === void 0 ? [] : _ref$components,
723
+ currentValue = _objectWithoutProperties(_ref, _excluded$b);
724
+ var screen = components.find(function (it) {
725
+ return it.id === screenId;
726
+ }) || null;
727
+ return _objectSpread(_objectSpread({}, currentValue), {}, {
728
+ components: screen !== null ? screenIndex !== null && screenIndex > -1 ? [].concat(_toConsumableArray(components.slice(0, screenIndex + 1)), [_objectSpread(_objectSpread({}, screen), {}, {
729
+ id: uuid.v1()
730
+ })], _toConsumableArray(components.slice(screenIndex + 1))) : [].concat(_toConsumableArray(components), [_objectSpread(_objectSpread({}, screen), {}, {
731
+ id: uuid.v1()
732
+ })]) : components
733
+ });
734
+ };
735
+
736
+ var _excluded$a = ["components"];
737
+ var updateScreen = function updateScreen(story, newScreenValue) {
738
+ var newScreenId = newScreenValue.id;
739
+ var _ref = story || {},
740
+ _ref$components = _ref.components,
741
+ components = _ref$components === void 0 ? [] : _ref$components,
742
+ currentValue = _objectWithoutProperties(_ref, _excluded$a);
743
+ var index = components.findIndex(function (it) {
744
+ return it.id === newScreenId;
745
+ });
746
+ return _objectSpread(_objectSpread({}, currentValue), {}, {
747
+ components: [].concat(_toConsumableArray(components.slice(0, index)), [_objectSpread(_objectSpread({}, components[index]), newScreenValue)], _toConsumableArray(components.slice(index + 1)))
748
+ });
749
+ };
750
+
751
+ var getFieldByName = function getFieldByName(fields, name) {
752
+ return fields.reduce(function (foundField, it) {
753
+ if (foundField !== null) {
754
+ return foundField;
755
+ }
756
+ var _it$name = it.name,
757
+ fieldName = _it$name === void 0 ? null : _it$name,
758
+ _it$fields = it.fields,
759
+ subFields = _it$fields === void 0 ? [] : _it$fields;
760
+ if (name !== null && fieldName === name) {
761
+ return it;
762
+ }
763
+ return getFieldByName(subFields, name);
764
+ }, null);
765
+ };
766
+
767
+ var _excluded$9 = ["className", "dots"];
768
+ var propTypes$o = {
769
+ dots: PropTypes.bool,
770
+ className: PropTypes.string
771
+ };
772
+ var defaultProps$o = {
773
+ dots: false,
774
+ className: null
775
+ };
776
+ var SettingsButton = function SettingsButton(_ref) {
777
+ var className = _ref.className,
778
+ dots = _ref.dots,
779
+ props = _objectWithoutProperties(_ref, _excluded$9);
780
+ return /*#__PURE__*/React.createElement(components.Button, Object.assign({
781
+ className: className,
782
+ theme: "secondary",
783
+ size: "sm",
784
+ icon: /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
785
+ icon: dots ? faEllipsisV.faEllipsisV : faCogs.faCogs
786
+ })
787
+ }, props));
788
+ };
789
+ SettingsButton.propTypes = propTypes$o;
790
+ SettingsButton.defaultProps = defaultProps$o;
791
+ var SettingsButton$1 = SettingsButton;
792
+
793
+ var _excluded$8 = ["name", "form"];
794
+ var propTypes$n = {
795
+ name: PropTypes.string,
796
+ form: PropTypes.string,
797
+ children: PropTypes.node
798
+ };
799
+ var defaultProps$n = {
800
+ name: null,
801
+ form: null,
802
+ children: null
803
+ };
804
+ var FieldWithContexts = function FieldWithContexts(_ref) {
805
+ var name = _ref.name,
806
+ form = _ref.form,
807
+ props = _objectWithoutProperties(_ref, _excluded$8);
808
+ var definition = contexts.useScreenDefinition() || null;
809
+ var _definition$states = definition.states,
810
+ states = _definition$states === void 0 ? null : _definition$states;
811
+ var screenFields = utils.getScreenFieldsWithStates(definition);
812
+ var nameParts = name.split('.');
813
+ var _nameParts = _slicedToArray(nameParts, 1),
814
+ _nameParts$ = _nameParts[0],
815
+ stateId = _nameParts$ === void 0 ? null : _nameParts$;
816
+ var currentState = states !== null ? states.find(function (_ref2) {
817
+ var id = _ref2.id;
818
+ return id === stateId;
819
+ }) || null : null;
820
+ var finalNameParts = nameParts;
821
+ var _ref3 = currentState || {},
822
+ _ref3$repeatable = _ref3.repeatable,
823
+ repeatable = _ref3$repeatable === void 0 ? false : _ref3$repeatable,
824
+ _ref3$fieldName = _ref3.fieldName,
825
+ fieldName = _ref3$fieldName === void 0 ? null : _ref3$fieldName,
826
+ _ref3$fields = _ref3.fields,
827
+ stateFields = _ref3$fields === void 0 ? [] : _ref3$fields;
828
+ var finalScreenFields = fieldName !== null && stateId !== null ? screenFields.filter(function (_ref4) {
829
+ var itemName = _ref4.name,
830
+ fieldStateId = _ref4.stateId;
831
+ return fieldName !== itemName || stateId === fieldStateId || fieldStateId === null;
832
+ }) : screenFields;
833
+ if (currentState !== null) {
834
+ finalNameParts = (repeatable || fieldName !== null) && nameParts.length <= (repeatable ? 2 : 1) ? [fieldName || stateId].concat(_toConsumableArray(nameParts.slice(1))) : nameParts.slice(1);
835
+ }
836
+ var formComponents = contexts.useFormsComponents();
837
+ return definition !== null ? /*#__PURE__*/React.createElement("div", {
838
+ className: classNames({
839
+ 'p-2': form === null
840
+ })
841
+ }, finalNameParts.length > 0 ? /*#__PURE__*/React.createElement(components.FieldForm, Object.assign({
842
+ fields: finalScreenFields,
843
+ formComponents: formComponents,
844
+ name: finalNameParts.join('.'),
845
+ form: form
846
+ }, props)) : /*#__PURE__*/React.createElement(fields.Fields, Object.assign({
847
+ fields: stateFields
848
+ }, props))) : null;
849
+ };
850
+ FieldWithContexts.propTypes = propTypes$n;
851
+ FieldWithContexts.defaultProps = defaultProps$n;
852
+ var FieldWithContexts$1 = FieldWithContexts;
853
+
854
+ var styles$i = {"container":"micromag-editor-forms-screen-container","inner":"micromag-editor-forms-screen-inner"};
855
+
856
+ var propTypes$m = {
857
+ value: core.PropTypes.component,
858
+ className: PropTypes.string,
859
+ gotoFieldForm: PropTypes.func.isRequired,
860
+ closeFieldForm: PropTypes.func.isRequired,
861
+ onChange: PropTypes.func
862
+ // onClickDelete: PropTypes.func,
863
+ };
864
+ var defaultProps$m = {
865
+ value: null,
866
+ className: null,
867
+ onChange: null
868
+ // onClickDelete: null,
869
+ };
870
+ var ScreenForm = function ScreenForm(_ref) {
871
+ var value = _ref.value,
872
+ className = _ref.className,
873
+ gotoFieldForm = _ref.gotoFieldForm,
874
+ closeFieldForm = _ref.closeFieldForm,
875
+ onChange = _ref.onChange;
876
+ var _useScreenDefinition = contexts.useScreenDefinition(),
877
+ _useScreenDefinition$ = _useScreenDefinition.fields,
878
+ fields$1 = _useScreenDefinition$ === void 0 ? [] : _useScreenDefinition$;
879
+ // const intl = useIntl();
880
+ // const finalOnClickDelete = useCallback(() => {
881
+ // if (
882
+ // onClickDelete !== null &&
883
+ // window.confirm(
884
+ // intl.formatMessage({
885
+ // defaultMessage: 'Are you sure you want to delete this screen?',
886
+ // description: 'Confirm message when deleting a screen',
887
+ // }),
888
+ // )
889
+ // ) {
890
+ // onClickDelete(value);
891
+ // }
892
+ // }, [intl, onClickDelete, value]);
893
+ return /*#__PURE__*/React.createElement("div", {
894
+ className: classNames([styles$i.container, _defineProperty({}, className, className)])
895
+ }, /*#__PURE__*/React.createElement("div", {
896
+ className: styles$i.inner
897
+ }, fields$1 !== null ? /*#__PURE__*/React.createElement(fields.Fields, {
898
+ fields: fields$1,
899
+ value: value,
900
+ onChange: onChange,
901
+ gotoFieldForm: gotoFieldForm,
902
+ closeFieldForm: closeFieldForm
903
+ }) : null));
904
+ };
905
+ ScreenForm.propTypes = propTypes$m;
906
+ ScreenForm.defaultProps = defaultProps$m;
907
+ var ScreenForm$1 = ScreenForm;
908
+
909
+ var styles$h = {"container":"micromag-editor-menus-breadcrumb-container"};
910
+
911
+ var propTypes$l = {
912
+ story: core.PropTypes.story,
913
+ screenId: PropTypes.string,
914
+ field: PropTypes.string,
915
+ form: PropTypes.string,
916
+ url: PropTypes.string.isRequired,
917
+ className: PropTypes.string
918
+ };
919
+ var defaultProps$l = {
920
+ story: null,
921
+ screenId: null,
922
+ field: null,
923
+ form: null,
924
+ className: null
925
+ };
926
+ var Breadcrumb = function Breadcrumb(_ref) {
927
+ var story = _ref.story,
928
+ screenId = _ref.screenId,
929
+ field = _ref.field,
930
+ form = _ref.form,
931
+ url = _ref.url,
932
+ className = _ref.className;
933
+ var intl = reactIntl.useIntl();
934
+ var _ref2 = story || {},
935
+ _ref2$components = _ref2.components,
936
+ screens = _ref2$components === void 0 ? [] : _ref2$components;
937
+ var _useLocation = useLocation(),
938
+ _useLocation2 = _slicedToArray(_useLocation, 2),
939
+ setLocation = _useLocation2[1];
940
+ var screensManager = contexts.useScreensManager();
941
+ var fieldsManager = contexts.useFieldsManager();
942
+ var fieldsComponentManager = contexts.useFieldsComponentsManager();
943
+ var route = contexts.useUrlGenerator();
944
+ var _useMemo = React.useMemo(function () {
945
+ var screenIndex = screens.findIndex(function (it) {
946
+ return it.id === screenId;
947
+ });
948
+ if (!screens[screenIndex]) {
949
+ return {};
950
+ }
951
+ var _screens$screenIndex = screens[screenIndex],
952
+ type = _screens$screenIndex.type,
953
+ _screens$screenIndex$ = _screens$screenIndex.parameters,
954
+ parameters = _screens$screenIndex$ === void 0 ? null : _screens$screenIndex$;
955
+ var definition = screensManager.getDefinition(type);
956
+ var _ref3 = definition || {},
957
+ _ref3$states = _ref3.states,
958
+ states = _ref3$states === void 0 ? null : _ref3$states,
959
+ _ref3$title = _ref3.title,
960
+ definitionTitle = _ref3$title === void 0 ? null : _ref3$title;
961
+ return {
962
+ title: definitionTitle,
963
+ fields: definition !== null ? [].concat(_toConsumableArray(utils.getScreenFieldsWithStates(definition)), [utils.getScreenExtraField(intl)]) : null,
964
+ states: states,
965
+ parameters: parameters
966
+ };
967
+ }, [screens, screenId, screensManager, intl]),
968
+ _useMemo$title = _useMemo.title,
969
+ screenTitle = _useMemo$title === void 0 ? null : _useMemo$title,
970
+ _useMemo$fields = _useMemo.fields,
971
+ screenFields = _useMemo$fields === void 0 ? [] : _useMemo$fields,
972
+ _useMemo$states = _useMemo.states,
973
+ screenStates = _useMemo$states === void 0 ? null : _useMemo$states,
974
+ _useMemo$parameters = _useMemo.parameters,
975
+ screenParameters = _useMemo$parameters === void 0 ? null : _useMemo$parameters;
976
+ var items = React.useMemo(function () {
977
+ var fieldItems = [];
978
+ var currentState = null;
979
+ if (field !== null) {
980
+ var fieldPath = field.split('/');
981
+
982
+ // Get state and remove it from path. Replace it with field name if necessary (repeatable or fieldName present)
983
+ var _fieldPath = _slicedToArray(fieldPath, 1),
984
+ _fieldPath$ = _fieldPath[0],
985
+ stateId = _fieldPath$ === void 0 ? null : _fieldPath$;
986
+ currentState = screenStates !== null ? screenStates.find(function (_ref4) {
987
+ var id = _ref4.id;
988
+ return id === stateId;
989
+ }) || null : null;
990
+ var finalFieldPath = fieldPath;
991
+ if (currentState !== null) {
992
+ var _ref5 = currentState || {},
993
+ _ref5$repeatable = _ref5.repeatable,
994
+ repeatable = _ref5$repeatable === void 0 ? false : _ref5$repeatable,
995
+ _ref5$fieldName = _ref5.fieldName,
996
+ fieldName = _ref5$fieldName === void 0 ? null : _ref5$fieldName;
997
+ finalFieldPath = (repeatable || fieldName !== null) && fieldPath.length <= (repeatable ? 2 : 1) ? [fieldName || stateId].concat(_toConsumableArray(fieldPath.slice(1))) : fieldPath.slice(1);
998
+ }
999
+ var lastKeyIndex = finalFieldPath.length - 1;
1000
+ var parentItem = null;
1001
+ finalFieldPath.reduce(function (currentFields, key, keyIndex) {
1002
+ var _ref6 = currentFields || {},
1003
+ _ref6$type = _ref6.type,
1004
+ fieldType = _ref6$type === void 0 ? null : _ref6$type,
1005
+ _ref6$fields = _ref6.fields,
1006
+ currentSubFields = _ref6$fields === void 0 ? null : _ref6$fields,
1007
+ _ref6$itemsField = _ref6.itemsField,
1008
+ currentItemsField = _ref6$itemsField === void 0 ? null : _ref6$itemsField;
1009
+ var fieldsDef = fieldType !== null ? fieldsManager.getDefinition(fieldType) : currentFields;
1010
+ var _ref7 = fieldsDef || {},
1011
+ _ref7$fields = _ref7.fields,
1012
+ defSubFields = _ref7$fields === void 0 ? null : _ref7$fields,
1013
+ _ref7$settings = _ref7.settings,
1014
+ settings = _ref7$settings === void 0 ? null : _ref7$settings,
1015
+ _ref7$itemsField = _ref7.itemsField,
1016
+ defItemsField = _ref7$itemsField === void 0 ? null : _ref7$itemsField,
1017
+ _ref7$component = _ref7.component,
1018
+ defComponent = _ref7$component === void 0 ? null : _ref7$component;
1019
+ var _ref8 = fieldsComponentManager.getComponent(defComponent) || {},
1020
+ _ref8$withForm = _ref8.withForm,
1021
+ withForm = _ref8$withForm === void 0 ? false : _ref8$withForm;
1022
+ var itemsField = currentItemsField || defItemsField;
1023
+ var subFields = currentSubFields || defSubFields;
1024
+ var finalSubField = subFields !== null ? getFieldByName(subFields, key) : null;
1025
+ var finalSettingsField = settings !== null ? getFieldByName(settings, key) : null;
1026
+ var isCurrentSubField = finalSubField !== null;
1027
+ var isCurrentSettingsField = finalSettingsField !== null;
1028
+ var isListItems = itemsField !== null && !!key.match(/^[0-9]+$/);
1029
+ var isLastIndex = keyIndex === lastKeyIndex;
1030
+ var pathPrefix = route('screen.field', {
1031
+ screen: screenId,
1032
+ field: [currentState !== null ? currentState.id : null].concat(_toConsumableArray(finalFieldPath.slice(0, keyIndex + 1))).filter(function (it) {
1033
+ return it !== null;
1034
+ })
1035
+ });
1036
+ var pathSuffix = isLastIndex && form !== null ? "/".concat(form) : '';
1037
+ var addNewItem = isLastIndex || isListItems;
1038
+ var itemPath = "".concat(pathPrefix).concat(pathSuffix);
1039
+ if (parentItem !== null && (withForm || isCurrentSettingsField)) {
1040
+ fieldItems.push(_objectSpread(_objectSpread({}, parentItem), {}, {
1041
+ url: isCurrentSettingsField ? route('screen.field.form', {
1042
+ screen: screenId,
1043
+ field: [currentState !== null ? currentState.id : null].concat(_toConsumableArray(finalFieldPath.slice(0, keyIndex))).filter(function (it) {
1044
+ return it !== null;
1045
+ }),
1046
+ form: 'settings'
1047
+ }) : route('screen.field', {
1048
+ screen: screenId,
1049
+ field: [currentState !== null ? currentState.id : null].concat(_toConsumableArray(finalFieldPath.slice(0, keyIndex))).filter(function (it) {
1050
+ return it !== null;
1051
+ })
1052
+ })
1053
+ }));
1054
+ }
1055
+ var nextField = null;
1056
+ if (isCurrentSubField) {
1057
+ nextField = finalSubField;
1058
+ } else if (isCurrentSettingsField) {
1059
+ nextField = finalSettingsField;
1060
+ } else if (isListItems) {
1061
+ nextField = itemsField;
1062
+ }
1063
+ var fieldLabel = nextField ? nextField.breadcrumbLabel || nextField.label : null;
1064
+ var itemLabel = utils.isMessage(fieldLabel) ? intl.formatMessage(fieldLabel) : fieldLabel;
1065
+ var _ref9 = parentItem || {},
1066
+ _ref9$label = _ref9.label,
1067
+ parentItemLabel = _ref9$label === void 0 ? null : _ref9$label;
1068
+ var finalItemLabel = isListItems ? "".concat(itemLabel, " #").concat(parseInt(key, 10) + 1) : itemLabel || parentItemLabel;
1069
+ var item = {
1070
+ url: itemPath,
1071
+ label: finalItemLabel || '',
1072
+ active: false
1073
+ };
1074
+ if (addNewItem) {
1075
+ fieldItems.push(item);
1076
+ }
1077
+ parentItem = !addNewItem ? item : null;
1078
+ return nextField;
1079
+ }, {
1080
+ fields: stateId === null ? screenFields : screenFields.filter(function (_ref10) {
1081
+ var _ref10$stateId = _ref10.stateId,
1082
+ fieldStateId = _ref10$stateId === void 0 ? null : _ref10$stateId;
1083
+ return fieldStateId === null || fieldStateId === stateId;
1084
+ })
1085
+ });
1086
+ }
1087
+ var _ref11 = screenParameters || {},
1088
+ _ref11$metadata = _ref11.metadata,
1089
+ metadata = _ref11$metadata === void 0 ? null : _ref11$metadata;
1090
+ var _ref12 = metadata || {},
1091
+ _ref12$title = _ref12.title,
1092
+ title = _ref12$title === void 0 ? null : _ref12$title;
1093
+ var typeTitle = screenTitle !== null ? /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, screenTitle) : null;
1094
+ var parametersMessage = intl.formatMessage({
1095
+ id: "AHvHaY",
1096
+ defaultMessage: [{
1097
+ "type": 0,
1098
+ "value": "Parameters"
1099
+ }]
1100
+ });
1101
+ var defaultLabel = (fieldItems || []).length === 0 ? title || typeTitle || parametersMessage : parametersMessage;
1102
+ var finalItems = [currentState === null || (currentState.repeatable || false) === false ? {
1103
+ label: currentState !== null ? currentState.label : defaultLabel,
1104
+ url: currentState !== null ? route('screen.field', {
1105
+ screen: screenId,
1106
+ field: currentState.id
1107
+ }) : route('screen', {
1108
+ screen: screenId
1109
+ }),
1110
+ active: false
1111
+ } : null].concat(fieldItems).filter(function (it) {
1112
+ return it !== null;
1113
+ });
1114
+ var lastItemsIndex = finalItems.length - 1;
1115
+ return finalItems.map(function (it, index) {
1116
+ return index === lastItemsIndex ? _objectSpread(_objectSpread({}, it), {}, {
1117
+ url: url,
1118
+ active: true
1119
+ }) : it;
1120
+ });
1121
+ }, [intl, route, screenId, field, form, url, screenFields, screenStates, screenTitle, fieldsManager]);
1122
+ var itemsLength = items.length;
1123
+ var onClickBack = React.useCallback(function () {
1124
+ setLocation(items[itemsLength - 2].url);
1125
+ }, [items, setLocation, itemsLength]);
1126
+ var withBack = itemsLength > 1;
1127
+ return /*#__PURE__*/React.createElement(React.Fragment, null, withBack ? /*#__PURE__*/React.createElement(components.BackButton, {
1128
+ onClick: onClickBack,
1129
+ className: "me-2 py-0"
1130
+ }) : null, /*#__PURE__*/React.createElement(components.Breadcrumb, {
1131
+ items: items,
1132
+ theme: "secondary",
1133
+ withoutBar: true,
1134
+ noWrap: true,
1135
+ className: classNames([styles$h.container, 'text-truncate', _defineProperty({}, className, className !== null)])
1136
+ }));
1137
+ };
1138
+ Breadcrumb.propTypes = propTypes$l;
1139
+ Breadcrumb.defaultProps = defaultProps$l;
1140
+ var Breadcrumb$1 = Breadcrumb;
1141
+
1142
+ var styles$g = {"container":"micromag-editor-modals-delete-screen-container","description":"micromag-editor-modals-delete-screen-description","actions":"micromag-editor-modals-delete-screen-actions"};
1143
+
1144
+ var propTypes$k = {
1145
+ className: PropTypes.string,
1146
+ onConfirm: PropTypes.func,
1147
+ onCancel: PropTypes.func
1148
+ };
1149
+ var defaultProps$k = {
1150
+ className: null,
1151
+ onConfirm: null,
1152
+ onCancel: null
1153
+ };
1154
+ var DeleteScreenModal = function DeleteScreenModal(_ref) {
1155
+ var className = _ref.className,
1156
+ onConfirm = _ref.onConfirm,
1157
+ onCancel = _ref.onCancel;
1158
+ return /*#__PURE__*/React.createElement(components.Modal, null, /*#__PURE__*/React.createElement(components.ModalDialog, {
1159
+ title: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
1160
+ id: "p6q/+/",
1161
+ defaultMessage: [{
1162
+ "type": 0,
1163
+ "value": "Delete screen"
1164
+ }]
1165
+ }),
1166
+ className: classNames([styles$g.container, _defineProperty({}, className, className)]),
1167
+ onClose: onCancel
1168
+ }, /*#__PURE__*/React.createElement("div", {
1169
+ className: styles$g.description
1170
+ }, /*#__PURE__*/React.createElement(components.Label, null, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
1171
+ id: "q/tLk0",
1172
+ defaultMessage: [{
1173
+ "type": 0,
1174
+ "value": "Are you sure you want to delete this screen?"
1175
+ }]
1176
+ }))), /*#__PURE__*/React.createElement("div", {
1177
+ className: styles$g.actions
1178
+ }, /*#__PURE__*/React.createElement(components.Button, {
1179
+ onClick: onCancel,
1180
+ className: "btn-outline-secondary me-2"
1181
+ }, /*#__PURE__*/React.createElement(components.Label, null, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
1182
+ id: "0GT0SI",
1183
+ defaultMessage: [{
1184
+ "type": 0,
1185
+ "value": "Cancel"
1186
+ }]
1187
+ }))), /*#__PURE__*/React.createElement(components.Button, {
1188
+ onClick: onConfirm,
1189
+ theme: "danger",
1190
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
1191
+ id: "gRxcTc",
1192
+ defaultMessage: [{
1193
+ "type": 0,
1194
+ "value": "Delete screen"
1195
+ }]
1196
+ })
1197
+ }))));
1198
+ };
1199
+ DeleteScreenModal.propTypes = propTypes$k;
1200
+ DeleteScreenModal.defaultProps = defaultProps$k;
1201
+ var DeleteScreenModal$1 = DeleteScreenModal;
1202
+
1203
+ var styles$f = {"panel":"micromag-editor-form-panel","exit":"micromag-editor-form-exit","content":"micromag-editor-form-content","navbar":"micromag-editor-form-navbar","enterRight":"micromag-editor-form-enterRight","enterLeft":"micromag-editor-form-enterLeft","enterTop":"micromag-editor-form-enterTop","enterBottom":"micromag-editor-form-enterBottom","enterActiveHorizontal":"micromag-editor-form-enterActiveHorizontal","enterActiveVertical":"micromag-editor-form-enterActiveVertical","exitActiveRight":"micromag-editor-form-exitActiveRight","exitActiveLeft":"micromag-editor-form-exitActiveLeft","exitActiveTop":"micromag-editor-form-exitActiveTop","exitActiveBottom":"micromag-editor-form-exitActiveBottom"};
1204
+
1205
+ var propTypes$j = {
1206
+ value: PropTypes.oneOfType([core.PropTypes.story, core.PropTypes.theme]),
1207
+ isTheme: PropTypes.bool,
1208
+ className: PropTypes.string,
1209
+ onChange: PropTypes.func
1210
+ };
1211
+ var defaultProps$j = {
1212
+ value: null,
1213
+ isTheme: false,
1214
+ className: null,
1215
+ onChange: null
1216
+ };
1217
+ var EditForm = function EditForm(_ref) {
1218
+ var value = _ref.value,
1219
+ isTheme = _ref.isTheme,
1220
+ className = _ref.className,
1221
+ onChange = _ref.onChange;
1222
+ // Match routes
1223
+ var _useLocation = useLocation(),
1224
+ _useLocation2 = _slicedToArray(_useLocation, 2),
1225
+ setLocation = _useLocation2[1];
1226
+ var routePush = contexts.useRoutePush();
1227
+ var _useRouteParams = useRouteParams(),
1228
+ url = _useRouteParams.url,
1229
+ _useRouteParams$scree = _useRouteParams.screen,
1230
+ screenId = _useRouteParams$scree === void 0 ? null : _useRouteParams$scree,
1231
+ _useRouteParams$field = _useRouteParams.field,
1232
+ fieldParams = _useRouteParams$field === void 0 ? null : _useRouteParams$field,
1233
+ _useRouteParams$form = _useRouteParams.form,
1234
+ formParams = _useRouteParams$form === void 0 ? null : _useRouteParams$form;
1235
+
1236
+ // Get screen
1237
+ var _ref2 = value || {},
1238
+ _ref2$components = _ref2.components,
1239
+ screens = _ref2$components === void 0 ? [] : _ref2$components;
1240
+ var screenIndex = screens.findIndex(function (it) {
1241
+ return it.id === screenId;
1242
+ });
1243
+ var screen = screenIndex !== -1 ? screens[screenIndex] : null;
1244
+ var screensManager = contexts.useScreensManager();
1245
+ var screenFields = React.useMemo(function () {
1246
+ var _ref3 = screen || {},
1247
+ type = _ref3.type;
1248
+ var definition = type !== null ? screensManager.getDefinition(type) : null;
1249
+ return definition != null ? utils.getScreenFieldsWithStates(definition) : [];
1250
+ }, [screensManager, screen]);
1251
+
1252
+ // Get transition value
1253
+ var _useFormTransition = useFormTransition(url, screenIndex, styles$f),
1254
+ transitionClassNames = _useFormTransition.classNames,
1255
+ transitionTimeout = _useFormTransition.timeout;
1256
+ var _useState = React.useState(false),
1257
+ _useState2 = _slicedToArray(_useState, 2),
1258
+ screenSettingsOpened = _useState2[0],
1259
+ setScreenSettingsOpened = _useState2[1];
1260
+ var _useState3 = React.useState(false),
1261
+ _useState4 = _slicedToArray(_useState3, 2),
1262
+ deleteScreenModalOpened = _useState4[0],
1263
+ setDeleteScreenModalOpened = _useState4[1];
1264
+ var _useState5 = React.useState({}),
1265
+ _useState6 = _slicedToArray(_useState5, 2),
1266
+ fieldForms = _useState6[0],
1267
+ setFieldForms = _useState6[1];
1268
+ var _useState7 = React.useState(null),
1269
+ _useState8 = _slicedToArray(_useState7, 2),
1270
+ fieldContext = _useState8[0],
1271
+ setFieldContext = _useState8[1];
1272
+
1273
+ // Callbacks
1274
+ var gotoFieldForm = React.useCallback(function () {
1275
+ var field = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
1276
+ var formName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
1277
+ var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
1278
+ var hasField = field !== null;
1279
+ var fieldRoute = formName !== null ? 'screen.field.form' : 'screen.field';
1280
+ var _ref4 = field !== null ? field.split('.') : [],
1281
+ _ref5 = _slicedToArray(_ref4, 1),
1282
+ _ref5$ = _ref5[0],
1283
+ rootFieldName = _ref5$ === void 0 ? null : _ref5$;
1284
+ var _ref6 = fieldParams !== null ? fieldParams.split('/') : [],
1285
+ _ref7 = _slicedToArray(_ref6, 1),
1286
+ _ref7$ = _ref7[0],
1287
+ currentStateId = _ref7$ === void 0 ? null : _ref7$;
1288
+ var _ref8 = (rootFieldName !== null ? screenFields.find(function (_ref9) {
1289
+ var name = _ref9.name,
1290
+ fieldStateId = _ref9.stateId;
1291
+ return name === rootFieldName && currentStateId === fieldStateId;
1292
+ }) || null : null) || {},
1293
+ _ref8$stateId = _ref8.stateId,
1294
+ stateId = _ref8$stateId === void 0 ? null : _ref8$stateId;
1295
+ routePush(hasField ? fieldRoute : 'screen', {
1296
+ screen: screenId,
1297
+ field: field !== null ? [stateId].concat(_toConsumableArray(field.split('.'))).filter(function (it) {
1298
+ return it !== null;
1299
+ }) : null,
1300
+ form: formName !== null ? utils.slug(formName) : null
1301
+ });
1302
+ var nextFieldForms = _objectSpread(_objectSpread({}, fieldForms), {}, _defineProperty({}, "".concat(field).concat(formName !== null ? ":".concat(formName) : ''), url));
1303
+ setFieldForms(nextFieldForms);
1304
+ setFieldContext(context);
1305
+ }, [routePush, screenId, screenFields, fieldParams, url, fieldForms, setFieldForms, fieldContext, setFieldContext]);
1306
+ var closeFieldForm = React.useCallback(function (field) {
1307
+ var formName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
1308
+ var fieldKey = "".concat(field).concat(formName !== null ? ":".concat(formName) : '');
1309
+ var pastUrl = fieldForms[fieldKey] || null;
1310
+ if (pastUrl !== null) {
1311
+ setLocation(pastUrl);
1312
+ }
1313
+ setFieldForms(Object.keys(fieldForms).reduce(function (map, key) {
1314
+ return key !== fieldKey ? _objectSpread(_objectSpread({}, map), {}, _defineProperty({}, key, fieldForms[key])) : map;
1315
+ }, {}));
1316
+ }, [setLocation, screenId, fieldForms, setFieldForms]);
1317
+ var triggerOnChange = React.useCallback(function (newValue) {
1318
+ if (onChange !== null) {
1319
+ onChange(newValue);
1320
+ }
1321
+ }, [onChange]);
1322
+ var onScreenFormChange = React.useCallback(function (newScreenValue) {
1323
+ triggerOnChange(updateScreen(value, newScreenValue));
1324
+ }, [value, triggerOnChange]);
1325
+ var onClickDuplicate = React.useCallback(function () {
1326
+ triggerOnChange(duplicateScreen(value, screenId, screenIndex));
1327
+ setScreenSettingsOpened(false);
1328
+ }, [value, screenId, screenIndex, triggerOnChange, setScreenSettingsOpened]);
1329
+ var onClickDelete = React.useCallback(function () {
1330
+ setDeleteScreenModalOpened(true);
1331
+ setScreenSettingsOpened(false);
1332
+ }, [setScreenSettingsOpened, setDeleteScreenModalOpened]);
1333
+ var onSettingsClick = React.useCallback(function () {
1334
+ setScreenSettingsOpened(!screenSettingsOpened);
1335
+ }, [screenSettingsOpened, setScreenSettingsOpened]);
1336
+ var onDropdownClickOutside = React.useCallback(function () {
1337
+ setScreenSettingsOpened(false);
1338
+ }, [setScreenSettingsOpened]);
1339
+ var onDeleteScreenConfirm = React.useCallback(function () {
1340
+ var current = screens.findIndex(function (_ref10) {
1341
+ var _ref10$id = _ref10.id,
1342
+ scrId = _ref10$id === void 0 ? null : _ref10$id;
1343
+ return scrId === screenId;
1344
+ }) || 0;
1345
+ var previous = screens.find(function (_ref11, i) {
1346
+ var _ref11$id = _ref11.id,
1347
+ scrId = _ref11$id === void 0 ? null : _ref11$id;
1348
+ return scrId !== screenId && (i === current - 1 || current === 0);
1349
+ }) || null;
1350
+ if (previous !== null) {
1351
+ var _ref12 = previous || {},
1352
+ _ref12$id = _ref12.id,
1353
+ firstScreenId = _ref12$id === void 0 ? null : _ref12$id;
1354
+ routePush('screen', {
1355
+ screen: firstScreenId
1356
+ });
1357
+ }
1358
+ triggerOnChange(deleteScreen(value, screenId));
1359
+ setDeleteScreenModalOpened(false);
1360
+ }, [value, triggerOnChange, screenId, setScreenSettingsOpened, routePush, screens]);
1361
+ var onDeleteScreenCancel = React.useCallback(function () {
1362
+ setDeleteScreenModalOpened(false);
1363
+ }, [setDeleteScreenModalOpened]);
1364
+ var dropdownItems = [!isTheme ? {
1365
+ id: 'duplicate',
1366
+ type: 'button',
1367
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
1368
+ id: "IBjY5r",
1369
+ defaultMessage: [{
1370
+ "type": 0,
1371
+ "value": "Duplicate screen"
1372
+ }]
1373
+ }),
1374
+ onClick: onClickDuplicate
1375
+ } : null, {
1376
+ id: 'delete',
1377
+ type: 'button',
1378
+ label: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
1379
+ id: "hpiKce",
1380
+ defaultMessage: [{
1381
+ "type": 0,
1382
+ "value": "Delete screen"
1383
+ }]
1384
+ }),
1385
+ onClick: onClickDelete
1386
+ }].filter(function (it) {
1387
+ return it !== null;
1388
+ });
1389
+ return /*#__PURE__*/React.createElement("div", {
1390
+ className: classNames(['d-flex', 'flex-column', className])
1391
+ }, screenId !== null ? /*#__PURE__*/React.createElement(components.Navbar, {
1392
+ compact: true,
1393
+ noWrap: true,
1394
+ withoutCollapse: true,
1395
+ className: classNames(['sticky-top', 'border-bottom', 'border-dark', styles$f.navbar])
1396
+ }, /*#__PURE__*/React.createElement(Breadcrumb$1, {
1397
+ story: value,
1398
+ url: url,
1399
+ screenId: screenId,
1400
+ field: fieldParams,
1401
+ form: formParams,
1402
+ className: "me-auto"
1403
+ }), fieldParams === null ? /*#__PURE__*/React.createElement("div", {
1404
+ className: "dropdown"
1405
+ }, /*#__PURE__*/React.createElement(SettingsButton$1, {
1406
+ onClick: onSettingsClick,
1407
+ dots: true,
1408
+ className: "py-0",
1409
+ theme: "default"
1410
+ }), /*#__PURE__*/React.createElement(components.DropdownMenu, {
1411
+ align: "end",
1412
+ items: dropdownItems,
1413
+ visible: screenSettingsOpened,
1414
+ onClickOutside: onDropdownClickOutside
1415
+ })) : null) : null, /*#__PURE__*/React.createElement("div", {
1416
+ className: classNames(['flex-grow-1', 'd-flex', 'w-100', styles$f.content])
1417
+ }, screen !== null ? /*#__PURE__*/React.createElement(reactTransitionGroup.TransitionGroup, {
1418
+ className: "w-100 flex-grow-1",
1419
+ childFactory: function childFactory(child) {
1420
+ return /*#__PURE__*/React.cloneElement(child, {
1421
+ classNames: transitionClassNames
1422
+ });
1423
+ }
1424
+ }, fieldParams !== null ? /*#__PURE__*/React.createElement(reactTransitionGroup.CSSTransition, {
1425
+ timeout: transitionTimeout,
1426
+ key: "field-".concat(fieldParams, "-").concat(formParams)
1427
+ }, /*#__PURE__*/React.createElement("div", {
1428
+ className: classNames(['w-100', styles$f.panel])
1429
+ }, /*#__PURE__*/React.createElement(contexts.ScreenProvider, {
1430
+ data: screen
1431
+ }, /*#__PURE__*/React.createElement(FieldWithContexts$1, {
1432
+ name: fieldParams.replace(/\//g, '.'),
1433
+ value: screen,
1434
+ form: formParams,
1435
+ className: styles$f.form,
1436
+ gotoFieldForm: gotoFieldForm,
1437
+ closeFieldForm: closeFieldForm,
1438
+ fieldContext: fieldContext,
1439
+ onChange: onScreenFormChange
1440
+ })))) : /*#__PURE__*/React.createElement(reactTransitionGroup.CSSTransition, {
1441
+ classNames: transitionClassNames,
1442
+ timeout: transitionTimeout,
1443
+ key: "screen-".concat(screen.id)
1444
+ }, /*#__PURE__*/React.createElement("div", {
1445
+ className: classNames(['w-100', styles$f.panel]),
1446
+ key: "screen-".concat(screen.id)
1447
+ }, /*#__PURE__*/React.createElement(contexts.ScreenProvider, {
1448
+ data: screen
1449
+ }, /*#__PURE__*/React.createElement(ScreenForm$1, {
1450
+ value: screen,
1451
+ className: styles$f.form,
1452
+ onChange: onScreenFormChange,
1453
+ gotoFieldForm: gotoFieldForm,
1454
+ closeFieldForm: closeFieldForm
1455
+ }))))) : /*#__PURE__*/React.createElement(components.Empty, {
1456
+ className: "w-100 m-2"
1457
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
1458
+ id: "QfpTKK",
1459
+ defaultMessage: [{
1460
+ "type": 0,
1461
+ "value": "Select a screen..."
1462
+ }],
1463
+ decription: "Indication to select a screen to view the form"
1464
+ }))), deleteScreenModalOpened ? /*#__PURE__*/React.createElement(DeleteScreenModal$1, {
1465
+ onConfirm: onDeleteScreenConfirm,
1466
+ onCancel: onDeleteScreenCancel
1467
+ }) : null);
1468
+ };
1469
+ EditForm.propTypes = propTypes$j;
1470
+ EditForm.defaultProps = defaultProps$j;
1471
+ var EditorForm = EditForm;
1472
+
1473
+ function useScreenStates(screen) {
1474
+ var _ref = screen || {},
1475
+ type = _ref.type;
1476
+ var screensManager = contexts.useScreensManager();
1477
+ var states = React.useMemo(function () {
1478
+ var definition = screensManager.getDefinition(type) || null;
1479
+ var _ref2 = definition || {},
1480
+ _ref2$states = _ref2.states,
1481
+ screenStates = _ref2$states === void 0 ? null : _ref2$states;
1482
+ return screenStates;
1483
+ }, [screensManager, type]);
1484
+ return states;
1485
+ }
1486
+
1487
+ var _excluded$7 = ["components"];
1488
+ var useThemeValue = function useThemeValue(value) {
1489
+ var isTheme = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1490
+ var valueWithTheme = React.useMemo(function () {
1491
+ if (!isTheme) {
1492
+ return value;
1493
+ }
1494
+ var _ref = value || {};
1495
+ _ref.components;
1496
+ var themeValue = _objectWithoutProperties(_ref, _excluded$7);
1497
+ return value !== null ? _objectSpread({
1498
+ theme: themeValue
1499
+ }, value) : value;
1500
+ }, [value, isTheme]);
1501
+ return valueWithTheme;
1502
+ };
1503
+
1504
+ var styles$e = {"container":"micromag-editor-menus-devices-container","button":"micromag-editor-menus-devices-button"};
1505
+
1506
+ /* eslint-disable react/button-has-type, react/jsx-props-no-spreading */
1507
+ var propTypes$i = {
1508
+ color: PropTypes.string,
1509
+ className: PropTypes.string
1510
+ };
1511
+ var defaultProps$i = {
1512
+ color: 'currentColor',
1513
+ className: null
1514
+ };
1515
+ var DesktopIcon = function DesktopIcon(_ref) {
1516
+ var color = _ref.color,
1517
+ className = _ref.className;
1518
+ return /*#__PURE__*/React.createElement("svg", {
1519
+ xmlns: "http://www.w3.org/2000/svg",
1520
+ xmlnsXlink: "http://www.w3.org/1999/xlink",
1521
+ version: "1.1",
1522
+ x: "0px",
1523
+ y: "0px",
1524
+ width: "100px",
1525
+ height: "100px",
1526
+ viewBox: "0 0 100 100",
1527
+ xmlSpace: "preserve",
1528
+ className: className
1529
+ }, /*#__PURE__*/React.createElement("path", {
1530
+ fill: color,
1531
+ d: "M84 17H16c-3.3 0-6 2.7-6 6v42c0 3.3 2.7 6 6 6h22v4.2c-.1.4-.9 1.5-1.3 2-1.1 1.4-2.2 2.8-1.4 4.4.3.7 1.1 1.4 2.7 1.4h23c1 0 3.3 0 4.1-1.8.8-1.8-.6-3.2-1.8-4.5-.4-.5-1.1-1.2-1.3-1.6V71h22c3.3 0 6-2.7 6-6V23c0-3.3-2.7-6-6-6zM40.3 79c.9-1.1 1.7-2.4 1.7-3.8V71h16v4.2c0 1.4 1 2.7 2 3.8H40.3zM86 65c0 1.1-.9 2-2 2H16c-1.1 0-2-.9-2-2v-6h72v6zm0-10H14V23c0-1.1.9-2 2-2h68c1.1 0 2 .9 2 2v32z"
1532
+ }));
1533
+ };
1534
+ DesktopIcon.propTypes = propTypes$i;
1535
+ DesktopIcon.defaultProps = defaultProps$i;
1536
+ var DesktopIcon$1 = DesktopIcon;
1537
+
1538
+ /* eslint-disable react/button-has-type, react/jsx-props-no-spreading */
1539
+ var propTypes$h = {
1540
+ color: PropTypes.string,
1541
+ className: PropTypes.string
1542
+ };
1543
+ var defaultProps$h = {
1544
+ color: 'currentColor',
1545
+ className: null
1546
+ };
1547
+ var MobileIcon = function MobileIcon(_ref) {
1548
+ var color = _ref.color,
1549
+ className = _ref.className;
1550
+ return /*#__PURE__*/React.createElement("svg", {
1551
+ xmlns: "http://www.w3.org/2000/svg",
1552
+ xmlnsXlink: "http://www.w3.org/1999/xlink",
1553
+ version: "1.1",
1554
+ x: "0px",
1555
+ y: "0px",
1556
+ width: "100px",
1557
+ height: "100px",
1558
+ viewBox: "0 0 100 100",
1559
+ xmlSpace: "preserve",
1560
+ className: className
1561
+ }, /*#__PURE__*/React.createElement("path", {
1562
+ fill: color,
1563
+ d: "M66 11H34c-3.3 0-6 2.7-6 6v66c0 3.3 2.7 6 6 6h32c3.3 0 6-2.7 6-6V17c0-3.3-2.7-6-6-6zm2 72c0 1.1-.9 2-2 2H34c-1.1 0-2-.9-2-2v-4h36v4zm0-8H32V25h36v50zm0-54H32v-4c0-1.1.9-2 2-2h32c1.1 0 2 .9 2 2v4z"
1564
+ }));
1565
+ };
1566
+ MobileIcon.propTypes = propTypes$h;
1567
+ MobileIcon.defaultProps = defaultProps$h;
1568
+ var MobileIcon$1 = MobileIcon;
1569
+
1570
+ var DeviceIcons = /*#__PURE__*/Object.freeze({
1571
+ __proto__: null,
1572
+ Desktop: DesktopIcon$1,
1573
+ Mobile: MobileIcon$1
1574
+ });
1575
+
1576
+ var styles$d = {"container":"micromag-editor-buttons-device-container","icon":"micromag-editor-buttons-device-icon"};
1577
+
1578
+ var _excluded$6 = ["device", "className", "iconComponents"];
1579
+ var propTypes$g = {
1580
+ device: PropTypes.string.isRequired,
1581
+ iconComponents: core.PropTypes.components,
1582
+ className: PropTypes.string
1583
+ };
1584
+ var defaultProps$g = {
1585
+ iconComponents: DeviceIcons,
1586
+ className: null
1587
+ };
1588
+ var DeviceButton = function DeviceButton(_ref) {
1589
+ var device = _ref.device,
1590
+ className = _ref.className,
1591
+ iconComponents = _ref.iconComponents,
1592
+ props = _objectWithoutProperties(_ref, _excluded$6);
1593
+ var DeviceIcon = utils.getComponentFromName(device, iconComponents, DesktopIcon$1);
1594
+ return /*#__PURE__*/React.createElement(components.Button, Object.assign({
1595
+ className: classNames([styles$d.container, _defineProperty({}, className, className !== null)])
1596
+ }, props), /*#__PURE__*/React.createElement(DeviceIcon, {
1597
+ className: styles$d.icon
1598
+ }));
1599
+ };
1600
+ DeviceButton.propTypes = propTypes$g;
1601
+ DeviceButton.defaultProps = defaultProps$g;
1602
+ var DeviceButton$1 = DeviceButton;
1603
+
1604
+ var _excluded$5 = ["id"];
1605
+ var propTypes$f = {
1606
+ items: core.PropTypes.menuItems,
1607
+ className: PropTypes.string,
1608
+ onClickItem: PropTypes.func
1609
+ };
1610
+ var defaultProps$f = {
1611
+ items: [],
1612
+ className: null,
1613
+ onClickItem: null
1614
+ };
1615
+ var DevicesMenu = function DevicesMenu(_ref) {
1616
+ var items = _ref.items,
1617
+ className = _ref.className,
1618
+ onClickItem = _ref.onClickItem;
1619
+ return /*#__PURE__*/React.createElement(components.Tabs, {
1620
+ items: items,
1621
+ theme: "outline-secondary",
1622
+ className: classNames([styles$e.container, _defineProperty({}, className, className !== null)]),
1623
+ renderItemButton: function renderItemButton(item, index, props) {
1624
+ var id = item.id,
1625
+ itemProps = _objectWithoutProperties(item, _excluded$5);
1626
+ return /*#__PURE__*/React.createElement(DeviceButton$1, Object.assign({
1627
+ device: id
1628
+ }, props, itemProps, {
1629
+ className: styles$e.button,
1630
+ onClick: function onClick(e) {
1631
+ return onClickItem !== null ? onClickItem(e, item, index) : null;
1632
+ }
1633
+ }));
1634
+ }
1635
+ });
1636
+ };
1637
+ DevicesMenu.propTypes = propTypes$f;
1638
+ DevicesMenu.defaultProps = defaultProps$f;
1639
+ var DevicesMenu$1 = DevicesMenu;
1640
+
1641
+ var styles$c = {"container":"micromag-editor-buttons-screen-container","button":"micromag-editor-buttons-screen-button","screen":"micromag-editor-buttons-screen-screen","inner":"micromag-editor-buttons-screen-inner","border":"micromag-editor-buttons-screen-border","icon":"micromag-editor-buttons-screen-icon","label":"micromag-editor-buttons-screen-label","active":"micromag-editor-buttons-screen-active"};
1642
+
1643
+ var propTypes$e = {
1644
+ active: PropTypes.bool,
1645
+ id: PropTypes.string,
1646
+ href: PropTypes.string,
1647
+ label: core.PropTypes.label,
1648
+ icon: PropTypes.node,
1649
+ title: PropTypes.string,
1650
+ onClick: PropTypes.func,
1651
+ children: PropTypes.node,
1652
+ refButton: PropTypes.shape({
1653
+ current: PropTypes.any // eslint-disable-line
1654
+ }),
1655
+ className: PropTypes.string
1656
+ };
1657
+ var defaultProps$e = {
1658
+ active: false,
1659
+ id: null,
1660
+ href: null,
1661
+ label: null,
1662
+ icon: null,
1663
+ title: null,
1664
+ onClick: null,
1665
+ children: null,
1666
+ refButton: null,
1667
+ className: null
1668
+ };
1669
+ var ScreenButton = function ScreenButton(_ref) {
1670
+ var active = _ref.active,
1671
+ id = _ref.id,
1672
+ href = _ref.href,
1673
+ className = _ref.className,
1674
+ label = _ref.label,
1675
+ icon = _ref.icon,
1676
+ children = _ref.children,
1677
+ title = _ref.title,
1678
+ onClick = _ref.onClick,
1679
+ refButton = _ref.refButton;
1680
+ return /*#__PURE__*/React.createElement("div", {
1681
+ className: classNames([styles$c.container, 'rounded', _defineProperty(_defineProperty({}, styles$c.active, active), className, className !== null)])
1682
+ }, children !== null ? children : /*#__PURE__*/React.createElement("div", {
1683
+ className: styles$c.screen
1684
+ }, /*#__PURE__*/React.createElement("div", {
1685
+ className: styles$c.inner
1686
+ }, icon !== null ? /*#__PURE__*/React.createElement("div", {
1687
+ className: styles$c.icon
1688
+ }, icon) : null, label !== null ? /*#__PURE__*/React.createElement("div", {
1689
+ className: styles$c.label
1690
+ }, label) : null)), /*#__PURE__*/React.createElement(components.Button, {
1691
+ className: styles$c.button,
1692
+ withoutStyle: true,
1693
+ id: id,
1694
+ href: href,
1695
+ title: title,
1696
+ onClick: onClick,
1697
+ refButton: refButton
1698
+ }, /*#__PURE__*/React.createElement("span", {
1699
+ className: classNames([styles$c.border, 'rounded'])
1700
+ })));
1701
+ };
1702
+ ScreenButton.propTypes = propTypes$e;
1703
+ ScreenButton.defaultProps = defaultProps$e;
1704
+ var ScreenButton$1 = /*#__PURE__*/React.forwardRef(function (props, ref) {
1705
+ return /*#__PURE__*/React.createElement(ScreenButton, Object.assign({}, props, {
1706
+ refButton: ref
1707
+ }));
1708
+ });
1709
+
1710
+ var styles$b = {"button":"micromag-editor-buttons-screen-with-preview-button","name":"micromag-editor-buttons-screen-with-preview-name","index":"micromag-editor-buttons-screen-with-preview-index","deleteButton":"micromag-editor-buttons-screen-with-preview-deleteButton","withIndex":"micromag-editor-buttons-screen-with-preview-withIndex"};
1711
+
1712
+ var propTypes$d = {
1713
+ screen: core.PropTypes.screenComponent,
1714
+ screenState: PropTypes.string,
1715
+ index: PropTypes.number.isRequired,
1716
+ href: PropTypes.string,
1717
+ title: PropTypes.string,
1718
+ active: PropTypes.bool,
1719
+ withPlaceholder: PropTypes.bool,
1720
+ withIndexIndicator: PropTypes.bool,
1721
+ withName: PropTypes.bool,
1722
+ withDeleteButtonOnRepeatables: PropTypes.bool,
1723
+ onClick: PropTypes.func,
1724
+ onClickItem: PropTypes.func,
1725
+ onDeleteButtonClick: PropTypes.func,
1726
+ className: PropTypes.string
1727
+ };
1728
+ var defaultProps$d = {
1729
+ screen: null,
1730
+ screenState: null,
1731
+ title: null,
1732
+ href: null,
1733
+ active: false,
1734
+ withPlaceholder: false,
1735
+ withIndexIndicator: false,
1736
+ withName: false,
1737
+ withDeleteButtonOnRepeatables: false,
1738
+ onClick: null,
1739
+ onClickItem: null,
1740
+ onDeleteButtonClick: null,
1741
+ className: null
1742
+ };
1743
+ var ScreenWithPreview = function ScreenWithPreview(_ref) {
1744
+ var screen = _ref.screen,
1745
+ screenState = _ref.screenState,
1746
+ index = _ref.index,
1747
+ title = _ref.title,
1748
+ href = _ref.href,
1749
+ active = _ref.active,
1750
+ className = _ref.className,
1751
+ _onClick = _ref.onClick,
1752
+ onClickItem = _ref.onClickItem,
1753
+ withName = _ref.withName,
1754
+ withPlaceholder = _ref.withPlaceholder,
1755
+ withIndexIndicator = _ref.withIndexIndicator,
1756
+ withDeleteButtonOnRepeatables = _ref.withDeleteButtonOnRepeatables,
1757
+ onDeleteButtonClick = _ref.onDeleteButtonClick;
1758
+ var intl = reactIntl.useIntl();
1759
+ var _useIsVisible = hooks.useIsVisible({
1760
+ threshold: 0.1
1761
+ }),
1762
+ ref = _useIsVisible.ref,
1763
+ visible = _useIsVisible.visible;
1764
+ var ScreenComponent = withPlaceholder ? components.ScreenPlaceholder : components.ScreenPreview;
1765
+ var finalTitle = utils.isMessage(title) ? intl.formatMessage(title) : title || null;
1766
+ return /*#__PURE__*/React.createElement("div", {
1767
+ ref: ref
1768
+ }, /*#__PURE__*/React.createElement(ScreenButton$1, {
1769
+ href: href,
1770
+ active: active,
1771
+ className: classNames([styles$b.button, _defineProperty(_defineProperty({}, className, className !== null), styles$b.withIndex, withIndexIndicator || withName)]),
1772
+ title: finalTitle,
1773
+ onClick: function onClick() {
1774
+ if (_onClick !== null) {
1775
+ _onClick(screen, index);
1776
+ }
1777
+ if (onClickItem !== null) {
1778
+ onClickItem(screen, index);
1779
+ }
1780
+ }
1781
+ }, /*#__PURE__*/React.createElement(ScreenComponent, {
1782
+ screen: screen,
1783
+ screenState: screenState,
1784
+ className: styles$b.screen,
1785
+ hidden: !visible,
1786
+ withSize: true
1787
+ }), index !== null && withIndexIndicator ? /*#__PURE__*/React.createElement("div", {
1788
+ className: styles$b.index
1789
+ }, index + 1) : null, withName && !withIndexIndicator ? /*#__PURE__*/React.createElement("div", {
1790
+ className: styles$b.name
1791
+ }, finalTitle || null) : null, withDeleteButtonOnRepeatables ? /*#__PURE__*/React.createElement("div", {
1792
+ className: styles$b.deleteButton,
1793
+ onClick: onDeleteButtonClick
1794
+ }, /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
1795
+ icon: faTimesCircle.faTimesCircle
1796
+ })) : null));
1797
+ };
1798
+ ScreenWithPreview.propTypes = propTypes$d;
1799
+ ScreenWithPreview.defaultProps = defaultProps$d;
1800
+ var ScreenWithPreview$1 = ScreenWithPreview;
1801
+
1802
+ var styles$a = {"container":"micromag-editor-partials-screen-states-container","button":"micromag-editor-partials-screen-states-button","addButton":"micromag-editor-partials-screen-states-addButton","title":"micromag-editor-partials-screen-states-title"};
1803
+
1804
+ var propTypes$c = {
1805
+ screen: core.PropTypes.screen.isRequired,
1806
+ screenState: PropTypes.string,
1807
+ value: core.PropTypes.story.isRequired,
1808
+ className: PropTypes.string,
1809
+ onChange: PropTypes.func
1810
+ };
1811
+ var defaultProps$c = {
1812
+ screenState: null,
1813
+ className: null,
1814
+ onChange: null
1815
+ };
1816
+ function ScreenStates(_ref) {
1817
+ var screen = _ref.screen,
1818
+ value = _ref.value,
1819
+ className = _ref.className,
1820
+ onChange = _ref.onChange;
1821
+ var url = contexts.useUrlGenerator();
1822
+ var push = contexts.useRoutePush();
1823
+ var _useRouteParams = useRouteParams(),
1824
+ _useRouteParams$scree = _useRouteParams.screen,
1825
+ screenParam = _useRouteParams$scree === void 0 ? null : _useRouteParams$scree,
1826
+ _useRouteParams$field = _useRouteParams.field,
1827
+ field = _useRouteParams$field === void 0 ? null : _useRouteParams$field;
1828
+ var states = useScreenStates(screen);
1829
+ var _ref2 = field !== null ? field.split('/') : [],
1830
+ _ref3 = _toArray(_ref2),
1831
+ _ref3$ = _ref3[0],
1832
+ stateParam = _ref3$ === void 0 ? null : _ref3$,
1833
+ stateIndexes = _ref3.slice(1);
1834
+ var stateIndex = stateIndexes.find(function (it) {
1835
+ return it.match(/^[0-9]+$/) !== null;
1836
+ }) || null;
1837
+ var currentState = stateParam !== null && states.findIndex(function (_ref4) {
1838
+ var id = _ref4.id;
1839
+ return id === stateParam;
1840
+ }) !== -1 ? stateParam : null;
1841
+ return /*#__PURE__*/React.createElement("div", {
1842
+ className: classNames([styles$a.container, _defineProperty({}, className, className !== null)])
1843
+ }, /*#__PURE__*/React.createElement("div", {
1844
+ className: "d-flex align-items-end m-n1"
1845
+ }, /*#__PURE__*/React.createElement("div", {
1846
+ className: "p-1 align-self-stretch d-flex flex-column"
1847
+ }, /*#__PURE__*/React.createElement("h6", {
1848
+ className: classNames(['fw-normal', 'invisible', styles$a.title])
1849
+ }, "Settings"), /*#__PURE__*/React.createElement(components.Button, {
1850
+ className: classNames([styles$a.button, 'p-0', 'flex-grow-1', 'justify-content-center']),
1851
+ theme: screenParam !== null && field === null ? 'primary' : 'secondary',
1852
+ outline: screenParam === null || field !== null,
1853
+ size: "lg",
1854
+ icon: /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
1855
+ icon: faCogs.faCogs
1856
+ }),
1857
+ href: url('screen', {
1858
+ screen: screen.id
1859
+ })
1860
+ })), states.map(function (state) {
1861
+ var id = state.id,
1862
+ _state$label = state.label,
1863
+ label = _state$label === void 0 ? null : _state$label,
1864
+ _state$repeatable = state.repeatable,
1865
+ repeatable = _state$repeatable === void 0 ? false : _state$repeatable,
1866
+ _state$withoutCreate = state.withoutCreate,
1867
+ withoutCreate = _state$withoutCreate === void 0 ? false : _state$withoutCreate,
1868
+ _state$fieldName = state.fieldName,
1869
+ fieldName = _state$fieldName === void 0 ? null : _state$fieldName;
1870
+ var repeatableItems = repeatable ? screen[fieldName || id] || [] : null;
1871
+ var onClickAdd = function onClickAdd() {
1872
+ var _ref6 = value || {},
1873
+ _ref6$components = _ref6.components,
1874
+ currentComponentsValue = _ref6$components === void 0 ? [] : _ref6$components;
1875
+ var currentScreenIndex = currentComponentsValue.findIndex(function (_ref7) {
1876
+ var screenId = _ref7.id;
1877
+ return screen.id === screenId;
1878
+ });
1879
+ var currentScreenValue = currentComponentsValue[currentScreenIndex] || {};
1880
+ var currentFieldValue = currentScreenValue[fieldName || id] || [];
1881
+ var newValue = _objectSpread(_objectSpread({}, value), {}, {
1882
+ components: [].concat(_toConsumableArray(currentComponentsValue.slice(0, currentScreenIndex)), [_objectSpread(_objectSpread({}, currentScreenValue), {}, _defineProperty({}, fieldName || id, [].concat(_toConsumableArray(currentFieldValue), [{}])))], _toConsumableArray(currentComponentsValue.slice(currentScreenIndex + 1)))
1883
+ });
1884
+ if (onChange !== null) {
1885
+ onChange(newValue);
1886
+ }
1887
+ push('screen.field', {
1888
+ screen: screen.id,
1889
+ field: [id, currentFieldValue.length]
1890
+ });
1891
+ };
1892
+ var onClickDelete = function onClickDelete(indexToDelete) {
1893
+ var _ref8 = value || {},
1894
+ _ref8$components = _ref8.components,
1895
+ currentComponentsValue = _ref8$components === void 0 ? [] : _ref8$components;
1896
+ var currentScreenIndex = currentComponentsValue.findIndex(function (_ref9) {
1897
+ var screenId = _ref9.id;
1898
+ return screen.id === screenId;
1899
+ });
1900
+ var currentScreenValue = currentComponentsValue[currentScreenIndex] || {};
1901
+ currentScreenValue[fieldName || id] || [];
1902
+ var newValue = _objectSpread(_objectSpread({}, value), {}, {
1903
+ components: [].concat(_toConsumableArray(currentComponentsValue.slice(0, currentScreenIndex)), [_objectSpread(_objectSpread({}, currentScreenValue), {}, _defineProperty({}, fieldName || id, (currentScreenValue[fieldName || id] || []).filter(function (_, index) {
1904
+ return index !== indexToDelete;
1905
+ })))], _toConsumableArray(currentComponentsValue.slice(currentScreenIndex + 1)))
1906
+ });
1907
+ if (onChange !== null) {
1908
+ onChange(newValue);
1909
+ }
1910
+ push('screen', {
1911
+ screen: screen.id
1912
+ });
1913
+ };
1914
+ return /*#__PURE__*/React.createElement("div", {
1915
+ className: "p-1 align-self-stretch d-flex flex-column"
1916
+ }, /*#__PURE__*/React.createElement("h6", {
1917
+ className: classNames(['fw-normal', 'text-body-secondary', styles$a.title])
1918
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, label)), repeatable ? /*#__PURE__*/React.createElement("ul", {
1919
+ className: "d-flex list-unstyled m-n1 flex-grow-1"
1920
+ }, repeatableItems.map(function (item, index) {
1921
+ return /*#__PURE__*/React.createElement("li", {
1922
+ className: "p-1"
1923
+ }, /*#__PURE__*/React.createElement(ScreenWithPreview$1, {
1924
+ index: index,
1925
+ withIndexIndicator: true,
1926
+ withDeleteButtonOnRepeatables: true,
1927
+ screen: screen,
1928
+ screenState: "".concat(id, ".").concat(index),
1929
+ className: styles$a.button,
1930
+ active: currentState !== null && id === currentState.split('.')[0] && stateIndex !== null && parseInt(stateIndex, 10) === index,
1931
+ href: url('screen.field', {
1932
+ screen: screen.id,
1933
+ field: [id, index]
1934
+ }),
1935
+ onDeleteButtonClick: function onDeleteButtonClick() {
1936
+ return onClickDelete(index);
1937
+ }
1938
+ }));
1939
+ }), !withoutCreate ? /*#__PURE__*/React.createElement("li", {
1940
+ className: "p-1"
1941
+ }, /*#__PURE__*/React.createElement(components.Button, {
1942
+ className: classNames([styles$a.button, styles$a.addButton, 'h-100', 'p-0', 'justify-content-center']),
1943
+ theme: "secondary",
1944
+ outline: true,
1945
+ size: "lg",
1946
+ icon: /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
1947
+ icon: faPlus.faPlus
1948
+ }),
1949
+ onClick: onClickAdd
1950
+ })) : null) : /*#__PURE__*/React.createElement(ScreenWithPreview$1, {
1951
+ screen: screen,
1952
+ screenState: id,
1953
+ className: styles$a.button,
1954
+ active: id === currentState,
1955
+ href: url('screen.field', {
1956
+ screen: screen.id,
1957
+ field: id
1958
+ })
1959
+ // onClick={() => {
1960
+ // if (onStateChange !== null) {
1961
+ // onStateChange(id);
1962
+ // }
1963
+ // }}
1964
+ }));
1965
+ })));
1966
+ }
1967
+ ScreenStates.propTypes = propTypes$c;
1968
+ ScreenStates.defaultProps = defaultProps$c;
1969
+
1970
+ var styles$9 = {"container":"micromag-editor-preview-container","story":"micromag-editor-preview-story","noStory":"micromag-editor-preview-noStory","inner":"micromag-editor-preview-inner","top":"micromag-editor-preview-top","bottom":"micromag-editor-preview-bottom","preview":"micromag-editor-preview-preview","viewerContainer":"micromag-editor-preview-viewerContainer","devices":"micromag-editor-preview-devices"};
1971
+
1972
+ var propTypes$b = {
1973
+ value: PropTypes.oneOfType([core.PropTypes.story, core.PropTypes.theme]),
1974
+ devices: core.PropTypes.devices,
1975
+ device: PropTypes.string,
1976
+ viewerTheme: core.PropTypes.viewerTheme,
1977
+ isTheme: PropTypes.bool,
1978
+ className: PropTypes.string,
1979
+ onScreenChange: PropTypes.func,
1980
+ onChange: PropTypes.func,
1981
+ withoutDevicesSizes: PropTypes.bool
1982
+ };
1983
+ var defaultProps$b = {
1984
+ value: null,
1985
+ devices: [{
1986
+ id: 'mobile',
1987
+ width: 320,
1988
+ height: 480
1989
+ }, {
1990
+ id: 'desktop',
1991
+ width: 1200,
1992
+ height: 900
1993
+ }],
1994
+ device: 'mobile',
1995
+ viewerTheme: null,
1996
+ isTheme: false,
1997
+ className: null,
1998
+ onScreenChange: null,
1999
+ onChange: null,
2000
+ withoutDevicesSizes: true
2001
+ };
2002
+ var EditorPreview = function EditorPreview(_ref) {
2003
+ var value = _ref.value,
2004
+ viewerTheme = _ref.viewerTheme,
2005
+ isTheme = _ref.isTheme,
2006
+ devices = _ref.devices,
2007
+ initialDevice = _ref.device,
2008
+ className = _ref.className,
2009
+ onScreenChange = _ref.onScreenChange,
2010
+ onChange = _ref.onChange,
2011
+ withoutDevicesSizes = _ref.withoutDevicesSizes;
2012
+ var _useRouteParams = useRouteParams(),
2013
+ _useRouteParams$scree = _useRouteParams.screen,
2014
+ screenId = _useRouteParams$scree === void 0 ? null : _useRouteParams$scree,
2015
+ _useRouteParams$field = _useRouteParams.field,
2016
+ fieldParam = _useRouteParams$field === void 0 ? null : _useRouteParams$field;
2017
+ var _useScreenSize = contexts.useScreenSize(),
2018
+ _useScreenSize$screen = _useScreenSize.screen,
2019
+ screen = _useScreenSize$screen === void 0 ? null : _useScreenSize$screen,
2020
+ _useScreenSize$screen2 = _useScreenSize.screens,
2021
+ screens = _useScreenSize$screen2 === void 0 ? [] : _useScreenSize$screen2;
2022
+ var valueWithTheme = useThemeValue(value, isTheme);
2023
+ // const valueParsed = valueWithTheme;
2024
+ var valueParsed = hooks.useParsedStory(valueWithTheme, {
2025
+ withTheme: isTheme,
2026
+ withMedias: false
2027
+ });
2028
+
2029
+ // Get device
2030
+ var _useState = React.useState(initialDevice || devices[0].id),
2031
+ _useState2 = _slicedToArray(_useState, 2),
2032
+ deviceId = _useState2[0],
2033
+ setDeviceId = _useState2[1];
2034
+ var onClickDeviceItem = React.useCallback(function (e, it) {
2035
+ return setDeviceId(it.id);
2036
+ }, [setDeviceId]);
2037
+ var device = React.useMemo(function () {
2038
+ return devices.find(function (it) {
2039
+ return it.id === deviceId;
2040
+ });
2041
+ }, [devices, deviceId]);
2042
+
2043
+ // Calculate preview style
2044
+ var _useDimensionObserver = hooks.useDimensionObserver(),
2045
+ bottomRef = _useDimensionObserver.ref,
2046
+ _useDimensionObserver2 = _useDimensionObserver.width,
2047
+ bottomWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2,
2048
+ _useDimensionObserver3 = _useDimensionObserver.height,
2049
+ bottomHeight = _useDimensionObserver3 === void 0 ? 0 : _useDimensionObserver3;
2050
+ var previewStyle = React.useMemo(function () {
2051
+ if (withoutDevicesSizes && initialDevice === null) {
2052
+ return {};
2053
+ }
2054
+ var deviceWidth = device.width,
2055
+ deviceHeight = device.height;
2056
+ var maxWidth = screen === 'mobile' ? bottomWidth : deviceWidth;
2057
+ var maxHeight = screen === 'mobile' ? bottomHeight : deviceHeight;
2058
+ var _getSizeWithinBounds = size.getSizeWithinBounds(maxWidth, maxHeight, bottomWidth, bottomHeight),
2059
+ previewScale = _getSizeWithinBounds.scale;
2060
+ return {
2061
+ width: maxWidth * previewScale,
2062
+ height: maxHeight * previewScale
2063
+ // transform: `scale(${previewScale}, ${previewScale})`,
2064
+ };
2065
+ }, [device, bottomWidth, bottomHeight, screen, withoutDevicesSizes, initialDevice]);
2066
+ var currentScreen = React.useMemo(function () {
2067
+ var _ref2 = valueParsed || {},
2068
+ _ref2$components = _ref2.components,
2069
+ components = _ref2$components === void 0 ? [] : _ref2$components;
2070
+ return (screenId !== null ? components.find(function (_ref3) {
2071
+ var id = _ref3.id;
2072
+ return id === screenId;
2073
+ }) : components[0]) || null;
2074
+ }, [valueParsed, screenId]);
2075
+ var currentScreenStates = useScreenStates(currentScreen);
2076
+ var _ref4 = fieldParam !== null && currentScreenStates !== null ? fieldParam.split('/') : [],
2077
+ _ref5 = _slicedToArray(_ref4, 1),
2078
+ _ref5$ = _ref5[0],
2079
+ screenStateParam = _ref5$ === void 0 ? null : _ref5$;
2080
+ var currentScreenState = screenStateParam !== null ? currentScreenStates.find(function (_ref6) {
2081
+ var id = _ref6.id;
2082
+ return id === screenStateParam;
2083
+ }) || null : null;
2084
+ var _ref7 = currentScreenState || {},
2085
+ _ref7$id = _ref7.id,
2086
+ screenStateId = _ref7$id === void 0 ? null : _ref7$id,
2087
+ _ref7$repeatable = _ref7.repeatable,
2088
+ repeatable = _ref7$repeatable === void 0 ? false : _ref7$repeatable;
2089
+ var currentScreenStateId = currentScreenState !== null && repeatable ? "".concat(screenStateId, ".").concat(fieldParam.split('/').find(function (it) {
2090
+ return it.match(/^[0-9]+$/) !== null;
2091
+ }) || 0) : screenStateId;
2092
+ return /*#__PURE__*/React.createElement("div", {
2093
+ className: classNames([styles$9.container, screens.map(function (screenName) {
2094
+ return styles$9["screen-".concat(screenName)];
2095
+ }), _defineProperty(_defineProperty({}, className, className), styles$9.withoutDevicesSizes, withoutDevicesSizes)])
2096
+ }, /*#__PURE__*/React.createElement("div", {
2097
+ className: styles$9.inner
2098
+ }, currentScreenStates !== null && currentScreen !== null ? /*#__PURE__*/React.createElement("div", {
2099
+ className: classNames([styles$9.top, 'px-1'])
2100
+ }, /*#__PURE__*/React.createElement(ScreenStates, {
2101
+ screen: currentScreen,
2102
+ screenState: currentScreenStateId,
2103
+ value: value,
2104
+ onChange: onChange
2105
+ })) : null, /*#__PURE__*/React.createElement("div", {
2106
+ className: styles$9.bottom
2107
+ }, /*#__PURE__*/React.createElement("div", {
2108
+ className: styles$9.inner,
2109
+ ref: bottomRef
2110
+ }, /*#__PURE__*/React.createElement("div", {
2111
+ className: styles$9.preview,
2112
+ style: previewStyle
2113
+ }, /*#__PURE__*/React.createElement("div", {
2114
+ className: styles$9.viewerContainer
2115
+ }, /*#__PURE__*/React.createElement(contexts.PlaybackProvider, null, /*#__PURE__*/React.createElement(viewer.Viewer, {
2116
+ story: valueParsed,
2117
+ storyIsParsed: true,
2118
+ screen: screenId,
2119
+ screenState: currentScreenStateId,
2120
+ className: styles$9.story,
2121
+ theme: viewerTheme,
2122
+ interactions: null,
2123
+ renderContext: "edit",
2124
+ onScreenChange: onScreenChange,
2125
+ withoutNavigationArrow: true,
2126
+ withoutTransitions: true,
2127
+ withoutGestures: true,
2128
+ withoutMenu: true
2129
+ })))))), !withoutDevicesSizes ? /*#__PURE__*/React.createElement("div", {
2130
+ className: styles$9.deviceMenu
2131
+ }, /*#__PURE__*/React.createElement(DevicesMenu$1, {
2132
+ items: devices.map(function (it) {
2133
+ return _objectSpread(_objectSpread({}, it), {}, {
2134
+ active: it.id === deviceId
2135
+ });
2136
+ }),
2137
+ onClickItem: onClickDeviceItem,
2138
+ className: styles$9.devices
2139
+ })) : null));
2140
+ };
2141
+ EditorPreview.propTypes = propTypes$b;
2142
+ EditorPreview.defaultProps = defaultProps$b;
2143
+ var EditorPreview$1 = EditorPreview;
2144
+
2145
+ var iOS = /iPad|iPhone|iPod/.test(navigator.platform);
2146
+ function getDragDepth(offset, indentationWidth) {
2147
+ return Math.round(offset / indentationWidth);
2148
+ }
2149
+ function getMaxDepth(_ref) {
2150
+ var previousItem = _ref.previousItem;
2151
+ if (previousItem) {
2152
+ // return previousItem.depth + 1;
2153
+ return 1;
2154
+ }
2155
+ return 0;
2156
+ }
2157
+ function getMinDepth(_ref2) {
2158
+ var nextItem = _ref2.nextItem;
2159
+ if (nextItem) {
2160
+ // return nextItem.depth;
2161
+ return 0;
2162
+ }
2163
+ return 0;
2164
+ }
2165
+ function getProjection(items, activeId, overId, dragOffset, indentationWidth) {
2166
+ var overItemIndex = items.findIndex(function (_ref3) {
2167
+ var id = _ref3.id;
2168
+ return id === overId;
2169
+ });
2170
+ var activeItemIndex = items.findIndex(function (_ref4) {
2171
+ var id = _ref4.id;
2172
+ return id === activeId;
2173
+ });
2174
+ var activeItem = items[activeItemIndex];
2175
+ var newItems = sortable.arrayMove(items, activeItemIndex, overItemIndex);
2176
+ var previousItem = newItems[overItemIndex - 1];
2177
+ var nextItem = newItems[overItemIndex + 1];
2178
+ var dragDepth = getDragDepth(dragOffset, indentationWidth);
2179
+ var projectedDepth = activeItem.depth + dragDepth;
2180
+ var maxDepth = getMaxDepth({
2181
+ previousItem: previousItem
2182
+ });
2183
+ var minDepth = getMinDepth({
2184
+ nextItem: nextItem
2185
+ });
2186
+ var depth = projectedDepth;
2187
+ if (projectedDepth >= maxDepth) {
2188
+ depth = maxDepth;
2189
+ } else if (projectedDepth < minDepth) {
2190
+ depth = minDepth;
2191
+ }
2192
+ function getParentId() {
2193
+ var _newItems$slice$rever;
2194
+ if (depth === 0 || !previousItem) {
2195
+ return null;
2196
+ }
2197
+ if (depth === previousItem.depth) {
2198
+ return previousItem.parentId;
2199
+ }
2200
+ if (depth > previousItem.depth) {
2201
+ return previousItem.id;
2202
+ }
2203
+ var newParent = (_newItems$slice$rever = newItems.slice(0, overItemIndex).reverse().find(function (item) {
2204
+ return item.depth === depth;
2205
+ })) === null || _newItems$slice$rever === void 0 ? void 0 : _newItems$slice$rever.parentId;
2206
+ return newParent !== null && newParent !== void 0 ? newParent : null;
2207
+ }
2208
+ return {
2209
+ depth: depth,
2210
+ maxDepth: maxDepth,
2211
+ minDepth: minDepth,
2212
+ parentId: getParentId()
2213
+ };
2214
+ }
2215
+ function flatten(items) {
2216
+ var parentId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2217
+ var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2218
+ return items.reduce(function (acc, item, index) {
2219
+ return [].concat(_toConsumableArray(acc), [_objectSpread(_objectSpread({}, item), {}, {
2220
+ parentId: item.parentId || parentId,
2221
+ depth: item.parentId ? 1 : 0,
2222
+ index: index // For some reason this aint enough
2223
+ })], _toConsumableArray(flatten(item.children || [], item.id, depth + 1)));
2224
+ }, []);
2225
+ }
2226
+ function flattenTree(items) {
2227
+ return flatten(items);
2228
+ }
2229
+ function findItem(items, itemId) {
2230
+ return items.find(function (_ref5) {
2231
+ var id = _ref5.id;
2232
+ return id === itemId;
2233
+ });
2234
+ }
2235
+ function buildTree(flattenedItems) {
2236
+ var root = {
2237
+ id: 'root',
2238
+ children: []
2239
+ };
2240
+ var nodes = _defineProperty({}, root.id, root);
2241
+ var items = flattenedItems.map(function (item) {
2242
+ return _objectSpread(_objectSpread({}, item), {}, {
2243
+ children: []
2244
+ });
2245
+ });
2246
+ // console.log('BUILD');
2247
+ var indexes = {};
2248
+ // eslint-disable-next-line no-restricted-syntax
2249
+ var _iterator = _createForOfIteratorHelper(items),
2250
+ _step;
2251
+ try {
2252
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
2253
+ var _item$parentId, _nodes$parentId;
2254
+ var item = _step.value;
2255
+ var id = item.id,
2256
+ children = item.children;
2257
+ var parentId = (_item$parentId = item.parentId) !== null && _item$parentId !== void 0 ? _item$parentId : root.id;
2258
+ var parent = (_nodes$parentId = nodes[parentId]) !== null && _nodes$parentId !== void 0 ? _nodes$parentId : findItem(items, parentId);
2259
+ if (typeof indexes[parentId] !== 'undefined') {
2260
+ indexes[parentId] += 1;
2261
+ } else {
2262
+ indexes[parentId] = 0;
2263
+ }
2264
+ nodes[id] = {
2265
+ id: id,
2266
+ children: children,
2267
+ index: indexes[parentId]
2268
+ };
2269
+ parent.children.push(_objectSpread(_objectSpread({}, item), {}, {
2270
+ index: indexes[parentId]
2271
+ }));
2272
+ }
2273
+ } catch (err) {
2274
+ _iterator.e(err);
2275
+ } finally {
2276
+ _iterator.f();
2277
+ }
2278
+ return root.children;
2279
+ }
2280
+ function findItemDeep(items, itemId) {
2281
+ for (var i = 0; i < items.length; i += 1) {
2282
+ var item = items[i] || {};
2283
+ var id = item.id,
2284
+ _item$children = item.children,
2285
+ children = _item$children === void 0 ? [] : _item$children;
2286
+ if (id === itemId) {
2287
+ return item;
2288
+ }
2289
+ if (children.length > 0) {
2290
+ var child = findItemDeep(children, itemId);
2291
+ if (child) {
2292
+ return child;
2293
+ }
2294
+ }
2295
+ }
2296
+ return undefined;
2297
+ }
2298
+ function removeItem(items, id) {
2299
+ var newItems = [];
2300
+
2301
+ // eslint-disable-next-line no-restricted-syntax
2302
+ var _iterator2 = _createForOfIteratorHelper(items),
2303
+ _step2;
2304
+ try {
2305
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2306
+ var item = _step2.value;
2307
+ if (item.id === id) {
2308
+ // eslint-disable-next-line no-continue
2309
+ continue;
2310
+ }
2311
+ if (item.children.length) {
2312
+ item.children = removeItem(item.children, id);
2313
+ }
2314
+ newItems.push(item);
2315
+ }
2316
+ } catch (err) {
2317
+ _iterator2.e(err);
2318
+ } finally {
2319
+ _iterator2.f();
2320
+ }
2321
+ return newItems;
2322
+ }
2323
+ function setProperty(items, id, property, setter) {
2324
+ // eslint-disable-next-line no-restricted-syntax
2325
+ var _iterator3 = _createForOfIteratorHelper(items),
2326
+ _step3;
2327
+ try {
2328
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
2329
+ var item = _step3.value;
2330
+ if (item.id === id) {
2331
+ item[property] = setter(item[property]);
2332
+ // eslint-disable-next-line no-continue
2333
+ continue;
2334
+ }
2335
+ if (item.children.length) {
2336
+ item.children = setProperty(item.children, id, property, setter);
2337
+ }
2338
+ }
2339
+ } catch (err) {
2340
+ _iterator3.e(err);
2341
+ } finally {
2342
+ _iterator3.f();
2343
+ }
2344
+ return _toConsumableArray(items);
2345
+ }
2346
+ function countChildren(items) {
2347
+ var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
2348
+ return items.reduce(function (acc, _ref6) {
2349
+ var _ref6$children = _ref6.children,
2350
+ children = _ref6$children === void 0 ? [] : _ref6$children;
2351
+ if (children.length) {
2352
+ return countChildren(children, acc + 1);
2353
+ }
2354
+ return acc + 1;
2355
+ }, count);
2356
+ }
2357
+ function getChildCount(items, id) {
2358
+ if (!id) {
2359
+ return 0;
2360
+ }
2361
+ var item = findItemDeep(items, id);
2362
+ return item ? countChildren(item.children || []) : 0;
2363
+ }
2364
+ function removeChildrenOf(items, ids) {
2365
+ var excludeParentIds = _toConsumableArray(ids);
2366
+ return items.filter(function (item) {
2367
+ if (item.parentId && excludeParentIds.includes(item.parentId)) {
2368
+ var _item$children2 = item.children,
2369
+ children = _item$children2 === void 0 ? [] : _item$children2;
2370
+ if (children.length) {
2371
+ excludeParentIds.push(item.id);
2372
+ }
2373
+ return false;
2374
+ }
2375
+ return true;
2376
+ });
2377
+ }
2378
+
2379
+ var directions = [core$1.KeyboardCode.Down, core$1.KeyboardCode.Right, core$1.KeyboardCode.Up, core$1.KeyboardCode.Left];
2380
+ var horizontal = [core$1.KeyboardCode.Left, core$1.KeyboardCode.Right];
2381
+ var sortableTreeKeyboardCoordinates = function sortableTreeKeyboardCoordinates(context, indentationWidth) {
2382
+ return function (event, _ref) {
2383
+ var currentCoordinates = _ref.currentCoordinates,
2384
+ _ref$context = _ref.context,
2385
+ active = _ref$context.active,
2386
+ over = _ref$context.over,
2387
+ collisionRect = _ref$context.collisionRect,
2388
+ droppableContainers = _ref$context.droppableContainers;
2389
+ if (directions.includes(event.code)) {
2390
+ var _droppableContainers$;
2391
+ if (!active || !collisionRect) {
2392
+ return;
2393
+ }
2394
+ event.preventDefault();
2395
+ var _context$current = context.current,
2396
+ items = _context$current.items,
2397
+ offset = _context$current.offset;
2398
+ if (horizontal.includes(event.code) && over !== null && over !== void 0 && over.id) {
2399
+ var _getProjection = getProjection(items, active.id, over.id, offset, indentationWidth),
2400
+ depth = _getProjection.depth,
2401
+ maxDepth = _getProjection.maxDepth,
2402
+ minDepth = _getProjection.minDepth;
2403
+ switch (event.code) {
2404
+ case core$1.KeyboardCode.Left:
2405
+ if (depth > minDepth) {
2406
+ return _objectSpread(_objectSpread({}, currentCoordinates), {}, {
2407
+ x: currentCoordinates.x - indentationWidth
2408
+ });
2409
+ }
2410
+ break;
2411
+ case core$1.KeyboardCode.Right:
2412
+ if (depth < maxDepth) {
2413
+ return _objectSpread(_objectSpread({}, currentCoordinates), {}, {
2414
+ x: currentCoordinates.x + indentationWidth
2415
+ });
2416
+ }
2417
+ break;
2418
+ default:
2419
+ return undefined;
2420
+ }
2421
+ return undefined;
2422
+ }
2423
+ var containers = [];
2424
+ var overRect = over !== null && over !== void 0 && over.id ? (_droppableContainers$ = droppableContainers.get(over.id)) === null || _droppableContainers$ === void 0 ? void 0 : _droppableContainers$.rect.current : undefined;
2425
+ if (overRect) {
2426
+ droppableContainers.forEach(function (container) {
2427
+ if (container !== null && container !== void 0 && container.disabled) {
2428
+ return;
2429
+ }
2430
+ var rect = container === null || container === void 0 ? void 0 : container.rect.current;
2431
+ if (!rect) {
2432
+ return;
2433
+ }
2434
+ switch (event.code) {
2435
+ case core$1.KeyboardCode.Down:
2436
+ if (overRect.top < rect.top) {
2437
+ containers.push(container);
2438
+ }
2439
+ break;
2440
+ case core$1.KeyboardCode.Up:
2441
+ if (overRect.top > rect.top) {
2442
+ containers.push(container);
2443
+ }
2444
+ break;
2445
+ //
2446
+ }
2447
+ });
2448
+ }
2449
+ var collisions = core$1.closestCorners({
2450
+ active: active,
2451
+ collisionRect: collisionRect,
2452
+ pointerCoordinates: null,
2453
+ droppableContainers: containers
2454
+ });
2455
+ var closestId = core$1.getFirstCollision(collisions, 'id');
2456
+ if (closestId && over !== null && over !== void 0 && over.id) {
2457
+ var _droppableContainers$2, _droppableContainers$3;
2458
+ var newNode = (_droppableContainers$2 = droppableContainers.get(closestId)) === null || _droppableContainers$2 === void 0 ? void 0 : _droppableContainers$2.node.current;
2459
+ var activeNodeRect = (_droppableContainers$3 = droppableContainers.get(active.id)) === null || _droppableContainers$3 === void 0 ? void 0 : _droppableContainers$3.rect.current;
2460
+ if (newNode && activeNodeRect) {
2461
+ var newRect = core$1.getClientRect(newNode, {
2462
+ ignoreTransform: true
2463
+ });
2464
+ var newItem = items.find(function (_ref2) {
2465
+ var id = _ref2.id;
2466
+ return id === closestId;
2467
+ });
2468
+ var activeItem = items.find(function (_ref3) {
2469
+ var id = _ref3.id;
2470
+ return id === active.id;
2471
+ });
2472
+ if (newItem && activeItem) {
2473
+ var _getProjection2 = getProjection(items, active.id, closestId, (newItem.depth - activeItem.depth) * indentationWidth, indentationWidth),
2474
+ _depth = _getProjection2.depth;
2475
+ var topOffset = newRect.top > activeNodeRect.top ? Math.abs(activeNodeRect.height - newRect.height) : 0;
2476
+ var newCoordinates = {
2477
+ x: newRect.left + _depth * indentationWidth,
2478
+ y: newRect.top + topOffset
2479
+ };
2480
+ return newCoordinates;
2481
+ }
2482
+ }
2483
+ }
2484
+ }
2485
+ return undefined;
2486
+ };
2487
+ };
2488
+
2489
+ var styles$8 = {"wrapper":"micromag-editor-sortable-sortable-tree-item-actions-wrapper","inner":"micromag-editor-sortable-sortable-tree-item-actions-inner","button":"micromag-editor-sortable-sortable-tree-item-actions-button","handle":"micromag-editor-sortable-sortable-tree-item-actions-handle","icon":"micromag-editor-sortable-sortable-tree-item-actions-icon","text":"micromag-editor-sortable-sortable-tree-item-actions-text","count":"micromag-editor-sortable-sortable-tree-item-actions-count","collapsedCount":"micromag-editor-sortable-sortable-tree-item-actions-collapsedCount","disableInteraction":"micromag-editor-sortable-sortable-tree-item-actions-disableInteraction","disableSelection":"micromag-editor-sortable-sortable-tree-item-actions-disableSelection","clone":"micromag-editor-sortable-sortable-tree-item-actions-clone","collapse":"micromag-editor-sortable-sortable-tree-item-actions-collapse","collapsed":"micromag-editor-sortable-sortable-tree-item-actions-collapsed","children":"micromag-editor-sortable-sortable-tree-item-actions-children","withChildren":"micromag-editor-sortable-sortable-tree-item-actions-withChildren","ghost":"micromag-editor-sortable-sortable-tree-item-actions-ghost","indicator":"micromag-editor-sortable-sortable-tree-item-actions-indicator"};
2490
+
2491
+ var _excluded$4 = ["childCount", "clone", "depth", "disableSelection", "disableInteraction", "ghost", "handleProps", "indentationWidth", "indicator", "collapsed", "onCollapse", "onRemove", "onClick", "style", "value", "wrapperRef", "showId", "showCount", "showCollapsedCount", "children"];
2492
+ var propTypes$a = {
2493
+ childCount: PropTypes.number,
2494
+ clone: PropTypes.bool,
2495
+ collapsed: PropTypes.bool,
2496
+ depth: PropTypes.number.isRequired,
2497
+ disableInteraction: PropTypes.bool,
2498
+ disableSelection: PropTypes.bool,
2499
+ ghost: PropTypes.bool,
2500
+ // eslint-disable-next-line react/forbid-prop-types
2501
+ handleProps: PropTypes.any,
2502
+ indicator: PropTypes.bool,
2503
+ indentationWidth: PropTypes.number.isRequired,
2504
+ value: PropTypes.string,
2505
+ onCollapse: PropTypes.func,
2506
+ onRemove: PropTypes.func,
2507
+ onClick: PropTypes.func,
2508
+ // eslint-disable-next-line react/forbid-prop-types
2509
+ wrapperRef: PropTypes.any,
2510
+ style: PropTypes.shape({
2511
+ width: PropTypes.number.isRequired,
2512
+ height: PropTypes.number.isRequired,
2513
+ transform: PropTypes.string.isRequired
2514
+ }),
2515
+ showId: PropTypes.bool,
2516
+ showCount: PropTypes.bool,
2517
+ showCollapsedCount: PropTypes.bool,
2518
+ children: PropTypes.node
2519
+ };
2520
+ var defaultProps$a = {
2521
+ childCount: null,
2522
+ clone: false,
2523
+ collapsed: false,
2524
+ disableInteraction: false,
2525
+ disableSelection: false,
2526
+ ghost: false,
2527
+ handleProps: null,
2528
+ indicator: false,
2529
+ value: null,
2530
+ onCollapse: null,
2531
+ onRemove: null,
2532
+ onClick: null,
2533
+ wrapperRef: null,
2534
+ style: null,
2535
+ showId: false,
2536
+ showCount: false,
2537
+ showCollapsedCount: false,
2538
+ children: null
2539
+ };
2540
+ var SortableTreeItemActions = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
2541
+ var childCount = _ref.childCount,
2542
+ clone = _ref.clone,
2543
+ depth = _ref.depth,
2544
+ disableSelection = _ref.disableSelection,
2545
+ disableInteraction = _ref.disableInteraction,
2546
+ ghost = _ref.ghost,
2547
+ handleProps = _ref.handleProps,
2548
+ indentationWidth = _ref.indentationWidth,
2549
+ indicator = _ref.indicator,
2550
+ collapsed = _ref.collapsed,
2551
+ onCollapse = _ref.onCollapse,
2552
+ onRemove = _ref.onRemove;
2553
+ _ref.onClick;
2554
+ var style = _ref.style;
2555
+ _ref.value;
2556
+ var wrapperRef = _ref.wrapperRef;
2557
+ _ref.showId;
2558
+ var showCount = _ref.showCount,
2559
+ showCollapsedCount = _ref.showCollapsedCount,
2560
+ children = _ref.children,
2561
+ props = _objectWithoutProperties(_ref, _excluded$4);
2562
+ return /*#__PURE__*/React.createElement("div", Object.assign({
2563
+ className: classNames([styles$8.wrapper, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, styles$8.clone, clone), styles$8.ghost, ghost), styles$8.indicator, indicator), styles$8.disableSelection, disableSelection), styles$8.disableInteraction, disableInteraction), styles$8.withChildren, onCollapse !== null)]),
2564
+ ref: wrapperRef,
2565
+ style: {
2566
+ marginLeft: "".concat(indentationWidth * depth, "px"),
2567
+ marginRight: "".concat(5 * depth, "px")
2568
+ }
2569
+ }, props), /*#__PURE__*/React.createElement("div", {
2570
+ className: styles$8.inner,
2571
+ ref: ref,
2572
+ style: style
2573
+ }, /*#__PURE__*/React.createElement("button", Object.assign({
2574
+ className: classNames([styles$8.button, styles$8.handle]),
2575
+ type: "button"
2576
+ }, handleProps), /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
2577
+ className: styles$8.icon,
2578
+ icon: faGripLines.faGripLines
2579
+ })), !clone && onRemove ? /*#__PURE__*/React.createElement("button", {
2580
+ type: "button",
2581
+ onClick: onRemove
2582
+ }, /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
2583
+ icon: faTimes.faTimes
2584
+ })) : null, clone && showCount && childCount && childCount > 1 ? /*#__PURE__*/React.createElement("span", {
2585
+ className: styles$8.count
2586
+ }, childCount) : null, showCollapsedCount && onCollapse && collapsed && childCount !== null && childCount > 0 ? /*#__PURE__*/React.createElement("span", {
2587
+ className: styles$8.collapsedCount
2588
+ }, childCount) : null, onCollapse && depth === 0 ? /*#__PURE__*/React.createElement("button", {
2589
+ type: "button",
2590
+ onClick: onCollapse,
2591
+ className: classNames(styles$8.button, styles$8.collapse, collapsed && styles$8.collapsed)
2592
+ }, /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
2593
+ icon: faAngleDown.faAngleDown
2594
+ })) : null, /*#__PURE__*/React.createElement("div", {
2595
+ className: styles$8.children
2596
+ }, children)));
2597
+ });
2598
+ SortableTreeItemActions.propTypes = propTypes$a;
2599
+ SortableTreeItemActions.defaultProps = defaultProps$a;
2600
+ var SortableTreeItemActions$1 = SortableTreeItemActions;
2601
+
2602
+ var styles$7 = {"container":"micromag-editor-sortable-sortable-tree-item-container","parent":"micromag-editor-sortable-sortable-tree-item-parent","child":"micromag-editor-sortable-sortable-tree-item-child"};
2603
+
2604
+ var _excluded$3 = ["id", "index", "depth", "component", "value", "style", "smallScale", "collapsed", "onCollapse", "onClickItem", "childValue", "isLastChild"];
2605
+ var propTypes$9 = {
2606
+ id: PropTypes.string.isRequired,
2607
+ index: PropTypes.number.isRequired,
2608
+ depth: PropTypes.number.isRequired,
2609
+ component: PropTypes.func,
2610
+ // eslint-disable-next-line react/forbid-prop-types
2611
+ value: PropTypes.object,
2612
+ style: PropTypes.shape({
2613
+ width: PropTypes.number.isRequired,
2614
+ height: PropTypes.number.isRequired,
2615
+ scaledWidth: PropTypes.number.isRequired,
2616
+ scaledHeight: PropTypes.number.isRequired,
2617
+ transform: PropTypes.string.isRequired,
2618
+ scale: PropTypes.number.isRequired
2619
+ }),
2620
+ smallScale: PropTypes.number,
2621
+ collapsed: PropTypes.bool,
2622
+ onCollapse: PropTypes.func,
2623
+ onClickItem: PropTypes.func,
2624
+ // eslint-disable-next-line react/forbid-prop-types
2625
+ childValue: PropTypes.object,
2626
+ isLastChild: PropTypes.bool
2627
+ };
2628
+ var defaultProps$9 = {
2629
+ component: null,
2630
+ value: null,
2631
+ style: null,
2632
+ smallScale: 0.75,
2633
+ collapsed: false,
2634
+ onCollapse: null,
2635
+ onClickItem: null,
2636
+ childValue: null,
2637
+ isLastChild: false
2638
+ };
2639
+ var animateLayoutChanges = function animateLayoutChanges(_ref) {
2640
+ var isSorting = _ref.isSorting,
2641
+ wasDragging = _ref.wasDragging;
2642
+ return !(isSorting || wasDragging);
2643
+ };
2644
+ var SortableTreeItem = function SortableTreeItem(_ref2) {
2645
+ var id = _ref2.id,
2646
+ index = _ref2.index,
2647
+ depth = _ref2.depth,
2648
+ Component = _ref2.component,
2649
+ value = _ref2.value;
2650
+ _ref2.style;
2651
+ _ref2.smallScale;
2652
+ var collapsed = _ref2.collapsed,
2653
+ onCollapse = _ref2.onCollapse,
2654
+ onClickItem = _ref2.onClickItem,
2655
+ childValue = _ref2.childValue;
2656
+ _ref2.isLastChild;
2657
+ var props = _objectWithoutProperties(_ref2, _excluded$3);
2658
+ var _useSortable = sortable.useSortable({
2659
+ id: id,
2660
+ animateLayoutChanges: animateLayoutChanges
2661
+ }),
2662
+ attributes = _useSortable.attributes,
2663
+ isDragging = _useSortable.isDragging,
2664
+ isSorting = _useSortable.isSorting,
2665
+ listeners = _useSortable.listeners,
2666
+ setDraggableNodeRef = _useSortable.setDraggableNodeRef,
2667
+ setDroppableNodeRef = _useSortable.setDroppableNodeRef,
2668
+ transform = _useSortable.transform,
2669
+ transition = _useSortable.transition;
2670
+ var timeout = React.useRef(null);
2671
+ var actionsStyle = {
2672
+ transform: utilities.CSS.Translate.toString(transform),
2673
+ transition: transition
2674
+ };
2675
+ var _ref3 = listeners || {},
2676
+ _ref3$onPointerDown = _ref3.onPointerDown,
2677
+ onPointerDown = _ref3$onPointerDown === void 0 ? null : _ref3$onPointerDown,
2678
+ _ref3$onPointerUp = _ref3.onPointerUp,
2679
+ onPointerUp = _ref3$onPointerUp === void 0 ? null : _ref3$onPointerUp;
2680
+ var onClickAction = React.useCallback(function (e) {
2681
+ if (onClickItem !== null) {
2682
+ onClickItem(value, index);
2683
+ }
2684
+ if (onPointerDown !== null) {
2685
+ e.persist();
2686
+ timeout.current = setTimeout(function () {
2687
+ if (onPointerDown !== null) {
2688
+ onPointerDown(e);
2689
+ }
2690
+ timeout.current = null;
2691
+ }, 200);
2692
+ }
2693
+ }, [value, index, onClickItem, onPointerDown]);
2694
+ var cancellingPointerUp = React.useCallback(function (e) {
2695
+ if (timeout.current !== null) {
2696
+ clearTimeout(timeout.current);
2697
+ }
2698
+ if (onPointerUp !== null) {
2699
+ onPointerUp(e);
2700
+ }
2701
+ }, [onPointerUp]);
2702
+ return /*#__PURE__*/React.createElement("div", {
2703
+ className: classNames([styles$7.container])
2704
+ }, /*#__PURE__*/React.createElement(SortableTreeItemActions$1, Object.assign({
2705
+ ref: setDraggableNodeRef,
2706
+ wrapperRef: setDroppableNodeRef,
2707
+ style: actionsStyle,
2708
+ depth: depth,
2709
+ ghost: isDragging,
2710
+ disableSelection: iOS,
2711
+ disableInteraction: isSorting,
2712
+ handleProps: _objectSpread(_objectSpread(_objectSpread({}, attributes), listeners), {}, {
2713
+ onPointerDown: onClickAction,
2714
+ onPointerUp: cancellingPointerUp
2715
+ }),
2716
+ collapsed: collapsed,
2717
+ onCollapse: onCollapse
2718
+ }, props), Component !== null ? /*#__PURE__*/React.createElement("div", {
2719
+ className: styles$7.parent
2720
+ }, /*#__PURE__*/React.createElement(Component, value)) : null, childValue !== null ? /*#__PURE__*/React.createElement("div", {
2721
+ className: styles$7.child
2722
+ }, /*#__PURE__*/React.createElement(Component, childValue)) : null));
2723
+ };
2724
+ SortableTreeItem.propTypes = propTypes$9;
2725
+ SortableTreeItem.defaultProps = defaultProps$9;
2726
+ var SortableTreeItem$1 = SortableTreeItem;
2727
+
2728
+ var styles$6 = {"item":"micromag-editor-sortable-sortable-tree-item","parent":"micromag-editor-sortable-sortable-tree-parent","group":"micromag-editor-sortable-sortable-tree-group","isLastChild":"micromag-editor-sortable-sortable-tree-isLastChild"};
2729
+
2730
+ var initialItems = [{
2731
+ id: 'Home',
2732
+ children: []
2733
+ }, {
2734
+ id: 'Collections',
2735
+ children: [{
2736
+ id: 'Spring',
2737
+ children: []
2738
+ }, {
2739
+ id: 'Summer',
2740
+ children: []
2741
+ }, {
2742
+ id: 'Fall',
2743
+ children: []
2744
+ }, {
2745
+ id: 'Winter',
2746
+ children: []
2747
+ }]
2748
+ }];
2749
+ var measuring = {
2750
+ droppable: {
2751
+ strategy: core$1.MeasuringStrategy.Always
2752
+ }
2753
+ };
2754
+ var dropAnimation = _objectSpread(_objectSpread({}, core$1.defaultDropAnimation), {}, {
2755
+ dragSourceOpacity: 0.5
2756
+ });
2757
+ var adjustTranslate = function adjustTranslate(_ref) {
2758
+ var transform = _ref.transform;
2759
+ return _objectSpread(_objectSpread({}, transform), {}, {
2760
+ y: transform.y - 25
2761
+ });
2762
+ };
2763
+ var propTypes$8 = {
2764
+ collapsible: PropTypes.bool,
2765
+ // eslint-disable-next-line react/forbid-prop-types
2766
+ items: PropTypes.array,
2767
+ indentationWidth: PropTypes.number,
2768
+ indicator: PropTypes.bool,
2769
+ removable: PropTypes.bool,
2770
+ component: PropTypes.func,
2771
+ onClickItem: PropTypes.func,
2772
+ onChange: PropTypes.func
2773
+ };
2774
+ var defaultProps$8 = {
2775
+ collapsible: true,
2776
+ items: initialItems,
2777
+ indentationWidth: 30,
2778
+ indicator: false,
2779
+ removable: false,
2780
+ component: null,
2781
+ onClickItem: null,
2782
+ onChange: null
2783
+ };
2784
+ var SortableTree = function SortableTree(_ref2) {
2785
+ var collapsible = _ref2.collapsible,
2786
+ defaultItems = _ref2.items,
2787
+ indicator = _ref2.indicator,
2788
+ indentationWidth = _ref2.indentationWidth,
2789
+ removable = _ref2.removable,
2790
+ component = _ref2.component,
2791
+ onClickItem = _ref2.onClickItem,
2792
+ onChange = _ref2.onChange;
2793
+ var _useState = React.useState(function () {
2794
+ return buildTree(defaultItems);
2795
+ }),
2796
+ _useState2 = _slicedToArray(_useState, 2),
2797
+ items = _useState2[0],
2798
+ setItems = _useState2[1];
2799
+ var _useState3 = React.useState(null),
2800
+ _useState4 = _slicedToArray(_useState3, 2),
2801
+ activeId = _useState4[0],
2802
+ setActiveId = _useState4[1];
2803
+ var _useState5 = React.useState(null),
2804
+ _useState6 = _slicedToArray(_useState5, 2),
2805
+ overId = _useState6[0],
2806
+ setOverId = _useState6[1];
2807
+ var _useState7 = React.useState(0),
2808
+ _useState8 = _slicedToArray(_useState7, 2),
2809
+ offsetLeft = _useState8[0],
2810
+ setOffsetLeft = _useState8[1];
2811
+ var _useState9 = React.useState(null),
2812
+ _useState10 = _slicedToArray(_useState9, 2),
2813
+ currentPosition = _useState10[0],
2814
+ setCurrentPosition = _useState10[1];
2815
+
2816
+ // Tree setup from list
2817
+ React.useEffect(function () {
2818
+ var flat = flattenTree(items);
2819
+ var merged = defaultItems.map(function (t1) {
2820
+ return _objectSpread(_objectSpread({}, flat.find(function (t2) {
2821
+ return t2.id === t1.id;
2822
+ })), t1);
2823
+ });
2824
+ setItems(buildTree(merged));
2825
+ }, [defaultItems.length]);
2826
+ var flattenedItems = React.useMemo(function () {
2827
+ var flattenedTree = flattenTree(items);
2828
+ var collapsedItems = flattenedTree.reduce(function (acc, _ref3) {
2829
+ var _ref3$children = _ref3.children,
2830
+ children = _ref3$children === void 0 ? [] : _ref3$children,
2831
+ collapsed = _ref3.collapsed,
2832
+ id = _ref3.id;
2833
+ return collapsed && children.length ? [].concat(_toConsumableArray(acc), [id]) : acc;
2834
+ }, []) || null;
2835
+ return removeChildrenOf(flattenedTree, activeId ? [activeId].concat(_toConsumableArray(collapsedItems)) : collapsedItems);
2836
+ }, [activeId, items, items.length]);
2837
+ var projected = activeId && overId ? getProjection(flattenedItems, activeId, overId, offsetLeft, indentationWidth) : null;
2838
+ var sensorContext = React.useRef({
2839
+ items: flattenedItems,
2840
+ offset: offsetLeft
2841
+ });
2842
+ var _useState11 = React.useState(function () {
2843
+ return sortableTreeKeyboardCoordinates(sensorContext, indentationWidth);
2844
+ }),
2845
+ _useState12 = _slicedToArray(_useState11, 1),
2846
+ coordinateGetter = _useState12[0];
2847
+ var sensors = core$1.useSensors(core$1.useSensor(core$1.PointerSensor), core$1.useSensor(core$1.KeyboardSensor, {
2848
+ coordinateGetter: coordinateGetter
2849
+ }));
2850
+ var sortedIds = React.useMemo(function () {
2851
+ return flattenedItems.map(function (_ref4) {
2852
+ var id = _ref4.id;
2853
+ return id;
2854
+ });
2855
+ }, [flattenedItems]);
2856
+ var activeItem = activeId ? flattenedItems.find(function (_ref5) {
2857
+ var id = _ref5.id;
2858
+ return id === activeId;
2859
+ }) : null;
2860
+ React.useEffect(function () {
2861
+ sensorContext.current = {
2862
+ items: flattenedItems,
2863
+ offset: offsetLeft
2864
+ };
2865
+ }, [flattenedItems, offsetLeft]);
2866
+ function getMovementAnnouncement(eventName, currentActiveId, currentOverId) {
2867
+ if (currentOverId && projected) {
2868
+ if (eventName !== 'onDragEnd') {
2869
+ if (currentPosition && projected.parentId === currentPosition.parentId && currentOverId === currentPosition.overId) {
2870
+ return;
2871
+ }
2872
+ setCurrentPosition({
2873
+ parentId: projected.parentId,
2874
+ overId: currentOverId
2875
+ });
2876
+ }
2877
+ var clonedItems = JSON.parse(JSON.stringify(flattenTree(items)));
2878
+ var overIndex = clonedItems.findIndex(function (_ref6) {
2879
+ var id = _ref6.id;
2880
+ return id === currentOverId;
2881
+ });
2882
+ var activeIndex = clonedItems.findIndex(function (_ref7) {
2883
+ var id = _ref7.id;
2884
+ return id === currentActiveId;
2885
+ });
2886
+ var sortedItems = sortable.arrayMove(clonedItems, activeIndex, overIndex);
2887
+ var previousItem = sortedItems[overIndex - 1];
2888
+ var newAnnouncement;
2889
+ var movedVerb = eventName === 'onDragEnd' ? 'dropped' : 'moved';
2890
+ var nestedVerb = eventName === 'onDragEnd' ? 'dropped' : 'nested';
2891
+ if (!previousItem) {
2892
+ var nextItem = typeof sortedItems[overIndex + 1] !== 'undefined' ? sortedItems[overIndex + 1] : null;
2893
+ if (nextItem !== null) {
2894
+ newAnnouncement = "".concat(currentActiveId, " was ").concat(movedVerb, " before ").concat(nextItem.id, ".");
2895
+ }
2896
+ } else if (projected.depth > previousItem.depth) {
2897
+ newAnnouncement = "".concat(currentActiveId, " was ").concat(nestedVerb, " under ").concat(previousItem.id, ".");
2898
+ } else {
2899
+ var previousSibling = previousItem;
2900
+ var _loop = function _loop() {
2901
+ var _previousSibling = previousSibling,
2902
+ parentId = _previousSibling.parentId;
2903
+ previousSibling = sortedItems.find(function (_ref8) {
2904
+ var id = _ref8.id;
2905
+ return id === parentId;
2906
+ });
2907
+ };
2908
+ while (previousSibling && projected.depth < previousSibling.depth) {
2909
+ _loop();
2910
+ }
2911
+ if (previousSibling) {
2912
+ newAnnouncement = "".concat(currentActiveId, " was ").concat(movedVerb, " after ").concat(previousSibling.id, ".");
2913
+ }
2914
+ }
2915
+
2916
+ // eslint-disable-next-line consistent-return
2917
+ return newAnnouncement;
2918
+ }
2919
+ }
2920
+ var announcements = React.useMemo(function () {
2921
+ return {
2922
+ onDragStart: function onDragStart(id) {
2923
+ return "Picked up ".concat(id, ".");
2924
+ },
2925
+ onDragMove: function onDragMove(id, currentOverId) {
2926
+ return getMovementAnnouncement('onDragMove', id, currentOverId);
2927
+ },
2928
+ onDragOver: function onDragOver(id, currentOverId) {
2929
+ return getMovementAnnouncement('onDragOver', id, currentOverId);
2930
+ },
2931
+ onDragEnd: function onDragEnd(id, currentOverId) {
2932
+ return getMovementAnnouncement('onDragEnd', id, currentOverId);
2933
+ },
2934
+ onDragCancel: function onDragCancel(id) {
2935
+ return "Moving was cancelled. ".concat(id, " was dropped in its original position.");
2936
+ }
2937
+ };
2938
+ }, [getMovementAnnouncement]);
2939
+ var activeValue = defaultItems.find(function (_ref9) {
2940
+ var _ref9$id = _ref9.id,
2941
+ defaultId = _ref9$id === void 0 ? null : _ref9$id;
2942
+ return defaultId === activeId;
2943
+ });
2944
+ var handleDragStart = React.useCallback(function (_ref10) {
2945
+ var newActiveId = _ref10.active.id;
2946
+ setActiveId(newActiveId);
2947
+ setOverId(newActiveId);
2948
+ var newActiveItem = flattenedItems.find(function (_ref11) {
2949
+ var id = _ref11.id;
2950
+ return id === newActiveId;
2951
+ });
2952
+ if (newActiveItem) {
2953
+ setCurrentPosition({
2954
+ parentId: newActiveItem.parentId,
2955
+ overId: activeId
2956
+ });
2957
+ }
2958
+ document.body.style.setProperty('cursor', 'grabbing');
2959
+ }, [flattenedItems, setActiveId, setOverId, setCurrentPosition]);
2960
+ var handleDragMove = React.useCallback(function (_ref12) {
2961
+ var delta = _ref12.delta;
2962
+ setOffsetLeft(delta.x);
2963
+ }, [setOffsetLeft]);
2964
+ var handleDragOver = React.useCallback(function (_ref13) {
2965
+ var _over$id;
2966
+ var over = _ref13.over;
2967
+ setOverId((_over$id = over === null || over === void 0 ? void 0 : over.id) !== null && _over$id !== void 0 ? _over$id : null);
2968
+ }, [setOverId]);
2969
+ var resetState = React.useCallback(function () {
2970
+ setOverId(null);
2971
+ setActiveId(null);
2972
+ setOffsetLeft(0);
2973
+ setCurrentPosition(null);
2974
+ document.body.style.setProperty('cursor', '');
2975
+ }, [setOverId, setActiveId, setOffsetLeft, setCurrentPosition]);
2976
+ var handleDragEnd = React.useCallback(function (_ref14) {
2977
+ var active = _ref14.active,
2978
+ over = _ref14.over;
2979
+ resetState();
2980
+ if (projected && over) {
2981
+ var depth = projected.depth,
2982
+ parentId = projected.parentId;
2983
+ var clonedItems = JSON.parse(JSON.stringify(flattenTree(items)));
2984
+ var overIndex = clonedItems.findIndex(function (_ref15) {
2985
+ var id = _ref15.id;
2986
+ return id === over.id;
2987
+ });
2988
+ var activeIndex = clonedItems.findIndex(function (_ref16) {
2989
+ var id = _ref16.id;
2990
+ return id === active.id;
2991
+ });
2992
+ var activeTreeItem = clonedItems[activeIndex];
2993
+ var maxDepth = getMaxDepth(activeTreeItem);
2994
+ // Un-merge and flatten
2995
+ if (depth > 0 && depth >= maxDepth && (activeTreeItem === null || activeTreeItem === void 0 ? void 0 : activeTreeItem.children) !== null && activeTreeItem.children.length > 0) {
2996
+ var _loop2 = function _loop2() {
2997
+ var childId = activeTreeItem.children[i].id;
2998
+ var childIndex = clonedItems.findIndex(function (_ref17) {
2999
+ var id = _ref17.id;
3000
+ return id === childId;
3001
+ });
3002
+ clonedItems[childIndex].parentId = parentId;
3003
+ clonedItems[childIndex].depth = depth;
3004
+ };
3005
+ for (var i = 0; i < activeTreeItem.children.length; i += 1) {
3006
+ _loop2();
3007
+ }
3008
+ activeTreeItem.children = [];
3009
+ }
3010
+ clonedItems[activeIndex] = _objectSpread(_objectSpread({}, activeTreeItem), {}, {
3011
+ depth: depth,
3012
+ parentId: parentId
3013
+ });
3014
+ var sortedItems = sortable.arrayMove(clonedItems, activeIndex, overIndex);
3015
+ var newItems = buildTree(sortedItems);
3016
+ setItems(newItems);
3017
+ if (onChange !== null) {
3018
+ // console.log('hell is flat', sortedItems);
3019
+ // console.log('hell is tree', newItems);
3020
+ onChange((sortedItems || []).map(function (_ref18) {
3021
+ var itemId = _ref18.id,
3022
+ _ref18$children = _ref18.children,
3023
+ children = _ref18$children === void 0 ? [] : _ref18$children,
3024
+ _ref18$parentId = _ref18.parentId,
3025
+ itParentId = _ref18$parentId === void 0 ? null : _ref18$parentId,
3026
+ _ref18$collapsed = _ref18.collapsed,
3027
+ collapsed = _ref18$collapsed === void 0 ? false : _ref18$collapsed;
3028
+ return {
3029
+ id: itemId,
3030
+ props: _objectSpread(_objectSpread({}, (children || []).length > 0 ? {
3031
+ group: {
3032
+ collapsed: collapsed,
3033
+ mergeNavItems: true
3034
+ }
3035
+ } : {
3036
+ group: null
3037
+ }), itParentId !== null ? {
3038
+ parentId: itParentId
3039
+ } : {
3040
+ parentId: null
3041
+ })
3042
+ };
3043
+ }));
3044
+ }
3045
+ }
3046
+ }, [projected, items, resetState, sortable.arrayMove, buildTree, setItems]);
3047
+ var handleDragCancel = React.useCallback(function () {
3048
+ resetState();
3049
+ }, [resetState]);
3050
+ var handleRemove = React.useCallback(function (id) {
3051
+ setItems(function (newItems) {
3052
+ return removeItem(newItems, id);
3053
+ });
3054
+ }, [setItems, removeItem]);
3055
+ var handleCollapse = React.useCallback(function (id) {
3056
+ setItems(function (newItems) {
3057
+ return setProperty(newItems, id, 'collapsed', function (value) {
3058
+ return !value;
3059
+ });
3060
+ });
3061
+ }, [setItems, setProperty]);
3062
+ return /*#__PURE__*/React.createElement(core$1.DndContext, {
3063
+ accessibility: {
3064
+ announcements: announcements
3065
+ }
3066
+ // announcements={announcements}
3067
+ ,
3068
+ sensors: sensors,
3069
+ collisionDetection: core$1.closestCenter,
3070
+ measuring: measuring,
3071
+ onDragStart: handleDragStart,
3072
+ onDragMove: handleDragMove,
3073
+ onDragOver: handleDragOver,
3074
+ onDragEnd: handleDragEnd,
3075
+ onDragCancel: handleDragCancel
3076
+ }, /*#__PURE__*/React.createElement(sortable.SortableContext, {
3077
+ items: sortedIds,
3078
+ strategy: sortable.verticalListSortingStrategy
3079
+ }, flattenedItems.map(function (_ref19, idx) {
3080
+ var _flattenedItems;
3081
+ var id = _ref19.id,
3082
+ _ref19$children = _ref19.children,
3083
+ children = _ref19$children === void 0 ? [] : _ref19$children,
3084
+ collapsed = _ref19.collapsed,
3085
+ depth = _ref19.depth;
3086
+ var screenValue = defaultItems.find(function (_ref20) {
3087
+ var _ref20$id = _ref20.id,
3088
+ defaultId = _ref20$id === void 0 ? null : _ref20$id;
3089
+ return defaultId === id;
3090
+ });
3091
+ var next = ((_flattenedItems = flattenedItems[idx + 1]) === null || _flattenedItems === void 0 ? void 0 : _flattenedItems.parentId) || null;
3092
+ var isCollapsed = collapsed && children.length > 0;
3093
+ var onCollapse = collapsible && children.length ? function () {
3094
+ return handleCollapse(id);
3095
+ } : null;
3096
+ var currentDepth = id === activeId && projected ? projected.depth : depth;
3097
+ var childCount = getChildCount(items, id);
3098
+ var childValue = childCount > 0 && collapsed ? defaultItems.slice().reverse().find(function (_ref21) {
3099
+ var _ref21$parentId = _ref21.parentId,
3100
+ parentId = _ref21$parentId === void 0 ? null : _ref21$parentId;
3101
+ return parentId === id;
3102
+ }) : null;
3103
+ return /*#__PURE__*/React.createElement("div", {
3104
+ className: classNames([styles$6.item, _defineProperty(_defineProperty(_defineProperty({}, styles$6.parent, onCollapse !== null && !collapsed), styles$6.group, depth === 1), styles$6.isLastChild, next === null)]),
3105
+ key: id
3106
+ }, /*#__PURE__*/React.createElement(SortableTreeItem$1, {
3107
+ key: id,
3108
+ id: id,
3109
+ depth: currentDepth,
3110
+ indentationWidth: indentationWidth,
3111
+ indicator: indicator,
3112
+ collapsed: isCollapsed,
3113
+ onCollapse: onCollapse,
3114
+ onRemove: removable ? function () {
3115
+ return handleRemove(id);
3116
+ } : undefined,
3117
+ childCount: childCount,
3118
+ component: component,
3119
+ value: (screenValue === null || screenValue === void 0 ? void 0 : screenValue.value) || null,
3120
+ onClickItem: onClickItem,
3121
+ index: idx,
3122
+ childValue: (childValue === null || childValue === void 0 ? void 0 : childValue.value) || null
3123
+ }));
3124
+ }), /*#__PURE__*/reactDom.createPortal( /*#__PURE__*/React.createElement(core$1.DragOverlay, {
3125
+ dropAnimation: dropAnimation,
3126
+ modifiers: indicator ? [adjustTranslate] : undefined
3127
+ }, activeId && activeItem ? /*#__PURE__*/React.createElement("div", {
3128
+ className: styles$6.item,
3129
+ key: activeId
3130
+ }, /*#__PURE__*/React.createElement(SortableTreeItem$1, {
3131
+ id: activeId,
3132
+ depth: activeItem.depth,
3133
+ clone: true,
3134
+ childCount: getChildCount(items, activeId) + 1,
3135
+ indentationWidth: indentationWidth,
3136
+ component: component,
3137
+ value: activeValue === null || activeValue === void 0 ? void 0 : activeValue.value,
3138
+ onClickItem: onClickItem,
3139
+ index: flattenedItems.findIndex(function (_ref23) {
3140
+ var id = _ref23.id;
3141
+ return activeId === id;
3142
+ })
3143
+ })) : null), document.body)));
3144
+ };
3145
+ SortableTree.propTypes = propTypes$8;
3146
+ SortableTree.defaultProps = defaultProps$8;
3147
+ var SortableTree$1 = SortableTree;
3148
+
3149
+ var styles$5 = {"container":"micromag-editor-menus-screens-container","screen":"micromag-editor-menus-screens-screen","preview":"micromag-editor-menus-screens-preview","placeholder":"micromag-editor-menus-screens-placeholder","items":"micromag-editor-menus-screens-items","item":"micromag-editor-menus-screens-item","button":"micromag-editor-menus-screens-button","settings":"micromag-editor-menus-screens-settings","noWrap":"micromag-editor-menus-screens-noWrap","isVertical":"micromag-editor-menus-screens-isVertical","withPlaceholder":"micromag-editor-menus-screens-withPlaceholder"};
3150
+
3151
+ var _excluded$2 = ["className", "screen", "type", "title", "onClick", "active", "href"],
3152
+ _excluded2 = ["id", "screen", "href"];
3153
+ var propTypes$7 = {
3154
+ items: core.PropTypes.menuItems,
3155
+ withPreview: PropTypes.bool,
3156
+ withPlaceholder: PropTypes.bool,
3157
+ withName: PropTypes.bool,
3158
+ settings: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
3159
+ sortable: PropTypes.bool,
3160
+ isTree: PropTypes.bool,
3161
+ isVertical: PropTypes.bool,
3162
+ noWrap: PropTypes.bool,
3163
+ className: PropTypes.string,
3164
+ itemClassName: PropTypes.string,
3165
+ buttonClassName: PropTypes.string,
3166
+ settingsClassName: PropTypes.string,
3167
+ onClickItem: PropTypes.func,
3168
+ onOrderChange: PropTypes.func
3169
+ };
3170
+ var defaultProps$7 = {
3171
+ items: [],
3172
+ withPreview: false,
3173
+ withPlaceholder: false,
3174
+ withName: false,
3175
+ settings: null,
3176
+ sortable: false,
3177
+ isTree: false,
3178
+ isVertical: false,
3179
+ noWrap: false,
3180
+ className: null,
3181
+ itemClassName: null,
3182
+ buttonClassName: null,
3183
+ settingsClassName: null,
3184
+ onClickItem: null,
3185
+ onOrderChange: null
3186
+ };
3187
+ var ScreensMenu = function ScreensMenu(_ref) {
3188
+ var items = _ref.items,
3189
+ withPreview = _ref.withPreview,
3190
+ withPlaceholder = _ref.withPlaceholder,
3191
+ withName = _ref.withName,
3192
+ settings = _ref.settings,
3193
+ isVertical = _ref.isVertical,
3194
+ noWrap = _ref.noWrap,
3195
+ className = _ref.className,
3196
+ itemClassName = _ref.itemClassName,
3197
+ buttonClassName = _ref.buttonClassName,
3198
+ settingsClassName = _ref.settingsClassName,
3199
+ sortable = _ref.sortable,
3200
+ isTree = _ref.isTree,
3201
+ onClickItem = _ref.onClickItem,
3202
+ onOrderChange = _ref.onOrderChange;
3203
+ var itemsElements = !isTree ? items.map(function (_ref2, index) {
3204
+ var _ref2$className = _ref2.className,
3205
+ itemCustomClassName = _ref2$className === void 0 ? null : _ref2$className,
3206
+ screen = _ref2.screen,
3207
+ type = _ref2.type,
3208
+ title = _ref2.title,
3209
+ _ref2$onClick = _ref2.onClick,
3210
+ onClick = _ref2$onClick === void 0 ? null : _ref2$onClick,
3211
+ active = _ref2.active,
3212
+ href = _ref2.href,
3213
+ item = _objectWithoutProperties(_ref2, _excluded$2);
3214
+ return /*#__PURE__*/React.createElement("li", {
3215
+ key: item.id,
3216
+ className: classNames([styles$5.item, _defineProperty(_defineProperty({}, itemClassName, itemClassName !== null), itemCustomClassName, itemCustomClassName !== null)]),
3217
+ "data-screen-id": item.id
3218
+ }, /*#__PURE__*/React.createElement(ScreenWithPreview$1, {
3219
+ index: index,
3220
+ screen: withPlaceholder ? _objectSpread(_objectSpread({}, screen), {}, {
3221
+ type: type
3222
+ }) : screen,
3223
+ href: href,
3224
+ className: buttonClassName,
3225
+ title: title,
3226
+ active: active,
3227
+ withPreview: withPreview,
3228
+ withPlaceholder: withPlaceholder,
3229
+ withName: withName,
3230
+ onClick: onClick,
3231
+ onClickItem: onClickItem
3232
+ }), settings !== null ? /*#__PURE__*/React.createElement("div", {
3233
+ className: classNames([_defineProperty({}, settingsClassName, settingsClassName !== null), styles$5.settings, 'p-2'])
3234
+ }, isFunction(settings) ? settings(index) : settings) : null);
3235
+ }) : [];
3236
+ var sortableItems = React.useMemo(function () {
3237
+ return isTree ? items.map(function (_ref5) {
3238
+ var id = _ref5.id,
3239
+ _ref5$screen = _ref5.screen,
3240
+ screen = _ref5$screen === void 0 ? {} : _ref5$screen,
3241
+ href = _ref5.href,
3242
+ props = _objectWithoutProperties(_ref5, _excluded2);
3243
+ var _screen$parentId = screen.parentId,
3244
+ parentId = _screen$parentId === void 0 ? null : _screen$parentId,
3245
+ _screen$group = screen.group,
3246
+ group = _screen$group === void 0 ? {} : _screen$group;
3247
+ var _ref6 = group || {},
3248
+ _ref6$collapsed = _ref6.collapsed,
3249
+ collapsed = _ref6$collapsed === void 0 ? true : _ref6$collapsed;
3250
+ return {
3251
+ id: id,
3252
+ parentId: parentId,
3253
+ collapsed: collapsed,
3254
+ value: _objectSpread({
3255
+ id: id,
3256
+ screen: screen,
3257
+ href: href
3258
+ }, props)
3259
+ };
3260
+ }, []) : items.map(function (_ref7) {
3261
+ var id = _ref7.id;
3262
+ return {
3263
+ id: id
3264
+ };
3265
+ });
3266
+ }, [items, isTree, items.length]);
3267
+ return /*#__PURE__*/React.createElement("div", {
3268
+ className: classNames([styles$5.container, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, styles$5.noWrap, noWrap), styles$5.isVertical, isVertical), styles$5.isTree, isTree), styles$5.withPlaceholder, withPlaceholder), className, className)])
3269
+ }, isTree && !sortable ? /*#__PURE__*/React.createElement(SortableTree$1, {
3270
+ items: sortableItems,
3271
+ component: ScreenWithPreview$1,
3272
+ onClickItem: onClickItem,
3273
+ onChange: onOrderChange
3274
+ }) : null, !isTree && sortable && items.length > 1 ? /*#__PURE__*/React.createElement(reactSortablejs.ReactSortable, {
3275
+ list: sortableItems,
3276
+ setList: onOrderChange,
3277
+ animation: 200,
3278
+ delayOnTouchStart: true,
3279
+ delay: 2,
3280
+ tag: "ul",
3281
+ className: styles$5.items
3282
+ }, itemsElements) : null, !isTree && (!sortable || items.length < 1) ? /*#__PURE__*/React.createElement("ul", {
3283
+ className: styles$5.items
3284
+ }, itemsElements) : null);
3285
+ };
3286
+ ScreensMenu.propTypes = propTypes$7;
3287
+ ScreensMenu.defaultProps = defaultProps$7;
3288
+ var ScreensMenu$1 = ScreensMenu;
3289
+
3290
+ var styles$4 = {"container":"micromag-editor-menus-screen-types-container","row":"micromag-editor-menus-screen-types-row","title":"micromag-editor-menus-screen-types-title","screen":"micromag-editor-menus-screen-types-screen","button":"micromag-editor-menus-screen-types-button"};
3291
+
3292
+ var propTypes$6 = {
3293
+ screens: core.PropTypes.screenDefinitions,
3294
+ selectedTypes: PropTypes.arrayOf(PropTypes.string),
3295
+ className: PropTypes.string,
3296
+ onClickItem: PropTypes.func
3297
+ };
3298
+ var defaultProps$6 = {
3299
+ screens: null,
3300
+ selectedTypes: null,
3301
+ className: null,
3302
+ onClickItem: null
3303
+ };
3304
+ var ScreenTypes = function ScreenTypes(_ref) {
3305
+ var screens = _ref.screens,
3306
+ selectedTypes = _ref.selectedTypes,
3307
+ className = _ref.className,
3308
+ onClickItem = _ref.onClickItem;
3309
+ var intl = reactIntl.useIntl();
3310
+ var screensManager = contexts.useScreensManager();
3311
+ var screenDefinitions = screens || screensManager.getDefinitions();
3312
+ var finalDefinitions = (screenDefinitions || []).filter(function (s) {
3313
+ return s !== null;
3314
+ });
3315
+ var groups = React.useMemo(function () {
3316
+ var groupItems = finalDefinitions.reduce(function (allGroups, definition) {
3317
+ var id = definition.id,
3318
+ title = definition.title,
3319
+ _definition$group = definition.group,
3320
+ group = _definition$group === void 0 ? {} : _definition$group;
3321
+ var _ref2 = group || {},
3322
+ _ref2$order = _ref2.order,
3323
+ order = _ref2$order === void 0 ? 0 : _ref2$order,
3324
+ _ref2$label = _ref2.label,
3325
+ label = _ref2$label === void 0 ? {} : _ref2$label,
3326
+ _ref2$hidden = _ref2.hidden,
3327
+ hidden = _ref2$hidden === void 0 ? false : _ref2$hidden;
3328
+ var _ref3 = label || {},
3329
+ _ref3$id = _ref3.id,
3330
+ messageId = _ref3$id === void 0 ? null : _ref3$id;
3331
+ if (hidden) {
3332
+ return allGroups;
3333
+ }
3334
+ var _ref4 = utils.isMessage(label) ? {
3335
+ id: messageId || id,
3336
+ name: group
3337
+ } : {
3338
+ id: messageId || id,
3339
+ name: title
3340
+ },
3341
+ groupId = _ref4.id,
3342
+ groupName = _ref4.name;
3343
+ var groupIndex = allGroups.findIndex(function (it) {
3344
+ return it.id === groupId;
3345
+ });
3346
+ var selected = selectedTypes !== null && selectedTypes.indexOf(id) !== -1;
3347
+ var item = {
3348
+ id: id,
3349
+ type: id,
3350
+ screen: definition,
3351
+ title: title,
3352
+ className: classNames(_defineProperty({
3353
+ 'bg-secondary': !selected,
3354
+ 'bg-primary': selected
3355
+ }, styles$4.selected, selected))
3356
+ };
3357
+ return groupIndex !== -1 ? [].concat(_toConsumableArray(allGroups.slice(0, groupIndex)), [_objectSpread(_objectSpread({}, allGroups[groupIndex]), {}, {
3358
+ items: [].concat(_toConsumableArray(allGroups[groupIndex].items), [item])
3359
+ })], _toConsumableArray(allGroups.slice(groupIndex + 1))) : [].concat(_toConsumableArray(allGroups), [{
3360
+ id: groupId,
3361
+ name: utils.isMessage(label) ? intl.formatMessage(label) : groupName,
3362
+ order: order,
3363
+ items: [item]
3364
+ }]);
3365
+ }, []);
3366
+ return orderBy(groupItems, ['order', 'name'], ['asc', 'asc']);
3367
+ }, [finalDefinitions, selectedTypes]);
3368
+ return /*#__PURE__*/React.createElement("div", {
3369
+ className: classNames([styles$4.container, _defineProperty({}, className, className)])
3370
+ }, /*#__PURE__*/React.createElement("div", {
3371
+ className: styles$4.rows
3372
+ }, groups.map(function (_ref6) {
3373
+ var id = _ref6.id,
3374
+ name = _ref6.name,
3375
+ items = _ref6.items;
3376
+ return /*#__PURE__*/React.createElement("div", {
3377
+ key: "group-".concat(id),
3378
+ className: styles$4.row
3379
+ }, /*#__PURE__*/React.createElement(components.Label, null, name), /*#__PURE__*/React.createElement("div", {
3380
+ className: styles$4.layouts
3381
+ }, /*#__PURE__*/React.createElement(ScreensMenu$1, {
3382
+ items: items,
3383
+ withPlaceholder: true,
3384
+ withName: true,
3385
+ itemClassName: classNames([styles$4.screen, 'border', 'rounded', {
3386
+ 'border-secondary': selectedTypes === null,
3387
+ 'border-dark': selectedTypes !== null,
3388
+ 'bg-secondary': selectedTypes === null,
3389
+ 'text-secondary': selectedTypes !== null
3390
+ }]),
3391
+ buttonClassName: styles$4.button,
3392
+ onClickItem: onClickItem
3393
+ })));
3394
+ })));
3395
+ };
3396
+ ScreenTypes.propTypes = propTypes$6;
3397
+ ScreenTypes.defaultProps = defaultProps$6;
3398
+ var ScreenTypesMenu = ScreenTypes;
3399
+
3400
+ var styles$3 = {"container":"micromag-editor-modals-screen-types-container","selected":"micromag-editor-modals-screen-types-selected"};
3401
+
3402
+ var propTypes$5 = {
3403
+ selectedTypes: PropTypes.arrayOf(PropTypes.string),
3404
+ className: PropTypes.string,
3405
+ onRequestClose: PropTypes.func,
3406
+ onClickScreenType: PropTypes.func
3407
+ };
3408
+ var defaultProps$5 = {
3409
+ selectedTypes: null,
3410
+ className: null,
3411
+ onRequestClose: null,
3412
+ onClickScreenType: null
3413
+ };
3414
+ var ScreenTypesModal = function ScreenTypesModal(_ref) {
3415
+ var selectedTypes = _ref.selectedTypes,
3416
+ className = _ref.className,
3417
+ onRequestClose = _ref.onRequestClose,
3418
+ onClickScreenType = _ref.onClickScreenType;
3419
+ return /*#__PURE__*/React.createElement(components.Modal, null, /*#__PURE__*/React.createElement(components.ModalDialog, {
3420
+ title: /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
3421
+ id: "QBaiO0",
3422
+ defaultMessage: [{
3423
+ "type": 0,
3424
+ "value": "Add a screen"
3425
+ }]
3426
+ }),
3427
+ className: classNames([styles$3.container, _defineProperty({}, className, className)]),
3428
+ onClose: onRequestClose
3429
+ }, /*#__PURE__*/React.createElement(ScreenTypesMenu, {
3430
+ selectedTypes: selectedTypes,
3431
+ className: styles$3.menu,
3432
+ onClickItem: onClickScreenType
3433
+ })));
3434
+ };
3435
+ ScreenTypesModal.propTypes = propTypes$5;
3436
+ ScreenTypesModal.defaultProps = defaultProps$5;
3437
+ var ScreenTypesModal$1 = ScreenTypesModal;
3438
+
3439
+ var styles$2 = {"container":"micromag-editor-screens-container","navbar":"micromag-editor-screens-navbar"};
3440
+
3441
+ var _excluded$1 = ["id"];
3442
+ var propTypes$4 = {
3443
+ value: PropTypes.oneOfType([core.PropTypes.story, core.PropTypes.theme]),
3444
+ isTheme: PropTypes.bool,
3445
+ isVertical: PropTypes.bool,
3446
+ isCreateOpened: PropTypes.bool,
3447
+ isParsed: PropTypes.bool,
3448
+ isTree: PropTypes.bool,
3449
+ onClickScreen: PropTypes.func,
3450
+ onChange: PropTypes.func,
3451
+ className: PropTypes.string
3452
+ };
3453
+ var defaultProps$4 = {
3454
+ value: null,
3455
+ isTheme: false,
3456
+ isVertical: false,
3457
+ isCreateOpened: false,
3458
+ isParsed: false,
3459
+ isTree: false,
3460
+ onClickScreen: null,
3461
+ onChange: null,
3462
+ className: null
3463
+ };
3464
+ var EditorScreens = function EditorScreens(_ref) {
3465
+ var unparsedValue = _ref.value,
3466
+ isTheme = _ref.isTheme,
3467
+ isVertical = _ref.isVertical,
3468
+ isCreateOpened = _ref.isCreateOpened,
3469
+ isParsed = _ref.isParsed,
3470
+ isTree = _ref.isTree,
3471
+ onClickScreen = _ref.onClickScreen,
3472
+ onChange = _ref.onChange,
3473
+ className = _ref.className;
3474
+ var valueWithTheme = useThemeValue(unparsedValue, isTheme);
3475
+ var value = isParsed ? unparsedValue : hooks.useParsedStory(valueWithTheme, {
3476
+ withMedias: false
3477
+ });
3478
+ var _ref2 = value || {},
3479
+ _ref2$components = _ref2.components,
3480
+ screens = _ref2$components === void 0 ? [] : _ref2$components;
3481
+ var _useState = React.useState(isCreateOpened),
3482
+ _useState2 = _slicedToArray(_useState, 2),
3483
+ createModalOpened = _useState2[0],
3484
+ setCreateModalOpened = _useState2[1];
3485
+ var routes = contexts.useRoutes();
3486
+ var push = contexts.useRoutePush();
3487
+ var url = contexts.useUrlGenerator();
3488
+ var _useRouteParams = useRouteParams({
3489
+ screenOnly: true
3490
+ }),
3491
+ _useRouteParams$scree = _useRouteParams.screen,
3492
+ currentScreenId = _useRouteParams$scree === void 0 ? null : _useRouteParams$scree;
3493
+ var createScreenFromDefinition = React.useCallback(function (definition) {
3494
+ var _ref3 = value || {},
3495
+ _ref3$components = _ref3.components,
3496
+ currentScreens = _ref3$components === void 0 ? [] : _ref3$components,
3497
+ _ref3$theme = _ref3.theme,
3498
+ theme = _ref3$theme === void 0 ? {} : _ref3$theme;
3499
+ var _ref4 = isString(definition) ? {
3500
+ id: definition
3501
+ } : definition,
3502
+ newScreenType = _ref4.id;
3503
+ var _ref5 = theme || {},
3504
+ _ref5$components = _ref5.components,
3505
+ themeComponents = _ref5$components === void 0 ? null : _ref5$components;
3506
+ var themeScreen = themeComponents !== null ? themeComponents.find(function (it) {
3507
+ return it.type === newScreenType;
3508
+ }) || null : null;
3509
+ var newScreen = createScreen$1(definition, themeScreen);
3510
+ var foundIndex = screens.findIndex(function (_ref6) {
3511
+ var id = _ref6.id;
3512
+ return id === currentScreenId;
3513
+ });
3514
+ var currentScreenIndex = !isTheme && foundIndex >= 0 ? foundIndex + 1 : null;
3515
+ var newValue = _objectSpread(_objectSpread({}, value), {}, {
3516
+ components: [].concat(_toConsumableArray(currentScreens.slice(0, currentScreenIndex)), [newScreen], _toConsumableArray(currentScreens.slice(currentScreenIndex)))
3517
+ });
3518
+ if (onChange !== null) {
3519
+ onChange(newValue);
3520
+ }
3521
+ return newScreen;
3522
+ }, [value, onChange, isTheme, screens, currentScreenId, setCreateModalOpened]);
3523
+ var onOrderChange = React.useCallback(function (listItems) {
3524
+ var ids = listItems.map(function (_ref7) {
3525
+ var id = _ref7.id;
3526
+ return id;
3527
+ });
3528
+ var screenProps = listItems.map(function (_ref8) {
3529
+ var id = _ref8.id,
3530
+ _ref8$props = _ref8.props,
3531
+ props = _ref8$props === void 0 ? null : _ref8$props;
3532
+ return {
3533
+ id: id,
3534
+ props: props
3535
+ };
3536
+ });
3537
+ var hasScreenProps = (screenProps.filter(function (_ref9) {
3538
+ var props = _ref9.props;
3539
+ return props !== null;
3540
+ }) || []).length > 0;
3541
+ var _ref10 = value || {},
3542
+ _ref10$components = _ref10.components,
3543
+ currentScreens = _ref10$components === void 0 ? [] : _ref10$components;
3544
+ var currentIds = currentScreens.map(function (_ref11) {
3545
+ var id = _ref11.id;
3546
+ return id;
3547
+ });
3548
+ var sameOrder = listItems.reduce(function (same, _ref12, index) {
3549
+ var id = _ref12.id;
3550
+ return same && id === currentIds[index];
3551
+ }, true);
3552
+ if (!sameOrder || hasScreenProps) {
3553
+ var newValue = _objectSpread(_objectSpread({}, value), {}, {
3554
+ components: _toConsumableArray(currentScreens).sort(function (_ref13, _ref14) {
3555
+ var idA = _ref13.id;
3556
+ var idB = _ref14.id;
3557
+ var indexA = ids.indexOf(idA);
3558
+ var indexB = ids.indexOf(idB);
3559
+ if (indexA === indexB) {
3560
+ return 0;
3561
+ }
3562
+ return indexA > indexB ? 1 : -1;
3563
+ }).map(function (_ref15) {
3564
+ var _screenProps$find;
3565
+ var id = _ref15.id,
3566
+ props = _objectWithoutProperties(_ref15, _excluded$1);
3567
+ return _objectSpread(_objectSpread({
3568
+ id: id
3569
+ }, props), (_screenProps$find = screenProps.find(function (_ref16) {
3570
+ var propsId = _ref16.id;
3571
+ return propsId === id;
3572
+ })) === null || _screenProps$find === void 0 ? void 0 : _screenProps$find.props);
3573
+ })
3574
+ });
3575
+ if (onChange !== null) {
3576
+ // console.log('og!', listItems, newValue);
3577
+ onChange(newValue);
3578
+ }
3579
+ }
3580
+ }, [value, onChange]);
3581
+ var onClickScreenType = React.useCallback(function (definition) {
3582
+ setCreateModalOpened(false);
3583
+ var currentScreen = isTheme ? screens.find(function (_ref17) {
3584
+ var type = _ref17.type;
3585
+ return type === definition.id;
3586
+ }) || null : null;
3587
+ if (!isTheme || currentScreen === null) {
3588
+ currentScreen = createScreenFromDefinition(definition);
3589
+ }
3590
+ push('screen', {
3591
+ screen: currentScreen.id
3592
+ });
3593
+ onClickScreen(currentScreen);
3594
+ }, [screens, isTheme, createScreenFromDefinition, push, onClickScreen]);
3595
+ var onClickAdd = React.useCallback(function () {
3596
+ return setCreateModalOpened(true);
3597
+ }, [setCreateModalOpened]);
3598
+ var onCreateModalRequestClose = React.useCallback(function () {
3599
+ return setCreateModalOpened(false);
3600
+ }, [setCreateModalOpened]);
3601
+ return /*#__PURE__*/React.createElement("div", {
3602
+ className: classNames(['d-flex', 'flex-column', styles$2.container, className])
3603
+ }, /*#__PURE__*/React.createElement(components.Navbar, {
3604
+ compact: true,
3605
+ noWrap: true,
3606
+ withoutCollapse: true,
3607
+ className: classNames(['sticky-top', styles$2.navbar])
3608
+ }, /*#__PURE__*/React.createElement("strong", {
3609
+ className: "mb-0 me-auto"
3610
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
3611
+ id: "jf+4Hq",
3612
+ defaultMessage: [{
3613
+ "type": 0,
3614
+ "value": "Screens"
3615
+ }]
3616
+ })), /*#__PURE__*/React.createElement(components.Button, {
3617
+ theme: "primary",
3618
+ size: "sm",
3619
+ onClick: onClickAdd,
3620
+ icon: /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
3621
+ icon: faPlus.faPlus
3622
+ })
3623
+ })), /*#__PURE__*/React.createElement("div", {
3624
+ className: "flex-grow-1 d-flex w-100 p-2"
3625
+ }, /*#__PURE__*/React.createElement(Switch, null, /*#__PURE__*/React.createElement(Route, {
3626
+ path: "".concat(routes.screen, "/(.*)?")
3627
+ }, function (_ref18) {
3628
+ var _ref18$screen = _ref18.screen,
3629
+ screenId = _ref18$screen === void 0 ? null : _ref18$screen;
3630
+ return screens.length > 0 ? /*#__PURE__*/React.createElement(ScreensMenu$1, {
3631
+ items: screens.map(function (it) {
3632
+ return {
3633
+ id: it.id,
3634
+ screen: it,
3635
+ href: url('screen', {
3636
+ screen: it.id
3637
+ }),
3638
+ active: it.id === screenId
3639
+ };
3640
+ }),
3641
+ isVertical: isVertical,
3642
+ withPreview: true,
3643
+ sortable: !isTree,
3644
+ className: "w-100",
3645
+ onClickItem: onClickScreen,
3646
+ onOrderChange: onOrderChange,
3647
+ isTree: isTree
3648
+ }) : /*#__PURE__*/React.createElement(components.Empty, {
3649
+ className: "flex-grow-1 p-2"
3650
+ }, /*#__PURE__*/React.createElement(components.Button, {
3651
+ theme: "primary",
3652
+ onClick: onClickAdd
3653
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
3654
+ id: "JoWKee",
3655
+ defaultMessage: [{
3656
+ "type": 0,
3657
+ "value": "Create your first screen"
3658
+ }]
3659
+ })));
3660
+ }), /*#__PURE__*/React.createElement(Route, null, screens.length > 0 ? /*#__PURE__*/React.createElement(ScreensMenu$1, {
3661
+ items: screens.map(function (it) {
3662
+ return {
3663
+ id: it.id,
3664
+ screen: it,
3665
+ href: url('screen', {
3666
+ screen: it.id
3667
+ }),
3668
+ active: false
3669
+ };
3670
+ }),
3671
+ isVertical: isVertical,
3672
+ withPreview: true,
3673
+ sortable: !isTree,
3674
+ className: "w-100",
3675
+ onClickItem: onClickScreen,
3676
+ onOrderChange: onOrderChange,
3677
+ isTree: isTree
3678
+ }) : /*#__PURE__*/React.createElement(components.Empty, {
3679
+ className: "flex-grow-1 p-2"
3680
+ }, /*#__PURE__*/React.createElement(components.Button, {
3681
+ theme: "primary",
3682
+ onClick: onClickAdd
3683
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
3684
+ id: "JoWKee",
3685
+ defaultMessage: [{
3686
+ "type": 0,
3687
+ "value": "Create your first screen"
3688
+ }]
3689
+ })))))), createModalOpened ? /*#__PURE__*/React.createElement(ScreenTypesModal$1, {
3690
+ selectedTypes: isTheme ? screens.map(function (_ref19) {
3691
+ var type = _ref19.type;
3692
+ return type;
3693
+ }) : [],
3694
+ onClickScreenType: onClickScreenType,
3695
+ onRequestClose: onCreateModalRequestClose
3696
+ }) : null);
3697
+ };
3698
+ EditorScreens.propTypes = propTypes$4;
3699
+ EditorScreens.defaultProps = defaultProps$4;
3700
+ var Screens = EditorScreens;
3701
+
3702
+ var styles$1 = {"container":"micromag-editor-container","left":"micromag-editor-left","right":"micromag-editor-right","fullscreen":"micromag-editor-fullscreen","preview":"micromag-editor-preview","center":"micromag-editor-center","inner":"micromag-editor-inner","visible":"micromag-editor-visible","top":"micromag-editor-top"};
3703
+
3704
+ var propTypes$3 = {
3705
+ value: PropTypes.oneOfType([core.PropTypes.story, core.PropTypes.theme]),
3706
+ deviceScreens: core.PropTypes.deviceScreens,
3707
+ viewerTheme: core.PropTypes.viewerTheme,
3708
+ mobileView: PropTypes.oneOf(['screens', 'preview', 'form']),
3709
+ fullscreen: PropTypes.bool,
3710
+ isTheme: PropTypes.bool,
3711
+ isCreateOpened: PropTypes.bool,
3712
+ onChange: PropTypes.func,
3713
+ className: PropTypes.string
3714
+ };
3715
+ var defaultProps$3 = {
3716
+ value: null,
3717
+ deviceScreens: utils.getDeviceScreens(),
3718
+ viewerTheme: null,
3719
+ mobileView: 'preview',
3720
+ fullscreen: false,
3721
+ isTheme: false,
3722
+ isCreateOpened: false,
3723
+ onChange: null,
3724
+ className: null
3725
+ };
3726
+ var Editor = function Editor(_ref) {
3727
+ var value = _ref.value,
3728
+ viewerTheme = _ref.viewerTheme,
3729
+ isTheme = _ref.isTheme,
3730
+ isCreateOpened = _ref.isCreateOpened,
3731
+ deviceScreens = _ref.deviceScreens,
3732
+ initialMobileView = _ref.mobileView,
3733
+ onChange = _ref.onChange,
3734
+ fullscreen = _ref.fullscreen,
3735
+ className = _ref.className;
3736
+ var push = contexts.useRoutePush();
3737
+ var refScreensContainer = React.useRef(null);
3738
+ var _useRouteParams = useRouteParams({
3739
+ screenOnly: true
3740
+ }),
3741
+ screenId = _useRouteParams.screen;
3742
+
3743
+ // Screen size
3744
+ var _useScreenSizeFromEle = hooks.useScreenSizeFromElement({
3745
+ screens: deviceScreens,
3746
+ withoutMaxSize: true,
3747
+ withoutScale: true
3748
+ }),
3749
+ refContainer = _useScreenSizeFromEle.ref,
3750
+ screenSize = _useScreenSizeFromEle.screenSize;
3751
+ var isMobile = screenSize !== null && screenSize.screens.indexOf('medium') === -1;
3752
+
3753
+ // Mobile view
3754
+ var _useState = React.useState(initialMobileView),
3755
+ _useState2 = _slicedToArray(_useState, 2),
3756
+ mobileView = _useState2[0],
3757
+ setMobileView = _useState2[1];
3758
+ var onClickScreens = React.useCallback(function () {
3759
+ return setMobileView('screens');
3760
+ }, [mobileView, setMobileView]);
3761
+ var onClickEdit = React.useCallback(function () {
3762
+ return setMobileView('form');
3763
+ }, [setMobileView]);
3764
+ var onClickViewScreen = React.useCallback(function () {
3765
+ return setMobileView('preview');
3766
+ }, [setMobileView]);
3767
+
3768
+ // console.log('mobileView', screenSize, isMobile, mobileView);
3769
+
3770
+ // Apply base theme values to it's own components
3771
+ var _ref2 = value || {},
3772
+ _ref2$background = _ref2.background,
3773
+ background = _ref2$background === void 0 ? null : _ref2$background,
3774
+ _ref2$colors = _ref2.colors,
3775
+ colors = _ref2$colors === void 0 ? null : _ref2$colors,
3776
+ _ref2$textStyles = _ref2.textStyles,
3777
+ textStyles = _ref2$textStyles === void 0 ? null : _ref2$textStyles,
3778
+ _ref2$boxStyles = _ref2.boxStyles,
3779
+ boxStyles = _ref2$boxStyles === void 0 ? null : _ref2$boxStyles;
3780
+ var baseValue = isTheme ? _objectSpread(_objectSpread({}, value), {}, {
3781
+ theme: {
3782
+ background: background,
3783
+ colors: colors,
3784
+ textStyles: textStyles,
3785
+ boxStyles: boxStyles
3786
+ }
3787
+ }) : value;
3788
+ var story = hooks.useParsedStory(baseValue);
3789
+ var _useMediasParser = hooks.useMediasParser(),
3790
+ parseMediasToPath = _useMediasParser.toPath;
3791
+ var onStoryChange = React.useCallback(function (newStory) {
3792
+ var storyWithMedias = parseMediasToPath(newStory);
3793
+ if (onChange !== null) {
3794
+ onChange(storyWithMedias);
3795
+ }
3796
+ }, [onChange, parseMediasToPath]);
3797
+ var clickedScreenId = React.useRef(null);
3798
+ var onClickScreen = React.useCallback(function (_ref3) {
3799
+ var id = _ref3.id;
3800
+ clickedScreenId.current = id;
3801
+ if (screenSize.screen) {
3802
+ setMobileView('preview');
3803
+ }
3804
+ push('screen', {
3805
+ screen: clickedScreenId.current
3806
+ });
3807
+ }, [screenSize.screen, push]);
3808
+ var onPreviewScreenChange = React.useCallback(function (_ref4) {
3809
+ var newScreenId = _ref4.id;
3810
+ push('screen', {
3811
+ screen: newScreenId
3812
+ });
3813
+ }, [push]);
3814
+
3815
+ // Auto-scroll to current screen except when manually clicking one
3816
+ React.useEffect(function () {
3817
+ if (screenId === null || clickedScreenId.current === screenId) {
3818
+ return;
3819
+ }
3820
+ clickedScreenId.current = null;
3821
+ var screens = refScreensContainer.current;
3822
+ var items = screens.querySelectorAll("[data-screen-id=\"".concat(screenId, "\"]"));
3823
+ if (items !== null && items.length > 0) {
3824
+ var item = items[0];
3825
+ var cnt = item.parentNode.parentNode.parentNode;
3826
+ screens.scrollTop = cnt.offsetTop + item.offsetTop + item.offsetHeight / 2 - screens.clientHeight / 2;
3827
+ }
3828
+ }, [screenId]);
3829
+
3830
+ // console.log('screenId', screenId);
3831
+
3832
+ return /*#__PURE__*/React.createElement(contexts.ModalsProvider, null, /*#__PURE__*/React.createElement(contexts.PanelsProvider, null, /*#__PURE__*/React.createElement(contexts.ScreenSizeProvider, {
3833
+ size: screenSize
3834
+ }, /*#__PURE__*/React.createElement("div", {
3835
+ className: classNames([styles$1.container, screenSize !== null ? screenSize.screens.map(function (screenName) {
3836
+ return styles$1["screen-".concat(screenName)];
3837
+ }) : null, _defineProperty(_defineProperty({}, styles$1.fullscreen, fullscreen), className, className)]),
3838
+ ref: refContainer
3839
+ }, /*#__PURE__*/React.createElement(components.Navbar, {
3840
+ theme: "light",
3841
+ compact: true,
3842
+ noWrap: true,
3843
+ withoutCollapse: true,
3844
+ className: styles$1.top
3845
+ }, mobileView !== 'screens' ? /*#__PURE__*/React.createElement(components.Button, {
3846
+ size: "sm",
3847
+ theme: "secondary",
3848
+ onClick: onClickScreens,
3849
+ className: "me-auto"
3850
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
3851
+ id: "wkysUu",
3852
+ defaultMessage: [{
3853
+ "type": 0,
3854
+ "value": "Screens"
3855
+ }]
3856
+ })) : /*#__PURE__*/React.createElement("span", null), mobileView !== 'form' ? /*#__PURE__*/React.createElement(components.Button, {
3857
+ size: "sm",
3858
+ theme: "primary",
3859
+ onClick: onClickEdit
3860
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
3861
+ id: "HseFdk",
3862
+ defaultMessage: [{
3863
+ "type": 0,
3864
+ "value": "Edit"
3865
+ }]
3866
+ })) : null, mobileView === 'form' ? /*#__PURE__*/React.createElement(components.Button, {
3867
+ size: "sm",
3868
+ theme: "primary",
3869
+ onClick: onClickViewScreen
3870
+ }, /*#__PURE__*/React.createElement(reactIntl.FormattedMessage, {
3871
+ id: "4POR3B",
3872
+ defaultMessage: [{
3873
+ "type": 0,
3874
+ "value": "View screen"
3875
+ }]
3876
+ })) : null), /*#__PURE__*/React.createElement("div", {
3877
+ className: styles$1.inner
3878
+ }, /*#__PURE__*/React.createElement("div", {
3879
+ className: classNames([styles$1.left, _defineProperty({}, styles$1.visible, !isMobile || mobileView === 'screens')]),
3880
+ ref: refScreensContainer
3881
+ }, /*#__PURE__*/React.createElement(Screens, {
3882
+ value: story,
3883
+ isTheme: isTheme,
3884
+ isCreateOpened: isCreateOpened,
3885
+ isParsed: true,
3886
+ onChange: onStoryChange,
3887
+ onClickScreen: onClickScreen,
3888
+ isVertical: !isMobile,
3889
+ className: styles$1.inner,
3890
+ isTree: true
3891
+ })), /*#__PURE__*/React.createElement("div", {
3892
+ className: classNames([styles$1.center, _defineProperty({}, styles$1.visible, !isMobile || mobileView === 'preview')])
3893
+ }, /*#__PURE__*/React.createElement(EditorPreview$1, {
3894
+ value: story,
3895
+ isTheme: isTheme,
3896
+ viewerTheme: viewerTheme,
3897
+ className: styles$1.preview,
3898
+ onScreenChange: onPreviewScreenChange,
3899
+ onChange: onStoryChange
3900
+ })), /*#__PURE__*/React.createElement("div", {
3901
+ className: classNames([styles$1.right, _defineProperty({}, styles$1.visible, !isMobile || mobileView === 'form')])
3902
+ }, /*#__PURE__*/React.createElement(EditorForm, {
3903
+ key: screenId,
3904
+ value: story,
3905
+ isTheme: isTheme,
3906
+ onChange: onStoryChange,
3907
+ className: styles$1.inner
3908
+ }))), /*#__PURE__*/React.createElement(components.Modals, null)))));
3909
+ };
3910
+ Editor.propTypes = propTypes$3;
3911
+ Editor.defaultProps = defaultProps$3;
3912
+ var Editor$1 = Editor;
3913
+
3914
+ // eslint-disable-next-line import/prefer-default-export
3915
+ var routes = PropTypes.shape({
3916
+ home: PropTypes.string.isRequired,
3917
+ screen: PropTypes.string.isRequired,
3918
+ 'screen.field': PropTypes.string.isRequired,
3919
+ 'screen.field.form': PropTypes.string.isRequired
3920
+ });
3921
+
3922
+ var styles = {"container":"micromag-editor-forms-settings-container","inner":"micromag-editor-forms-settings-inner"};
3923
+
3924
+ var propTypes$2 = {
3925
+ name: PropTypes.string,
3926
+ field: core.PropTypes.formField,
3927
+ value: core.PropTypes.component,
3928
+ className: PropTypes.string,
3929
+ gotoFieldForm: PropTypes.func.isRequired,
3930
+ closeFieldForm: PropTypes.func.isRequired,
3931
+ onChange: PropTypes.func
3932
+ };
3933
+ var defaultProps$2 = {
3934
+ name: null,
3935
+ field: null,
3936
+ value: null,
3937
+ className: null,
3938
+ onChange: null
3939
+ };
3940
+ var SettingsForm = function SettingsForm(_ref) {
3941
+ var name = _ref.name,
3942
+ field = _ref.field,
3943
+ value = _ref.value,
3944
+ className = _ref.className,
3945
+ gotoFieldForm = _ref.gotoFieldForm,
3946
+ closeFieldForm = _ref.closeFieldForm,
3947
+ onChange = _ref.onChange;
3948
+ if (field === null) return false;
3949
+ var _ref2 = field || {},
3950
+ _ref2$type = _ref2.type,
3951
+ type = _ref2$type === void 0 ? null : _ref2$type,
3952
+ _ref2$fieldsProps = _ref2.fieldsProps,
3953
+ fieldsProps = _ref2$fieldsProps === void 0 ? null : _ref2$fieldsProps;
3954
+ var fieldsManager = contexts.useFieldsManager();
3955
+ var _ref3 = type !== null ? fieldsManager.getDefinition(type) : field,
3956
+ _ref3$component = _ref3.component,
3957
+ fieldComponent = _ref3$component === void 0 ? null : _ref3$component,
3958
+ settings = _ref3.settings;
3959
+ var FieldComponent = contexts.useFieldComponent(fieldComponent);
3960
+ var FieldsComponent = contexts.useFieldComponent('fields');
3961
+ var SettingsComponent = FieldComponent !== null ? FieldComponent.settingsComponent || FieldsComponent : FieldsComponent;
3962
+ var onSettingsChange = React.useCallback(function (newSettingsValue) {
3963
+ var newValue = _objectSpread(_objectSpread({}, value), newSettingsValue);
3964
+ if (onChange !== null) {
3965
+ onChange(newValue);
3966
+ }
3967
+ }, [value, onChange]);
3968
+ return /*#__PURE__*/React.createElement("div", {
3969
+ className: classNames([styles.container, _defineProperty({}, className, className)])
3970
+ }, /*#__PURE__*/React.createElement("div", {
3971
+ className: styles.inner
3972
+ }, /*#__PURE__*/React.createElement(SettingsComponent, {
3973
+ name: name,
3974
+ field: field,
3975
+ fields: settings,
3976
+ value: value,
3977
+ onChange: onSettingsChange,
3978
+ gotoFieldForm: gotoFieldForm,
3979
+ closeFieldForm: closeFieldForm,
3980
+ fieldsProps: fieldsProps
3981
+ })));
3982
+ };
3983
+ SettingsForm.propTypes = propTypes$2;
3984
+ SettingsForm.defaultProps = defaultProps$2;
3985
+ var SettingsForm$1 = SettingsForm;
3986
+
3987
+ // eslint-disable-next-line import/prefer-default-export
3988
+
3989
+ var FormsComponents = /*#__PURE__*/Object.freeze({
3990
+ __proto__: null,
3991
+ Settings: SettingsForm$1
3992
+ });
3993
+
3994
+ /* eslint-disable react/jsx-props-no-spreading */
3995
+ var propTypes$1 = {
3996
+ children: PropTypes.node
3997
+ };
3998
+ var defaultProps$1 = {
3999
+ children: null
4000
+ };
4001
+ var FormsProvider = function FormsProvider(props) {
4002
+ return /*#__PURE__*/React.createElement(contexts.ComponentsProvider, Object.assign({
4003
+ namespace: contexts.FORMS_NAMESPACE,
4004
+ components: FormsComponents
4005
+ }, props));
4006
+ };
4007
+ FormsProvider.propTypes = propTypes$1;
4008
+ FormsProvider.defaultProps = defaultProps$1;
4009
+ var FormsProvider$1 = FormsProvider;
4010
+
4011
+ var home = "/";
4012
+ var screen_wildcard = "/:screen/(.*)?";
4013
+ var screen = "/:screen";
4014
+ var defaultRoutes = {
4015
+ home: home,
4016
+ screen_wildcard: screen_wildcard,
4017
+ screen: screen,
4018
+ "screen.field": "/:screen/:field+",
4019
+ "screen.field.form": "/:screen/:field+/:form"
4020
+ };
4021
+
4022
+ var _excluded = ["value", "memoryRouter", "routes", "basePath", "uppy", "googleApiKey", "googleMapsLibraries", "screenNamespaces"];
4023
+ var pathToRegexpParser = createPathToRegexpParser();
4024
+ var propTypes = {
4025
+ value: PropTypes.oneOfType([core.PropTypes.story, core.PropTypes.theme]),
4026
+ routes: routes,
4027
+ memoryRouter: PropTypes.bool,
4028
+ basePath: PropTypes.string,
4029
+ uppy: PropTypes.shape({
4030
+ transport: PropTypes.string
4031
+ }),
4032
+ googleApiKey: PropTypes.string,
4033
+ googleMapsLibraries: PropTypes.arrayOf(PropTypes.string),
4034
+ screenNamespaces: PropTypes.arrayOf(PropTypes.string)
4035
+ };
4036
+ var defaultProps = {
4037
+ value: null,
4038
+ routes: defaultRoutes,
4039
+ memoryRouter: false,
4040
+ basePath: null,
4041
+ uppy: null,
4042
+ googleApiKey: null,
4043
+ googleMapsLibraries: ['places'],
4044
+ screenNamespaces: null
4045
+ };
4046
+ var EditorContainer = function EditorContainer(_ref) {
4047
+ var value = _ref.value,
4048
+ memoryRouter = _ref.memoryRouter,
4049
+ routes = _ref.routes,
4050
+ basePath = _ref.basePath,
4051
+ uppy$1 = _ref.uppy,
4052
+ googleApiKey = _ref.googleApiKey,
4053
+ googleMapsLibraries = _ref.googleMapsLibraries,
4054
+ screenNamespaces = _ref.screenNamespaces,
4055
+ props = _objectWithoutProperties(_ref, _excluded);
4056
+ var _useIntl = reactIntl.useIntl(),
4057
+ locale = _useIntl.locale;
4058
+ var _useMemoryRouter = useMemoryRouter(),
4059
+ memoryLocationHook = _useMemoryRouter.hook,
4060
+ memorySearchHook = _useMemoryRouter.searchHook;
4061
+ var routerProps = React.useMemo(function () {
4062
+ return {
4063
+ hook: memoryRouter ? memoryLocationHook : null,
4064
+ searchHook: memoryRouter ? memorySearchHook : null,
4065
+ parser: pathToRegexpParser,
4066
+ base: !memoryRouter ? basePath : null
4067
+ };
4068
+ }, [basePath, memoryRouter]);
4069
+ return /*#__PURE__*/React.createElement(Router, routerProps, /*#__PURE__*/React.createElement(uppy.UppyProvider, uppy$1, /*#__PURE__*/React.createElement(contexts.StoryProvider, {
4070
+ story: value
4071
+ }, /*#__PURE__*/React.createElement(screens.ScreensProvider, {
4072
+ filterNamespaces: true,
4073
+ namespaces: screenNamespaces
4074
+ }, /*#__PURE__*/React.createElement(contexts.GoogleKeysProvider, {
4075
+ apiKey: googleApiKey
4076
+ }, /*#__PURE__*/React.createElement(contexts.GoogleMapsClientProvider, {
4077
+ locale: locale,
4078
+ libraries: googleMapsLibraries
4079
+ }, /*#__PURE__*/React.createElement(contexts.FontsProvider, null, /*#__PURE__*/React.createElement(fields.FieldsProvider, null, /*#__PURE__*/React.createElement(FormsProvider$1, null, /*#__PURE__*/React.createElement(contexts.EditorProvider, null, /*#__PURE__*/React.createElement(contexts.VisitorProvider, {
4080
+ visitor: "editor"
4081
+ }, /*#__PURE__*/React.createElement(contexts.ComponentsContext.Consumer, null, function (manager) {
4082
+ var formComponents = manager.getComponents(contexts.FORMS_NAMESPACE);
4083
+ var formRegEx = formComponents !== null ? Object.keys(formComponents).map(function (name) {
4084
+ return utils.slug(name);
4085
+ }).join('|') : null;
4086
+ return /*#__PURE__*/React.createElement(contexts.RoutesProvider, {
4087
+ routes: _objectSpread(_objectSpread({}, routes), {}, {
4088
+ 'screen.field.form': routes['screen.field.form'].replace(/:form$/, ":form(".concat(formRegEx, ")"))
4089
+ })
4090
+ }, /*#__PURE__*/React.createElement(Editor$1, Object.assign({
4091
+ value: value
4092
+ }, props)));
4093
+ }))))))))))));
4094
+ };
4095
+ EditorContainer.propTypes = propTypes;
4096
+ EditorContainer.defaultProps = defaultProps;
4097
+ var EditorContainer$1 = EditorContainer;
4098
+
4099
+ exports.Editor = Editor$1;
4100
+ exports.ScreenTypes = ScreenTypesMenu;
4101
+ exports.Screens = ScreensMenu$1;
4102
+ exports.createScreen = createScreen$1;
4103
+ exports.default = EditorContainer$1;