react-sync-board 1.2.9 → 1.3.1
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/dist/react-sync-board.js +2378 -3889
- package/dist/react-sync-board.js.map +1 -1
- package/dist/react-sync-board.umd.cjs +14 -72
- package/dist/react-sync-board.umd.cjs.map +1 -1
- package/package.json +35 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-sync-board.umd.cjs","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../node_modules/wire.io/node_modules/nanoid/index.browser.js","../node_modules/wire.io/src/client.js","../src/lib/hooks/useWire.jsx","../node_modules/zustand/esm/vanilla.mjs","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../node_modules/use-sync-external-store/shim/index.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../node_modules/use-sync-external-store/shim/with-selector.js","../node_modules/zustand/esm/index.mjs","../src/lib/utils.js","../node_modules/zustand/esm/shallow.mjs","../src/lib/board/store/synced.jsx","../src/lib/board/Items/useItems.js","../src/lib/board/Items/useDebouncedItems.js","../src/lib/settings.js","../src/lib/board/store/main.jsx","../src/lib/board/Items/useSelectedItems.js","../src/lib/board/Items/useGetSelectedItems.js","../node_modules/@react-hookz/web/esm/useSyncedRef/index.js","../node_modules/@react-hookz/web/esm/useUnmountEffect/index.js","../node_modules/@react-hookz/web/esm/useDebouncedCallback/index.js","../src/lib/board/useDim.js","../src/lib/board/Items/useItemInteraction.js","../src/lib/board/Items/useItemActions.js","../node_modules/fast-deep-equal/es6/index.js","../node_modules/@react-hookz/web/esm/useDebouncedEffect/index.js","../src/lib/board/Items/useAvailableActions.js","../src/lib/board/useSelectionBox.js","../node_modules/nanoid/index.browser.js","../src/lib/users/store.jsx","../src/lib/users/useUsers.jsx","../src/lib/board/useBoardConfig.jsx","../src/lib/board/useBoardState.js","../src/lib/board/useSessionInfo.jsx","../src/lib/message/store.jsx","../src/lib/message/useMessage.js","../src/lib/BoardWrapper.jsx","../src/lib/RoomWrapper.jsx","../node_modules/goober/dist/goober.modern.js","../node_modules/fast-deep-equal/index.js","../src/lib/board/Gesture.jsx","../src/lib/board/Items/ResizeHandler.jsx","../src/lib/board/Items/Item.jsx","../src/lib/board/Items/ItemList.jsx","../node_modules/@react-hookz/web/esm/useIsMounted/index.js","../node_modules/@react-hookz/web/esm/util/misc.js","../node_modules/@react-hookz/web/esm/useEventListener/index.js","../src/lib/board/Selector.jsx","../src/lib/board/ActionPane.jsx","../src/lib/board/useMousePosition.js","../src/lib/board/usePositionNavigator.jsx","../src/lib/board/PanZoom.jsx","../src/lib/board/Selection.jsx","../node_modules/@react-hookz/web/esm/util/const.js","../node_modules/@react-hookz/web/esm/useResizeObserver/index.js","../node_modules/color2k/dist/index.module.es.js","../src/lib/board/Cursors/Cursor.jsx","../src/lib/board/Cursors/CursorPane.jsx","../src/lib/board/Board.jsx","../src/lib/index.js"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n","import { nanoid } from 'nanoid';\n\nclass Wire {\n constructor(socket, room, userId = null) {\n this._socket = socket;\n this.userId = userId;\n this.room = room;\n this.toUnregister = [\n () => {\n this._socket.off(`${this.room}.isMaster`);\n this._socket.off(`${this.room}.roomJoined`);\n this._socket.off(`${this.room}._call`);\n },\n ];\n this._left = false;\n\n this.registeredRPC = {};\n\n // Receive server RPC calls\n this._socket.on(`${this.room}._call`, async ({ callId, name, params }) => {\n try {\n const result = await this.registeredRPC[name](params);\n socket.emit(`${this.room}._result.${callId}`, {\n ok: result ? result : null,\n });\n } catch (err) {\n socket.emit(`${this.room}._result.${callId}`, {\n err: `${err.message}`,\n });\n }\n });\n }\n\n /**\n * Call a server procedure.\n *\n * @param {string} action name of the operation to call on the server.\n * @param {*} params the params of the action.\n * @returns the result of the call.\n */\n async _callServerRPC(name, params) {\n const callId = nanoid();\n return new Promise((resolve, reject) => {\n this._socket.once(`${this.room}._result.${callId}`, (result) => {\n if (result.hasOwnProperty('ok')) {\n resolve(result.ok);\n } else {\n reject(result.err);\n }\n });\n this._socket.emit(`${this.room}._call`, { callId, name, params });\n });\n }\n\n /**\n * Leave current room\n * @param {string} room name.\n */\n leave() {\n this._left = true;\n this.toUnregister.forEach((callback) => {\n callback();\n });\n this._socket.emit(`${this.room}.leave`);\n }\n\n /**\n * Send an event to all other client in room. Also to self if true.\n * @param {string} name Name of event\n * @param {*} params arguments of event\n * @param {boolean} self if true, the publish get the event too\n */\n publish(name, params, self = false) {\n this._socket.emit(`${this.room}.publish`, { name, params, self });\n }\n\n /**\n * Subscribe to an event.\n * @param {string} event Name of event\n * @param {function} callback Called when the event is received. First param\n * of the function is the params sent with the event.\n */\n subscribe(event, callback) {\n this._socket.on(`${this.room}.${event}`, callback);\n\n const unregisterCallback = () => {\n this._socket.off(`${this.room}.${event}`, callback);\n };\n\n this.toUnregister.push(unregisterCallback);\n\n return unregisterCallback;\n }\n\n /**\n * Register a new RPC function.\n * @param {string} name of function\n * @param {function} callback the function that handle the function result\n * @param {object} params the configuration of the RPC. For now only `invoke`\n * parameter is allowed with the following values:\n * - 'single' for a RPC that can be registered only once.\n * - 'first' The first registered client is called.\n * - 'last' The last registered client is called.\n * - 'random' A random RPC is called.\n */\n async register(name, callback, { invoke = 'single' } = {}) {\n // Add to locally registered callback\n\n this.registeredRPC[name] = callback;\n\n await this._callServerRPC('register', {\n name,\n invoke,\n });\n\n // Return unregister callback\n const unregisterCallback = () => {\n if (this.registeredRPC[name] === callback) {\n delete this.registeredRPC[name];\n return this._callServerRPC('unregister', { name });\n }\n };\n\n this.toUnregister.push(unregisterCallback);\n\n return unregisterCallback;\n }\n\n /**\n * Call a previously registered function with `params` arguments.\n * @param {string} name of function\n * @param {*} params parameters of the called function.\n */\n async call(name, params) {\n return await this._callServerRPC('call', { name, params });\n }\n}\n\n/**\n * Join a wire.io room.\n * @param {socket} socket socket.io instance.\n * @param {string} name of the room\n * @param {function} onMaster is called when the client become the master of\n * the room, i.e. the first client or the next one if the first quit.\n * @param {function} onJoined is called on each connection, reconnection after\n * wire.io is initialized.\n * @param {string} userId (optional) to force userId.\n */\nexport const joinWire = ({\n socket,\n room,\n onJoined = () => {},\n onMaster = () => {},\n userId = null,\n}) => {\n const WireRoom = new Wire(socket, room, userId);\n return new Promise((resolve) => {\n // Avoid multiple join\n let waitForResponse = true;\n socket.on(`${room}.isMaster`, () => {\n if (WireRoom._left) {\n return;\n }\n onMaster(room);\n });\n\n socket.on(`${room}.roomJoined`, (userId) => {\n if (WireRoom._left) {\n return;\n }\n WireRoom.userId = userId;\n waitForResponse = false;\n onJoined(WireRoom);\n resolve(WireRoom);\n });\n\n // Rejoin on reconnection\n socket.on('connect', () => {\n // If joined already called or room left\n // we quit\n if (WireRoom._left || waitForResponse) {\n return;\n }\n // Restore events with same userId\n socket.emit('joinSuperSocket', {\n room,\n userId: WireRoom.userId,\n });\n });\n socket.emit('joinSuperSocket', { room, userId });\n });\n};\n\nexport default joinWire;\n","import React, { useContext } from \"react\";\nimport { joinWire } from \"wire.io\";\n\nconst Context = React.createContext();\n\nexport const DefaultLoading = () => {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"0\",\n bottom: \"0\",\n width: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <h2>🌀 Loading...</h2>\n </div>\n );\n};\n\nexport const WireProvider = ({\n socket,\n room,\n channel = \"default\",\n LoadingComponent = DefaultLoading,\n children,\n}) => {\n const [joined, setJoined] = React.useState(false);\n const [isMaster, setIsMaster] = React.useState(false);\n const [wire, setWire] = React.useState(null);\n const roomRef = React.useRef(null);\n const mountedRef = React.useRef(false);\n const existingC2C = useContext(Context);\n const connectingRef = React.useRef(false);\n\n React.useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n React.useEffect(() => {\n if (!socket) {\n return null;\n }\n\n const disconnect = () => {\n console.log(`Disconnected from ${channel}…`);\n if (!mountedRef.current) return;\n setJoined(false);\n setIsMaster(false);\n };\n\n socket.on(\"disconnect\", disconnect);\n return () => {\n socket.off(\"disconnect\", disconnect);\n };\n }, [channel, socket]);\n\n React.useEffect(() => {\n // Connect\n if (!socket) {\n return null;\n }\n if (!socket.connected) {\n socket.connect();\n }\n console.log(`Try to connect to wire ${room} on channel ${channel}`);\n if (!connectingRef.current) {\n connectingRef.current = true;\n joinWire({\n socket,\n room,\n onMaster: () => {\n console.log(`Is now master on channel ${channel}…`);\n if (!mountedRef.current) return;\n setIsMaster(true);\n },\n onJoined: (newRoom) => {\n console.log(`Connected on channel ${channel}…`);\n roomRef.current = newRoom;\n\n if (!mountedRef.current) return;\n setWire(newRoom);\n setJoined(true);\n },\n });\n }\n\n return () => {\n roomRef.current?.leave();\n };\n }, [channel, room, socket]);\n\n\n if (!joined || !wire) {\n return <LoadingComponent />;\n }\n\n return (\n <Context.Provider\n value={{ ...existingC2C, [channel]: { wire, joined, isMaster, room } }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nconst useWire = (channel = \"default\") => {\n const channels = useContext(Context) || {};\n return channels[channel];\n};\n\nexport default useWire;\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\") ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The destroy method will be unsupported in the future version. You should use unsubscribe function returned by subscribe. Everything will be garbage collected if store is garbage collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, subscribe, destroy };\n state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] default export is deprecated, instead import { createStore } ...\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = require('react');\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\n// dispatch for CommonJS interop named imports.\n\nvar useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nvar didWarnOld18Alpha = false;\nvar didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works\n// because of a very particular set of implementation details and assumptions\n// -- change any one of them and it will break. The most important assumption\n// is that updates are always synchronous, because concurrent rendering is\n// only available in versions of React that also have a built-in\n// useSyncExternalStore API. And we only use this shim when the built-in API\n// does not exist.\n//\n// Do not assume that the clever hacks used by this hook also work in general.\n// The point of this shim is to replace the need for hacks by other libraries.\n\nfunction useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of\n// React do not expose a way to check if we're hydrating. So users of the shim\n// will need to track that themselves and return the correct value\n// from `getSnapshot`.\ngetServerSnapshot) {\n {\n if (!didWarnOld18Alpha) {\n if (React.startTransition !== undefined) {\n didWarnOld18Alpha = true;\n\n error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.');\n }\n }\n } // Read the current snapshot from the store on every render. Again, this\n // breaks the rules of React, and only works here because of specific\n // implementation details, most importantly that updates are\n // always synchronous.\n\n\n var value = getSnapshot();\n\n {\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n\n if (!objectIs(value, cachedValue)) {\n error('The result of getSnapshot should be cached to avoid an infinite loop');\n\n didWarnUncachedGetSnapshot = true;\n }\n }\n } // Because updates are synchronous, we don't queue them. Instead we force a\n // re-render whenever the subscribed state changes by updating an some\n // arbitrary useState hook. Then, during render, we call getSnapshot to read\n // the current value.\n //\n // Because we don't actually use the state returned by the useState hook, we\n // can save a bit of memory by storing other stuff in that slot.\n //\n // To implement the early bailout, we need to track some things on a mutable\n // object. Usually, we would put that in a useRef hook, but we can stash it in\n // our useState hook instead.\n //\n // To force a re-render, we call forceUpdate({inst}). That works because the\n // new object always fails an equality check.\n\n\n var _useState = useState({\n inst: {\n value: value,\n getSnapshot: getSnapshot\n }\n }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated\n // in the layout phase so we can access it during the tearing check that\n // happens on subscribe.\n\n\n useLayoutEffect(function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the\n // commit phase if there was an interleaved mutation. In concurrent mode\n // this can happen all the time, but even in synchronous mode, an earlier\n // effect may have mutated the store.\n\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n }, [subscribe, value, getSnapshot]);\n useEffect(function () {\n // Check for changes right before subscribing. Subsequent changes will be\n // detected in the subscription handler.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n\n var handleStoreChange = function () {\n // TODO: Because there is no cross-renderer API for batching updates, it's\n // up to the consumer of this library to wrap their subscription event\n // with unstable_batchedUpdates. Should we try to detect when this isn't\n // the case and print a warning in development?\n // The store changed. Check if the snapshot changed since the last time we\n // read from the store.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n }; // Subscribe to the store and return a clean-up function.\n\n\n return subscribe(handleStoreChange);\n }, [subscribe]);\n useDebugValue(value);\n return value;\n}\n\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n var prevValue = inst.value;\n\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(prevValue, nextValue);\n } catch (error) {\n return true;\n }\n}\n\nfunction useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {\n // Note: The shim does not use getServerSnapshot, because pre-18 versions of\n // React do not expose a way to check if we're hydrating. So users of the shim\n // will need to track that themselves and return the correct value\n // from `getSnapshot`.\n return getSnapshot();\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\nvar isServerEnvironment = !canUseDOM;\n\nvar shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;\nvar useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;\n\nexports.useSyncExternalStore = useSyncExternalStore$2;\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());\n}\n \n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var h=require(\"react\"),n=require(\"use-sync-external-store/shim\");function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nexports.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return[function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d},[d]);w(d);return d};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = require('react');\nvar shim = require('use-sync-external-store/shim');\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\nvar useSyncExternalStore = shim.useSyncExternalStore;\n\n// for CommonJS interop.\n\nvar useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.\n\nfunction useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {\n // Use this to track the rendered snapshot.\n var instRef = useRef(null);\n var inst;\n\n if (instRef.current === null) {\n inst = {\n hasValue: false,\n value: null\n };\n instRef.current = inst;\n } else {\n inst = instRef.current;\n }\n\n var _useMemo = useMemo(function () {\n // Track the memoized state using closure variables that are local to this\n // memoized instance of a getSnapshot function. Intentionally not using a\n // useRef hook, because that state would be shared across all concurrent\n // copies of the hook/component.\n var hasMemo = false;\n var memoizedSnapshot;\n var memoizedSelection;\n\n var memoizedSelector = function (nextSnapshot) {\n if (!hasMemo) {\n // The first time the hook is called, there is no memoized result.\n hasMemo = true;\n memoizedSnapshot = nextSnapshot;\n\n var _nextSelection = selector(nextSnapshot);\n\n if (isEqual !== undefined) {\n // Even if the selector has changed, the currently rendered selection\n // may be equal to the new selection. We should attempt to reuse the\n // current value if possible, to preserve downstream memoizations.\n if (inst.hasValue) {\n var currentSelection = inst.value;\n\n if (isEqual(currentSelection, _nextSelection)) {\n memoizedSelection = currentSelection;\n return currentSelection;\n }\n }\n }\n\n memoizedSelection = _nextSelection;\n return _nextSelection;\n } // We may be able to reuse the previous invocation's result.\n\n\n // We may be able to reuse the previous invocation's result.\n var prevSnapshot = memoizedSnapshot;\n var prevSelection = memoizedSelection;\n\n if (objectIs(prevSnapshot, nextSnapshot)) {\n // The snapshot is the same as last time. Reuse the previous selection.\n return prevSelection;\n } // The snapshot has changed, so we need to compute a new selection.\n\n\n // The snapshot has changed, so we need to compute a new selection.\n var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data\n // has changed. If it hasn't, return the previous selection. That signals\n // to React that the selections are conceptually equal, and we can bail\n // out of rendering.\n\n // If a custom isEqual function is provided, use that to check if the data\n // has changed. If it hasn't, return the previous selection. That signals\n // to React that the selections are conceptually equal, and we can bail\n // out of rendering.\n if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {\n return prevSelection;\n }\n\n memoizedSnapshot = nextSnapshot;\n memoizedSelection = nextSelection;\n return nextSelection;\n }; // Assigning this to a constant so that Flow knows it can't change.\n\n\n // Assigning this to a constant so that Flow knows it can't change.\n var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;\n\n var getSnapshotWithSelector = function () {\n return memoizedSelector(getSnapshot());\n };\n\n var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n };\n return [getSnapshotWithSelector, getServerSnapshotWithSelector];\n }, [getSnapshot, getServerSnapshot, selector, isEqual]),\n getSelection = _useMemo[0],\n getServerSelection = _useMemo[1];\n\n var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);\n useEffect(function () {\n inst.hasValue = true;\n inst.value = value;\n }, [value]);\n useDebugValue(value);\n return value;\n}\n\nexports.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());\n}\n \n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport { useDebugValue } from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nfunction useStore(api, selector = api.getState, equalityFn) {\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n '[DEPRECATED] Passing a vanilla store will be unsupported in the future version. Please use `import { useStore } from \"zustand\"` to use the vanilla store in React.'\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] default export is deprecated, instead import { create } from'zustand'\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","/**\n * Check if element or parent has className.\n * @param {DOMElement} element\n * @param {string} className\n */\nexport const hasClass = (element, className) =>\n element.classList && element.classList.contains(className);\n\nexport const insideClass = (element, className) => {\n if (hasClass(element, className)) {\n return element;\n }\n if (!element.parentNode) {\n return false;\n }\n return insideClass(element.parentNode, className);\n};\n\nexport const distance = ([x1, y1], [x2, y2]) => {\n const distanceX = Math.abs(x1 - x2);\n const distanceY = Math.abs(y1 - y2);\n\n return Math.hypot(distanceX, distanceY);\n};\n\nexport const rotateCoordinates = (x, y, angle) => {\n const angleInRadians = (angle * Math.PI) / 180;\n\n const xRotated = x * Math.cos(angleInRadians) - y * Math.sin(angleInRadians);\n const yRotated = x * Math.sin(angleInRadians) + y * Math.cos(angleInRadians);\n\n return [xRotated, yRotated];\n};\n\nexport const transformFrom = (\n [x, y],\n { scale, rotate, translateX, translateY }\n) => {\n const xScaled = (x - translateX) / scale;\n const yScaled = (y - translateY) / scale;\n\n return rotateCoordinates(xScaled, yScaled, -rotate);\n};\n\nexport const transformTo = (\n [x, y],\n { scale, rotate, translateX, translateY }\n) => {\n const [xInvRotated, yInvRotated] = rotateCoordinates(x, y, rotate);\n return [xInvRotated * scale + translateX, yInvRotated * scale + translateY];\n};\n\nexport const intersectSegmentCircle = (p1, p2, circle, radius) => {\n const Ax = p1.x,\n Ay = p1.y;\n const Bx = p2.x,\n By = p2.y;\n const Cx = circle.x,\n Cy = circle.y;\n\n const Dx = Bx - Ax,\n Dy = By - Ay;\n const Ex = Ax - Cx,\n Ey = Ay - Cy;\n\n const a = Dx * Dx + Dy * Dy;\n const b = 2 * (Ex * Dx + Ey * Dy);\n const c = Ex * Ex + Ey * Ey - radius * radius;\n\n const discriminant = b * b - 4 * a * c;\n\n if (discriminant < 0) {\n return []; // No intersection\n }\n\n const t1 = (-b + Math.sqrt(discriminant)) / (2 * a);\n const t2 = (-b - Math.sqrt(discriminant)) / (2 * a);\n\n const intersections = [];\n\n if (t1 >= 0 && t1 <= 1) {\n intersections.push({ x: Ax + t1 * Dx, y: Ay + t1 * Dy });\n }\n\n if (t2 >= 0 && t2 <= 1) {\n intersections.push({ x: Ax + t2 * Dx, y: Ay + t2 * Dy });\n }\n\n return intersections;\n};\n\nexport const getParent = (initialElem, selector) => {\n for (\n let elem = initialElem;\n elem && elem !== document;\n elem = elem.parentNode\n ) {\n if (selector(elem)) return elem;\n }\n return null;\n};\n\nexport const isPointInsideRect = (point, rect) =>\n point.x > rect.left &&\n point.x < rect.left + rect.width &&\n point.y > rect.top &&\n point.y < rect.top + rect.height;\n\nexport const isItemInsideRect = (itemElement, rect) => {\n const fourElem = Array.from(itemElement.querySelectorAll(\".corner\"));\n\n return fourElem.every((corner) => {\n const { top: y, left: x } = corner.getBoundingClientRect();\n return isPointInsideRect({ x, y }, rect);\n });\n};\n\nexport const isItemInsideElement = (itemElement, otherElem) => {\n const rect = otherElem.getBoundingClientRect();\n\n const result = isItemInsideRect(itemElement, rect);\n return result;\n};\n\nexport const getItemElem = (uid, itemId) => {\n try {\n const elem = document.getElementById(`${uid}__${itemId}`);\n if (!elem) {\n console.error(`Missing item ${itemId}`);\n }\n return elem;\n } catch (e) {\n console.error(\n `Error while getting item with id ${itemId} inside wrapper`,\n uid\n );\n return undefined;\n }\n};\n\nexport const getIdFromElem = (elem) => {\n const value = elem?.dataset?.id;\n if (!value) {\n // eslint-disable-next-line no-console\n console.error(\n \"getIdFromElem call fails\",\n elem,\n JSON.stringify(elem?.dataset),\n elem?.dataset?.id\n );\n }\n return value;\n};\n\nexport const getItemsBoundingBox = (itemIds, uid) => {\n const result = itemIds.reduce((prev, itemId) => {\n const elem = getItemElem(uid, itemId);\n\n if (!elem) {\n if (!prev) {\n return null;\n }\n return prev;\n }\n\n const { left, right, top, bottom } = elem.getBoundingClientRect();\n\n let boundingBox;\n\n if (!prev) {\n boundingBox = {\n left,\n top,\n right,\n bottom,\n };\n } else {\n boundingBox = prev;\n }\n\n boundingBox.left = Math.min(left, boundingBox.left);\n boundingBox.top = Math.min(top, boundingBox.top);\n boundingBox.right = Math.max(right, boundingBox.right);\n boundingBox.bottom = Math.max(bottom, boundingBox.bottom);\n\n return boundingBox;\n }, null);\n\n if (!result) {\n return result;\n }\n\n result.width = result.right - result.left;\n result.height = result.bottom - result.top;\n\n return result;\n};\n\nconst getLinkedItemsRecursive = (itemMap, itemIds, alreadyMet = null) => {\n if (alreadyMet === null) {\n alreadyMet = new Set();\n }\n\n if (!Array.isArray(itemIds) || itemIds.length === 0) {\n return [];\n }\n\n return itemIds\n .map((itemId) => {\n if (alreadyMet.has(itemId)) {\n return [];\n } else {\n alreadyMet.add(itemId);\n if (itemMap[itemId]) {\n // If the item has been removed but not from linked list\n return [\n itemId,\n ...getLinkedItemsRecursive(\n itemMap,\n itemMap[itemId].linkedItems,\n alreadyMet\n ),\n ];\n } else {\n return [];\n }\n }\n })\n .flat();\n};\n\nexport const getLinkedItems = (itemMap, orderedItemIds, itemIds) => {\n const linkedItems = new Set(getLinkedItemsRecursive(itemMap, itemIds));\n return orderedItemIds.filter((itemId) => linkedItems.has(itemId));\n};\n\nexport const snapToGrid = (\n { x, y, width, height },\n { type = \"grid\", size = 1, offset = { x: 0, y: 0 } }\n) => {\n const [centerX, centerY] = [\n x + width / 2 - offset.x,\n y + height / 2 - offset.y,\n ];\n\n let newX;\n let newY;\n let sizeX;\n let sizeY;\n let px1;\n let px2;\n let py1;\n let py2;\n let diff1;\n let diff2;\n const h = size / 1.1547;\n\n switch (type) {\n case \"grid\":\n newX = Math.round(centerX / size) * size;\n newY = Math.round(centerY / size) * size;\n break;\n case \"hexH\":\n sizeX = 2 * h;\n sizeY = 3 * size;\n px1 = Math.round(centerX / sizeX) * sizeX;\n py1 = Math.round(centerY / sizeY) * sizeY;\n\n px2 = px1 > centerX ? px1 - h : px1 + h;\n py2 = py1 > centerY ? py1 - 1.5 * size : py1 + 1.5 * size;\n\n diff1 = Math.hypot(...[px1 - centerX, py1 - centerY]);\n diff2 = Math.hypot(...[px2 - centerX, py2 - centerY]);\n\n if (diff1 < diff2) {\n newX = px1;\n newY = py1;\n } else {\n newX = px2;\n newY = py2;\n }\n break;\n case \"hexV\":\n sizeX = 3 * size;\n sizeY = 2 * h;\n px1 = Math.round(centerX / sizeX) * sizeX;\n py1 = Math.round(centerY / sizeY) * sizeY;\n\n px2 = px1 > centerX ? px1 - 1.5 * size : px1 + 1.5 * size;\n py2 = py1 > centerY ? py1 - h : py1 + h;\n\n diff1 = Math.hypot(...[px1 - centerX, py1 - centerY]);\n diff2 = Math.hypot(...[px2 - centerX, py2 - centerY]);\n\n if (diff1 < diff2) {\n newX = px1;\n newY = py1;\n } else {\n newX = px2;\n newY = py2;\n }\n break;\n default:\n newX = x + width / 2;\n newY = y + height / 2;\n }\n\n return {\n x: newX + offset.x - width / 2,\n y: newY + offset.y - height / 2,\n };\n};\n\nconst colors = [\n \"#037758\",\n \"#99092a\",\n \"#067070\",\n \"#c6650f\",\n \"#008726\",\n \"#3d7004\",\n \"#348402\",\n \"#057f58\",\n \"#b58612\",\n \"#c44c01\",\n \"#0a7704\",\n \"#0e910e\",\n \"#027377\",\n \"#c99e02\",\n \"#054160\",\n \"#157a01\",\n \"#b10de2\",\n \"#0d6289\",\n \"#bc5d03\",\n \"#ba0cd1\",\n \"#d39f10\",\n \"#0c4c7a\",\n \"#460782\",\n \"#a51f10\",\n \"#cecb10\",\n \"#9b0943\",\n \"#607f0c\",\n \"#007a4b\",\n \"#bf0daa\",\n \"#af0ad8\",\n];\n\nexport const getRandomColor = () =>\n colors[Math.floor(Math.random() * colors.length)];\n\nconst debug = false;\n\nexport const syncMiddleware =\n ({ wire, storeName, noSync = [], defaultValue }, config) =>\n (set, get, api) => {\n set({ ready: false });\n const unsubs = [];\n const init = async () => {\n try {\n // Try to get the initial value from a peer\n const newValue = await wire.call(`${storeName}_getValue`);\n debug && console.log(\"init from peer with value\", newValue);\n set((state) => ({ ...state, ...newValue }));\n } catch {\n //console.log(`No peers for ${storeName}...`);\n if (defaultValue !== undefined) {\n set(defaultValue);\n }\n }\n unsubs.push(\n await wire.register(\n `${storeName}_getValue`,\n () => {\n return Object.fromEntries(\n Object.entries(get()).filter(\n ([key, value]) =>\n typeof value !== \"function\" && !noSync.includes(key)\n )\n );\n },\n { invoke: \"first\" }\n )\n );\n // Register the sync callback\n unsubs.push(\n wire.subscribe(`${storeName}_call`, ([methodName, args]) => {\n debug && console.log(\"receive\", methodName, args);\n previousFn[methodName](...args);\n })\n );\n set({ ready: true });\n };\n init();\n\n const result = config(set, get, api);\n const previousFn = { ...result };\n\n const syncResult = Object.fromEntries(\n // Send the update message on all method calls\n Object.entries(result).map(([key, fn]) => {\n if (\n typeof fn === \"function\" &&\n !key.startsWith(\"get\") &&\n !noSync.includes(key)\n ) {\n const newFn = (...args) => {\n debug && console.log(\"call\", key, args);\n const result = fn(...args);\n wire.publish(`${storeName}_call`, [key, args]);\n return result;\n };\n return [key, newFn];\n }\n return [key, fn];\n })\n );\n\n syncResult.unsub = () => {\n unsubs.forEach((unsub) => unsub());\n };\n\n return syncResult;\n };\n","function shallow(objA, objB) {\n if (Object.is(objA, objB)) {\n return true;\n }\n if (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) {\n return false;\n }\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size)\n return false;\n for (const [key, value] of objA) {\n if (!Object.is(value, objB.get(key))) {\n return false;\n }\n }\n return true;\n }\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size)\n return false;\n for (const value of objA) {\n if (!objB.has(value)) {\n return false;\n }\n }\n return true;\n }\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) {\n return false;\n }\n for (let i = 0; i < keysA.length; i++) {\n if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n return true;\n}\nvar shallow$1 = (objA, objB) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] default export is deprecated, instead import { shallow } from'zustand/shallow'\"\n );\n }\n return shallow(objA, objB);\n};\n\nexport { shallow$1 as default, shallow };\n","import React, { useContext } from \"react\";\nimport { createStore, useStore } from \"zustand\";\n\nimport useWire from \"@/hooks/useWire\";\nimport { syncMiddleware } from \"@/utils\";\nimport { shallow } from \"zustand/shallow\";\n\nconst Context = React.createContext();\n\nconst itemsStore = (set, get) => ({\n items: {},\n getItems: () => get().items,\n setItems: (newItems) => set({ items: newItems }),\n updateItems: (toUpdate, patch = false) =>\n set((state) => {\n if (patch) {\n const newItems = Object.fromEntries(\n Object.entries(state.items).map(([id, item]) => {\n if (toUpdate[id]) {\n return [id, { ...item, ...toUpdate[id] }];\n } else {\n return [id, item];\n }\n })\n );\n return { items: newItems };\n } else {\n return { items: { ...state.items, ...toUpdate } };\n }\n }),\n moveItems: (itemIds, posDelta) =>\n set(({ items: prevItems }) => {\n const newItems = { ...prevItems };\n itemIds.forEach((id) => {\n const item = prevItems[id];\n\n if (!item) {\n return;\n }\n\n newItems[id] = {\n ...item,\n x: (item.x || 0) + posDelta.x,\n y: (item.y || 0) + posDelta.y,\n moving: true,\n };\n });\n\n return { items: newItems };\n }),\n});\n\nconst itemIdsStore = (set, get) => ({\n itemIds: [],\n setItemIds: (newValue) => set({ itemIds: newValue }),\n getItemIds: () => get().itemIds,\n insert: (position, value) =>\n set((state) => {\n const newValue = [...state.itemIds];\n newValue.splice(position, 0, value);\n return { itemIds: newValue };\n }),\n remove: (position) =>\n set((state) => {\n const newValue = [...state.itemIds];\n newValue.splice(position, 1);\n return { itemIds: newValue };\n }),\n updateItemIds: (position, value) =>\n set((state) => {\n const newValue = [...state.itemIds];\n newValue[position] = value;\n return { items: newValue };\n }),\n updateManyItemIds: (toUpdate) =>\n set((state) => {\n return {\n items: state.itemIds.map((value, index) => {\n if (toUpdate[index] !== undefined) {\n return toUpdate[index];\n } else {\n return value;\n }\n }),\n };\n }),\n});\n\nconst commonStore = (set, get) => ({\n removeItemsById: (itemIdsToRemove) =>\n set((state) => {\n return {\n itemIds: state.itemIds.filter((id) => !itemIdsToRemove.includes(id)),\n items: Object.fromEntries(\n Object.entries(state.items).filter(\n ([id]) => !itemIdsToRemove.includes(id)\n )\n ),\n };\n }),\n getItemList: () => {\n const items = get().items;\n return get().itemIds.map((id) => items[id]);\n },\n setItemList: (itemList) =>\n set({\n items: Object.fromEntries(itemList.map((item) => [item.id, item])),\n itemIds: itemList.map(({ id }) => id),\n }),\n insertItems: (newItems, beforeId) =>\n set((state) => {\n let newItemIds;\n const itemIdsToAdd = newItems.map(({ id }) => id);\n if (beforeId) {\n const insertAt = state.itemIds.findIndex((id) => id === beforeId);\n newItemIds = [...state.itemIds];\n newItemIds.splice(insertAt, 0, ...itemIdsToAdd);\n } else {\n newItemIds = [...state.itemIds, ...itemIdsToAdd];\n }\n\n return {\n items: {\n ...state.items,\n ...Object.fromEntries(newItems.map((item) => [item.id, item])),\n },\n itemIds: newItemIds,\n };\n }),\n});\n\nconst boardStore = (set, get) => ({\n boardConfig: {},\n getBoardConfig: () => get().boardConfig,\n setBoardConfig: (newBoardConfig) => set({ boardConfig: newBoardConfig }),\n updateBoardConfig: (toUpdate) =>\n set((state) => ({ boardConfig: { ...state.boardConfig, ...toUpdate } })),\n});\n\nconst sessionInfoStore = (set, get) => ({\n session: {},\n getSessionInfo: () => get().session,\n setSessionInfo: (newSession) => set({ session: newSession }),\n updateSessionInfo: (toUpdate) =>\n set((state) => ({ session: { ...state.session, ...toUpdate } })),\n});\n\nexport const SyncedStoreProvider = ({ storeName, children, defaultValue }) => {\n const { wire } = useWire(\"room\");\n const [ready, setReady] = React.useState(false);\n const [store] = React.useState(() =>\n createStore(\n syncMiddleware({ wire, storeName, defaultValue }, (...args) => ({\n ...itemsStore(...args),\n ...itemIdsStore(...args),\n ...commonStore(...args),\n ...boardStore(...args),\n ...sessionInfoStore(...args),\n }))\n )\n );\n\n React.useEffect(() => {\n let mounted = true;\n // Wait for ready event\n const unsubscribe = store.subscribe((newValue) => {\n if (newValue.ready) {\n // No need to listen anymore\n unsubscribe();\n if (mounted) {\n setReady(true);\n }\n }\n });\n () => {\n mounted = false;\n unsubscribe();\n };\n }, [store]);\n\n if (!ready) {\n return null;\n }\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useSyncedStore = (selector, equalityFn) => {\n const store = useContext(Context);\n return useStore(store, selector, equalityFn ? equalityFn : shallow);\n};\n","import React from \"react\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nconst useItems = () => {\n const [itemIds, items] = useSyncedStore((state) => [\n state.itemIds,\n state.items,\n ]);\n\n const itemList = React.useMemo(\n () => itemIds.map((id) => items[id]),\n [itemIds, items]\n );\n\n return itemList;\n};\n\nexport default useItems;\n","import React from \"react\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nconst useDebouncedItems = () => {\n const [items, itemIds, getItemList] = useSyncedStore((state) => [\n state.items,\n state.itemIds,\n state.getItemList,\n ]);\n const [debouncedItems, setDebouncedItems] = React.useState(getItemList());\n const [, startTransition] = React.useTransition();\n\n React.useEffect(() => {\n const currentItemList = getItemList();\n startTransition(() => {\n setDebouncedItems(currentItemList);\n });\n }, [items, itemIds, getItemList]);\n\n return debouncedItems;\n};\n\nexport default useDebouncedItems;\n","export const DEFAULT_BOARD_MAX_SIZE = 50000;\n\nexport default { DEFAULT_BOARD_MAX_SIZE };\n","import React, { useContext } from \"react\";\nimport { createStore, useStore } from \"zustand\";\nimport { shallow } from \"zustand/shallow\";\nimport { DEFAULT_BOARD_MAX_SIZE } from \"@/settings\";\n\nconst Context = React.createContext();\n\nconst configuration = (set, get) => ({\n config: {\n itemTemplates: {},\n actions: {},\n uid: null,\n itemExtent: { x: 0, y: 0, radius: 0 },\n boardWrapperRect: {},\n boardSize: DEFAULT_BOARD_MAX_SIZE,\n },\n // TODO optimize when same values as before\n updateConfiguration: (toUpdate) =>\n set((state) => ({ config: { ...state.config, ...toUpdate } })),\n getConfiguration: () => get().config,\n});\nconst boardState = (set, get) => ({\n boardState: {\n movingItems: false,\n selecting: false,\n zooming: false,\n panning: false,\n translateX: 0,\n translateY: 0,\n scale: 1,\n rotate: 0,\n },\n // TODO optimize when same values as before\n updateBoardState: (toUpdate) =>\n set((state) => ({ boardState: { ...state.boardState, ...toUpdate } })),\n getBoardState: () => get().boardState,\n});\n\nconst itemInteractions = (set, get) => ({\n interactions: {},\n getInteractions: () => get().interactions,\n register: (interaction, callback) =>\n set((state) => {\n const nextInteraction = [...(state.interactions[interaction] || [])];\n nextInteraction.push(callback);\n return {\n interactions: { ...state.interactions, [interaction]: nextInteraction },\n };\n }),\n unregister: (interaction, callback) =>\n set((state) => {\n const nextInteraction = (state.interactions[interaction] || []).filter(\n (c) => c !== callback\n );\n return {\n interactions: { ...state.interactions, [interaction]: nextInteraction },\n };\n }),\n callInteractions: (interaction, itemIds) => {\n if (!get().interactions[interaction]) return;\n get().interactions[interaction].forEach((callback) => {\n setTimeout(() => callback(itemIds), 0);\n });\n },\n});\n\nconst selection = (set, get) => ({\n selection: [],\n setSelection: (idsToSelect) =>\n set((state) => {\n if (JSON.stringify(state.selection) !== JSON.stringify(idsToSelect)) {\n return { selection: idsToSelect };\n }\n return {};\n }),\n getSelection: () => get().selection,\n select: (idsToAdd) =>\n set((state) => ({\n selection: [...state.selection, ...idsToAdd],\n })),\n unselect: (itemsIdToRemove) =>\n set((state) => ({\n selection: state.selection.filter((id) => !itemsIdToRemove.includes(id)),\n })),\n clear: () =>\n set((state) => {\n if (state.selection.length > 0) {\n return { selection: [] };\n } else {\n return {};\n }\n }),\n reverse: () =>\n set((state) => {\n const reversed = [...state.selection];\n reversed.reverse();\n return { selection: reversed };\n }),\n selectionBox: null,\n setSelectionBox: (newSelectionBox) =>\n set((state) => {\n const prevBB = state.selectionBox;\n if (\n !prevBB ||\n !newSelectionBox ||\n prevBB.top !== newSelectionBox.top ||\n prevBB.left !== newSelectionBox.left ||\n prevBB.width !== newSelectionBox.width ||\n prevBB.height !== newSelectionBox.height\n ) {\n return { selectionBox: newSelectionBox };\n }\n return {};\n }),\n});\n\nexport const MainStoreProvider = ({ children }) => {\n const [store] = React.useState(() =>\n createStore((...args) => ({\n ...configuration(...args),\n ...boardState(...args),\n ...itemInteractions(...args),\n ...selection(...args),\n }))\n );\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useMainStore = (selector, equalityFn) => {\n const store = useContext(Context);\n return useStore(store, selector, equalityFn ? equalityFn : shallow);\n};\n\nexport default useMainStore;\n","import useMainStore from \"../store/main\";\n\nconst useSelectedItems = () => {\n const [selection] = useMainStore((state) => [state.selection]);\n return selection;\n};\n\nexport default useSelectedItems;\n","import useMainStore from \"../store/main\";\n\nconst useGetSelectedItems = () => {\n const [getSelection] = useMainStore((state) => [state.getSelection]);\n return getSelection;\n};\n\nexport default useGetSelectedItems;\n","import { useMemo, useRef } from 'react';\n/**\n * Like `useRef`, but it returns immutable ref that contains actual value.\n *\n * @param value\n */\nexport function useSyncedRef(value) {\n const ref = useRef(value);\n ref.current = value;\n return useMemo(() => Object.freeze({\n get current() {\n return ref.current;\n },\n }), []);\n}\n","import { useEffect } from 'react';\nimport { useSyncedRef } from '../useSyncedRef';\n/**\n * Run effect only when component is unmounted.\n *\n * @param effect Effector to run on unmount\n */\nexport function useUnmountEffect(effect) {\n const effectRef = useSyncedRef(effect);\n useEffect(() => () => {\n effectRef.current();\n }, \n // eslint-disable-next-line react-hooks/exhaustive-deps\n []);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo, useRef } from 'react';\nimport { useUnmountEffect } from '../useUnmountEffect';\n/**\n * Makes passed function debounced, otherwise acts like `useCallback`.\n *\n * @param callback Function that will be debounced.\n * @param deps Dependencies list when to update callback.\n * @param delay Debounce delay.\n * @param maxWait The maximum time `callback` is allowed to be delayed before\n * it's invoked. 0 means no max wait.\n */\nexport function useDebouncedCallback(callback, deps, delay, maxWait = 0) {\n const timeout = useRef();\n const waitTimeout = useRef();\n const lastCall = useRef();\n const clear = () => {\n if (timeout.current) {\n clearTimeout(timeout.current);\n timeout.current = undefined;\n }\n if (waitTimeout.current) {\n clearTimeout(waitTimeout.current);\n waitTimeout.current = undefined;\n }\n };\n // cancel scheduled execution on unmount\n useUnmountEffect(clear);\n return useMemo(() => {\n const execute = () => {\n // barely possible to test this line\n /* istanbul ignore next */\n if (!lastCall.current)\n return;\n const context = lastCall.current;\n lastCall.current = undefined;\n callback.apply(context.this, context.args);\n clear();\n };\n // eslint-disable-next-line func-names\n const wrapped = function (...args) {\n if (timeout.current) {\n clearTimeout(timeout.current);\n }\n lastCall.current = { args, this: this };\n // plan regular execution\n timeout.current = setTimeout(execute, delay);\n // plan maxWait execution if required\n if (maxWait > 0 && !waitTimeout.current) {\n waitTimeout.current = setTimeout(execute, maxWait);\n }\n };\n Object.defineProperties(wrapped, {\n length: { value: callback.length },\n name: { value: `${callback.name || 'anonymous'}__debounced__${delay}` },\n });\n return wrapped;\n }, \n // eslint-disable-next-line react-hooks/exhaustive-deps,@typescript-eslint/no-unsafe-assignment\n [delay, maxWait, ...deps]);\n}\n","import React from \"react\";\nimport { useDebouncedCallback } from \"@react-hookz/web/esm/useDebouncedCallback\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport {\n distance,\n getItemElem,\n intersectSegmentCircle,\n transformFrom,\n transformTo,\n} from \"@/utils\";\nimport useMainStore from \"./store/main\";\n\nconst TOLERANCE = 100;\nconst MIN_SIZE = 1000;\nconst SCALE_TOLERANCE = 0.8;\n\nlet debug = false;\n\n/**\n * Return new board positions fixed to fit inside the board and not too far from the\n * item extent.\n */\nconst translateBoundaries = ({\n x,\n y,\n scale,\n rotate,\n itemExtent,\n boardWrapperRect,\n boardSize,\n}) => {\n let [newX, newY] = [x, y];\n\n const screenCenter = transformFrom(\n [boardWrapperRect.width / 2, boardWrapperRect.height / 2],\n { translateX: newX, translateY: newY, scale, rotate }\n );\n\n const extentPos = {\n x: itemExtent.x + boardSize / 2,\n y: itemExtent.y + boardSize / 2,\n };\n\n const boardCenter = {\n x: boardSize / 2,\n y: boardSize / 2,\n };\n\n const distToExtent = distance(screenCenter, [extentPos.x, extentPos.y]);\n\n // Limit moves to extent\n const minDim = Math.min(boardWrapperRect.width, boardWrapperRect.height);\n const maxDistToExtent =\n itemExtent.radius + minDim / 2 / scale - TOLERANCE / scale;\n\n if (distToExtent > maxDistToExtent) {\n const inter = intersectSegmentCircle(\n { x: screenCenter[0], y: screenCenter[1] },\n extentPos,\n extentPos,\n maxDistToExtent - 1 / scale\n )[0];\n\n const [translateX, translateY] = transformTo([-inter.x, -inter.y], {\n translateX: boardWrapperRect.width / 2,\n translateY: boardWrapperRect.height / 2,\n scale,\n rotate,\n });\n\n newX = translateX;\n newY = translateY;\n }\n\n // Limit move to board limit\n const distToCenter = distance(screenCenter, [boardCenter.x, boardCenter.y]);\n const maxDistToCenter =\n boardSize / 2 -\n distance([0, 0], [boardWrapperRect.width, boardWrapperRect.height]) / scale;\n\n if (distToCenter > maxDistToCenter) {\n const inter = intersectSegmentCircle(\n { x: screenCenter[0], y: screenCenter[1] },\n boardCenter,\n boardCenter,\n maxDistToCenter - 1 / scale\n )[0];\n\n if (inter) {\n const [translateX, translateY] = transformTo([-inter.x, -inter.y], {\n translateX: boardWrapperRect.width / 2,\n translateY: boardWrapperRect.height / 2,\n scale,\n rotate,\n });\n\n newX = translateX;\n newY = translateY;\n }\n }\n\n return [newX, newY];\n};\n\nconst useDim = () => {\n const [\n getBoardState,\n updateBoardState,\n itemExtentGlobal,\n getConfiguration,\n updateConfiguration,\n ] = useMainStore((state) => [\n state.getBoardState,\n state.updateBoardState,\n state.config.itemExtent,\n state.getConfiguration,\n state.updateConfiguration,\n ]);\n const scaleBoundariesRef = React.useRef([0.15, 5]);\n\n const [getItemList] = useSyncedStore((state) => [state.getItemList]);\n\n const getDim = React.useCallback(() => {\n const { translateX, translateY, scale, rotate } = getBoardState();\n return { translateX, translateY, scale, rotate };\n }, [getBoardState]);\n\n const fromWrapperToBoard = React.useCallback(\n (x, y) => {\n return transformFrom([x, y], getBoardState());\n },\n [getBoardState]\n );\n\n const fromBoardToWrapper = React.useCallback(\n (x, y) => {\n return transformTo([x, y], getBoardState());\n },\n [getBoardState]\n );\n\n const vectorFromWrapperToBoard = React.useCallback(\n (x, y) => {\n const { scale, rotate } = getBoardState();\n\n return transformFrom([x, y], {\n translateX: 0,\n translateY: 0,\n rotate,\n scale,\n });\n },\n [getBoardState]\n );\n\n /**\n * Clamp scale to boundaries limits.\n */\n const clampScale = React.useCallback((scale) => {\n if (scale > scaleBoundariesRef.current[1]) {\n return scaleBoundariesRef.current[1];\n }\n\n if (scale < scaleBoundariesRef.current[0]) {\n return scaleBoundariesRef.current[0];\n }\n return scale;\n }, []);\n\n /**\n * Set board position safely by avoiding to go out of the dedicated space.\n */\n const setDimSafe = React.useCallback(\n (fn) => {\n const { itemExtent, boardWrapperRect, boardSize } = getConfiguration();\n\n const prev = getBoardState();\n\n const {\n translateX,\n translateY,\n scale,\n rotate: newRotate,\n } = {\n ...prev,\n ...fn(prev),\n };\n\n if (debug) console.log(\"New expected values: \", translateX, translateY, scale, newRotate);\n\n const newScale = clampScale(scale);\n\n let [newX, newY] = [translateX, translateY];\n\n if (translateX !== prev.translateX || translateY !== prev.translateY) {\n [newX, newY] = translateBoundaries({\n x: translateX,\n y: translateY,\n scale: newScale,\n rotate: newRotate,\n itemExtent,\n boardWrapperRect,\n boardSize,\n });\n }\n\n if (debug) console.log(\"New fixed values: \", newX, newY, newScale, newRotate);\n\n updateBoardState({\n translateX: isNaN(newX)? 0: newX,\n translateY: isNaN(newY)? 0: newY,\n scale: isNaN(newScale)? clampScale(1): newScale,\n rotate: isNaN(newRotate) ? 0 : newRotate,\n });\n },\n [clampScale, getBoardState, getConfiguration, updateBoardState]\n );\n\n /**\n * Move the board to the given coordinates.\n */\n const moveBoard = React.useCallback(\n (newTranslatOrFn) => {\n let translateFn = (prev) => ({ ...prev, ...newTranslatOrFn });\n if (typeof newTranslatOrFn === \"function\") {\n translateFn = newTranslatOrFn;\n }\n\n setDimSafe((prev) => ({\n ...prev,\n ...translateFn({\n translateX: prev.translateX,\n translateY: prev.translateY,\n }),\n }));\n },\n [setDimSafe]\n );\n\n /**\n * Zoom to factor centered on the given zoomCenter coordinates.\n *\n * zoomCenter is screen coordinates.\n */\n const zoomToCenter = React.useCallback(\n ({ to, factor }) => {\n const { boardWrapperRect } = getConfiguration();\n\n let center = to;\n\n if (!center) {\n center = {\n x: boardWrapperRect.left + boardWrapperRect.width / 2,\n y: boardWrapperRect.top + boardWrapperRect.height / 2,\n };\n }\n\n const prev = getBoardState();\n\n const newScale = clampScale(prev.scale * factor);\n\n const centerX = center.x - boardWrapperRect.left;\n const centerY = center.y - boardWrapperRect.top;\n\n const newTx =\n centerX - ((centerX - prev.translateX) * newScale) / prev.scale;\n const newTy =\n centerY - ((centerY - prev.translateY) * newScale) / prev.scale;\n\n setDimSafe((prev) => ({\n ...prev,\n translateX: newTx,\n translateY: newTy,\n scale: newScale,\n }));\n },\n [clampScale, getBoardState, getConfiguration, setDimSafe]\n );\n\n /**\n * Zoom to the given extent. The full extent will be included in the viewport.\n */\n const zoomToExtent = React.useCallback(\n ({ x, y, radius }) => {\n const { rotate } = getBoardState();\n const { boardWrapperRect, boardSize } = getConfiguration();\n\n const [safeX, safeY, safeRadius] = [x || 0, y||0, radius || 2000]\n\n const scaleX = boardWrapperRect.width / (safeRadius * 2);\n const scaleY = boardWrapperRect.height / (safeRadius * 2);\n\n // The scale that fits in all dimensions with a border around\n const scale = clampScale(Math.min(scaleX, scaleY) * SCALE_TOLERANCE);\n\n\n // We apply the board transformations\n const [translateX, translateY] = transformTo(\n [-boardSize / 2 - safeX, -boardSize / 2 - safeY],\n {\n translateX: boardWrapperRect.width / 2,\n translateY: boardWrapperRect.height / 2,\n scale,\n rotate,\n }\n );\n\n setDimSafe((prev) => ({ ...prev, translateX, translateY, scale }));\n },\n [clampScale, getBoardState, getConfiguration, setDimSafe]\n );\n\n /**\n * Get the board coordinates pointed by the center of the screen.\n */\n const getCenterCoordinates = React.useCallback(() => {\n const { boardWrapperRect, boardSize } = getConfiguration();\n const [x, y] = fromWrapperToBoard(\n boardWrapperRect.width / 2,\n boardWrapperRect.height / 2\n );\n return {\n x: x - boardSize / 2,\n y: y - boardSize / 2,\n };\n }, [fromWrapperToBoard, getConfiguration]);\n\n /**\n * Update the extent of all board items.\n */\n const updateItemExtent = React.useCallback(() => {\n // Update item extent\n const items = getItemList();\n const { boardSize, uid } = getConfiguration();\n\n const newRes = items.reduce(\n (boundingBox, item) => {\n const elem = getItemElem(uid, item.id);\n\n if (elem) {\n boundingBox.left = Math.min(item.x, boundingBox.left);\n boundingBox.top = Math.min(item.y, boundingBox.top);\n\n boundingBox.right = Math.max(\n item.x + elem.offsetWidth,\n boundingBox.right\n );\n boundingBox.bottom = Math.max(\n item.y + elem.offsetHeight,\n boundingBox.bottom\n );\n }\n\n return boundingBox;\n },\n {\n left: boardSize / 2,\n top: boardSize / 2,\n right: -boardSize / 2,\n bottom: -boardSize / 2,\n }\n );\n\n const final = {\n x: (newRes.right + newRes.left) / 2,\n y: (newRes.bottom + newRes.top) / 2,\n };\n\n final.radius = Math.max(\n distance([final.x, final.y], [newRes.left, newRes.top]),\n MIN_SIZE\n );\n\n updateConfiguration({ itemExtent: final });\n }, [getConfiguration, getItemList, updateConfiguration]);\n\n /**\n * Rotate the board to the given angle in degrees. If a function is given, it is\n * called with the previous angle as parameter and should return a new angle.\n */\n const rotateBoard = React.useCallback(\n (newAngleOrFn) => {\n let applyRotate = () => newAngleOrFn;\n if (typeof newAngleOrFn === \"function\") {\n applyRotate = newAngleOrFn;\n }\n\n setDimSafe((prev) => ({ ...prev, rotate: applyRotate(prev.rotate) }));\n\n // Zoom to new extent to not being lost\n updateItemExtent();\n zoomToExtent(itemExtentGlobal);\n },\n [itemExtentGlobal, setDimSafe, updateItemExtent, zoomToExtent]\n );\n\n const debouncedUpdateItemExtent = useDebouncedCallback(\n () => updateItemExtent(),\n [updateItemExtent],\n 200\n );\n\n React.useEffect(() => {\n window.debugUpdateExtent = () => updateItemExtent();\n window.debugDisplayExtent = () =>\n console.log(getConfiguration().itemExtent);\n window.debugSetDebug = () => {\n debug = true;\n }\n }, [getConfiguration, updateItemExtent]);\n\n return {\n setDim: setDimSafe,\n rotateBoard,\n moveBoard,\n getDim,\n zoomTo: zoomToCenter,\n zoomToCenter,\n zoomToExtent,\n getCenter: getCenterCoordinates,\n updateItemExtent: debouncedUpdateItemExtent,\n vectorFromWrapperToBoard,\n fromWrapperToBoard,\n fromBoardToWrapper,\n };\n};\n\nexport default useDim;\n","import React from \"react\";\nimport useMainStore from \"../store/main\";\n\nconst useItemInteraction = (interaction) => {\n const [registerInStore, unregister, callInteractions] = useMainStore(\n ({ register, unregister, callInteractions }) => [\n register,\n unregister,\n callInteractions,\n ]\n );\n\n const register = React.useCallback(\n (callback) => {\n registerInStore(interaction, callback);\n return () => {\n unregister(interaction, callback);\n };\n },\n [interaction, registerInStore, unregister]\n );\n\n const call = React.useCallback(\n (itemIds) => {\n callInteractions(interaction, itemIds);\n },\n [callInteractions, interaction]\n );\n\n return { register, call };\n};\n\nexport default useItemInteraction;\n","import React from \"react\";\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nimport useDim from \"../useDim\";\n\nimport {\n getItemElem,\n isPointInsideRect,\n insideClass,\n hasClass,\n snapToGrid,\n getLinkedItems,\n} from \"@/utils\";\n\nimport useItemInteraction from \"./useItemInteraction\";\nimport useMainStore from \"../store/main\";\n\nconst useItemActions = () => {\n const { call: callPlaceInteractions } = useItemInteraction(\"place\");\n const { call: callDeleteInteractions } = useItemInteraction(\"delete\");\n const { getCenter, updateItemExtent } = useDim();\n\n const [clearSelection, reverseSelection, unselect, getConfiguration] =\n useMainStore((state) => [\n state.clear,\n state.reverse,\n state.unselect,\n state.getConfiguration,\n ]);\n\n const {\n getItems: getStoreItems,\n getItemIds,\n setItemIds,\n updateItems,\n moveItems: moveStoreItems,\n removeItemsById,\n getItemList,\n insertItems,\n setItemList,\n } = useSyncedStore(\n ({\n getItems,\n getItemIds,\n setItemIds,\n updateItems,\n moveItems,\n removeItemsById,\n getItemList,\n insertItems,\n setItemList,\n }) => ({\n getItems,\n getItemIds,\n setItemIds,\n updateItems,\n moveItems,\n removeItemsById,\n getItemList,\n insertItems,\n setItemList,\n })\n );\n\n const batchUpdateItems = React.useCallback(\n (itemIds, callbackOrItem, patch = false) => {\n let callback = callbackOrItem;\n if (typeof callbackOrItem === \"object\") {\n callback = () => callbackOrItem;\n }\n\n const orderedItemIds = getItemIds().filter((id) => itemIds.includes(id));\n\n const prevMap = getStoreItems();\n\n const updateList = orderedItemIds\n .map((id) => {\n const prevItem = prevMap[id];\n if (patch) {\n return [id, callback(prevItem)];\n } else {\n return [id, callback({ ...prevItem })];\n }\n })\n .filter(([, value]) => value);\n\n // If the update list is empty then we are patching and no modifications are\n // applied\n if (updateList.length === 0) {\n return;\n }\n\n const toUpdate = Object.fromEntries(updateList);\n\n updateItems(toUpdate, patch);\n\n updateItemExtent();\n },\n [getItemIds, getStoreItems, updateItemExtent, updateItems]\n );\n\n const setItemListFull = React.useCallback(\n (itemList) => {\n setItemList(itemList);\n\n // Reset item selection as we are changing all items\n clearSelection();\n updateItemExtent();\n },\n [clearSelection, setItemList, updateItemExtent]\n );\n\n const updateItem = React.useCallback(\n (id, callbackOrItem, patch = false) => {\n batchUpdateItems([id], callbackOrItem, patch);\n },\n [batchUpdateItems]\n );\n\n const moveItems = React.useCallback(\n (itemIds, posDelta) => {\n moveStoreItems(\n getLinkedItems(getStoreItems(), getItemIds(), itemIds),\n posDelta\n );\n },\n [getItemIds, getStoreItems, moveStoreItems]\n );\n\n const putItemsOnTop = React.useCallback(\n (itemIdsToMove) => {\n const prevItemIds = getItemIds();\n const filtered = prevItemIds.filter((id) => !itemIdsToMove.includes(id));\n const toBePutOnTop = prevItemIds.filter((id) =>\n itemIdsToMove.includes(id)\n );\n\n setItemIds([...filtered, ...toBePutOnTop]);\n },\n [getItemIds, setItemIds]\n );\n\n const stickOnGrid = React.useCallback(\n (itemIds, { type: globalType, size: globalSize } = {}) => {\n const { uid } = getConfiguration();\n\n batchUpdateItems(\n itemIds,\n (item) => {\n const elem = getItemElem(uid, item.id);\n\n if (!elem) {\n return;\n }\n\n const gridConfig = {\n type: globalType || \"grid\",\n size: globalSize || 1,\n offset: { x: 0, y: 0 },\n ...item.grid,\n };\n\n const newPos = snapToGrid(\n {\n x: item.x,\n y: item.y,\n width: elem.clientWidth,\n height: elem.clientHeight,\n },\n gridConfig\n );\n\n return newPos;\n },\n true\n );\n },\n [getConfiguration, batchUpdateItems]\n );\n\n const placeItems = React.useCallback(\n (itemIds, gridConfig) => {\n // Put all moved items on top\n const itemIdsWithLinkedItems = getLinkedItems(\n getStoreItems(),\n getItemIds(),\n itemIds\n );\n\n putItemsOnTop(itemIdsWithLinkedItems);\n\n // Remove moving state\n batchUpdateItems(itemIdsWithLinkedItems, { moving: false }, true);\n\n stickOnGrid(itemIdsWithLinkedItems, gridConfig);\n callPlaceInteractions(itemIds);\n\n updateItemExtent();\n },\n [\n batchUpdateItems,\n callPlaceInteractions,\n getItemIds,\n getStoreItems,\n putItemsOnTop,\n stickOnGrid,\n updateItemExtent,\n ]\n );\n\n const updateItemOrder = React.useCallback(\n (newOrder) => {\n setItemIds(newOrder);\n },\n [setItemIds]\n );\n\n const reverseItemsOrder = React.useCallback(\n (itemIdsToReverse) => {\n const prevItemIds = getItemIds();\n\n const toBeReversed = prevItemIds.filter((id) =>\n itemIdsToReverse.includes(id)\n );\n const newOrder = prevItemIds.map((itemId) => {\n if (itemIdsToReverse.includes(itemId)) {\n return toBeReversed.pop();\n }\n return itemId;\n });\n\n setItemIds(newOrder);\n\n reverseSelection();\n },\n [getItemIds, reverseSelection, setItemIds]\n );\n\n const swapItems = React.useCallback(\n (fromIds, toIds) => {\n const prevItemMap = getStoreItems();\n\n const newCoordinatesMap = Object.fromEntries(\n toIds.map((toItemId, index) => {\n const replaceWith = prevItemMap[fromIds[index]];\n return [\n toItemId,\n {\n x: replaceWith.x,\n y: replaceWith.y,\n },\n ];\n })\n );\n\n batchUpdateItems(\n fromIds,\n (item) => {\n return newCoordinatesMap[item.id];\n },\n true\n );\n\n const replaceMap = Object.fromEntries(\n fromIds.map((id, index) => [id, toIds[index]])\n );\n\n // swap also the item order\n const reorderedItemIds = getItemIds().map((itemId) => {\n if (fromIds.includes(itemId)) {\n return replaceMap[itemId];\n }\n return itemId;\n });\n\n setItemIds(reorderedItemIds);\n },\n [getStoreItems, batchUpdateItems, getItemIds, setItemIds]\n );\n\n const pushItems = React.useCallback(\n (itemsToInsert, beforeId) => {\n const center = getCenter();\n\n const itemsWithPosition = itemsToInsert.map((item, index) => {\n if (!item.x || !item.y) {\n return { ...item, x: center.x + 2 * index, y: center.y + 2 * index };\n }\n return item;\n });\n\n insertItems(itemsWithPosition, beforeId);\n placeItems(itemsToInsert.map(({ id }) => id));\n },\n [getCenter, insertItems, placeItems]\n );\n\n const pushItem = React.useCallback(\n (itemToInsert, beforeId) => {\n pushItems([itemToInsert], beforeId);\n },\n [pushItems]\n );\n\n const removeItems = React.useCallback(\n (itemsIdToRemove) => {\n // Remove from selected items first\n unselect(itemsIdToRemove);\n\n removeItemsById(itemsIdToRemove);\n callDeleteInteractions(itemsIdToRemove);\n },\n [unselect, removeItemsById, callDeleteInteractions]\n );\n\n const getItems = React.useCallback(\n (itemIds) => {\n const itemMap = getStoreItems();\n return itemIds.map((id) => itemMap[id]);\n },\n [getStoreItems]\n );\n\n const findElementUnderPointer = React.useCallback(\n (\n { target, clientX, clientY },\n { returnLocked = false, passLocked = false } = {}\n ) => {\n // Allow text selection instead of moving\n if ([\"INPUT\", \"TEXTAREA\"].includes(target.tagName)) return null;\n\n const foundElement = insideClass(target, \"item\");\n\n if (foundElement) {\n if (hasClass(foundElement, \"selected\")) {\n return foundElement;\n }\n\n if (\n !passLocked &&\n hasClass(foundElement, \"locked\") &&\n !hasClass(target, \"passthrough\")\n ) {\n return returnLocked ? foundElement : null;\n }\n\n // Is it a passthrough element?\n if (hasClass(target, \"passthrough\")) {\n // Get current value\n const itemList = getItemIds();\n const { uid } = getConfiguration();\n\n // Found element under the cursor\n const elements = itemList.reduce((prev, itemId) => {\n const elem = getItemElem(uid, itemId);\n const itemRect = elem.getBoundingClientRect();\n if (isPointInsideRect({ x: clientX, y: clientY }, itemRect)) {\n prev.unshift(elem);\n }\n return prev;\n }, []);\n\n // Figure out if one can be returned\n for (let i = 0; i < elements.length; i += 1) {\n const elem = elements[i];\n if (\n elem !== foundElement &&\n (passLocked || !hasClass(elem, \"locked\"))\n ) {\n return elem;\n }\n }\n // Here there is no available elements\n return null;\n }\n }\n return foundElement;\n },\n [getConfiguration, getItemIds]\n );\n\n return {\n putItemsOnTop,\n batchUpdateItems,\n updateItemOrder,\n moveItems,\n placeItems,\n updateItem,\n swapItems,\n reverseItemsOrder,\n setItemList: setItemListFull,\n pushItem,\n pushItems,\n removeItems,\n getItemList,\n findElementUnderPointer,\n getItems,\n };\n};\n\nexport default useItemActions;\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n if ((a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n for (i of a.entries())\n if (!equal(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if ((a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect } from 'react';\nimport { useDebouncedCallback } from '../useDebouncedCallback';\n/**\n * Like `useEffect`, but passed function is debounced.\n *\n * @param callback Callback like for `useEffect`, but without ability to return\n * a cleanup function.\n * @param deps Dependencies list that will be passed to underlying `useEffect`\n * and `useDebouncedCallback`.\n * @param delay Debounce delay.\n * @param maxWait Maximum amount of milliseconds that function can be delayed\n * before it's force execution. 0 means no max wait.\n */\nexport function useDebouncedEffect(callback, deps, delay, maxWait = 0) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(useDebouncedCallback(callback, deps, delay, maxWait), deps);\n}\n","import React, { useCallback } from \"react\";\nimport deepEqual from \"fast-deep-equal/es6\";\n\nimport { useDebouncedEffect } from \"@react-hookz/web/esm/useDebouncedEffect\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"../store/main\";\n\n/**\n * Returns the default actions of an item\n * @param {object} item to consider\n * @param {object} itemMap item template map with default actions\n * @returns An array of default action for this item\n */\nconst getDefaultActionsFromItem = (item, itemMap) => {\n if (item.type in itemMap) {\n const actions = itemMap[item.type].defaultActions;\n if (typeof actions === \"function\") {\n return actions(item);\n }\n return actions;\n }\n\n return [];\n};\n\n/**\n * Returns actual actions from an item ordered by the configured available\n * actions. If no action is defined, default actions are returned.\n * @param {object} item item to use\n * @param {object} itemMap item template map with available action for this item\n * @returns the array of actions for this item\n */\nconst getActionsFromItem = (item, itemMap) => {\n const { actions = getDefaultActionsFromItem(item, itemMap) } = item;\n return actions.map((action) => {\n if (typeof action === \"string\") {\n return { name: action };\n }\n return action;\n });\n};\n\nconst useAvailableActions = () => {\n const [items, getItems] = useSyncedStore((state) => [\n state.items,\n state.getItems,\n ]);\n const [itemTemplates, selection, getSelection] = useMainStore((state) => [\n state.config.itemTemplates,\n state.selection,\n state.getSelection,\n ]);\n const [availableActions, setAvailableActions] = React.useState([]);\n const isMountedRef = React.useRef(false);\n const [, startTransition] = React.useTransition();\n\n React.useEffect(() => {\n // Mounted guard\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n const getItemListOrSelected = React.useCallback(\n (itemIds) => {\n const currentItemMap = getItems();\n if (itemIds) {\n return [itemIds, itemIds.map((id) => currentItemMap[id])];\n }\n const selectedItems = getSelection();\n return [selectedItems, selectedItems.map((id) => currentItemMap[id])];\n },\n [getItems, getSelection]\n );\n\n /**\n * Returns available actions for selected items. An action is kept only if all\n * items have this exact same action with same parameters.\n */\n const updateAvailableActions = useCallback(() => {\n const [selectedItemIds, selectedItemList] = getItemListOrSelected();\n if (selectedItemIds.length > 0) {\n // Prevent set state on unmounted component\n if (!isMountedRef.current) return;\n\n const allActions = selectedItemList.reduce((acc, item) => {\n const itemActions = getActionsFromItem(item, itemTemplates);\n\n return acc.filter((value) =>\n itemActions.some((itemAction) => deepEqual(value, itemAction))\n );\n }, getActionsFromItem(selectedItemList[0], itemTemplates));\n\n startTransition(() => {\n setAvailableActions(allActions);\n });\n } else {\n startTransition(() => {\n setAvailableActions([]);\n });\n }\n }, [getItemListOrSelected, itemTemplates]);\n\n // Debounced update available actions when items or selection change\n useDebouncedEffect(\n () => updateAvailableActions(),\n [items, selection, updateAvailableActions],\n 100\n );\n\n return {\n availableActions,\n };\n};\n\nexport default useAvailableActions;\n","import useMainStore from \"./store/main\";\n\nconst useSelectionBox = () => {\n const [selectionBox] = useMainStore((state) => [state.selectionBox]);\n return selectionBox;\n};\n\nexport default useSelectionBox;\n","import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import React, { useContext } from \"react\";\nimport { createStore, useStore } from \"zustand\";\nimport { shallow } from \"zustand/shallow\";\nimport { getRandomColor } from \"@/utils\";\nimport { nanoid } from \"nanoid\";\n\nimport useWire from \"@/hooks/useWire\";\nimport { syncMiddleware } from \"@/utils\";\n\nconst Context = React.createContext();\n\nexport const persistUser = (user) => {\n localStorage.setItem(\"user\", JSON.stringify(user));\n};\n\nexport const restoreUser = () => {\n if (localStorage.user) {\n // Add some mandatory info if missing\n const localUser = {\n name: \"Player\",\n color: getRandomColor(),\n uid: nanoid(),\n ...JSON.parse(localStorage.user),\n };\n // Id is given by server\n // delete localUser.id;\n persistUser(localUser);\n return localUser;\n }\n const newUser = {\n name: \"Player\",\n color: getRandomColor(),\n uid: nanoid(),\n };\n persistUser(newUser);\n return newUser;\n};\n\nconst usersStore = (curentUserId) => (set, get) => ({\n isSpaceMaster: false,\n users: {},\n getUser: () => get().users[curentUserId],\n getUsers: () => {\n return get().users;\n },\n getUserList: () => Object.values(get().users),\n getLocalUsers: () => {\n if (!get().users[curentUserId]) {\n return [];\n }\n const { space: currentUserSpace } = get().users[curentUserId];\n return get()\n .getUserList()\n .filter(({ space }) => space === currentUserSpace);\n },\n addUser: (newUser) =>\n set((state) => ({ users: { ...state.users, [newUser.id]: newUser } })),\n updateUser: (userId, toUpdate) =>\n set((state) => {\n if (!state.users[userId]) {\n return {};\n }\n const newUser = {\n ...state.users[userId],\n ...toUpdate,\n id: userId,\n uid: state.users[userId].uid,\n };\n if (newUser.id === curentUserId) {\n persistUser(newUser);\n }\n setTimeout(() => get().electSpaceMaster(), 100);\n return {\n users: {\n ...state.users,\n [userId]: newUser,\n },\n };\n }),\n removeUser: (userId) =>\n set((state) => {\n const newUsers = { ...state.users };\n delete newUsers[userId];\n setTimeout(() => get().electSpaceMaster(), 100);\n return { users: newUsers };\n }),\n // Not synchronized methods\n updateCurrentUser: (toUpdate) => get().updateUser(curentUserId, toUpdate),\n joinSpace: (space) =>\n get().updateUser(curentUserId, { space, spaceJoinedTimestamp: Date.now() }),\n electSpaceMaster: () => {\n const localUsers = get().getLocalUsers();\n const master = {\n uid: null,\n timestamp: Date.now(),\n };\n Object.values(localUsers).forEach(({ spaceJoinedTimestamp, id }) => {\n if (spaceJoinedTimestamp < master.timestamp) {\n master.id = id;\n master.timestamp = spaceJoinedTimestamp;\n }\n });\n\n set({ isSpaceMaster: master.id === curentUserId });\n },\n});\n\nconst cursorsStore = (set) => ({\n cursors: {},\n moveCursor: (userId, newPos) =>\n set((state) => ({ cursors: { ...state.cursors, [userId]: newPos } })),\n removeCursor: (userId) =>\n set((state) => {\n const newCursors = { ...state.cursors };\n delete newCursors[userId];\n return { cursors: newCursors };\n }),\n});\n\nexport const SyncedUsersProvider = ({ storeName, children }) => {\n const { wire, isMaster } = useWire(\"room\");\n const [store, setStore] = React.useState(null);\n const [ready, setReady] = React.useState(false);\n const storeRef = React.useRef(false);\n\n React.useEffect(() => {\n let mounted = true;\n const unsubs = [];\n if (!store && !storeRef.current) {\n storeRef.current = true;\n const init = () => {\n // Create store\n const localStore = createStore(\n syncMiddleware(\n {\n wire,\n storeName,\n noSync: [\n \"updateCurrentUser\",\n \"joinSpace\",\n \"isSpaceMaster\",\n \"electSpaceMaster\",\n ],\n },\n (...args) => ({\n ...usersStore(wire.userId)(...args),\n ...cursorsStore(...args),\n }),\n wire,\n storeName\n )\n );\n // Wait for ready event\n const unsubscribe = localStore.subscribe((newValue) => {\n if (newValue.ready) {\n // No need to listen anymore\n unsubscribe();\n if (mounted) {\n setStore(localStore);\n }\n }\n });\n };\n init();\n return () => {\n mounted = false;\n storeRef.current = false;\n unsubs.forEach((unsub) => unsub());\n };\n }\n }, [store, storeName, wire, wire.userId]);\n\n React.useEffect(() => {\n if (store) {\n store.getState().addUser({\n ...restoreUser(),\n id: wire.userId,\n });\n setReady(true);\n return () => {\n store.getState().removeUser(wire.userId);\n };\n }\n }, [isMaster, store, wire]);\n\n React.useEffect(() => {\n if (store) {\n // Listen for userLeave events\n const unsubscribe = wire.subscribe(\"userLeave\", (userId) => {\n store.getState().removeUser(userId);\n });\n return () => {\n unsubscribe();\n };\n }\n }, [isMaster, store, wire]);\n\n React.useEffect(() => {\n if (isMaster && store) {\n // Set master\n store.getState().updateCurrentUser({ isMaster: isMaster });\n }\n }, [isMaster, store, wire]);\n\n if (!ready) {\n return null;\n }\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useSyncedUsers = (selector, equalityFn) => {\n const store = useContext(Context);\n return useStore(store, selector, equalityFn ? equalityFn : shallow);\n};\n","import React from \"react\";\n\nimport { useSyncedUsers } from \"@/users/store\";\n\nconst useUsers = () => {\n const [isSpaceMaster, currentUser, userMap, updateCurrentUser, joinSpace] =\n useSyncedUsers((state) => [\n state.isSpaceMaster,\n state.getUser(),\n state.users,\n state.updateCurrentUser,\n state.joinSpace,\n ]);\n\n const users = React.useMemo(() => Object.values(userMap), [userMap]);\n\n const localUsers = React.useMemo(() => {\n const { space: currentUserSpace } = currentUser;\n return users.filter(({ space }) => space === currentUserSpace);\n }, [currentUser, users]);\n\n return {\n isSpaceMaster,\n currentUser,\n updateCurrentUser,\n users,\n localUsers,\n joinSpace,\n };\n};\n\nexport default useUsers;\n","import React from \"react\";\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nconst useBoardConfig = () => {\n const [boardConfig, getBoardConfig, setBoardConfig] = useSyncedStore(\n (state) => [state.boardConfig, state.getBoardConfig, state.setBoardConfig]\n );\n\n const setSyncBoardConfig = React.useCallback(\n (callbackOrConfig) => {\n let callback = callbackOrConfig;\n if (typeof callbackOrConfig === \"object\") {\n callback = () => callbackOrConfig;\n }\n\n const currentConfig = getBoardConfig();\n const newConfig = callback(currentConfig);\n setBoardConfig(newConfig);\n },\n [getBoardConfig, setBoardConfig]\n );\n\n return [boardConfig, setSyncBoardConfig];\n};\n\nexport default useBoardConfig;\n","import useMainStore from \"./store/main\";\n\nconst useBoardState = () => {\n const [boardState] = useMainStore((state) => [state.boardState]);\n return boardState;\n};\n\nexport default useBoardState;\n","import { useSyncedStore } from \"./store/synced\";\n\nconst useSessionInfo = () => {\n const [getSessionInfo, setSessionInfo, updateSessionInfo, sessionInfo] =\n useSyncedStore((state) => [\n state.getSessionInfo,\n state.setSessionInfo,\n state.updateSessionInfo,\n state.session,\n ]);\n\n return { getSessionInfo, setSessionInfo, sessionInfo, updateSessionInfo };\n};\n\nexport default useSessionInfo;\n","import React, { useContext } from \"react\";\nimport { createStore, useStore } from \"zustand\";\nimport { nanoid } from \"nanoid\";\n\nimport useWire from \"@/hooks/useWire\";\nimport { syncMiddleware } from \"@/utils\";\nimport { shallow } from \"zustand/shallow\";\n\nconst Context = React.createContext();\n\nconst generateMsg = ({ user: { name, uid, color }, content }) => {\n const newMessage = {\n type: \"message\",\n user: { name, uid, color },\n content,\n uid: nanoid(),\n timestamp: new Date().toISOString(),\n };\n return newMessage;\n};\n\nconst messageStore = (set, get) => ({\n messages: [],\n setMessages: (newMessages) =>\n set({\n messages: newMessages.map((m) => ({\n ...m,\n timestamp: Date.parse(m.timestamp),\n })),\n }),\n addMessage: (newMessage) =>\n set((state) => ({\n messages: [\n ...state.messages,\n { ...newMessage, timestamp: Date.parse(newMessage.timestamp) },\n ],\n })),\n sendMessage: (user, content) => {\n const newMessage = generateMsg({\n user,\n content,\n });\n if (newMessage) get().addMessage(newMessage);\n },\n});\n\nexport const SyncedMessageProvider = ({\n storeName,\n children,\n defaultValue = [],\n}) => {\n const { wire } = useWire(\"room\");\n const [store] = React.useState(() =>\n createStore(\n syncMiddleware(\n { wire, storeName, defaultValue, noSync: [\"sendMessage\"] },\n (...args) => ({\n ...messageStore(...args),\n })\n )\n )\n );\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useSyncedMessage = (selector, equalityFn) => {\n const store = useContext(Context);\n return useStore(store, selector, equalityFn ? equalityFn : shallow);\n};\n","import React from \"react\";\n\nimport { useSyncedMessage } from \"@/message/store\";\nimport { useSyncedUsers } from \"@/users/store\";\n\nconst noop = () => {};\n\nconst useMessage = (onMessage = noop) => {\n const currentUser = useSyncedUsers((state) => state.getUser());\n const [messages, setMessages, sendMessage] = useSyncedMessage((state) => [\n state.messages,\n state.setMessages,\n state.sendMessage,\n ]);\n\n React.useEffect(() => {\n // React on new message\n if (messages.length) {\n onMessage();\n }\n }, [messages, onMessage]);\n\n const sendMessageWithUser = React.useCallback(\n (messageContent) => {\n sendMessage(currentUser, messageContent);\n },\n [currentUser, sendMessage]\n );\n\n return { messages, setMessages, sendMessage: sendMessageWithUser };\n};\n\nexport default useMessage;\n","import React from \"react\";\nimport { nanoid } from \"nanoid\";\n\nimport useWire, { WireProvider } from \"@/hooks/useWire\";\n\nimport { SyncedStoreProvider } from \"@/board/store/synced\";\nimport { MainStoreProvider } from \"@/board/store/main\";\n\nimport { SyncedUsersProvider, useSyncedUsers } from \"./users/store\";\nimport { SyncedMessageProvider } from \"./message/store\";\n\nconst SyncBoard = ({ children, session }) => {\n const joinSpace = useSyncedUsers((state) => state.joinSpace);\n\n // Set user space\n React.useEffect(() => {\n joinSpace(session);\n return () => {\n joinSpace(null);\n };\n }, [joinSpace, session]);\n\n return children;\n};\n\nconst ConnectedSyncBoard = ({\n socket,\n room,\n session,\n items = [],\n messages = [],\n LoadingComponent,\n ...props\n}) => {\n const [stableRoom] = React.useState(room || nanoid());\n const [stableSession] = React.useState(session || nanoid());\n const [defaultItemsValue] = React.useState(() => {\n return {\n itemIds: items.map(({ id }) => id),\n items: Object.fromEntries(items.map((item) => [item.id, item])),\n };\n });\n\n const roomChannel = useWire(\"room\");\n\n if (!roomChannel) {\n // No room declared so we create one\n return (\n <WireProvider\n room={stableRoom}\n channel=\"room\"\n socket={socket}\n LoadingComponent={LoadingComponent}\n >\n <SyncedUsersProvider storeName={`${stableRoom}_users`}>\n <SyncedMessageProvider\n storeName={`${stableSession}_messages`}\n defaultValue={messages}\n >\n <MainStoreProvider>\n <SyncedStoreProvider\n storeName={`${stableSession}_item`}\n defaultValue={defaultItemsValue}\n >\n <SyncBoard {...props} session={stableSession} />\n </SyncedStoreProvider>\n </MainStoreProvider>\n </SyncedMessageProvider>\n </SyncedUsersProvider>\n </WireProvider>\n );\n }\n return (\n <SyncedMessageProvider\n storeName={`${stableSession}_messages`}\n defaultValue={messages}\n >\n <MainStoreProvider>\n <SyncedStoreProvider\n storeName={`${stableSession}_item`}\n defaultValue={defaultItemsValue}\n >\n <SyncBoard {...props} session={stableSession} />\n </SyncedStoreProvider>\n </MainStoreProvider>\n </SyncedMessageProvider>\n );\n};\n\nexport default ConnectedSyncBoard;\n","import React from \"react\";\nimport { nanoid } from \"nanoid\";\n\nimport { WireProvider } from \"@/hooks/useWire\";\nimport { SyncedUsersProvider } from \"@/users/store\";\n\nconst ConnectedSyncRoom = ({ socket, room, children, LoadingComponent }) => {\n const [stableRoom] = React.useState(room || nanoid());\n\n return (\n <WireProvider\n room={stableRoom}\n channel=\"room\"\n socket={socket}\n LoadingComponent={LoadingComponent}\n >\n <SyncedUsersProvider storeName={`${stableRoom}_users`}>\n {children}\n </SyncedUsersProvider>\n </WireProvider>\n );\n};\n\nexport default ConnectedSyncRoom;\n","let e={data:\"\"},t=t=>\"object\"==typeof window?((t?t.querySelector(\"#_goober\"):window._goober)||Object.assign((t||document.head).appendChild(document.createElement(\"style\")),{innerHTML:\" \",id:\"_goober\"})).firstChild:t||e,r=e=>{let r=t(e),l=r.data;return r.data=\"\",l},l=/(?:([\\u0080-\\uFFFF\\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\\s*)/g,a=/\\/\\*[^]*?\\*\\/| +/g,n=/\\n+/g,o=(e,t)=>{let r=\"\",l=\"\",a=\"\";for(let n in e){let c=e[n];\"@\"==n[0]?\"i\"==n[1]?r=n+\" \"+c+\";\":l+=\"f\"==n[1]?o(c,n):n+\"{\"+o(c,\"k\"==n[1]?\"\":t)+\"}\":\"object\"==typeof c?l+=o(c,t?t.replace(/([^,])+/g,e=>n.replace(/(^:.*)|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+\" \"+t:t)):n):null!=c&&(n=/^--/.test(n)?n:n.replace(/[A-Z]/g,\"-$&\").toLowerCase(),a+=o.p?o.p(n,c):n+\":\"+c+\";\")}return r+(t&&a?t+\"{\"+a+\"}\":a)+l},c={},s=e=>{if(\"object\"==typeof e){let t=\"\";for(let r in e)t+=r+s(e[r]);return t}return e},i=(e,t,r,i,p)=>{let u=s(e),d=c[u]||(c[u]=(e=>{let t=0,r=11;for(;t<e.length;)r=101*r+e.charCodeAt(t++)>>>0;return\"go\"+r})(u));if(!c[d]){let t=u!==e?e:(e=>{let t,r,o=[{}];for(;t=l.exec(e.replace(a,\"\"));)t[4]?o.shift():t[3]?(r=t[3].replace(n,\" \").trim(),o.unshift(o[0][r]=o[0][r]||{})):o[0][t[1]]=t[2].replace(n,\" \").trim();return o[0]})(e);c[d]=o(p?{[\"@keyframes \"+d]:t}:t,r?\"\":\".\"+d)}let f=r&&c.g?c.g:null;return r&&(c.g=c[d]),((e,t,r,l)=>{l?t.data=t.data.replace(l,e):-1===t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(c[d],t,i,f),d},p=(e,t,r)=>e.reduce((e,l,a)=>{let n=t[a];if(n&&n.call){let e=n(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;n=t?\".\"+t:e&&\"object\"==typeof e?e.props?\"\":o(e,\"\"):!1===e?\"\":e}return e+l+(null==n?\"\":n)},\"\");function u(e){let r=this||{},l=e.call?e(r.p):e;return i(l.unshift?l.raw?p(l,[].slice.call(arguments,1),r.p):l.reduce((e,t)=>Object.assign(e,t&&t.call?t(r.p):t),{}):l,t(r.target),r.g,r.o,r.k)}let d,f,g,b=u.bind({g:1}),h=u.bind({k:1});function m(e,t,r,l){o.p=t,d=e,f=r,g=l}function j(e,t){let r=this||{};return function(){let l=arguments;function a(n,o){let c=Object.assign({},n),s=c.className||a.className;r.p=Object.assign({theme:f&&f()},c),r.o=/ *go\\d+/.test(s),c.className=u.apply(r,l)+(s?\" \"+s:\"\"),t&&(c.ref=o);let i=e;return e[0]&&(i=c.as||e,delete c.as),g&&i[0]&&g(c),d(i,c)}return t?t(a):a}}export{u as css,r as extractCss,b as glob,h as keyframes,m as setup,j as styled};\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","import React from \"react\";\n\nexport const isMacOS = () => {\n const userAgent = navigator.userAgent.toLowerCase();\n return /mac os ?x 10/.test(userAgent);\n};\n\n// From https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\nconst getScrollLineHeight = () => {\n const iframe = document.createElement(\"iframe\");\n iframe.src = \"#\";\n document.body.appendChild(iframe);\n\n // Write content in Iframe\n const idoc = iframe.contentWindow.document;\n idoc.open();\n idoc.write(\n \"<!DOCTYPE html><html><head></head><body><span>a</span></body></html>\"\n );\n idoc.close();\n\n const scrollLineHeight = idoc.body.firstElementChild.offsetHeight;\n document.body.removeChild(iframe);\n\n return scrollLineHeight;\n};\n\nconst LINE_HEIGHT = getScrollLineHeight();\n// Reasonable default from https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\nconst PAGE_HEIGHT = 800;\n\nconst otherPointer = (pointers, currentPointer) => {\n const p2 = Object.keys(pointers)\n .map((p) => Number(p))\n .find((pointer) => pointer !== currentPointer);\n return pointers[p2];\n};\n\nconst computeDistance = ([x1, y1], [x2, y2]) => {\n const distanceX = Math.abs(x1 - x2);\n const distanceY = Math.abs(y1 - y2);\n\n return Math.hypot(distanceX, distanceY);\n};\n\nconst empty = () => {};\n\nconst stopPropagation = (fn) => (arg) => {\n const { event } = arg;\n if (!event.isPropagationStopped()) {\n return fn(arg);\n }\n return null;\n};\n\nconst protect =\n (fn) =>\n async (...args) => {\n try {\n await fn(...args);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(e);\n }\n };\n\nclass PromiseQueue {\n lastPromise = Promise.resolve(true);\n\n add(operation, ...args) {\n return new Promise((resolve, reject) => {\n this.lastPromise = this.lastPromise\n .then(() => stopPropagation(protect(operation))(...args))\n .then(resolve)\n .catch(reject);\n });\n }\n}\n\nconst promiseQueue = new PromiseQueue();\n\nconst Gesture = ({\n children,\n onDrag = empty,\n onDragStart = empty,\n onDragEnd = empty,\n onPan = empty,\n onTap = empty,\n onLongTap = empty,\n onDoubleTap = empty,\n onZoom,\n mainAction = \"drag\",\n}) => {\n const wrapperRef = React.useRef(null);\n const stateRef = React.useRef({\n moving: false,\n pointers: {},\n mainPointer: undefined,\n });\n\n const onWheel = (event) => {\n const {\n deltaX,\n deltaY,\n clientX,\n clientY,\n deltaMode,\n ctrlKey,\n altKey,\n metaKey,\n target,\n } = event;\n\n // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.\n // In that situation, we want to use the custom scaling, not the browser default zoom.\n // Hence in this situation we avoid to return immediately.\n if (altKey || (ctrlKey && !isMacOS())) {\n return;\n }\n\n // On a trackpad, the pinch and pan events are differentiated by the crtlKey value.\n // On a pinch gesture, the ctrlKey is set to true, so we want to have a scaling effect.\n // If we are only moving the fingers in the same direction, a pan is needed.\n // Ref: https://medium.com/@auchenberg/detecting-multi-touch-trackpad-gestures-in-javascript-a2505babb10e\n if (isMacOS() && !ctrlKey) {\n promiseQueue.add(onPan, {\n deltaX: -2 * deltaX,\n deltaY: -2 * deltaY,\n button: 1,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n } else {\n // Quit if onZoom is not set\n if (onZoom === undefined || !deltaY) return;\n\n let scale = deltaY;\n\n switch (deltaMode) {\n case 1: // Pixel\n scale *= LINE_HEIGHT;\n break;\n case 2:\n scale *= PAGE_HEIGHT;\n break;\n default:\n }\n\n if (isMacOS()) {\n scale *= 2;\n }\n\n promiseQueue.add(onZoom, { scale, clientX, clientY, event });\n }\n };\n\n const onPointerDown = (event) => {\n const {\n target,\n button,\n clientX,\n clientY,\n pointerId,\n altKey,\n ctrlKey,\n metaKey,\n isPrimary,\n } = event;\n\n // Add pointer to map\n stateRef.current.pointers[pointerId] = { clientX, clientY };\n\n if (isPrimary) {\n // Clean mainPoint on primary pointer\n stateRef.current.mainPointer = undefined;\n }\n\n if (stateRef.current.mainPointer !== undefined) {\n if (stateRef.current.mainPointer !== pointerId) {\n // This is not the main pointer\n try {\n const { clientX: clientX2, clientY: clientY2 } = otherPointer(\n stateRef.current.pointers,\n pointerId\n );\n const newClientX = (clientX2 + clientX) / 2;\n const newClientY = (clientY2 + clientY) / 2;\n\n const distance = computeDistance(\n [clientX2, clientY2],\n [clientX, clientY]\n );\n\n // We update previous position as the new position is the center between both fingers\n Object.assign(stateRef.current, {\n pressed: true,\n moving: false,\n gestureStart: false,\n startX: clientX,\n startY: clientY,\n prevX: newClientX,\n prevY: newClientY,\n startDistance: distance,\n prevDistance: distance,\n });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(\"Error while getting other pointer. Ignoring\", e);\n // eslint-disable-next-line no-unused-expressions\n stateRef.current.mainPointer === undefined;\n }\n }\n\n return;\n }\n\n // We set the mainpointer\n stateRef.current.mainPointer = pointerId;\n\n // And prepare move\n Object.assign(stateRef.current, {\n pressed: true,\n moving: false,\n gestureStart: false,\n startX: clientX,\n startY: clientY,\n prevX: clientX,\n prevY: clientY,\n currentButton: button,\n pointerDownEvent: event,\n startDistance: 0,\n prevDistance: 0,\n target,\n timeStart: Date.now(),\n longTapTimeout: setTimeout(async () => {\n stateRef.current.noTap = true;\n promiseQueue.add(onLongTap, {\n clientX,\n clientY,\n altKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n }, 750),\n });\n\n try {\n target.setPointerCapture(pointerId);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(\"Fail to capture pointer\", e);\n }\n };\n\n const onPointerMove = (event) => {\n if (stateRef.current.pressed) {\n const {\n pointerId,\n clientX: eventClientX,\n clientY: eventClientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n buttons,\n } = event;\n\n // Update pointer coordinates in the map\n stateRef.current.pointers[pointerId] = {\n clientX: eventClientX,\n clientY: eventClientY,\n };\n\n stateRef.current.moving = true;\n\n // Do we have two pointers ?\n const twoPointers = Object.keys(stateRef.current.pointers).length === 2;\n\n let clientX;\n let clientY;\n let distanceBetweenTwoPointers = 0;\n\n if (twoPointers) {\n // Find other pointerId\n const { clientX: clientX2, clientY: clientY2 } = otherPointer(\n stateRef.current.pointers,\n pointerId\n );\n\n // Update client X with the center of each touch\n clientX = (clientX2 + eventClientX) / 2;\n clientY = (clientY2 + eventClientY) / 2;\n distanceBetweenTwoPointers = computeDistance(\n [clientX2, clientY2],\n [eventClientX, eventClientY]\n );\n } else {\n clientX = eventClientX;\n clientY = eventClientY;\n }\n\n // We drag if\n // On non touch device\n // - Only button is pressed (1)\n // - any special key is no pressed\n // or on touch devices\n // - We use only one finger\n let altAction = shiftKey || altKey || ctrlKey || metaKey || buttons !== 1;\n if (mainAction !== \"drag\") {\n altAction = !altAction;\n }\n\n const shouldDrag = !altAction;\n const shouldPan = altAction;\n\n if (shouldDrag) {\n // Send drag start on first move\n if (!stateRef.current.gestureStart) {\n wrapperRef.current.style.cursor = \"move\";\n stateRef.current.gestureStart = true;\n // Clear tap timeout\n clearTimeout(stateRef.current.longTapTimeout);\n\n promiseQueue.add(onDragStart, {\n deltaX: 0,\n deltaY: 0,\n startX: stateRef.current.startX,\n startY: stateRef.current.startY,\n clientX: stateRef.current.startX,\n clientY: stateRef.current.startY,\n distanceX: 0,\n distanceY: 0,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target: stateRef.current.target,\n event: stateRef.current.pointerDownEvent,\n });\n }\n\n const deltaX = clientX - stateRef.current.prevX;\n const deltaY = clientY - stateRef.current.prevY;\n const distanceX = clientX - stateRef.current.startX;\n const distanceY = clientY - stateRef.current.startY;\n\n // Drag event\n promiseQueue.add(onDrag, {\n deltaX,\n deltaY,\n startX: stateRef.current.startX,\n startY: stateRef.current.startY,\n clientX,\n clientY,\n distanceX,\n distanceY,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target: stateRef.current.target,\n event,\n });\n }\n\n if (shouldPan) {\n if (!stateRef.current.gestureStart) {\n wrapperRef.current.style.cursor = \"move\";\n stateRef.current.gestureStart = true;\n // Clear tap timeout on first move\n clearTimeout(stateRef.current.longTapTimeout);\n }\n\n // Create closure\n const deltaX = clientX - stateRef.current.prevX;\n const deltaY = clientY - stateRef.current.prevY;\n const { target } = stateRef.current;\n\n // Pan event\n promiseQueue.add(onPan, {\n deltaX,\n deltaY,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n\n if (\n distanceBetweenTwoPointers !== stateRef.current.prevDistance &&\n onZoom\n ) {\n const scale =\n stateRef.current.prevDistance - distanceBetweenTwoPointers;\n\n if (Math.abs(scale) > 0) {\n promiseQueue.add(onZoom, {\n scale: scale * 3,\n clientX,\n clientY,\n event,\n });\n stateRef.current.prevDistance = distanceBetweenTwoPointers;\n }\n }\n }\n\n stateRef.current.prevX = clientX;\n stateRef.current.prevY = clientY;\n }\n };\n\n const onPointerUp = (event) => {\n const {\n clientX,\n clientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n pointerId,\n } = event;\n\n if (!stateRef.current.pointers[pointerId]) {\n // Pointer already gone previously with another event\n // ignoring it\n return;\n }\n\n // Remove pointer from map\n delete stateRef.current.pointers[pointerId];\n\n // If this is not the main pointer we quit here\n if (stateRef.current.mainPointer !== pointerId) {\n const { clientX: clientX2, clientY: clientY2 } =\n stateRef.current.pointers[stateRef.current.mainPointer];\n Object.assign(stateRef.current, {\n prevX: clientX2,\n prevY: clientY2,\n prevDistance: 0,\n startDistance: 0,\n });\n return;\n }\n\n // It was the main pointer so we need to replace it with another if any\n while (Object.keys(stateRef.current.pointers).length > 0) {\n // If was main pointer but we have another one, this one become main\n stateRef.current.mainPointer = Number(\n Object.keys(stateRef.current.pointers)[0]\n );\n\n try {\n stateRef.current.target.setPointerCapture(stateRef.current.mainPointer);\n\n const { clientX: clientX2, clientY: clientY2 } =\n stateRef.current.pointers[stateRef.current.mainPointer];\n Object.assign(stateRef.current, {\n prevX: clientX2,\n prevY: clientY2,\n prevDistance: 0,\n startDistance: 0,\n });\n\n return;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.log(\"Fails to set pointer capture\", error);\n stateRef.current.mainPointer = undefined;\n delete stateRef.current.pointers[\n Object.keys(stateRef.current.pointers)[0]\n ];\n }\n }\n\n // From here we have removed the last pointer.\n\n stateRef.current.mainPointer = undefined;\n stateRef.current.pressed = false;\n\n // Clear longTap\n clearTimeout(stateRef.current.longTapTimeout);\n\n if (stateRef.current.moving) {\n // If we were moving, send drag end event\n stateRef.current.moving = false;\n promiseQueue.add(onDragEnd, {\n deltaX: clientX - stateRef.current.prevX,\n deltaY: clientY - stateRef.current.prevY,\n startX: stateRef.current.startX,\n startY: stateRef.current.startY,\n clientX,\n clientY,\n distanceX: clientX - stateRef.current.startX,\n distanceY: clientY - stateRef.current.startY,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n event,\n });\n wrapperRef.current.style.cursor = \"auto\";\n } else {\n const now = Date.now();\n\n if (stateRef.current.noTap) {\n stateRef.current.noTap = false;\n }\n // Send tap event only if time less than 300ms\n else if (stateRef.current.timeStart - now < 300) {\n promiseQueue.add(onTap, {\n clientX,\n clientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n }\n }\n };\n\n const onDoubleTapHandler = (event) => {\n const { clientX, clientY, altKey, shiftKey, ctrlKey, metaKey, target } =\n event;\n promiseQueue.add(onDoubleTap, {\n clientX,\n clientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n };\n\n return (\n <div\n onWheel={onWheel}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerOut={onPointerUp}\n onPointerLeave={onPointerUp}\n onPointerCancel={onPointerUp}\n onDoubleClick={onDoubleTapHandler}\n style={{ touchAction: \"none\" }}\n ref={wrapperRef}\n >\n {children}\n </div>\n );\n};\n\nexport default Gesture;\n","import React from \"react\";\nimport Gesture from \"../Gesture\";\nimport useMainStore from \"../store/main\";\n\nconst ResizeHandler = ({ onResize, ...rest }) => {\n const [getBoardState] = useMainStore((state) => [state.getBoardState]);\n\n const onDrag = ({ deltaX, deltaY, event }) => {\n event.stopPropagation();\n const { scale } = getBoardState();\n onResize({\n width: deltaX / scale,\n height: deltaY / scale,\n });\n };\n\n return (\n <Gesture onDrag={onDrag}>\n <div {...rest} />\n </Gesture>\n );\n};\n\nexport default ResizeHandler;\n","import React, { memo } from \"react\";\n\nimport { css } from \"goober\";\nimport deepEqual from \"fast-deep-equal\";\n\nimport ResizeHandler from \"./ResizeHandler\";\nimport useMainStore from \"../store/main\";\n\nconst itemClass = css`\n display: inline-block;\n transition: transform 150ms;\n user-select: none;\n padding: 2px;\n box-sizing: border-box;\n`;\n\nconst selectedItemClass = css`\n border: 2px dashed #db5034;\n padding: 0px;\n cursor: pointer;\n`;\n\nconst itemMark = css`\n position: absolute;\n width: 0px;\n height: 0px;\n`;\n\nconst itemMarkTopLeft = css`\n top: 0;\n left: 0;\n`;\n\nconst itemMarkTopRight = css`\n top: 0;\n right: 0;\n`;\n\nconst itemMarkBottomLeft = css`\n bottom: 0;\n left: 0;\n`;\n\nconst itemMarkBottomRight = css`\n bottom: 0;\n right: 0;\n`;\n\nconst itemMarkCenter = css`\n top: 50%;\n left: 50%;\n`;\n\nconst itemResize = css`\n position: absolute;\n\n width: 10px;\n height: 10px;\n border: 2px solid #db5034;\n background-color: #db5034;\n cursor: move;\n`;\n\nconst itemResizeWidth = css`\n cursor: ew-resize;\n right: -6px;\n top: calc(50% - 5px);\n`;\n\nconst itemResizeHeight = css`\n cursor: ns-resize;\n bottom: -6px;\n left: calc(50% - 5px);\n`;\n\nconst itemResizeRatio = css`\n cursor: nwse-resize;\n bottom: -6px;\n right: -6px;\n`;\n\nconst DefaultErrorComponent = ({ onReload }) => (\n <div\n className={`syncboard-error-item ${css({\n width: \"100px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n textAlign: \"center\",\n color: \"red\",\n })}`}\n >\n Sorry, this item seems broken.\n <button onClick={onReload}>Reload it</button>\n </div>\n);\n\n/* Error boundary for broken item */\nclass ItemErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false, itemId: props.itemId };\n this.onReload = this.onReload.bind(this);\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error) {\n // eslint-disable-next-line no-console\n console.error(\n `Error for item ${this.state.itemId}`,\n error,\n this.props.state\n );\n }\n\n onReload() {\n this.setState({ hasError: false });\n }\n\n render() {\n const { ErrorComponent } = this.props;\n if (this.state.hasError) {\n return <ErrorComponent onReload={this.onReload} />;\n }\n return this.props.children;\n }\n}\n\nconst removeClass = (e) => {\n e.target.className = \"\";\n};\n\nconst defaultResize = ({\n width,\n height,\n actualWidth,\n actualHeight,\n prevState,\n keepRatio,\n}) => {\n let { width: currentWidth, height: currentHeight } = prevState;\n\n // Parse text values if any\n [currentWidth, currentHeight] = [\n parseFloat(currentWidth),\n parseFloat(currentHeight),\n ];\n if (!currentWidth || Number.isNaN(Number(currentWidth))) {\n currentWidth = actualWidth;\n }\n if (!currentHeight || Number.isNaN(Number(currentHeight))) {\n currentHeight = actualHeight;\n }\n\n if (keepRatio) {\n const ratio = currentWidth / currentHeight;\n return {\n ...prevState,\n width: (currentWidth + width).toFixed(1),\n height: (currentHeight + height / ratio).toFixed(1),\n };\n }\n\n return {\n ...prevState,\n width: (currentWidth + width).toFixed(1),\n height: (currentHeight + height).toFixed(1),\n };\n};\n\nconst defaultResizeDirection = {\n w: true,\n h: true,\n b: true,\n};\n\nconst Item = ({\n setState,\n state: { type, rotation = 0, id, locked, extraClasses, ...rest } = {},\n animate = \"hvr-pop\",\n isSelected,\n itemMap,\n showResizeHandle = true,\n}) => {\n const itemWrapperRef = React.useRef(null);\n const [uid] = useMainStore((state) => [state.config.uid]);\n\n const {\n component: Component = () => null,\n resizeDirections = defaultResizeDirection,\n resize = defaultResize,\n } = itemMap[type];\n\n const updateState = React.useCallback(\n (callbackOrItem, patch = false) => setState(id, callbackOrItem, patch),\n [setState, id]\n );\n\n React.useEffect(() => {\n itemWrapperRef.current.className = animate;\n }, [animate]);\n\n const classes = [\"item\", id, itemClass];\n if (locked) {\n classes.push(\"locked\");\n }\n if (isSelected) {\n classes.push(\"selected\");\n classes.push(selectedItemClass);\n }\n if (Array.isArray(extraClasses)) {\n classes.concat(extraClasses);\n }\n\n const className = classes.join(\" \");\n\n const onResize = ({ width = 0, height = 0, keepRatio }) => {\n updateState((prev) => {\n const { offsetWidth, offsetHeight } = itemWrapperRef.current;\n return resize({\n prevState: prev,\n width,\n height,\n actualHeight: offsetHeight,\n actualWidth: offsetWidth,\n keepRatio,\n });\n });\n };\n\n const onResizeWidth = ({ width }) => {\n onResize({ width });\n };\n\n const onResizeHeight = ({ height }) => {\n onResize({ height });\n };\n\n const onResizeRatio = ({ width }) => {\n onResize({ height: width, width, keepRatio: true });\n };\n\n return (\n <div\n style={{ transform: `rotate(${rotation}deg` }}\n data-id={id}\n id={`${uid}__${id}`}\n className={className}\n >\n <div\n style={{ display: \"flex\" }}\n ref={itemWrapperRef}\n onAnimationEnd={removeClass}\n onKeyDown={(e) => e.stopPropagation()}\n onKeyUp={(e) => e.stopPropagation()}\n >\n <ItemErrorBoundary\n itemId={id}\n state={rest}\n ErrorComponent={itemMap?.error?.component || DefaultErrorComponent}\n >\n <Component {...rest} id={id} setState={updateState} />\n </ItemErrorBoundary>\n <div className={`corner ${itemMark} ${itemMarkTopLeft}`} />\n <div className={`corner ${itemMark} ${itemMarkTopRight}`} />\n <div className={`corner ${itemMark} ${itemMarkBottomRight}`} />\n <div className={`corner ${itemMark} ${itemMarkBottomLeft}`} />\n <div className={`center ${itemMark} ${itemMarkCenter}`} />\n {showResizeHandle && (\n <>\n {resizeDirections.b && (\n <ResizeHandler\n className={`${itemResize} ${itemResizeRatio}`}\n onResize={onResizeRatio}\n />\n )}\n\n {resizeDirections.h && (\n <ResizeHandler\n className={`${itemResize} ${itemResizeHeight}`}\n onResize={onResizeHeight}\n />\n )}\n\n {resizeDirections.w && (\n <ResizeHandler\n className={`${itemResize} ${itemResizeWidth}`}\n onResize={onResizeWidth}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n};\n\nconst MemoizedItem = memo(\n Item,\n (\n {\n state: prevState,\n setState: prevSetState,\n isSelected: prevIsSelected,\n showResizeHandle: prevShowResizeHandle,\n },\n {\n state: nextState,\n setState: nextSetState,\n isSelected: nextIsSelected,\n showResizeHandle: nextShowResizeHandle,\n }\n ) =>\n prevIsSelected === nextIsSelected &&\n prevShowResizeHandle === nextShowResizeHandle &&\n prevSetState === nextSetState &&\n deepEqual(prevState, nextState)\n);\n\nconst identity = (x) => x;\n\n// Exclude positioning from memoization\nconst PositionedItem = ({ state = {}, getCurrentUser, className, ...rest }) => {\n if (!rest.itemMap[state.type]) {\n return null;\n }\n\n const { stateHook = identity } = rest.itemMap[state.type];\n\n const {\n x = 0,\n y = 0,\n layer = 0,\n moving,\n ...stateRest\n } = stateHook(state, { getCurrentUser });\n\n const zIndex = (layer + 4) * 10 + 100 + (moving ? 5 : 0); // Items z-index between 100 and 200\n\n return (\n <div\n className={className}\n style={{\n transform: `translate(${x}px, ${y}px)`,\n zIndex,\n }}\n >\n <MemoizedItem\n {...rest}\n // Helps to prevent render\n showResizeHandle={rest.isSelected && rest.showResizeHandle}\n state={stateRest}\n />\n </div>\n );\n};\n\nconst MemoizedPositionedItem = memo(PositionedItem);\n\nexport default MemoizedPositionedItem;\n","import Item from \"./Item\";\nimport useItemActions from \"./useItemActions\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"../store/main\";\nimport { useSyncedUsers } from \"@/users/store\";\nimport { css } from \"goober\";\n\nconst ItemList = () => {\n const { updateItem } = useItemActions();\n\n const [itemList, itemMap] = useSyncedStore((state) => [\n state.itemIds,\n state.items,\n ]);\n\n const [boardSize, showResizeHandle, itemTemplates, selection] = useMainStore(\n (state) => [\n state.config.boardSize,\n state.config.showResizeHandle,\n state.config.itemTemplates,\n state.selection,\n ]\n );\n const [getCurrentUser] = useSyncedUsers((state) => [state.getUser]);\n\n const itemClassName = css({\n position: \"absolute\",\n top: `${boardSize / 2}px`,\n left: `${boardSize / 2}px`,\n display: \"inline-block\",\n lineHeight: 0,\n });\n\n return itemList.map((itemId) => (\n <Item\n key={itemId}\n state={itemMap[itemId]}\n setState={updateItem}\n isSelected={selection.includes(itemId)}\n itemMap={itemTemplates}\n boardSize={boardSize}\n getCurrentUser={getCurrentUser}\n showResizeHandle={showResizeHandle}\n className={itemClassName}\n />\n ));\n};\n\nexport default ItemList;\n","import { useCallback, useEffect, useRef } from 'react';\n/**\n * Returns function that yields current mount state.\n *\n * Returned function yields `true` only in case component is mounted. This hook\n * is handy for the cases when you have to detect component mount state within\n * async effects.\n *\n * @param initialValue Initial value. By default, this hook assumes that hook is\n * not mounted yet at first render.\n */\nexport function useIsMounted(initialValue = false) {\n const isMounted = useRef(initialValue);\n const get = useCallback(() => isMounted.current, []);\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return get;\n}\n","export function on(obj, ...args) {\n if (obj && obj.addEventListener) {\n obj.addEventListener(...args);\n }\n}\nexport function off(obj, ...args) {\n if (obj && obj.removeEventListener) {\n obj.removeEventListener(...args);\n }\n}\nexport const hasOwnProperty = (obj, property) => Object.prototype.hasOwnProperty.call(obj, property);\nexport const yieldTrue = () => true;\nexport const yieldFalse = () => false;\nexport const basicDepsComparator = (d1, d2) => {\n if (d1 === d2)\n return true;\n if (d1.length !== d2.length)\n return false;\n for (let i = 0; i < d1.length; i++) {\n if (d1[i] !== d2[i]) {\n return false;\n }\n }\n return true;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useMemo } from 'react';\nimport { useIsMounted } from '../useIsMounted';\nimport { useSyncedRef } from '../useSyncedRef';\nimport { hasOwnProperty, off, on } from \"../util/misc.js\";\n/**\n * An HTML element or ref object containing an HTML element.\n *\n * @param target An HTML element or ref object containing an HTML element.\n * @param params Parameters specific to the target element's `addEventListener` method. Commonly\n * something like `[eventName, listener, options]`.\n */\nexport function useEventListener(target, ...params) {\n const isMounted = useIsMounted();\n // create static event listener\n const listenerRef = useSyncedRef(params[1]);\n const eventListener = useMemo(() => \n // as some event listeners designed to be used through `this`\n // it is better to make listener a conventional function as it\n // infers call context\n // eslint-disable-next-line func-names\n function (...args) {\n // normally, such situation should not happen, but better to\n // have back covered\n /* istanbul ignore next */\n if (!isMounted())\n return;\n // we dont care if non-listener provided, simply dont do anything\n /* istanbul ignore else */\n if (typeof listenerRef.current === 'function') {\n listenerRef.current.apply(this, args);\n }\n else if (typeof listenerRef.current.handleEvent === 'function') {\n listenerRef.current.handleEvent.apply(this, args);\n }\n }, \n // eslint-disable-next-line react-hooks/exhaustive-deps\n []);\n useEffect(() => {\n const tgt = target && hasOwnProperty(target, 'current') ? target.current : target;\n if (!tgt)\n return;\n const restParams = params.slice(2);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n on(tgt, params[0], eventListener, ...restParams);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return () => off(tgt, params[0], eventListener, ...restParams);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [target, params[0]]);\n}\n","import React from \"react\";\nimport { css } from \"goober\";\nimport { useEventListener } from \"@react-hookz/web/esm/useEventListener\";\n\nimport { insideClass, isItemInsideElement, getIdFromElem } from \"@/utils\";\n\nimport Gesture from \"./Gesture\";\nimport { useItemActions } from \"./Items\";\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"./store/main\";\n\nconst defaultSelectorClass = css({\n zIndex: 210,\n position: \"absolute\",\n backgroundColor: \"hsla(0, 40%, 50%, 10%)\",\n border: \"2px solid hsl(0, 55%, 40%)\",\n});\n\n/**\n * Find selected element by using their visible screen dimensions.\n *\n * @param {Array} itemMap\n * @param {DomObject} wrapper\n * @param {boolean} ignoreLocked\n * @returns\n */\nconst findSelected = (itemMap, wrapper, ignoreLocked = false) => {\n const selectors = wrapper.getElementsByClassName(\"selector\");\n if (!selectors.length) {\n return [];\n }\n\n const selector = selectors[0];\n\n return Array.from(wrapper.getElementsByClassName(\"item\"))\n .filter((elem) => {\n const id = getIdFromElem(elem);\n\n const item = itemMap[id];\n if (!item || (!ignoreLocked && item.locked)) {\n return false;\n }\n return isItemInsideElement(elem, selector);\n })\n .map((elem) => getIdFromElem(elem));\n};\n\nconst Selector = ({ children, moveFirst }) => {\n const [\n getSelection,\n clearSelection,\n setSelection,\n select,\n getConfiguration,\n updateBoardState,\n ] = useMainStore((state) => [\n state.getSelection,\n state.clear,\n state.setSelection,\n state.select,\n state.getConfiguration,\n state.getBoardState,\n state.updateBoardState,\n ]);\n const { findElementUnderPointer } = useItemActions();\n const [getItems] = useSyncedStore((state) => [state.getItems]);\n\n const [selector, setSelector] = React.useState({});\n const [, startTransition] = React.useTransition();\n const [ignoreLocked, setIgnoreLocked] = React.useState(false);\n\n const wrapperRef = React.useRef(null);\n const stateRef = React.useRef({\n moving: false,\n });\n\n useEventListener(document, \"keydown\", (e) => {\n if (e.key === \"l\") {\n setIgnoreLocked(true);\n }\n });\n\n useEventListener(document, \"keyup\", (e) => {\n if (e.key === \"l\") {\n setIgnoreLocked(false);\n }\n });\n\n // Reset selection on board loading\n React.useEffect(() => {\n clearSelection();\n return () => {\n clearSelection();\n };\n }, [clearSelection]);\n\n React.useEffect(() => {\n if (stateRef.current.moving) {\n const itemMap = getItems();\n const { boardWrapper } = getConfiguration();\n const selected = findSelected(itemMap, boardWrapper, ignoreLocked);\n startTransition(() => {\n setSelection(selected);\n });\n }\n }, [getConfiguration, getItems, selector, setSelection, ignoreLocked]);\n\n const onDragStart = async (event) => {\n const foundElement = await findElementUnderPointer(event);\n\n if (!foundElement) {\n stateRef.current.moving = true;\n startTransition(() => {\n updateBoardState({ selecting: true });\n });\n wrapperRef.current.style.cursor = \"crosshair\";\n }\n };\n\n const onDrag = ({ distanceY, distanceX, startX, startY }) => {\n if (stateRef.current.moving) {\n const { top, left } = wrapperRef.current.getBoundingClientRect();\n\n const relativeX = startX - left;\n const relativeY = startY - top;\n\n if (distanceX > 0) {\n stateRef.current.left = relativeX;\n stateRef.current.width = distanceX;\n } else {\n stateRef.current.left = relativeX + distanceX;\n stateRef.current.width = -distanceX;\n }\n if (distanceY > 0) {\n stateRef.current.top = relativeY;\n stateRef.current.height = distanceY;\n } else {\n stateRef.current.top = relativeY + distanceY;\n stateRef.current.height = -distanceY;\n }\n\n setSelector({ ...stateRef.current, moving: true });\n }\n };\n\n const onDragEnd = () => {\n if (stateRef.current.moving) {\n startTransition(() => {\n updateBoardState({ selecting: false });\n });\n stateRef.current.moving = false;\n setSelector({ moving: false });\n wrapperRef.current.style.cursor = \"auto\";\n }\n };\n\n const onLongTap = ({ target }) => {\n const foundElement = insideClass(target, \"item\");\n if (foundElement) {\n const id = getIdFromElem(foundElement);\n setSelection([id]);\n }\n };\n\n const onTap = (event) => {\n const { target, ctrlKey, metaKey } = event;\n\n const foundElement = findElementUnderPointer(event);\n\n if (!foundElement && insideClass(target, \"board\")) {\n clearSelection();\n } else {\n const itemId = getIdFromElem(foundElement);\n\n // Being defensive here to avoid bug\n if (!itemId) {\n clearSelection();\n return;\n }\n\n const selectedItems = getSelection();\n if (foundElement && !selectedItems.includes(itemId)) {\n if (ctrlKey || metaKey) {\n select([itemId]);\n } else {\n setSelection([itemId]);\n }\n }\n }\n };\n\n return (\n <Gesture\n onDragStart={onDragStart}\n onDrag={onDrag}\n onDragEnd={onDragEnd}\n onTap={onTap}\n onLongTap={onLongTap}\n mainAction={moveFirst ? \"pan\" : \"drag\"}\n >\n <div ref={wrapperRef}>\n {selector.moving && (\n <div\n style={{\n transform: `translate(${selector.left}px, ${selector.top}px)`,\n height: `${selector.height}px`,\n width: `${selector.width}px`,\n }}\n className={`selector ${defaultSelectorClass}`}\n />\n )}\n {children}\n </div>\n </Gesture>\n );\n};\n\nexport default Selector;\n","import React from \"react\";\n\nimport { useItemActions } from \"./Items\";\nimport { getIdFromElem } from \"@/utils\";\n\nimport Gesture from \"./Gesture\";\nimport useMainStore from \"./store/main\";\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport { useEventListener } from \"@react-hookz/web/esm/useEventListener\";\nimport useDim from \"./useDim\";\n\n/**\n * This component handles the move of items when dragging them or with the keyboard.\n */\nconst ActionPane = ({ children }) => {\n const { moveItems, placeItems, findElementUnderPointer } = useItemActions();\n const { vectorFromWrapperToBoard } = useDim();\n\n const [select, setSelection, getSelection, getBoardState, updateBoardState] =\n useMainStore((state) => [\n state.select,\n state.setSelection,\n state.getSelection,\n state.getBoardState,\n state.updateBoardState,\n ]);\n const [getBoardConfig] = useSyncedStore((state) => [state.getBoardConfig]);\n\n const actionRef = React.useRef({});\n\n // Use ref because pointer events are faster than react state management\n const selectedItemRef = React.useRef({\n items: [],\n });\n\n const onDragStart = (event) => {\n const { ctrlKey, metaKey, event: originalEvent } = event;\n const foundElement = findElementUnderPointer(event);\n\n if (foundElement) {\n originalEvent.stopPropagation();\n const selectedItems = getSelection();\n\n selectedItemRef.current.items = selectedItems;\n\n const itemId = getIdFromElem(foundElement);\n\n if (!selectedItems.includes(itemId)) {\n if (ctrlKey || metaKey) {\n selectedItemRef.current.items = [...selectedItems, itemId];\n select([itemId]);\n } else {\n selectedItemRef.current.items = [itemId];\n setSelection([itemId]);\n }\n }\n\n Object.assign(actionRef.current, {\n moving: true,\n });\n }\n };\n\n const onDrag = ({ deltaX, deltaY, event: originalEvent }) => {\n if (actionRef.current.moving) {\n originalEvent.stopPropagation();\n const { movingItems } = getBoardState();\n\n const [newX, newY] = vectorFromWrapperToBoard(deltaX, deltaY);\n\n moveItems(\n selectedItemRef.current.items,\n {\n x: newX,\n y: newY,\n },\n true\n );\n\n if (!movingItems) {\n updateBoardState({ movingItems: true });\n }\n }\n };\n\n const onDragEnd = () => {\n if (actionRef.current.moving) {\n const { gridSize: boardGridSize = 1 } = getBoardConfig();\n const gridSize = boardGridSize || 1; // avoid 0 grid size\n\n actionRef.current = { moving: false };\n placeItems(selectedItemRef.current.items, {\n type: \"grid\",\n size: gridSize,\n });\n updateBoardState({ movingItems: false });\n }\n };\n\n const onKeyDown = (e) => {\n // Block shortcut if we are typing in a textarea or input\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n const selectedItems = getSelection();\n\n if (selectedItems.length) {\n const { gridSize: boardGridSize = 1 } = getBoardConfig();\n let moveX = 0;\n let moveY = 0;\n switch (e.key) {\n case \"ArrowLeft\":\n // Left pressed\n moveX = -10;\n break;\n case \"ArrowRight\":\n moveX = 10;\n // Right pressed\n break;\n case \"ArrowUp\":\n // Up pressed\n moveY = -10;\n break;\n case \"ArrowDown\":\n // Down pressed\n moveY = 10;\n break;\n default:\n }\n if (moveX || moveY) {\n if (e.shiftKey) {\n moveX *= 5;\n moveY *= 5;\n }\n if (e.ctrlKey || e.altKey || e.metaKey) {\n moveX /= 10;\n moveY /= 10;\n }\n\n const [newX, newY] = vectorFromWrapperToBoard(moveX, moveY);\n\n moveItems(\n selectedItems,\n {\n x: newX,\n y: newY,\n },\n true\n );\n const gridSize = boardGridSize || 1; // avoid 0 grid size\n\n placeItems(selectedItems, {\n type: \"grid\",\n size: gridSize,\n });\n e.preventDefault();\n }\n }\n };\n\n useEventListener(document, \"keydown\", onKeyDown);\n\n return (\n <Gesture onDragStart={onDragStart} onDrag={onDrag} onDragEnd={onDragEnd}>\n {children}\n </Gesture>\n );\n};\n\nexport default ActionPane;\n","import { useEventListener } from \"@react-hookz/web/esm/useEventListener\";\nimport React from \"react\";\n\nconst useMousePosition = (ref) => {\n const mouseRef = React.useRef({ hover: false, x: 0, y: 0 });\n\n useEventListener(ref.current, \"mousemove\", (e) => {\n const { clientX, clientY } = e;\n mouseRef.current.x = clientX;\n mouseRef.current.y = clientY;\n });\n useEventListener(ref.current, \"mouseenter\", () => {\n mouseRef.current.hover = true;\n });\n useEventListener(ref.current, \"mouseleave\", () => {\n mouseRef.current.hover = false;\n });\n\n const getMouseInfo = React.useCallback(() => mouseRef.current, []);\n\n return getMouseInfo;\n};\n\nexport default useMousePosition;\n","import React from \"react\";\nimport { useEventListener } from \"@react-hookz/web/esm/useEventListener\";\n\nimport useMainStore from \"./store/main\";\n\nconst digitCodes = [...Array(5).keys()].map((id) => `Digit${id + 1}`);\n\nconst usePositionNavigator = () => {\n const [positions, setPositions] = React.useState({});\n const [getBoardState, updateBoardState] = useMainStore((state) => [\n state.getBoardState,\n state.updateBoardState,\n ]);\n\n useEventListener(document, \"keydown\", (e) => {\n // Block shortcut if we are typing in a textarea or input\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n if (digitCodes.includes(e.code)) {\n const positionKey = e.code;\n const { translateX, translateY, scale } = getBoardState();\n\n if (e.altKey || e.metaKey || e.ctrlKey || e.shiftKey) {\n setPositions((prev) => ({\n ...prev,\n [positionKey]: { translateX, translateY, scale },\n }));\n } else if (positions[positionKey]) {\n updateBoardState(positions[positionKey]);\n }\n e.preventDefault();\n }\n });\n\n return null;\n};\n\nexport default usePositionNavigator;\n","import React from \"react\";\nimport { useEventListener } from \"@react-hookz/web/esm/useEventListener\";\n\nimport Gesture from \"./Gesture\";\nimport useDim from \"./useDim\";\nimport useMousePosition from \"./useMousePosition\";\nimport usePositionNavigator from \"./usePositionNavigator\";\nimport useMainStore from \"./store/main\";\n\nconst PanZoom = ({ children, moveFirst = false }) => {\n const wrappedRef = React.useRef(null);\n const [\n dim,\n itemExtentGlobal,\n getConfiguration,\n updateBoardState,\n getSelection,\n ] = useMainStore((state) => [\n {\n translateX: state.boardState.translateX,\n translateY: state.boardState.translateY,\n scale: state.boardState.scale,\n rotate: state.boardState.rotate,\n },\n state.config.itemExtent,\n state.getConfiguration,\n state.updateBoardState,\n state.getSelection,\n ]);\n const { zoomToCenter, zoomToExtent, moveBoard } = useDim();\n\n const [centered, setCentered] = React.useState(false);\n const timeoutRef = React.useRef({});\n\n // Get mouse position and hover status\n const getMouseInfo = useMousePosition(wrappedRef);\n\n // Hooks to save/restore position\n usePositionNavigator();\n\n /**\n * Center board on startup\n */\n const centerBoard = React.useCallback(() => {\n const { itemExtent } = getConfiguration();\n zoomToExtent(itemExtent);\n }, [getConfiguration, zoomToExtent]);\n\n React.useEffect(() => {\n if (!centered && itemExtentGlobal.radius) {\n // Center board on first valid extent\n centerBoard();\n setCentered(true);\n }\n }, [centerBoard, centered, itemExtentGlobal]);\n\n const onZoom = ({ clientX, clientY, scale }) => {\n zoomToCenter({ to: { x: clientX, y: clientY }, factor: 1 - scale / 500 });\n\n // Update the board zooming state\n clearTimeout(timeoutRef.current.zoom);\n timeoutRef.current.zoom = setTimeout(() => {\n updateBoardState({ zooming: false });\n }, 200);\n updateBoardState({ zooming: true });\n };\n\n const onPan = ({ deltaX, deltaY }) => {\n moveBoard(({ translateX, translateY }) => ({\n translateX: translateX + deltaX,\n translateY: translateY + deltaY,\n }));\n\n // update the board panning state\n clearTimeout(timeoutRef.current.pan);\n timeoutRef.current.pan = setTimeout(() => {\n updateBoardState({ panning: false });\n }, 200);\n updateBoardState({ panning: true });\n };\n\n const onKeyDown = (e) => {\n // Block shortcut if we are typing in a textarea or input\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n let moveX = 0;\n let moveY = 0;\n let zoom = 1;\n switch (e.key) {\n case \"ArrowLeft\":\n moveX = -10;\n break;\n case \"ArrowRight\":\n moveX = 10;\n break;\n case \"ArrowUp\":\n moveY = -10;\n break;\n case \"ArrowDown\":\n moveY = 10;\n break;\n case \"PageUp\":\n zoom = 1.2;\n break;\n case \"PageDown\":\n zoom = 0.8;\n break;\n default:\n }\n if (moveX || moveY || zoom !== 1) {\n // Don't move board if moving item\n const selectedItems = getSelection();\n if (zoom === 1 && selectedItems.length) {\n return;\n }\n if (e.shiftKey) {\n moveX *= 5;\n moveY *= 5;\n }\n if (e.ctrlKey || e.altKey || e.metaKey) {\n moveX /= 5;\n moveY /= 5;\n }\n\n moveBoard(({ translateX, translateY }) => ({\n translateX: translateX + moveX,\n translateY: translateY + moveY,\n }));\n\n zoomToCenter({ factor: zoom });\n\n e.preventDefault();\n }\n // Temporary zoom\n if (e.key === \" \" && !e.repeat) {\n if (getMouseInfo().hover) {\n zoomToCenter({ factor: 3, to: getMouseInfo() });\n }\n }\n };\n\n const onKeyUp = (e) => {\n // Ignore text in Input or Textarea\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n // Zoom out on release\n if (e.key === \" \" && getMouseInfo().hover) {\n zoomToCenter({ factor: 1 / 3, to: getMouseInfo() });\n }\n };\n\n useEventListener(document, \"keydown\", onKeyDown);\n useEventListener(document, \"keyup\", onKeyUp);\n\n return (\n <Gesture\n onPan={onPan}\n onZoom={onZoom}\n mainAction={moveFirst ? \"pan\" : \"drag\"}\n >\n <div\n style={{\n display: \"inline-block\",\n transformOrigin: \"top left\",\n transform: `translate(${dim.translateX}px, ${dim.translateY}px) rotate(${dim.rotate}deg) scale(${dim.scale})`,\n }}\n className={`board-pane${dim.scale < 0.5 ? \" board-pane__far\" : \"\"}`}\n ref={wrappedRef}\n >\n {children}\n </div>\n </Gesture>\n );\n};\n\nexport default PanZoom;\n","import React from \"react\";\nimport { css } from \"goober\";\nimport { useDebouncedCallback } from \"@react-hookz/web/esm/useDebouncedCallback\";\n\nimport { getItemsBoundingBox } from \"@/utils\";\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"./store/main\";\n\nconst defaultZoneStyle = css({\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 210,\n backgroundColor: \"hsla(0, 40%, 50%, 0%)\",\n border: \"2px dashed hsl(20, 55%, 40%)\",\n pointerEvents: \"none\",\n});\n\n/**\n * Show a bounding box around all selected items.\n */\nconst BoundingBox = () => {\n const [\n selection,\n getSelection,\n selectionBox,\n setSelectionBox,\n getConfiguration,\n { translateX, translateY, scale },\n ] = useMainStore((state) => [\n state.selection,\n state.getSelection,\n state.selectionBox,\n state.setSelectionBox,\n state.getConfiguration,\n {\n translateX: state.boardState.translateX,\n translateY: state.boardState.translateY,\n scale: state.boardState.scale,\n },\n ]);\n\n const [items] = useSyncedStore((state) => [state.items]);\n\n // Update selection bounding box\n const updateBox = React.useCallback(() => {\n const currentSelectedItems = getSelection();\n const { boardWrapperRect, uid } = getConfiguration();\n\n if (currentSelectedItems.length === 0) {\n setSelectionBox(null);\n return;\n }\n\n const boundingBox = getItemsBoundingBox(currentSelectedItems, uid);\n\n if (!boundingBox) {\n setSelectionBox(null);\n return;\n }\n\n const { left, top, width, height } = boundingBox;\n\n const newBB = {\n left: left - boardWrapperRect.left,\n top: top - boardWrapperRect.top,\n height,\n width,\n };\n setSelectionBox(newBB);\n }, [getConfiguration, getSelection, setSelectionBox]);\n\n // Debounced version of update box\n const updateBoxDelay = useDebouncedCallback(updateBox, [updateBox], 300);\n\n React.useEffect(() => {\n // Update selected elements bounding box\n updateBox();\n updateBoxDelay(); // Delay to update after board item animation like tap/untap.\n }, [\n selection,\n items,\n translateX,\n translateY,\n scale,\n updateBox,\n updateBoxDelay,\n ]);\n\n if (!selectionBox || selection.length < 2) return null;\n\n return (\n <div\n style={{\n transform: `translate(${selectionBox.left}px, ${selectionBox.top}px)`,\n height: `${selectionBox.height}px`,\n width: `${selectionBox.width}px`,\n }}\n className={`selection ${defaultZoneStyle}`}\n />\n );\n};\n\nconst Selection = () => {\n const [movingItems] = useMainStore((state) => [state.boardState.movingItems]);\n\n if (movingItems) {\n return null;\n }\n\n return <BoundingBox />;\n};\n\nexport default Selection;\n","export const noop = () => { };\nexport const isBrowser = typeof window !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n typeof document !== 'undefined';\n/**\n * You should only be reaching for this function when you're attempting to prevent multiple\n * redefinitions of the same function. In-place strict equality checks are more performant.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const isStrictEqual = (prev, next) => prev === next;\nexport const truthyAndArrayPredicate = (conditions) => conditions.every(Boolean);\nexport const truthyOrArrayPredicate = (conditions) => conditions.some(Boolean);\n","import { useEffect } from 'react';\nimport { useSyncedRef } from '../useSyncedRef';\nimport { isBrowser } from \"../util/const.js\";\nlet observerSingleton;\nfunction getResizeObserver() {\n if (!isBrowser)\n return undefined;\n if (observerSingleton)\n return observerSingleton;\n const callbacks = new Map();\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => callbacks.get(entry.target)?.forEach((cb) => setTimeout(() => cb(entry), 0)));\n });\n observerSingleton = {\n observer,\n subscribe: (target, callback) => {\n let cbs = callbacks.get(target);\n if (!cbs) {\n // if target has no observers yet - register it\n cbs = new Set();\n callbacks.set(target, cbs);\n observer.observe(target);\n }\n // as Set is duplicate-safe - simply add callback on each call\n cbs.add(callback);\n },\n unsubscribe: (target, callback) => {\n const cbs = callbacks.get(target);\n // else branch should never occur in case of normal execution\n // because callbacks map is hidden in closure - it is impossible to\n // simulate situation with non-existent `cbs` Set\n /* istanbul ignore else */\n if (cbs) {\n // remove current observer\n cbs.delete(callback);\n if (!cbs.size) {\n // if no observers left unregister target completely\n callbacks.delete(target);\n observer.unobserve(target);\n }\n }\n },\n };\n return observerSingleton;\n}\n/**\n * Invokes a callback whenever ResizeObserver detects a change to target's size.\n *\n * @param target React reference or Element to track.\n * @param callback Callback that will be invoked on resize.\n * @param enabled Whether resize observer is enabled or not.\n */\nexport function useResizeObserver(target, callback, enabled = true) {\n const ro = enabled && getResizeObserver();\n const cb = useSyncedRef(callback);\n const tgt = target && 'current' in target ? target.current : target;\n useEffect(() => {\n // this secondary target resolve required for case when we receive ref object, which, most\n // likely, contains null during render stage, but already populated with element during\n // effect stage.\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const tgt = target && 'current' in target ? target.current : target;\n if (!ro || !tgt)\n return;\n // as unsubscription in internals of our ResizeObserver abstraction can\n // happen a bit later than effect cleanup invocation - we need a marker,\n // that this handler should not be invoked anymore\n let subscribed = true;\n const handler = (...args) => {\n // it is reinsurance for the highly asynchronous invocations, almost\n // impossible to achieve in tests, thus excluding from LOC\n /* istanbul ignore else */\n if (subscribed) {\n cb.current(...args);\n }\n };\n ro.subscribe(tgt, handler);\n return () => {\n subscribed = false;\n ro.unsubscribe(tgt, handler);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tgt, ro]);\n}\n","/**\n * A simple guard function:\n *\n * ```js\n * Math.min(Math.max(low, value), high)\n * ```\n */\nfunction guard(low, high, value) {\n return Math.min(Math.max(low, value), high);\n}\n\nclass ColorError extends Error {\n constructor(color) {\n super(`Failed to parse color: \"${color}\"`);\n }\n}\nvar ColorError$1 = ColorError;\n\n/**\n * Parses a color into red, gree, blue, alpha parts\n *\n * @param color the input color. Can be a RGB, RBGA, HSL, HSLA, or named color\n */\nfunction parseToRgba(color) {\n if (typeof color !== 'string') throw new ColorError$1(color);\n if (color.trim().toLowerCase() === 'transparent') return [0, 0, 0, 0];\n let normalizedColor = color.trim();\n normalizedColor = namedColorRegex.test(color) ? nameToHex(color) : color;\n const reducedHexMatch = reducedHexRegex.exec(normalizedColor);\n if (reducedHexMatch) {\n const arr = Array.from(reducedHexMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(r(x, 2), 16)), parseInt(r(arr[3] || 'f', 2), 16) / 255];\n }\n const hexMatch = hexRegex.exec(normalizedColor);\n if (hexMatch) {\n const arr = Array.from(hexMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(x, 16)), parseInt(arr[3] || 'ff', 16) / 255];\n }\n const rgbaMatch = rgbaRegex.exec(normalizedColor);\n if (rgbaMatch) {\n const arr = Array.from(rgbaMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(x, 10)), parseFloat(arr[3] || '1')];\n }\n const hslaMatch = hslaRegex.exec(normalizedColor);\n if (hslaMatch) {\n const [h, s, l, a] = Array.from(hslaMatch).slice(1).map(parseFloat);\n if (guard(0, 100, s) !== s) throw new ColorError$1(color);\n if (guard(0, 100, l) !== l) throw new ColorError$1(color);\n return [...hslToRgb(h, s, l), Number.isNaN(a) ? 1 : a];\n }\n throw new ColorError$1(color);\n}\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i) {\n hash = hash * 33 ^ str.charCodeAt(--i);\n }\n\n /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n * integers. Since we want the results to be always positive, convert the\n * signed int to an unsigned by doing an unsigned bitshift. */\n return (hash >>> 0) % 2341;\n}\nconst colorToInt = x => parseInt(x.replace(/_/g, ''), 36);\nconst compressedColorMap = '1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm'.split(' ').reduce((acc, next) => {\n const key = colorToInt(next.substring(0, 3));\n const hex = colorToInt(next.substring(3)).toString(16);\n\n // NOTE: padStart could be used here but it breaks Node 6 compat\n // https://github.com/ricokahler/color2k/issues/351\n let prefix = '';\n for (let i = 0; i < 6 - hex.length; i++) {\n prefix += '0';\n }\n acc[key] = `${prefix}${hex}`;\n return acc;\n}, {});\n\n/**\n * Checks if a string is a CSS named color and returns its equivalent hex value, otherwise returns the original color.\n */\nfunction nameToHex(color) {\n const normalizedColorName = color.toLowerCase().trim();\n const result = compressedColorMap[hash(normalizedColorName)];\n if (!result) throw new ColorError$1(color);\n return `#${result}`;\n}\nconst r = (str, amount) => Array.from(Array(amount)).map(() => str).join('');\nconst reducedHexRegex = new RegExp(`^#${r('([a-f0-9])', 3)}([a-f0-9])?$`, 'i');\nconst hexRegex = new RegExp(`^#${r('([a-f0-9]{2})', 3)}([a-f0-9]{2})?$`, 'i');\nconst rgbaRegex = new RegExp(`^rgba?\\\\(\\\\s*(\\\\d+)\\\\s*${r(',\\\\s*(\\\\d+)\\\\s*', 2)}(?:,\\\\s*([\\\\d.]+))?\\\\s*\\\\)$`, 'i');\nconst hslaRegex = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i;\nconst namedColorRegex = /^[a-z]+$/i;\nconst roundColor = color => {\n return Math.round(color * 255);\n};\nconst hslToRgb = (hue, saturation, lightness) => {\n let l = lightness / 100;\n if (saturation === 0) {\n // achromatic\n return [l, l, l].map(roundColor);\n }\n\n // formulae from https://en.wikipedia.org/wiki/HSL_and_HSV\n const huePrime = (hue % 360 + 360) % 360 / 60;\n const chroma = (1 - Math.abs(2 * l - 1)) * (saturation / 100);\n const secondComponent = chroma * (1 - Math.abs(huePrime % 2 - 1));\n let red = 0;\n let green = 0;\n let blue = 0;\n if (huePrime >= 0 && huePrime < 1) {\n red = chroma;\n green = secondComponent;\n } else if (huePrime >= 1 && huePrime < 2) {\n red = secondComponent;\n green = chroma;\n } else if (huePrime >= 2 && huePrime < 3) {\n green = chroma;\n blue = secondComponent;\n } else if (huePrime >= 3 && huePrime < 4) {\n green = secondComponent;\n blue = chroma;\n } else if (huePrime >= 4 && huePrime < 5) {\n red = secondComponent;\n blue = chroma;\n } else if (huePrime >= 5 && huePrime < 6) {\n red = chroma;\n blue = secondComponent;\n }\n const lightnessModification = l - chroma / 2;\n const finalRed = red + lightnessModification;\n const finalGreen = green + lightnessModification;\n const finalBlue = blue + lightnessModification;\n return [finalRed, finalGreen, finalBlue].map(roundColor);\n};\n\n// taken from:\n\n/**\n * Parses a color in hue, saturation, lightness, and the alpha channel.\n *\n * Hue is a number between 0 and 360, saturation, lightness, and alpha are\n * decimal percentages between 0 and 1\n */\nfunction parseToHsla(color) {\n const [red, green, blue, alpha] = parseToRgba(color).map((value, index) =>\n // 3rd index is alpha channel which is already normalized\n index === 3 ? value : value / 255);\n const max = Math.max(red, green, blue);\n const min = Math.min(red, green, blue);\n const lightness = (max + min) / 2;\n\n // achromatic\n if (max === min) return [0, 0, lightness, alpha];\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n const hue = 60 * (red === max ? (green - blue) / delta + (green < blue ? 6 : 0) : green === max ? (blue - red) / delta + 2 : (red - green) / delta + 4);\n return [hue, saturation, lightness, alpha];\n}\n\n/**\n * Takes in hsla parts and constructs an hsla string\n *\n * @param hue The color circle (from 0 to 360) - 0 (or 360) is red, 120 is green, 240 is blue\n * @param saturation Percentage of saturation, given as a decimal between 0 and 1\n * @param lightness Percentage of lightness, given as a decimal between 0 and 1\n * @param alpha Percentage of opacity, given as a decimal between 0 and 1\n */\nfunction hsla(hue, saturation, lightness, alpha) {\n return `hsla(${(hue % 360).toFixed()}, ${guard(0, 100, saturation * 100).toFixed()}%, ${guard(0, 100, lightness * 100).toFixed()}%, ${parseFloat(guard(0, 1, alpha).toFixed(3))})`;\n}\n\n/**\n * Adjusts the current hue of the color by the given degrees. Wraps around when\n * over 360.\n *\n * @param color input color\n * @param degrees degrees to adjust the input color, accepts degree integers\n * (0 - 360) and wraps around on overflow\n */\nfunction adjustHue(color, degrees) {\n const [h, s, l, a] = parseToHsla(color);\n return hsla(h + degrees, s, l, a);\n}\n\n/**\n * Darkens using lightness. This is equivalent to subtracting the lightness\n * from the L in HSL.\n *\n * @param amount The amount to darken, given as a decimal between 0 and 1\n */\nfunction darken(color, amount) {\n const [hue, saturation, lightness, alpha] = parseToHsla(color);\n return hsla(hue, saturation, lightness - amount, alpha);\n}\n\n/**\n * Desaturates the input color by the given amount via subtracting from the `s`\n * in `hsla`.\n *\n * @param amount The amount to desaturate, given as a decimal between 0 and 1\n */\nfunction desaturate(color, amount) {\n const [h, s, l, a] = parseToHsla(color);\n return hsla(h, s - amount, l, a);\n}\n\n// taken from:\n// https://github.com/styled-components/polished/blob/0764c982551b487469043acb56281b0358b3107b/src/color/getLuminance.js\n\n/**\n * Returns a number (float) representing the luminance of a color.\n */\nfunction getLuminance(color) {\n if (color === 'transparent') return 0;\n function f(x) {\n const channel = x / 255;\n return channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n }\n const [r, g, b] = parseToRgba(color);\n return 0.2126 * f(r) + 0.7152 * f(g) + 0.0722 * f(b);\n}\n\n// taken from:\n\n/**\n * Returns the contrast ratio between two colors based on\n * [W3's recommended equation for calculating contrast](http://www.w3.org/TR/WCAG20/#contrast-ratiodef).\n */\nfunction getContrast(color1, color2) {\n const luminance1 = getLuminance(color1);\n const luminance2 = getLuminance(color2);\n return luminance1 > luminance2 ? (luminance1 + 0.05) / (luminance2 + 0.05) : (luminance2 + 0.05) / (luminance1 + 0.05);\n}\n\n/**\n * Takes in rgba parts and returns an rgba string\n *\n * @param red The amount of red in the red channel, given in a number between 0 and 255 inclusive\n * @param green The amount of green in the red channel, given in a number between 0 and 255 inclusive\n * @param blue The amount of blue in the red channel, given in a number between 0 and 255 inclusive\n * @param alpha Percentage of opacity, given as a decimal between 0 and 1\n */\nfunction rgba(red, green, blue, alpha) {\n return `rgba(${guard(0, 255, red).toFixed()}, ${guard(0, 255, green).toFixed()}, ${guard(0, 255, blue).toFixed()}, ${parseFloat(guard(0, 1, alpha).toFixed(3))})`;\n}\n\n/**\n * Mixes two colors together. Taken from sass's implementation.\n */\nfunction mix(color1, color2, weight) {\n const normalize = (n, index) =>\n // 3rd index is alpha channel which is already normalized\n index === 3 ? n : n / 255;\n const [r1, g1, b1, a1] = parseToRgba(color1).map(normalize);\n const [r2, g2, b2, a2] = parseToRgba(color2).map(normalize);\n\n // The formula is copied from the original Sass implementation:\n // http://sass-lang.com/documentation/Sass/Script/Functions.html#mix-instance_method\n const alphaDelta = a2 - a1;\n const normalizedWeight = weight * 2 - 1;\n const combinedWeight = normalizedWeight * alphaDelta === -1 ? normalizedWeight : normalizedWeight + alphaDelta / (1 + normalizedWeight * alphaDelta);\n const weight2 = (combinedWeight + 1) / 2;\n const weight1 = 1 - weight2;\n const r = (r1 * weight1 + r2 * weight2) * 255;\n const g = (g1 * weight1 + g2 * weight2) * 255;\n const b = (b1 * weight1 + b2 * weight2) * 255;\n const a = a2 * weight + a1 * (1 - weight);\n return rgba(r, g, b, a);\n}\n\n/**\n * Given a series colors, this function will return a `scale(x)` function that\n * accepts a percentage as a decimal between 0 and 1 and returns the color at\n * that percentage in the scale.\n *\n * ```js\n * const scale = getScale('red', 'yellow', 'green');\n * console.log(scale(0)); // rgba(255, 0, 0, 1)\n * console.log(scale(0.5)); // rgba(255, 255, 0, 1)\n * console.log(scale(1)); // rgba(0, 128, 0, 1)\n * ```\n *\n * If you'd like to limit the domain and range like chroma-js, we recommend\n * wrapping scale again.\n *\n * ```js\n * const _scale = getScale('red', 'yellow', 'green');\n * const scale = x => _scale(x / 100);\n *\n * console.log(scale(0)); // rgba(255, 0, 0, 1)\n * console.log(scale(50)); // rgba(255, 255, 0, 1)\n * console.log(scale(100)); // rgba(0, 128, 0, 1)\n * ```\n */\nfunction getScale(...colors) {\n return n => {\n const lastIndex = colors.length - 1;\n const lowIndex = guard(0, lastIndex, Math.floor(n * lastIndex));\n const highIndex = guard(0, lastIndex, Math.ceil(n * lastIndex));\n const color1 = colors[lowIndex];\n const color2 = colors[highIndex];\n const unit = 1 / lastIndex;\n const weight = (n - unit * lowIndex) / unit;\n return mix(color1, color2, weight);\n };\n}\n\nconst guidelines = {\n decorative: 1.5,\n readable: 3,\n aa: 4.5,\n aaa: 7\n};\n\n/**\n * Returns whether or not a color has bad contrast against a background\n * according to a given standard.\n */\nfunction hasBadContrast(color, standard = 'aa', background = '#fff') {\n return getContrast(color, background) < guidelines[standard];\n}\n\n/**\n * Lightens a color by a given amount. This is equivalent to\n * `darken(color, -amount)`\n *\n * @param amount The amount to darken, given as a decimal between 0 and 1\n */\nfunction lighten(color, amount) {\n return darken(color, -amount);\n}\n\n/**\n * Takes in a color and makes it more transparent by convert to `rgba` and\n * decreasing the amount in the alpha channel.\n *\n * @param amount The amount to increase the transparency by, given as a decimal between 0 and 1\n */\nfunction transparentize(color, amount) {\n const [r, g, b, a] = parseToRgba(color);\n return rgba(r, g, b, a - amount);\n}\n\n/**\n * Takes a color and un-transparentizes it. Equivalent to\n * `transparentize(color, -amount)`\n *\n * @param amount The amount to increase the opacity by, given as a decimal between 0 and 1\n */\nfunction opacify(color, amount) {\n return transparentize(color, -amount);\n}\n\n/**\n * An alternative function to `readableColor`. Returns whether or not the \n * readable color (i.e. the color to be place on top the input color) should be\n * black.\n */\nfunction readableColorIsBlack(color) {\n return getLuminance(color) > 0.179;\n}\n\n/**\n * Returns black or white for best contrast depending on the luminosity of the\n * given color.\n */\nfunction readableColor(color) {\n return readableColorIsBlack(color) ? '#000' : '#fff';\n}\n\n/**\n * Saturates a color by converting it to `hsl` and increasing the saturation\n * amount. Equivalent to `desaturate(color, -amount)`\n * \n * @param color Input color\n * @param amount The amount to darken, given as a decimal between 0 and 1\n */\nfunction saturate(color, amount) {\n return desaturate(color, -amount);\n}\n\n/**\n * Takes in any color and returns it as a hex code.\n */\nfunction toHex(color) {\n const [r, g, b, a] = parseToRgba(color);\n let hex = x => {\n const h = guard(0, 255, x).toString(16);\n // NOTE: padStart could be used here but it breaks Node 6 compat\n // https://github.com/ricokahler/color2k/issues/351\n return h.length === 1 ? `0${h}` : h;\n };\n return `#${hex(r)}${hex(g)}${hex(b)}${a < 1 ? hex(Math.round(a * 255)) : ''}`;\n}\n\n/**\n * Takes in any color and returns it as an rgba string.\n */\nfunction toRgba(color) {\n return rgba(...parseToRgba(color));\n}\n\n/**\n * Takes in any color and returns it as an hsla string.\n */\nfunction toHsla(color) {\n return hsla(...parseToHsla(color));\n}\n\nexport { ColorError$1 as ColorError, adjustHue, darken, desaturate, getContrast, getLuminance, getScale, guard, hasBadContrast, hsla, lighten, mix, opacify, parseToHsla, parseToRgba, readableColor, readableColorIsBlack, rgba, saturate, toHex, toHsla, toRgba, transparentize };\n//# sourceMappingURL=index.module.es.js.map\n","import React from \"react\";\nimport { css } from \"goober\";\n\nimport { readableColorIsBlack } from \"color2k\";\n\nconst cursorClass = css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n zIndex: 210,\n pointerEvents: \"none\",\n});\n\nconst cursorLabelClass = css({\n fontWeight: \"bold\",\n padding: \"0 0.5em\",\n borderRadius: \"2px\",\n maxWidth: \"5em\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n marginLeft: \"-0.5em\",\n marginTop: \"1.7em\",\n whitespace: \"nowrap\",\n pointerEvents: \"none\",\n});\n\nconst Cursor = ({ color = \"#666\", size = 40, text }) => {\n const textColor = readableColorIsBlack(color) ? \"#222\" : \"#EEE\";\n return (\n <div className={cursorClass}>\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"1064.7701 445.5539 419.8101 717.0565\"\n width={size}\n height={size}\n >\n <path\n d=\"m 1197.1015,869.718 -62.2719,-154.49286 133.3276,-9.05842 -257.6915,-253.12748 1.2392,356.98609 88.2465,-79.47087 61.702,152.78366 z\"\n style={{\n fill: textColor,\n }}\n />\n <path\n d=\"m 1193.0939,861.12419 -62.2719,-154.49286 133.3276,-9.05842 -257.6915,-253.12748 1.2392,356.98609 88.2465,-79.47087 61.702,152.78366 z\"\n style={{\n fill: \"white\",\n stroke: \"#111\",\n strokeWidth: 20,\n }}\n />\n </svg>\n <div\n style={{\n color: textColor,\n backgroundColor: color,\n }}\n className={cursorLabelClass}\n >\n {text}\n </div>\n </div>\n );\n};\n\nconst MemoizedCursor = React.memo(Cursor);\n\nconst defaultPositionedCursorClass = css({\n top: 0,\n left: 0,\n zIndex: 210,\n position: \"fixed\",\n pointerEvents: \"none\",\n});\n\nconst PositionedCursor = ({ pos, ...rest }) => {\n return (\n <div\n className={defaultPositionedCursorClass}\n style={{\n transform: `translate(${pos.x - 6}px, ${pos.y - 15}px)`,\n }}\n >\n <MemoizedCursor {...rest} />\n </div>\n );\n};\n\nexport default PositionedCursor;\n","import React from \"react\";\nimport Cursor from \"./Cursor\";\nimport { useSyncedUsers } from \"@/users/store\";\nimport useDim from \"@/board/useDim\";\nimport { isPointInsideRect } from \"@/utils\";\nimport useMainStore from \"@/board/store/main\";\n\nconst CursorPane = ({ children }) => {\n const [getConfiguration] = useMainStore((state) => [\n state.getConfiguration,\n state.boardState.scale, // We want to update this component when the scale changes\n ]);\n const { fromWrapperToBoard, fromBoardToWrapper } = useDim();\n const [currentUser, localUsers, cursors, usersById] = useSyncedUsers(\n (state) => [\n state.getUser(),\n state.getLocalUsers(),\n state.cursors,\n state.users,\n ]\n );\n const [moveCursor, removeCursor] = useSyncedUsers((state) => [\n state.moveCursor,\n state.removeCursor,\n ]);\n\n const { boardWrapperRect } = getConfiguration();\n\n const onMouseMove = ({ clientX, clientY }) => {\n const [x, y] = fromWrapperToBoard(\n clientX - boardWrapperRect.left,\n clientY - boardWrapperRect.top\n );\n moveCursor(currentUser.id, { x, y });\n };\n\n const onLeave = () => {\n removeCursor(currentUser.id);\n };\n\n // Prevent race condition when removing user\n const currentCursors = localUsers.reduce((acc, user) => {\n if (user.id !== currentUser.id && cursors[user.id]) {\n acc[user.id] = cursors[user.id];\n }\n return acc;\n }, {});\n\n return (\n <div onPointerMove={onMouseMove} onPointerLeave={onLeave}>\n {children}\n {Object.entries(currentCursors).map(([userId, pos]) => {\n const [x, y] = fromBoardToWrapper(pos.x, pos.y);\n const coord = {\n x: x + boardWrapperRect.left,\n y: y + boardWrapperRect.top,\n };\n if (!isPointInsideRect(coord, boardWrapperRect)) {\n return null;\n }\n return (\n <Cursor\n key={userId}\n pos={coord}\n text={usersById[userId].name}\n color={usersById[userId].color}\n />\n );\n })}\n </div>\n );\n};\n\nexport default CursorPane;\n","import React from \"react\";\nimport { nanoid } from \"nanoid\";\n\nimport { ItemList } from \"./Items\";\nimport Selector from \"./Selector\";\nimport ActionPane from \"./ActionPane\";\nimport PanZoom from \"./PanZoom\";\nimport Selection from \"./Selection\";\nimport { DEFAULT_BOARD_MAX_SIZE } from \"@/settings\";\nimport useDim from \"./useDim\";\nimport useMainStore from \"./store/main\";\n\nimport { insideClass } from \"@/utils\";\nimport { useResizeObserver } from \"@react-hookz/web/esm/useResizeObserver\";\nimport { css } from \"goober\";\nimport CursorPane from \"./Cursors/CursorPane\";\n\nconst NullWrapper = ({ children }) => children;\n\nconst defaultStyle = {\n overflow: \"hidden\",\n position: \"absolute\",\n inset: 0,\n};\n\nconst Board = ({\n moveFirst = true,\n style,\n wrapperStyle,\n itemTemplates = {},\n boardSize = DEFAULT_BOARD_MAX_SIZE,\n children,\n showResizeHandle = false,\n Wrapper = NullWrapper,\n}) => {\n const boardWrapperRef = React.useRef(null);\n const [uid, updateConfiguration] = useMainStore((state) => [\n state.config.uid,\n state.updateConfiguration,\n ]);\n const { updateItemExtent } = useDim();\n\n const boardStyle = {\n userSelect: \"none\",\n width: `${boardSize}px`,\n height: `${boardSize}px`,\n backgroundColor: \"#333\",\n ...style,\n };\n\n React.useEffect(() => {\n // Chrome-related issue.\n // Making the wheel event non-passive, which allows to use preventDefault() to prevent\n // the browser original zoom and therefore allowing our custom one.\n // More detail at https://github.com/facebook/react/issues/14856\n const cancelWheel = (event) => {\n if (insideClass(event.target, \"board\")) event.preventDefault();\n };\n\n document.body.addEventListener(\"wheel\", cancelWheel, { passive: false });\n\n return () => {\n document.body.removeEventListener(\"wheel\", cancelWheel);\n };\n }, []);\n\n React.useEffect(() => {\n updateConfiguration({\n boardWrapper: boardWrapperRef.current,\n });\n }, [updateConfiguration]);\n\n React.useEffect(() => {\n if (!uid) {\n updateConfiguration({\n uid: nanoid(),\n });\n }\n }, [uid, updateConfiguration]);\n\n React.useEffect(() => {\n updateConfiguration({\n itemTemplates,\n boardSize,\n showResizeHandle,\n });\n }, [itemTemplates, boardSize, showResizeHandle, updateConfiguration]);\n\n React.useEffect(() => {\n updateConfiguration({\n boardWrapperRect: boardWrapperRef.current.getBoundingClientRect(),\n });\n updateItemExtent();\n // Hack to update item extent on load\n setTimeout(updateItemExtent, 2000);\n }, [updateConfiguration, updateItemExtent]);\n\n useResizeObserver(boardWrapperRef, () => {\n if (!boardWrapperRef.current) {\n return;\n }\n updateConfiguration({\n boardWrapperRect: boardWrapperRef.current.getBoundingClientRect(),\n });\n });\n\n const boardWrapperClass = css({ ...defaultStyle, ...wrapperStyle });\n\n return (\n <div\n ref={boardWrapperRef}\n id={uid}\n className={`sync-board ${boardWrapperClass}`}\n >\n <CursorPane>\n <Selector moveFirst={moveFirst}>\n <PanZoom moveFirst={moveFirst}>\n <ActionPane moveFirst={moveFirst}>\n <Wrapper>\n <div\n onContextMenu={(e) => {\n e.preventDefault();\n }}\n style={boardStyle}\n className=\"board\"\n >\n <ItemList />\n {children}\n </div>\n </Wrapper>\n </ActionPane>\n </PanZoom>\n </Selector>\n </CursorPane>\n <Selection />\n </div>\n );\n};\n\nexport default Board;\n","export { default as useWire } from \"@/hooks/useWire\";\n\nexport { default as useItems } from \"@/board/Items/useItems\";\nexport { default as useDebouncedItems } from \"@/board/Items/useDebouncedItems\";\nexport { default as useSelectedItems } from \"@/board/Items/useSelectedItems\";\nexport { default as useGetSelectedItems } from \"@/board/Items/useGetSelectedItems\";\nexport { default as useItemActions } from \"@/board/Items/useItemActions\";\nexport { default as useItemInteraction } from \"@/board/Items/useItemInteraction\";\nexport { default as useAvailableActions } from \"@/board/Items/useAvailableActions\";\n\nexport { default as useSelectionBox } from \"@/board/useSelectionBox\";\n\nexport { useUsers } from \"@/users\";\n\nexport { default as useBoardConfig } from \"@/board/useBoardConfig\";\nexport { default as useBoardState } from \"@/board/useBoardState\";\nexport { default as useBoardPosition } from \"@/board/useDim\";\nexport { default as useSessionInfo } from \"@/board/useSessionInfo\";\n\nexport { default as useMessage } from \"@/message/useMessage\";\n\nexport { default as BoardWrapper } from \"@/BoardWrapper\";\nexport { default as RoomWrapper } from \"@/RoomWrapper\";\nexport { default as Board } from \"@/board/Board\";\n\nimport React from \"react\";\nimport { setup } from \"goober\";\n\nsetup(React.createElement);\n"],"names":["f","require$$0","k","l","m","n","p","q","c","a","g","b","d","e","h","reactJsxRuntime_production_min","React","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","ReactSharedInternals","error","format","_len2","args","_key2","printWarning","level","ReactDebugCurrentFrame","stack","argsWithFormat","item","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","type","getWrappedName","outerType","innerType","wrapperName","displayName","functionName","getContextName","getComponentNameFromType","context","provider","outerName","lazyComponent","payload","init","assign","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","disableLogs","props","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","name","source","ownerFn","x","match","reentry","componentFrameCache","PossiblyWeakMap","describeNativeComponentFrame","fn","construct","frame","control","previousPrepareStackTrace","previousDispatcher","Fake","sample","sampleLines","controlLines","s","_frame","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","prototype","describeUnknownElementTypeFrameInDEV","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","checkPropTypes","typeSpecs","values","location","componentName","has","typeSpecName","error$1","err","ex","isArrayImpl","isArray","typeName","value","hasToStringTag","willCoercionThrow","testStringCoercion","checkKeyStringCoercion","ReactCurrentOwner","RESERVED_PROPS","specialPropKeyWarningShown","specialPropRefWarningShown","didWarnAboutStringRefs","hasValidRef","config","getter","hasValidKey","warnIfStringRefCannotBeAutoConverted","self","defineKeyPropWarningGetter","warnAboutAccessingKey","defineRefPropWarningGetter","warnAboutAccessingRef","ReactElement","key","ref","jsxDEV","maybeKey","propName","defaultProps","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","isValidElement","object","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","fileName","lineNumber","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","info","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","validateChildKeys","node","i","child","iteratorFn","iterator","step","validatePropTypes","propTypes","_name","validateFragmentProps","fragment","keys","jsxWithValidation","isStaticChildren","validType","sourceInfo","typeString","children","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","reactJsxRuntime_development","module","require$$1","nanoid","size","id","byte","Wire","socket","room","userId","callId","params","result","resolve","reject","callback","event","unregisterCallback","invoke","joinWire","onJoined","onMaster","WireRoom","waitForResponse","Context","DefaultLoading","WireProvider","channel","LoadingComponent","joined","setJoined","isMaster","setIsMaster","wire","setWire","roomRef","mountedRef","existingC2C","useContext","connectingRef","disconnect","newRoom","_a","useWire","createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","createStore","r","t","u","useSyncExternalStoreShim_production_min","is","y","objectIs","useState","useEffect","useLayoutEffect","useDebugValue","didWarnOld18Alpha","didWarnUncachedGetSnapshot","useSyncExternalStore","subscribe","getSnapshot","getServerSnapshot","cachedValue","_useState","inst","forceUpdate","checkIfSnapshotChanged","handleStoreChange","latestGetSnapshot","prevValue","nextValue","useSyncExternalStore$1","canUseDOM","isServerEnvironment","shim","useSyncExternalStore$2","useSyncExternalStoreShim_development","v","w","withSelector_production_min","useRef","useMemo","useSyncExternalStoreWithSelector","selector","isEqual","instRef","_useMemo","hasMemo","memoizedSnapshot","memoizedSelection","memoizedSelector","nextSnapshot","_nextSelection","currentSelection","prevSnapshot","prevSelection","nextSelection","maybeGetServerSnapshot","getSnapshotWithSelector","getServerSnapshotWithSelector","getSelection","getServerSelection","withSelector_development","useSyncExternalStoreExports","useStore","equalityFn","slice","hasClass","className","insideClass","distance","x1","y1","x2","y2","distanceX","distanceY","rotateCoordinates","angle","angleInRadians","xRotated","yRotated","transformFrom","scale","rotate","translateX","translateY","xScaled","yScaled","transformTo","xInvRotated","yInvRotated","intersectSegmentCircle","p1","p2","circle","radius","Ax","Ay","Bx","By","Cx","Cy","Dx","Dy","Ex","Ey","discriminant","t1","t2","intersections","isPointInsideRect","point","rect","isItemInsideRect","itemElement","corner","isItemInsideElement","otherElem","getItemElem","uid","itemId","elem","getIdFromElem","_b","getItemsBoundingBox","itemIds","prev","left","right","top","bottom","boundingBox","getLinkedItemsRecursive","itemMap","alreadyMet","getLinkedItems","orderedItemIds","linkedItems","snapToGrid","width","height","offset","centerX","centerY","newX","newY","sizeX","sizeY","px1","px2","py1","py2","diff1","diff2","colors","getRandomColor","debug","syncMiddleware","storeName","noSync","defaultValue","set","get","unsubs","newValue","methodName","previousFn","syncResult","unsub","shallow","objA","objB","keysA","itemsStore","newItems","toUpdate","patch","posDelta","prevItems","itemIdsStore","position","index","commonStore","itemIdsToRemove","items","itemList","beforeId","newItemIds","itemIdsToAdd","insertAt","boardStore","newBoardConfig","sessionInfoStore","newSession","SyncedStoreProvider","ready","setReady","store","unsubscribe","useSyncedStore","useItems","useDebouncedItems","getItemList","debouncedItems","setDebouncedItems","startTransition","currentItemList","DEFAULT_BOARD_MAX_SIZE","configuration","boardState","itemInteractions","interaction","nextInteraction","selection","idsToSelect","idsToAdd","itemsIdToRemove","reversed","newSelectionBox","prevBB","MainStoreProvider","useMainStore","useSelectedItems","useGetSelectedItems","useSyncedRef","useUnmountEffect","effect","effectRef","useDebouncedCallback","deps","delay","maxWait","timeout","waitTimeout","lastCall","clear","execute","wrapped","TOLERANCE","MIN_SIZE","SCALE_TOLERANCE","translateBoundaries","itemExtent","boardWrapperRect","boardSize","screenCenter","extentPos","boardCenter","distToExtent","minDim","maxDistToExtent","inter","distToCenter","maxDistToCenter","useDim","getBoardState","updateBoardState","itemExtentGlobal","getConfiguration","updateConfiguration","scaleBoundariesRef","getDim","fromWrapperToBoard","fromBoardToWrapper","vectorFromWrapperToBoard","clampScale","setDimSafe","newRotate","newScale","moveBoard","newTranslatOrFn","translateFn","zoomToCenter","to","factor","center","newTx","newTy","zoomToExtent","safeX","safeY","safeRadius","scaleX","scaleY","getCenterCoordinates","updateItemExtent","newRes","final","rotateBoard","newAngleOrFn","applyRotate","debouncedUpdateItemExtent","useItemInteraction","registerInStore","unregister","callInteractions","register","call","useItemActions","callPlaceInteractions","callDeleteInteractions","getCenter","clearSelection","reverseSelection","unselect","getStoreItems","getItemIds","setItemIds","updateItems","moveStoreItems","removeItemsById","insertItems","setItemList","getItems","moveItems","batchUpdateItems","callbackOrItem","prevMap","updateList","prevItem","setItemListFull","updateItem","putItemsOnTop","itemIdsToMove","prevItemIds","filtered","toBePutOnTop","stickOnGrid","globalType","globalSize","gridConfig","placeItems","itemIdsWithLinkedItems","updateItemOrder","newOrder","reverseItemsOrder","itemIdsToReverse","toBeReversed","swapItems","fromIds","toIds","prevItemMap","newCoordinatesMap","toItemId","replaceWith","replaceMap","reorderedItemIds","pushItems","itemsToInsert","itemsWithPosition","pushItem","itemToInsert","removeItems","findElementUnderPointer","target","clientX","clientY","returnLocked","passLocked","foundElement","elements","itemRect","es6","equal","length","useDebouncedEffect","getDefaultActionsFromItem","actions","getActionsFromItem","action","useAvailableActions","itemTemplates","availableActions","setAvailableActions","isMountedRef","getItemListOrSelected","currentItemMap","selectedItems","updateAvailableActions","useCallback","selectedItemIds","selectedItemList","allActions","acc","itemActions","itemAction","deepEqual","useSelectionBox","selectionBox","persistUser","user","restoreUser","localUser","newUser","usersStore","curentUserId","currentUserSpace","space","newUsers","localUsers","master","spaceJoinedTimestamp","cursorsStore","newPos","newCursors","SyncedUsersProvider","setStore","storeRef","mounted","localStore","useSyncedUsers","useUsers","isSpaceMaster","currentUser","userMap","updateCurrentUser","joinSpace","users","useBoardConfig","boardConfig","getBoardConfig","setBoardConfig","setSyncBoardConfig","callbackOrConfig","currentConfig","newConfig","useBoardState","useSessionInfo","getSessionInfo","setSessionInfo","updateSessionInfo","sessionInfo","generateMsg","color","content","messageStore","newMessages","newMessage","SyncedMessageProvider","useSyncedMessage","noop","useMessage","onMessage","messages","setMessages","sendMessage","sendMessageWithUser","messageContent","SyncBoard","session","ConnectedSyncBoard","stableRoom","stableSession","defaultItemsValue","ConnectedSyncRoom","o","fastDeepEqual","isMacOS","userAgent","LINE_HEIGHT","iframe","idoc","scrollLineHeight","PAGE_HEIGHT","otherPointer","pointers","currentPointer","pointer","computeDistance","empty","stopPropagation","arg","protect","PromiseQueue","__publicField","operation","promiseQueue","Gesture","onDrag","onDragStart","onDragEnd","onPan","onTap","onLongTap","onDoubleTap","onZoom","mainAction","wrapperRef","stateRef","onWheel","deltaX","deltaY","deltaMode","ctrlKey","altKey","metaKey","onPointerDown","button","pointerId","isPrimary","clientX2","clientY2","newClientX","newClientY","onPointerMove","eventClientX","eventClientY","shiftKey","buttons","twoPointers","distanceBetweenTwoPointers","altAction","shouldDrag","shouldPan","onPointerUp","now","ResizeHandler","onResize","rest","itemClass","css","selectedItemClass","itemMark","itemMarkTopLeft","itemMarkTopRight","itemMarkBottomLeft","itemMarkBottomRight","itemMarkCenter","itemResize","itemResizeWidth","itemResizeHeight","itemResizeRatio","DefaultErrorComponent","onReload","ItemErrorBoundary","ErrorComponent","removeClass","defaultResize","actualWidth","actualHeight","prevState","keepRatio","currentWidth","currentHeight","ratio","defaultResizeDirection","Item","rotation","locked","extraClasses","animate","isSelected","showResizeHandle","itemWrapperRef","resizeDirections","resize","updateState","classes","offsetWidth","offsetHeight","onResizeWidth","onResizeHeight","onResizeRatio","Fragment","MemoizedItem","memo","prevSetState","prevIsSelected","prevShowResizeHandle","nextSetState","nextIsSelected","nextShowResizeHandle","identity","PositionedItem","getCurrentUser","stateHook","layer","moving","stateRest","zIndex","MemoizedPositionedItem","ItemList","itemClassName","useIsMounted","initialValue","isMounted","on","obj","off","property","useEventListener","listenerRef","eventListener","tgt","restParams","defaultSelectorClass","findSelected","wrapper","ignoreLocked","selectors","Selector","moveFirst","setSelection","select","setSelector","setIgnoreLocked","boardWrapper","selected","startX","startY","relativeX","relativeY","ActionPane","actionRef","selectedItemRef","originalEvent","movingItems","boardGridSize","gridSize","moveX","moveY","useMousePosition","mouseRef","digitCodes","usePositionNavigator","positions","setPositions","positionKey","PanZoom","wrappedRef","dim","centered","setCentered","timeoutRef","getMouseInfo","centerBoard","onKeyDown","zoom","onKeyUp","defaultZoneStyle","BoundingBox","setSelectionBox","updateBox","currentSelectedItems","newBB","updateBoxDelay","Selection","isBrowser","observerSingleton","getResizeObserver","callbacks","observer","entries","entry","cb","cbs","useResizeObserver","enabled","ro","subscribed","handler","guard","low","high","ColorError","ColorError$1","parseToRgba","normalizedColor","namedColorRegex","nameToHex","reducedHexMatch","reducedHexRegex","arr","hexMatch","hexRegex","rgbaMatch","rgbaRegex","hslaMatch","hslaRegex","hslToRgb","hash","str","colorToInt","compressedColorMap","next","hex","normalizedColorName","amount","roundColor","hue","saturation","lightness","huePrime","chroma","secondComponent","red","green","blue","lightnessModification","finalRed","finalGreen","finalBlue","getLuminance","readableColorIsBlack","cursorClass","cursorLabelClass","Cursor","text","textColor","MemoizedCursor","defaultPositionedCursorClass","PositionedCursor","pos","CursorPane","cursors","usersById","moveCursor","removeCursor","onMouseMove","onLeave","currentCursors","coord","NullWrapper","defaultStyle","Board","style","wrapperStyle","Wrapper","boardWrapperRef","boardStyle","cancelWheel","boardWrapperClass","setup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-sync-board.umd.cjs","names":["nanoid","nanoid"],"sources":["../node_modules/wire.io/node_modules/nanoid/index.browser.js","../node_modules/wire.io/src/client.js","../src/lib/hooks/useWire.jsx","../src/lib/utils.js","../src/lib/board/store/synced.jsx","../src/lib/board/Items/useItems.js","../src/lib/board/Items/useDebouncedItems.js","../src/lib/settings.js","../src/lib/board/store/main.jsx","../src/lib/board/Items/useSelectedItems.js","../src/lib/board/Items/useGetSelectedItems.js","../src/lib/board/useDim.js","../src/lib/board/Items/useItemInteraction.js","../src/lib/board/Items/useItemActions.js","../node_modules/fast-deep-equal/es6/index.js","../src/lib/board/Items/useAvailableActions.js","../src/lib/board/useSelectionBox.js","../node_modules/nanoid/url-alphabet/index.js","../node_modules/nanoid/index.browser.js","../src/lib/users/store.jsx","../src/lib/users/useUsers.jsx","../src/lib/board/useBoardConfig.jsx","../src/lib/board/useBoardState.js","../src/lib/board/useSessionInfo.jsx","../src/lib/message/store.jsx","../src/lib/message/useMessage.js","../src/lib/BoardWrapper.jsx","../src/lib/RoomWrapper.jsx","../node_modules/goober/dist/goober.modern.js","../node_modules/fast-deep-equal/index.js","../src/lib/board/Gesture.jsx","../src/lib/board/Items/ResizeHandler.jsx","../src/lib/board/Items/Item.jsx","../src/lib/board/Items/ItemList.jsx","../src/lib/board/Selector.jsx","../src/lib/board/ActionPane.jsx","../src/lib/board/useMousePosition.js","../src/lib/board/usePositionNavigator.jsx","../src/lib/board/PanZoom.jsx","../src/lib/board/Selection.jsx","../node_modules/color2k/dist/index.exports.import.es.mjs","../src/lib/board/Cursors/Cursor.jsx","../src/lib/board/Cursors/CursorPane.jsx","../src/lib/board/Board.jsx","../src/lib/index.js"],"sourcesContent":["export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n","import { nanoid } from 'nanoid';\n\nclass Wire {\n constructor(socket, room, userId = null) {\n this._socket = socket;\n this.userId = userId;\n this.room = room;\n this.toUnregister = [\n () => {\n this._socket.off(`${this.room}.isMaster`);\n this._socket.off(`${this.room}.roomJoined`);\n this._socket.off(`${this.room}._call`);\n },\n ];\n this._left = false;\n\n this.registeredRPC = {};\n\n // Receive server RPC calls\n this._socket.on(`${this.room}._call`, async ({ callId, name, params }) => {\n try {\n const result = await this.registeredRPC[name](params);\n socket.emit(`${this.room}._result.${callId}`, {\n ok: result ? result : null,\n });\n } catch (err) {\n socket.emit(`${this.room}._result.${callId}`, {\n err: `${err.message}`,\n });\n }\n });\n }\n\n /**\n * Call a server procedure.\n *\n * @param {string} action name of the operation to call on the server.\n * @param {*} params the params of the action.\n * @returns the result of the call.\n */\n async _callServerRPC(name, params) {\n const callId = nanoid();\n return new Promise((resolve, reject) => {\n this._socket.once(`${this.room}._result.${callId}`, (result) => {\n if (result.hasOwnProperty('ok')) {\n resolve(result.ok);\n } else {\n reject(result.err);\n }\n });\n this._socket.emit(`${this.room}._call`, { callId, name, params });\n });\n }\n\n /**\n * Leave current room\n * @param {string} room name.\n */\n leave() {\n this._left = true;\n this.toUnregister.forEach((callback) => {\n callback();\n });\n this._socket.emit(`${this.room}.leave`);\n }\n\n /**\n * Send an event to all other client in room. Also to self if true.\n * @param {string} name Name of event\n * @param {*} params arguments of event\n * @param {boolean} self if true, the publish get the event too\n */\n publish(name, params, self = false) {\n this._socket.emit(`${this.room}.publish`, { name, params, self });\n }\n\n /**\n * Subscribe to an event.\n * @param {string} event Name of event\n * @param {function} callback Called when the event is received. First param\n * of the function is the params sent with the event.\n */\n subscribe(event, callback) {\n this._socket.on(`${this.room}.${event}`, callback);\n\n const unregisterCallback = () => {\n this._socket.off(`${this.room}.${event}`, callback);\n };\n\n this.toUnregister.push(unregisterCallback);\n\n return unregisterCallback;\n }\n\n /**\n * Register a new RPC function.\n * @param {string} name of function\n * @param {function} callback the function that handle the function result\n * @param {object} params the configuration of the RPC. For now only `invoke`\n * parameter is allowed with the following values:\n * - 'single' for a RPC that can be registered only once.\n * - 'first' The first registered client is called.\n * - 'last' The last registered client is called.\n * - 'random' A random RPC is called.\n */\n async register(name, callback, { invoke = 'single' } = {}) {\n // Add to locally registered callback\n\n this.registeredRPC[name] = callback;\n\n await this._callServerRPC('register', {\n name,\n invoke,\n });\n\n // Return unregister callback\n const unregisterCallback = () => {\n if (this.registeredRPC[name] === callback) {\n delete this.registeredRPC[name];\n return this._callServerRPC('unregister', { name });\n }\n };\n\n this.toUnregister.push(unregisterCallback);\n\n return unregisterCallback;\n }\n\n /**\n * Call a previously registered function with `params` arguments.\n * @param {string} name of function\n * @param {*} params parameters of the called function.\n */\n async call(name, params) {\n return await this._callServerRPC('call', { name, params });\n }\n}\n\n/**\n * Join a wire.io room.\n * @param {socket} socket socket.io instance.\n * @param {string} name of the room\n * @param {function} onMaster is called when the client become the master of\n * the room, i.e. the first client or the next one if the first quit.\n * @param {function} onJoined is called on each connection, reconnection after\n * wire.io is initialized.\n * @param {string} userId (optional) to force userId.\n */\nexport const joinWire = ({\n socket,\n room,\n onJoined = () => {},\n onMaster = () => {},\n userId = null,\n}) => {\n const WireRoom = new Wire(socket, room, userId);\n return new Promise((resolve) => {\n // Avoid multiple join\n let waitForResponse = true;\n socket.on(`${room}.isMaster`, () => {\n if (WireRoom._left) {\n return;\n }\n onMaster(room);\n });\n\n socket.on(`${room}.roomJoined`, (userId) => {\n if (WireRoom._left) {\n return;\n }\n WireRoom.userId = userId;\n waitForResponse = false;\n onJoined(WireRoom);\n resolve(WireRoom);\n });\n\n // Rejoin on reconnection\n socket.on('connect', () => {\n // If joined already called or room left\n // we quit\n if (WireRoom._left || waitForResponse) {\n return;\n }\n // Restore events with same userId\n socket.emit('joinSuperSocket', {\n room,\n userId: WireRoom.userId,\n });\n });\n socket.emit('joinSuperSocket', { room, userId });\n });\n};\n\nexport default joinWire;\n","import React, { useContext } from \"react\";\nimport { joinWire } from \"wire.io\";\n\nconst Context = React.createContext();\n\nexport const DefaultLoading = () => {\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"0\",\n bottom: \"0\",\n width: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <h2>🌀 Loading...</h2>\n </div>\n );\n};\n\nexport const WireProvider = ({\n socket,\n room,\n channel = \"default\",\n LoadingComponent = DefaultLoading,\n children,\n}) => {\n const [joined, setJoined] = React.useState(false);\n const [isMaster, setIsMaster] = React.useState(false);\n const [wire, setWire] = React.useState(null);\n const roomRef = React.useRef(null);\n const mountedRef = React.useRef(false);\n const existingC2C = useContext(Context);\n const connectingRef = React.useRef(false);\n\n React.useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n React.useEffect(() => {\n if (!socket) {\n return null;\n }\n\n const disconnect = () => {\n console.log(`Disconnected from ${channel}…`);\n if (!mountedRef.current) return;\n setJoined(false);\n setIsMaster(false);\n };\n\n socket.on(\"disconnect\", disconnect);\n return () => {\n socket.off(\"disconnect\", disconnect);\n };\n }, [channel, socket]);\n\n React.useEffect(() => {\n // Connect\n if (!socket) {\n return null;\n }\n if (!socket.connected) {\n socket.connect();\n }\n console.log(`Try to connect to wire ${room} on channel ${channel}`);\n if (!connectingRef.current) {\n connectingRef.current = true;\n joinWire({\n socket,\n room,\n onMaster: () => {\n console.log(`Is now master on channel ${channel}…`);\n if (!mountedRef.current) return;\n setIsMaster(true);\n },\n onJoined: (newRoom) => {\n console.log(`Connected on channel ${channel}…`);\n roomRef.current = newRoom;\n\n if (!mountedRef.current) return;\n setWire(newRoom);\n setJoined(true);\n },\n });\n }\n\n return () => {\n roomRef.current?.leave();\n };\n }, [channel, room, socket]);\n\n\n if (!joined || !wire) {\n return <LoadingComponent />;\n }\n\n return (\n <Context.Provider\n value={{ ...existingC2C, [channel]: { wire, joined, isMaster, room } }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nconst useWire = (channel = \"default\") => {\n const channels = useContext(Context) || {};\n return channels[channel];\n};\n\nexport default useWire;\n","/**\n * Check if element or parent has className.\n * @param {DOMElement} element\n * @param {string} className\n */\nexport const hasClass = (element, className) =>\n element.classList && element.classList.contains(className);\n\nexport const insideClass = (element, className) => {\n if (hasClass(element, className)) {\n return element;\n }\n if (!element.parentNode) {\n return false;\n }\n return insideClass(element.parentNode, className);\n};\n\nexport const distance = ([x1, y1], [x2, y2]) => {\n const distanceX = Math.abs(x1 - x2);\n const distanceY = Math.abs(y1 - y2);\n\n return Math.hypot(distanceX, distanceY);\n};\n\nexport const rotateCoordinates = (x, y, angle) => {\n const angleInRadians = (angle * Math.PI) / 180;\n\n const xRotated = x * Math.cos(angleInRadians) - y * Math.sin(angleInRadians);\n const yRotated = x * Math.sin(angleInRadians) + y * Math.cos(angleInRadians);\n\n return [xRotated, yRotated];\n};\n\nexport const transformFrom = (\n [x, y],\n { scale, rotate, translateX, translateY }\n) => {\n const xScaled = (x - translateX) / scale;\n const yScaled = (y - translateY) / scale;\n\n return rotateCoordinates(xScaled, yScaled, -rotate);\n};\n\nexport const transformTo = (\n [x, y],\n { scale, rotate, translateX, translateY }\n) => {\n const [xInvRotated, yInvRotated] = rotateCoordinates(x, y, rotate);\n return [xInvRotated * scale + translateX, yInvRotated * scale + translateY];\n};\n\nexport const intersectSegmentCircle = (p1, p2, circle, radius) => {\n const Ax = p1.x,\n Ay = p1.y;\n const Bx = p2.x,\n By = p2.y;\n const Cx = circle.x,\n Cy = circle.y;\n\n const Dx = Bx - Ax,\n Dy = By - Ay;\n const Ex = Ax - Cx,\n Ey = Ay - Cy;\n\n const a = Dx * Dx + Dy * Dy;\n const b = 2 * (Ex * Dx + Ey * Dy);\n const c = Ex * Ex + Ey * Ey - radius * radius;\n\n const discriminant = b * b - 4 * a * c;\n\n if (discriminant < 0) {\n return []; // No intersection\n }\n\n const t1 = (-b + Math.sqrt(discriminant)) / (2 * a);\n const t2 = (-b - Math.sqrt(discriminant)) / (2 * a);\n\n const intersections = [];\n\n if (t1 >= 0 && t1 <= 1) {\n intersections.push({ x: Ax + t1 * Dx, y: Ay + t1 * Dy });\n }\n\n if (t2 >= 0 && t2 <= 1) {\n intersections.push({ x: Ax + t2 * Dx, y: Ay + t2 * Dy });\n }\n\n return intersections;\n};\n\nexport const getParent = (initialElem, selector) => {\n for (\n let elem = initialElem;\n elem && elem !== document;\n elem = elem.parentNode\n ) {\n if (selector(elem)) return elem;\n }\n return null;\n};\n\nexport const isPointInsideRect = (point, rect) =>\n point.x > rect.left &&\n point.x < rect.left + rect.width &&\n point.y > rect.top &&\n point.y < rect.top + rect.height;\n\nexport const isItemInsideRect = (itemElement, rect) => {\n const fourElem = Array.from(itemElement.querySelectorAll(\".corner\"));\n\n return fourElem.every((corner) => {\n const { top: y, left: x } = corner.getBoundingClientRect();\n return isPointInsideRect({ x, y }, rect);\n });\n};\n\nexport const isItemInsideElement = (itemElement, otherElem) => {\n const rect = otherElem.getBoundingClientRect();\n\n const result = isItemInsideRect(itemElement, rect);\n return result;\n};\n\nexport const getItemElem = (uid, itemId) => {\n try {\n const elem = document.getElementById(`${uid}__${itemId}`);\n return elem;\n } catch {\n console.error(\n `Error while getting item with id ${itemId} inside wrapper`,\n uid\n );\n return undefined;\n }\n};\n\nexport const getIdFromElem = (elem) => {\n const value = elem?.dataset?.id;\n if (!value) {\n // eslint-disable-next-line no-console\n console.error(\n \"getIdFromElem call fails\",\n elem,\n JSON.stringify(elem?.dataset),\n elem?.dataset?.id\n );\n }\n return value;\n};\n\nexport const getItemsBoundingBox = (itemIds, uid) => {\n const result = itemIds.reduce((prev, itemId) => {\n const elem = getItemElem(uid, itemId);\n\n if (!elem) {\n if (!prev) {\n return null;\n }\n return prev;\n }\n\n const { left, right, top, bottom } = elem.getBoundingClientRect();\n\n let boundingBox;\n\n if (!prev) {\n boundingBox = {\n left,\n top,\n right,\n bottom,\n };\n } else {\n boundingBox = prev;\n }\n\n boundingBox.left = Math.min(left, boundingBox.left);\n boundingBox.top = Math.min(top, boundingBox.top);\n boundingBox.right = Math.max(right, boundingBox.right);\n boundingBox.bottom = Math.max(bottom, boundingBox.bottom);\n\n return boundingBox;\n }, null);\n\n if (!result) {\n return result;\n }\n\n result.width = result.right - result.left;\n result.height = result.bottom - result.top;\n\n return result;\n};\n\nconst getLinkedItemsRecursive = (itemMap, itemIds, alreadyMet = null) => {\n if (alreadyMet === null) {\n alreadyMet = new Set();\n }\n\n if (!Array.isArray(itemIds) || itemIds.length === 0) {\n return [];\n }\n\n return itemIds\n .map((itemId) => {\n if (alreadyMet.has(itemId)) {\n return [];\n } else {\n alreadyMet.add(itemId);\n if (itemMap[itemId]) {\n // If the item has been removed but not from linked list\n return [\n itemId,\n ...getLinkedItemsRecursive(\n itemMap,\n itemMap[itemId].linkedItems,\n alreadyMet\n ),\n ];\n } else {\n return [];\n }\n }\n })\n .flat();\n};\n\nexport const getLinkedItems = (itemMap, orderedItemIds, itemIds) => {\n const linkedItems = new Set(getLinkedItemsRecursive(itemMap, itemIds));\n return orderedItemIds.filter((itemId) => linkedItems.has(itemId));\n};\n\nexport const snapToGrid = (\n { x, y, width, height },\n { type = \"grid\", size = 1, offset = { x: 0, y: 0 } }\n) => {\n const [centerX, centerY] = [\n x + width / 2 - offset.x,\n y + height / 2 - offset.y,\n ];\n\n let newX;\n let newY;\n let sizeX;\n let sizeY;\n let px1;\n let px2;\n let py1;\n let py2;\n let diff1;\n let diff2;\n const h = size / 1.1547;\n\n switch (type) {\n case \"grid\":\n newX = Math.round(centerX / size) * size;\n newY = Math.round(centerY / size) * size;\n break;\n case \"hexH\":\n sizeX = 2 * h;\n sizeY = 3 * size;\n px1 = Math.round(centerX / sizeX) * sizeX;\n py1 = Math.round(centerY / sizeY) * sizeY;\n\n px2 = px1 > centerX ? px1 - h : px1 + h;\n py2 = py1 > centerY ? py1 - 1.5 * size : py1 + 1.5 * size;\n\n diff1 = Math.hypot(...[px1 - centerX, py1 - centerY]);\n diff2 = Math.hypot(...[px2 - centerX, py2 - centerY]);\n\n if (diff1 < diff2) {\n newX = px1;\n newY = py1;\n } else {\n newX = px2;\n newY = py2;\n }\n break;\n case \"hexV\":\n sizeX = 3 * size;\n sizeY = 2 * h;\n px1 = Math.round(centerX / sizeX) * sizeX;\n py1 = Math.round(centerY / sizeY) * sizeY;\n\n px2 = px1 > centerX ? px1 - 1.5 * size : px1 + 1.5 * size;\n py2 = py1 > centerY ? py1 - h : py1 + h;\n\n diff1 = Math.hypot(...[px1 - centerX, py1 - centerY]);\n diff2 = Math.hypot(...[px2 - centerX, py2 - centerY]);\n\n if (diff1 < diff2) {\n newX = px1;\n newY = py1;\n } else {\n newX = px2;\n newY = py2;\n }\n break;\n default:\n newX = x + width / 2;\n newY = y + height / 2;\n }\n\n return {\n x: newX + offset.x - width / 2,\n y: newY + offset.y - height / 2,\n };\n};\n\nconst colors = [\n \"#037758\",\n \"#99092a\",\n \"#067070\",\n \"#c6650f\",\n \"#008726\",\n \"#3d7004\",\n \"#348402\",\n \"#057f58\",\n \"#b58612\",\n \"#c44c01\",\n \"#0a7704\",\n \"#0e910e\",\n \"#027377\",\n \"#c99e02\",\n \"#054160\",\n \"#157a01\",\n \"#b10de2\",\n \"#0d6289\",\n \"#bc5d03\",\n \"#ba0cd1\",\n \"#d39f10\",\n \"#0c4c7a\",\n \"#460782\",\n \"#a51f10\",\n \"#cecb10\",\n \"#9b0943\",\n \"#607f0c\",\n \"#007a4b\",\n \"#bf0daa\",\n \"#af0ad8\",\n];\n\nexport const getRandomColor = () =>\n colors[Math.floor(Math.random() * colors.length)];\n\nconst debug = false;\n\nexport const syncMiddleware =\n ({ wire, storeName, noSync = [], defaultValue }, config) =>\n (set, get, api) => {\n set({ ready: false });\n const unsubs = [];\n const init = async () => {\n try {\n // Try to get the initial value from a peer\n const newValue = await wire.call(`${storeName}_getValue`);\n if (debug) console.log(\"init from peer with value\", newValue);\n set((state) => ({ ...state, ...newValue }));\n } catch {\n //console.log(`No peers for ${storeName}...`);\n if (defaultValue !== undefined) {\n set(defaultValue);\n }\n }\n unsubs.push(\n await wire.register(\n `${storeName}_getValue`,\n () => {\n return Object.fromEntries(\n Object.entries(get()).filter(\n ([key, value]) =>\n typeof value !== \"function\" && !noSync.includes(key)\n )\n );\n },\n { invoke: \"first\" }\n )\n );\n // Register the sync callback\n unsubs.push(\n wire.subscribe(`${storeName}_call`, ([methodName, args]) => {\n if (debug) console.log(\"receive\", methodName, args);\n previousFn[methodName](...args);\n })\n );\n set({ ready: true });\n };\n init();\n\n const result = config(set, get, api);\n const previousFn = { ...result };\n\n const syncResult = Object.fromEntries(\n // Send the update message on all method calls\n Object.entries(result).map(([key, fn]) => {\n if (\n typeof fn === \"function\" &&\n !key.startsWith(\"get\") &&\n !noSync.includes(key)\n ) {\n const newFn = (...args) => {\n if (debug) console.log(\"call\", key, args);\n const result = fn(...args);\n wire.publish(`${storeName}_call`, [key, args]);\n return result;\n };\n return [key, newFn];\n }\n return [key, fn];\n })\n );\n\n syncResult.unsub = () => {\n unsubs.forEach((unsub) => unsub());\n };\n\n return syncResult;\n };\n","import React, { useContext } from \"react\";\nimport { createStore } from \"zustand\";\nimport { useStoreWithEqualityFn } from \"zustand/traditional\";\nimport { shallow } from \"zustand/shallow\";\n\nimport useWire from \"@/hooks/useWire\";\nimport { syncMiddleware } from \"@/utils\";\n\nconst Context = React.createContext();\n\nexport const itemsStore = (set, get) => ({\n items: {},\n getItems: () => get().items,\n setItems: (newItems) => set({ items: newItems }),\n updateItems: (toUpdate, patch = false) =>\n set((state) => {\n if (patch) {\n const newItems = Object.fromEntries(\n Object.entries(state.items).map(([id, item]) => {\n if (toUpdate[id]) {\n return [id, { ...item, ...toUpdate[id] }];\n } else {\n return [id, item];\n }\n })\n );\n return { items: newItems };\n } else {\n return { items: { ...state.items, ...toUpdate } };\n }\n }),\n moveItems: (itemIds, posDelta) =>\n set(({ items: prevItems }) => {\n const newItems = { ...prevItems };\n itemIds.forEach((id) => {\n const item = prevItems[id];\n\n if (!item) {\n return;\n }\n\n newItems[id] = {\n ...item,\n x: (item.x || 0) + posDelta.x,\n y: (item.y || 0) + posDelta.y,\n moving: true,\n };\n });\n\n return { items: newItems };\n }),\n});\n\nexport const itemIdsStore = (set, get) => ({\n itemIds: [],\n setItemIds: (newValue) => set({ itemIds: newValue }),\n getItemIds: () => get().itemIds,\n insert: (position, value) =>\n set((state) => {\n const newValue = [...state.itemIds];\n newValue.splice(position, 0, value);\n return { itemIds: newValue };\n }),\n remove: (position) =>\n set((state) => {\n const newValue = [...state.itemIds];\n newValue.splice(position, 1);\n return { itemIds: newValue };\n }),\n updateItemIds: (position, value) =>\n set((state) => {\n const newValue = [...state.itemIds];\n newValue[position] = value;\n return { itemIds: newValue };\n }),\n updateManyItemIds: (toUpdate) =>\n set((state) => {\n return {\n itemIds: state.itemIds.map((value, index) => {\n if (toUpdate[index] !== undefined) {\n return toUpdate[index];\n } else {\n return value;\n }\n }),\n };\n }),\n});\n\nconst commonStore = (set, get) => ({\n removeItemsById: (itemIdsToRemove) =>\n set((state) => {\n return {\n itemIds: state.itemIds.filter((id) => !itemIdsToRemove.includes(id)),\n items: Object.fromEntries(\n Object.entries(state.items).filter(\n ([id]) => !itemIdsToRemove.includes(id)\n )\n ),\n };\n }),\n getItemList: () => {\n const items = get().items;\n return get().itemIds.map((id) => items[id]);\n },\n setItemList: (itemList) =>\n set({\n items: Object.fromEntries(itemList.map((item) => [item.id, item])),\n itemIds: itemList.map(({ id }) => id),\n }),\n insertItems: (newItems, beforeId) =>\n set((state) => {\n let newItemIds;\n const itemIdsToAdd = newItems.map(({ id }) => id);\n if (beforeId) {\n const insertAt = state.itemIds.findIndex((id) => id === beforeId);\n newItemIds = [...state.itemIds];\n newItemIds.splice(insertAt, 0, ...itemIdsToAdd);\n } else {\n newItemIds = [...state.itemIds, ...itemIdsToAdd];\n }\n\n return {\n items: {\n ...state.items,\n ...Object.fromEntries(newItems.map((item) => [item.id, item])),\n },\n itemIds: newItemIds,\n };\n }),\n});\n\nconst boardStore = (set, get) => ({\n boardConfig: {},\n getBoardConfig: () => get().boardConfig,\n setBoardConfig: (newBoardConfig) => set({ boardConfig: newBoardConfig }),\n updateBoardConfig: (toUpdate) =>\n set((state) => ({ boardConfig: { ...state.boardConfig, ...toUpdate } })),\n});\n\nconst sessionInfoStore = (set, get) => ({\n session: {},\n getSessionInfo: () => get().session,\n setSessionInfo: (newSession) => set({ session: newSession }),\n updateSessionInfo: (toUpdate) =>\n set((state) => ({ session: { ...state.session, ...toUpdate } })),\n});\n\nexport const SyncedStoreProvider = ({ storeName, children, defaultValue }) => {\n const { wire } = useWire(\"room\");\n const [ready, setReady] = React.useState(false);\n const [store] = React.useState(() =>\n createStore(\n syncMiddleware({ wire, storeName, defaultValue }, (...args) => ({\n ...itemsStore(...args),\n ...itemIdsStore(...args),\n ...commonStore(...args),\n ...boardStore(...args),\n ...sessionInfoStore(...args),\n }))\n )\n );\n\n React.useEffect(() => {\n let mounted = true;\n // Wait for ready event\n const unsubscribe = store.subscribe((newValue) => {\n if (newValue.ready) {\n // No need to listen anymore\n unsubscribe();\n if (mounted) {\n setReady(true);\n }\n }\n });\n () => {\n mounted = false;\n unsubscribe();\n };\n }, [store]);\n\n if (!ready) {\n return null;\n }\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useSyncedStore = (selector) => {\n const store = useContext(Context);\n return useStoreWithEqualityFn(store, selector, shallow);\n};\n","import React from \"react\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nconst useItems = () => {\n const [itemIds, items] = useSyncedStore((state) => [\n state.itemIds,\n state.items,\n ]);\n\n const itemList = React.useMemo(\n () => itemIds.map((id) => items[id]),\n [itemIds, items]\n );\n\n return itemList;\n};\n\nexport default useItems;\n","import React from \"react\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nconst useDebouncedItems = () => {\n const [items, itemIds, getItemList] = useSyncedStore((state) => [\n state.items,\n state.itemIds,\n state.getItemList,\n ]);\n const [debouncedItems, setDebouncedItems] = React.useState(getItemList());\n const [, startTransition] = React.useTransition();\n\n React.useEffect(() => {\n const currentItemList = getItemList();\n startTransition(() => {\n setDebouncedItems(currentItemList);\n });\n }, [items, itemIds, getItemList]);\n\n return debouncedItems;\n};\n\nexport default useDebouncedItems;\n","export const DEFAULT_BOARD_MAX_SIZE = 50000;\n\nexport default { DEFAULT_BOARD_MAX_SIZE };\n","import React, { useContext } from \"react\";\nimport { createStore } from \"zustand\";\nimport { useStoreWithEqualityFn } from \"zustand/traditional\";\nimport { shallow } from \"zustand/shallow\";\nimport { DEFAULT_BOARD_MAX_SIZE } from \"@/settings\";\n\nconst Context = React.createContext();\n\nconst configuration = (set, get) => ({\n config: {\n itemTemplates: {},\n actions: {},\n uid: null,\n itemExtent: { x: 0, y: 0, radius: 0 },\n boardWrapperRect: {},\n boardSize: DEFAULT_BOARD_MAX_SIZE,\n },\n // TODO optimize when same values as before\n updateConfiguration: (toUpdate) =>\n set((state) => ({ config: { ...state.config, ...toUpdate } })),\n getConfiguration: () => get().config,\n});\nconst boardState = (set, get) => ({\n boardState: {\n movingItems: false,\n selecting: false,\n zooming: false,\n panning: false,\n translateX: 0,\n translateY: 0,\n scale: 1,\n rotate: 0,\n },\n // TODO optimize when same values as before\n updateBoardState: (toUpdate) =>\n set((state) => ({ boardState: { ...state.boardState, ...toUpdate } })),\n getBoardState: () => get().boardState,\n});\n\nconst itemInteractions = (set, get) => ({\n interactions: {},\n getInteractions: () => get().interactions,\n register: (interaction, callback) =>\n set((state) => {\n const nextInteraction = [...(state.interactions[interaction] || [])];\n nextInteraction.push(callback);\n return {\n interactions: { ...state.interactions, [interaction]: nextInteraction },\n };\n }),\n unregister: (interaction, callback) =>\n set((state) => {\n const nextInteraction = (state.interactions[interaction] || []).filter(\n (c) => c !== callback\n );\n return {\n interactions: { ...state.interactions, [interaction]: nextInteraction },\n };\n }),\n callInteractions: (interaction, itemIds) => {\n if (!get().interactions[interaction]) return;\n get().interactions[interaction].forEach((callback) => {\n setTimeout(() => callback(itemIds), 0);\n });\n },\n});\n\nconst selection = (set, get) => ({\n selection: [],\n setSelection: (idsToSelect) =>\n set((state) => {\n if (JSON.stringify(state.selection) !== JSON.stringify(idsToSelect)) {\n return { selection: idsToSelect };\n }\n return {};\n }),\n getSelection: () => get().selection,\n select: (idsToAdd) =>\n set((state) => ({\n selection: [...state.selection, ...idsToAdd],\n })),\n unselect: (itemsIdToRemove) =>\n set((state) => ({\n selection: state.selection.filter((id) => !itemsIdToRemove.includes(id)),\n })),\n clear: () =>\n set((state) => {\n if (state.selection.length > 0) {\n return { selection: [] };\n } else {\n return {};\n }\n }),\n reverse: () =>\n set((state) => {\n const reversed = [...state.selection];\n reversed.reverse();\n return { selection: reversed };\n }),\n selectionBox: null,\n setSelectionBox: (newSelectionBox) =>\n set((state) => {\n const prevBB = state.selectionBox;\n if (\n !prevBB ||\n !newSelectionBox ||\n prevBB.top !== newSelectionBox.top ||\n prevBB.left !== newSelectionBox.left ||\n prevBB.width !== newSelectionBox.width ||\n prevBB.height !== newSelectionBox.height\n ) {\n return { selectionBox: newSelectionBox };\n }\n return {};\n }),\n});\n\nexport const MainStoreProvider = ({ children }) => {\n const [store] = React.useState(() =>\n createStore((...args) => ({\n ...configuration(...args),\n ...boardState(...args),\n ...itemInteractions(...args),\n ...selection(...args),\n }))\n );\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useMainStore = (selector) => {\n const store = useContext(Context);\n return useStoreWithEqualityFn(store, selector, shallow);\n};\n\nexport default useMainStore;\n","import useMainStore from \"../store/main\";\n\nconst useSelectedItems = () => {\n const [selection] = useMainStore((state) => [state.selection]);\n return selection;\n};\n\nexport default useSelectedItems;\n","import useMainStore from \"../store/main\";\n\nconst useGetSelectedItems = () => {\n const [getSelection] = useMainStore((state) => [state.getSelection]);\n return getSelection;\n};\n\nexport default useGetSelectedItems;\n","import React from \"react\";\nimport { useDebouncedCallback } from \"@react-hookz/web\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport {\n distance,\n getItemElem,\n intersectSegmentCircle,\n transformFrom,\n transformTo,\n} from \"@/utils\";\nimport useMainStore from \"./store/main\";\n\nconst TOLERANCE = 100;\nconst MIN_SIZE = 1000;\nconst SCALE_TOLERANCE = 0.8;\n\nlet debug = false;\n\n/**\n * Return new board positions fixed to fit inside the board and not too far from the\n * item extent.\n */\nconst translateBoundaries = ({\n x,\n y,\n scale,\n rotate,\n itemExtent,\n boardWrapperRect,\n boardSize,\n}) => {\n let [newX, newY] = [x, y];\n\n const screenCenter = transformFrom(\n [boardWrapperRect.width / 2, boardWrapperRect.height / 2],\n { translateX: newX, translateY: newY, scale, rotate }\n );\n\n const extentPos = {\n x: itemExtent.x + boardSize / 2,\n y: itemExtent.y + boardSize / 2,\n };\n\n const boardCenter = {\n x: boardSize / 2,\n y: boardSize / 2,\n };\n\n const distToExtent = distance(screenCenter, [extentPos.x, extentPos.y]);\n\n // Limit moves to extent\n const minDim = Math.min(boardWrapperRect.width, boardWrapperRect.height);\n const maxDistToExtent =\n itemExtent.radius + minDim / 2 / scale - TOLERANCE / scale;\n\n if (distToExtent > maxDistToExtent) {\n const inter = intersectSegmentCircle(\n { x: screenCenter[0], y: screenCenter[1] },\n extentPos,\n extentPos,\n maxDistToExtent - 1 / scale\n )[0];\n\n const [translateX, translateY] = transformTo([-inter.x, -inter.y], {\n translateX: boardWrapperRect.width / 2,\n translateY: boardWrapperRect.height / 2,\n scale,\n rotate,\n });\n\n newX = translateX;\n newY = translateY;\n }\n\n // Limit move to board limit\n const distToCenter = distance(screenCenter, [boardCenter.x, boardCenter.y]);\n const maxDistToCenter =\n boardSize / 2 -\n distance([0, 0], [boardWrapperRect.width, boardWrapperRect.height]) / scale;\n\n if (distToCenter > maxDistToCenter) {\n const inter = intersectSegmentCircle(\n { x: screenCenter[0], y: screenCenter[1] },\n boardCenter,\n boardCenter,\n maxDistToCenter - 1 / scale\n )[0];\n\n if (inter) {\n const [translateX, translateY] = transformTo([-inter.x, -inter.y], {\n translateX: boardWrapperRect.width / 2,\n translateY: boardWrapperRect.height / 2,\n scale,\n rotate,\n });\n\n newX = translateX;\n newY = translateY;\n }\n }\n\n return [newX, newY];\n};\n\nconst useDim = () => {\n const [\n getBoardState,\n updateBoardState,\n itemExtentGlobal,\n getConfiguration,\n updateConfiguration,\n ] = useMainStore((state) => [\n state.getBoardState,\n state.updateBoardState,\n state.config.itemExtent,\n state.getConfiguration,\n state.updateConfiguration,\n ]);\n const scaleBoundariesRef = React.useRef([0.15, 5]);\n\n const [getItemList] = useSyncedStore((state) => [state.getItemList]);\n\n const getDim = React.useCallback(() => {\n const { translateX, translateY, scale, rotate } = getBoardState();\n return { translateX, translateY, scale, rotate };\n }, [getBoardState]);\n\n const fromWrapperToBoard = React.useCallback(\n (x, y) => {\n return transformFrom([x, y], getBoardState());\n },\n [getBoardState]\n );\n\n const fromBoardToWrapper = React.useCallback(\n (x, y) => {\n return transformTo([x, y], getBoardState());\n },\n [getBoardState]\n );\n\n const vectorFromWrapperToBoard = React.useCallback(\n (x, y) => {\n const { scale, rotate } = getBoardState();\n\n return transformFrom([x, y], {\n translateX: 0,\n translateY: 0,\n rotate,\n scale,\n });\n },\n [getBoardState]\n );\n\n /**\n * Clamp scale to boundaries limits.\n */\n const clampScale = React.useCallback((scale) => {\n if (scale > scaleBoundariesRef.current[1]) {\n return scaleBoundariesRef.current[1];\n }\n\n if (scale < scaleBoundariesRef.current[0]) {\n return scaleBoundariesRef.current[0];\n }\n return scale;\n }, []);\n\n /**\n * Set board position safely by avoiding to go out of the dedicated space.\n */\n const setDimSafe = React.useCallback(\n (fn) => {\n const { itemExtent, boardWrapperRect, boardSize } = getConfiguration();\n\n const prev = getBoardState();\n\n const {\n translateX,\n translateY,\n scale,\n rotate: newRotate,\n } = {\n ...prev,\n ...fn(prev),\n };\n\n if (debug) console.log(\"New expected values: \", translateX, translateY, scale, newRotate);\n\n const newScale = clampScale(scale);\n\n let [newX, newY] = [translateX, translateY];\n\n if (translateX !== prev.translateX || translateY !== prev.translateY) {\n [newX, newY] = translateBoundaries({\n x: translateX,\n y: translateY,\n scale: newScale,\n rotate: newRotate,\n itemExtent,\n boardWrapperRect,\n boardSize,\n });\n }\n\n if (debug) console.log(\"New fixed values: \", newX, newY, newScale, newRotate);\n\n updateBoardState({\n translateX: isNaN(newX)? 0: newX,\n translateY: isNaN(newY)? 0: newY,\n scale: isNaN(newScale)? clampScale(1): newScale,\n rotate: isNaN(newRotate) ? 0 : newRotate,\n });\n },\n [clampScale, getBoardState, getConfiguration, updateBoardState]\n );\n\n /**\n * Move the board to the given coordinates.\n */\n const moveBoard = React.useCallback(\n (newTranslatOrFn) => {\n let translateFn = (prev) => ({ ...prev, ...newTranslatOrFn });\n if (typeof newTranslatOrFn === \"function\") {\n translateFn = newTranslatOrFn;\n }\n\n setDimSafe((prev) => ({\n ...prev,\n ...translateFn({\n translateX: prev.translateX,\n translateY: prev.translateY,\n }),\n }));\n },\n [setDimSafe]\n );\n\n /**\n * Zoom to factor centered on the given zoomCenter coordinates.\n *\n * zoomCenter is screen coordinates.\n */\n const zoomToCenter = React.useCallback(\n ({ to, factor }) => {\n const { boardWrapperRect } = getConfiguration();\n\n let center = to;\n\n if (!center) {\n center = {\n x: boardWrapperRect.left + boardWrapperRect.width / 2,\n y: boardWrapperRect.top + boardWrapperRect.height / 2,\n };\n }\n\n const prev = getBoardState();\n\n const newScale = clampScale(prev.scale * factor);\n\n const centerX = center.x - boardWrapperRect.left;\n const centerY = center.y - boardWrapperRect.top;\n\n const newTx =\n centerX - ((centerX - prev.translateX) * newScale) / prev.scale;\n const newTy =\n centerY - ((centerY - prev.translateY) * newScale) / prev.scale;\n\n setDimSafe((prev) => ({\n ...prev,\n translateX: newTx,\n translateY: newTy,\n scale: newScale,\n }));\n },\n [clampScale, getBoardState, getConfiguration, setDimSafe]\n );\n\n /**\n * Zoom to the given extent. The full extent will be included in the viewport.\n */\n const zoomToExtent = React.useCallback(\n ({ x, y, radius }) => {\n const { rotate } = getBoardState();\n const { boardWrapperRect, boardSize } = getConfiguration();\n\n const [safeX, safeY, safeRadius] = [x || 0, y||0, radius || 2000]\n\n const scaleX = boardWrapperRect.width / (safeRadius * 2);\n const scaleY = boardWrapperRect.height / (safeRadius * 2);\n\n // The scale that fits in all dimensions with a border around\n const scale = clampScale(Math.min(scaleX, scaleY) * SCALE_TOLERANCE);\n\n\n // We apply the board transformations\n const [translateX, translateY] = transformTo(\n [-boardSize / 2 - safeX, -boardSize / 2 - safeY],\n {\n translateX: boardWrapperRect.width / 2,\n translateY: boardWrapperRect.height / 2,\n scale,\n rotate,\n }\n );\n\n setDimSafe((prev) => ({ ...prev, translateX, translateY, scale }));\n },\n [clampScale, getBoardState, getConfiguration, setDimSafe]\n );\n\n /**\n * Get the board coordinates pointed by the center of the screen.\n */\n const getCenterCoordinates = React.useCallback(() => {\n const { boardWrapperRect, boardSize } = getConfiguration();\n const [x, y] = fromWrapperToBoard(\n boardWrapperRect.width / 2,\n boardWrapperRect.height / 2\n );\n return {\n x: x - boardSize / 2,\n y: y - boardSize / 2,\n };\n }, [fromWrapperToBoard, getConfiguration]);\n\n /**\n * Update the extent of all board items.\n */\n const updateItemExtent = React.useCallback(() => {\n // Update item extent\n const items = getItemList();\n const { boardSize, uid } = getConfiguration();\n\n const newRes = items.reduce(\n (boundingBox, item) => {\n const elem = getItemElem(uid, item.id);\n\n if (elem) {\n boundingBox.left = Math.min(item.x, boundingBox.left);\n boundingBox.top = Math.min(item.y, boundingBox.top);\n\n boundingBox.right = Math.max(\n item.x + elem.offsetWidth,\n boundingBox.right\n );\n boundingBox.bottom = Math.max(\n item.y + elem.offsetHeight,\n boundingBox.bottom\n );\n }\n\n return boundingBox;\n },\n {\n left: boardSize / 2,\n top: boardSize / 2,\n right: -boardSize / 2,\n bottom: -boardSize / 2,\n }\n );\n\n const final = {\n x: (newRes.right + newRes.left) / 2,\n y: (newRes.bottom + newRes.top) / 2,\n };\n\n final.radius = Math.max(\n distance([final.x, final.y], [newRes.left, newRes.top]),\n MIN_SIZE\n );\n\n updateConfiguration({ itemExtent: final });\n }, [getConfiguration, getItemList, updateConfiguration]);\n\n /**\n * Rotate the board to the given angle in degrees. If a function is given, it is\n * called with the previous angle as parameter and should return a new angle.\n */\n const rotateBoard = React.useCallback(\n (newAngleOrFn) => {\n let applyRotate = () => newAngleOrFn;\n if (typeof newAngleOrFn === \"function\") {\n applyRotate = newAngleOrFn;\n }\n\n setDimSafe((prev) => ({ ...prev, rotate: applyRotate(prev.rotate) }));\n\n // Zoom to new extent to not being lost\n updateItemExtent();\n zoomToExtent(itemExtentGlobal);\n },\n [itemExtentGlobal, setDimSafe, updateItemExtent, zoomToExtent]\n );\n\n const debouncedUpdateItemExtent = useDebouncedCallback(\n () => updateItemExtent(),\n [updateItemExtent],\n 200\n );\n\n React.useEffect(() => {\n window.debugUpdateExtent = () => updateItemExtent();\n window.debugDisplayExtent = () =>\n console.log(getConfiguration().itemExtent);\n window.debugSetDebug = () => {\n debug = true;\n }\n }, [getConfiguration, updateItemExtent]);\n\n return {\n setDim: setDimSafe,\n rotateBoard,\n moveBoard,\n getDim,\n zoomTo: zoomToCenter,\n zoomToCenter,\n zoomToExtent,\n getCenter: getCenterCoordinates,\n updateItemExtent: debouncedUpdateItemExtent,\n vectorFromWrapperToBoard,\n fromWrapperToBoard,\n fromBoardToWrapper,\n };\n};\n\nexport default useDim;\n","import React from \"react\";\nimport useMainStore from \"../store/main\";\n\nconst useItemInteraction = (interaction) => {\n const [registerInStore, unregister, callInteractions] = useMainStore(\n ({ register, unregister, callInteractions }) => [\n register,\n unregister,\n callInteractions,\n ]\n );\n\n const register = React.useCallback(\n (callback) => {\n registerInStore(interaction, callback);\n return () => {\n unregister(interaction, callback);\n };\n },\n [interaction, registerInStore, unregister]\n );\n\n const call = React.useCallback(\n (itemIds) => {\n callInteractions(interaction, itemIds);\n },\n [callInteractions, interaction]\n );\n\n return { register, call };\n};\n\nexport default useItemInteraction;\n","import React from \"react\";\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nimport useDim from \"../useDim\";\n\nimport {\n getItemElem,\n isPointInsideRect,\n insideClass,\n hasClass,\n snapToGrid,\n getLinkedItems,\n} from \"@/utils\";\n\nimport useItemInteraction from \"./useItemInteraction\";\nimport useMainStore from \"../store/main\";\n\nconst useItemActions = () => {\n const { call: callPlaceInteractions } = useItemInteraction(\"place\");\n const { call: callDeleteInteractions } = useItemInteraction(\"delete\");\n const { getCenter, updateItemExtent } = useDim();\n\n const [clearSelection, reverseSelection, unselect, getConfiguration] =\n useMainStore((state) => [\n state.clear,\n state.reverse,\n state.unselect,\n state.getConfiguration,\n ]);\n\n const {\n getItems: getStoreItems,\n getItemIds,\n setItemIds,\n updateItems,\n moveItems: moveStoreItems,\n removeItemsById,\n getItemList,\n insertItems,\n setItemList,\n } = useSyncedStore(\n ({\n getItems,\n getItemIds,\n setItemIds,\n updateItems,\n moveItems,\n removeItemsById,\n getItemList,\n insertItems,\n setItemList,\n }) => ({\n getItems,\n getItemIds,\n setItemIds,\n updateItems,\n moveItems,\n removeItemsById,\n getItemList,\n insertItems,\n setItemList,\n })\n );\n\n const batchUpdateItems = React.useCallback(\n (itemIds, callbackOrItem, patch = false) => {\n let callback = callbackOrItem;\n if (typeof callbackOrItem === \"object\") {\n callback = () => callbackOrItem;\n }\n\n const orderedItemIds = getItemIds().filter((id) => itemIds.includes(id));\n\n const prevMap = getStoreItems();\n\n const updateList = orderedItemIds\n .map((id) => {\n const prevItem = prevMap[id];\n if (patch) {\n return [id, callback(prevItem)];\n } else {\n return [id, callback({ ...prevItem })];\n }\n })\n .filter(([, value]) => value);\n\n // If the update list is empty then we are patching and no modifications are\n // applied\n if (updateList.length === 0) {\n return;\n }\n\n const toUpdate = Object.fromEntries(updateList);\n\n updateItems(toUpdate, patch);\n\n updateItemExtent();\n },\n [getItemIds, getStoreItems, updateItemExtent, updateItems]\n );\n\n const setItemListFull = React.useCallback(\n (itemList) => {\n setItemList(itemList);\n\n // Reset item selection as we are changing all items\n clearSelection();\n updateItemExtent();\n },\n [clearSelection, setItemList, updateItemExtent]\n );\n\n const updateItem = React.useCallback(\n (id, callbackOrItem, patch = false) => {\n batchUpdateItems([id], callbackOrItem, patch);\n },\n [batchUpdateItems]\n );\n\n const moveItems = React.useCallback(\n (itemIds, posDelta) => {\n moveStoreItems(\n getLinkedItems(getStoreItems(), getItemIds(), itemIds),\n posDelta\n );\n },\n [getItemIds, getStoreItems, moveStoreItems]\n );\n\n const putItemsOnTop = React.useCallback(\n (itemIdsToMove) => {\n const prevItemIds = getItemIds();\n const filtered = prevItemIds.filter((id) => !itemIdsToMove.includes(id));\n const toBePutOnTop = prevItemIds.filter((id) =>\n itemIdsToMove.includes(id)\n );\n\n setItemIds([...filtered, ...toBePutOnTop]);\n },\n [getItemIds, setItemIds]\n );\n\n const stickOnGrid = React.useCallback(\n (itemIds, { type: globalType, size: globalSize } = {}) => {\n const { uid } = getConfiguration();\n\n batchUpdateItems(\n itemIds,\n (item) => {\n const elem = getItemElem(uid, item.id);\n\n if (!elem) {\n return;\n }\n\n const gridConfig = {\n type: globalType || \"grid\",\n size: globalSize || 1,\n offset: { x: 0, y: 0 },\n ...item.grid,\n };\n\n const newPos = snapToGrid(\n {\n x: item.x,\n y: item.y,\n width: elem.clientWidth,\n height: elem.clientHeight,\n },\n gridConfig\n );\n\n return newPos;\n },\n true\n );\n },\n [getConfiguration, batchUpdateItems]\n );\n\n const placeItems = React.useCallback(\n (itemIds, gridConfig) => {\n // Put all moved items on top\n const itemIdsWithLinkedItems = getLinkedItems(\n getStoreItems(),\n getItemIds(),\n itemIds\n );\n\n putItemsOnTop(itemIdsWithLinkedItems);\n\n // Remove moving state\n batchUpdateItems(itemIdsWithLinkedItems, { moving: false }, true);\n\n stickOnGrid(itemIdsWithLinkedItems, gridConfig);\n callPlaceInteractions(itemIds);\n\n updateItemExtent();\n },\n [\n batchUpdateItems,\n callPlaceInteractions,\n getItemIds,\n getStoreItems,\n putItemsOnTop,\n stickOnGrid,\n updateItemExtent,\n ]\n );\n\n const updateItemOrder = React.useCallback(\n (newOrder) => {\n setItemIds(newOrder);\n },\n [setItemIds]\n );\n\n const reverseItemsOrder = React.useCallback(\n (itemIdsToReverse) => {\n const prevItemIds = getItemIds();\n\n const toBeReversed = prevItemIds.filter((id) =>\n itemIdsToReverse.includes(id)\n );\n const newOrder = prevItemIds.map((itemId) => {\n if (itemIdsToReverse.includes(itemId)) {\n return toBeReversed.pop();\n }\n return itemId;\n });\n\n setItemIds(newOrder);\n\n reverseSelection();\n },\n [getItemIds, reverseSelection, setItemIds]\n );\n\n const swapItems = React.useCallback(\n (fromIds, toIds) => {\n const prevItemMap = getStoreItems();\n\n const newCoordinatesMap = Object.fromEntries(\n toIds.map((toItemId, index) => {\n const replaceWith = prevItemMap[fromIds[index]];\n return [\n toItemId,\n {\n x: replaceWith.x,\n y: replaceWith.y,\n },\n ];\n })\n );\n\n batchUpdateItems(\n fromIds,\n (item) => {\n return newCoordinatesMap[item.id];\n },\n true\n );\n\n const replaceMap = Object.fromEntries(\n fromIds.map((id, index) => [id, toIds[index]])\n );\n\n // swap also the item order\n const reorderedItemIds = getItemIds().map((itemId) => {\n if (fromIds.includes(itemId)) {\n return replaceMap[itemId];\n }\n return itemId;\n });\n\n setItemIds(reorderedItemIds);\n },\n [getStoreItems, batchUpdateItems, getItemIds, setItemIds]\n );\n\n const pushItems = React.useCallback(\n (itemsToInsert, beforeId) => {\n const center = getCenter();\n\n const itemsWithPosition = itemsToInsert.map((item, index) => {\n if (!item.x || !item.y) {\n return { ...item, x: center.x + 2 * index, y: center.y + 2 * index };\n }\n return item;\n });\n\n insertItems(itemsWithPosition, beforeId);\n // Wait for React to render the inserted items before measuring their DOM\n // elements in placeItems/stickOnGrid.\n requestAnimationFrame(() => {\n placeItems(itemsToInsert.map(({ id }) => id));\n });\n },\n [getCenter, insertItems, placeItems]\n );\n\n const pushItem = React.useCallback(\n (itemToInsert, beforeId) => {\n pushItems([itemToInsert], beforeId);\n },\n [pushItems]\n );\n\n const removeItems = React.useCallback(\n (itemsIdToRemove) => {\n // Remove from selected items first\n unselect(itemsIdToRemove);\n\n removeItemsById(itemsIdToRemove);\n callDeleteInteractions(itemsIdToRemove);\n },\n [unselect, removeItemsById, callDeleteInteractions]\n );\n\n const getItems = React.useCallback(\n (itemIds) => {\n const itemMap = getStoreItems();\n return itemIds.map((id) => itemMap[id]);\n },\n [getStoreItems]\n );\n\n const findElementUnderPointer = React.useCallback(\n (\n { target, clientX, clientY },\n { returnLocked = false, passLocked = false } = {}\n ) => {\n // Allow text selection instead of moving\n if ([\"INPUT\", \"TEXTAREA\"].includes(target.tagName)) return null;\n\n const foundElement = insideClass(target, \"item\");\n\n if (foundElement) {\n if (hasClass(foundElement, \"selected\")) {\n return foundElement;\n }\n\n if (\n !passLocked &&\n hasClass(foundElement, \"locked\") &&\n !hasClass(target, \"passthrough\")\n ) {\n return returnLocked ? foundElement : null;\n }\n\n // Is it a passthrough element?\n if (hasClass(target, \"passthrough\")) {\n // Get current value\n const itemList = getItemIds();\n const { uid } = getConfiguration();\n\n // Found element under the cursor\n const elements = itemList.reduce((prev, itemId) => {\n const elem = getItemElem(uid, itemId);\n const itemRect = elem.getBoundingClientRect();\n if (isPointInsideRect({ x: clientX, y: clientY }, itemRect)) {\n prev.unshift(elem);\n }\n return prev;\n }, []);\n\n // Figure out if one can be returned\n for (let i = 0; i < elements.length; i += 1) {\n const elem = elements[i];\n if (\n elem !== foundElement &&\n (passLocked || !hasClass(elem, \"locked\"))\n ) {\n return elem;\n }\n }\n // Here there is no available elements\n return null;\n }\n }\n return foundElement;\n },\n [getConfiguration, getItemIds]\n );\n\n return {\n putItemsOnTop,\n batchUpdateItems,\n updateItemOrder,\n moveItems,\n placeItems,\n updateItem,\n swapItems,\n reverseItemsOrder,\n setItemList: setItemListFull,\n pushItem,\n pushItems,\n removeItems,\n getItemList,\n findElementUnderPointer,\n getItems,\n };\n};\n\nexport default useItemActions;\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n if ((a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n for (i of a.entries())\n if (!equal(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if ((a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","import React, { useCallback } from \"react\";\nimport deepEqual from \"fast-deep-equal/es6\";\n\nimport { useDebouncedEffect } from \"@react-hookz/web\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"../store/main\";\n\n/**\n * Returns the default actions of an item\n * @param {object} item to consider\n * @param {object} itemMap item template map with default actions\n * @returns An array of default action for this item\n */\nconst getDefaultActionsFromItem = (item, itemMap) => {\n if (item.type in itemMap) {\n const actions = itemMap[item.type].defaultActions;\n if (typeof actions === \"function\") {\n return actions(item);\n }\n return actions;\n }\n\n return [];\n};\n\n/**\n * Returns actual actions from an item ordered by the configured available\n * actions. If no action is defined, default actions are returned.\n * @param {object} item item to use\n * @param {object} itemMap item template map with available action for this item\n * @returns the array of actions for this item\n */\nconst getActionsFromItem = (item, itemMap) => {\n const { actions = getDefaultActionsFromItem(item, itemMap) } = item;\n return actions.map((action) => {\n if (typeof action === \"string\") {\n return { name: action };\n }\n return action;\n });\n};\n\nconst useAvailableActions = () => {\n const [items, getItems] = useSyncedStore((state) => [\n state.items,\n state.getItems,\n ]);\n const [itemTemplates, selection, getSelection] = useMainStore((state) => [\n state.config.itemTemplates,\n state.selection,\n state.getSelection,\n ]);\n const [availableActions, setAvailableActions] = React.useState([]);\n const isMountedRef = React.useRef(false);\n const [, startTransition] = React.useTransition();\n\n React.useEffect(() => {\n // Mounted guard\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n const getItemListOrSelected = React.useCallback(\n (itemIds) => {\n const currentItemMap = getItems();\n if (itemIds) {\n return [itemIds, itemIds.map((id) => currentItemMap[id])];\n }\n const selectedItems = getSelection();\n return [selectedItems, selectedItems.map((id) => currentItemMap[id])];\n },\n [getItems, getSelection]\n );\n\n /**\n * Returns available actions for selected items. An action is kept only if all\n * items have this exact same action with same parameters.\n */\n const updateAvailableActions = useCallback(() => {\n const [selectedItemIds, selectedItemList] = getItemListOrSelected();\n if (selectedItemIds.length > 0) {\n // Prevent set state on unmounted component\n if (!isMountedRef.current) return;\n\n const allActions = selectedItemList.reduce((acc, item) => {\n const itemActions = getActionsFromItem(item, itemTemplates);\n\n return acc.filter((value) =>\n itemActions.some((itemAction) => deepEqual(value, itemAction))\n );\n }, getActionsFromItem(selectedItemList[0], itemTemplates));\n\n startTransition(() => {\n setAvailableActions(allActions);\n });\n } else {\n startTransition(() => {\n setAvailableActions([]);\n });\n }\n }, [getItemListOrSelected, itemTemplates]);\n\n // Debounced update available actions when items or selection change\n useDebouncedEffect(\n () => updateAvailableActions(),\n [items, selection, updateAvailableActions],\n 100\n );\n\n return {\n availableActions,\n };\n};\n\nexport default useAvailableActions;\n","import useMainStore from \"./store/main\";\n\nconst useSelectionBox = () => {\n const [selectionBox] = useMainStore((state) => [state.selectionBox]);\n return selectionBox;\n};\n\nexport default useSelectionBox;\n","export let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","\n\nimport { urlAlphabet } from './url-alphabet/index.js'\n\nexport { urlAlphabet }\n\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\n\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let safeByteCutoff = 256 - (256 % alphabet.length)\n\n if (safeByteCutoff === 256) {\n let mask = alphabet.length - 1\n\n return (size = defaultSize) => {\n if (!size) return ''\n let id = ''\n while (true) {\n let bytes = getRandom(size)\n let j = size\n while (j--) {\n id += alphabet[bytes[j] & mask]\n if (id.length >= size) return id\n }\n }\n }\n }\n\n let step = Math.ceil((1.6 * 256 * defaultSize) / safeByteCutoff)\n\n return (size = defaultSize) => {\n if (!size) return ''\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n if (bytes[j] < safeByteCutoff) {\n id += alphabet[bytes[j] % alphabet.length]\n if (id.length >= size) return id\n }\n }\n }\n }\n}\n\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\n\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += urlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","import React, { useContext } from \"react\";\nimport { createStore } from \"zustand\";\nimport { useStoreWithEqualityFn } from \"zustand/traditional\";\nimport { shallow } from \"zustand/shallow\";\nimport { getRandomColor } from \"@/utils\";\nimport { nanoid } from \"nanoid\";\n\nimport useWire from \"@/hooks/useWire\";\nimport { syncMiddleware } from \"@/utils\";\n\nconst Context = React.createContext();\n\nexport const persistUser = (user) => {\n localStorage.setItem(\"user\", JSON.stringify(user));\n};\n\nexport const restoreUser = () => {\n if (localStorage.user) {\n // Add some mandatory info if missing\n const localUser = {\n name: \"Player\",\n color: getRandomColor(),\n uid: nanoid(),\n ...JSON.parse(localStorage.user),\n };\n // Id is given by server\n // delete localUser.id;\n persistUser(localUser);\n return localUser;\n }\n const newUser = {\n name: \"Player\",\n color: getRandomColor(),\n uid: nanoid(),\n };\n persistUser(newUser);\n return newUser;\n};\n\nconst usersStore = (curentUserId) => (set, get) => ({\n isSpaceMaster: false,\n users: {},\n getUser: () => get().users[curentUserId],\n getUsers: () => {\n return get().users;\n },\n getUserList: () => Object.values(get().users),\n getLocalUsers: () => {\n if (!get().users[curentUserId]) {\n return [];\n }\n const { space: currentUserSpace } = get().users[curentUserId];\n return get()\n .getUserList()\n .filter(({ space }) => space === currentUserSpace);\n },\n addUser: (newUser) =>\n set((state) => ({ users: { ...state.users, [newUser.id]: newUser } })),\n updateUser: (userId, toUpdate) =>\n set((state) => {\n if (!state.users[userId]) {\n return {};\n }\n const newUser = {\n ...state.users[userId],\n ...toUpdate,\n id: userId,\n uid: state.users[userId].uid,\n };\n if (newUser.id === curentUserId) {\n persistUser(newUser);\n }\n setTimeout(() => get().electSpaceMaster(), 100);\n return {\n users: {\n ...state.users,\n [userId]: newUser,\n },\n };\n }),\n removeUser: (userId) =>\n set((state) => {\n const newUsers = { ...state.users };\n delete newUsers[userId];\n setTimeout(() => get().electSpaceMaster(), 100);\n return { users: newUsers };\n }),\n // Not synchronized methods\n updateCurrentUser: (toUpdate) => get().updateUser(curentUserId, toUpdate),\n joinSpace: (space) =>\n get().updateUser(curentUserId, { space, spaceJoinedTimestamp: Date.now() }),\n electSpaceMaster: () => {\n const localUsers = get().getLocalUsers();\n const master = {\n uid: null,\n timestamp: Date.now(),\n };\n Object.values(localUsers).forEach(({ spaceJoinedTimestamp, id }) => {\n if (spaceJoinedTimestamp < master.timestamp) {\n master.id = id;\n master.timestamp = spaceJoinedTimestamp;\n }\n });\n\n set({ isSpaceMaster: master.id === curentUserId });\n },\n});\n\nconst cursorsStore = (set) => ({\n cursors: {},\n moveCursor: (userId, newPos) =>\n set((state) => ({ cursors: { ...state.cursors, [userId]: newPos } })),\n removeCursor: (userId) =>\n set((state) => {\n const newCursors = { ...state.cursors };\n delete newCursors[userId];\n return { cursors: newCursors };\n }),\n});\n\nexport const SyncedUsersProvider = ({ storeName, children }) => {\n const { wire, isMaster } = useWire(\"room\");\n const [store, setStore] = React.useState(null);\n const [ready, setReady] = React.useState(false);\n const storeRef = React.useRef(false);\n\n React.useEffect(() => {\n let mounted = true;\n const unsubs = [];\n if (!store && !storeRef.current) {\n storeRef.current = true;\n const init = () => {\n // Create store\n const localStore = createStore(\n syncMiddleware(\n {\n wire,\n storeName,\n noSync: [\n \"updateCurrentUser\",\n \"joinSpace\",\n \"isSpaceMaster\",\n \"electSpaceMaster\",\n ],\n },\n (...args) => ({\n ...usersStore(wire.userId)(...args),\n ...cursorsStore(...args),\n }),\n wire,\n storeName\n )\n );\n // Wait for ready event\n const unsubscribe = localStore.subscribe((newValue) => {\n if (newValue.ready) {\n // No need to listen anymore\n unsubscribe();\n if (mounted) {\n setStore(localStore);\n }\n }\n });\n };\n init();\n return () => {\n mounted = false;\n storeRef.current = false;\n unsubs.forEach((unsub) => unsub());\n };\n }\n }, [store, storeName, wire, wire.userId]);\n\n React.useEffect(() => {\n if (store) {\n store.getState().addUser({\n ...restoreUser(),\n id: wire.userId,\n });\n setReady(true);\n return () => {\n store.getState().removeUser(wire.userId);\n };\n }\n }, [isMaster, store, wire]);\n\n React.useEffect(() => {\n if (store) {\n // Listen for userLeave events\n const unsubscribe = wire.subscribe(\"userLeave\", (userId) => {\n store.getState().removeUser(userId);\n });\n return () => {\n unsubscribe();\n };\n }\n }, [isMaster, store, wire]);\n\n React.useEffect(() => {\n if (isMaster && store) {\n // Set master\n store.getState().updateCurrentUser({ isMaster: isMaster });\n }\n }, [isMaster, store, wire]);\n\n if (!ready) {\n return null;\n }\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useSyncedUsers = (selector) => {\n const store = useContext(Context);\n return useStoreWithEqualityFn(store, selector, shallow);\n};\n","import React from \"react\";\n\nimport { useSyncedUsers } from \"@/users/store\";\n\nconst useUsers = () => {\n const [isSpaceMaster, currentUser, userMap, updateCurrentUser, joinSpace] =\n useSyncedUsers((state) => [\n state.isSpaceMaster,\n state.getUser(),\n state.users,\n state.updateCurrentUser,\n state.joinSpace,\n ]);\n\n const users = React.useMemo(() => Object.values(userMap), [userMap]);\n\n const localUsers = React.useMemo(() => {\n const { space: currentUserSpace } = currentUser;\n return users.filter(({ space }) => space === currentUserSpace);\n }, [currentUser, users]);\n\n return {\n isSpaceMaster,\n currentUser,\n updateCurrentUser,\n users,\n localUsers,\n joinSpace,\n };\n};\n\nexport default useUsers;\n","import React from \"react\";\nimport { useSyncedStore } from \"@/board/store/synced\";\n\nconst useBoardConfig = () => {\n const [boardConfig, getBoardConfig, setBoardConfig] = useSyncedStore(\n (state) => [state.boardConfig, state.getBoardConfig, state.setBoardConfig]\n );\n\n const setSyncBoardConfig = React.useCallback(\n (callbackOrConfig) => {\n let callback = callbackOrConfig;\n if (typeof callbackOrConfig === \"object\") {\n callback = () => callbackOrConfig;\n }\n\n const currentConfig = getBoardConfig();\n const newConfig = callback(currentConfig);\n setBoardConfig(newConfig);\n },\n [getBoardConfig, setBoardConfig]\n );\n\n return [boardConfig, setSyncBoardConfig];\n};\n\nexport default useBoardConfig;\n","import useMainStore from \"./store/main\";\n\nconst useBoardState = () => {\n const [boardState] = useMainStore((state) => [state.boardState]);\n return boardState;\n};\n\nexport default useBoardState;\n","import { useSyncedStore } from \"./store/synced\";\n\nconst useSessionInfo = () => {\n const [getSessionInfo, setSessionInfo, updateSessionInfo, sessionInfo] =\n useSyncedStore((state) => [\n state.getSessionInfo,\n state.setSessionInfo,\n state.updateSessionInfo,\n state.session,\n ]);\n\n return { getSessionInfo, setSessionInfo, sessionInfo, updateSessionInfo };\n};\n\nexport default useSessionInfo;\n","import React, { useContext } from \"react\";\nimport { createStore } from \"zustand\";\nimport { useStoreWithEqualityFn } from \"zustand/traditional\";\nimport { shallow } from \"zustand/shallow\";\nimport { nanoid } from \"nanoid\";\n\nimport useWire from \"@/hooks/useWire\";\nimport { syncMiddleware } from \"@/utils\";\n\nconst Context = React.createContext();\n\nconst generateMsg = ({ user: { name, uid, color }, content }) => {\n const newMessage = {\n type: \"message\",\n user: { name, uid, color },\n content,\n uid: nanoid(),\n timestamp: new Date().toISOString(),\n };\n return newMessage;\n};\n\nconst messageStore = (set, get) => ({\n messages: [],\n setMessages: (newMessages) =>\n set({\n messages: newMessages.map((m) => ({\n ...m,\n timestamp: Date.parse(m.timestamp),\n })),\n }),\n addMessage: (newMessage) =>\n set((state) => ({\n messages: [\n ...state.messages,\n { ...newMessage, timestamp: Date.parse(newMessage.timestamp) },\n ],\n })),\n sendMessage: (user, content) => {\n const newMessage = generateMsg({\n user,\n content,\n });\n if (newMessage) get().addMessage(newMessage);\n },\n});\n\nexport const SyncedMessageProvider = ({\n storeName,\n children,\n defaultValue = [],\n}) => {\n const { wire } = useWire(\"room\");\n const [store] = React.useState(() =>\n createStore(\n syncMiddleware(\n { wire, storeName, defaultValue, noSync: [\"sendMessage\"] },\n (...args) => ({\n ...messageStore(...args),\n })\n )\n )\n );\n\n return <Context.Provider value={store}>{children}</Context.Provider>;\n};\n\nexport const useSyncedMessage = (selector) => {\n const store = useContext(Context);\n return useStoreWithEqualityFn(store, selector, shallow);\n};\n","import React from \"react\";\n\nimport { useSyncedMessage } from \"@/message/store\";\nimport { useSyncedUsers } from \"@/users/store\";\n\nconst noop = () => {};\n\nconst useMessage = (onMessage = noop) => {\n const currentUser = useSyncedUsers((state) => state.getUser());\n const [messages, setMessages, sendMessage] = useSyncedMessage((state) => [\n state.messages,\n state.setMessages,\n state.sendMessage,\n ]);\n\n React.useEffect(() => {\n // React on new message\n if (messages.length) {\n onMessage();\n }\n }, [messages, onMessage]);\n\n const sendMessageWithUser = React.useCallback(\n (messageContent) => {\n sendMessage(currentUser, messageContent);\n },\n [currentUser, sendMessage]\n );\n\n return { messages, setMessages, sendMessage: sendMessageWithUser };\n};\n\nexport default useMessage;\n","import React from \"react\";\nimport { nanoid } from \"nanoid\";\n\nimport useWire, { WireProvider } from \"@/hooks/useWire\";\n\nimport { SyncedStoreProvider } from \"@/board/store/synced\";\nimport { MainStoreProvider } from \"@/board/store/main\";\n\nimport { SyncedUsersProvider, useSyncedUsers } from \"./users/store\";\nimport { SyncedMessageProvider } from \"./message/store\";\n\nconst SyncBoard = ({ children, session }) => {\n const joinSpace = useSyncedUsers((state) => state.joinSpace);\n\n // Set user space\n React.useEffect(() => {\n joinSpace(session);\n return () => {\n joinSpace(null);\n };\n }, [joinSpace, session]);\n\n return children;\n};\n\nconst ConnectedSyncBoard = ({\n socket,\n room,\n session,\n items = [],\n messages = [],\n LoadingComponent,\n ...props\n}) => {\n const [stableRoom] = React.useState(room || nanoid());\n const [stableSession] = React.useState(session || nanoid());\n const [defaultItemsValue] = React.useState(() => {\n return {\n itemIds: items.map(({ id }) => id),\n items: Object.fromEntries(items.map((item) => [item.id, item])),\n };\n });\n\n const roomChannel = useWire(\"room\");\n\n if (!roomChannel) {\n // No room declared so we create one\n return (\n <WireProvider\n room={stableRoom}\n channel=\"room\"\n socket={socket}\n LoadingComponent={LoadingComponent}\n >\n <SyncedUsersProvider storeName={`${stableRoom}_users`}>\n <SyncedMessageProvider\n storeName={`${stableSession}_messages`}\n defaultValue={messages}\n >\n <MainStoreProvider>\n <SyncedStoreProvider\n storeName={`${stableSession}_item`}\n defaultValue={defaultItemsValue}\n >\n <SyncBoard {...props} session={stableSession} />\n </SyncedStoreProvider>\n </MainStoreProvider>\n </SyncedMessageProvider>\n </SyncedUsersProvider>\n </WireProvider>\n );\n }\n return (\n <SyncedMessageProvider\n storeName={`${stableSession}_messages`}\n defaultValue={messages}\n >\n <MainStoreProvider>\n <SyncedStoreProvider\n storeName={`${stableSession}_item`}\n defaultValue={defaultItemsValue}\n >\n <SyncBoard {...props} session={stableSession} />\n </SyncedStoreProvider>\n </MainStoreProvider>\n </SyncedMessageProvider>\n );\n};\n\nexport default ConnectedSyncBoard;\n","import React from \"react\";\nimport { nanoid } from \"nanoid\";\n\nimport { WireProvider } from \"@/hooks/useWire\";\nimport { SyncedUsersProvider } from \"@/users/store\";\n\nconst ConnectedSyncRoom = ({ socket, room, children, LoadingComponent }) => {\n const [stableRoom] = React.useState(room || nanoid());\n\n return (\n <WireProvider\n room={stableRoom}\n channel=\"room\"\n socket={socket}\n LoadingComponent={LoadingComponent}\n >\n <SyncedUsersProvider storeName={`${stableRoom}_users`}>\n {children}\n </SyncedUsersProvider>\n </WireProvider>\n );\n};\n\nexport default ConnectedSyncRoom;\n","let e={data:\"\"},t=t=>{if(\"object\"==typeof window){let e=(t?t.querySelector(\"#_goober\"):window._goober)||Object.assign(document.createElement(\"style\"),{innerHTML:\" \",id:\"_goober\"});return e.nonce=window.__nonce__,e.parentNode||(t||document.head).appendChild(e),e.firstChild}return t||e},r=e=>{let r=t(e),a=r.data;return r.data=\"\",a},a=/(?:([\\u0080-\\uFFFF\\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\\s*)/g,l=/\\/\\*[^]*?\\*\\/| +/g,n=/\\n+/g,o=(e,t)=>{let r=\"\",a=\"\",l=\"\";for(let n in e){let c=e[n];\"@\"==n[0]?\"i\"==n[1]?r=n+\" \"+c+\";\":a+=\"f\"==n[1]?o(c,n):n+\"{\"+o(c,\"k\"==n[1]?\"\":t)+\"}\":\"object\"==typeof c?a+=o(c,t?t.replace(/([^,])+/g,e=>n.replace(/([^,]*:\\S+\\([^)]*\\))|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+\" \"+t:t)):n):null!=c&&(n=\"-\"==n[1]?n:n.replace(/[A-Z]/g,\"-$&\").toLowerCase(),l+=o.p?o.p(n,c):n+\":\"+c+\";\")}return r+(t&&l?t+\"{\"+l+\"}\":l)+a},c={},i=e=>{if(\"object\"==typeof e){let t=\"\";for(let r in e)t+=r+i(e[r]);return t}return e},s=(e,t,r,s,p)=>{let u=i(e),d=c[u]||(c[u]=(e=>{let t=0,r=11;for(;t<e.length;)r=101*r+e.charCodeAt(t++)>>>0;return\"go\"+r})(u));if(!c[d]){let t=u!==e?e:(e=>{let t,r,o=[{}];for(;t=a.exec(e.replace(l,\"\"));)t[4]?o.shift():t[3]?(r=t[3].replace(n,\" \").trim(),o.unshift(o[0][r]=o[0][r]||{})):o[0][t[1]]=t[2].replace(n,\" \").trim();return o[0]})(e);c[d]=o(p?{[\"@keyframes \"+d]:t}:t,r?\"\":\".\"+d)}let f=r&&c.g;return r&&(c.g=c[d]),((e,t,r,a)=>{a?t.data=t.data.replace(a,e):-1===t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(c[d],t,s,f),d},p=(e,t,r)=>e.reduce((e,a,l)=>{let n=t[l];if(n&&n.call){let e=n(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;n=t?\".\"+t:e&&\"object\"==typeof e?e.props?\"\":o(e,\"\"):!1===e?\"\":e}return e+a+(null==n?\"\":n)},\"\");function u(e){let r=this||{},a=e.call?e(r.p):e;return s(a.unshift?a.raw?p(a,[].slice.call(arguments,1),r.p):a.reduce((e,t)=>Object.assign(e,t&&t.call?t(r.p):t),{}):a,t(r.target),r.g,r.o,r.k)}let d,f,g,b=u.bind({g:1}),h=u.bind({k:1});function m(e,t,r,a){o.p=t,d=e,f=r,g=a}function w(e,t){let r=this||{};return function(){let a=arguments;function l(n,o){let c=Object.assign({},n),i=c.className||l.className;r.p=Object.assign({theme:f&&f()},c),r.o=/go\\d/.test(i),c.className=u.apply(r,a)+(i?\" \"+i:\"\"),t&&(c.ref=o);let s=e;return e[0]&&(s=c.as||e,delete c.as),g&&s[0]&&g(c),d(s,c)}return t?t(l):l}}export{u as css,r as extractCss,b as glob,h as keyframes,m as setup,w as styled};\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","import React from \"react\";\n\nexport const isMacOS = () => {\n const userAgent = navigator.userAgent.toLowerCase();\n return /mac os ?x 10/.test(userAgent);\n};\n\n// From https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\nconst getScrollLineHeight = () => {\n const iframe = document.createElement(\"iframe\");\n iframe.src = \"#\";\n document.body.appendChild(iframe);\n\n // Write content in Iframe\n const idoc = iframe.contentWindow.document;\n idoc.open();\n idoc.write(\n \"<!DOCTYPE html><html><head></head><body><span>a</span></body></html>\"\n );\n idoc.close();\n\n const scrollLineHeight = idoc.body.firstElementChild.offsetHeight;\n document.body.removeChild(iframe);\n\n return scrollLineHeight;\n};\n\nconst LINE_HEIGHT = getScrollLineHeight();\n// Reasonable default from https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\nconst PAGE_HEIGHT = 800;\n\nconst otherPointer = (pointers, currentPointer) => {\n const p2 = Object.keys(pointers)\n .map((p) => Number(p))\n .find((pointer) => pointer !== currentPointer);\n return pointers[p2];\n};\n\nconst computeDistance = ([x1, y1], [x2, y2]) => {\n const distanceX = Math.abs(x1 - x2);\n const distanceY = Math.abs(y1 - y2);\n\n return Math.hypot(distanceX, distanceY);\n};\n\nconst empty = () => {};\n\nconst stopPropagation = (fn) => (arg) => {\n const { event } = arg;\n if (!event.isPropagationStopped()) {\n return fn(arg);\n }\n return null;\n};\n\nconst protect =\n (fn) =>\n async (...args) => {\n try {\n await fn(...args);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(e);\n }\n };\n\nclass PromiseQueue {\n lastPromise = Promise.resolve(true);\n\n add(operation, ...args) {\n return new Promise((resolve, reject) => {\n this.lastPromise = this.lastPromise\n .then(() => stopPropagation(protect(operation))(...args))\n .then(resolve)\n .catch(reject);\n });\n }\n}\n\nconst promiseQueue = new PromiseQueue();\n\nconst Gesture = ({\n children,\n onDrag = empty,\n onDragStart = empty,\n onDragEnd = empty,\n onPan = empty,\n onTap = empty,\n onLongTap = empty,\n onDoubleTap = empty,\n onZoom,\n mainAction = \"drag\",\n}) => {\n const wrapperRef = React.useRef(null);\n const stateRef = React.useRef({\n moving: false,\n pointers: {},\n mainPointer: undefined,\n });\n\n const onWheel = (event) => {\n const {\n deltaX,\n deltaY,\n clientX,\n clientY,\n deltaMode,\n ctrlKey,\n altKey,\n metaKey,\n target,\n } = event;\n\n // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.\n // In that situation, we want to use the custom scaling, not the browser default zoom.\n // Hence in this situation we avoid to return immediately.\n if (altKey || (ctrlKey && !isMacOS())) {\n return;\n }\n\n // On a trackpad, the pinch and pan events are differentiated by the crtlKey value.\n // On a pinch gesture, the ctrlKey is set to true, so we want to have a scaling effect.\n // If we are only moving the fingers in the same direction, a pan is needed.\n // Ref: https://medium.com/@auchenberg/detecting-multi-touch-trackpad-gestures-in-javascript-a2505babb10e\n if (isMacOS() && !ctrlKey) {\n promiseQueue.add(onPan, {\n deltaX: -2 * deltaX,\n deltaY: -2 * deltaY,\n button: 1,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n } else {\n // Quit if onZoom is not set\n if (onZoom === undefined || !deltaY) return;\n\n let scale = deltaY;\n\n switch (deltaMode) {\n case 1: // Pixel\n scale *= LINE_HEIGHT;\n break;\n case 2:\n scale *= PAGE_HEIGHT;\n break;\n default:\n }\n\n if (isMacOS()) {\n scale *= 2;\n }\n\n promiseQueue.add(onZoom, { scale, clientX, clientY, event });\n }\n };\n\n const onPointerDown = (event) => {\n const {\n target,\n button,\n clientX,\n clientY,\n pointerId,\n altKey,\n ctrlKey,\n metaKey,\n isPrimary,\n } = event;\n\n // Add pointer to map\n stateRef.current.pointers[pointerId] = { clientX, clientY };\n\n if (isPrimary) {\n // Clean mainPoint on primary pointer\n stateRef.current.mainPointer = undefined;\n }\n\n if (stateRef.current.mainPointer !== undefined) {\n if (stateRef.current.mainPointer !== pointerId) {\n // This is not the main pointer\n try {\n const { clientX: clientX2, clientY: clientY2 } = otherPointer(\n stateRef.current.pointers,\n pointerId\n );\n const newClientX = (clientX2 + clientX) / 2;\n const newClientY = (clientY2 + clientY) / 2;\n\n const distance = computeDistance(\n [clientX2, clientY2],\n [clientX, clientY]\n );\n\n // We update previous position as the new position is the center between both fingers\n Object.assign(stateRef.current, {\n pressed: true,\n moving: false,\n gestureStart: false,\n startX: clientX,\n startY: clientY,\n prevX: newClientX,\n prevY: newClientY,\n startDistance: distance,\n prevDistance: distance,\n });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(\"Error while getting other pointer. Ignoring\", e);\n // eslint-disable-next-line no-unused-expressions\n stateRef.current.mainPointer === undefined;\n }\n }\n\n return;\n }\n\n // We set the mainpointer\n stateRef.current.mainPointer = pointerId;\n\n // And prepare move\n Object.assign(stateRef.current, {\n pressed: true,\n moving: false,\n gestureStart: false,\n startX: clientX,\n startY: clientY,\n prevX: clientX,\n prevY: clientY,\n currentButton: button,\n pointerDownEvent: event,\n startDistance: 0,\n prevDistance: 0,\n target,\n timeStart: Date.now(),\n longTapTimeout: setTimeout(async () => {\n stateRef.current.noTap = true;\n promiseQueue.add(onLongTap, {\n clientX,\n clientY,\n altKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n }, 750),\n });\n\n try {\n target.setPointerCapture(pointerId);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(\"Fail to capture pointer\", e);\n }\n };\n\n const onPointerMove = (event) => {\n if (stateRef.current.pressed) {\n const {\n pointerId,\n clientX: eventClientX,\n clientY: eventClientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n buttons,\n } = event;\n\n // Update pointer coordinates in the map\n stateRef.current.pointers[pointerId] = {\n clientX: eventClientX,\n clientY: eventClientY,\n };\n\n stateRef.current.moving = true;\n\n // Do we have two pointers ?\n const twoPointers = Object.keys(stateRef.current.pointers).length === 2;\n\n let clientX;\n let clientY;\n let distanceBetweenTwoPointers = 0;\n\n if (twoPointers) {\n // Find other pointerId\n const { clientX: clientX2, clientY: clientY2 } = otherPointer(\n stateRef.current.pointers,\n pointerId\n );\n\n // Update client X with the center of each touch\n clientX = (clientX2 + eventClientX) / 2;\n clientY = (clientY2 + eventClientY) / 2;\n distanceBetweenTwoPointers = computeDistance(\n [clientX2, clientY2],\n [eventClientX, eventClientY]\n );\n } else {\n clientX = eventClientX;\n clientY = eventClientY;\n }\n\n // We drag if\n // On non touch device\n // - Only button is pressed (1)\n // - any special key is no pressed\n // or on touch devices\n // - We use only one finger\n let altAction = shiftKey || altKey || ctrlKey || metaKey || buttons !== 1;\n if (mainAction !== \"drag\") {\n altAction = !altAction;\n }\n\n const shouldDrag = !altAction;\n const shouldPan = altAction;\n\n if (shouldDrag) {\n // Send drag start on first move\n if (!stateRef.current.gestureStart) {\n wrapperRef.current.style.cursor = \"move\";\n stateRef.current.gestureStart = true;\n // Clear tap timeout\n clearTimeout(stateRef.current.longTapTimeout);\n\n promiseQueue.add(onDragStart, {\n deltaX: 0,\n deltaY: 0,\n startX: stateRef.current.startX,\n startY: stateRef.current.startY,\n clientX: stateRef.current.startX,\n clientY: stateRef.current.startY,\n distanceX: 0,\n distanceY: 0,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target: stateRef.current.target,\n event: stateRef.current.pointerDownEvent,\n });\n }\n\n const deltaX = clientX - stateRef.current.prevX;\n const deltaY = clientY - stateRef.current.prevY;\n const distanceX = clientX - stateRef.current.startX;\n const distanceY = clientY - stateRef.current.startY;\n\n // Drag event\n promiseQueue.add(onDrag, {\n deltaX,\n deltaY,\n startX: stateRef.current.startX,\n startY: stateRef.current.startY,\n clientX,\n clientY,\n distanceX,\n distanceY,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target: stateRef.current.target,\n event,\n });\n }\n\n if (shouldPan) {\n if (!stateRef.current.gestureStart) {\n wrapperRef.current.style.cursor = \"move\";\n stateRef.current.gestureStart = true;\n // Clear tap timeout on first move\n clearTimeout(stateRef.current.longTapTimeout);\n }\n\n // Create closure\n const deltaX = clientX - stateRef.current.prevX;\n const deltaY = clientY - stateRef.current.prevY;\n const { target } = stateRef.current;\n\n // Pan event\n promiseQueue.add(onPan, {\n deltaX,\n deltaY,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n\n if (\n distanceBetweenTwoPointers !== stateRef.current.prevDistance &&\n onZoom\n ) {\n const scale =\n stateRef.current.prevDistance - distanceBetweenTwoPointers;\n\n if (Math.abs(scale) > 0) {\n promiseQueue.add(onZoom, {\n scale: scale * 3,\n clientX,\n clientY,\n event,\n });\n stateRef.current.prevDistance = distanceBetweenTwoPointers;\n }\n }\n }\n\n stateRef.current.prevX = clientX;\n stateRef.current.prevY = clientY;\n }\n };\n\n const onPointerUp = (event) => {\n const {\n clientX,\n clientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n pointerId,\n } = event;\n\n if (!stateRef.current.pointers[pointerId]) {\n // Pointer already gone previously with another event\n // ignoring it\n return;\n }\n\n // Remove pointer from map\n delete stateRef.current.pointers[pointerId];\n\n // If this is not the main pointer we quit here\n if (stateRef.current.mainPointer !== pointerId) {\n const { clientX: clientX2, clientY: clientY2 } =\n stateRef.current.pointers[stateRef.current.mainPointer];\n Object.assign(stateRef.current, {\n prevX: clientX2,\n prevY: clientY2,\n prevDistance: 0,\n startDistance: 0,\n });\n return;\n }\n\n // It was the main pointer so we need to replace it with another if any\n while (Object.keys(stateRef.current.pointers).length > 0) {\n // If was main pointer but we have another one, this one become main\n stateRef.current.mainPointer = Number(\n Object.keys(stateRef.current.pointers)[0]\n );\n\n try {\n stateRef.current.target.setPointerCapture(stateRef.current.mainPointer);\n\n const { clientX: clientX2, clientY: clientY2 } =\n stateRef.current.pointers[stateRef.current.mainPointer];\n Object.assign(stateRef.current, {\n prevX: clientX2,\n prevY: clientY2,\n prevDistance: 0,\n startDistance: 0,\n });\n\n return;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.log(\"Fails to set pointer capture\", error);\n stateRef.current.mainPointer = undefined;\n delete stateRef.current.pointers[\n Object.keys(stateRef.current.pointers)[0]\n ];\n }\n }\n\n // From here we have removed the last pointer.\n\n stateRef.current.mainPointer = undefined;\n stateRef.current.pressed = false;\n\n // Clear longTap\n clearTimeout(stateRef.current.longTapTimeout);\n\n if (stateRef.current.moving) {\n // If we were moving, send drag end event\n stateRef.current.moving = false;\n promiseQueue.add(onDragEnd, {\n deltaX: clientX - stateRef.current.prevX,\n deltaY: clientY - stateRef.current.prevY,\n startX: stateRef.current.startX,\n startY: stateRef.current.startY,\n clientX,\n clientY,\n distanceX: clientX - stateRef.current.startX,\n distanceY: clientY - stateRef.current.startY,\n button: stateRef.current.currentButton,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n event,\n });\n wrapperRef.current.style.cursor = \"auto\";\n } else {\n const now = Date.now();\n\n if (stateRef.current.noTap) {\n stateRef.current.noTap = false;\n }\n // Send tap event only if time less than 300ms\n else if (stateRef.current.timeStart - now < 300) {\n promiseQueue.add(onTap, {\n clientX,\n clientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n }\n }\n };\n\n const onDoubleTapHandler = (event) => {\n const { clientX, clientY, altKey, shiftKey, ctrlKey, metaKey, target } =\n event;\n promiseQueue.add(onDoubleTap, {\n clientX,\n clientY,\n altKey,\n shiftKey,\n ctrlKey,\n metaKey,\n target,\n event,\n });\n };\n\n return (\n <div\n onWheel={onWheel}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerOut={onPointerUp}\n onPointerLeave={onPointerUp}\n onPointerCancel={onPointerUp}\n onDoubleClick={onDoubleTapHandler}\n style={{ touchAction: \"none\" }}\n ref={wrapperRef}\n >\n {children}\n </div>\n );\n};\n\nexport default Gesture;\n","import React from \"react\";\nimport Gesture from \"../Gesture\";\nimport useMainStore from \"../store/main\";\n\nconst ResizeHandler = ({ onResize, ...rest }) => {\n const [getBoardState] = useMainStore((state) => [state.getBoardState]);\n\n const onDrag = ({ deltaX, deltaY, event }) => {\n event.stopPropagation();\n const { scale } = getBoardState();\n onResize({\n width: deltaX / scale,\n height: deltaY / scale,\n });\n };\n\n return (\n <Gesture onDrag={onDrag}>\n <div {...rest} />\n </Gesture>\n );\n};\n\nexport default ResizeHandler;\n","import React, { memo } from \"react\";\n\nimport { css } from \"goober\";\nimport deepEqual from \"fast-deep-equal\";\n\nimport ResizeHandler from \"./ResizeHandler\";\nimport useMainStore from \"../store/main\";\n\nconst itemClass = css`\n display: inline-block;\n transition: transform 150ms;\n user-select: none;\n padding: 2px;\n box-sizing: border-box;\n`;\n\nconst selectedItemClass = css`\n border: 2px dashed #db5034;\n padding: 0px;\n cursor: pointer;\n`;\n\nconst itemMark = css`\n position: absolute;\n width: 0px;\n height: 0px;\n`;\n\nconst itemMarkTopLeft = css`\n top: 0;\n left: 0;\n`;\n\nconst itemMarkTopRight = css`\n top: 0;\n right: 0;\n`;\n\nconst itemMarkBottomLeft = css`\n bottom: 0;\n left: 0;\n`;\n\nconst itemMarkBottomRight = css`\n bottom: 0;\n right: 0;\n`;\n\nconst itemMarkCenter = css`\n top: 50%;\n left: 50%;\n`;\n\nconst itemResize = css`\n position: absolute;\n\n width: 10px;\n height: 10px;\n border: 2px solid #db5034;\n background-color: #db5034;\n cursor: move;\n`;\n\nconst itemResizeWidth = css`\n cursor: ew-resize;\n right: -6px;\n top: calc(50% - 5px);\n`;\n\nconst itemResizeHeight = css`\n cursor: ns-resize;\n bottom: -6px;\n left: calc(50% - 5px);\n`;\n\nconst itemResizeRatio = css`\n cursor: nwse-resize;\n bottom: -6px;\n right: -6px;\n`;\n\nconst DefaultErrorComponent = ({ onReload }) => (\n <div\n className={`syncboard-error-item ${css({\n width: \"100px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n textAlign: \"center\",\n color: \"red\",\n })}`}\n >\n Sorry, this item seems broken.\n <button onClick={onReload}>Reload it</button>\n </div>\n);\n\n/* Error boundary for broken item */\nclass ItemErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false, itemId: props.itemId };\n this.onReload = this.onReload.bind(this);\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error) {\n // eslint-disable-next-line no-console\n console.error(\n `Error for item ${this.state.itemId}`,\n error,\n this.props.state\n );\n }\n\n onReload() {\n this.setState({ hasError: false });\n }\n\n render() {\n const { ErrorComponent } = this.props;\n if (this.state.hasError) {\n return <ErrorComponent onReload={this.onReload} />;\n }\n return this.props.children;\n }\n}\n\nconst removeClass = (e) => {\n e.target.className = \"\";\n};\n\nconst defaultResize = ({\n width,\n height,\n actualWidth,\n actualHeight,\n prevState,\n keepRatio,\n}) => {\n let { width: currentWidth, height: currentHeight } = prevState;\n\n // Parse text values if any\n [currentWidth, currentHeight] = [\n parseFloat(currentWidth),\n parseFloat(currentHeight),\n ];\n if (!currentWidth || Number.isNaN(Number(currentWidth))) {\n currentWidth = actualWidth;\n }\n if (!currentHeight || Number.isNaN(Number(currentHeight))) {\n currentHeight = actualHeight;\n }\n\n if (keepRatio) {\n const ratio = currentWidth / currentHeight;\n return {\n ...prevState,\n width: (currentWidth + width).toFixed(1),\n height: (currentHeight + height / ratio).toFixed(1),\n };\n }\n\n return {\n ...prevState,\n width: (currentWidth + width).toFixed(1),\n height: (currentHeight + height).toFixed(1),\n };\n};\n\nconst defaultResizeDirection = {\n w: true,\n h: true,\n b: true,\n};\n\nconst Item = ({\n setState,\n state: { type, rotation = 0, id, locked, extraClasses, ...rest } = {},\n animate = \"hvr-pop\",\n isSelected,\n itemMap,\n showResizeHandle = true,\n}) => {\n const itemWrapperRef = React.useRef(null);\n const [uid] = useMainStore((state) => [state.config.uid]);\n\n const {\n component: Component = () => null,\n resizeDirections = defaultResizeDirection,\n resize = defaultResize,\n } = itemMap[type];\n\n const updateState = React.useCallback(\n (callbackOrItem, patch = false) => setState(id, callbackOrItem, patch),\n [setState, id]\n );\n\n React.useEffect(() => {\n itemWrapperRef.current.className = animate;\n }, [animate]);\n\n const classes = [\"item\", id, itemClass];\n if (locked) {\n classes.push(\"locked\");\n }\n if (isSelected) {\n classes.push(\"selected\");\n classes.push(selectedItemClass);\n }\n if (Array.isArray(extraClasses)) {\n classes.concat(extraClasses);\n }\n\n const className = classes.join(\" \");\n\n const onResize = ({ width = 0, height = 0, keepRatio }) => {\n updateState((prev) => {\n const { offsetWidth, offsetHeight } = itemWrapperRef.current;\n return resize({\n prevState: prev,\n width,\n height,\n actualHeight: offsetHeight,\n actualWidth: offsetWidth,\n keepRatio,\n });\n });\n };\n\n const onResizeWidth = ({ width }) => {\n onResize({ width });\n };\n\n const onResizeHeight = ({ height }) => {\n onResize({ height });\n };\n\n const onResizeRatio = ({ width }) => {\n onResize({ height: width, width, keepRatio: true });\n };\n\n return (\n <div\n style={{ transform: `rotate(${rotation}deg` }}\n data-id={id}\n id={`${uid}__${id}`}\n className={className}\n >\n <div\n style={{ display: \"flex\" }}\n ref={itemWrapperRef}\n onAnimationEnd={removeClass}\n onKeyDown={(e) => e.stopPropagation()}\n onKeyUp={(e) => e.stopPropagation()}\n >\n <ItemErrorBoundary\n itemId={id}\n state={rest}\n ErrorComponent={itemMap?.error?.component || DefaultErrorComponent}\n >\n <Component {...rest} id={id} setState={updateState} />\n </ItemErrorBoundary>\n <div className={`corner ${itemMark} ${itemMarkTopLeft}`} />\n <div className={`corner ${itemMark} ${itemMarkTopRight}`} />\n <div className={`corner ${itemMark} ${itemMarkBottomRight}`} />\n <div className={`corner ${itemMark} ${itemMarkBottomLeft}`} />\n <div className={`center ${itemMark} ${itemMarkCenter}`} />\n {showResizeHandle && (\n <>\n {resizeDirections.b && (\n <ResizeHandler\n className={`${itemResize} ${itemResizeRatio}`}\n onResize={onResizeRatio}\n />\n )}\n\n {resizeDirections.h && (\n <ResizeHandler\n className={`${itemResize} ${itemResizeHeight}`}\n onResize={onResizeHeight}\n />\n )}\n\n {resizeDirections.w && (\n <ResizeHandler\n className={`${itemResize} ${itemResizeWidth}`}\n onResize={onResizeWidth}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n};\n\nconst MemoizedItem = memo(\n Item,\n (\n {\n state: prevState,\n setState: prevSetState,\n isSelected: prevIsSelected,\n showResizeHandle: prevShowResizeHandle,\n },\n {\n state: nextState,\n setState: nextSetState,\n isSelected: nextIsSelected,\n showResizeHandle: nextShowResizeHandle,\n }\n ) =>\n prevIsSelected === nextIsSelected &&\n prevShowResizeHandle === nextShowResizeHandle &&\n prevSetState === nextSetState &&\n deepEqual(prevState, nextState)\n);\n\nconst identity = (x) => x;\n\n// Exclude positioning from memoization\nconst PositionedItem = ({ state = {}, getCurrentUser, className, ...rest }) => {\n if (!rest.itemMap[state.type]) {\n return null;\n }\n\n const { stateHook = identity } = rest.itemMap[state.type];\n\n const {\n x = 0,\n y = 0,\n layer = 0,\n moving,\n ...stateRest\n } = stateHook(state, {\n currentUser: getCurrentUser?.(),\n });\n\n const zIndex = (layer + 4) * 10 + 100 + (moving ? 5 : 0); // Items z-index between 100 and 200\n\n return (\n <div\n className={className}\n style={{\n transform: `translate(${x}px, ${y}px)`,\n zIndex,\n }}\n >\n <MemoizedItem\n {...rest}\n // Helps to prevent render\n showResizeHandle={rest.isSelected && rest.showResizeHandle}\n state={stateRest}\n />\n </div>\n );\n};\n\nconst MemoizedPositionedItem = memo(PositionedItem);\n\nexport default MemoizedPositionedItem;\n","import Item from \"./Item\";\nimport useItemActions from \"./useItemActions\";\n\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"../store/main\";\nimport { useSyncedUsers } from \"@/users/store\";\nimport { css } from \"goober\";\n\nconst ItemList = () => {\n const { updateItem } = useItemActions();\n\n const [itemList, itemMap] = useSyncedStore((state) => [\n state.itemIds,\n state.items,\n ]);\n\n const [boardSize, showResizeHandle, itemTemplates, selection] = useMainStore(\n (state) => [\n state.config.boardSize,\n state.config.showResizeHandle,\n state.config.itemTemplates,\n state.selection,\n ]\n );\n const [getCurrentUser] = useSyncedUsers((state) => [state.getUser]);\n\n const itemClassName = css({\n position: \"absolute\",\n top: `${boardSize / 2}px`,\n left: `${boardSize / 2}px`,\n display: \"inline-block\",\n lineHeight: 0,\n });\n\n return itemList.map((itemId) => (\n <Item\n key={itemId}\n state={itemMap[itemId]}\n setState={updateItem}\n isSelected={selection.includes(itemId)}\n itemMap={itemTemplates}\n boardSize={boardSize}\n getCurrentUser={getCurrentUser}\n showResizeHandle={showResizeHandle}\n className={itemClassName}\n />\n ));\n};\n\nexport default ItemList;\n","import React from \"react\";\nimport { css } from \"goober\";\nimport { useEventListener } from \"@react-hookz/web\";\n\nimport { insideClass, isItemInsideElement, getIdFromElem } from \"@/utils\";\n\nimport Gesture from \"./Gesture\";\nimport { useItemActions } from \"./Items\";\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"./store/main\";\n\nconst defaultSelectorClass = css({\n zIndex: 210,\n position: \"absolute\",\n backgroundColor: \"hsla(0, 40%, 50%, 10%)\",\n border: \"2px solid hsl(0, 55%, 40%)\",\n});\n\n/**\n * Find selected element by using their visible screen dimensions.\n *\n * @param {Array} itemMap\n * @param {DomObject} wrapper\n * @param {boolean} ignoreLocked\n * @returns\n */\nconst findSelected = (itemMap, wrapper, ignoreLocked = false) => {\n const selectors = wrapper.getElementsByClassName(\"selector\");\n if (!selectors.length) {\n return [];\n }\n\n const selector = selectors[0];\n\n return Array.from(wrapper.getElementsByClassName(\"item\"))\n .filter((elem) => {\n const id = getIdFromElem(elem);\n\n const item = itemMap[id];\n if (!item || (!ignoreLocked && item.locked)) {\n return false;\n }\n return isItemInsideElement(elem, selector);\n })\n .map((elem) => getIdFromElem(elem));\n};\n\nconst Selector = ({ children, moveFirst }) => {\n const [\n getSelection,\n clearSelection,\n setSelection,\n select,\n getConfiguration,\n updateBoardState,\n ] = useMainStore((state) => [\n state.getSelection,\n state.clear,\n state.setSelection,\n state.select,\n state.getConfiguration,\n state.getBoardState,\n state.updateBoardState,\n ]);\n const { findElementUnderPointer } = useItemActions();\n const [getItems] = useSyncedStore((state) => [state.getItems]);\n\n const [selector, setSelector] = React.useState({});\n const [, startTransition] = React.useTransition();\n const [ignoreLocked, setIgnoreLocked] = React.useState(false);\n\n const wrapperRef = React.useRef(null);\n const stateRef = React.useRef({\n moving: false,\n });\n\n useEventListener(document, \"keydown\", (e) => {\n if (e.key === \"l\") {\n setIgnoreLocked(true);\n }\n });\n\n useEventListener(document, \"keyup\", (e) => {\n if (e.key === \"l\") {\n setIgnoreLocked(false);\n }\n });\n\n // Reset selection on board loading\n React.useEffect(() => {\n clearSelection();\n return () => {\n clearSelection();\n };\n }, [clearSelection]);\n\n React.useEffect(() => {\n if (stateRef.current.moving) {\n const itemMap = getItems();\n const { boardWrapper } = getConfiguration();\n const selected = findSelected(itemMap, boardWrapper, ignoreLocked);\n startTransition(() => {\n setSelection(selected);\n });\n }\n }, [getConfiguration, getItems, selector, setSelection, ignoreLocked]);\n\n const onDragStart = async (event) => {\n const foundElement = await findElementUnderPointer(event);\n\n if (!foundElement) {\n stateRef.current.moving = true;\n startTransition(() => {\n updateBoardState({ selecting: true });\n });\n wrapperRef.current.style.cursor = \"crosshair\";\n }\n };\n\n const onDrag = ({ distanceY, distanceX, startX, startY }) => {\n if (stateRef.current.moving) {\n const { top, left } = wrapperRef.current.getBoundingClientRect();\n\n const relativeX = startX - left;\n const relativeY = startY - top;\n\n if (distanceX > 0) {\n stateRef.current.left = relativeX;\n stateRef.current.width = distanceX;\n } else {\n stateRef.current.left = relativeX + distanceX;\n stateRef.current.width = -distanceX;\n }\n if (distanceY > 0) {\n stateRef.current.top = relativeY;\n stateRef.current.height = distanceY;\n } else {\n stateRef.current.top = relativeY + distanceY;\n stateRef.current.height = -distanceY;\n }\n\n setSelector({ ...stateRef.current, moving: true });\n }\n };\n\n const onDragEnd = () => {\n if (stateRef.current.moving) {\n startTransition(() => {\n updateBoardState({ selecting: false });\n });\n stateRef.current.moving = false;\n setSelector({ moving: false });\n wrapperRef.current.style.cursor = \"auto\";\n }\n };\n\n const onLongTap = ({ target }) => {\n const foundElement = insideClass(target, \"item\");\n if (foundElement) {\n const id = getIdFromElem(foundElement);\n setSelection([id]);\n }\n };\n\n const onTap = (event) => {\n const { target, ctrlKey, metaKey } = event;\n\n const foundElement = findElementUnderPointer(event);\n\n if (!foundElement && insideClass(target, \"board\")) {\n clearSelection();\n } else {\n const itemId = getIdFromElem(foundElement);\n\n // Being defensive here to avoid bug\n if (!itemId) {\n clearSelection();\n return;\n }\n\n const selectedItems = getSelection();\n if (foundElement && !selectedItems.includes(itemId)) {\n if (ctrlKey || metaKey) {\n select([itemId]);\n } else {\n setSelection([itemId]);\n }\n }\n }\n };\n\n return (\n <Gesture\n onDragStart={onDragStart}\n onDrag={onDrag}\n onDragEnd={onDragEnd}\n onTap={onTap}\n onLongTap={onLongTap}\n mainAction={moveFirst ? \"pan\" : \"drag\"}\n >\n <div ref={wrapperRef}>\n {selector.moving && (\n <div\n style={{\n transform: `translate(${selector.left}px, ${selector.top}px)`,\n height: `${selector.height}px`,\n width: `${selector.width}px`,\n }}\n className={`selector ${defaultSelectorClass}`}\n />\n )}\n {children}\n </div>\n </Gesture>\n );\n};\n\nexport default Selector;\n","import React from \"react\";\n\nimport { useItemActions } from \"./Items\";\nimport { getIdFromElem } from \"@/utils\";\n\nimport Gesture from \"./Gesture\";\nimport useMainStore from \"./store/main\";\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport { useEventListener } from \"@react-hookz/web\";\nimport useDim from \"./useDim\";\n\n/**\n * This component handles the move of items when dragging them or with the keyboard.\n */\nconst ActionPane = ({ children }) => {\n const { moveItems, placeItems, findElementUnderPointer } = useItemActions();\n const { vectorFromWrapperToBoard } = useDim();\n\n const [select, setSelection, getSelection, getBoardState, updateBoardState] =\n useMainStore((state) => [\n state.select,\n state.setSelection,\n state.getSelection,\n state.getBoardState,\n state.updateBoardState,\n ]);\n const [getBoardConfig] = useSyncedStore((state) => [state.getBoardConfig]);\n\n const actionRef = React.useRef({});\n\n // Use ref because pointer events are faster than react state management\n const selectedItemRef = React.useRef({\n items: [],\n });\n\n const onDragStart = (event) => {\n const { ctrlKey, metaKey, event: originalEvent } = event;\n const foundElement = findElementUnderPointer(event);\n\n if (foundElement) {\n originalEvent.stopPropagation();\n const selectedItems = getSelection();\n\n selectedItemRef.current.items = selectedItems;\n\n const itemId = getIdFromElem(foundElement);\n\n if (!selectedItems.includes(itemId)) {\n if (ctrlKey || metaKey) {\n selectedItemRef.current.items = [...selectedItems, itemId];\n select([itemId]);\n } else {\n selectedItemRef.current.items = [itemId];\n setSelection([itemId]);\n }\n }\n\n Object.assign(actionRef.current, {\n moving: true,\n });\n }\n };\n\n const onDrag = ({ deltaX, deltaY, event: originalEvent }) => {\n if (actionRef.current.moving) {\n originalEvent.stopPropagation();\n const { movingItems } = getBoardState();\n\n const [newX, newY] = vectorFromWrapperToBoard(deltaX, deltaY);\n\n moveItems(\n selectedItemRef.current.items,\n {\n x: newX,\n y: newY,\n },\n true\n );\n\n if (!movingItems) {\n updateBoardState({ movingItems: true });\n }\n }\n };\n\n const onDragEnd = () => {\n if (actionRef.current.moving) {\n const { gridSize: boardGridSize = 1 } = getBoardConfig();\n const gridSize = boardGridSize || 1; // avoid 0 grid size\n\n actionRef.current = { moving: false };\n placeItems(selectedItemRef.current.items, {\n type: \"grid\",\n size: gridSize,\n });\n updateBoardState({ movingItems: false });\n }\n };\n\n const onKeyDown = (e) => {\n // Block shortcut if we are typing in a textarea or input\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n const selectedItems = getSelection();\n\n if (selectedItems.length) {\n const { gridSize: boardGridSize = 1 } = getBoardConfig();\n let moveX = 0;\n let moveY = 0;\n switch (e.key) {\n case \"ArrowLeft\":\n // Left pressed\n moveX = -10;\n break;\n case \"ArrowRight\":\n moveX = 10;\n // Right pressed\n break;\n case \"ArrowUp\":\n // Up pressed\n moveY = -10;\n break;\n case \"ArrowDown\":\n // Down pressed\n moveY = 10;\n break;\n default:\n }\n if (moveX || moveY) {\n if (e.shiftKey) {\n moveX *= 5;\n moveY *= 5;\n }\n if (e.ctrlKey || e.altKey || e.metaKey) {\n moveX /= 10;\n moveY /= 10;\n }\n\n const [newX, newY] = vectorFromWrapperToBoard(moveX, moveY);\n\n moveItems(\n selectedItems,\n {\n x: newX,\n y: newY,\n },\n true\n );\n const gridSize = boardGridSize || 1; // avoid 0 grid size\n\n placeItems(selectedItems, {\n type: \"grid\",\n size: gridSize,\n });\n e.preventDefault();\n }\n }\n };\n\n useEventListener(document, \"keydown\", onKeyDown);\n\n return (\n <Gesture onDragStart={onDragStart} onDrag={onDrag} onDragEnd={onDragEnd}>\n {children}\n </Gesture>\n );\n};\n\nexport default ActionPane;\n","import { useEventListener } from \"@react-hookz/web\";\nimport React from \"react\";\n\nconst useMousePosition = (ref) => {\n const mouseRef = React.useRef({ hover: false, x: 0, y: 0 });\n\n useEventListener(ref, \"mousemove\", (e) => {\n const { clientX, clientY } = e;\n mouseRef.current.x = clientX;\n mouseRef.current.y = clientY;\n });\n useEventListener(ref, \"mouseenter\", () => {\n mouseRef.current.hover = true;\n });\n useEventListener(ref, \"mouseleave\", () => {\n mouseRef.current.hover = false;\n });\n\n const getMouseInfo = React.useCallback(() => mouseRef.current, []);\n\n return getMouseInfo;\n};\n\nexport default useMousePosition;\n","import React from \"react\";\nimport { useEventListener } from \"@react-hookz/web\";\n\nimport useMainStore from \"./store/main\";\n\nconst digitCodes = [...Array(5).keys()].map((id) => `Digit${id + 1}`);\n\nconst usePositionNavigator = () => {\n const [positions, setPositions] = React.useState({});\n const [getBoardState, updateBoardState] = useMainStore((state) => [\n state.getBoardState,\n state.updateBoardState,\n ]);\n\n useEventListener(document, \"keydown\", (e) => {\n // Block shortcut if we are typing in a textarea or input\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n if (digitCodes.includes(e.code)) {\n const positionKey = e.code;\n const { translateX, translateY, scale } = getBoardState();\n\n if (e.altKey || e.metaKey || e.ctrlKey || e.shiftKey) {\n setPositions((prev) => ({\n ...prev,\n [positionKey]: { translateX, translateY, scale },\n }));\n } else if (positions[positionKey]) {\n updateBoardState(positions[positionKey]);\n }\n e.preventDefault();\n }\n });\n\n return null;\n};\n\nexport default usePositionNavigator;\n","import React from \"react\";\nimport { useEventListener } from \"@react-hookz/web\";\n\nimport Gesture from \"./Gesture\";\nimport useDim from \"./useDim\";\nimport useMousePosition from \"./useMousePosition\";\nimport usePositionNavigator from \"./usePositionNavigator\";\nimport useMainStore from \"./store/main\";\n\nconst PanZoom = ({ children, moveFirst = false }) => {\n const wrappedRef = React.useRef(null);\n const [\n dim,\n itemExtentGlobal,\n getConfiguration,\n updateBoardState,\n getSelection,\n ] = useMainStore((state) => [\n {\n translateX: state.boardState.translateX,\n translateY: state.boardState.translateY,\n scale: state.boardState.scale,\n rotate: state.boardState.rotate,\n },\n state.config.itemExtent,\n state.getConfiguration,\n state.updateBoardState,\n state.getSelection,\n ]);\n const { zoomToCenter, zoomToExtent, moveBoard } = useDim();\n\n const [centered, setCentered] = React.useState(false);\n const timeoutRef = React.useRef({});\n\n // Get mouse position and hover status\n const getMouseInfo = useMousePosition(wrappedRef);\n\n // Hooks to save/restore position\n usePositionNavigator();\n\n /**\n * Center board on startup\n */\n const centerBoard = React.useCallback(() => {\n const { itemExtent } = getConfiguration();\n zoomToExtent(itemExtent);\n }, [getConfiguration, zoomToExtent]);\n\n React.useEffect(() => {\n if (!centered && itemExtentGlobal.radius) {\n // Center board on first valid extent\n centerBoard();\n setCentered(true);\n }\n }, [centerBoard, centered, itemExtentGlobal]);\n\n const onZoom = ({ clientX, clientY, scale }) => {\n zoomToCenter({ to: { x: clientX, y: clientY }, factor: 1 - scale / 500 });\n\n // Update the board zooming state\n clearTimeout(timeoutRef.current.zoom);\n timeoutRef.current.zoom = setTimeout(() => {\n updateBoardState({ zooming: false });\n }, 200);\n updateBoardState({ zooming: true });\n };\n\n const onPan = ({ deltaX, deltaY }) => {\n moveBoard(({ translateX, translateY }) => ({\n translateX: translateX + deltaX,\n translateY: translateY + deltaY,\n }));\n\n // update the board panning state\n clearTimeout(timeoutRef.current.pan);\n timeoutRef.current.pan = setTimeout(() => {\n updateBoardState({ panning: false });\n }, 200);\n updateBoardState({ panning: true });\n };\n\n const onKeyDown = (e) => {\n // Block shortcut if we are typing in a textarea or input\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n let moveX = 0;\n let moveY = 0;\n let zoom = 1;\n switch (e.key) {\n case \"ArrowLeft\":\n moveX = -10;\n break;\n case \"ArrowRight\":\n moveX = 10;\n break;\n case \"ArrowUp\":\n moveY = -10;\n break;\n case \"ArrowDown\":\n moveY = 10;\n break;\n case \"PageUp\":\n zoom = 1.2;\n break;\n case \"PageDown\":\n zoom = 0.8;\n break;\n default:\n }\n if (moveX || moveY || zoom !== 1) {\n // Don't move board if moving item\n const selectedItems = getSelection();\n if (zoom === 1 && selectedItems.length) {\n return;\n }\n if (e.shiftKey) {\n moveX *= 5;\n moveY *= 5;\n }\n if (e.ctrlKey || e.altKey || e.metaKey) {\n moveX /= 5;\n moveY /= 5;\n }\n\n moveBoard(({ translateX, translateY }) => ({\n translateX: translateX + moveX,\n translateY: translateY + moveY,\n }));\n\n zoomToCenter({ factor: zoom });\n\n e.preventDefault();\n }\n // Temporary zoom\n if (e.key === \" \" && !e.repeat) {\n if (getMouseInfo().hover) {\n zoomToCenter({ factor: 3, to: getMouseInfo() });\n }\n }\n };\n\n const onKeyUp = (e) => {\n // Ignore text in Input or Textarea\n if ([\"INPUT\", \"TEXTAREA\"].includes(e.target.tagName)) return;\n\n // Zoom out on release\n if (e.key === \" \" && getMouseInfo().hover) {\n zoomToCenter({ factor: 1 / 3, to: getMouseInfo() });\n }\n };\n\n useEventListener(document, \"keydown\", onKeyDown);\n useEventListener(document, \"keyup\", onKeyUp);\n\n return (\n <Gesture\n onPan={onPan}\n onZoom={onZoom}\n mainAction={moveFirst ? \"pan\" : \"drag\"}\n >\n <div\n style={{\n display: \"inline-block\",\n transformOrigin: \"top left\",\n transform: `translate(${dim.translateX}px, ${dim.translateY}px) rotate(${dim.rotate}deg) scale(${dim.scale})`,\n }}\n className={`board-pane${dim.scale < 0.5 ? \" board-pane__far\" : \"\"}`}\n ref={wrappedRef}\n >\n {children}\n </div>\n </Gesture>\n );\n};\n\nexport default PanZoom;\n","import React from \"react\";\nimport { css } from \"goober\";\nimport { useDebouncedCallback } from \"@react-hookz/web\";\n\nimport { getItemsBoundingBox } from \"@/utils\";\nimport { useSyncedStore } from \"@/board/store/synced\";\nimport useMainStore from \"./store/main\";\n\nconst defaultZoneStyle = css({\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 210,\n backgroundColor: \"hsla(0, 40%, 50%, 0%)\",\n border: \"2px dashed hsl(20, 55%, 40%)\",\n pointerEvents: \"none\",\n});\n\n/**\n * Show a bounding box around all selected items.\n */\nconst BoundingBox = () => {\n const [\n selection,\n getSelection,\n selectionBox,\n setSelectionBox,\n getConfiguration,\n { translateX, translateY, scale },\n ] = useMainStore((state) => [\n state.selection,\n state.getSelection,\n state.selectionBox,\n state.setSelectionBox,\n state.getConfiguration,\n {\n translateX: state.boardState.translateX,\n translateY: state.boardState.translateY,\n scale: state.boardState.scale,\n },\n ]);\n\n const [items] = useSyncedStore((state) => [state.items]);\n\n // Update selection bounding box\n const updateBox = React.useCallback(() => {\n const currentSelectedItems = getSelection();\n const { boardWrapperRect, uid } = getConfiguration();\n\n if (currentSelectedItems.length === 0) {\n setSelectionBox(null);\n return;\n }\n\n const boundingBox = getItemsBoundingBox(currentSelectedItems, uid);\n\n if (!boundingBox) {\n setSelectionBox(null);\n return;\n }\n\n const { left, top, width, height } = boundingBox;\n\n const newBB = {\n left: left - boardWrapperRect.left,\n top: top - boardWrapperRect.top,\n height,\n width,\n };\n setSelectionBox(newBB);\n }, [getConfiguration, getSelection, setSelectionBox]);\n\n // Debounced version of update box\n const updateBoxDelay = useDebouncedCallback(updateBox, [updateBox], 300);\n\n React.useEffect(() => {\n // Update selected elements bounding box\n updateBox();\n updateBoxDelay(); // Delay to update after board item animation like tap/untap.\n }, [\n selection,\n items,\n translateX,\n translateY,\n scale,\n updateBox,\n updateBoxDelay,\n ]);\n\n if (!selectionBox || selection.length < 2) return null;\n\n return (\n <div\n style={{\n transform: `translate(${selectionBox.left}px, ${selectionBox.top}px)`,\n height: `${selectionBox.height}px`,\n width: `${selectionBox.width}px`,\n }}\n className={`selection ${defaultZoneStyle}`}\n />\n );\n};\n\nconst Selection = () => {\n const [movingItems] = useMainStore((state) => [state.boardState.movingItems]);\n\n if (movingItems) {\n return null;\n }\n\n return <BoundingBox />;\n};\n\nexport default Selection;\n","/**\n * Clamps a number between a lower and upper bound.\n *\n * ```js\n * guard(0, 1, 2); // 1\n * ```\n *\n * @param low The lower bound.\n * @param high The upper bound.\n * @param value The number to clamp.\n * @returns The clamped number.\n */\nfunction guard(low, high, value) {\n return Math.min(Math.max(low, value), high);\n}\n\n/**\n * Error thrown when color2k cannot parse an input color.\n *\n * ```js\n * new ColorError('nope').message; // 'Failed to parse color: \"nope\"'\n * ```\n *\n * @param color The color value that failed to parse.\n */\nclass ColorError extends Error {\n constructor(color) {\n super(`Failed to parse color: \"${color}\"`);\n }\n}\n\n/**\n * Parses a color into red, green, blue, and alpha channel values.\n *\n * Supports hex, RGB, RGBA, HSL, HSLA, CSS named colors, and `transparent`.\n *\n * ```js\n * parseToRgba('rgba(255, 0, 0, 0.5)'); // [255, 0, 0, 0.5]\n * ```\n *\n * @param color The input color.\n * @returns A tuple of red, green, blue, and alpha channel values.\n */\nfunction parseToRgba(color) {\n if (typeof color !== 'string') throw new ColorError(color);\n if (color.trim().toLowerCase() === 'transparent') return [0, 0, 0, 0];\n let normalizedColor = color.trim();\n normalizedColor = namedColorRegex.test(color) ? nameToHex(color) : color;\n const reducedHexMatch = reducedHexRegex.exec(normalizedColor);\n if (reducedHexMatch) {\n const arr = Array.from(reducedHexMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(r(x, 2), 16)), parseInt(r(arr[3] || 'f', 2), 16) / 255];\n }\n const hexMatch = hexRegex.exec(normalizedColor);\n if (hexMatch) {\n const arr = Array.from(hexMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(x, 16)), parseInt(arr[3] || 'ff', 16) / 255];\n }\n const rgbaMatch = rgbaRegex.exec(normalizedColor);\n if (rgbaMatch) {\n const arr = Array.from(rgbaMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(x, 10)), parseFloat(arr[3] || '1')];\n }\n const hslaMatch = hslaRegex.exec(normalizedColor);\n if (hslaMatch) {\n const [h, s, l, a] = Array.from(hslaMatch).slice(1).map(parseFloat);\n if (guard(0, 100, s) !== s) throw new ColorError(color);\n if (guard(0, 100, l) !== l) throw new ColorError(color);\n return [...hslToRgb(h, s, l), Number.isNaN(a) ? 1 : a];\n }\n throw new ColorError(color);\n}\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i) {\n hash = hash * 33 ^ str.charCodeAt(--i);\n }\n\n /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n * integers. Since we want the results to be always positive, convert the\n * signed int to an unsigned by doing an unsigned bitshift. */\n return (hash >>> 0) % 2341;\n}\nconst colorToInt = x => parseInt(x.replace(/_/g, ''), 36);\nconst compressedColorMap = '1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm'.split(' ').reduce((acc, next) => {\n const key = colorToInt(next.substring(0, 3));\n const hex = colorToInt(next.substring(3)).toString(16);\n\n // NOTE: padStart could be used here but it breaks Node 6 compat\n // https://github.com/ricokahler/color2k/issues/351\n let prefix = '';\n for (let i = 0; i < 6 - hex.length; i++) {\n prefix += '0';\n }\n acc[key] = `${prefix}${hex}`;\n return acc;\n}, {});\n\n/**\n * Checks if a string is a CSS named color and returns its equivalent hex value, otherwise returns the original color.\n */\nfunction nameToHex(color) {\n const normalizedColorName = color.toLowerCase().trim();\n const result = compressedColorMap[hash(normalizedColorName)];\n if (!result) throw new ColorError(color);\n return `#${result}`;\n}\nconst r = (str, amount) => Array.from(Array(amount)).map(() => str).join('');\nconst reducedHexRegex = new RegExp(`^#${r('([a-f0-9])', 3)}([a-f0-9])?$`, 'i');\nconst hexRegex = new RegExp(`^#${r('([a-f0-9]{2})', 3)}([a-f0-9]{2})?$`, 'i');\nconst rgbaRegex = new RegExp(`^rgba?\\\\(\\\\s*(\\\\d+)\\\\s*${r(',\\\\s*(\\\\d+)\\\\s*', 2)}(?:,\\\\s*([\\\\d.]+))?\\\\s*\\\\)$`, 'i');\nconst hslaRegex = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i;\nconst namedColorRegex = /^[a-z]+$/i;\nconst roundColor = color => {\n return Math.round(color * 255);\n};\nconst hslToRgb = (hue, saturation, lightness) => {\n let l = lightness / 100;\n if (saturation === 0) {\n // achromatic\n return [l, l, l].map(roundColor);\n }\n\n // formulae from https://en.wikipedia.org/wiki/HSL_and_HSV\n const huePrime = (hue % 360 + 360) % 360 / 60;\n const chroma = (1 - Math.abs(2 * l - 1)) * (saturation / 100);\n const secondComponent = chroma * (1 - Math.abs(huePrime % 2 - 1));\n let red = 0;\n let green = 0;\n let blue = 0;\n if (huePrime >= 0 && huePrime < 1) {\n red = chroma;\n green = secondComponent;\n } else if (huePrime >= 1 && huePrime < 2) {\n red = secondComponent;\n green = chroma;\n } else if (huePrime >= 2 && huePrime < 3) {\n green = chroma;\n blue = secondComponent;\n } else if (huePrime >= 3 && huePrime < 4) {\n green = secondComponent;\n blue = chroma;\n } else if (huePrime >= 4 && huePrime < 5) {\n red = secondComponent;\n blue = chroma;\n } else if (huePrime >= 5 && huePrime < 6) {\n red = chroma;\n blue = secondComponent;\n }\n const lightnessModification = l - chroma / 2;\n const finalRed = red + lightnessModification;\n const finalGreen = green + lightnessModification;\n const finalBlue = blue + lightnessModification;\n return [finalRed, finalGreen, finalBlue].map(roundColor);\n};\n\n// taken from:\n// https://github.com/styled-components/polished/blob/a23a6a2bb26802b3d922d9c3b67bac3f3a54a310/src/internalHelpers/_rgbToHsl.js\n\n/**\n * Parses a color into hue, saturation, lightness, and alpha channel values.\n *\n * Hue is a number between 0 and 360. Saturation, lightness, and alpha are\n * decimal percentages between 0 and 1.\n *\n * ```js\n * parseToHsla('red'); // [0, 1, 0.5, 1]\n * ```\n *\n * @param color The input color.\n * @returns A tuple of hue, saturation, lightness, and alpha values.\n */\nfunction parseToHsla(color) {\n const [red, green, blue, alpha] = parseToRgba(color).map((value, index) =>\n // 3rd index is alpha channel which is already normalized\n index === 3 ? value : value / 255);\n const max = Math.max(red, green, blue);\n const min = Math.min(red, green, blue);\n const lightness = (max + min) / 2;\n\n // achromatic\n if (max === min) return [0, 0, lightness, alpha];\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n const hue = 60 * (red === max ? (green - blue) / delta + (green < blue ? 6 : 0) : green === max ? (blue - red) / delta + 2 : (red - green) / delta + 4);\n return [hue, saturation, lightness, alpha];\n}\n\n/**\n * Builds an `hsla` color string from hue, saturation, lightness, and alpha\n * channel values.\n *\n * ```js\n * hsla(0, 1, 0.5, 1); // 'hsla(0, 100%, 50%, 1)'\n * ```\n *\n * @param hue The color wheel angle from 0 to 360.\n * @param saturation The saturation as a decimal between 0 and 1.\n * @param lightness The lightness as a decimal between 0 and 1.\n * @param alpha The opacity as a decimal between 0 and 1.\n * @returns An `hsla` color string.\n */\nfunction hsla(hue, saturation, lightness, alpha) {\n return `hsla(${(hue % 360).toFixed()}, ${guard(0, 100, saturation * 100).toFixed()}%, ${guard(0, 100, lightness * 100).toFixed()}%, ${parseFloat(guard(0, 1, alpha).toFixed(3))})`;\n}\n\n/**\n * Rotates a color's hue by the given number of degrees and returns the result\n * as an `hsla` string. Hue values wrap around the 0 to 360 degree color wheel.\n *\n * ```js\n * adjustHue('red', 180); // 'hsla(180, 100%, 50%, 1)'\n * ```\n *\n * @param color The input color.\n * @param degrees The number of degrees to rotate the hue.\n * @returns The adjusted color as an `hsla` string.\n */\nfunction adjustHue(color, degrees) {\n const [h, s, l, a] = parseToHsla(color);\n return hsla(h + degrees, s, l, a);\n}\n\n/**\n * Darkens a color by subtracting from the lightness channel in HSL space.\n *\n * ```js\n * darken('white', 0.1); // 'hsla(0, 0%, 90%, 1)'\n * ```\n *\n * @param color The input color.\n * @param amount The amount to darken, given as a decimal between 0 and 1.\n * @returns The darkened color as an `hsla` string.\n */\nfunction darken(color, amount) {\n const [hue, saturation, lightness, alpha] = parseToHsla(color);\n return hsla(hue, saturation, lightness - amount, alpha);\n}\n\n/**\n * Desaturates a color by subtracting from the saturation channel in HSL space.\n *\n * ```js\n * desaturate('red', 0.5); // 'hsla(0, 50%, 50%, 1)'\n * ```\n *\n * @param color The input color.\n * @param amount The amount to desaturate, given as a decimal between 0 and 1.\n * @returns The desaturated color as an `hsla` string.\n */\nfunction desaturate(color, amount) {\n const [h, s, l, a] = parseToHsla(color);\n return hsla(h, s - amount, l, a);\n}\n\n// taken from:\n// https://github.com/styled-components/polished/blob/0764c982551b487469043acb56281b0358b3107b/src/color/getLuminance.js\n\n/**\n * Returns the relative luminance of a color using the WCAG formula.\n *\n * ```js\n * getLuminance('papayawhip'); // 0.877971001998354\n * ```\n *\n * @param color The input color.\n * @returns A number between 0 for darkest black and 1 for lightest white.\n */\nfunction getLuminance(color) {\n if (color === 'transparent') return 0;\n function f(x) {\n const channel = x / 255;\n return channel <= 0.04045 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n }\n const [r, g, b] = parseToRgba(color);\n return 0.2126 * f(r) + 0.7152 * f(g) + 0.0722 * f(b);\n}\n\n// taken from:\n// https://github.com/styled-components/polished/blob/0764c982551b487469043acb56281b0358b3107b/src/color/getContrast.js\n\n/**\n * Returns the contrast ratio between two colors based on the WCAG contrast\n * ratio formula.\n *\n * ```js\n * getContrast('#444', '#fff'); // 9.739769120526205\n * ```\n *\n * @param color1 The first color.\n * @param color2 The second color.\n * @returns The contrast ratio between the two colors.\n */\nfunction getContrast(color1, color2) {\n const luminance1 = getLuminance(color1);\n const luminance2 = getLuminance(color2);\n return luminance1 > luminance2 ? (luminance1 + 0.05) / (luminance2 + 0.05) : (luminance2 + 0.05) / (luminance1 + 0.05);\n}\n\n/**\n * Builds an `rgba` color string from red, green, blue, and alpha channel\n * values.\n *\n * ```js\n * rgba(255, 0, 0, 1); // 'rgba(255, 0, 0, 1)'\n * ```\n *\n * @param red The red channel value from 0 to 255.\n * @param green The green channel value from 0 to 255.\n * @param blue The blue channel value from 0 to 255.\n * @param alpha The opacity as a decimal between 0 and 1.\n * @returns An `rgba` color string.\n */\nfunction rgba(red, green, blue, alpha) {\n return `rgba(${guard(0, 255, red).toFixed()}, ${guard(0, 255, green).toFixed()}, ${guard(0, 255, blue).toFixed()}, ${parseFloat(guard(0, 1, alpha).toFixed(3))})`;\n}\n\n/**\n * Mixes two colors together using the Sass mix algorithm and returns an `rgba`\n * color string.\n *\n * ```js\n * mix('red', 'blue', 0.5); // 'rgba(128, 0, 128, 1)'\n * ```\n *\n * @param color1 The first color.\n * @param color2 The second color.\n * @param weight The mix weight as a decimal between 0 and 1.\n * @returns The mixed color as an `rgba` string.\n */\nfunction mix(color1, color2, weight) {\n const normalize = (n, index) =>\n // 3rd index is alpha channel which is already normalized\n index === 3 ? n : n / 255;\n const [r1, g1, b1, a1] = parseToRgba(color1).map(normalize);\n const [r2, g2, b2, a2] = parseToRgba(color2).map(normalize);\n\n // The formula is copied from the original Sass implementation:\n // http://sass-lang.com/documentation/Sass/Script/Functions.html#mix-instance_method\n const alphaDelta = a2 - a1;\n const normalizedWeight = weight * 2 - 1;\n const combinedWeight = normalizedWeight * alphaDelta === -1 ? normalizedWeight : normalizedWeight + alphaDelta / (1 + normalizedWeight * alphaDelta);\n const weight2 = (combinedWeight + 1) / 2;\n const weight1 = 1 - weight2;\n const r = (r1 * weight1 + r2 * weight2) * 255;\n const g = (g1 * weight1 + g2 * weight2) * 255;\n const b = (b1 * weight1 + b2 * weight2) * 255;\n const a = a2 * weight + a1 * (1 - weight);\n return rgba(r, g, b, a);\n}\n\n/**\n * Returns a scale function that interpolates through a list of colors.\n *\n * The returned function accepts a decimal between 0 and 1 and returns the color\n * at that percentage in the scale.\n *\n * ```js\n * const scale = getScale('red', 'yellow', 'green');\n * console.log(scale(0)); // rgba(255, 0, 0, 1)\n * console.log(scale(0.5)); // rgba(255, 255, 0, 1)\n * console.log(scale(1)); // rgba(0, 128, 0, 1)\n * ```\n *\n * If you'd like to limit the domain and range like chroma-js, we recommend\n * wrapping scale again.\n *\n * ```js\n * const _scale = getScale('red', 'yellow', 'green');\n * const scale = x => _scale(x / 100);\n *\n * console.log(scale(0)); // rgba(255, 0, 0, 1)\n * console.log(scale(50)); // rgba(255, 255, 0, 1)\n * console.log(scale(100)); // rgba(0, 128, 0, 1)\n * ```\n *\n * @param colors The colors to interpolate through.\n * @returns A function that maps a decimal percentage to an `rgba` color.\n */\nfunction getScale(...colors) {\n return n => {\n const lastIndex = colors.length - 1;\n const lowIndex = guard(0, lastIndex, Math.floor(n * lastIndex));\n const highIndex = guard(0, lastIndex, Math.ceil(n * lastIndex));\n const color1 = colors[lowIndex];\n const color2 = colors[highIndex];\n const unit = 1 / lastIndex;\n const weight = (n - unit * lowIndex) / unit;\n return mix(color1, color2, weight);\n };\n}\n\nconst guidelines = {\n decorative: 1.5,\n readable: 3,\n aa: 4.5,\n aaa: 7\n};\n\n/**\n * Returns whether a color fails a contrast threshold against a background.\n *\n * The supported standards are `decorative`, `readable`, `aa`, and `aaa`.\n *\n * ```js\n * hasBadContrast('red', 'aa'); // true\n * ```\n *\n * @param color The foreground color.\n * @param standard The contrast standard to test against.\n * @param background The background color.\n * @returns `true` when the contrast ratio is below the selected standard.\n */\nfunction hasBadContrast(color, standard = 'aa', background = '#fff') {\n return getContrast(color, background) < guidelines[standard];\n}\n\n/**\n * Lightens a color by adding to the lightness channel in HSL space.\n *\n * This is equivalent to `darken(color, -amount)`.\n *\n * ```js\n * lighten('black', 0.1); // 'hsla(0, 0%, 10%, 1)'\n * ```\n *\n * @param color The input color.\n * @param amount The amount to lighten, given as a decimal between 0 and 1.\n * @returns The lightened color as an `hsla` string.\n */\nfunction lighten(color, amount) {\n return darken(color, -amount);\n}\n\n/**\n * Makes a color more transparent by decreasing the alpha channel.\n *\n * ```js\n * transparentize('white', 0.1); // 'rgba(255, 255, 255, 0.9)'\n * ```\n *\n * @param color The input color.\n * @param amount The amount to increase transparency by, given as a decimal between 0 and 1.\n * @returns The more transparent color as an `rgba` string.\n */\nfunction transparentize(color, amount) {\n const [r, g, b, a] = parseToRgba(color);\n return rgba(r, g, b, a - amount);\n}\n\n/**\n * Makes a color more opaque by increasing the alpha channel.\n *\n * This is equivalent to `transparentize(color, -amount)`.\n *\n * ```js\n * opacify('rgba(255, 255, 255, 0.5)', 0.1); // 'rgba(255, 255, 255, 0.6)'\n * ```\n *\n * @param color The input color.\n * @param amount The amount to increase opacity by, given as a decimal between 0 and 1.\n * @returns The more opaque color as an `rgba` string.\n */\nfunction opacify(color, amount) {\n return transparentize(color, -amount);\n}\n\n/**\n * Returns whether black is the more readable color to place on top of the\n * input color.\n *\n * This is the boolean form of `readableColor`.\n *\n * ```js\n * readableColorIsBlack('white'); // true\n * ```\n *\n * @param color The background color.\n * @returns `true` when black is the more readable foreground color.\n */\nfunction readableColorIsBlack(color) {\n return getLuminance(color) > 0.179;\n}\n\n/**\n * Returns black or white, whichever has better contrast against the given\n * color.\n *\n * ```js\n * readableColor('white'); // '#000'\n * ```\n *\n * @param color The background color.\n * @returns `#000` or `#fff`.\n */\nfunction readableColor(color) {\n return readableColorIsBlack(color) ? '#000' : '#fff';\n}\n\n/**\n * Saturates a color by adding to the saturation channel in HSL space.\n *\n * This is equivalent to `desaturate(color, -amount)`.\n *\n * ```js\n * saturate('hsl(0, 50%, 50%)', 0.1); // 'hsla(0, 60%, 50%, 1)'\n * ```\n *\n * @param color The input color.\n * @param amount The amount to saturate, given as a decimal between 0 and 1.\n * @returns The saturated color as an `hsla` string.\n */\nfunction saturate(color, amount) {\n return desaturate(color, -amount);\n}\n\n/**\n * Converts a color to a hex color string.\n *\n * Includes an alpha channel when the input color is not fully opaque.\n *\n * ```js\n * toHex('palevioletred'); // '#db7093'\n * ```\n *\n * @param color The input color.\n * @returns A hex color string.\n */\nfunction toHex(color) {\n const [r, g, b, a] = parseToRgba(color);\n let hex = x => {\n const h = guard(0, 255, x).toString(16);\n // NOTE: padStart could be used here but it breaks Node 6 compat\n // https://github.com/ricokahler/color2k/issues/351\n return h.length === 1 ? `0${h}` : h;\n };\n return `#${hex(r)}${hex(g)}${hex(b)}${a < 1 ? hex(Math.round(a * 255)) : ''}`;\n}\n\n/**\n * Converts a color to an `rgba` color string.\n *\n * ```js\n * toRgba('midnightblue'); // 'rgba(25, 25, 112, 1)'\n * ```\n *\n * @param color The input color.\n * @returns An `rgba` color string.\n */\nfunction toRgba(color) {\n return rgba(...parseToRgba(color));\n}\n\n/**\n * Converts a color to an `hsla` color string.\n *\n * ```js\n * toHsla('peachpuff'); // 'hsla(28, 100%, 86%, 1)'\n * ```\n *\n * @param color The input color.\n * @returns An `hsla` color string.\n */\nfunction toHsla(color) {\n return hsla(...parseToHsla(color));\n}\n\nexport { ColorError, adjustHue, darken, desaturate, getContrast, getLuminance, getScale, guard, hasBadContrast, hsla, lighten, mix, opacify, parseToHsla, parseToRgba, readableColor, readableColorIsBlack, rgba, saturate, toHex, toHsla, toRgba, transparentize };\n//# sourceMappingURL=index.exports.import.es.mjs.map\n","import React from \"react\";\nimport { css } from \"goober\";\n\nimport { readableColorIsBlack } from \"color2k\";\n\nconst cursorClass = css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n zIndex: 210,\n pointerEvents: \"none\",\n});\n\nconst cursorLabelClass = css({\n fontWeight: \"bold\",\n padding: \"0 0.5em\",\n borderRadius: \"2px\",\n maxWidth: \"5em\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n marginLeft: \"-0.5em\",\n marginTop: \"1.7em\",\n whitespace: \"nowrap\",\n pointerEvents: \"none\",\n});\n\nconst Cursor = ({ color = \"#666\", size = 40, text }) => {\n const textColor = readableColorIsBlack(color) ? \"#222\" : \"#EEE\";\n return (\n <div className={cursorClass}>\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"1064.7701 445.5539 419.8101 717.0565\"\n width={size}\n height={size}\n >\n <path\n d=\"m 1197.1015,869.718 -62.2719,-154.49286 133.3276,-9.05842 -257.6915,-253.12748 1.2392,356.98609 88.2465,-79.47087 61.702,152.78366 z\"\n style={{\n fill: textColor,\n }}\n />\n <path\n d=\"m 1193.0939,861.12419 -62.2719,-154.49286 133.3276,-9.05842 -257.6915,-253.12748 1.2392,356.98609 88.2465,-79.47087 61.702,152.78366 z\"\n style={{\n fill: \"white\",\n stroke: \"#111\",\n strokeWidth: 20,\n }}\n />\n </svg>\n <div\n style={{\n color: textColor,\n backgroundColor: color,\n }}\n className={cursorLabelClass}\n >\n {text}\n </div>\n </div>\n );\n};\n\nconst MemoizedCursor = React.memo(Cursor);\n\nconst defaultPositionedCursorClass = css({\n top: 0,\n left: 0,\n zIndex: 210,\n position: \"fixed\",\n pointerEvents: \"none\",\n});\n\nconst PositionedCursor = ({ pos, ...rest }) => {\n return (\n <div\n className={defaultPositionedCursorClass}\n style={{\n transform: `translate(${pos.x - 6}px, ${pos.y - 15}px)`,\n }}\n >\n <MemoizedCursor {...rest} />\n </div>\n );\n};\n\nexport default PositionedCursor;\n","import React from \"react\";\nimport Cursor from \"./Cursor\";\nimport { useSyncedUsers } from \"@/users/store\";\nimport useDim from \"@/board/useDim\";\nimport { isPointInsideRect } from \"@/utils\";\nimport useMainStore from \"@/board/store/main\";\n\nconst CursorPane = ({ children }) => {\n const [getConfiguration] = useMainStore((state) => [\n state.getConfiguration,\n state.boardState.scale, // We want to update this component when the scale changes\n ]);\n const { fromWrapperToBoard, fromBoardToWrapper } = useDim();\n const [currentUser, localUsers, cursors, usersById] = useSyncedUsers(\n (state) => [\n state.getUser(),\n state.getLocalUsers(),\n state.cursors,\n state.users,\n ]\n );\n const [moveCursor, removeCursor] = useSyncedUsers((state) => [\n state.moveCursor,\n state.removeCursor,\n ]);\n\n const { boardWrapperRect } = getConfiguration();\n\n const onMouseMove = ({ clientX, clientY }) => {\n const [x, y] = fromWrapperToBoard(\n clientX - boardWrapperRect.left,\n clientY - boardWrapperRect.top\n );\n moveCursor(currentUser.id, { x, y });\n };\n\n const onLeave = () => {\n removeCursor(currentUser.id);\n };\n\n // Prevent race condition when removing user\n const currentCursors = localUsers.reduce((acc, user) => {\n if (user.id !== currentUser.id && cursors[user.id]) {\n acc[user.id] = cursors[user.id];\n }\n return acc;\n }, {});\n\n return (\n <div onPointerMove={onMouseMove} onPointerLeave={onLeave}>\n {children}\n {Object.entries(currentCursors).map(([userId, pos]) => {\n const [x, y] = fromBoardToWrapper(pos.x, pos.y);\n const coord = {\n x: x + boardWrapperRect.left,\n y: y + boardWrapperRect.top,\n };\n if (!isPointInsideRect(coord, boardWrapperRect)) {\n return null;\n }\n return (\n <Cursor\n key={userId}\n pos={coord}\n text={usersById[userId].name}\n color={usersById[userId].color}\n />\n );\n })}\n </div>\n );\n};\n\nexport default CursorPane;\n","import React from \"react\";\nimport { nanoid } from \"nanoid\";\n\nimport { ItemList } from \"./Items\";\nimport Selector from \"./Selector\";\nimport ActionPane from \"./ActionPane\";\nimport PanZoom from \"./PanZoom\";\nimport Selection from \"./Selection\";\nimport { DEFAULT_BOARD_MAX_SIZE } from \"@/settings\";\nimport useDim from \"./useDim\";\nimport useMainStore from \"./store/main\";\n\nimport { insideClass } from \"@/utils\";\nimport { useResizeObserver } from \"@react-hookz/web\";\nimport { css } from \"goober\";\nimport CursorPane from \"./Cursors/CursorPane\";\n\nconst NullWrapper = ({ children }) => children;\n\nconst defaultStyle = {\n overflow: \"hidden\",\n position: \"absolute\",\n inset: 0,\n};\n\nconst Board = ({\n moveFirst = true,\n style,\n wrapperStyle,\n itemTemplates = {},\n boardSize = DEFAULT_BOARD_MAX_SIZE,\n children,\n showResizeHandle = false,\n Wrapper = NullWrapper,\n}) => {\n const boardWrapperRef = React.useRef(null);\n const [uid, updateConfiguration] = useMainStore((state) => [\n state.config.uid,\n state.updateConfiguration,\n ]);\n const { updateItemExtent } = useDim();\n\n const boardStyle = {\n userSelect: \"none\",\n width: `${boardSize}px`,\n height: `${boardSize}px`,\n backgroundColor: \"#333\",\n ...style,\n };\n\n React.useEffect(() => {\n // Chrome-related issue.\n // Making the wheel event non-passive, which allows to use preventDefault() to prevent\n // the browser original zoom and therefore allowing our custom one.\n // More detail at https://github.com/facebook/react/issues/14856\n const cancelWheel = (event) => {\n if (insideClass(event.target, \"board\")) event.preventDefault();\n };\n\n document.body.addEventListener(\"wheel\", cancelWheel, { passive: false });\n\n return () => {\n document.body.removeEventListener(\"wheel\", cancelWheel);\n };\n }, []);\n\n React.useEffect(() => {\n updateConfiguration({\n boardWrapper: boardWrapperRef.current,\n });\n }, [updateConfiguration]);\n\n React.useEffect(() => {\n if (!uid) {\n updateConfiguration({\n uid: nanoid(),\n });\n }\n }, [uid, updateConfiguration]);\n\n React.useEffect(() => {\n updateConfiguration({\n itemTemplates,\n boardSize,\n showResizeHandle,\n });\n }, [itemTemplates, boardSize, showResizeHandle, updateConfiguration]);\n\n React.useEffect(() => {\n updateConfiguration({\n boardWrapperRect: boardWrapperRef.current.getBoundingClientRect(),\n });\n updateItemExtent();\n // Hack to update item extent on load\n setTimeout(updateItemExtent, 2000);\n }, [updateConfiguration, updateItemExtent]);\n\n useResizeObserver(boardWrapperRef, () => {\n if (!boardWrapperRef.current) {\n return;\n }\n updateConfiguration({\n boardWrapperRect: boardWrapperRef.current.getBoundingClientRect(),\n });\n });\n\n const boardWrapperClass = css({ ...defaultStyle, ...wrapperStyle });\n\n return (\n <div\n ref={boardWrapperRef}\n id={uid}\n className={`sync-board ${boardWrapperClass}`}\n >\n <CursorPane>\n <Selector moveFirst={moveFirst}>\n <PanZoom moveFirst={moveFirst}>\n <ActionPane moveFirst={moveFirst}>\n <Wrapper>\n <div\n onContextMenu={(e) => {\n e.preventDefault();\n }}\n style={boardStyle}\n className=\"board\"\n >\n <ItemList />\n {children}\n </div>\n </Wrapper>\n </ActionPane>\n </PanZoom>\n </Selector>\n </CursorPane>\n <Selection />\n </div>\n );\n};\n\nexport default Board;\n","export { default as useWire } from \"@/hooks/useWire\";\n\nexport { default as useItems } from \"@/board/Items/useItems\";\nexport { default as useDebouncedItems } from \"@/board/Items/useDebouncedItems\";\nexport { default as useSelectedItems } from \"@/board/Items/useSelectedItems\";\nexport { default as useGetSelectedItems } from \"@/board/Items/useGetSelectedItems\";\nexport { default as useItemActions } from \"@/board/Items/useItemActions\";\nexport { default as useItemInteraction } from \"@/board/Items/useItemInteraction\";\nexport { default as useAvailableActions } from \"@/board/Items/useAvailableActions\";\n\nexport { default as useSelectionBox } from \"@/board/useSelectionBox\";\n\nexport { useUsers } from \"@/users\";\n\nexport { default as useBoardConfig } from \"@/board/useBoardConfig\";\nexport { default as useBoardState } from \"@/board/useBoardState\";\nexport { default as useBoardPosition } from \"@/board/useDim\";\nexport { default as useSessionInfo } from \"@/board/useSessionInfo\";\n\nexport { default as useMessage } from \"@/message/useMessage\";\n\nexport { default as BoardWrapper } from \"@/BoardWrapper\";\nexport { default as RoomWrapper } from \"@/RoomWrapper\";\nexport { default as Board } from \"@/board/Board\";\n\nimport React from \"react\";\nimport { setup } from \"goober\";\n\nsetup(React.createElement);\n"],"x_google_ignoreList":[0,1,14,17,18,28,29,40],"mappings":"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"}
|