@plurid/plurid-engine 0.0.0-13 → 0.0.0-16
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/distribution/index.es.js +268 -190
- package/distribution/index.es.js.map +1 -1
- package/distribution/index.js +266 -188
- package/distribution/index.js.map +1 -1
- package/distribution/modules/general/tree/index.d.ts +1 -2
- package/distribution/modules/interaction/mathematics/quaternion/index.d.ts +3 -4
- package/distribution/modules/interaction/mathematics/transform/general/index.d.ts +28 -0
- package/distribution/modules/interaction/mathematics/transform/matrix3d/index.d.ts +3 -4
- package/distribution/modules/planes/logic/index.d.ts +1 -3
- package/distribution/modules/planes/registrar/object.d.ts +1 -1
- package/distribution/modules/planes/registrar/utilities.d.ts +1 -1
- package/distribution/modules/space/tree/logic.d.ts +10 -3
- package/distribution/modules/space/tree/object.d.ts +1 -2
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../source/modules/general/configuration/index.ts","../source/modules/routing/Parser/logic.ts","../source/modules/routing/logic/general/index.ts","../source/modules/routing/logic/validity/index.ts","../source/modules/utilities/index.ts","../source/modules/routing/logic/utilities/index.ts","../source/modules/general/tree/index.ts","../source/modules/interaction/direction/index.ts","../source/modules/interaction/mathematics/quaternion/index.ts","../source/modules/interaction/mathematics/matrix/index.ts","../source/modules/interaction/mathematics/transform/general/index.ts","../source/modules/interaction/mathematics/transform/matrix3d/index.ts","../source/modules/internationalization/index.ts","../source/modules/planes/logic/index.ts","../source/modules/routing/IsoMatcher/index.ts","../source/modules/routing/Parser/index.ts","../source/modules/planes/registrar/object.ts","../source/modules/planes/registrar/utilities.ts","../source/modules/space/utilities/index.ts","../source/modules/space/location/logic.ts","../source/modules/space/layout/column.ts","../source/modules/space/layout/row.ts","../source/modules/space/layout/faceToFace.ts","../source/modules/space/layout/sheaves.ts","../source/modules/space/layout/zigZag.ts","../source/modules/space/tree/logic.ts","../source/modules/space/tree/object.ts","../source/modules/space/view/logic.ts","../source/modules/state/compute/space/index.ts","../source/modules/state/compute/themes/index.ts","../source/modules/state/compute/index.ts","../source/modules/state/local/index.ts","../source/functions/template/index.ts","../source/functions/navigate/index.ts"],"sourcesContent":["// #region imports\n // #region libraries\n import {\n TOOLBAR_DRAWERS,\n\n PluridPartialConfiguration,\n PluridConfigurationTheme,\n PluridConfiguration,\n RecursivePartial,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n objects,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst resolveTheme = (\n theme: string | number | symbol | RecursivePartial<PluridConfigurationTheme> | undefined,\n type: 'general' | 'interaction',\n) => {\n if (!theme) {\n return 'plurid';\n }\n\n if (typeof theme === 'string') {\n return theme;\n }\n\n if (typeof theme !== 'object') {\n return 'plurid';\n }\n\n const {\n general,\n interaction,\n } = theme;\n\n if (type === 'general' && general) {\n return general;\n }\n\n if (type === 'interaction' && interaction) {\n return interaction;\n }\n\n return 'plurid';\n}\n\n\nexport const merge = (\n configuration?: PluridPartialConfiguration,\n target?: PluridConfiguration,\n): PluridConfiguration => {\n const targetConfiguration = {\n ...defaultConfiguration,\n ...target,\n };\n\n if (!configuration) {\n return {\n ...targetConfiguration,\n };\n }\n\n\n const specifiedOrDefault = <T>(\n path: string,\n type: string,\n configuration: PluridPartialConfiguration,\n ): T => {\n const item = objects.getNested(configuration, path);\n if (typeof item === type) {\n return item;\n }\n\n return objects.getNested(targetConfiguration, path);\n }\n\n\n /**\n * HACK:\n * Bypass RecursivePartial on the `configuration.space.layout` object.\n */\n const layout: any = configuration\n && configuration.space\n && typeof configuration.space.layout === 'object'\n ? configuration.space.layout\n : targetConfiguration.space.layout;\n\n const mergedConfiguration: PluridConfiguration = {\n ...targetConfiguration,\n global: {\n micro: specifiedOrDefault(\n 'global.micro',\n 'boolean',\n configuration,\n ),\n transparentUI: specifiedOrDefault(\n 'global.transparentUI',\n 'boolean',\n configuration,\n ),\n language: specifiedOrDefault(\n 'global.language',\n 'string',\n configuration,\n ),\n render: specifiedOrDefault(\n 'global.render',\n 'string',\n configuration,\n ),\n theme: {\n // TODO\n // fix the Theme type\n general: resolveTheme(configuration.global?.theme, 'general') as any,\n interaction: resolveTheme(configuration.global?.theme, 'interaction') as any,\n },\n },\n elements: {\n ...targetConfiguration.elements,\n toolbar: {\n show: specifiedOrDefault(\n 'elements.toolbar.show',\n 'boolean',\n configuration,\n ),\n opaque: specifiedOrDefault(\n 'elements.toolbar.opaque',\n 'boolean',\n configuration,\n ),\n conceal: specifiedOrDefault(\n 'elements.toolbar.conceal',\n 'boolean',\n configuration,\n ),\n transformIcons: specifiedOrDefault(\n 'elements.toolbar.transformIcons',\n 'boolean',\n configuration,\n ),\n transformButtons: specifiedOrDefault(\n 'elements.toolbar.transformButtons',\n 'boolean',\n configuration,\n ),\n drawers: (configuration.elements\n && configuration.elements.toolbar\n && configuration.elements.toolbar.drawers\n ? configuration.elements.toolbar.drawers\n : targetConfiguration.elements.toolbar.drawers) as (keyof typeof TOOLBAR_DRAWERS)[],\n toggledDrawers: (configuration.elements\n && configuration.elements.toolbar\n && configuration.elements.toolbar.toggledDrawers\n ? configuration.elements.toolbar.toggledDrawers\n : targetConfiguration.elements.toolbar.toggledDrawers) as (keyof typeof TOOLBAR_DRAWERS)[],\n },\n viewcube: {\n show: specifiedOrDefault(\n 'elements.viewcube.show',\n 'boolean',\n configuration,\n ),\n opaque: specifiedOrDefault(\n 'elements.viewcube.opaque',\n 'boolean',\n configuration,\n ),\n conceal: specifiedOrDefault(\n 'elements.viewcube.conceal',\n 'boolean',\n configuration,\n ),\n buttons: specifiedOrDefault(\n 'elements.viewcube.buttons',\n 'boolean',\n configuration,\n ),\n },\n plane: {\n width: specifiedOrDefault(\n 'elements.plane.width',\n 'number',\n configuration,\n ),\n opacity: specifiedOrDefault(\n 'elements.plane.opacity',\n 'number',\n configuration,\n ),\n controls: {\n show: specifiedOrDefault(\n 'elements.plane.controls.show',\n 'boolean',\n configuration,\n ),\n pathbar: {\n domainURL: specifiedOrDefault(\n 'elements.plane.controls.pathbar.domainURL',\n 'boolean',\n configuration,\n ),\n },\n },\n },\n switch: {\n show: configuration?.elements?.switch?.show ?? false,\n },\n },\n space: {\n ...targetConfiguration.space,\n layout,\n camera: specifiedOrDefault(\n 'space.camera',\n 'string',\n configuration,\n ),\n perspective: specifiedOrDefault(\n 'space.perspective',\n 'number',\n configuration,\n ),\n opaque: specifiedOrDefault(\n 'space.opaque',\n 'boolean',\n configuration,\n ),\n fadeInTime: specifiedOrDefault(\n 'space.fadeInTime',\n 'number',\n configuration,\n ),\n center: specifiedOrDefault(\n 'space.center',\n 'boolean',\n configuration,\n ),\n transformOrigin: {\n show: specifiedOrDefault(\n 'space.transformOrigin.show',\n 'boolean',\n configuration,\n ),\n size: specifiedOrDefault(\n 'space.transformOrigin.size',\n 'string',\n configuration,\n ),\n },\n transformLocks: {\n rotationX: specifiedOrDefault(\n 'space.transformLocks.rotationX',\n 'boolean',\n configuration,\n ),\n rotationY: specifiedOrDefault(\n 'space.transformLocks.rotationY',\n 'boolean',\n configuration,\n ),\n translationX: specifiedOrDefault(\n 'space.transformLocks.translationX',\n 'boolean',\n configuration,\n ),\n translationY: specifiedOrDefault(\n 'space.transformLocks.translationY',\n 'boolean',\n configuration,\n ),\n translationZ: specifiedOrDefault(\n 'space.transformLocks.translationZ',\n 'boolean',\n configuration,\n ),\n scale: specifiedOrDefault(\n 'space.transformLocks.scale',\n 'boolean',\n configuration,\n ),\n },\n transformMode: specifiedOrDefault(\n 'space.transformMode',\n 'string',\n configuration,\n ),\n transformMultimode: specifiedOrDefault(\n 'space.transformMultimode',\n 'boolean',\n configuration,\n ),\n transformTouch: specifiedOrDefault(\n 'space.transformTouch',\n 'string',\n configuration,\n ),\n firstPerson: specifiedOrDefault(\n 'space.firstPerson',\n 'boolean',\n configuration,\n ),\n },\n network: {\n host: specifiedOrDefault(\n 'network.host',\n 'string',\n configuration,\n ),\n protocol: specifiedOrDefault(\n 'network.protocol',\n 'string',\n configuration,\n ),\n },\n development: {\n planeDebugger: specifiedOrDefault(\n 'development.planeDebugger',\n 'boolean',\n configuration,\n ),\n spaceDebugger: specifiedOrDefault(\n 'development.spaceDebugger',\n 'boolean',\n configuration,\n ),\n },\n };\n\n return mergedConfiguration;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n Indexed,\n PluridRouteFragments,\n PluridRouteFragmentElement,\n PluridRouteFragmentText,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region internal\n import {\n ParserParametersAndMatch,\n } from './interfaces';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nexport const extractPathname = (\n location: string,\n) => {\n const queryIndex = location.indexOf('?');\n const noQueryPath = queryIndex === -1\n ? location\n : location.substring(0, queryIndex);\n\n const fragmentIndex = noQueryPath.indexOf('#:~:');\n const noFragmentPath = fragmentIndex === -1\n ? noQueryPath\n : noQueryPath.substring(0, fragmentIndex);\n\n return noFragmentPath;\n}\n\n\n/**\n * Extracts the parameters names from a `route`.\n *\n * e.g.\n *\n * `'/:foo/:boo'` -> `[':foo', 'boo']`\n *\n * `'/foo/:boo'` -> `['', 'boo']`\n *\n * `'/foo/boo'` -> `[]`\n *\n * If there are no parameters returns an empty array.\n * Non-parametric route elements have an empty string as placeholder.\n *\n * @param route\n */\nexport const extractParametersAndMatch = (\n location: string,\n route: string,\n): ParserParametersAndMatch => {\n const routeElements = splitPath(route);\n const parameters: string[] = [];\n\n routeElements.forEach(routeElement => {\n if (routeElement[0] === ':') {\n parameters.push(routeElement);\n } else {\n parameters.push('');\n }\n });\n\n const {\n locationElements,\n comparingPath,\n } = computeComparingPath(location, parameters);\n // console.log('locationElements', locationElements);\n // console.log('comparingPath', comparingPath);\n if (comparingPath !== route) {\n return {\n match: false,\n parameters: {},\n elements: locationElements,\n };\n }\n\n const parametersValues = extractParametersValues(\n parameters,\n locationElements,\n );\n return {\n match: true,\n parameters: parametersValues,\n elements: locationElements,\n };\n}\n\n\n/**\n * Extract the parameters values.\n *\n * e.g.\n *\n * `parameters = ['', ':list']`\n *\n * `pathElements = ['list', 'foo']`\n *\n * `parametersValues = { list: 'foo' }`\n *\n * @param parameters\n * @param pathElements\n */\nexport const extractParametersValues = (\n parameters: string[],\n pathElements: string[],\n): Record<string, string> => {\n const parametersValues: Record<string, string> = {};\n\n parameters.forEach(\n (parameter, index) => {\n if (parameter) {\n const parameterKey = parameter.slice(1,);\n parametersValues[parameterKey] = pathElements[index];\n }\n }\n );\n\n return parametersValues;\n}\n\n\n/**\n * Based on the `path` and the `parameters` computes a match for comparison.\n *\n * @param path\n * @param parameters\n */\nexport const computeComparingPath = (\n path: string,\n parameters: string[],\n) => {\n const pathname = extractPathname(path);\n const locationElements = splitPath(pathname);\n const comparingPathElements = [...locationElements];\n\n for (const index of locationElements.keys()) {\n if (parameters[index]) {\n comparingPathElements[index] = parameters[index];\n }\n }\n\n // const comparingPath = '/' + comparingPathElements.join('/');\n const comparingPath = comparingPathElements.join('/');\n\n return {\n locationElements,\n comparingPath,\n };\n}\n\n\n/**\n * Splits `path` into elements.\n *\n * e.g. `'/foo/boo'` -> `['foo', 'boo']`\n *\n * @param path\n */\nexport const splitPath = (\n path: string,\n) => {\n return path.split('/').filter(i => i !== '');\n}\n\n\n/**\n * Extract the query values.\n *\n * e.g.\n *\n * `path = '/foo?id=1&asd=asd'`\n *\n * `query = { id: 1, asd: 'asd' }`\n *\n * @param path\n */\nexport const extractQuery = (\n path: string,\n): Indexed<string> => {\n const fragmentIndex = path.indexOf('#:~:');\n const noFragmentPath = fragmentIndex === -1\n ? path\n : path.substring(0, fragmentIndex);\n const querySplit = noFragmentPath.split('?');\n\n if (querySplit.length === 2) {\n const queryValues: Indexed<string> = {};\n const query = querySplit[1];\n const queryItems = query.split('&');\n\n for (const item of queryItems) {\n const queryValue = item.split('=');\n const id = queryValue[0];\n const value = decodeURIComponent(queryValue[1]);\n\n queryValues[id] = value;\n }\n\n return queryValues;\n } else {\n return {};\n }\n}\n\n\nexport const extractFragments = (\n location?: string,\n): PluridRouteFragments => {\n if (!location) {\n return {\n texts: [],\n elements: [],\n };\n }\n\n const split = location.split('#:~:');\n const fragmentsValues = split[1];\n\n if (!fragmentsValues) {\n return {\n texts: [],\n elements: [],\n };\n }\n\n const fragmentItems = fragmentsValues.split('&');\n\n const textFragments: PluridRouteFragmentText[] = [];\n const elementFragments: PluridRouteFragmentElement[] = [];\n\n for (const item of fragmentItems) {\n const parsedFragment = parseFragment(item);\n if (parsedFragment) {\n switch (parsedFragment.type) {\n case 'text':\n textFragments.push(parsedFragment);\n break;\n case 'element':\n elementFragments.push(parsedFragment);\n break;\n }\n }\n }\n\n return {\n texts: textFragments,\n elements: elementFragments,\n };\n}\n\n\nexport const parseFragment = (\n fragment: string,\n): PluridRouteFragmentText | PluridRouteFragmentElement | undefined => {\n const fragmentData = fragment.split('=');\n const fragmentType = fragmentData[0];\n const fragmentValues = fragmentData[1];\n\n switch (fragmentType.toLowerCase()) {\n case 'text':\n {\n const textValues = fragmentValues.split(',');\n const textStart = textValues[0];\n const textEnd = textValues[1];\n const textOccurence = extractOccurence(textValues[2]);\n\n if (!textStart) {\n return;\n }\n\n return {\n type: 'text',\n start: textStart,\n end: textEnd || '',\n occurence: textOccurence,\n };\n }\n case 'element':\n {\n const elementValues = fragmentValues.split(',');\n const elementID = elementValues[0];\n const elementOccurence = extractOccurence(elementValues[1]);\n\n if (!elementID) {\n return;\n }\n\n return {\n type: 'element',\n id: elementID,\n occurence: elementOccurence,\n };\n }\n }\n\n return undefined;\n}\n\n\nexport const extractOccurence = (\n occurence: string | undefined,\n): number => {\n if (!occurence) {\n return 0;\n }\n\n const occurenceMatch = occurence.match(/\\[(\\d*)\\]/);\n const occurenceValue = occurenceMatch\n ? parseInt(occurenceMatch[1])\n : 0;\n\n return occurenceValue;\n}\n// #endregion module\n","// #region imports\n // #region imports\n import {\n protocols,\n PLURID_PROTOCOL,\n HTTPS_PROTOCOL,\n HTTP_PROTOCOL,\n } from '@plurid/plurid-data';\n // #endregion imports\n\n\n // #region external\n import {\n extractPathname,\n } from '~modules/routing/Parser/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const stringInsertInitial = (\n value: string,\n insert: string,\n) => {\n if (!value.startsWith(insert)) {\n value = insert + value;\n }\n\n return value;\n}\n\nexport const stringRemoveTrailing = (\n value: string,\n trail: string,\n) => {\n if (value.endsWith(trail)) {\n value = value.slice(0, value.length - trail.length);\n }\n\n return value;\n}\n\n\nconst PATH_SEPARATOR = '/';\n\nexport const cleanupPath = (\n value: string,\n) => {\n value = stringInsertInitial(value, PATH_SEPARATOR);\n value = stringRemoveTrailing(value, PATH_SEPARATOR);\n return value;\n}\n\n\nexport const computePlaneAddress = (\n plane: string,\n route?: string,\n origin: string = 'origin',\n) => {\n if (origin === 'origin' && typeof location !== 'undefined') {\n origin = location.host;\n }\n\n const cleanPlane = extractPathname(plane);\n\n const planeAddressType = checkPlaneAddressType(cleanPlane);\n\n switch(planeAddressType) {\n case 'http':\n case 'https':\n case 'pttp':\n return cleanPlane;\n }\n\n origin = stringRemoveTrailing(origin, '/');\n\n const absolutePlane = isAbsolutePlane(plane)\n\n const path = route && route !== '/'\n ? absolutePlane\n ? cleanupPath(cleanPlane)\n : cleanupPath(route) + cleanupPath(cleanPlane)\n : cleanupPath(cleanPlane);\n\n const planeAddress = protocols.plurid + origin + path;\n\n return planeAddress;\n}\n\nexport const isAbsolutePlane = (\n value: string,\n) => {\n return value[0] === '/';\n}\n\n\nexport const checkPlaneAddressType = (\n value: string,\n) => {\n value = value\n .toLowerCase()\n .trim();\n\n if (value.startsWith(protocols.plurid)) {\n return 'pttp';\n }\n\n if (value.startsWith(protocols.https)) {\n return HTTPS_PROTOCOL;\n }\n\n if (value.startsWith(protocols.http)) {\n return HTTP_PROTOCOL;\n }\n\n return 'relative';\n}\n\n\nexport const removeTrailingSlash = (\n value: string,\n) => {\n if (value.endsWith('/') && value.length > 1) {\n return value.slice(0, value.length - 1);\n }\n\n return value;\n}\n\n\nexport const cleanPathValue = (\n value: string,\n) => {\n const queryStart = value.indexOf('?');\n if (queryStart < 0) {\n return removeTrailingSlash(\n value,\n );\n }\n\n return removeTrailingSlash(\n value.substring(0, queryStart),\n );\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n compareTypes,\n CompareType,\n Indexed,\n PluridRouteParameter,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const checkParameterLength = (\n parameter: string,\n length: number,\n compareType?: CompareType,\n) => {\n const parameterLength = parameter.length;\n\n switch (compareType) {\n case compareTypes.equal:\n return parameterLength === length;\n case compareTypes.equalLessThan:\n return parameterLength <= length;\n case compareTypes.lessThan:\n return parameterLength < length;\n case compareTypes.equalGreaterThan:\n return parameterLength >= length;\n case compareTypes.greaterThan:\n return parameterLength > length;\n default:\n return parameterLength <= length;\n }\n}\n\n\n\nexport const checkValidPath = <C>(\n validationParameters: Record<string, PluridRouteParameter> | undefined,\n parameters: Indexed<string>,\n) => {\n if (validationParameters) {\n for (const [parameterKey, parameterData] of Object.entries(validationParameters)) {\n const {\n length,\n lengthType,\n startsWith,\n endsWith,\n includes,\n } = parameterData;\n\n const paramaterValue = parameters[parameterKey];\n\n if (!paramaterValue) {\n return false;\n }\n\n if (startsWith && !paramaterValue.startsWith(startsWith)) {\n return false;\n }\n\n if (endsWith && !paramaterValue.endsWith(endsWith)) {\n return false;\n }\n\n if (includes && !includes.includes(paramaterValue)) {\n return false;\n }\n\n if (length) {\n const validLength = checkParameterLength(\n paramaterValue,\n length,\n lengthType,\n );\n return validLength;\n }\n }\n }\n\n return true;\n}\n// #endregion module\n","// #region module\nexport const cleanPathElement = (\n path: string,\n) => {\n if (path[0] === '/') {\n return path.slice(1);\n }\n\n return path;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n Indexed,\n PluridRoute,\n RouteDivisions,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n cleanPathElement,\n } from '~modules/utilities';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const mapPathsToRoutes = <C, V>(\n paths: Indexed<string>,\n view: V,\n) => {\n const routes: PluridRoute<C>[] = [];\n\n for (const [key, path] of Object.entries(paths)) {\n const pathView = (view as any)[key];\n\n if (pathView) {\n const route: PluridRoute<C> = {\n value: '',\n // path,\n // view: pathView,\n };\n routes.push(route);\n }\n }\n\n return routes;\n}\n\n\n\n// const interplanarExample = '://plane'; // or intraclusterial\n// const interclusterialExample = '://cluster://plane'; // or intrauniversal\n// const interuniversalExample = '://universe://cluster://plane'; // or intraspatial\n// const interspatialExample = '://space://universe://cluster://plane'; // or intraroutal\n// const interroutalExample = '://route://space://universe://cluster://plane';\n// const pluriversalExample = 'https://origin://route://space://universe://cluster://plane';\n// const pluriversalExampleControlledOrigin = 'https://corigin://route://space://universe://cluster://plane';\n// const pluriversalExampleForeignOrigin = 'https://forigin://route://space://universe://cluster://plane';\n\n\nexport const pluridLinkPathDivider = (\n route: string,\n): RouteDivisions => {\n // console.log('pluridLinkPathDivider route', route);\n\n const windowProtocol = typeof window === 'undefined'\n ? 'http'\n : window.location.protocol.replace(':', '');\n const windowHost = typeof window === 'undefined'\n ? 'localhost:63000'\n : window.location.host;\n\n const split = route\n .split('://')\n .filter(value => value !== '')\n .map(value => cleanPathElement(value));\n // console.log('SPLIT', split);\n\n let protocol = windowProtocol;\n const host = {\n value: windowHost,\n controlled: false,\n };\n const path = {\n value: '',\n parameters: {},\n query: {},\n };\n const space = {\n value: '',\n parameters: {},\n query: {},\n };\n const universe = {\n value: '',\n parameters: {},\n query: {},\n };\n const cluster = {\n value: '',\n parameters: {},\n query: {},\n };\n const plane = {\n value: '',\n parameters: {},\n query: {},\n fragments: {\n texts: [],\n elements: [],\n },\n };\n const valid = false;\n\n if (\n split.length === 0\n || split.length > 7\n ) {\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid,\n };\n return url;\n }\n\n if (route.startsWith('/://')) {\n const routeSplit = split.slice(1);\n switch (routeSplit.length) {\n case 1:\n path.value = routeSplit[0];\n break;\n case 5:\n path.value = routeSplit[0];\n space.value = routeSplit[1];\n universe.value = routeSplit[2];\n cluster.value = routeSplit[3];\n plane.value = routeSplit[4];\n break;\n }\n\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid: true,\n };\n // console.log('URL', url);\n\n return url;\n }\n\n if (\n split[0] !== 'http'\n && split[0] !== 'https'\n && split[0] !== 'chrome-extension'\n ) {\n switch (split.length) {\n case 1:\n plane.value = split[0];\n break;\n case 2:\n cluster.value = split[0];\n plane.value = split[1];\n break;\n case 3:\n universe.value = split[0];\n cluster.value = split[1];\n plane.value = split[2];\n break;\n case 4:\n space.value = split[0];\n universe.value = split[1];\n cluster.value = split[2];\n plane.value = split[3];\n break;\n case 5:\n path.value = split[0];\n space.value = split[1];\n universe.value = split[2];\n cluster.value = split[3];\n plane.value = split[4];\n break;\n case 6:\n host.value = split[0];\n path.value = split[1];\n space.value = split[2];\n universe.value = split[3];\n cluster.value = split[4];\n plane.value = split[5];\n break;\n default:\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid,\n };\n return url;\n }\n } else {\n switch (split.length) {\n case 3:\n protocol = split[0];\n host.value = split[1];\n path.value = split[2];\n break;\n case 7:\n protocol = split[0];\n host.value = split[1];\n path.value = split[2];\n space.value = split[3];\n universe.value = split[4];\n cluster.value = split[5];\n plane.value = split[6];\n break;\n default:\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid,\n };\n return url;\n }\n }\n\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid: true,\n };\n\n return url;\n}\n\n\n/**\n * Given a partial `route`, e.g. `/route`, or `://cluster://route`,\n * it resolves it to the absolute form\n * `protocol://origin://route://space://universe://cluster://plane`.\n *\n * @param path\n */\nexport const resolveRoute = (\n route: string,\n protocol?: string,\n host?: string,\n) => {\n const windowProtocol = typeof window === 'undefined'\n ? protocol || 'http'\n : window.location.protocol.replace(':', '');\n const windowHost = typeof window === 'undefined'\n ? host || 'localhost:63000'\n : window.location.host;\n\n const divisions = pluridLinkPathDivider(route);\n // console.log('resolveRoute > divisions', divisions);\n\n const defaultPathname = typeof window !== 'undefined'\n ? window.location.pathname === '/'\n ? 'p'\n : window.location.pathname.slice(1)\n : divisions.path.value\n ? divisions.path.value\n : 'p';\n\n const protocolDivision = divisions.protocol.value || windowProtocol;\n const hostDivision = divisions.host.value\n ? divisions.host\n : {\n value: windowHost,\n controlled: true,\n };\n const path = divisions.path.value\n ? divisions.path\n : {\n value: defaultPathname,\n parameters: {},\n query: {},\n };\n const space = divisions.space.value\n ? divisions.space\n : {\n value: 's',\n parameters: {},\n query: {},\n };\n const universe = divisions.universe.value\n ? divisions.universe\n : {\n value: 'u',\n parameters: {},\n query: {},\n };\n const cluster = divisions.cluster.value\n ? divisions.cluster\n : {\n value: 'c',\n parameters: {},\n query: {},\n };\n const plane = divisions.plane;\n\n const separator = '://';\n\n if (!plane.value && route !== '/') {\n const resolvers = [\n protocolDivision,\n hostDivision.value,\n path.value,\n ];\n const absoluteRoute = resolvers.join(separator);\n\n return {\n protocol: protocolDivision,\n host: hostDivision,\n path,\n space,\n universe,\n cluster,\n plane,\n route: absoluteRoute,\n };\n }\n\n const resolvers = [\n protocolDivision,\n hostDivision.value,\n path.value,\n space.value,\n universe.value,\n cluster.value,\n cleanPathElement(plane.value),\n ];\n const absoluteRoute = resolvers.join(separator);\n\n // return {\n // protocol: protocolDivision,\n // host: hostDivision,\n // path,\n // space,\n // universe,\n // cluster,\n // plane,\n // route: absoluteRoute,\n // };\n\n return {\n protocol: '',\n host: '',\n path,\n space: '',\n universe: '',\n cluster: '',\n plane: '',\n route: route,\n };\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n /** constants */\n defaultTreePlane,\n\n /** interfaces */\n PluridInternalContextPlane,\n PluridInternalStatePlane,\n TreePlane,\n LinkCoordinates,\n } from '@plurid/plurid-data';\n\n import {\n uuid,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n pluridLinkPathDivider,\n } from '~modules/routing/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const createTreePlane = <C>(\n contextPlane: PluridInternalContextPlane<C>,\n documentPlane: PluridInternalStatePlane,\n) => {\n const routeDivisions = pluridLinkPathDivider(contextPlane.path);\n // console.log('routeDivisions', routeDivisions);\n\n const treePlane: TreePlane = {\n ...defaultTreePlane,\n routeDivisions,\n sourceID: contextPlane.id,\n planeID: uuid.generate(),\n route: contextPlane.path,\n show: true,\n };\n return treePlane;\n}\n\n\nexport const updateTreePlane = (\n tree: TreePlane[],\n page: TreePlane,\n): TreePlane[] => {\n const updatedTree = tree.map(treePlane => {\n if (treePlane.planeID === page.planeID) {\n return {\n ...page,\n };\n }\n\n if (treePlane.children) {\n return {\n ...treePlane,\n children: updateTreePlane(treePlane.children, page),\n };\n }\n\n return treePlane;\n });\n\n return updatedTree;\n}\n\n\n\nexport const updateTreeByPlaneIDWithLinkCoordinates = (\n tree: TreePlane[],\n planeID: string,\n linkCoordinates: LinkCoordinates,\n): TreePlane[] => {\n const updatedTree = tree.map(treePlane => {\n if (treePlane.planeID === planeID) {\n const updatedPlane = {\n ...treePlane,\n linkCoordinates,\n };\n\n return updatedPlane;\n }\n\n if (treePlane.children) {\n const updatedChildren = updateTreeByPlaneIDWithLinkCoordinates(\n treePlane.children,\n planeID,\n linkCoordinates,\n );\n\n const updatedPlane = {\n ...treePlane,\n children: updatedChildren,\n };\n\n return updatedPlane;\n }\n\n return treePlane;\n });\n\n return updatedTree;\n}\n// #endregion module\n","// #region imports\n // #region external\n import {\n WheelDeltas,\n } from '@plurid/plurid-data';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const getWheelDirection = (\n deltas: WheelDeltas,\n ABSTHRESHOLD: number = 10,\n THRESHOLD: number = 0,\n): string => {\n let direction = 'left';\n const wheelDeltaX = deltas.deltaX;\n const wheelDeltaY = deltas.deltaY;\n // console.log('PluridEngine :: wheelDeltaX', wheelDeltaX);\n // console.log('PluridEngine :: wheelDeltaY', wheelDeltaY);\n const absWheelDeltaX = Math.abs(wheelDeltaX);\n const absWheelDeltaY = Math.abs(wheelDeltaY);\n // console.log('PluridEngine :: absWheelDeltaX', absWheelDeltaX);\n // console.log('PluridEngine :: absWheelDeltaY', absWheelDeltaY);\n\n if (\n wheelDeltaX > THRESHOLD &&\n absWheelDeltaY < ABSTHRESHOLD &&\n absWheelDeltaX > absWheelDeltaY\n ) {\n direction = 'left';\n }\n\n if (\n wheelDeltaX < THRESHOLD &&\n absWheelDeltaY < ABSTHRESHOLD &&\n absWheelDeltaX > absWheelDeltaY\n ) {\n direction = 'right';\n }\n\n if (\n wheelDeltaY > THRESHOLD &&\n absWheelDeltaX < ABSTHRESHOLD &&\n absWheelDeltaY > absWheelDeltaX\n ) {\n direction = 'up';\n }\n\n if (\n wheelDeltaY < THRESHOLD &&\n absWheelDeltaX < ABSTHRESHOLD &&\n absWheelDeltaY > absWheelDeltaX\n ) {\n direction = 'down';\n }\n\n // if (positionX < threshold && positionY < threshold) {\n // direction = \"upleft\";\n // }\n\n // if (positionX < threshold && positionY > threshold ) {\n // direction = \"downleft\";\n // }\n\n // if (positionX > threshold && positionY > threshold ) {\n // direction = \"downright\";\n // }\n\n // if (positionX > threshold && positionY < threshold ) {\n // direction = \"upright\";\n // }\n\n return direction;\n};\n// #endregion module\n","// #region module\n/**\n * Converts degrees to radians.\n *\n * @param deg\n * @returns radians\n */\nexport const degToRad = (deg: number): number => {\n // deg * Math.PI / 180\n // return deg * Math.PI / 180;\n return deg * 0.01745329252;\n};\n\n/**\n * Converts radians to degrees.\n *\n * @param deg\n * @returns degrees\n */\nexport const radToDeg = (rad: number): number => {\n // rad * 180 / Math.PI\n // return rad * 180 / Math.PI;\n return rad * 57.2957795131;\n};\n\n\n\ninterface Quaternion {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\n/**\n *\n * @param x\n * @param y\n * @param z\n * @param w\n * @returns {Quaternion}\n */\nexport const makeQuaternion = (\n x: number,\n y: number,\n z: number,\n w: number,\n): Quaternion => {\n return {\n x,\n y,\n z,\n w,\n };\n};\n\n/**\n * Returns all-fields 0-ed quaternion.\n *\n * @returns {Quaternion}\n */\nexport const zeroQuaternion = (): Quaternion => {\n return makeQuaternion(0, 0, 0, 0);\n};\n\n/**\n *\n * @param quaternion\n */\nexport function inverseQuaternion(quaternion: Quaternion): Quaternion {\n return makeQuaternion(\n quaternion.x,\n quaternion.y,\n quaternion.z,\n -quaternion.w,\n );\n}\n\n/**\n *\n * @param quaternion\n */\nexport function conjugateQuaternion(quaternion: Quaternion): Quaternion {\n return makeQuaternion(\n -quaternion.x,\n -quaternion.y,\n -quaternion.z,\n quaternion.w,\n );\n}\n\n/**\n * Generates quaternion based on Euler angles (in radians).\n *\n * @param alpha around Z axis\n * @param beta around X axis\n * @param gamma around Y axis\n * @returns {Quaternion}\n */\nexport function computeQuaternionFromEulers(\n alpha: number,\n beta: number,\n gamma: number,\n): Quaternion {\n // const x = degToRad(beta);\n // const y = degToRad(gamma);\n // const z = degToRad(alpha);\n const x = beta;\n const y = gamma;\n const z = alpha;\n\n const cX = Math.cos(x / 2);\n const cY = Math.cos(y / 2);\n const cZ = Math.cos(z / 2);\n const sX = Math.sin(x / 2);\n const sY = Math.sin(y / 2);\n const sZ = Math.sin(z / 2);\n\n const xQ = sX * cY * cZ - cX * sY * sZ;\n const yQ = cX * sY * cZ + sX * cY * sZ;\n const zQ = cX * cY * sZ + sX * sY * cZ;\n const wQ = cX * cY * cZ - sX * sY * sZ;\n\n return makeQuaternion(xQ, yQ, zQ, wQ);\n}\n\n/**\n *\n * @param x\n * @param y\n * @param z\n * @param angle\n */\nexport function quaternionFromAxisAngle(\n x: number,\n y: number,\n z: number,\n angle: number,\n): Quaternion {\n const q: Quaternion = zeroQuaternion();\n const halfAngle = angle / 2;\n q.x = x * Math.sin(halfAngle);\n q.y = y * Math.sin(halfAngle);\n q.z = z * Math.sin(halfAngle);\n q.w = Math.cos(halfAngle);\n return q;\n}\n\n/**\n *\n * @param quaternionArray\n */\nexport function quaternionMultiply(quaternionArray: Quaternion[]): Quaternion {\n const temporaryQuaternion: Quaternion = quaternionArray[0];\n const copyQuaternion: Quaternion = {\n x: temporaryQuaternion.x,\n y: temporaryQuaternion.y,\n z: temporaryQuaternion.z,\n w: temporaryQuaternion.w,\n };\n\n for (let i = 1; i < quaternionArray.length; i++) {\n const secondaryTemporaryQuaternion: Quaternion = quaternionArray[i];\n const nextQuaternion: Quaternion = {\n x: secondaryTemporaryQuaternion.x,\n y: secondaryTemporaryQuaternion.y,\n z: secondaryTemporaryQuaternion.z,\n w: secondaryTemporaryQuaternion.w,\n };\n\n const w =\n copyQuaternion.w * nextQuaternion.w -\n copyQuaternion.x * nextQuaternion.x -\n copyQuaternion.y * nextQuaternion.y -\n copyQuaternion.z * nextQuaternion.z;\n\n const x =\n copyQuaternion.x * nextQuaternion.w +\n copyQuaternion.w * nextQuaternion.x +\n copyQuaternion.y * nextQuaternion.z -\n copyQuaternion.z * nextQuaternion.y;\n\n const y =\n copyQuaternion.y * nextQuaternion.w +\n copyQuaternion.w * nextQuaternion.y +\n copyQuaternion.z * nextQuaternion.x -\n copyQuaternion.x * nextQuaternion.z;\n\n const z =\n copyQuaternion.z * nextQuaternion.w +\n copyQuaternion.w * nextQuaternion.z +\n copyQuaternion.x * nextQuaternion.y -\n copyQuaternion.y * nextQuaternion.x;\n\n copyQuaternion.x = x;\n copyQuaternion.y = y;\n copyQuaternion.z = z;\n copyQuaternion.w = w;\n }\n\n return copyQuaternion;\n}\n\n/**\n *\n * @param pointRotate\n * @param quaternion\n */\nexport function rotatePointViaQuaternion(\n pointRotate: any,\n quaternion: Quaternion,\n): Quaternion {\n const temporaryQuaternion: Quaternion = {\n x: pointRotate[0],\n y: pointRotate[1],\n z: pointRotate[2],\n w: 0,\n };\n const rotatedPoint = quaternionMultiply([\n quaternion,\n temporaryQuaternion,\n conjugateQuaternion(quaternion),\n ]);\n\n return {\n x: rotatedPoint.x,\n y: rotatedPoint.y,\n z: rotatedPoint.z,\n w: rotatedPoint.w,\n };\n}\n\n/**\n *\n * @param quaternion\n */\nexport function makeRotationMatrixFromQuaternion(quaternion: Quaternion) {\n const num = quaternion.x * 2;\n const num2 = quaternion.y * 2;\n const num3 = quaternion.z * 2;\n const num4 = quaternion.x * num;\n const num5 = quaternion.y * num2;\n const num6 = quaternion.z * num3;\n const num7 = quaternion.x * num2;\n const num8 = quaternion.x * num3;\n const num9 = quaternion.y * num3;\n const num10 = quaternion.w * num;\n const num11 = quaternion.w * num2;\n const num12 = quaternion.w * num3;\n\n return [\n 1 - (num5 + num6), num7 - num12, num8 + num11, 0,\n num7 + num12, 1 - (num4 + num6), num9 - num10, 0,\n num8 - num11, num9 + num10, 1 - (num4 + num5), 0,\n 0, 0, 0, 1,\n ];\n}\n// #endregion module\n","// #region imports\n // #region external\n import {\n computeQuaternionFromEulers,\n // conjugateQuaternion,\n // inverseQuaternion,\n makeRotationMatrixFromQuaternion,\n // quaternionFromAxisAngle,\n quaternionMultiply,\n // rotatePointViaQuaternion,\n } from '../quaternion';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n *\n * @param xAngle\n * @param yAngle\n * @param zAngle\n */\nexport function rotateMatrix(\n xAngle: number, yAngle: number, zAngle: number = 0,\n): number[] {\n const xQuaternion = computeQuaternionFromEulers(0, xAngle, 0);\n const yQuaternion = computeQuaternionFromEulers(0, 0, yAngle);\n const zQuaternion = computeQuaternionFromEulers(zAngle, 0, 0);\n\n const quartenionMultiplication = quaternionMultiply([\n yQuaternion,\n xQuaternion,\n zQuaternion,\n ]);\n const rotationMatrix = makeRotationMatrixFromQuaternion(\n quartenionMultiplication,\n );\n\n // console.log('rotationMatrix', rotationMatrix);\n return rotationMatrix;\n}\n\n\n/**\n *\n * @param x\n * @param y\n * @param z\n */\nexport function translateMatrix(x: number, y: number, z: number): number[] {\n return [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n x, y, z, 1,\n ];\n}\n\n\n/**\n *\n * @param s\n */\nexport function scaleMatrix(s: number): number[] {\n return [\n s, 0, 0, 0,\n 0, s, 0, 0,\n 0, 0, s, 0,\n 0, 0, 0, 1,\n ];\n}\n\n\n/**\n *\n * @param matrixA\n * @param matrixB\n */\nexport function multiplyMatrices(\n matrixA: number[],\n matrixB: number[],\n): number[] {\n // https://github.com/toji/gl-matrix/blob/master/src/gl-matrix/mat4.js#L306-L337\n const result = [] as number[];\n\n const a00 = matrixA[0];\n const a01 = matrixA[1];\n const a02 = matrixA[2];\n const a03 = matrixA[3];\n const a10 = matrixA[4];\n const a11 = matrixA[5];\n const a12 = matrixA[6];\n const a13 = matrixA[7];\n const a20 = matrixA[8];\n const a21 = matrixA[9];\n const a22 = matrixA[10];\n const a23 = matrixA[11];\n const a30 = matrixA[12];\n const a31 = matrixA[13];\n const a32 = matrixA[14];\n const a33 = matrixA[15];\n\n // Cache only the current line of the second matrix\n let b0 = matrixB[0];\n let b1 = matrixB[1];\n let b2 = matrixB[2];\n let b3 = matrixB[3];\n result[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = matrixB[4];\n b1 = matrixB[5];\n b2 = matrixB[6];\n b3 = matrixB[7];\n result[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = matrixB[8];\n b1 = matrixB[9];\n b2 = matrixB[10];\n b3 = matrixB[11];\n result[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = matrixB[12];\n b1 = matrixB[13];\n b2 = matrixB[14];\n b3 = matrixB[15];\n result[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n return result;\n}\n\n\n/**\n *\n * @param matrices\n */\nexport function multiplyArrayOfMatrices(matrices: number[][]): number[] {\n let inputMatrix = matrices[0];\n\n for (let i = 1; i < matrices.length; i++) {\n inputMatrix = multiplyMatrices(inputMatrix, matrices[i]);\n }\n\n return inputMatrix;\n}\n\n// Create the matrix3d style property from a matrix array\nexport function matrixArrayToCSSMatrix(array: number[]): string {\n return 'matrix3d(' + array.join(',') + ')';\n}\n// #endregion module\n","// #region module\nexport type Matrix = number[][];\n\n\n\nexport const multiplyMatrices = (\n m1: Matrix,\n m2: Matrix,\n): Matrix => {\n const result: Matrix = [];\n\n for (let i = 0; i < m1.length; i++) {\n result[i] = [];\n\n for (let j = 0; j < m2[0].length; j++) {\n let sum = 0;\n\n for (let k = 0; k < m1[0].length; k++) {\n sum += m1[i][k] * m2[k][j];\n }\n\n result[i][j] = sum;\n }\n }\n\n return result;\n}\n\n\nexport const arrayToMatrix = (\n array: number[],\n): Matrix => {\n const matrix: Matrix = [];\n\n for (let i = 0; i < array.length; i += 4) {\n const row: number[] = [];\n\n row.push(array[i]);\n row.push(array[i + 1]);\n row.push(array[i + 2]);\n row.push(array[i + 3]);\n\n matrix.push(row);\n }\n\n return matrix;\n}\n\n\nexport const matrixToArray = (\n matrix: Matrix,\n) => {\n return matrix.flat();\n}\n\n\nexport const printMatrix = (\n matrix: Matrix,\n name: string,\n) => {\n const normalize = (\n value: number,\n ) => {\n if (value === 1 || value === 0) {\n return value + ' ';\n }\n\n if (value > 0) {\n return value.toFixed(2) + ' ';\n }\n\n return value.toFixed(2) + ' ';\n }\n\n\n console.log('matrix', name + ':');\n\n for (const row of matrix) {\n console.log(\n normalize(row[0]), normalize(row[1]), normalize(row[2]), normalize(row[3]),\n );\n }\n\n console.log(`matrix3d(${\n matrix.flat().join(',')\n })`);\n\n console.log();\n}\n\n\n\nexport const rotateXMatrix = (\n angle: number,\n): Matrix => {\n const x = Math.cos(angle);\n const y = -1 * Math.sin(angle);\n const z = Math.sin(angle);\n\n const m: Matrix = [\n [1, 0, 0, 0],\n [0, x, y, 0],\n [0, z, x, 0],\n [0, 0, 0, 1],\n ];\n\n return m;\n}\n\n\nexport const rotateYMatrix = (\n angle: number,\n): Matrix => {\n const x = Math.cos(angle);\n const y = -1 * Math.sin(angle);\n const z = Math.sin(angle);\n\n const m: Matrix = [\n [x, 0, z, 0],\n [0, 1, 0, 0],\n [y, 0, x, 0],\n [0, 0, 0, 1],\n ];\n\n return m;\n}\n\n\nexport const rotateZMatrix = (\n angle: number,\n): Matrix => {\n const x = Math.cos(angle);\n const y = -1 * Math.sin(angle);\n const z = Math.sin(angle);\n\n const m = [\n [x, y, 0, 0],\n [z, x, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n\n return m;\n}\n\n\nexport const translateMatrix = (\n x = 0,\n y = 0,\n z = 0,\n): Matrix => {\n const m = [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [x, y, z, 1],\n ];\n\n return m;\n}\n// #endregion module\n","// #region imports\n // #region external\n import {\n multiplyArrayOfMatrices,\n matrixArrayToCSSMatrix,\n rotateMatrix,\n translateMatrix,\n scaleMatrix,\n } from '../../matrix';\n\n // import { radToDeg } from './quaternion';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n * Converts the CSS string matrix3d into an array of numbers.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue('transform').\n * @returns Numbers array.\n */\nexport function getMatrixValues(matrix3d: string): number[] {\n const matrixValues = matrix3d.split('(')[1].split(')')[0].split(',');\n const matrixValuesInt = [] as number[];\n for (let i = 0; i < matrixValues.length; i++) {\n matrixValuesInt[i] = parseFloat(matrixValues[i]);\n }\n return matrixValuesInt;\n}\n\n\n/**\n * Extracts the rotation matrix from the matrix3d CSS string.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue(\"transform\").\n * @returns Rotation matrix.\n */\nexport function getRotationMatrix(matrix3d: string): number[] {\n const valuesMatrix = getMatrixValues(matrix3d);\n const scale = getScalationValue(matrix3d);\n\n if (valuesMatrix.length === 16) {\n for (let i = 0; i < 11; i++) {\n valuesMatrix[i] /= scale;\n }\n } else if (valuesMatrix.length === 6) {\n for (let i = 0; i < 4; i++) {\n valuesMatrix[i] /= scale;\n }\n }\n\n const rotationMatrix = valuesMatrix;\n\n return rotationMatrix;\n}\n\n\n/**\n * Extracts the translation matrix from the matrix3d CSS string.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue(\"transform\").\n * @returns Translation matrix.\n */\nexport function getTranslationMatrix(matrix3d: string): number[] {\n const valuesMatrix = getMatrixValues(matrix3d);\n let translationMatrix: any;\n\n if (valuesMatrix.length === 16) {\n translationMatrix = getMatrixValues(matrix3d).slice(12, 15);\n } else if (valuesMatrix.length === 6) {\n translationMatrix = getMatrixValues(matrix3d).slice(4);\n }\n\n return translationMatrix;\n}\n\n\n/**\n * Extracts the scalation value from the matrix3d CSS string.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue(\"transform\").\n * @returns Scalation value.\n */\nexport function getScalationValue(matrix3d: string): number {\n const valuesMatrix = getMatrixValues(matrix3d);\n let temp = 0;\n let scale: any;\n\n if (valuesMatrix.length === 16) {\n const scaleMatrix = getMatrixValues(matrix3d).slice(0, 4);\n scale = 0;\n\n // for (let i = 0; i < scaleMatrix.length; i++) {\n // scale += parseFloat(scaleMatrix[i]) * parseFloat(scaleMatrix[i]);\n // }\n for (const el of scaleMatrix) {\n scale += parseFloat(el as any) * parseFloat(el as any);\n }\n\n scale = parseFloat(Math.sqrt(scale).toPrecision(4));\n } else if (valuesMatrix.length === 6) {\n temp = valuesMatrix[0] * valuesMatrix[0] + valuesMatrix[1] * valuesMatrix[1];\n scale = parseFloat(Math.sqrt(temp).toPrecision(4));\n }\n\n return scale;\n}\n\n\n\n/**\n * Returns a a matrix3d CSS string.\n *\n * @param rotationMatrix\n * @param translationMatrix\n * @param scalationMatrix\n * @returns matrix3d CSS string.\n */\nexport function setTransform(\n rotationMatrix: number[],\n translationMatrix: number[],\n scalationMatrix: number[],\n): string {\n const transformMatrix = multiplyArrayOfMatrices([\n translationMatrix,\n rotationMatrix,\n scalationMatrix,\n ]);\n\n return matrixArrayToCSSMatrix(transformMatrix);\n}\n\n\n\ninterface RotationValues {\n rotateX: number;\n rotateY: number;\n rotateZ: number;\n}\n\nexport function getTransformRotate(matrix3d: string): RotationValues {\n const pi = Math.PI;\n const values: number[] = getRotationMatrix(matrix3d);\n // console.log('getRotationMatrix', values);\n // console.log(values);\n let rotateX: number = 0;\n let rotateY: number = 0;\n // let thetaX = 0;\n // let thetaY = 0;\n // let thetaZ = 0;\n\n // let theta1 = 0;\n // let theta2 = 0;\n // let phi1 = 0;\n // let phi2 = 0;\n // let phi = 0;\n // let theta = 0;\n // let psi = 0;\n\n\n\n if (values.length === 6) {\n const cosa = values[0];\n const sina = values[1];\n\n if (cosa === 1 && sina === 0) {\n rotateX = Math.asin(sina);\n rotateY = Math.acos(cosa);\n }\n }\n\n if (values.length === 16) {\n // RxRzRy\n // if (values[1] < 1) {\n // if (values[1] > -1) {\n // thetaZ = Math.asin(-1 * values[1]);\n // thetaX = Math.atan2(values[9], values[5]);\n // thetaY = Math.atan2(values[2], values[0]);\n // } else {\n // thetaZ = Math.PI / 2;\n // thetaX = -1 * Math.atan2(-1 * values[8], values[10]);\n // thetaY = 0;\n // }\n // } else {\n // thetaZ = -1 * Math.PI / 2;\n // thetaX = -1 * Math.atan2(-1 * values[8], values[10]);\n // thetaY = 0;\n // }\n\n // thetaZ = Math.asin(-1 * values[1]);\n // thetaX = Math.atan2(values[9], values[5]);\n // thetaY = Math.atan2(values[2], values[0]);\n\n\n // console.log('thetaX', thetaX);\n // console.log('thetaY', thetaY);\n // console.log('thetaZ', thetaZ);\n\n // const cosaX1 = values[5];\n // const sinaX3 = values[9];\n // // 0-180\n // if (sinaX3 <= 0) {\n // rotateX = Math.acos(cosaX1);\n // }\n // // // 181-360\n // if (sinaX3 > 0) {\n // rotateX = 2 * pi - Math.acos(cosaX1);\n // }\n // const cosaY1 = values[0];\n // const sinaY2 = values[2];\n // if (sinaY2 <= 0) {\n // rotateY = Math.acos(cosaY1);\n // }\n // if (sinaY2 > 0) {\n // rotateY = 2 * pi - Math.acos(cosaY1);\n // }\n const cosaX1 = values[5];\n const sinaX3 = values[9];\n // 0-180\n if (sinaX3 <= 0) {\n rotateX = Math.acos(cosaX1);\n }\n // // 181-360\n if (sinaX3 > 0) {\n rotateX = 2 * pi - Math.acos(cosaX1);\n }\n const cosaY1 = values[0];\n const sinaY2 = values[2];\n if (sinaY2 <= 0) {\n rotateY = Math.acos(cosaY1);\n }\n if (sinaY2 > 0) {\n rotateY = 2 * pi - Math.acos(cosaY1);\n }\n\n rotateX = Math.atan2(values[9], values[5]);\n rotateY = Math.atan2(values[2], values[0]);\n }\n\n // return {\n // rotateX: thetaX,\n // rotateY: thetaY,\n // rotateZ: thetaZ,\n // };\n\n return {\n rotateX,\n rotateY,\n rotateZ: 0,\n };\n}\n\n\ninterface TranslationValues {\n translateX: number;\n translateY: number;\n translateZ: number;\n}\n\nexport function getTransformTranslate(matrix3d: string): TranslationValues {\n const values: number[] = getTranslationMatrix(matrix3d);\n const translateX = values[0];\n const translateY = values[1];\n const translateZ = values[2];\n\n return {\n translateX,\n translateY,\n translateZ,\n };\n}\n\ninterface ScalationValue {\n scale: number;\n}\n\nexport function getTransformScale(matrix3d: string): ScalationValue {\n const scale = getScalationValue(matrix3d);\n return {\n scale,\n };\n}\n\n\n// let rotateX = 0;\n// let rotateY = 0;\n\n\nexport function rotatePlurid(\n matrix3d: string,\n direction: string = '',\n angleIncrement: number = 0.07,\n): string {\n const transformRotate = getTransformRotate(matrix3d);\n const rotateX = transformRotate.rotateX;\n let rotateY = transformRotate.rotateY;\n const rotateZ = transformRotate.rotateZ;\n // console.log('ROTATE', radToDeg(rotateX), radToDeg(rotateY));\n\n const transformTranslate = getTransformTranslate(matrix3d);\n const translateX = transformTranslate.translateX;\n const translateY = transformTranslate.translateY;\n const translateZ = transformTranslate.translateZ;\n\n const scale = getTransformScale(matrix3d).scale;\n\n let valRotationMatrix = rotateMatrix(rotateX, rotateY, rotateZ);\n const valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n const valScalationMatrix = scaleMatrix(scale);\n\n // if (scale < 0.5) {\n // angleIncrement = 0.08;\n // } else {\n // angleIncrement = 0.03;\n // }\n\n if (direction === 'left') {\n rotateY -= angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n if (direction === 'right') {\n rotateY += angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n if (direction === 'up') {\n rotateY -= angleIncrement;\n // rotateX += angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n if (direction === 'down') {\n rotateY += angleIncrement;\n // rotateX -= angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n const transformedMatrix3d = setTransform(\n valRotationMatrix,\n valTranslationMatrix,\n valScalationMatrix,\n );\n return transformedMatrix3d;\n}\n\n\nexport function translatePlurid(\n matrix3d: string,\n direction: string = '',\n linearIncrement: number = 50,\n): string {\n const transformRotate = getTransformRotate(matrix3d);\n const rotateX = transformRotate.rotateX;\n const rotateY = transformRotate.rotateY;\n const rotateZ = transformRotate.rotateZ;\n\n const transformTranslate = getTransformTranslate(matrix3d);\n let translateX = transformTranslate.translateX;\n let translateY = transformTranslate.translateY;\n const translateZ = transformTranslate.translateZ;\n\n const scale = getTransformScale(matrix3d).scale;\n\n const valRotationMatrix = rotateMatrix(rotateX, rotateY, rotateZ);\n let valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n const valScalationMatrix = scaleMatrix(scale);\n\n scale < 0.5 ? linearIncrement = 50 : linearIncrement = 30;\n\n if (direction === 'left') {\n translateX += linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n if (direction === 'right') {\n translateX -= linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n if (direction === 'up') {\n translateY += linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n if (direction === 'down') {\n translateY -= linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n const transformedMatrix3d = setTransform(\n valRotationMatrix,\n valTranslationMatrix,\n valScalationMatrix,\n );\n return transformedMatrix3d;\n}\n\n\nexport function scalePlurid(\n matrix3d: string,\n direction: string = '',\n scaleIncrement: number = 0.05,\n): string {\n const transformRotate = getTransformRotate(matrix3d);\n const rotateX = transformRotate.rotateX;\n const rotateY = transformRotate.rotateY;\n const rotateZ = transformRotate.rotateZ;\n\n const transformTranslate = getTransformTranslate(matrix3d);\n const translateX = transformTranslate.translateX;\n const translateY = transformTranslate.translateY;\n const translateZ = transformTranslate.translateZ;\n\n let scale = getTransformScale(matrix3d).scale;\n\n const valRotationMatrix = rotateMatrix(rotateX, rotateY, rotateZ);\n const valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n let valScalationMatrix = scaleMatrix(scale);\n\n if (direction === 'up') {\n scale -= scaleIncrement;\n if (scale < 0.1) { scale = 0.1; }\n valScalationMatrix = scaleMatrix(scale);\n }\n\n if (direction === 'down') {\n scale += scaleIncrement;\n if (scale > 4) { scale = 4; }\n valScalationMatrix = scaleMatrix(scale);\n }\n\n const transformedMatrix3d = setTransform(\n valRotationMatrix,\n valTranslationMatrix,\n valScalationMatrix,\n );\n return transformedMatrix3d;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n internationalization,\n InternationalizationLanguageType,\n InternationalizationFieldType,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst internatiolate = (\n lamguage: InternationalizationLanguageType,\n field: InternationalizationFieldType,\n) => {\n return internationalization[lamguage][field];\n}\n// #endregion module\n\n\n\n// #region exports\nexport default internatiolate;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n uuid,\n } from '@plurid/plurid-functions';\n\n import {\n PluridPlane,\n PluridPlaneObject,\n PluridRoutePlane,\n PluridRoutePlaneObject,\n\n PluridInternalStatePlane,\n PluridInternalContextPlane,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const resolvePluridPlaneData = <C>(\n plane: PluridPlane<C>,\n): PluridPlaneObject<C> => {\n if (\n Array.isArray(plane)\n ) {\n const [\n route,\n component,\n options,\n ] = plane;\n\n return {\n route,\n component,\n ...options,\n };\n }\n\n return plane;\n}\n\n\nexport const resolvePluridRoutePlaneData = <C>(\n plane: PluridRoutePlane<C>,\n): PluridRoutePlaneObject<C> => {\n if (\n Array.isArray(plane)\n ) {\n const [\n value,\n component,\n options,\n ] = plane;\n\n return {\n value,\n component,\n ...options,\n };\n }\n\n return plane;\n}\n\n\nexport const createInternalStatePlane = <C>(\n plane: PluridPlane<C>,\n): PluridInternalStatePlane => {\n const planeData = resolvePluridPlaneData(plane);\n\n const statePlane: PluridInternalStatePlane = {\n // id: plane.id || uuid.generate(),\n id: uuid.generate(),\n path: planeData.route,\n // root: page.root || false,\n // ordinal: page.ordinal || 0,\n };\n\n return statePlane;\n}\n\n\nexport const createInternalContextPlane = <C>(\n plane: PluridPlane<C>,\n): PluridInternalContextPlane<C> => {\n const planeData = resolvePluridPlaneData(plane);\n\n const {\n // id,\n route,\n component,\n } = planeData;\n\n const contextPlane: PluridInternalContextPlane<C> = {\n id: uuid.generate(),\n // id: id || uuid.generate(),\n path: route,\n component,\n };\n\n return contextPlane;\n}\n\n\nexport const getPluridPlaneIDByData = (\n element: HTMLElement | null,\n): string => {\n if (!element) {\n return '';\n }\n\n const parent = element.parentElement;\n if (parent && parent.dataset.pluridPlane) {\n return parent.dataset.pluridPlane;\n }\n\n return getPluridPlaneIDByData(parent);\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridRoute,\n PluridRoutePlane,\n PluridPlane,\n\n IsoMatcherContext,\n IsoMatcherData,\n IsoMatcherIndexedRoute,\n IsoMatcherIndexedPlane,\n IsoMatcherPlaneType,\n IsoMatcherPlaneResult,\n IsoMatcherPlaneResultPlane,\n IsoMatcherPlaneResultRoutePlane,\n IsoMatcherResult,\n IsoMatcherRouteResult,\n\n protocols,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n resolvePluridPlaneData,\n resolvePluridRoutePlaneData,\n } from '~modules/planes/logic';\n\n import {\n computePlaneAddress,\n\n checkValidPath,\n\n cleanPathValue,\n } from '../logic';\n\n import {\n extractParametersAndMatch,\n extractQuery,\n extractFragments,\n // extractPathname,\n } from '../Parser/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n * The `IsoMatcher` gathers all the known information about `routes` and `planes`\n * and matches client-side or server-side, in-browser or in-plurid.\n */\nclass IsoMatcher<C> {\n private origin: string;\n\n private routesIndex: Map<string, IsoMatcherIndexedRoute<C>> = new Map();\n private planesIndex: Map<string, IsoMatcherIndexedPlane<C>> = new Map();\n\n private routesKeys: string[] = [];\n private planesKeys: string[] = [];\n\n\n constructor(\n data: IsoMatcherData<C>,\n origin: string = 'origin',\n ) {\n if (origin === 'origin' && typeof location !== 'undefined') {\n this.origin = location.host;\n } else {\n this.origin = origin;\n }\n\n this.updateIndexes(\n data.routes || [],\n data.routePlanes || [],\n data.planes || [],\n );\n // console.log('this.routesIndex', this.routesIndex);\n // console.log('this.planesIndex', this.planesIndex);\n }\n\n\n /**\n * Matches a `path` with a known `route` or `plane`,\n * based on the strategy imposed by the `context`.\n *\n * @param path\n * @param context\n */\n public match(path: string, context: 'route'): IsoMatcherRouteResult<C> | undefined;\n public match(path: string): IsoMatcherPlaneResult<C> | undefined;\n public match(path: string, context: 'plane'): IsoMatcherPlaneResult<C> | undefined;\n public match(\n path: string,\n context: IsoMatcherContext = 'plane',\n ): IsoMatcherResult<C> | undefined {\n switch (context) {\n case 'plane':\n return this.matchPlane(path);\n case 'route':\n return this.matchRoute(path);\n }\n }\n\n /**\n * Dynammically update the planes and routes indexes.\n *\n * @param data\n */\n public index(\n data: IsoMatcherData<C>,\n ) {\n this.updateIndexes(\n data.routes || [],\n data.routePlanes || [],\n data.planes || [],\n );\n // console.log('this.routesIndex index', this.routesIndex);\n // console.log('this.planesIndex index', this.planesIndex);\n }\n\n /**\n * Clear all data.\n *\n */\n public clear() {\n this.routesIndex = new Map();\n this.planesIndex = new Map();\n this.routesKeys = [];\n this.planesKeys = [];\n }\n\n public getPlanesIndex() {\n return this.planesIndex;\n }\n\n\n /**\n * Creates a common data structure able to match and route accordingly.\n *\n */\n private updateIndexes(\n routes: PluridRoute<C>[],\n routePlanes: PluridRoutePlane<C>[],\n planes: PluridPlane<C>[],\n ) {\n this.indexPlanes(\n planes,\n 'Plane',\n );\n\n this.indexPlanes(\n routePlanes,\n 'RoutePlane',\n );\n\n for (const route of routes) {\n if (route.planes) {\n this.indexPlanes(\n route.planes,\n 'RoutePlane',\n route.value,\n );\n }\n\n this.routesIndex.set(\n route.value,\n {\n data: {\n ...route,\n },\n },\n );\n }\n\n this.routesKeys = Array.from(this.routesIndex.keys());\n this.planesKeys = Array.from(this.planesIndex.keys());\n }\n\n private indexPlanes(\n planes: PluridPlane<C>[] | PluridRoutePlane<C>[],\n kind: IsoMatcherPlaneType,\n parent?: string,\n ) {\n for (const plane of planes) {\n const planeData = kind === 'Plane'\n ? resolvePluridPlaneData(plane as PluridPlane<C>)\n : resolvePluridRoutePlaneData(plane as PluridRoutePlane<C>);\n\n const address = computePlaneAddress(\n kind === 'Plane'\n ? (planeData as any).route\n : (planeData as any).value,\n parent,\n this.origin,\n );\n\n const indexedPlane: any /** IsoMatcherIndexedPlane<C> */ = {\n kind,\n data: {\n ...planeData,\n },\n };\n if (parent) {\n indexedPlane['parent'] = parent;\n }\n\n this.planesIndex.set(\n address,\n indexedPlane,\n );\n }\n }\n\n\n private matchPlane(\n value: string,\n ) {\n const planeAddress = computePlaneAddress(\n value,\n undefined,\n this.origin,\n );\n\n const plane = this.planesIndex.get(planeAddress);\n\n if (plane) {\n const query = extractQuery(\n value,\n );\n const fragments = extractFragments(\n value,\n );\n\n const match = {\n value: planeAddress,\n fragments,\n query,\n parameters: {},\n };\n\n if (plane.kind === 'Plane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultPlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n return result;\n }\n\n if (plane.kind === 'RoutePlane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultRoutePlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n return result;\n }\n }\n\n\n for (const planePath of this.planesKeys) {\n const normalizedPlanePath = planePath.replace(protocols.plurid, '');\n const normalizedPlaneAddress = planeAddress.replace(protocols.plurid, '');\n\n const planePathSplit = normalizedPlanePath.split('/');\n const planeAddressSplit = normalizedPlaneAddress.split('/');\n\n // Not the same origin.\n if (planePathSplit[0] !== planeAddressSplit[0]) {\n continue;\n }\n\n // Length mismatch.\n if (planePathSplit.length !== planeAddressSplit.length) {\n continue;\n }\n\n // Check if the plane `address` is a parametrization of `planePath`.\n const parametersAndMatch = extractParametersAndMatch(\n normalizedPlaneAddress,\n normalizedPlanePath,\n );\n\n // console.log('normalizedPlaneAddress', normalizedPlaneAddress);\n // console.log('normalizedPlanePath', normalizedPlanePath);\n // console.log('parametersAndMatch', parametersAndMatch);\n if (parametersAndMatch.match) {\n const plane = this.planesIndex.get(planePath);\n if (!plane) {\n return;\n }\n\n const {\n parameters,\n } = parametersAndMatch;\n\n const validPath = checkValidPath(\n plane.data.parameters,\n parameters,\n );\n if (!validPath) {\n return;\n }\n\n const query = extractQuery(\n value,\n );\n const fragments = extractFragments(\n value,\n );\n\n const match = {\n value: planeAddress,\n fragments,\n query,\n parameters,\n };\n\n if (plane.kind === 'Plane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultPlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n\n return result;\n }\n\n if (plane.kind === 'RoutePlane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultRoutePlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n\n return result;\n }\n }\n }\n\n\n return;\n }\n\n private matchRoute(\n value: string,\n ) {\n const routeValue = cleanPathValue(value);\n const route = this.routesIndex.get(routeValue);\n\n if (route) {\n const query = extractQuery(\n value,\n );\n\n const result: IsoMatcherRouteResult<C> = {\n kind: 'Route',\n data: route.data,\n match: {\n // value: extractPathname(value),\n value: routeValue,\n query,\n parameters: {},\n },\n };\n\n return result;\n }\n\n\n for (const routePath of this.routesKeys) {\n // Check if the `value` is a parametrization of `routePath`.\n const routeSplit = routePath.split('/');\n const valueSplit = routeValue.split('/');\n\n // Length mismatch.\n if (routeSplit.length !== valueSplit.length) {\n continue;\n }\n\n const parametersAndMatch = extractParametersAndMatch(\n routeValue.slice(1),\n routePath.slice(1),\n );\n\n // console.log('value', value);\n // console.log('routePath', routePath);\n // console.log('parametersAndMatch', parametersAndMatch);\n if (parametersAndMatch.match) {\n const route = this.routesIndex.get(routePath);\n // console.log('route', route);\n if (!route) {\n return;\n }\n\n const {\n parameters,\n } = parametersAndMatch;\n\n const validPath = checkValidPath(\n route.data.parameters,\n parameters,\n );\n // console.log('validPath', validPath);\n if (!validPath) {\n return;\n }\n\n const query = extractQuery(\n routeValue,\n );\n\n const match = {\n // value: extractPathname(value),\n value: routeValue,\n query,\n parameters,\n };\n\n if (route) {\n const result: IsoMatcherRouteResult<C> = {\n kind: 'Route',\n data: route.data,\n match,\n };\n // console.log('route result', result);\n\n return result;\n }\n }\n }\n\n\n const routePlane = this.matchPlane(routeValue);\n // console.log('routePlane', value, this.planesIndex, routePlane);\n\n if (routePlane) {\n const result: IsoMatcherRouteResult<C> = {\n kind: 'RoutePlane',\n data: routePlane.data as any, // HACK\n match: {\n // value: extractPathname(value),\n value: routeValue,\n query: routePlane.match.query,\n parameters: routePlane.match.parameters,\n },\n };\n\n return result;\n }\n\n\n return;\n }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default IsoMatcher;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridRoute,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n // import {\n // Route,\n // } from '../Router/interfaces';\n // #endregion external\n\n\n // #region internal\n import {\n ParserOptions,\n ParserPartialOptions,\n ParserResponse,\n } from './interfaces';\n\n import {\n extractPathname,\n extractParametersAndMatch,\n extractQuery,\n extractFragments,\n } from './logic';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nexport default class Parser<C> {\n /** properties */\n private location: string;\n private path: PluridRoute<C>;\n private options: ParserOptions;\n\n\n /** constructor */\n constructor(\n location: string,\n path: PluridRoute<C>,\n options?: ParserPartialOptions,\n ) {\n this.location = location;\n this.path = path;\n this.options = this.handleOptions(options);\n }\n\n\n /** private */\n private handleOptions(\n options: ParserPartialOptions | undefined,\n ) {\n const parserOptions: ParserOptions = {\n fragment: options?.fragment || true,\n };\n\n return parserOptions;\n }\n\n private extractPathname() {\n const pathname = extractPathname(\n this.location,\n );\n return pathname;\n }\n\n private extractParametersAndMatch() {\n const parametersAndMatch = extractParametersAndMatch(\n this.location,\n this.path.value,\n );\n\n return parametersAndMatch;\n }\n\n private extractQuery() {\n const query = extractQuery(\n this.location,\n );\n return query;\n }\n\n private extractFragments() {\n const fragments = this.options.fragment\n ? extractFragments(this.location)\n : extractFragments();\n return fragments;\n }\n\n\n /** public */\n /**\n * Extract pathname, parameters, query, and fragment, if available.\n */\n public extract() {\n const pathname = this.extractPathname();\n const {\n match,\n parameters,\n elements,\n } = this.extractParametersAndMatch();\n const query = this.extractQuery();\n const queryData = Object\n .entries(query)\n .map(([key, value]) => {\n return key + '=' + value;\n }).join('&');\n const queryString = queryData\n ? '?' + queryData\n : '';\n const fragments = this.extractFragments();\n\n const parserResponse: ParserResponse<C> = {\n path: this.path,\n pathname,\n elements,\n match,\n parameters,\n query,\n fragments,\n route: pathname + queryString,\n };\n\n return parserResponse;\n }\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridPlane,\n RegisteredPluridPlane,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n IsoMatcher,\n } from '~modules/routing';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n * The planes registrar can be stored in-memory (server-side)\n * or on the `window.__pluridPlanesRegistrar__` object (browser-side).\n */\nclass PluridPlanesRegistrar<C> implements IPluridPlanesRegistrar<C> {\n private isoMatcher: IsoMatcher<C>;\n\n\n constructor(\n planes?: PluridPlane<C>[],\n ) {\n this.isoMatcher = new IsoMatcher({\n planes,\n });\n }\n\n\n public register(\n planes: PluridPlane<C>[],\n ) {\n this.isoMatcher.index({\n planes,\n });\n }\n\n public identify() {\n const planes = this.isoMatcher.getPlanesIndex();\n return [...planes.keys()];\n }\n\n public get(\n route: string,\n ) {\n const match = this.isoMatcher.match(route);\n\n if (match) {\n const absoluteRoute = match.kind === 'Plane'\n ? match.data.route\n : match.data.value;\n\n const registeredPlane: RegisteredPluridPlane<C> = {\n route: {\n absolute: absoluteRoute,\n fragments: match.match.fragments,\n parameters: match.match.parameters,\n query: match.match.query,\n },\n component: match.data.component,\n };\n\n return registeredPlane;\n }\n\n return;\n }\n\n public getAll() {\n const planes = this.isoMatcher.getPlanesIndex();\n const all = new Map();\n\n for (const [path, plane] of planes) {\n const absoluteRoute = plane.kind === 'Plane'\n ? plane.data.route\n : plane.data.value;\n\n const registeredPlane: RegisteredPluridPlane<C> = {\n route: {\n absolute: absoluteRoute,\n fragments: {\n elements: [],\n texts: [],\n },\n parameters: {},\n query: {},\n },\n component: plane.data.component,\n };\n\n all.set(\n path,\n registeredPlane,\n );\n }\n\n return all;\n }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default PluridPlanesRegistrar;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridPlane,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n\n PluridalWindow,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region internal\n import PluridPlanesRegistrar from './object';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nconst registerPlanes = <C>(\n planes?: PluridPlane<C>[],\n planesRegistrar?: IPluridPlanesRegistrar<C>,\n) => {\n if (!planes) {\n return;\n }\n\n if (planesRegistrar) {\n planesRegistrar.register(planes);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n if (typeof (window as PluridalWindow<C>).__pluridPlanesRegistrar__ === 'undefined') {\n const pluridPlanesRegistrar = new PluridPlanesRegistrar<C>();\n (window as PluridalWindow<C>).__pluridPlanesRegistrar__ = pluridPlanesRegistrar;\n (window as PluridalWindow<C>).__pluridPlanesRegistrar__.register(planes);\n return;\n }\n\n (window as PluridalWindow<C>).__pluridPlanesRegistrar__.register(planes);\n\n return;\n}\n\n\nconst getPlanesRegistrar = <C>(\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n) => {\n if (planesRegistrar) {\n return planesRegistrar;\n }\n\n if (typeof window !== 'undefined') {\n if ((window as PluridalWindow<C>).__pluridPlanesRegistrar__ !== undefined) {\n return (window as PluridalWindow<C>).__pluridPlanesRegistrar__;\n }\n }\n\n return;\n}\n\n\nconst getRegisteredPlanes = <C>(\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n) => {\n if (planesRegistrar) {\n return planesRegistrar.getAll();\n }\n\n if (typeof window !== 'undefined') {\n if ((window as PluridalWindow<C>).__pluridPlanesRegistrar__ !== undefined) {\n return (window as PluridalWindow<C>).__pluridPlanesRegistrar__.getAll();\n }\n }\n\n return new Map();\n}\n\n\nconst getRegisteredPlane = <C>(\n route: string,\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n) => {\n if (planesRegistrar) {\n return planesRegistrar.get(route);\n }\n\n if (typeof window !== 'undefined') {\n if ((window as PluridalWindow<C>).__pluridPlanesRegistrar__ !== undefined) {\n return (window as PluridalWindow<C>).__pluridPlanesRegistrar__.get(route);\n }\n }\n\n return;\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n registerPlanes,\n getPlanesRegistrar,\n getRegisteredPlanes,\n getRegisteredPlane,\n};\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n /** interfaces */\n TreePlane,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const computeSpaceSize = (\n tree: TreePlane[],\n) => {\n let width = 0;\n let height = 0;\n let depth = 0;\n const topCorner = {\n x: 0,\n y: 0,\n z: 0,\n };\n\n // console.log('tree', tree);\n tree.map(treePage => {\n // console.log('treePage', treePage);\n\n const spaceWidth = treePage.location.translateX + treePage.width;\n // console.log('spaceWidth', spaceWidth);\n if (spaceWidth > width) {\n width = spaceWidth;\n }\n\n const spaceHeight = treePage.location.translateY + treePage.height;\n // console.log('spaceHeight', spaceHeight);\n if (spaceHeight > height) {\n height = spaceHeight;\n }\n\n const spaceDepth = treePage.location.translateZ;\n // console.log('spaceDepth', spaceDepth);\n if (spaceDepth > depth) {\n depth = spaceDepth;\n }\n });\n\n // console.log('-------------');\n\n return {\n width,\n height,\n depth,\n topCorner,\n };\n}\n\n\nexport const findPage = (\n view: string,\n pages: TreePlane[],\n) => {\n for (const page of pages) {\n if (page.route === view) {\n return page;\n }\n }\n\n return;\n}\n\n\nexport const splitIntoGroups = <T>(\n data: T[],\n length: number,\n): T[][] => {\n const initialArray = [...data];\n const groups: any[] = [];\n\n while (initialArray.length) {\n const group = initialArray.splice(0, length);\n groups.push(group);\n }\n\n return groups;\n}\n\n\nexport const getTreePlaneByPlaneID = (\n tree: TreePlane[],\n planeID: string\n): TreePlane | null => {\n let _page = null;\n\n for (const page of tree) {\n if (page.planeID === planeID) {\n _page = page;\n }\n\n if (page.children && !_page) {\n _page = getTreePlaneByPlaneID(page.children, planeID);\n }\n\n if (_page) {\n break;\n }\n }\n\n return _page;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n /** constants */\n ROOTS_GAP,\n\n /** interfaces */\n PluridPlane,\n PluridConfiguration,\n TreePlane,\n SpaceLocation,\n LocationCoordinates,\n LinkCoordinates,\n TopPlanePoint,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n resolvePluridPlaneData,\n } from '~modules/planes';\n\n import {\n getTreePlaneByPlaneID,\n } from '../utilities';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst toRadians = mathematics.geometry.toRadians;\n\n\nexport const computePath = (\n tree: TreePlane[],\n planeID: string,\n): TreePlane[] => {\n const path: TreePlane[] = [];\n const page = getTreePlaneByPlaneID(tree, planeID);\n\n if (page) {\n path.push( { ...page} );\n\n let parentID = page.parentPlaneID;\n if (!parentID) {\n return path;\n }\n\n while (parentID) {\n const parentPage = getTreePlaneByPlaneID(tree, parentID);\n if (parentPage) {\n const page = { ...parentPage };\n page.children = [];\n path.push(page);\n parentID = parentPage.parentPlaneID;\n }\n }\n }\n\n return path.reverse();\n}\n\n\nexport const computePluridPlaneLocation = (\n linkCoordinates: LinkCoordinates,\n treePageParent: TreePlane,\n bridgeLength: number = 100,\n linkPlaneAngle: number = 90,\n): LocationCoordinates => {\n /** Compute the coordinates of the link. */\n const parentAngleRadians = toRadians(treePageParent.location.rotateY);\n const linkPoint: TopPlanePoint = {\n x: treePageParent.location.translateX + linkCoordinates.x * Math.cos(parentAngleRadians),\n z: treePageParent.location.translateZ - linkCoordinates.x * Math.sin(parentAngleRadians),\n };\n\n /** Compute the coordinates of the plane. */\n const linkAngleRadians = toRadians(linkPlaneAngle + treePageParent.location.rotateY);\n const x = linkPoint.x + bridgeLength * Math.cos(linkAngleRadians);\n const z = linkPoint.z - bridgeLength * Math.sin(linkAngleRadians);\n\n const y = treePageParent.location.translateY + linkCoordinates.y;\n\n const locationCoordinates: LocationCoordinates = {\n x,\n y,\n z,\n };\n\n return locationCoordinates;\n}\n\n\nexport const recomputeChildrenLocation = (\n page: TreePlane,\n): TreePlane[] => {\n if (!page.children) {\n return [];\n }\n\n const updatedChildren: TreePlane[] = [];\n\n for (const child of page.children) {\n if (child.linkCoordinates) {\n const location = computePluridPlaneLocation(\n child.linkCoordinates,\n page,\n child.bridgeLength,\n child.planeAngle,\n );\n\n const updatedChild = {\n ...child,\n location: {\n ...child.location,\n translateX: location.x,\n translateY: location.y,\n translateZ: location.z,\n },\n };\n\n const children = updatedChild.children\n ? recomputeChildrenLocation(updatedChild)\n : [];\n\n const updatedChildWithChildren = {\n ...updatedChild,\n children,\n };\n\n updatedChildren.push(updatedChildWithChildren);\n }\n }\n\n return updatedChildren;\n}\n\n\n\n\n\n\n/**\n * Compute translateX based on configuration layout if it exists\n * or based on the index of the root.\n *\n * @param configuration\n * @param root\n * @param index\n */\nexport const computeRootLocationX = <C>(\n configuration: PluridConfiguration | undefined,\n root: PluridPlane<C>,\n index: number,\n) => {\n const rootData = resolvePluridPlaneData(root);\n\n let translateX = 0;\n if (configuration && configuration.space) {\n if (Array.isArray(configuration.space.layout)) {\n const layoutIndex = configuration.space.layout.indexOf(rootData.route);\n translateX = window.innerWidth * layoutIndex + ROOTS_GAP * layoutIndex;\n }\n } else {\n translateX = index === 0\n ? 0\n : window.innerWidth * index + ROOTS_GAP * index;\n }\n\n return translateX;\n}\n\n\nexport const computeSpaceLocation = (\n configuration: PluridConfiguration,\n): SpaceLocation => {\n // if (configuration.space && configuration.space.layout) {\n // const {\n // layout,\n // } = configuration.space;\n\n // }\n\n const cameraLocationX = computeCameraLocationX(configuration);\n const spaceLocation = {\n rotationX: 0,\n rotationY: 0,\n translationX: cameraLocationX,\n translationY: 0,\n translationZ: 0,\n scale: 1,\n };\n\n return spaceLocation;\n}\n\n\n/**\n * Based on the specified camera, compute the X translation\n *\n * @param configuration\n */\nexport const computeCameraLocationX = (\n configuration: PluridConfiguration,\n) => {\n let translateX = 0;\n\n if (configuration.space\n && Array.isArray(configuration.space.layout)\n && typeof configuration.space.camera === 'string'\n ) {\n const layoutIndex = configuration.space.layout.indexOf(configuration.space.camera || '');\n translateX = window.innerWidth * layoutIndex + ROOTS_GAP * layoutIndex;\n }\n\n // account for camera space inversion\n return -1 * translateX;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridConfiguration,\n TreePlane,\n\n ROOTS_GAP,\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst computeColumnLayout = (\n roots: TreePlane[],\n columns: number = 1,\n columnLength?: number,\n gap: number = ROOTS_GAP,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n const configurationWidth = configuration.elements.plane.width;\n const width = mathematics.numbers.checkIntegerNonUnit(configurationWidth)\n ? configurationWidth\n : configurationWidth * windowInnerWidth;\n const height = windowInnerHeight;\n const gapValue = mathematics.numbers.checkIntegerNonUnit(gap)\n ? gap\n : gap * width;\n\n const length = columnLength || Math.ceil(roots.length / columns);\n\n for (const [index, root] of roots.entries()) {\n const rowIndex = index % length;\n const columnIndex = Math.floor(index / length);\n\n const translateX = columnIndex * (width + gapValue);\n const translateY = rowIndex * (height + gapValue);\n\n const treePage: TreePlane = {\n ...root,\n location: {\n translateX,\n translateY,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n };\n\n tree.push(treePageWithChildren);\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeColumnLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridConfiguration,\n TreePlane,\n\n ROOTS_GAP,\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst computeRowLayout = (\n roots: TreePlane[],\n rows: number = 1,\n rowLength?: number,\n gap: number = ROOTS_GAP,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n const configurationWidth = configuration.elements.plane.width;\n const width = mathematics.numbers.checkIntegerNonUnit(configurationWidth)\n ? configurationWidth\n : configurationWidth * windowInnerWidth;\n const height = windowInnerHeight;\n const gapValue = mathematics.numbers.checkIntegerNonUnit(gap)\n ? gap\n : gap * width;\n\n const length = rowLength || Math.ceil(roots.length / rows);\n\n for (const [index, root] of roots.entries()) {\n const rowIndex = Math.floor(index / length);\n const columnIndex = index % length;\n\n const translateX = columnIndex * (width + gapValue);\n const translateY = rowIndex * (height + gapValue);\n\n const treePage: TreePlane = {\n ...root,\n location: {\n translateX,\n translateY,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n };\n\n tree.push(treePageWithChildren);\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeRowLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n PluridConfiguration,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n splitIntoGroups,\n } from '../utilities';\n\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst toRadians = mathematics.geometry.toRadians;\n\n\nconst computeFaceToFaceTranslateZ = (\n width: number,\n angle: number,\n first: boolean,\n) => {\n if (first) {\n return width * Math.sin(toRadians(angle));\n }\n\n return 0;\n}\n\nconst computeFaceToFaceTranslateX = (\n width: number,\n angle: number,\n gap: number,\n first: boolean,\n index: number,\n) => {\n const firstTranslateX = width * Math.cos(toRadians(angle));\n if (first) {\n return firstTranslateX;\n }\n\n const value = width * (index - 1)\n + 2 * firstTranslateX\n + gap * index;\n return value;\n}\n\nconst computeFaceToFaceRotateY = (\n angle: number,\n first: boolean,\n last: boolean,\n) => {\n const rotateY = first\n ? angle\n : last\n ? -angle\n : 0;\n\n return rotateY;\n}\n\n\nconst computeFaceToFaceLayout = (\n roots: TreePlane[],\n angle: number = 45,\n gap: number = 0,\n middle: number = 0,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n const width = mathematics.numbers.checkIntegerNonUnit(configuration.elements.plane.width)\n ? configuration.elements.plane.width\n : configuration.elements.plane.width * windowInnerWidth;\n const height = windowInnerHeight;\n const planeAngle = 90 - angle / 2;\n const columns = 2 + middle;\n const rows = splitIntoGroups(roots, columns);\n\n const gapValue = Number.isInteger(gap)\n ? gap\n : gap * width;\n\n for (const [index, row] of rows.entries()) {\n const translateY = index * height;\n\n for (const [index, page] of row.entries()) {\n const first = index === 0;\n const last = index === columns - 1;\n\n const translateZ = computeFaceToFaceTranslateZ(\n width,\n planeAngle,\n first,\n );\n const translateX = computeFaceToFaceTranslateX(\n width,\n planeAngle,\n gapValue,\n first,\n index\n );\n const rotateY = computeFaceToFaceRotateY(\n planeAngle,\n first,\n last,\n );\n\n const treePage: TreePlane = {\n ...page,\n location: {\n translateX,\n translateY,\n translateZ,\n rotateX: 0,\n rotateY,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n }\n\n tree.push(treePageWithChildren);\n }\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeFaceToFaceLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n PluridConfiguration,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst computeSheavesLayout = (\n roots: TreePlane[],\n depth: number = 0.3,\n offsetX: number = 0,\n offsetY: number = 0,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n\n const width = mathematics.numbers.checkIntegerNonUnit(configuration.elements.plane.width)\n ? configuration.elements.plane.width\n : configuration.elements.plane.width * windowInnerWidth;\n const height = windowInnerHeight;\n\n for (const [index, page] of roots.entries()) {\n const translateX = 0;\n const translateY = 0;\n\n const treePage: TreePlane = {\n ...page,\n location: {\n translateX,\n translateY,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n }\n\n tree.push(treePageWithChildren);\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeSheavesLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n PluridConfiguration,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n\n\n // #region internal\n import computeColumnLayout from './column';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nconst computeZigZagLayout = (\n pages: TreePlane[],\n angle: number = 45,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n\n const singleColumnedRoots = computeColumnLayout(pages, 1);\n\n for (const [index, page] of singleColumnedRoots.entries()) {\n const value = index % 2 === 0\n ? 1\n : -1;\n page.location.rotateY = value * angle;\n\n const children = recomputeChildrenLocation(page);\n\n const treePageWithChildren = {\n ...page,\n children,\n }\n\n tree.push(\n {...treePageWithChildren}\n );\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region external\nexport default computeZigZagLayout;\n// #endregion external\n","// #region imports\n // #region libraries\n import {\n /** constants */\n PLANE_DEFAULT_ANGLE,\n PLURID_ROUTE_SEPARATOR,\n\n /** enumerations */\n LAYOUT_TYPES,\n\n /** interfaces */\n PluridView,\n PluridApplicationView,\n PluridConfiguration,\n RegisteredPluridPlane,\n TreePlane,\n LinkCoordinates,\n PathParameters,\n PluridRoute,\n PluridPlane,\n } from '@plurid/plurid-data';\n\n import {\n uuid,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n computeColumnLayout,\n computeRowLayout,\n computeFaceToFaceLayout,\n computeSheavesLayout,\n computeZigZagLayout,\n } from '../layout';\n\n import {\n computePluridPlaneLocation,\n } from '../location';\n\n import {\n getTreePlaneByPlaneID,\n } from '../utilities';\n\n import {\n IsoMatcher,\n } from '~modules/routing';\n\n import {\n computeComparingPath,\n extractParametersValues,\n } from '~modules/routing/Parser/logic';\n\n import {\n computePlaneAddress,\n } from '~modules/routing/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst matchRouteElements = (\n routePath: string,\n viewPath: string,\n) => {\n // routePath = routePath[0] === '/'\n // ? routePath.slice(1)\n // : routePath;\n // viewPath = viewPath[0] === '/'\n // ? viewPath.slice(1)\n // : viewPath;\n\n // console.log('viewPath', viewPath);\n // console.log('routePath', routePath);\n\n if (routePath === viewPath) {\n return {\n value: viewPath,\n parameters: {},\n query: {},\n };\n }\n\n // console.log('viewPath', viewPath);\n // console.log('routePath', routePath);\n\n\n // check if viewPath is a parametrization of routePath\n const parameters: string[] = [];\n const routeSplit = routePath.slice(1).split('/');\n // console.log('routeSplit', routeSplit);\n\n routeSplit.forEach(routeElement => {\n if (routeElement[0] === ':') {\n parameters.push(routeElement);\n } else {\n parameters.push('');\n }\n });\n // console.log('parameters', parameters);\n\n const {\n locationElements,\n comparingPath,\n } = computeComparingPath(viewPath, parameters);\n // console.log('comparingPath', comparingPath);\n // console.log('routePath', routePath);\n // console.log('locationElements', locationElements);\n\n // if (comparingPath !== '/' + routePath) {\n // return;\n // }\n if (comparingPath !== routePath) {\n return;\n }\n\n const parametersValues = extractParametersValues(\n parameters,\n locationElements,\n );\n // console.log('parametersValues', parametersValues);\n return {\n value: viewPath,\n parameters: parametersValues,\n query: {},\n };\n}\n\n\nconst matchRouteToView = (\n route: string,\n view: string,\n): undefined | any => {\n // const routeSplit = route.split(PLURID_ROUTE_SEPARATOR);\n // const viewSplit = view.split(PLURID_ROUTE_SEPARATOR);\n\n // console.log('route', route);\n // console.log('view', view);\n // console.log('routeSplit', routeSplit);\n // console.log('viewSplit', viewSplit);\n\n\n // if (routeSplit.length !== viewSplit.length) {\n // return;\n // }\n\n const pathMatch = matchRouteElements(\n route,\n view,\n );\n // console.log('pathMatch', pathMatch);\n\n return {\n path: {\n ...pathMatch,\n },\n space: {\n // ...spaceMatch,\n },\n universe: {\n // ...universeMatch,\n },\n cluster: {\n // ...clusterMatch,\n },\n plane: {\n // ...planeMatch,\n },\n };\n\n\n\n\n // if (routeSplit.length !== viewSplit.length) {\n // return;\n // }\n\n // const routePath = routeSplit[2];\n // // if (!routePath) return;\n // const viewPath = viewSplit[2];\n // // if (!viewPath) return;\n // console.log('viewPath', viewPath);\n // const pathMatch = matchRouteElements(\n // routePath,\n // viewPath,\n // );\n // console.log('pathMatch', pathMatch);\n // if (!pathMatch) {\n // return;\n // }\n\n\n // const routeSpace = routeSplit[3];\n // // if (!routeSpace) return;\n // const viewSpace = viewSplit[3];\n // // if (!viewSpace) return;\n // const spaceMatch = matchRouteElements(\n // routeSpace,\n // viewSpace,\n // );\n // // console.log('spaceMatch', spaceMatch);\n // if (!spaceMatch) {\n // return;\n // }\n\n\n // const routeUniverse = routeSplit[4];\n // // if (!routeUniverse) return;\n // const viewUniverse = viewSplit[4];\n // // if (!viewUniverse) return;\n // const universeMatch = matchRouteElements(\n // routeUniverse,\n // viewUniverse,\n // );\n // // console.log('universeMatch', universeMatch);\n // if (!universeMatch) {\n // return;\n // }\n\n\n // const routeCluster = routeSplit[5];\n // // if (!routeCluster) return;\n // const viewCluster = viewSplit[5];\n // // if (!viewCluster) return;\n // const clusterMatch = matchRouteElements(\n // routeCluster,\n // viewCluster,\n // );\n // // console.log('clusterMatch', clusterMatch);\n // if (!clusterMatch) {\n // return;\n // }\n\n\n // const routePlane = routeSplit[6];\n // // if (!routePlane) return;\n // const viewPlane = viewSplit[6];\n // // if (!viewPlane) return;\n // const planeMatch = matchRouteElements(\n // routePlane,\n // viewPlane,\n // );\n // // console.log('planeMatch', planeMatch);\n // if (!planeMatch) {\n // return;\n // }\n\n // return {\n // path: {\n // ...pathMatch,\n // },\n // space: {\n // ...spaceMatch,\n // },\n // universe: {\n // ...universeMatch,\n // },\n // cluster: {\n // ...clusterMatch,\n // },\n // plane: {\n // ...planeMatch,\n // },\n // };\n}\n\n\n/**\n * Given a view resolve it to an absolute view\n * and compute a TreePlane if there is a RegisteredPluridPlane\n * for that absolute view.\n *\n * @param view\n */\nexport const resolveViewItem = <C>(\n planes: Map<string, RegisteredPluridPlane<C>>,\n view: string | PluridView,\n configuration: PluridConfiguration,\n origin = 'origin',\n): TreePlane | undefined => {\n // console.log('resolveViewItem', planes);\n\n const {\n protocol,\n host,\n } = configuration.network;\n\n const viewData = typeof view === 'string'\n ? view\n : view.plane;\n // console.log('viewData', viewData);\n\n const viewAddress = computePlaneAddress(\n viewData,\n undefined,\n origin,\n );\n // console.log('viewAddress', viewAddress);\n\n // const resolvedView = resolveRoute(\n // viewData,\n // protocol,\n // host,\n // );\n // console.log('resolvedView', resolvedView);\n\n const iPlanes = planes.values();\n const pluridPlanes: PluridPlane<C>[] = [];\n for (const iPlane of iPlanes) {\n // console.log('iPlane', iPlane);\n\n const plane: PluridPlane<C> = {\n route: iPlane.route.absolute,\n component: iPlane.component,\n };\n pluridPlanes.push(plane);\n }\n\n const isoMatcher = new IsoMatcher({\n planes: pluridPlanes,\n });\n\n // const match = isoMatcher.match(resolvedView.route);\n const match = isoMatcher.match(viewData);\n // console.log('isoMatcher match', match);\n\n if (match) {\n const route = match.match.value;\n\n const treePlane: TreePlane = {\n sourceID: route,\n\n planeID: uuid.generate(),\n\n // route: resolvedView.route,\n route: viewAddress,\n\n routeDivisions: {\n protocol: {\n value: '',\n secure: false,\n },\n host: {\n value: host,\n controlled: true,\n },\n path: {\n parameters: {},\n query: {},\n value: '',\n },\n space: {\n parameters: {},\n query: {},\n value: '',\n },\n universe: {\n parameters: {},\n query: {},\n value: '',\n },\n cluster: {\n parameters: {},\n query: {},\n value: '',\n },\n plane: {\n parameters: {},\n fragments: {\n elements: [],\n texts: [],\n },\n query: {},\n value: '',\n },\n valid: true,\n },\n\n height: 0,\n width: 0,\n location: {\n translateX: 0,\n translateY: 0,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n show: true,\n };\n\n return treePlane;\n }\n\n // for (const [route, _] of planes) {\n // // const routeMatch = matchRouteToView(\n // // route,\n // // resolvedView.route,\n // // );\n // // console.log('route', route);\n // // console.log('resolvedView.route', resolvedView.route);\n // // console.log('routeMatch', routeMatch);\n\n // if (resolvedView.route !== routeMatch.path.value) {\n // continue;\n // }\n // // if (!routeMatch) {\n // // continue;\n // // }\n\n // const treePlane: TreePlane = {\n // sourceID: route,\n\n // planeID: uuid.generate(),\n\n // route: resolvedView.route,\n\n // routeDivisions: {\n // protocol: {\n // value: '',\n // secure: false,\n // },\n // host: {\n // value: host,\n // controlled: true,\n // },\n // path: routeMatch.path,\n // space: routeMatch.space,\n // universe: routeMatch.universe,\n // cluster: routeMatch.cluster,\n // plane: routeMatch.plane,\n // valid: true,\n // },\n\n // height: 0,\n // width: 0,\n // location: {\n // translateX: 0,\n // translateY: 0,\n // translateZ: 0,\n // rotateX: 0,\n // rotateY: 0,\n // },\n // show: true,\n // };\n\n // return treePlane;\n // }\n\n return;\n}\n\n\n/**\n * Compute the space based on the layout.\n * If there is no configuration.space.layout, it uses the default '2 COLUMNS' layout.\n *\n * @param planes\n * @param configuration\n */\nexport const computeSpaceTree = <C>(\n planes: Map<string, RegisteredPluridPlane<C>>,\n view: PluridApplicationView,\n configuration: PluridConfiguration,\n origin = 'origin',\n): TreePlane[] => {\n // console.log('computeSpaceTree');\n // console.log('planes', planes);\n // console.log('configuration', configuration);\n // console.log('computeSpaceTree view', view);\n // console.log('computeSpaceTree origin', origin);\n\n const treePlanes: TreePlane[] = [];\n\n for (const viewItem of view) {\n const treePlane = resolveViewItem(\n planes,\n viewItem,\n configuration,\n origin,\n );\n\n if (treePlane) {\n treePlanes.push(treePlane);\n }\n }\n\n switch(configuration.space.layout.type) {\n case LAYOUT_TYPES.COLUMNS:\n {\n const {\n columns,\n columnLength,\n gap,\n } = configuration.space.layout;\n const columnLayoutTree = computeColumnLayout(\n treePlanes,\n columns,\n columnLength,\n gap,\n configuration,\n );\n return columnLayoutTree;\n }\n case LAYOUT_TYPES.ROWS:\n {\n const {\n rows,\n rowLength,\n gap,\n } = configuration.space.layout;\n const rowLayoutTree = computeRowLayout(\n treePlanes,\n rows,\n rowLength,\n gap,\n configuration,\n );\n return rowLayoutTree;\n }\n case LAYOUT_TYPES.ZIG_ZAG:\n {\n const {\n angle,\n } = configuration.space.layout;\n const zigzagLayoutTree = computeZigZagLayout(\n treePlanes,\n angle,\n configuration,\n );\n return zigzagLayoutTree;\n }\n case LAYOUT_TYPES.FACE_TO_FACE:\n {\n const {\n angle,\n gap,\n middle,\n } = configuration.space.layout;\n const faceToFaceLayoutTree = computeFaceToFaceLayout(\n treePlanes,\n angle,\n gap,\n middle,\n configuration,\n );\n return faceToFaceLayoutTree;\n }\n case LAYOUT_TYPES.SHEAVES:\n {\n const {\n depth,\n offsetX,\n offsetY,\n } = configuration.space.layout;\n const sheavesLayoutTree = computeSheavesLayout(\n treePlanes,\n depth,\n offsetX,\n offsetY,\n configuration,\n );\n return sheavesLayoutTree;\n }\n case LAYOUT_TYPES.META:\n {\n return [];\n }\n default:\n return [];\n }\n}\n\n\nexport const isParametric = (\n viewRoute: string,\n planeRoute: string,\n) => {\n return true;\n}\n\nexport const matchForParameters = (\n viewRoute: string,\n planeRoute: string,\n) => {\n const splitViewRoute = viewRoute.split('://');\n const splitPlaneRoute = planeRoute.split('://');\n // \"http://localhost:3000://p://s://u://c://one\"\n // \"http://localhost:3000://p://s://u://c://:id\"\n\n const pathViewRoute = splitViewRoute[2];\n const pathPlaneRoute = splitPlaneRoute[2];\n\n}\n\n\nexport const assignPagesFromView = (\n planes: TreePlane[],\n view?: PluridApplicationView,\n): TreePlane[] => {\n if (!view) {\n return planes;\n }\n\n const tree: TreePlane[] = [];\n\n // const routes: PluridRoute[] = pages.map(page => {\n // const route: PluridRoute = {\n // value: page.route,\n // // value: page.value,\n // // view: '',\n // };\n // return route;\n // });\n\n // const router = new Router(routes);\n\n // console.log('planes', planes);\n // console.log('view', view);\n\n for (const viewPlane of view) {\n if (typeof viewPlane === 'string') {\n for (const plane of planes) {\n if (viewPlane === plane.sourceID) {\n tree.push(plane);\n }\n\n if (isParametric(viewPlane, plane.sourceID)) {\n const parametricPlane = {\n ...plane,\n };\n parametricPlane.routeDivisions.plane.parameters.id = 'one';\n parametricPlane.routeDivisions.plane.value = 'one';\n parametricPlane.route = viewPlane;\n tree.push(parametricPlane);\n }\n }\n }\n }\n\n\n // for (const [index, viewPage] of view.entries()) {\n // const viewPagePath = typeof viewPage === 'string'\n // ? viewPage\n // : viewPage.path;\n\n // const matchedPage = router.match(viewPagePath);\n\n // console.log('matchedPage', matchedPage);\n\n // if (matchedPage) {\n // const page = pages.find(p => p.route === matchedPage?.path.value);\n // if (!page) {\n // break;\n // }\n\n // const newPage = {\n // ...page,\n // path: viewPagePath,\n // planeID: uuid.generate(),\n // };\n\n // const viewPageOrdinal = typeof viewPage === 'string'\n // ? index\n // : typeof viewPage.ordinal === 'number'\n // ? viewPage.ordinal\n // : index;\n\n // const treePage = tree[viewPageOrdinal];\n\n // if (typeof treePage === 'undefined') {\n // tree[viewPageOrdinal] = newPage;\n // } else {\n // let elementSet = false;\n // let pageIndex = viewPageOrdinal;\n\n // do {\n // const nextIndex = pageIndex + 1;\n // const nextTreePlane = tree[nextIndex];\n // if (typeof nextTreePlane === 'undefined') {\n // tree[nextIndex] = newPage;\n // elementSet = true;\n // }\n // } while (!elementSet);\n // }\n // }\n // }\n\n return tree;\n}\n\n\n\n\n\n\n\nexport const updateTreePlane = (\n tree: TreePlane[],\n updatedPage: TreePlane,\n): TreePlane[] => {\n const updatedTree = tree.map(treePlane => {\n if (treePlane.planeID === updatedPage.planeID) {\n return updatedPage;\n }\n\n if (treePlane.children) {\n const pageTree = updateTreePlane(treePlane.children, updatedPage);\n treePlane.children = pageTree;\n return treePlane;\n }\n\n return treePlane;\n });\n\n return updatedTree;\n}\n\n\n\nexport interface UpdatedTreeWithNewPlane {\n pluridPlaneID: string;\n updatedTree: TreePlane[];\n updatedTreePlane?: TreePlane;\n}\n\nexport const updateTreeWithNewPlane = <C>(\n planeRoute: string,\n parentPlaneID: string,\n linkCoordinates: LinkCoordinates,\n tree: TreePlane[],\n planesRegistry: Map<string, RegisteredPluridPlane<C>>,\n configuration: PluridConfiguration,\n): UpdatedTreeWithNewPlane => {\n const parentPlane = getTreePlaneByPlaneID(tree, parentPlaneID);\n // console.log('parentPlane', parentPlane);\n\n if (!parentPlane) {\n return {\n pluridPlaneID: '',\n updatedTree: tree,\n };\n }\n\n const location = computePluridPlaneLocation(\n linkCoordinates,\n parentPlane,\n );\n // console.log('location', location);\n // console.log('planeRoute', planeRoute);\n\n\n const treePlane = resolveViewItem(\n planesRegistry,\n planeRoute,\n configuration,\n );\n // console.log('treePlane', treePlane);\n\n if (!treePlane) {\n return {\n pluridPlaneID: '',\n updatedTree: tree,\n };\n }\n\n const updatedTreePlane = {\n ...treePlane,\n parentPlaneID,\n location: {\n translateX: location.x,\n translateY: location.y,\n translateZ: location.z,\n rotateX: 0,\n rotateY: parentPlane.location.rotateY + PLANE_DEFAULT_ANGLE,\n },\n bridgeLength: 100,\n planeAngle: 90,\n linkCoordinates,\n };\n // console.log('updatedTreePlane', updatedTreePlane);\n\n\n // const newPlane: TreePlane = {\n // sourceID: '',\n // route: planePath,\n // routeDivisions: {\n // protocol: '',\n // host: {\n // value: '',\n // controlled: false,\n // },\n // path: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // space: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // universe: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // cluster: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // plane: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // valid: false,\n // },\n // // parameters: extractedParameters,\n // // parameters: {},\n // planeID,\n // width: 0,\n // height: 0,\n // parentPlaneID,\n // location: {\n // translateX: location.x,\n // translateY: location.y,\n // translateZ: location.z,\n // rotateX: 0,\n // rotateY: parentPlane.location.rotateY + PLANE_DEFAULT_ANGLE,\n // },\n // show: true,\n // bridgeLength: 100,\n // planeAngle: 90,\n // linkCoordinates,\n // };\n // console.log('newPlane', newPlane);\n\n const updatedParentPlane: TreePlane = {\n ...parentPlane,\n };\n\n if (updatedParentPlane.children) {\n updatedParentPlane.children.push(updatedTreePlane);\n } else {\n updatedParentPlane.children = [updatedTreePlane];\n }\n\n const updatedTree = updateTreePlane(tree, updatedParentPlane);\n\n return {\n pluridPlaneID: updatedTreePlane.planeID,\n updatedTree,\n updatedTreePlane,\n };\n}\n\n\n\nexport const updateTreeWithNewPage = (\n tree: TreePlane[],\n treePageParentPlaneID: string,\n pagePath: string,\n pageID: string,\n linkCoordinates: LinkCoordinates,\n parameters?: PathParameters,\n): UpdatedTreeWithNewPlane => {\n // to receive parameters and composePath from pagePath and parameters\n\n const treePageParent = getTreePlaneByPlaneID(tree, treePageParentPlaneID);\n // console.log('tree page parent', treePageParent);\n\n if (treePageParent) {\n const location = computePluridPlaneLocation(\n linkCoordinates,\n treePageParent,\n );\n\n // const extractedParameters = extractParameters(\n // pagePath,\n // parameters,\n // );\n\n const planeID = uuid.generate();\n const newTreePlane: TreePlane = {\n sourceID: pageID,\n route: pagePath,\n routeDivisions: {\n protocol: {\n value: '',\n secure: false,\n },\n host: {\n value: '',\n controlled: false,\n },\n path: {\n value: '',\n parameters: {},\n query: {},\n },\n space: {\n value: '',\n parameters: {},\n query: {},\n },\n universe: {\n value: '',\n parameters: {},\n query: {},\n },\n cluster: {\n value: '',\n parameters: {},\n query: {},\n },\n plane: {\n value: '',\n parameters: {},\n query: {},\n fragments: {\n texts: [],\n elements: [],\n },\n },\n valid: false,\n },\n // parameters: extractedParameters,\n // parameters: {},\n planeID,\n width: 0,\n height: 0,\n parentPlaneID: treePageParentPlaneID,\n location: {\n translateX: location.x,\n translateY: location.y,\n translateZ: location.z,\n rotateX: 0,\n rotateY: treePageParent.location.rotateY + PLANE_DEFAULT_ANGLE,\n },\n show: true,\n bridgeLength: 100,\n planeAngle: 90,\n linkCoordinates,\n };\n\n const updatedTreePlaneParent = {...treePageParent};\n if (updatedTreePlaneParent.children) {\n updatedTreePlaneParent.children.push(newTreePlane);\n } else {\n updatedTreePlaneParent.children = [newTreePlane];\n }\n\n const updatedTree = updateTreePlane(tree, updatedTreePlaneParent);\n\n return {\n pluridPlaneID: planeID,\n updatedTree,\n };\n }\n\n return {\n pluridPlaneID: '',\n updatedTree: tree,\n };\n}\n\n\nexport const removePageFromTree = (\n tree: TreePlane[],\n pluridPlaneID: string,\n): TreePlane[] => {\n const updatedTree = tree.filter(page => {\n if (page.planeID === pluridPlaneID) {\n return false;\n }\n\n if (page.children) {\n const pageTree = removePageFromTree(page.children, pluridPlaneID);\n page.children = pageTree;\n return page;\n }\n\n return page;\n });\n\n return updatedTree;\n}\n\n\nexport const toggleChildren = (\n children: TreePlane[],\n): TreePlane[] => {\n const updatedChildren = children.map(child => {\n if (child.children) {\n const updatedChild = {\n ...child,\n show: !child.show,\n children: toggleChildren(child.children),\n }\n return updatedChild;\n }\n\n const updatedChild: TreePlane = {\n ...child,\n show: !child.show,\n };\n return updatedChild;\n });\n\n return updatedChildren;\n}\n\n\nexport interface TogglePlaneFromTree {\n updatedTree: TreePlane[];\n updatedPlane: TreePlane | undefined;\n}\n\nexport const togglePlaneFromTree = (\n tree: TreePlane[],\n pluridPlaneID: string,\n): TogglePlaneFromTree => {\n const updatedTree: TreePlane[] = [];\n\n let updatedPlane: TreePlane | undefined;\n\n for (const plane of tree) {\n if (plane.planeID === pluridPlaneID) {\n const treeUpdatedPlane: TreePlane = {\n ...plane,\n show: !plane.show,\n children: [],\n // TODO\n // Instead of removing all the children to toggle them\n // currently, issue with the plurid link creating new instances.\n // children: page.children ? toggleChildren(page.children) : [],\n };\n\n updatedTree.push(treeUpdatedPlane);\n updatedPlane = {\n ...treeUpdatedPlane,\n };\n\n continue;\n }\n\n\n if (plane.children) {\n const {\n updatedTree: childrenUpdatedTree,\n updatedPlane: childrenUpdatedPlane,\n } = togglePlaneFromTree(plane.children, pluridPlaneID);\n\n plane.children = [ ...childrenUpdatedTree ];\n updatedTree.push(plane);\n\n if (childrenUpdatedPlane) {\n updatedPlane = {\n ...childrenUpdatedPlane,\n };\n }\n\n continue;\n }\n\n\n updatedTree.push(plane);\n }\n\n return {\n updatedTree,\n updatedPlane,\n };\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n RegisteredPluridPlane,\n PluridConfiguration,\n PluridApplicationView,\n PluridCluster,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region internal\n import {\n computeSpaceTree,\n } from './logic';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nexport interface TreeData<C> {\n planes: Map<string, RegisteredPluridPlane<C>>,\n view: PluridApplicationView,\n configuration: PluridConfiguration,\n clusters?: PluridCluster<C>[],\n previousTree?: TreePlane[],\n}\n\nexport default class Tree<C> {\n private data: TreeData<C>;\n private origin: string;\n\n constructor(\n data: TreeData<C>,\n origin: string = 'origin',\n ) {\n this.data = data;\n this.origin = origin;\n }\n\n public compute() {\n const {\n planes,\n view,\n configuration,\n } = this.data;\n\n return computeSpaceTree(\n planes,\n view,\n configuration,\n this.origin,\n );\n }\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n /** interfaces */\n PluridView,\n TreePlane,\n SpaceLocation,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n findPage,\n } from '../utilities';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const computeViewTree = (\n pages: TreePlane[],\n view: string[] | PluridView[],\n): TreePlane[] => {\n const viewTree: TreePlane[] = [];\n\n for (const pageView of view) {\n const page = pages.find(p => p.route === pageView);\n\n if (page) {\n viewTree.push(page);\n }\n }\n\n return viewTree;\n}\n\n\n/**\n * Compute only the view within a given radius around the user.\n *\n * @param pages\n * @param view\n * @param location\n */\nexport const computeCulledView = (\n pages: TreePlane[],\n view: string[] | PluridView[],\n location: SpaceLocation,\n radius: number = 8000,\n) => {\n const culledView: string[] = [];\n\n for (const viewPage of view) {\n const path = typeof viewPage === 'string'\n ? viewPage\n : viewPage.plane;\n\n const page = findPage(\n path,\n pages,\n );\n if (!page) {\n return;\n }\n\n const pageInView = checkPageInView(\n page,\n location,\n radius,\n );\n\n if (pageInView) {\n culledView.push(\n page.route,\n );\n }\n }\n\n return culledView;\n}\n\n\nexport const checkPageInView = (\n page: TreePlane,\n location: SpaceLocation,\n radius: number,\n) => {\n const radiusLeft = location.translationX < 0\n ? Math.abs(location.translationX) - radius\n : -1 * location.translationX - radius;\n const radiusRight = location.translationX < 0\n ? Math.abs(location.translationX) + radius\n : -1 * location.translationX + radius;\n const locationX = page.location.translateX;\n\n const radiusTop = location.translationY < 0\n ? Math.abs(location.translationY) - radius\n : -1 * location.translationY - radius;\n const radiusBottom = location.translationY < 0\n ? Math.abs(location.translationY) + radius\n : -1 * location.translationY + radius;\n const locationY = page.location.translateY;\n\n const inViewOnX = radiusLeft <= locationX && locationX <= radiusRight;\n const inViewOnY = radiusTop <= locationY && locationY <= radiusBottom;\n\n if (\n inViewOnX && inViewOnY\n ) {\n return true;\n }\n\n return false;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridApplicationView,\n PluridConfiguration,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n PluridState,\n PluridMetastateState,\n PluridStateSpace,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import * as space from '~modules/space';\n\n import {\n getRegisteredPlanes,\n } from '~modules/planes';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst resolveSpace = <C>(\n view: PluridApplicationView,\n configuration: PluridConfiguration,\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n currentState: PluridState | undefined,\n localState: PluridState | undefined,\n precomputedState: Partial<PluridState> | undefined,\n contextState: PluridMetastateState | undefined,\n hostname = 'origin',\n) => {\n const registeredPlanes = getRegisteredPlanes(planesRegistrar);\n // console.log('resolveSpace > registeredPlanes', registeredPlanes);\n\n const spaceTree = new space.tree.Tree(\n {\n planes: registeredPlanes,\n configuration,\n view,\n },\n hostname,\n );\n // console.log('resolveSpace > spaceTree', spaceTree);\n\n const computedTree = spaceTree.compute();\n // console.log('resolveSpace > computedTree', computedTree);\n\n\n const stateSpace: PluridStateSpace = {\n loading: true,\n animatedTransform: false,\n transformTime: 450,\n scale: 1,\n rotationX: 0,\n rotationY: 0,\n translationX: 0,\n translationY: 0,\n translationZ: 0,\n activeUniverseID: '',\n camera: {\n x: 0,\n y: 0,\n z: 0,\n },\n viewSize: {\n width: 771,\n height: 764,\n },\n spaceSize: {\n width: 771,\n height: 764,\n depth: 0,\n topCorner: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n culledView: [],\n\n ...precomputedState?.space,\n ...contextState?.space,\n ...localState?.space,\n ...currentState?.space,\n\n view,\n initialTree: computedTree,\n tree: computedTree,\n };\n\n if (currentState) {\n stateSpace.translationX = currentState.space.translationX;\n stateSpace.translationY = currentState.space.translationY;\n stateSpace.translationZ = currentState.space.translationZ;\n stateSpace.rotationX = currentState.space.rotationX;\n stateSpace.rotationY = currentState.space.rotationY;\n stateSpace.scale = currentState.space.scale;\n }\n\n if (localState && !currentState) {\n stateSpace.translationX = localState.space.translationX;\n stateSpace.translationY = localState.space.translationY;\n stateSpace.translationZ = localState.space.translationZ;\n stateSpace.rotationX = localState.space.rotationX;\n stateSpace.rotationY = localState.space.rotationY;\n stateSpace.scale = localState.space.scale;\n }\n\n return stateSpace;\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n resolveSpace,\n};\n// #endregion exports\n","// #region imports\n // #region libraries\n import themes, {\n Theme,\n THEME_NAMES,\n } from '@plurid/plurid-themes';\n\n import {\n PluridConfiguration,\n PluridStateThemes,\n PluridState,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst resolveThemes = (\n configuration: PluridConfiguration,\n precomputedState: Partial<PluridState> | undefined,\n) => {\n let generalTheme: Theme | undefined;\n let interactionTheme: Theme | undefined;\n\n if (typeof configuration.global.theme === 'object') {\n const {\n general,\n interaction,\n } = configuration.global.theme;\n\n if (typeof general === 'string') {\n if (Object.keys(THEME_NAMES).includes(general)) {\n generalTheme = (themes as any)[general];\n }\n }\n\n if (typeof interaction === 'string') {\n if (Object.keys(THEME_NAMES).includes(interaction)) {\n interactionTheme = (themes as any)[interaction];\n }\n }\n } else {\n if (Object.keys(THEME_NAMES).includes(configuration.global.theme)) {\n generalTheme = (themes as any)[configuration.global.theme];\n interactionTheme = (themes as any)[configuration.global.theme];\n }\n }\n\n const stateThemes: PluridStateThemes = {\n general: generalTheme || themes.plurid,\n interaction: interactionTheme || themes.plurid,\n ...precomputedState?.themes,\n };\n\n return stateThemes;\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n resolveThemes,\n};\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridApplicationView,\n PluridConfiguration,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n PluridState,\n PluridMetastateState,\n\n RecursivePartial,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import * as generalEngine from '../../general';\n // #endregion external\n\n\n // #region internal\n import {\n resolveSpace,\n } from './space';\n\n import {\n resolveThemes,\n } from './themes';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nconst compute = <C>(\n view: PluridApplicationView,\n configuration: RecursivePartial<PluridConfiguration> | undefined,\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n currentState: PluridState | undefined,\n localState: PluridState | undefined,\n precomputedState: Partial<PluridState> | undefined,\n contextState: PluridMetastateState | undefined,\n hostname = 'origin',\n) => {\n // TODO\n // the compute call also needs to make clear the nature of the change\n // i.e. if any of the states overwrite the current state\n // or if the current state takes precedence.\n\n const specifiedConfiguration = generalEngine.configuration.merge(configuration);\n const stateConfiguration: PluridConfiguration = {\n ...specifiedConfiguration,\n ...precomputedState?.configuration,\n ...contextState?.configuration,\n ...localState?.configuration,\n ...currentState?.configuration,\n };\n\n const stateSpace = resolveSpace(\n view,\n stateConfiguration,\n planesRegistrar,\n currentState,\n localState,\n precomputedState,\n contextState,\n hostname,\n );\n\n const stateThemes = resolveThemes(\n stateConfiguration,\n precomputedState,\n );\n\n\n const state: PluridState = {\n configuration: {\n ...stateConfiguration,\n },\n shortcuts: {\n global: true,\n ...precomputedState?.shortcuts,\n },\n space: {\n ...stateSpace,\n },\n themes: {\n ...stateThemes,\n },\n ui: {\n toolbarScrollPosition: 0,\n ...precomputedState?.ui,\n ...contextState?.ui,\n },\n };\n\n return state;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default compute;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridState,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst load = (\n id: string | undefined,\n useLocalStorage: boolean | undefined,\n) => {\n if (!useLocalStorage) {\n return;\n }\n\n if (typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n const stateID = id || 'default';\n\n const stateData = localStorage.getItem('pluridState-' + stateID);\n\n if (!stateData) {\n return;\n }\n\n const state: PluridState = JSON.parse(stateData);\n\n // TODO\n // check state conforms to the PluridState datashape using datasign\n\n return state;\n } catch (error) {\n return;\n }\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n load,\n};\n// #endregion exports\n","// #region module\nexport const cleanTemplate = (\n template: string,\n) => {\n return template\n .replace(/(?:\\r\\n|\\r|\\n)/g, ' ')\n .replace(/ +/g, ' ')\n .trim();\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PLURID_ROUTER_LOCATION_CHANGED,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const pluridRouterNavigate = (\n path: string,\n) => {\n if (!CustomEvent || !window) {\n return;\n }\n\n const event = new CustomEvent(\n PLURID_ROUTER_LOCATION_CHANGED,\n {\n detail: {\n path,\n },\n },\n );\n\n window.dispatchEvent(event);\n}\n// #endregion module\n"],"names":["resolveTheme","theme","type","general","interaction","merge","configuration","target","targetConfiguration","Object","assign","defaultConfiguration","specifiedOrDefault","path","item","objects","getNested","layout","space","mergedConfiguration","global","micro","transparentUI","language","render","_a","_b","elements","toolbar","show","opaque","conceal","transformIcons","transformButtons","drawers","toggledDrawers","viewcube","buttons","plane","width","opacity","controls","pathbar","domainURL","switch","_e","_d","_c","camera","perspective","fadeInTime","center","transformOrigin","size","transformLocks","rotationX","rotationY","translationX","translationY","translationZ","scale","transformMode","transformMultimode","transformTouch","firstPerson","network","host","protocol","development","planeDebugger","spaceDebugger","extractPathname","location","queryIndex","indexOf","noQueryPath","substring","fragmentIndex","noFragmentPath","extractParametersAndMatch","route","routeElements","splitPath","parameters","forEach","routeElement","push","locationElements","comparingPath","computeComparingPath","match","parametersValues","extractParametersValues","pathElements","parameter","index","parameterKey","slice","pathname","comparingPathElements","keys","join","split","filter","i","extractQuery","querySplit","length","queryValues","query","queryItems","queryValue","id","value","decodeURIComponent","extractFragments","texts","fragmentsValues","fragmentItems","textFragments","elementFragments","parsedFragment","parseFragment","fragment","fragmentData","fragmentType","fragmentValues","toLowerCase","textValues","textStart","textEnd","textOccurence","extractOccurence","start","end","occurence","elementValues","elementID","elementOccurence","undefined","occurenceMatch","occurenceValue","parseInt","stringInsertInitial","insert","startsWith","stringRemoveTrailing","trail","endsWith","PATH_SEPARATOR","cleanupPath","computePlaneAddress","origin","cleanPlane","planeAddressType","checkPlaneAddressType","absolutePlane","isAbsolutePlane","planeAddress","protocols","plurid","trim","https","HTTPS_PROTOCOL","http","HTTP_PROTOCOL","removeTrailingSlash","cleanPathValue","queryStart","checkParameterLength","compareType","parameterLength","compareTypes","equal","equalLessThan","lessThan","equalGreaterThan","greaterThan","checkValidPath","validationParameters","parameterData","entries","lengthType","includes","paramaterValue","validLength","cleanPathElement","mapPathsToRoutes","paths","view","routes","key","pathView","pluridLinkPathDivider","windowProtocol","window","replace","windowHost","map","controlled","universe","cluster","fragments","valid","url","secure","routeSplit","resolveRoute","divisions","defaultPathname","protocolDivision","hostDivision","separator","resolvers","absoluteRoute","createTreePlane","contextPlane","documentPlane","routeDivisions","treePlane","defaultTreePlane","sourceID","planeID","uuid","generate","updateTreePlane","tree","page","updatedTree","children","updateTreeByPlaneIDWithLinkCoordinates","linkCoordinates","updatedPlane","updatedChildren","getWheelDirection","deltas","ABSTHRESHOLD","THRESHOLD","direction","wheelDeltaX","deltaX","wheelDeltaY","deltaY","absWheelDeltaX","Math","abs","absWheelDeltaY","degToRad","deg","radToDeg","rad","makeQuaternion","x","y","z","w","zeroQuaternion","inverseQuaternion","quaternion","conjugateQuaternion","computeQuaternionFromEulers","alpha","beta","gamma","cX","cos","cY","cZ","sX","sin","sY","sZ","xQ","yQ","zQ","wQ","quaternionFromAxisAngle","angle","q","halfAngle","quaternionMultiply","quaternionArray","temporaryQuaternion","copyQuaternion","secondaryTemporaryQuaternion","nextQuaternion","rotatePointViaQuaternion","pointRotate","rotatedPoint","makeRotationMatrixFromQuaternion","num","num2","num3","num4","num5","num6","num7","num8","num9","num10","num11","num12","rotateMatrix","xAngle","yAngle","zAngle","xQuaternion","yQuaternion","zQuaternion","quartenionMultiplication","rotationMatrix","translateMatrix","scaleMatrix","s","multiplyMatrices","matrixA","matrixB","result","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","multiplyArrayOfMatrices","matrices","inputMatrix","matrixArrayToCSSMatrix","array","m1","m2","j","sum","k","arrayToMatrix","matrix","row","matrixToArray","flat","printMatrix","name","normalize","toFixed","console","log","rotateXMatrix","m","rotateYMatrix","rotateZMatrix","getMatrixValues","matrix3d","matrixValues","matrixValuesInt","parseFloat","getRotationMatrix","valuesMatrix","getScalationValue","getTranslationMatrix","translationMatrix","temp","el","sqrt","toPrecision","setTransform","scalationMatrix","transformMatrix","getTransformRotate","pi","PI","values","rotateX","rotateY","cosa","sina","asin","acos","cosaX1","sinaX3","cosaY1","sinaY2","atan2","rotateZ","getTransformTranslate","translateX","translateY","translateZ","getTransformScale","rotatePlurid","angleIncrement","transformRotate","transformTranslate","valRotationMatrix","valTranslationMatrix","valScalationMatrix","transformedMatrix3d","translatePlurid","linearIncrement","scalePlurid","scaleIncrement","internatiolate","lamguage","field","internationalization","resolvePluridPlaneData","Array","isArray","component","options","resolvePluridRoutePlaneData","createInternalStatePlane","planeData","statePlane","createInternalContextPlane","getPluridPlaneIDByData","element","parent","parentElement","dataset","pluridPlane","IsoMatcher","constructor","data","this","routesIndex","Map","planesIndex","routesKeys","planesKeys","updateIndexes","routePlanes","planes","context","matchPlane","matchRoute","clear","getPlanesIndex","indexPlanes","set","from","kind","address","indexedPlane","get","planePath","normalizedPlanePath","normalizedPlaneAddress","planePathSplit","planeAddressSplit","parametersAndMatch","validPath","routeValue","routePath","valueSplit","routePlane","Parser","handleOptions","parserOptions","extract","queryData","queryString","parserResponse","PluridPlanesRegistrar","isoMatcher","register","identify","registeredPlane","absolute","getAll","all","registerPlanes","planesRegistrar","__pluridPlanesRegistrar__","pluridPlanesRegistrar","getPlanesRegistrar","getRegisteredPlanes","getRegisteredPlane","computeSpaceSize","height","depth","topCorner","treePage","spaceWidth","spaceHeight","spaceDepth","findPage","pages","splitIntoGroups","initialArray","groups","group","splice","getTreePlaneByPlaneID","_page","toRadians","mathematics","geometry","computePath","parentID","parentPlaneID","parentPage","reverse","computePluridPlaneLocation","treePageParent","bridgeLength","linkPlaneAngle","parentAngleRadians","linkPoint","linkAngleRadians","locationCoordinates","recomputeChildrenLocation","child","planeAngle","updatedChild","updatedChildWithChildren","computeColumnLayout","roots","columns","columnLength","gap","ROOTS_GAP","windowInnerWidth","innerWidth","windowInnerHeight","innerHeight","configurationWidth","numbers","checkIntegerNonUnit","gapValue","ceil","root","rowIndex","columnIndex","floor","treePageWithChildren","computeRowLayout","rows","rowLength","computeFaceToFaceTranslateZ","first","computeFaceToFaceTranslateX","firstTranslateX","computeFaceToFaceRotateY","last","computeFaceToFaceLayout","middle","Number","isInteger","computeSheavesLayout","offsetX","offsetY","computeZigZagLayout","singleColumnedRoots","resolveViewItem","viewData","viewAddress","iPlanes","pluridPlanes","iPlane","computeSpaceTree","treePlanes","viewItem","LAYOUT_TYPES","COLUMNS","columnLayoutTree","ROWS","rowLayoutTree","ZIG_ZAG","zigzagLayoutTree","FACE_TO_FACE","faceToFaceLayoutTree","SHEAVES","sheavesLayoutTree","META","isParametric","viewRoute","planeRoute","matchForParameters","splitViewRoute","splitPlaneRoute","assignPagesFromView","viewPlane","parametricPlane","updatedPage","pageTree","updateTreeWithNewPlane","planesRegistry","parentPlane","pluridPlaneID","updatedTreePlane","PLANE_DEFAULT_ANGLE","updatedParentPlane","updateTreeWithNewPage","treePageParentPlaneID","pagePath","pageID","newTreePlane","updatedTreePlaneParent","removePageFromTree","toggleChildren","togglePlaneFromTree","treeUpdatedPlane","childrenUpdatedTree","childrenUpdatedPlane","Tree","compute","computeViewTree","viewTree","pageView","find","p","computeCulledView","radius","culledView","viewPage","pageInView","checkPageInView","radiusLeft","radiusRight","locationX","radiusTop","radiusBottom","locationY","inViewOnX","inViewOnY","resolveSpace","currentState","localState","precomputedState","contextState","hostname","registeredPlanes","spaceTree","space.tree.Tree","computedTree","stateSpace","loading","animatedTransform","transformTime","activeUniverseID","viewSize","spaceSize","initialTree","resolveThemes","generalTheme","interactionTheme","THEME_NAMES","themes","stateThemes","specifiedConfiguration","generalEngine.configuration.merge","stateConfiguration","state","shortcuts","ui","toolbarScrollPosition","load","useLocalStorage","localStorage","stateID","stateData","getItem","JSON","parse","error","cleanTemplate","template","pluridRouterNavigate","CustomEvent","event","PLURID_ROUTER_LOCATION_CHANGED","detail","dispatchEvent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../source/modules/general/configuration/index.ts","../source/modules/routing/Parser/logic.ts","../source/modules/routing/logic/general/index.ts","../source/modules/routing/logic/validity/index.ts","../source/modules/utilities/index.ts","../source/modules/routing/logic/utilities/index.ts","../source/modules/general/tree/index.ts","../source/modules/interaction/direction/index.ts","../source/modules/interaction/mathematics/quaternion/index.ts","../source/modules/interaction/mathematics/matrix/index.ts","../source/modules/interaction/mathematics/transform/general/index.ts","../source/modules/interaction/mathematics/transform/matrix3d/index.ts","../source/modules/internationalization/index.ts","../source/modules/planes/logic/index.ts","../source/modules/routing/IsoMatcher/index.ts","../source/modules/routing/Parser/index.ts","../source/modules/planes/registrar/object.ts","../source/modules/planes/registrar/utilities.ts","../source/modules/space/utilities/index.ts","../source/modules/space/location/logic.ts","../source/modules/space/layout/column.ts","../source/modules/space/layout/row.ts","../source/modules/space/layout/faceToFace.ts","../source/modules/space/layout/sheaves.ts","../source/modules/space/layout/zigZag.ts","../source/modules/space/tree/logic.ts","../source/modules/space/tree/object.ts","../source/modules/space/view/logic.ts","../source/modules/state/compute/space/index.ts","../source/modules/state/compute/themes/index.ts","../source/modules/state/compute/index.ts","../source/modules/state/local/index.ts","../source/functions/template/index.ts","../source/functions/navigate/index.ts"],"sourcesContent":["// #region imports\n // #region libraries\n import {\n PluridPartialConfiguration,\n PluridConfigurationTheme,\n PluridConfiguration,\n RecursivePartial,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n objects,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst resolveTheme = (\n theme: string | number | symbol | RecursivePartial<PluridConfigurationTheme> | undefined,\n type: 'general' | 'interaction',\n) => {\n if (!theme) {\n return 'plurid';\n }\n\n if (typeof theme === 'string') {\n return theme;\n }\n\n if (typeof theme !== 'object') {\n return 'plurid';\n }\n\n const {\n general,\n interaction,\n } = theme;\n\n if (type === 'general' && general) {\n return general;\n }\n\n if (type === 'interaction' && interaction) {\n return interaction;\n }\n\n return 'plurid';\n}\n\n\nexport const merge = (\n configuration?: PluridPartialConfiguration,\n target?: PluridConfiguration,\n): PluridConfiguration => {\n const targetConfiguration: PluridConfiguration = {\n ...objects.clone(defaultConfiguration),\n ...objects.clone(target || {}),\n };\n\n if (!configuration) {\n return targetConfiguration;\n }\n\n const mergedConfiguration = objects.merge(\n targetConfiguration,\n configuration,\n {\n 'global.theme': () => {\n return {\n general: resolveTheme(configuration.global?.theme, 'general') as any,\n interaction: resolveTheme(configuration.global?.theme, 'interaction') as any,\n };\n },\n },\n );\n\n return mergedConfiguration;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n Indexed,\n PluridRouteFragments,\n PluridRouteFragmentElement,\n PluridRouteFragmentText,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region internal\n import {\n ParserParametersAndMatch,\n } from './interfaces';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nexport const extractPathname = (\n location: string,\n) => {\n const queryIndex = location.indexOf('?');\n const noQueryPath = queryIndex === -1\n ? location\n : location.substring(0, queryIndex);\n\n const fragmentIndex = noQueryPath.indexOf('#:~:');\n const noFragmentPath = fragmentIndex === -1\n ? noQueryPath\n : noQueryPath.substring(0, fragmentIndex);\n\n return noFragmentPath;\n}\n\n\n/**\n * Extracts the parameters names from a `route`.\n *\n * e.g.\n *\n * `'/:foo/:boo'` -> `[':foo', 'boo']`\n *\n * `'/foo/:boo'` -> `['', 'boo']`\n *\n * `'/foo/boo'` -> `[]`\n *\n * If there are no parameters returns an empty array.\n * Non-parametric route elements have an empty string as placeholder.\n *\n * @param route\n */\nexport const extractParametersAndMatch = (\n location: string,\n route: string,\n): ParserParametersAndMatch => {\n const routeElements = splitPath(route);\n const parameters: string[] = [];\n\n routeElements.forEach(routeElement => {\n if (routeElement[0] === ':') {\n parameters.push(routeElement);\n } else {\n parameters.push('');\n }\n });\n\n const {\n locationElements,\n comparingPath,\n } = computeComparingPath(location, parameters);\n // console.log('locationElements', locationElements);\n // console.log('comparingPath', comparingPath);\n if (comparingPath !== route) {\n return {\n match: false,\n parameters: {},\n elements: locationElements,\n };\n }\n\n const parametersValues = extractParametersValues(\n parameters,\n locationElements,\n );\n return {\n match: true,\n parameters: parametersValues,\n elements: locationElements,\n };\n}\n\n\n/**\n * Extract the parameters values.\n *\n * e.g.\n *\n * `parameters = ['', ':list']`\n *\n * `pathElements = ['list', 'foo']`\n *\n * `parametersValues = { list: 'foo' }`\n *\n * @param parameters\n * @param pathElements\n */\nexport const extractParametersValues = (\n parameters: string[],\n pathElements: string[],\n): Record<string, string> => {\n const parametersValues: Record<string, string> = {};\n\n parameters.forEach(\n (parameter, index) => {\n if (parameter) {\n const parameterKey = parameter.slice(1,);\n parametersValues[parameterKey] = pathElements[index];\n }\n }\n );\n\n return parametersValues;\n}\n\n\n/**\n * Based on the `path` and the `parameters` computes a match for comparison.\n *\n * @param path\n * @param parameters\n */\nexport const computeComparingPath = (\n path: string,\n parameters: string[],\n) => {\n const pathname = extractPathname(path);\n const locationElements = splitPath(pathname);\n const comparingPathElements = [...locationElements];\n\n for (const index of locationElements.keys()) {\n if (parameters[index]) {\n comparingPathElements[index] = parameters[index];\n }\n }\n\n // const comparingPath = '/' + comparingPathElements.join('/');\n const comparingPath = comparingPathElements.join('/');\n\n return {\n locationElements,\n comparingPath,\n };\n}\n\n\n/**\n * Splits `path` into elements.\n *\n * e.g. `'/foo/boo'` -> `['foo', 'boo']`\n *\n * @param path\n */\nexport const splitPath = (\n path: string,\n) => {\n return path.split('/').filter(i => i !== '');\n}\n\n\n/**\n * Extract the query values.\n *\n * e.g.\n *\n * `path = '/foo?id=1&asd=asd'`\n *\n * `query = { id: 1, asd: 'asd' }`\n *\n * @param path\n */\nexport const extractQuery = (\n path: string,\n): Indexed<string> => {\n const fragmentIndex = path.indexOf('#:~:');\n const noFragmentPath = fragmentIndex === -1\n ? path\n : path.substring(0, fragmentIndex);\n const querySplit = noFragmentPath.split('?');\n\n if (querySplit.length === 2) {\n const queryValues: Indexed<string> = {};\n const query = querySplit[1];\n const queryItems = query.split('&');\n\n for (const item of queryItems) {\n const queryValue = item.split('=');\n const id = queryValue[0];\n const value = decodeURIComponent(queryValue[1]);\n\n queryValues[id] = value;\n }\n\n return queryValues;\n } else {\n return {};\n }\n}\n\n\nexport const extractFragments = (\n location?: string,\n): PluridRouteFragments => {\n if (!location) {\n return {\n texts: [],\n elements: [],\n };\n }\n\n const split = location.split('#:~:');\n const fragmentsValues = split[1];\n\n if (!fragmentsValues) {\n return {\n texts: [],\n elements: [],\n };\n }\n\n const fragmentItems = fragmentsValues.split('&');\n\n const textFragments: PluridRouteFragmentText[] = [];\n const elementFragments: PluridRouteFragmentElement[] = [];\n\n for (const item of fragmentItems) {\n const parsedFragment = parseFragment(item);\n if (parsedFragment) {\n switch (parsedFragment.type) {\n case 'text':\n textFragments.push(parsedFragment);\n break;\n case 'element':\n elementFragments.push(parsedFragment);\n break;\n }\n }\n }\n\n return {\n texts: textFragments,\n elements: elementFragments,\n };\n}\n\n\nexport const parseFragment = (\n fragment: string,\n): PluridRouteFragmentText | PluridRouteFragmentElement | undefined => {\n const fragmentData = fragment.split('=');\n const fragmentType = fragmentData[0];\n const fragmentValues = fragmentData[1];\n\n switch (fragmentType.toLowerCase()) {\n case 'text':\n {\n const textValues = fragmentValues.split(',');\n const textStart = textValues[0];\n const textEnd = textValues[1];\n const textOccurence = extractOccurence(textValues[2]);\n\n if (!textStart) {\n return;\n }\n\n return {\n type: 'text',\n start: textStart,\n end: textEnd || '',\n occurence: textOccurence,\n };\n }\n case 'element':\n {\n const elementValues = fragmentValues.split(',');\n const elementID = elementValues[0];\n const elementOccurence = extractOccurence(elementValues[1]);\n\n if (!elementID) {\n return;\n }\n\n return {\n type: 'element',\n id: elementID,\n occurence: elementOccurence,\n };\n }\n }\n\n return undefined;\n}\n\n\nexport const extractOccurence = (\n occurence: string | undefined,\n): number => {\n if (!occurence) {\n return 0;\n }\n\n const occurenceMatch = occurence.match(/\\[(\\d*)\\]/);\n const occurenceValue = occurenceMatch\n ? parseInt(occurenceMatch[1])\n : 0;\n\n return occurenceValue;\n}\n// #endregion module\n","// #region imports\n // #region imports\n import {\n protocols,\n PLURID_PROTOCOL,\n HTTPS_PROTOCOL,\n HTTP_PROTOCOL,\n } from '@plurid/plurid-data';\n // #endregion imports\n\n\n // #region external\n import {\n extractPathname,\n } from '~modules/routing/Parser/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const stringInsertInitial = (\n value: string,\n insert: string,\n) => {\n if (!value.startsWith(insert)) {\n value = insert + value;\n }\n\n return value;\n}\n\nexport const stringRemoveTrailing = (\n value: string,\n trail: string,\n) => {\n if (value.endsWith(trail)) {\n value = value.slice(0, value.length - trail.length);\n }\n\n return value;\n}\n\n\nconst PATH_SEPARATOR = '/';\n\nexport const cleanupPath = (\n value: string,\n) => {\n value = stringInsertInitial(value, PATH_SEPARATOR);\n value = stringRemoveTrailing(value, PATH_SEPARATOR);\n return value;\n}\n\n\nexport const computePlaneAddress = (\n plane: string,\n route?: string,\n origin: string = 'origin',\n) => {\n if (origin === 'origin' && typeof location !== 'undefined' && location.host) {\n origin = location.host;\n }\n\n const cleanPlane = extractPathname(plane);\n\n const planeAddressType = checkPlaneAddressType(cleanPlane);\n\n switch(planeAddressType) {\n case 'http':\n case 'https':\n case 'pttp':\n return cleanPlane;\n }\n\n origin = stringRemoveTrailing(origin, '/');\n\n const absolutePlane = isAbsolutePlane(plane)\n\n const path = route && route !== '/'\n ? absolutePlane\n ? cleanupPath(cleanPlane)\n : cleanupPath(route) + cleanupPath(cleanPlane)\n : cleanupPath(cleanPlane);\n\n const planeAddress = protocols.plurid + origin + path;\n\n return planeAddress;\n}\n\nexport const isAbsolutePlane = (\n value: string,\n) => {\n return value[0] === '/';\n}\n\n\nexport const checkPlaneAddressType = (\n value: string,\n) => {\n value = value\n .toLowerCase()\n .trim();\n\n if (value.startsWith(protocols.plurid)) {\n return 'pttp';\n }\n\n if (value.startsWith(protocols.https)) {\n return HTTPS_PROTOCOL;\n }\n\n if (value.startsWith(protocols.http)) {\n return HTTP_PROTOCOL;\n }\n\n return 'relative';\n}\n\n\nexport const removeTrailingSlash = (\n value: string,\n) => {\n if (value.endsWith('/') && value.length > 1) {\n return value.slice(0, value.length - 1);\n }\n\n return value;\n}\n\n\nexport const cleanPathValue = (\n value: string,\n) => {\n const queryStart = value.indexOf('?');\n if (queryStart < 0) {\n return removeTrailingSlash(\n value,\n );\n }\n\n return removeTrailingSlash(\n value.substring(0, queryStart),\n );\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n compareTypes,\n CompareType,\n Indexed,\n PluridRouteParameter,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const checkParameterLength = (\n parameter: string,\n length: number,\n compareType?: CompareType,\n) => {\n const parameterLength = parameter.length;\n\n switch (compareType) {\n case compareTypes.equal:\n return parameterLength === length;\n case compareTypes.equalLessThan:\n return parameterLength <= length;\n case compareTypes.lessThan:\n return parameterLength < length;\n case compareTypes.equalGreaterThan:\n return parameterLength >= length;\n case compareTypes.greaterThan:\n return parameterLength > length;\n default:\n return parameterLength <= length;\n }\n}\n\n\n\nexport const checkValidPath = <C>(\n validationParameters: Record<string, PluridRouteParameter> | undefined,\n parameters: Indexed<string>,\n) => {\n if (validationParameters) {\n for (const [parameterKey, parameterData] of Object.entries(validationParameters)) {\n const {\n length,\n lengthType,\n startsWith,\n endsWith,\n includes,\n } = parameterData;\n\n const paramaterValue = parameters[parameterKey];\n\n if (!paramaterValue) {\n return false;\n }\n\n if (startsWith && !paramaterValue.startsWith(startsWith)) {\n return false;\n }\n\n if (endsWith && !paramaterValue.endsWith(endsWith)) {\n return false;\n }\n\n if (includes && !includes.includes(paramaterValue)) {\n return false;\n }\n\n if (length) {\n const validLength = checkParameterLength(\n paramaterValue,\n length,\n lengthType,\n );\n return validLength;\n }\n }\n }\n\n return true;\n}\n// #endregion module\n","// #region module\nexport const cleanPathElement = (\n path: string,\n) => {\n if (path[0] === '/') {\n return path.slice(1);\n }\n\n return path;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n Indexed,\n PluridRoute,\n RouteDivisions,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n cleanPathElement,\n } from '~modules/utilities';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const mapPathsToRoutes = <C, V>(\n paths: Indexed<string>,\n view: V,\n) => {\n const routes: PluridRoute<C>[] = [];\n\n for (const [key, path] of Object.entries(paths)) {\n const pathView = (view as any)[key];\n\n if (pathView) {\n const route: PluridRoute<C> = {\n value: '',\n // path,\n // view: pathView,\n };\n routes.push(route);\n }\n }\n\n return routes;\n}\n\n\n\n// const interplanarExample = '://plane'; // or intraclusterial\n// const interclusterialExample = '://cluster://plane'; // or intrauniversal\n// const interuniversalExample = '://universe://cluster://plane'; // or intraspatial\n// const interspatialExample = '://space://universe://cluster://plane'; // or intraroutal\n// const interroutalExample = '://route://space://universe://cluster://plane';\n// const pluriversalExample = 'https://origin://route://space://universe://cluster://plane';\n// const pluriversalExampleControlledOrigin = 'https://corigin://route://space://universe://cluster://plane';\n// const pluriversalExampleForeignOrigin = 'https://forigin://route://space://universe://cluster://plane';\n\n\nexport const pluridLinkPathDivider = (\n route: string,\n): RouteDivisions => {\n // console.log('pluridLinkPathDivider route', route);\n\n const windowProtocol = typeof window === 'undefined'\n ? 'http'\n : window.location.protocol.replace(':', '');\n const windowHost = typeof window === 'undefined'\n ? 'localhost:63000'\n : window.location.host;\n\n const split = route\n .split('://')\n .filter(value => value !== '')\n .map(value => cleanPathElement(value));\n // console.log('SPLIT', split);\n\n let protocol = windowProtocol;\n const host = {\n value: windowHost,\n controlled: false,\n };\n const path = {\n value: '',\n parameters: {},\n query: {},\n };\n const space = {\n value: '',\n parameters: {},\n query: {},\n };\n const universe = {\n value: '',\n parameters: {},\n query: {},\n };\n const cluster = {\n value: '',\n parameters: {},\n query: {},\n };\n const plane = {\n value: '',\n parameters: {},\n query: {},\n fragments: {\n texts: [],\n elements: [],\n },\n };\n const valid = false;\n\n if (\n split.length === 0\n || split.length > 7\n ) {\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid,\n };\n return url;\n }\n\n if (route.startsWith('/://')) {\n const routeSplit = split.slice(1);\n switch (routeSplit.length) {\n case 1:\n path.value = routeSplit[0];\n break;\n case 5:\n path.value = routeSplit[0];\n space.value = routeSplit[1];\n universe.value = routeSplit[2];\n cluster.value = routeSplit[3];\n plane.value = routeSplit[4];\n break;\n }\n\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid: true,\n };\n // console.log('URL', url);\n\n return url;\n }\n\n if (\n split[0] !== 'http'\n && split[0] !== 'https'\n && split[0] !== 'chrome-extension'\n ) {\n switch (split.length) {\n case 1:\n plane.value = split[0];\n break;\n case 2:\n cluster.value = split[0];\n plane.value = split[1];\n break;\n case 3:\n universe.value = split[0];\n cluster.value = split[1];\n plane.value = split[2];\n break;\n case 4:\n space.value = split[0];\n universe.value = split[1];\n cluster.value = split[2];\n plane.value = split[3];\n break;\n case 5:\n path.value = split[0];\n space.value = split[1];\n universe.value = split[2];\n cluster.value = split[3];\n plane.value = split[4];\n break;\n case 6:\n host.value = split[0];\n path.value = split[1];\n space.value = split[2];\n universe.value = split[3];\n cluster.value = split[4];\n plane.value = split[5];\n break;\n default:\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid,\n };\n return url;\n }\n } else {\n switch (split.length) {\n case 3:\n protocol = split[0];\n host.value = split[1];\n path.value = split[2];\n break;\n case 7:\n protocol = split[0];\n host.value = split[1];\n path.value = split[2];\n space.value = split[3];\n universe.value = split[4];\n cluster.value = split[5];\n plane.value = split[6];\n break;\n default:\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid,\n };\n return url;\n }\n }\n\n const url = {\n protocol: {\n value: protocol,\n secure: true,\n },\n host,\n path,\n space,\n universe,\n cluster,\n plane,\n valid: true,\n };\n\n return url;\n}\n\n\n/**\n * Given a partial `route`, e.g. `/route`, or `://cluster://route`,\n * it resolves it to the absolute form\n * `protocol://origin://route://space://universe://cluster://plane`.\n *\n * @param path\n */\nexport const resolveRoute = (\n route: string,\n protocol?: string,\n host?: string,\n) => {\n const windowProtocol = typeof window === 'undefined'\n ? protocol || 'http'\n : window.location.protocol.replace(':', '');\n const windowHost = typeof window === 'undefined'\n ? host || 'localhost:63000'\n : window.location.host;\n\n const divisions = pluridLinkPathDivider(route);\n // console.log('resolveRoute > divisions', divisions);\n\n const defaultPathname = typeof window !== 'undefined'\n ? window.location.pathname === '/'\n ? 'p'\n : window.location.pathname.slice(1)\n : divisions.path.value\n ? divisions.path.value\n : 'p';\n\n const protocolDivision = divisions.protocol.value || windowProtocol;\n const hostDivision = divisions.host.value\n ? divisions.host\n : {\n value: windowHost,\n controlled: true,\n };\n const path = divisions.path.value\n ? divisions.path\n : {\n value: defaultPathname,\n parameters: {},\n query: {},\n };\n const space = divisions.space.value\n ? divisions.space\n : {\n value: 's',\n parameters: {},\n query: {},\n };\n const universe = divisions.universe.value\n ? divisions.universe\n : {\n value: 'u',\n parameters: {},\n query: {},\n };\n const cluster = divisions.cluster.value\n ? divisions.cluster\n : {\n value: 'c',\n parameters: {},\n query: {},\n };\n const plane = divisions.plane;\n\n const separator = '://';\n\n if (!plane.value && route !== '/') {\n const resolvers = [\n protocolDivision,\n hostDivision.value,\n path.value,\n ];\n const absoluteRoute = resolvers.join(separator);\n\n return {\n protocol: protocolDivision,\n host: hostDivision,\n path,\n space,\n universe,\n cluster,\n plane,\n route: absoluteRoute,\n };\n }\n\n const resolvers = [\n protocolDivision,\n hostDivision.value,\n path.value,\n space.value,\n universe.value,\n cluster.value,\n cleanPathElement(plane.value),\n ];\n const absoluteRoute = resolvers.join(separator);\n\n // return {\n // protocol: protocolDivision,\n // host: hostDivision,\n // path,\n // space,\n // universe,\n // cluster,\n // plane,\n // route: absoluteRoute,\n // };\n\n return {\n protocol: '',\n host: '',\n path,\n space: '',\n universe: '',\n cluster: '',\n plane: '',\n route: route,\n };\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n /** constants */\n defaultTreePlane,\n\n /** interfaces */\n TreePlane,\n LinkCoordinates,\n } from '@plurid/plurid-data';\n\n import {\n uuid,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n pluridLinkPathDivider,\n } from '~modules/routing/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const updateTreePlane = (\n tree: TreePlane[],\n page: TreePlane,\n): TreePlane[] => {\n const updatedTree = tree.map(treePlane => {\n if (treePlane.planeID === page.planeID) {\n return {\n ...page,\n };\n }\n\n if (treePlane.children) {\n return {\n ...treePlane,\n children: updateTreePlane(treePlane.children, page),\n };\n }\n\n return treePlane;\n });\n\n return updatedTree;\n}\n\n\n\nexport const updateTreeByPlaneIDWithLinkCoordinates = (\n tree: TreePlane[],\n planeID: string,\n linkCoordinates: LinkCoordinates,\n): TreePlane[] => {\n const updatedTree = tree.map(treePlane => {\n if (treePlane.planeID === planeID) {\n const updatedPlane = {\n ...treePlane,\n linkCoordinates,\n };\n\n return updatedPlane;\n }\n\n if (treePlane.children) {\n const updatedChildren = updateTreeByPlaneIDWithLinkCoordinates(\n treePlane.children,\n planeID,\n linkCoordinates,\n );\n\n const updatedPlane = {\n ...treePlane,\n children: updatedChildren,\n };\n\n return updatedPlane;\n }\n\n return treePlane;\n });\n\n return updatedTree;\n}\n// #endregion module\n","// #region imports\n // #region external\n import {\n WheelDeltas,\n } from '@plurid/plurid-data';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const getWheelDirection = (\n deltas: WheelDeltas,\n ABSTHRESHOLD: number = 10,\n THRESHOLD: number = 0,\n): string => {\n let direction = 'left';\n const wheelDeltaX = deltas.deltaX;\n const wheelDeltaY = deltas.deltaY;\n // console.log('PluridEngine :: wheelDeltaX', wheelDeltaX);\n // console.log('PluridEngine :: wheelDeltaY', wheelDeltaY);\n const absWheelDeltaX = Math.abs(wheelDeltaX);\n const absWheelDeltaY = Math.abs(wheelDeltaY);\n // console.log('PluridEngine :: absWheelDeltaX', absWheelDeltaX);\n // console.log('PluridEngine :: absWheelDeltaY', absWheelDeltaY);\n\n if (\n wheelDeltaX > THRESHOLD &&\n absWheelDeltaY < ABSTHRESHOLD &&\n absWheelDeltaX > absWheelDeltaY\n ) {\n direction = 'left';\n }\n\n if (\n wheelDeltaX < THRESHOLD &&\n absWheelDeltaY < ABSTHRESHOLD &&\n absWheelDeltaX > absWheelDeltaY\n ) {\n direction = 'right';\n }\n\n if (\n wheelDeltaY > THRESHOLD &&\n absWheelDeltaX < ABSTHRESHOLD &&\n absWheelDeltaY > absWheelDeltaX\n ) {\n direction = 'up';\n }\n\n if (\n wheelDeltaY < THRESHOLD &&\n absWheelDeltaX < ABSTHRESHOLD &&\n absWheelDeltaY > absWheelDeltaX\n ) {\n direction = 'down';\n }\n\n // if (positionX < threshold && positionY < threshold) {\n // direction = \"upleft\";\n // }\n\n // if (positionX < threshold && positionY > threshold ) {\n // direction = \"downleft\";\n // }\n\n // if (positionX > threshold && positionY > threshold ) {\n // direction = \"downright\";\n // }\n\n // if (positionX > threshold && positionY < threshold ) {\n // direction = \"upright\";\n // }\n\n return direction;\n};\n// #endregion module\n","// #region module\n/**\n * Converts degrees to radians.\n *\n * @param deg\n * @returns radians\n */\nexport const degToRad = (\n deg: number,\n): number => {\n // return deg * Math.PI / 180;\n return deg * 0.01745329252;\n};\n\n/**\n * Converts radians to degrees.\n *\n * @param deg\n * @returns degrees\n */\nexport const radToDeg = (\n rad: number,\n): number => {\n // return rad * 180 / Math.PI;\n return rad * 57.2957795131;\n};\n\n\n\nexport interface Quaternion {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\n/**\n *\n * @param x\n * @param y\n * @param z\n * @param w\n * @returns {Quaternion}\n */\nexport const makeQuaternion = (\n x: number,\n y: number,\n z: number,\n w: number,\n): Quaternion => {\n return {\n x,\n y,\n z,\n w,\n };\n};\n\n/**\n * Returns all-fields 0-ed quaternion.\n *\n * @returns {Quaternion}\n */\nexport const zeroQuaternion = (): Quaternion => {\n return makeQuaternion(0, 0, 0, 0);\n};\n\n/**\n *\n * @param quaternion\n */\nexport function inverseQuaternion(\n quaternion: Quaternion,\n): Quaternion {\n return makeQuaternion(\n quaternion.x,\n quaternion.y,\n quaternion.z,\n -quaternion.w,\n );\n}\n\n/**\n *\n * @param quaternion\n */\nexport function conjugateQuaternion(\n quaternion: Quaternion,\n): Quaternion {\n return makeQuaternion(\n -quaternion.x,\n -quaternion.y,\n -quaternion.z,\n quaternion.w,\n );\n}\n\n/**\n * Generates quaternion based on Euler angles (in radians).\n *\n * @param alpha around Z axis\n * @param beta around X axis\n * @param gamma around Y axis\n * @returns {Quaternion}\n */\nexport function computeQuaternionFromEulers(\n alpha: number,\n beta: number,\n gamma: number,\n radians = true,\n): Quaternion {\n const x = radians ? beta : degToRad(beta);\n const y = radians ? gamma : degToRad(gamma);\n const z = radians ? alpha : degToRad(alpha);\n\n const cX = Math.cos(x / 2);\n const cY = Math.cos(y / 2);\n const cZ = Math.cos(z / 2);\n const sX = Math.sin(x / 2);\n const sY = Math.sin(y / 2);\n const sZ = Math.sin(z / 2);\n\n const xQ = sX * cY * cZ - cX * sY * sZ;\n const yQ = cX * sY * cZ + sX * cY * sZ;\n const zQ = cX * cY * sZ + sX * sY * cZ;\n const wQ = cX * cY * cZ - sX * sY * sZ;\n\n return makeQuaternion(xQ, yQ, zQ, wQ);\n}\n\n/**\n *\n * @param x\n * @param y\n * @param z\n * @param angle\n */\nexport function quaternionFromAxisAngle(\n x: number,\n y: number,\n z: number,\n angle: number,\n): Quaternion {\n const q: Quaternion = zeroQuaternion();\n const halfAngle = angle / 2;\n const sine = Math.sin(halfAngle);\n\n q.x = x * sine;\n q.y = y * sine;\n q.z = z * sine;\n q.w = Math.cos(halfAngle);\n\n return q;\n}\n\n/**\n *\n * @param quaternionArray\n */\nexport function quaternionMultiply(\n quaternionArray: Quaternion[],\n): Quaternion {\n const firstQuaternion: Quaternion = quaternionArray[0];\n const valueQuaternion: Quaternion = {\n ...firstQuaternion,\n };\n\n for (let i = 1; i < quaternionArray.length; i++) {\n const nextQuaternion: Quaternion = quaternionArray[i];\n\n const w =\n valueQuaternion.w * nextQuaternion.w -\n valueQuaternion.x * nextQuaternion.x -\n valueQuaternion.y * nextQuaternion.y -\n valueQuaternion.z * nextQuaternion.z;\n\n const x =\n valueQuaternion.x * nextQuaternion.w +\n valueQuaternion.w * nextQuaternion.x +\n valueQuaternion.y * nextQuaternion.z -\n valueQuaternion.z * nextQuaternion.y;\n\n const y =\n valueQuaternion.y * nextQuaternion.w +\n valueQuaternion.w * nextQuaternion.y +\n valueQuaternion.z * nextQuaternion.x -\n valueQuaternion.x * nextQuaternion.z;\n\n const z =\n valueQuaternion.z * nextQuaternion.w +\n valueQuaternion.w * nextQuaternion.z +\n valueQuaternion.x * nextQuaternion.y -\n valueQuaternion.y * nextQuaternion.x;\n\n valueQuaternion.x = x;\n valueQuaternion.y = y;\n valueQuaternion.z = z;\n valueQuaternion.w = w;\n }\n\n return valueQuaternion;\n}\n\n/**\n *\n * @param pointRotate\n * @param quaternion\n */\nexport function rotatePointViaQuaternion(\n pointRotate: [number, number, number],\n quaternion: Quaternion,\n): Quaternion {\n const temporaryQuaternion: Quaternion = {\n x: pointRotate[0],\n y: pointRotate[1],\n z: pointRotate[2],\n w: 0,\n };\n const rotatedPointQuaternion = quaternionMultiply([\n quaternion,\n temporaryQuaternion,\n conjugateQuaternion(quaternion),\n ]);\n\n return rotatedPointQuaternion;\n}\n\n/**\n *\n * @param quaternion\n */\nexport function makeRotationMatrixFromQuaternion(\n quaternion: Quaternion,\n) {\n const num = quaternion.x * 2;\n const num2 = quaternion.y * 2;\n const num3 = quaternion.z * 2;\n const num4 = quaternion.x * num;\n const num5 = quaternion.y * num2;\n const num6 = quaternion.z * num3;\n const num7 = quaternion.x * num2;\n const num8 = quaternion.x * num3;\n const num9 = quaternion.y * num3;\n const num10 = quaternion.w * num;\n const num11 = quaternion.w * num2;\n const num12 = quaternion.w * num3;\n\n return [\n 1 - (num5 + num6), num7 - num12, num8 + num11, 0,\n num7 + num12, 1 - (num4 + num6), num9 - num10, 0,\n num8 - num11, num9 + num10, 1 - (num4 + num5), 0,\n 0, 0, 0, 1,\n ];\n}\n// #endregion module\n","// #region imports\n // #region external\n import {\n computeQuaternionFromEulers,\n // conjugateQuaternion,\n // inverseQuaternion,\n makeRotationMatrixFromQuaternion,\n // quaternionFromAxisAngle,\n quaternionMultiply,\n // rotatePointViaQuaternion,\n } from '../quaternion';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n *\n * @param xAngle\n * @param yAngle\n * @param zAngle\n */\nexport function rotateMatrix(\n xAngle: number, yAngle: number, zAngle: number = 0,\n): number[] {\n const xQuaternion = computeQuaternionFromEulers(0, xAngle, 0);\n const yQuaternion = computeQuaternionFromEulers(0, 0, yAngle);\n const zQuaternion = computeQuaternionFromEulers(zAngle, 0, 0);\n\n const quartenionMultiplication = quaternionMultiply([\n yQuaternion,\n xQuaternion,\n zQuaternion,\n ]);\n const rotationMatrix = makeRotationMatrixFromQuaternion(\n quartenionMultiplication,\n );\n\n // console.log('rotationMatrix', rotationMatrix);\n return rotationMatrix;\n}\n\n\n/**\n *\n * @param x\n * @param y\n * @param z\n */\nexport function translateMatrix(x: number, y: number, z: number): number[] {\n return [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n x, y, z, 1,\n ];\n}\n\n\n/**\n *\n * @param s\n */\nexport function scaleMatrix(s: number): number[] {\n return [\n s, 0, 0, 0,\n 0, s, 0, 0,\n 0, 0, s, 0,\n 0, 0, 0, 1,\n ];\n}\n\n\n/**\n *\n * @param matrixA\n * @param matrixB\n */\nexport function multiplyMatrices(\n matrixA: number[],\n matrixB: number[],\n): number[] {\n // https://github.com/toji/gl-matrix/blob/master/src/gl-matrix/mat4.js#L306-L337\n const result = [] as number[];\n\n const a00 = matrixA[0];\n const a01 = matrixA[1];\n const a02 = matrixA[2];\n const a03 = matrixA[3];\n const a10 = matrixA[4];\n const a11 = matrixA[5];\n const a12 = matrixA[6];\n const a13 = matrixA[7];\n const a20 = matrixA[8];\n const a21 = matrixA[9];\n const a22 = matrixA[10];\n const a23 = matrixA[11];\n const a30 = matrixA[12];\n const a31 = matrixA[13];\n const a32 = matrixA[14];\n const a33 = matrixA[15];\n\n // Cache only the current line of the second matrix\n let b0 = matrixB[0];\n let b1 = matrixB[1];\n let b2 = matrixB[2];\n let b3 = matrixB[3];\n result[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = matrixB[4];\n b1 = matrixB[5];\n b2 = matrixB[6];\n b3 = matrixB[7];\n result[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = matrixB[8];\n b1 = matrixB[9];\n b2 = matrixB[10];\n b3 = matrixB[11];\n result[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = matrixB[12];\n b1 = matrixB[13];\n b2 = matrixB[14];\n b3 = matrixB[15];\n result[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n result[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n result[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n result[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n return result;\n}\n\n\n/**\n *\n * @param matrices\n */\nexport function multiplyArrayOfMatrices(matrices: number[][]): number[] {\n let inputMatrix = matrices[0];\n\n for (let i = 1; i < matrices.length; i++) {\n inputMatrix = multiplyMatrices(inputMatrix, matrices[i]);\n }\n\n return inputMatrix;\n}\n\n// Create the matrix3d style property from a matrix array\nexport function matrixArrayToCSSMatrix(array: number[]): string {\n return 'matrix3d(' + array.join(',') + ')';\n}\n// #endregion module\n","// #region imports\n // #region external\n import {\n Quaternion,\n } from '../../quaternion';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport type Matrix = number[][];\n\n\n\nexport const getInitialMatrix = () => {\n const matrix: Matrix = [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n\n return matrix;\n}\n\n\nexport const multiplyMatrices = (\n m1: Matrix,\n m2: Matrix,\n): Matrix => {\n const result: Matrix = [];\n\n for (let i = 0; i < m1.length; i++) {\n result[i] = [];\n\n for (let j = 0; j < m2[0].length; j++) {\n let sum = 0;\n\n for (let k = 0; k < m1[0].length; k++) {\n sum += m1[i][k] * m2[k][j];\n }\n\n result[i][j] = sum;\n }\n }\n\n return result;\n}\n\n\n/**\n * Multiplies multiple `matrices`, must contain at least 2.\n *\n * @param matrices\n * @returns\n */\nexport const multiplyMatricesArray = (\n matrices: Matrix[],\n) => {\n if (matrices.length < 2) {\n throw new Error('invalid number of matrices');\n }\n\n const first = matrices[0];\n let result: Matrix = first;\n\n for (const [index, matrix] of matrices.entries()) {\n if (index === 0) {\n continue;\n }\n\n result = multiplyMatrices(\n result,\n matrix,\n );\n }\n\n return result;\n}\n\n\n\nexport const arrayToMatrix = (\n array: number[],\n): Matrix => {\n const matrix: Matrix = [];\n\n for (let i = 0; i < array.length; i += 4) {\n const row: number[] = [];\n\n row.push(array[i]);\n row.push(array[i + 1]);\n row.push(array[i + 2]);\n row.push(array[i + 3]);\n\n matrix.push(row);\n }\n\n return matrix;\n}\n\n\nexport const matrixToArray = (\n matrix: Matrix,\n) => {\n return matrix.flat();\n}\n\n\n/**\n * Parse a `matrix3d` string into a `Matrix`.\n *\n * @param value\n * @returns\n */\nexport const matrix3DToMatrix = (\n value: string,\n): Matrix => {\n const values = value\n .replace('matrix3d(', '')\n .replace(')', '')\n .split(',')\n .map(val => parseFloat(val));\n\n return arrayToMatrix(values);\n}\n\n\nexport const printMatrix = (\n matrix: Matrix,\n name: string,\n) => {\n const normalize = (\n value: number,\n ) => {\n if (value === 1 || value === 0) {\n return value + ' ';\n }\n\n if (value > 0) {\n return value.toFixed(2) + ' ';\n }\n\n return value.toFixed(2) + ' ';\n }\n\n\n console.log('matrix', name + ':');\n\n for (const row of matrix) {\n console.log(\n normalize(row[0]), normalize(row[1]), normalize(row[2]), normalize(row[3]),\n );\n }\n\n console.log(`matrix3d(${\n matrix.flat().join(',')\n })`);\n\n console.log();\n}\n\n\n\nexport const rotateXMatrix = (\n angle: number,\n): Matrix => {\n const x = Math.cos(angle);\n const y = -1 * Math.sin(angle);\n const z = Math.sin(angle);\n\n const m: Matrix = [\n [1, 0, 0, 0],\n [0, x, y, 0],\n [0, z, x, 0],\n [0, 0, 0, 1],\n ];\n\n return m;\n}\n\n\nexport const rotateYMatrix = (\n angle: number,\n): Matrix => {\n const x = Math.cos(angle);\n const y = -1 * Math.sin(angle);\n const z = Math.sin(angle);\n\n const m: Matrix = [\n [x, 0, z, 0],\n [0, 1, 0, 0],\n [y, 0, x, 0],\n [0, 0, 0, 1],\n ];\n\n return m;\n}\n\n\nexport const rotateZMatrix = (\n angle: number,\n): Matrix => {\n const x = Math.cos(angle);\n const y = -1 * Math.sin(angle);\n const z = Math.sin(angle);\n\n const m = [\n [x, y, 0, 0],\n [z, x, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n\n return m;\n}\n\n\nexport const translateMatrix = (\n x = 0,\n y = 0,\n z = 0,\n): Matrix => {\n const m = [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [x, y, z, 1],\n ];\n\n return m;\n}\n\n\nexport const scaleMatrix = (\n s: number,\n): Matrix => {\n return [\n [s, 0, 0, 0],\n [0, s, 0, 0],\n [0, 0, s, 0],\n [0, 0, 0, 1],\n ];\n}\n\n\n\n\nexport function rotationMatrixFromQuaternion(\n quaternion: Quaternion,\n): Matrix {\n const num = quaternion.x * 2;\n const num2 = quaternion.y * 2;\n const num3 = quaternion.z * 2;\n const num4 = quaternion.x * num;\n const num5 = quaternion.y * num2;\n const num6 = quaternion.z * num3;\n const num7 = quaternion.x * num2;\n const num8 = quaternion.x * num3;\n const num9 = quaternion.y * num3;\n const num10 = quaternion.w * num;\n const num11 = quaternion.w * num2;\n const num12 = quaternion.w * num3;\n\n return [\n [1 - (num5 + num6), num7 - num12, num8 + num11, 0],\n [num7 + num12, 1 - (num4 + num6), num9 - num10, 0],\n [num8 - num11, num9 + num10, 1 - (num4 + num5), 0],\n [0, 0, 0, 1],\n ];\n}\n\n\nexport const matrixToCSSMatrix = (\n matrix: Matrix,\n): string => {\n const value = matrix.flat().join(',');\n\n return `matrix3d(${value})`;\n}\n\n\n\nexport const identityMatrix = (): Matrix => {\n const matrix: Matrix = [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n\n return matrix;\n}\n\n\n/**\n * Inverse a matrix based on\n * https://github.com/josdejong/mathjs/blob/develop/src/function/matrix/inv.js\n *\n * @param matrix\n * @returns\n */\nexport const inverseMatrix = (\n matrix: Matrix,\n) => {\n const cols = 4;\n const rows = 4;\n\n const A: Matrix = [...matrix];\n const B = identityMatrix();\n\n let r: number;\n let s: number;\n let f: number;\n let temp: number[];\n\n // loop over all columns, and perform row reductions\n for (let c = 0; c < cols; c++) {\n // Pivoting: Swap row c with row r, where row r contains the largest element A[r][c]\n let ABig = Math.abs(A[c][c]);\n let rBig = c;\n r = c + 1;\n\n while (r < rows) {\n if (Math.abs(A[r][c]) > ABig) {\n ABig = Math.abs(A[r][c]);\n rBig = r;\n }\n r++;\n }\n\n if (ABig === 0) {\n throw Error('Cannot calculate inverse, determinant is zero')\n }\n\n r = rBig;\n if (r !== c) {\n temp = A[c]; A[c] = A[r]; A[r] = temp;\n temp = B[c]; B[c] = B[r]; B[r] = temp;\n }\n\n // eliminate non-zero values on the other rows at column c\n const Ac = A[c];\n const Bc = B[c];\n\n for (r = 0; r < rows; r++) {\n const Ar = A[r];\n const Br = B[r];\n\n if (r !== c) {\n // eliminate value at column c and row r\n if (Ar[c] !== 0) {\n f = -Ar[c] / Ac[c];\n\n // add (f * row c) to row r to eliminate the value\n // at column c\n for (s = c; s < cols; s++) {\n Ar[s] = Ar[s] + f * Ac[s];\n }\n for (s = 0; s < cols; s++) {\n Br[s] = Br[s] + f * Bc[s];\n }\n }\n } else {\n // normalize value at Acc to 1,\n // divide each value on row r with the value at Acc\n f = Ac[c];\n for (s = c; s < cols; s++) {\n Ar[s] = Ar[s] / f;\n }\n for (s = 0; s < cols; s++) {\n Br[s] = Br[s] / f;\n }\n }\n }\n }\n\n return B;\n}\n// #endregion module\n","// #region imports\n // #region external\n import {\n multiplyArrayOfMatrices,\n matrixArrayToCSSMatrix,\n rotateMatrix,\n translateMatrix,\n scaleMatrix,\n } from '../../matrix';\n\n // import { radToDeg } from './quaternion';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n * Converts the CSS string matrix3d into an array of numbers.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue('transform').\n * @returns Numbers array.\n */\nexport function getMatrixValues(\n matrix3d: string,\n): number[] {\n const matrixValues = matrix3d.split('(')[1].split(')')[0].split(',');\n const matrixValuesInt = [] as number[];\n for (let i = 0; i < matrixValues.length; i++) {\n matrixValuesInt[i] = parseFloat(matrixValues[i]);\n }\n return matrixValuesInt;\n}\n\n\n/**\n * Extracts the rotation matrix from the matrix3d CSS string.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue(\"transform\").\n * @returns Rotation matrix.\n */\nexport function getRotationMatrix(\n matrix3d: string,\n): number[] {\n const valuesMatrix = getMatrixValues(matrix3d);\n const scale = getScalationValue(matrix3d);\n\n if (valuesMatrix.length === 16) {\n for (let i = 0; i < 11; i++) {\n valuesMatrix[i] /= scale;\n }\n } else if (valuesMatrix.length === 6) {\n for (let i = 0; i < 4; i++) {\n valuesMatrix[i] /= scale;\n }\n }\n\n const rotationMatrix = valuesMatrix;\n\n return rotationMatrix;\n}\n\n\n/**\n * Extracts the translation matrix from the matrix3d CSS string.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue(\"transform\").\n * @returns Translation matrix.\n */\nexport function getTranslationMatrix(\n matrix3d: string,\n): number[] {\n const valuesMatrix = getMatrixValues(matrix3d);\n let translationMatrix: any;\n\n if (valuesMatrix.length === 16) {\n translationMatrix = getMatrixValues(matrix3d).slice(12, 15);\n } else if (valuesMatrix.length === 6) {\n translationMatrix = getMatrixValues(matrix3d).slice(4);\n }\n\n return translationMatrix;\n}\n\n\n/**\n * Extracts the scalation value from the matrix3d CSS string.\n *\n * @param matrix3d CSS string obtained from\n * window\n * .getComputedStyle(element)\n * .getPropertyValue(\"transform\").\n * @returns Scalation value.\n */\nexport function getScalationValue(\n matrix3d: string,\n): number {\n const valuesMatrix = getMatrixValues(matrix3d);\n let temp = 0;\n let scale: any;\n\n if (valuesMatrix.length === 16) {\n const scaleMatrix = getMatrixValues(matrix3d).slice(0, 4);\n scale = 0;\n\n // for (let i = 0; i < scaleMatrix.length; i++) {\n // scale += parseFloat(scaleMatrix[i]) * parseFloat(scaleMatrix[i]);\n // }\n for (const el of scaleMatrix) {\n scale += parseFloat(el as any) * parseFloat(el as any);\n }\n\n scale = parseFloat(Math.sqrt(scale).toPrecision(4));\n } else if (valuesMatrix.length === 6) {\n temp = valuesMatrix[0] * valuesMatrix[0] + valuesMatrix[1] * valuesMatrix[1];\n scale = parseFloat(Math.sqrt(temp).toPrecision(4));\n }\n\n return scale;\n}\n\n\n\n/**\n * Returns a a matrix3d CSS string.\n *\n * @param rotationMatrix\n * @param translationMatrix\n * @param scalationMatrix\n * @returns matrix3d CSS string.\n */\nexport function setTransform(\n rotationMatrix: number[],\n translationMatrix: number[],\n scalationMatrix: number[],\n): string {\n const transformMatrix = multiplyArrayOfMatrices([\n translationMatrix,\n rotationMatrix,\n scalationMatrix,\n ]);\n\n return matrixArrayToCSSMatrix(transformMatrix);\n}\n\n\n\nexport interface RotationValues {\n rotateX: number;\n rotateY: number;\n rotateZ: number;\n}\n\nexport function getTransformRotate(\n matrix3d: string,\n): RotationValues {\n const pi = Math.PI;\n const values: number[] = getRotationMatrix(matrix3d);\n // console.log('getRotationMatrix', values);\n // console.log(values);\n let rotateX: number = 0;\n let rotateY: number = 0;\n // let thetaX = 0;\n // let thetaY = 0;\n // let thetaZ = 0;\n\n // let theta1 = 0;\n // let theta2 = 0;\n // let phi1 = 0;\n // let phi2 = 0;\n // let phi = 0;\n // let theta = 0;\n // let psi = 0;\n\n\n\n if (values.length === 6) {\n const cosa = values[0];\n const sina = values[1];\n\n if (cosa === 1 && sina === 0) {\n rotateX = Math.asin(sina);\n rotateY = Math.acos(cosa);\n }\n }\n\n if (values.length === 16) {\n // RxRzRy\n // if (values[1] < 1) {\n // if (values[1] > -1) {\n // thetaZ = Math.asin(-1 * values[1]);\n // thetaX = Math.atan2(values[9], values[5]);\n // thetaY = Math.atan2(values[2], values[0]);\n // } else {\n // thetaZ = Math.PI / 2;\n // thetaX = -1 * Math.atan2(-1 * values[8], values[10]);\n // thetaY = 0;\n // }\n // } else {\n // thetaZ = -1 * Math.PI / 2;\n // thetaX = -1 * Math.atan2(-1 * values[8], values[10]);\n // thetaY = 0;\n // }\n\n // thetaZ = Math.asin(-1 * values[1]);\n // thetaX = Math.atan2(values[9], values[5]);\n // thetaY = Math.atan2(values[2], values[0]);\n\n\n // console.log('thetaX', thetaX);\n // console.log('thetaY', thetaY);\n // console.log('thetaZ', thetaZ);\n\n // const cosaX1 = values[5];\n // const sinaX3 = values[9];\n // // 0-180\n // if (sinaX3 <= 0) {\n // rotateX = Math.acos(cosaX1);\n // }\n // // // 181-360\n // if (sinaX3 > 0) {\n // rotateX = 2 * pi - Math.acos(cosaX1);\n // }\n // const cosaY1 = values[0];\n // const sinaY2 = values[2];\n // if (sinaY2 <= 0) {\n // rotateY = Math.acos(cosaY1);\n // }\n // if (sinaY2 > 0) {\n // rotateY = 2 * pi - Math.acos(cosaY1);\n // }\n const cosaX1 = values[5];\n const sinaX3 = values[9];\n // 0-180\n if (sinaX3 <= 0) {\n rotateX = Math.acos(cosaX1);\n }\n // // 181-360\n if (sinaX3 > 0) {\n rotateX = 2 * pi - Math.acos(cosaX1);\n }\n const cosaY1 = values[0];\n const sinaY2 = values[2];\n if (sinaY2 <= 0) {\n rotateY = Math.acos(cosaY1);\n }\n if (sinaY2 > 0) {\n rotateY = 2 * pi - Math.acos(cosaY1);\n }\n\n rotateX = Math.atan2(values[9], values[5]);\n rotateY = Math.atan2(values[2], values[0]);\n }\n\n // return {\n // rotateX: thetaX,\n // rotateY: thetaY,\n // rotateZ: thetaZ,\n // };\n\n return {\n rotateX,\n rotateY,\n rotateZ: 0,\n };\n}\n\n\nexport interface TranslationValues {\n translateX: number;\n translateY: number;\n translateZ: number;\n}\n\nexport function getTransformTranslate(\n matrix3d: string,\n): TranslationValues {\n const values: number[] = getTranslationMatrix(matrix3d);\n const translateX = values[0];\n const translateY = values[1];\n const translateZ = values[2];\n\n return {\n translateX,\n translateY,\n translateZ,\n };\n}\n\n\nexport interface ScalationValue {\n scale: number;\n}\n\nexport function getTransformScale(\n matrix3d: string,\n): ScalationValue {\n const scale = getScalationValue(matrix3d);\n return {\n scale,\n };\n}\n\n\n\nexport function rotatePlurid(\n matrix3d: string,\n direction: string = '',\n angleIncrement: number = 0.07,\n): string {\n const transformRotate = getTransformRotate(matrix3d);\n const rotateX = transformRotate.rotateX;\n let rotateY = transformRotate.rotateY;\n const rotateZ = transformRotate.rotateZ;\n // console.log('ROTATE', radToDeg(rotateX), radToDeg(rotateY));\n\n const transformTranslate = getTransformTranslate(matrix3d);\n const translateX = transformTranslate.translateX;\n const translateY = transformTranslate.translateY;\n const translateZ = transformTranslate.translateZ;\n\n const scale = getTransformScale(matrix3d).scale;\n\n let valRotationMatrix = rotateMatrix(rotateX, rotateY, rotateZ);\n const valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n const valScalationMatrix = scaleMatrix(scale);\n\n // if (scale < 0.5) {\n // angleIncrement = 0.08;\n // } else {\n // angleIncrement = 0.03;\n // }\n\n if (direction === 'left') {\n rotateY -= angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n if (direction === 'right') {\n rotateY += angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n if (direction === 'up') {\n rotateY -= angleIncrement;\n // rotateX += angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n if (direction === 'down') {\n rotateY += angleIncrement;\n // rotateX -= angleIncrement;\n valRotationMatrix = rotateMatrix(rotateX, rotateY);\n }\n\n const transformedMatrix3d = setTransform(\n valRotationMatrix,\n valTranslationMatrix,\n valScalationMatrix,\n );\n return transformedMatrix3d;\n}\n\n\nexport function translatePlurid(\n matrix3d: string,\n direction: string = '',\n linearIncrement: number = 50,\n): string {\n const transformRotate = getTransformRotate(matrix3d);\n const rotateX = transformRotate.rotateX;\n const rotateY = transformRotate.rotateY;\n const rotateZ = transformRotate.rotateZ;\n\n const transformTranslate = getTransformTranslate(matrix3d);\n let translateX = transformTranslate.translateX;\n let translateY = transformTranslate.translateY;\n const translateZ = transformTranslate.translateZ;\n\n const scale = getTransformScale(matrix3d).scale;\n\n const valRotationMatrix = rotateMatrix(rotateX, rotateY, rotateZ);\n let valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n const valScalationMatrix = scaleMatrix(scale);\n\n scale < 0.5 ? linearIncrement = 50 : linearIncrement = 30;\n\n if (direction === 'left') {\n translateX += linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n if (direction === 'right') {\n translateX -= linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n if (direction === 'up') {\n translateY += linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n if (direction === 'down') {\n translateY -= linearIncrement;\n valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n }\n\n const transformedMatrix3d = setTransform(\n valRotationMatrix,\n valTranslationMatrix,\n valScalationMatrix,\n );\n return transformedMatrix3d;\n}\n\n\nexport function scalePlurid(\n matrix3d: string,\n direction: string = '',\n scaleIncrement: number = 0.05,\n): string {\n const transformRotate = getTransformRotate(matrix3d);\n const rotateX = transformRotate.rotateX;\n const rotateY = transformRotate.rotateY;\n const rotateZ = transformRotate.rotateZ;\n\n const transformTranslate = getTransformTranslate(matrix3d);\n const translateX = transformTranslate.translateX;\n const translateY = transformTranslate.translateY;\n const translateZ = transformTranslate.translateZ;\n\n let scale = getTransformScale(matrix3d).scale;\n\n const valRotationMatrix = rotateMatrix(rotateX, rotateY, rotateZ);\n const valTranslationMatrix = translateMatrix(translateX, translateY, translateZ);\n let valScalationMatrix = scaleMatrix(scale);\n\n if (direction === 'up') {\n scale -= scaleIncrement;\n if (scale < 0.1) { scale = 0.1; }\n valScalationMatrix = scaleMatrix(scale);\n }\n\n if (direction === 'down') {\n scale += scaleIncrement;\n if (scale > 4) { scale = 4; }\n valScalationMatrix = scaleMatrix(scale);\n }\n\n const transformedMatrix3d = setTransform(\n valRotationMatrix,\n valTranslationMatrix,\n valScalationMatrix,\n );\n return transformedMatrix3d;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n internationalization,\n InternationalizationLanguageType,\n InternationalizationFieldType,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst internatiolate = (\n lamguage: InternationalizationLanguageType,\n field: InternationalizationFieldType,\n) => {\n return internationalization[lamguage][field];\n}\n// #endregion module\n\n\n\n// #region exports\nexport default internatiolate;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridPlane,\n PluridPlaneObject,\n PluridRoutePlane,\n PluridRoutePlaneObject,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const resolvePluridPlaneData = <C>(\n plane: PluridPlane<C>,\n): PluridPlaneObject<C> => {\n if (\n Array.isArray(plane)\n ) {\n const [\n route,\n component,\n options,\n ] = plane;\n\n return {\n route,\n component,\n ...options,\n };\n }\n\n return plane;\n}\n\n\nexport const resolvePluridRoutePlaneData = <C>(\n plane: PluridRoutePlane<C>,\n): PluridRoutePlaneObject<C> => {\n if (\n Array.isArray(plane)\n ) {\n const [\n value,\n component,\n options,\n ] = plane;\n\n return {\n value,\n component,\n ...options,\n };\n }\n\n return plane;\n}\n\n\nexport const getPluridPlaneIDByData = (\n element: HTMLElement | null,\n): string => {\n if (!element) {\n return '';\n }\n\n const parent = element.parentElement;\n if (parent && parent.dataset.pluridPlane) {\n return parent.dataset.pluridPlane;\n }\n\n return getPluridPlaneIDByData(parent);\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridRoute,\n PluridRoutePlane,\n PluridPlane,\n\n IsoMatcherContext,\n IsoMatcherData,\n IsoMatcherIndexedRoute,\n IsoMatcherIndexedPlane,\n IsoMatcherPlaneType,\n IsoMatcherPlaneResult,\n IsoMatcherPlaneResultPlane,\n IsoMatcherPlaneResultRoutePlane,\n IsoMatcherResult,\n IsoMatcherRouteResult,\n\n protocols,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n resolvePluridPlaneData,\n resolvePluridRoutePlaneData,\n } from '~modules/planes/logic';\n\n import {\n computePlaneAddress,\n\n checkValidPath,\n\n cleanPathValue,\n } from '../logic';\n\n import {\n extractParametersAndMatch,\n extractQuery,\n extractFragments,\n // extractPathname,\n } from '../Parser/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n * The `IsoMatcher` gathers all the known information about `routes` and `planes`\n * and matches client-side or server-side, in-browser or in-plurid.\n */\nclass IsoMatcher<C> {\n private origin: string;\n\n private routesIndex: Map<string, IsoMatcherIndexedRoute<C>> = new Map();\n private planesIndex: Map<string, IsoMatcherIndexedPlane<C>> = new Map();\n\n private routesKeys: string[] = [];\n private planesKeys: string[] = [];\n\n\n constructor(\n data: IsoMatcherData<C>,\n origin: string = 'origin',\n ) {\n if (origin === 'origin' && typeof location !== 'undefined' && location.host) {\n this.origin = location.host;\n } else {\n this.origin = origin;\n }\n\n this.updateIndexes(\n data.routes || [],\n data.routePlanes || [],\n data.planes || [],\n );\n // console.log('this.routesIndex', this.routesIndex);\n // console.log('this.planesIndex', this.planesIndex);\n }\n\n\n /**\n * Matches a `path` with a known `route` or `plane`,\n * based on the strategy imposed by the `context`.\n *\n * @param path\n * @param context\n */\n public match(path: string, context: 'route'): IsoMatcherRouteResult<C> | undefined;\n public match(path: string): IsoMatcherPlaneResult<C> | undefined;\n public match(path: string, context: 'plane'): IsoMatcherPlaneResult<C> | undefined;\n public match(\n path: string,\n context: IsoMatcherContext = 'plane',\n ): IsoMatcherResult<C> | undefined {\n switch (context) {\n case 'plane':\n return this.matchPlane(path);\n case 'route':\n return this.matchRoute(path);\n }\n }\n\n /**\n * Dynammically update the planes and routes indexes.\n *\n * @param data\n */\n public index(\n data: IsoMatcherData<C>,\n ) {\n this.updateIndexes(\n data.routes || [],\n data.routePlanes || [],\n data.planes || [],\n );\n // console.log('this.routesIndex index', this.routesIndex);\n // console.log('this.planesIndex index', this.planesIndex);\n }\n\n /**\n * Clear all data.\n *\n */\n public clear() {\n this.routesIndex = new Map();\n this.planesIndex = new Map();\n this.routesKeys = [];\n this.planesKeys = [];\n }\n\n public getPlanesIndex() {\n return this.planesIndex;\n }\n\n\n /**\n * Creates a common data structure able to match and route accordingly.\n *\n */\n private updateIndexes(\n routes: PluridRoute<C>[],\n routePlanes: PluridRoutePlane<C>[],\n planes: PluridPlane<C>[],\n ) {\n this.indexPlanes(\n planes,\n 'Plane',\n );\n\n this.indexPlanes(\n routePlanes,\n 'RoutePlane',\n );\n\n for (const route of routes) {\n if (route.planes) {\n this.indexPlanes(\n route.planes,\n 'RoutePlane',\n route.value,\n );\n }\n\n this.routesIndex.set(\n route.value,\n {\n data: {\n ...route,\n },\n },\n );\n }\n\n this.routesKeys = Array.from(this.routesIndex.keys());\n this.planesKeys = Array.from(this.planesIndex.keys());\n }\n\n private indexPlanes(\n planes: PluridPlane<C>[] | PluridRoutePlane<C>[],\n kind: IsoMatcherPlaneType,\n parent?: string,\n ) {\n for (const plane of planes) {\n const planeData = kind === 'Plane'\n ? resolvePluridPlaneData(plane as PluridPlane<C>)\n : resolvePluridRoutePlaneData(plane as PluridRoutePlane<C>);\n\n const address = computePlaneAddress(\n kind === 'Plane'\n ? (planeData as any).route\n : (planeData as any).value,\n parent,\n this.origin,\n );\n\n const indexedPlane: any /** IsoMatcherIndexedPlane<C> */ = {\n kind,\n data: {\n ...planeData,\n },\n };\n if (parent) {\n indexedPlane['parent'] = parent;\n }\n\n this.planesIndex.set(\n address,\n indexedPlane,\n );\n }\n }\n\n\n private matchPlane(\n value: string,\n ) {\n const planeAddress = computePlaneAddress(\n value,\n undefined,\n this.origin,\n );\n\n const plane = this.planesIndex.get(planeAddress);\n\n if (plane) {\n const query = extractQuery(\n value,\n );\n const fragments = extractFragments(\n value,\n );\n\n const match = {\n value: planeAddress,\n fragments,\n query,\n parameters: {},\n };\n\n if (plane.kind === 'Plane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultPlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n return result;\n }\n\n if (plane.kind === 'RoutePlane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultRoutePlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n return result;\n }\n }\n\n\n for (const planePath of this.planesKeys) {\n const normalizedPlanePath = planePath.replace(protocols.plurid, '');\n const normalizedPlaneAddress = planeAddress.replace(protocols.plurid, '');\n\n const planePathSplit = normalizedPlanePath.split('/');\n const planeAddressSplit = normalizedPlaneAddress.split('/');\n\n // Not the same origin.\n if (planePathSplit[0] !== planeAddressSplit[0]) {\n continue;\n }\n\n // Length mismatch.\n if (planePathSplit.length !== planeAddressSplit.length) {\n continue;\n }\n\n // Check if the plane `address` is a parametrization of `planePath`.\n const parametersAndMatch = extractParametersAndMatch(\n normalizedPlaneAddress,\n normalizedPlanePath,\n );\n\n // console.log('normalizedPlaneAddress', normalizedPlaneAddress);\n // console.log('normalizedPlanePath', normalizedPlanePath);\n // console.log('parametersAndMatch', parametersAndMatch);\n if (parametersAndMatch.match) {\n const plane = this.planesIndex.get(planePath);\n if (!plane) {\n return;\n }\n\n const {\n parameters,\n } = parametersAndMatch;\n\n const validPath = checkValidPath(\n plane.data.parameters,\n parameters,\n );\n if (!validPath) {\n return;\n }\n\n const query = extractQuery(\n value,\n );\n const fragments = extractFragments(\n value,\n );\n\n const match = {\n value: planeAddress,\n fragments,\n query,\n parameters,\n };\n\n if (plane.kind === 'Plane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultPlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n\n return result;\n }\n\n if (plane.kind === 'RoutePlane') {\n const {\n kind,\n data,\n parent,\n } = plane;\n\n const result: IsoMatcherPlaneResultRoutePlane<C> = {\n kind,\n data,\n parent,\n match,\n };\n\n return result;\n }\n }\n }\n\n\n return;\n }\n\n private matchRoute(\n value: string,\n ) {\n const routeValue = cleanPathValue(value);\n const route = this.routesIndex.get(routeValue);\n\n if (route) {\n const query = extractQuery(\n value,\n );\n\n const result: IsoMatcherRouteResult<C> = {\n kind: 'Route',\n data: route.data,\n match: {\n // value: extractPathname(value),\n value: routeValue,\n query,\n parameters: {},\n },\n };\n\n return result;\n }\n\n\n for (const routePath of this.routesKeys) {\n // Check if the `value` is a parametrization of `routePath`.\n const routeSplit = routePath.split('/');\n const valueSplit = routeValue.split('/');\n\n // Length mismatch.\n if (routeSplit.length !== valueSplit.length) {\n continue;\n }\n\n const parametersAndMatch = extractParametersAndMatch(\n routeValue.slice(1),\n routePath.slice(1),\n );\n\n // console.log('value', value);\n // console.log('routePath', routePath);\n // console.log('parametersAndMatch', parametersAndMatch);\n if (parametersAndMatch.match) {\n const route = this.routesIndex.get(routePath);\n // console.log('route', route);\n if (!route) {\n return;\n }\n\n const {\n parameters,\n } = parametersAndMatch;\n\n const validPath = checkValidPath(\n route.data.parameters,\n parameters,\n );\n // console.log('validPath', validPath);\n if (!validPath) {\n return;\n }\n\n const query = extractQuery(\n routeValue,\n );\n\n const match = {\n // value: extractPathname(value),\n value: routeValue,\n query,\n parameters,\n };\n\n if (route) {\n const result: IsoMatcherRouteResult<C> = {\n kind: 'Route',\n data: route.data,\n match,\n };\n // console.log('route result', result);\n\n return result;\n }\n }\n }\n\n\n const routePlane = this.matchPlane(routeValue);\n // console.log('routePlane', value, this.planesIndex, routePlane);\n\n if (routePlane) {\n const result: IsoMatcherRouteResult<C> = {\n kind: 'RoutePlane',\n data: routePlane.data as any, // HACK\n match: {\n // value: extractPathname(value),\n value: routeValue,\n query: routePlane.match.query,\n parameters: routePlane.match.parameters,\n },\n };\n\n return result;\n }\n\n\n return;\n }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default IsoMatcher;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridRoute,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n // import {\n // Route,\n // } from '../Router/interfaces';\n // #endregion external\n\n\n // #region internal\n import {\n ParserOptions,\n ParserPartialOptions,\n ParserResponse,\n } from './interfaces';\n\n import {\n extractPathname,\n extractParametersAndMatch,\n extractQuery,\n extractFragments,\n } from './logic';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nexport default class Parser<C> {\n /** properties */\n private location: string;\n private path: PluridRoute<C>;\n private options: ParserOptions;\n\n\n /** constructor */\n constructor(\n location: string,\n path: PluridRoute<C>,\n options?: ParserPartialOptions,\n ) {\n this.location = location;\n this.path = path;\n this.options = this.handleOptions(options);\n }\n\n\n /** private */\n private handleOptions(\n options: ParserPartialOptions | undefined,\n ) {\n const parserOptions: ParserOptions = {\n fragment: options?.fragment || true,\n };\n\n return parserOptions;\n }\n\n private extractPathname() {\n const pathname = extractPathname(\n this.location,\n );\n return pathname;\n }\n\n private extractParametersAndMatch() {\n const parametersAndMatch = extractParametersAndMatch(\n this.location,\n this.path.value,\n );\n\n return parametersAndMatch;\n }\n\n private extractQuery() {\n const query = extractQuery(\n this.location,\n );\n return query;\n }\n\n private extractFragments() {\n const fragments = this.options.fragment\n ? extractFragments(this.location)\n : extractFragments();\n return fragments;\n }\n\n\n /** public */\n /**\n * Extract pathname, parameters, query, and fragment, if available.\n */\n public extract() {\n const pathname = this.extractPathname();\n const {\n match,\n parameters,\n elements,\n } = this.extractParametersAndMatch();\n const query = this.extractQuery();\n const queryData = Object\n .entries(query)\n .map(([key, value]) => {\n return key + '=' + value;\n }).join('&');\n const queryString = queryData\n ? '?' + queryData\n : '';\n const fragments = this.extractFragments();\n\n const parserResponse: ParserResponse<C> = {\n path: this.path,\n pathname,\n elements,\n match,\n parameters,\n query,\n fragments,\n route: pathname + queryString,\n };\n\n return parserResponse;\n }\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridPlane,\n RegisteredPluridPlane,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n IsoMatcher,\n } from '~modules/routing';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n * The planes registrar can be stored in-memory (server-side)\n * or on the `window.__pluridPlanesRegistrar__` object (browser-side).\n */\nclass PluridPlanesRegistrar<C> implements IPluridPlanesRegistrar<C> {\n private isoMatcher: IsoMatcher<C>;\n\n\n constructor(\n planes?: PluridPlane<C>[],\n origin = 'origin',\n ) {\n this.isoMatcher = new IsoMatcher(\n {\n planes,\n },\n origin,\n );\n }\n\n\n public register(\n planes: PluridPlane<C>[],\n ) {\n this.isoMatcher.index({\n planes,\n });\n }\n\n public identify() {\n const planes = this.isoMatcher.getPlanesIndex();\n return [...planes.keys()];\n }\n\n public get(\n route: string,\n ) {\n const match = this.isoMatcher.match(route);\n\n if (match) {\n const absoluteRoute = match.kind === 'Plane'\n ? match.data.route\n : match.data.value;\n\n const registeredPlane: RegisteredPluridPlane<C> = {\n route: {\n absolute: absoluteRoute,\n fragments: match.match.fragments,\n parameters: match.match.parameters,\n query: match.match.query,\n },\n component: match.data.component,\n };\n\n return registeredPlane;\n }\n\n return;\n }\n\n public getAll() {\n const planes = this.isoMatcher.getPlanesIndex();\n const all = new Map();\n\n for (const [path, plane] of planes) {\n const absoluteRoute = plane.kind === 'Plane'\n ? plane.data.route\n : plane.data.value;\n\n const registeredPlane: RegisteredPluridPlane<C> = {\n route: {\n absolute: absoluteRoute,\n fragments: {\n elements: [],\n texts: [],\n },\n parameters: {},\n query: {},\n },\n component: plane.data.component,\n };\n\n all.set(\n path,\n registeredPlane,\n );\n }\n\n return all;\n }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default PluridPlanesRegistrar;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridPlane,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n\n PluridalWindow,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region internal\n import PluridPlanesRegistrar from './object';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nconst registerPlanes = <C>(\n planes?: PluridPlane<C>[],\n planesRegistrar?: IPluridPlanesRegistrar<C>,\n origin = 'origin',\n) => {\n if (!planes) {\n return;\n }\n\n if (planesRegistrar) {\n planesRegistrar.register(planes);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n if (typeof (window as PluridalWindow<C>).__pluridPlanesRegistrar__ === 'undefined') {\n const pluridPlanesRegistrar = new PluridPlanesRegistrar<C>([], origin);\n (window as PluridalWindow<C>).__pluridPlanesRegistrar__ = pluridPlanesRegistrar;\n (window as PluridalWindow<C>).__pluridPlanesRegistrar__.register(planes);\n return;\n }\n\n (window as PluridalWindow<C>).__pluridPlanesRegistrar__.register(planes);\n\n return;\n}\n\n\nconst getPlanesRegistrar = <C>(\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n) => {\n if (planesRegistrar) {\n return planesRegistrar;\n }\n\n if (typeof window !== 'undefined') {\n if ((window as PluridalWindow<C>).__pluridPlanesRegistrar__ !== undefined) {\n return (window as PluridalWindow<C>).__pluridPlanesRegistrar__;\n }\n }\n\n return;\n}\n\n\nconst getRegisteredPlanes = <C>(\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n) => {\n if (planesRegistrar) {\n return planesRegistrar.getAll();\n }\n\n if (typeof window !== 'undefined') {\n if ((window as PluridalWindow<C>).__pluridPlanesRegistrar__ !== undefined) {\n return (window as PluridalWindow<C>).__pluridPlanesRegistrar__.getAll();\n }\n }\n\n return new Map();\n}\n\n\nconst getRegisteredPlane = <C>(\n route: string,\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n) => {\n if (planesRegistrar) {\n return planesRegistrar.get(route);\n }\n\n if (typeof window !== 'undefined') {\n if ((window as PluridalWindow<C>).__pluridPlanesRegistrar__ !== undefined) {\n return (window as PluridalWindow<C>).__pluridPlanesRegistrar__.get(route);\n }\n }\n\n return;\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n registerPlanes,\n getPlanesRegistrar,\n getRegisteredPlanes,\n getRegisteredPlane,\n};\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n /** interfaces */\n TreePlane,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const computeSpaceSize = (\n tree: TreePlane[],\n) => {\n let width = 0;\n let height = 0;\n let depth = 0;\n const topCorner = {\n x: 0,\n y: 0,\n z: 0,\n };\n\n // console.log('tree', tree);\n tree.map(treePage => {\n // console.log('treePage', treePage);\n\n const spaceWidth = treePage.location.translateX + treePage.width;\n // console.log('spaceWidth', spaceWidth);\n if (spaceWidth > width) {\n width = spaceWidth;\n }\n\n const spaceHeight = treePage.location.translateY + treePage.height;\n // console.log('spaceHeight', spaceHeight);\n if (spaceHeight > height) {\n height = spaceHeight;\n }\n\n const spaceDepth = treePage.location.translateZ;\n // console.log('spaceDepth', spaceDepth);\n if (spaceDepth > depth) {\n depth = spaceDepth;\n }\n });\n\n // console.log('-------------');\n\n return {\n width,\n height,\n depth,\n topCorner,\n };\n}\n\n\nexport const findPage = (\n view: string,\n pages: TreePlane[],\n) => {\n for (const page of pages) {\n if (page.route === view) {\n return page;\n }\n }\n\n return;\n}\n\n\nexport const splitIntoGroups = <T>(\n data: T[],\n length: number,\n): T[][] => {\n const initialArray = [...data];\n const groups: any[] = [];\n\n while (initialArray.length) {\n const group = initialArray.splice(0, length);\n groups.push(group);\n }\n\n return groups;\n}\n\n\nexport const getTreePlaneByPlaneID = (\n tree: TreePlane[],\n planeID: string\n): TreePlane | null => {\n let _page = null;\n\n for (const page of tree) {\n if (page.planeID === planeID) {\n _page = page;\n }\n\n if (page.children && !_page) {\n _page = getTreePlaneByPlaneID(page.children, planeID);\n }\n\n if (_page) {\n break;\n }\n }\n\n return _page;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n /** constants */\n ROOTS_GAP,\n\n /** interfaces */\n PluridPlane,\n PluridConfiguration,\n TreePlane,\n SpaceLocation,\n LocationCoordinates,\n LinkCoordinates,\n TopPlanePoint,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n resolvePluridPlaneData,\n } from '~modules/planes';\n\n import {\n getTreePlaneByPlaneID,\n } from '../utilities';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst toRadians = mathematics.geometry.toRadians;\n\n\nexport const computePath = (\n tree: TreePlane[],\n planeID: string,\n): TreePlane[] => {\n const path: TreePlane[] = [];\n const page = getTreePlaneByPlaneID(tree, planeID);\n\n if (page) {\n path.push( { ...page} );\n\n let parentID = page.parentPlaneID;\n if (!parentID) {\n return path;\n }\n\n while (parentID) {\n const parentPage = getTreePlaneByPlaneID(tree, parentID);\n if (parentPage) {\n const page = { ...parentPage };\n page.children = [];\n path.push(page);\n parentID = parentPage.parentPlaneID;\n }\n }\n }\n\n return path.reverse();\n}\n\n\nexport const computePluridPlaneLocation = (\n linkCoordinates: LinkCoordinates,\n treePageParent: TreePlane,\n bridgeLength: number = 100,\n linkPlaneAngle: number = 90,\n): LocationCoordinates => {\n /** Compute the coordinates of the link. */\n const parentAngleRadians = toRadians(treePageParent.location.rotateY);\n const linkPoint: TopPlanePoint = {\n x: treePageParent.location.translateX + linkCoordinates.x * Math.cos(parentAngleRadians),\n z: treePageParent.location.translateZ - linkCoordinates.x * Math.sin(parentAngleRadians),\n };\n\n /** Compute the coordinates of the plane. */\n const linkAngleRadians = toRadians(linkPlaneAngle + treePageParent.location.rotateY);\n const x = linkPoint.x + bridgeLength * Math.cos(linkAngleRadians);\n const z = linkPoint.z - bridgeLength * Math.sin(linkAngleRadians);\n\n const y = treePageParent.location.translateY + linkCoordinates.y;\n\n const locationCoordinates: LocationCoordinates = {\n x,\n y,\n z,\n };\n\n return locationCoordinates;\n}\n\n\nexport const recomputeChildrenLocation = (\n page: TreePlane,\n): TreePlane[] => {\n if (!page.children) {\n return [];\n }\n\n const updatedChildren: TreePlane[] = [];\n\n for (const child of page.children) {\n if (child.linkCoordinates) {\n const location = computePluridPlaneLocation(\n child.linkCoordinates,\n page,\n child.bridgeLength,\n child.planeAngle,\n );\n\n const updatedChild = {\n ...child,\n location: {\n ...child.location,\n translateX: location.x,\n translateY: location.y,\n translateZ: location.z,\n },\n };\n\n const children = updatedChild.children\n ? recomputeChildrenLocation(updatedChild)\n : [];\n\n const updatedChildWithChildren = {\n ...updatedChild,\n children,\n };\n\n updatedChildren.push(updatedChildWithChildren);\n }\n }\n\n return updatedChildren;\n}\n\n\n\n\n\n\n/**\n * Compute translateX based on configuration layout if it exists\n * or based on the index of the root.\n *\n * @param configuration\n * @param root\n * @param index\n */\nexport const computeRootLocationX = <C>(\n configuration: PluridConfiguration | undefined,\n root: PluridPlane<C>,\n index: number,\n) => {\n const rootData = resolvePluridPlaneData(root);\n\n let translateX = 0;\n if (configuration && configuration.space) {\n if (Array.isArray(configuration.space.layout)) {\n const layoutIndex = configuration.space.layout.indexOf(rootData.route);\n translateX = window.innerWidth * layoutIndex + ROOTS_GAP * layoutIndex;\n }\n } else {\n translateX = index === 0\n ? 0\n : window.innerWidth * index + ROOTS_GAP * index;\n }\n\n return translateX;\n}\n\n\nexport const computeSpaceLocation = (\n configuration: PluridConfiguration,\n): SpaceLocation => {\n // if (configuration.space && configuration.space.layout) {\n // const {\n // layout,\n // } = configuration.space;\n\n // }\n\n const cameraLocationX = computeCameraLocationX(configuration);\n const spaceLocation = {\n rotationX: 0,\n rotationY: 0,\n translationX: cameraLocationX,\n translationY: 0,\n translationZ: 0,\n scale: 1,\n };\n\n return spaceLocation;\n}\n\n\n/**\n * Based on the specified camera, compute the X translation\n *\n * @param configuration\n */\nexport const computeCameraLocationX = (\n configuration: PluridConfiguration,\n) => {\n let translateX = 0;\n\n if (configuration.space\n && Array.isArray(configuration.space.layout)\n && typeof configuration.space.camera === 'string'\n ) {\n const layoutIndex = configuration.space.layout.indexOf(configuration.space.camera || '');\n translateX = window.innerWidth * layoutIndex + ROOTS_GAP * layoutIndex;\n }\n\n // account for camera space inversion\n return -1 * translateX;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridConfiguration,\n TreePlane,\n\n ROOTS_GAP,\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst computeColumnLayout = (\n roots: TreePlane[],\n columns: number = 1,\n columnLength?: number,\n gap: number = ROOTS_GAP,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n const configurationWidth = configuration.elements.plane.width;\n const width = mathematics.numbers.checkIntegerNonUnit(configurationWidth)\n ? configurationWidth\n : configurationWidth * windowInnerWidth;\n const height = windowInnerHeight;\n const gapValue = mathematics.numbers.checkIntegerNonUnit(gap)\n ? gap\n : gap * width;\n\n const length = columnLength || Math.ceil(roots.length / columns);\n\n for (const [index, root] of roots.entries()) {\n const rowIndex = index % length;\n const columnIndex = Math.floor(index / length);\n\n const translateX = columnIndex * (width + gapValue);\n const translateY = rowIndex * (height + gapValue);\n\n const treePage: TreePlane = {\n ...root,\n location: {\n translateX,\n translateY,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n };\n\n tree.push(treePageWithChildren);\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeColumnLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridConfiguration,\n TreePlane,\n\n ROOTS_GAP,\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst computeRowLayout = (\n roots: TreePlane[],\n rows: number = 1,\n rowLength?: number,\n gap: number = ROOTS_GAP,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n const configurationWidth = configuration.elements.plane.width;\n const width = mathematics.numbers.checkIntegerNonUnit(configurationWidth)\n ? configurationWidth\n : configurationWidth * windowInnerWidth;\n const height = windowInnerHeight;\n const gapValue = mathematics.numbers.checkIntegerNonUnit(gap)\n ? gap\n : gap * width;\n\n const length = rowLength || Math.ceil(roots.length / rows);\n\n for (const [index, root] of roots.entries()) {\n const rowIndex = Math.floor(index / length);\n const columnIndex = index % length;\n\n const translateX = columnIndex * (width + gapValue);\n const translateY = rowIndex * (height + gapValue);\n\n const treePage: TreePlane = {\n ...root,\n location: {\n translateX,\n translateY,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n };\n\n tree.push(treePageWithChildren);\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeRowLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n PluridConfiguration,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n splitIntoGroups,\n } from '../utilities';\n\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst toRadians = mathematics.geometry.toRadians;\n\n\nconst computeFaceToFaceTranslateZ = (\n width: number,\n angle: number,\n first: boolean,\n) => {\n if (first) {\n return width * Math.sin(toRadians(angle));\n }\n\n return 0;\n}\n\nconst computeFaceToFaceTranslateX = (\n width: number,\n angle: number,\n gap: number,\n first: boolean,\n index: number,\n) => {\n const firstTranslateX = width * Math.cos(toRadians(angle));\n if (first) {\n return firstTranslateX;\n }\n\n const value = width * (index - 1)\n + 2 * firstTranslateX\n + gap * index;\n return value;\n}\n\nconst computeFaceToFaceRotateY = (\n angle: number,\n first: boolean,\n last: boolean,\n) => {\n const rotateY = first\n ? angle\n : last\n ? -angle\n : 0;\n\n return rotateY;\n}\n\n\nconst computeFaceToFaceLayout = (\n roots: TreePlane[],\n angle: number = 45,\n gap: number = 0,\n middle: number = 0,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n const width = mathematics.numbers.checkIntegerNonUnit(configuration.elements.plane.width)\n ? configuration.elements.plane.width\n : configuration.elements.plane.width * windowInnerWidth;\n const height = windowInnerHeight;\n const planeAngle = 90 - angle / 2;\n const columns = 2 + middle;\n const rows = splitIntoGroups(roots, columns);\n\n const gapValue = Number.isInteger(gap)\n ? gap\n : gap * width;\n\n for (const [index, row] of rows.entries()) {\n const translateY = index * height;\n\n for (const [index, page] of row.entries()) {\n const first = index === 0;\n const last = index === columns - 1;\n\n const translateZ = computeFaceToFaceTranslateZ(\n width,\n planeAngle,\n first,\n );\n const translateX = computeFaceToFaceTranslateX(\n width,\n planeAngle,\n gapValue,\n first,\n index\n );\n const rotateY = computeFaceToFaceRotateY(\n planeAngle,\n first,\n last,\n );\n\n const treePage: TreePlane = {\n ...page,\n location: {\n translateX,\n translateY,\n translateZ,\n rotateX: 0,\n rotateY,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n }\n\n tree.push(treePageWithChildren);\n }\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeFaceToFaceLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n PluridConfiguration,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n\n import {\n mathematics,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst computeSheavesLayout = (\n roots: TreePlane[],\n depth: number = 0.3,\n offsetX: number = 0,\n offsetY: number = 0,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n\n const width = mathematics.numbers.checkIntegerNonUnit(configuration.elements.plane.width)\n ? configuration.elements.plane.width\n : configuration.elements.plane.width * windowInnerWidth;\n const height = windowInnerHeight;\n\n for (const [index, page] of roots.entries()) {\n const translateX = 0;\n const translateY = 0;\n\n const treePage: TreePlane = {\n ...page,\n location: {\n translateX,\n translateY,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n };\n\n const children = recomputeChildrenLocation(treePage);\n\n const treePageWithChildren = {\n ...treePage,\n children,\n }\n\n tree.push(treePageWithChildren);\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default computeSheavesLayout;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n PluridConfiguration,\n\n defaultConfiguration,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n recomputeChildrenLocation,\n } from '../location';\n // #endregion external\n\n\n // #region internal\n import computeColumnLayout from './column';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nconst computeZigZagLayout = (\n pages: TreePlane[],\n angle: number = 45,\n configuration: PluridConfiguration = defaultConfiguration,\n): TreePlane[] => {\n const windowInnerWidth = typeof window === 'undefined'\n ? 1440\n : window.innerWidth;\n const windowInnerHeight = typeof window === 'undefined'\n ? 840\n : window.innerHeight;\n\n const tree: TreePlane[] = [];\n\n const singleColumnedRoots = computeColumnLayout(pages, 1);\n\n for (const [index, page] of singleColumnedRoots.entries()) {\n const value = index % 2 === 0\n ? 1\n : -1;\n page.location.rotateY = value * angle;\n\n const children = recomputeChildrenLocation(page);\n\n const treePageWithChildren = {\n ...page,\n children,\n }\n\n tree.push(\n {...treePageWithChildren}\n );\n }\n\n return tree;\n}\n// #endregion module\n\n\n\n// #region external\nexport default computeZigZagLayout;\n// #endregion external\n","// #region imports\n // #region libraries\n import {\n /** constants */\n PLANE_DEFAULT_ANGLE,\n PLURID_ROUTE_SEPARATOR,\n\n /** enumerations */\n LAYOUT_TYPES,\n\n /** interfaces */\n PluridView,\n PluridApplicationView,\n PluridConfiguration,\n RegisteredPluridPlane,\n TreePlane,\n LinkCoordinates,\n PathParameters,\n PluridRoute,\n PluridPlane,\n } from '@plurid/plurid-data';\n\n import {\n uuid,\n } from '@plurid/plurid-functions';\n // #endregion libraries\n\n\n // #region external\n import {\n computeColumnLayout,\n computeRowLayout,\n computeFaceToFaceLayout,\n computeSheavesLayout,\n computeZigZagLayout,\n } from '../layout';\n\n import {\n computePluridPlaneLocation,\n } from '../location';\n\n import {\n getTreePlaneByPlaneID,\n } from '../utilities';\n\n import {\n IsoMatcher,\n } from '~modules/routing';\n\n import {\n computeComparingPath,\n extractParametersValues,\n } from '~modules/routing/Parser/logic';\n\n import {\n computePlaneAddress,\n } from '~modules/routing/logic';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst matchRouteElements = (\n routePath: string,\n viewPath: string,\n) => {\n // routePath = routePath[0] === '/'\n // ? routePath.slice(1)\n // : routePath;\n // viewPath = viewPath[0] === '/'\n // ? viewPath.slice(1)\n // : viewPath;\n\n // console.log('viewPath', viewPath);\n // console.log('routePath', routePath);\n\n if (routePath === viewPath) {\n return {\n value: viewPath,\n parameters: {},\n query: {},\n };\n }\n\n // console.log('viewPath', viewPath);\n // console.log('routePath', routePath);\n\n\n // check if viewPath is a parametrization of routePath\n const parameters: string[] = [];\n const routeSplit = routePath.slice(1).split('/');\n // console.log('routeSplit', routeSplit);\n\n routeSplit.forEach(routeElement => {\n if (routeElement[0] === ':') {\n parameters.push(routeElement);\n } else {\n parameters.push('');\n }\n });\n // console.log('parameters', parameters);\n\n const {\n locationElements,\n comparingPath,\n } = computeComparingPath(viewPath, parameters);\n // console.log('comparingPath', comparingPath);\n // console.log('routePath', routePath);\n // console.log('locationElements', locationElements);\n\n // if (comparingPath !== '/' + routePath) {\n // return;\n // }\n if (comparingPath !== routePath) {\n return;\n }\n\n const parametersValues = extractParametersValues(\n parameters,\n locationElements,\n );\n // console.log('parametersValues', parametersValues);\n return {\n value: viewPath,\n parameters: parametersValues,\n query: {},\n };\n}\n\n\nconst matchRouteToView = (\n route: string,\n view: string,\n): undefined | any => {\n // const routeSplit = route.split(PLURID_ROUTE_SEPARATOR);\n // const viewSplit = view.split(PLURID_ROUTE_SEPARATOR);\n\n // console.log('route', route);\n // console.log('view', view);\n // console.log('routeSplit', routeSplit);\n // console.log('viewSplit', viewSplit);\n\n\n // if (routeSplit.length !== viewSplit.length) {\n // return;\n // }\n\n const pathMatch = matchRouteElements(\n route,\n view,\n );\n // console.log('pathMatch', pathMatch);\n\n return {\n path: {\n ...pathMatch,\n },\n space: {\n // ...spaceMatch,\n },\n universe: {\n // ...universeMatch,\n },\n cluster: {\n // ...clusterMatch,\n },\n plane: {\n // ...planeMatch,\n },\n };\n\n\n\n\n // if (routeSplit.length !== viewSplit.length) {\n // return;\n // }\n\n // const routePath = routeSplit[2];\n // // if (!routePath) return;\n // const viewPath = viewSplit[2];\n // // if (!viewPath) return;\n // console.log('viewPath', viewPath);\n // const pathMatch = matchRouteElements(\n // routePath,\n // viewPath,\n // );\n // console.log('pathMatch', pathMatch);\n // if (!pathMatch) {\n // return;\n // }\n\n\n // const routeSpace = routeSplit[3];\n // // if (!routeSpace) return;\n // const viewSpace = viewSplit[3];\n // // if (!viewSpace) return;\n // const spaceMatch = matchRouteElements(\n // routeSpace,\n // viewSpace,\n // );\n // // console.log('spaceMatch', spaceMatch);\n // if (!spaceMatch) {\n // return;\n // }\n\n\n // const routeUniverse = routeSplit[4];\n // // if (!routeUniverse) return;\n // const viewUniverse = viewSplit[4];\n // // if (!viewUniverse) return;\n // const universeMatch = matchRouteElements(\n // routeUniverse,\n // viewUniverse,\n // );\n // // console.log('universeMatch', universeMatch);\n // if (!universeMatch) {\n // return;\n // }\n\n\n // const routeCluster = routeSplit[5];\n // // if (!routeCluster) return;\n // const viewCluster = viewSplit[5];\n // // if (!viewCluster) return;\n // const clusterMatch = matchRouteElements(\n // routeCluster,\n // viewCluster,\n // );\n // // console.log('clusterMatch', clusterMatch);\n // if (!clusterMatch) {\n // return;\n // }\n\n\n // const routePlane = routeSplit[6];\n // // if (!routePlane) return;\n // const viewPlane = viewSplit[6];\n // // if (!viewPlane) return;\n // const planeMatch = matchRouteElements(\n // routePlane,\n // viewPlane,\n // );\n // // console.log('planeMatch', planeMatch);\n // if (!planeMatch) {\n // return;\n // }\n\n // return {\n // path: {\n // ...pathMatch,\n // },\n // space: {\n // ...spaceMatch,\n // },\n // universe: {\n // ...universeMatch,\n // },\n // cluster: {\n // ...clusterMatch,\n // },\n // plane: {\n // ...planeMatch,\n // },\n // };\n}\n\n\n/**\n * Given a view resolve it to an absolute view\n * and compute a TreePlane if there is a RegisteredPluridPlane\n * for that absolute view.\n *\n * @param view\n */\nexport const resolveViewItem = <C>(\n planes: Map<string, RegisteredPluridPlane<C>>,\n view: string | PluridView,\n configuration: PluridConfiguration,\n origin = 'origin',\n): TreePlane | undefined => {\n // console.log('resolveViewItem', planes);\n\n const {\n protocol,\n host,\n } = configuration.network;\n\n const viewData = typeof view === 'string'\n ? view\n : view.plane;\n // console.log('viewData', viewData);\n\n const viewAddress = computePlaneAddress(\n viewData,\n undefined,\n origin,\n );\n // console.log('viewAddress', viewAddress);\n\n // const resolvedView = resolveRoute(\n // viewData,\n // protocol,\n // host,\n // );\n // console.log('resolvedView', resolvedView);\n\n const iPlanes = planes.values();\n const pluridPlanes: PluridPlane<C>[] = [];\n for (const iPlane of iPlanes) {\n // console.log('iPlane', iPlane);\n\n const plane: PluridPlane<C> = {\n route: iPlane.route.absolute,\n component: iPlane.component,\n };\n pluridPlanes.push(plane);\n }\n\n const isoMatcher = new IsoMatcher(\n {\n planes: pluridPlanes,\n },\n origin,\n );\n\n // const match = isoMatcher.match(resolvedView.route);\n const match = isoMatcher.match(viewData);\n // console.log('isoMatcher match', match);\n\n if (match) {\n const route = match.match.value;\n\n const treePlane: TreePlane = {\n sourceID: route,\n\n planeID: uuid.generate(),\n\n // route: resolvedView.route,\n route: viewAddress,\n\n routeDivisions: {\n protocol: {\n value: '',\n secure: false,\n },\n host: {\n value: host,\n controlled: true,\n },\n path: {\n parameters: {},\n query: {},\n value: '',\n },\n space: {\n parameters: {},\n query: {},\n value: '',\n },\n universe: {\n parameters: {},\n query: {},\n value: '',\n },\n cluster: {\n parameters: {},\n query: {},\n value: '',\n },\n plane: {\n parameters: {},\n fragments: {\n elements: [],\n texts: [],\n },\n query: {},\n value: '',\n },\n valid: true,\n },\n\n height: 0,\n width: 0,\n location: {\n translateX: 0,\n translateY: 0,\n translateZ: 0,\n rotateX: 0,\n rotateY: 0,\n },\n show: true,\n };\n\n return treePlane;\n }\n\n // for (const [route, _] of planes) {\n // // const routeMatch = matchRouteToView(\n // // route,\n // // resolvedView.route,\n // // );\n // // console.log('route', route);\n // // console.log('resolvedView.route', resolvedView.route);\n // // console.log('routeMatch', routeMatch);\n\n // if (resolvedView.route !== routeMatch.path.value) {\n // continue;\n // }\n // // if (!routeMatch) {\n // // continue;\n // // }\n\n // const treePlane: TreePlane = {\n // sourceID: route,\n\n // planeID: uuid.generate(),\n\n // route: resolvedView.route,\n\n // routeDivisions: {\n // protocol: {\n // value: '',\n // secure: false,\n // },\n // host: {\n // value: host,\n // controlled: true,\n // },\n // path: routeMatch.path,\n // space: routeMatch.space,\n // universe: routeMatch.universe,\n // cluster: routeMatch.cluster,\n // plane: routeMatch.plane,\n // valid: true,\n // },\n\n // height: 0,\n // width: 0,\n // location: {\n // translateX: 0,\n // translateY: 0,\n // translateZ: 0,\n // rotateX: 0,\n // rotateY: 0,\n // },\n // show: true,\n // };\n\n // return treePlane;\n // }\n\n return;\n}\n\n\n/**\n * Compute the space based on the layout.\n * If there is no configuration.space.layout, it uses the default '2 COLUMNS' layout.\n *\n * @param planes\n * @param configuration\n */\nexport const computeSpaceTree = <C>(\n planes: Map<string, RegisteredPluridPlane<C>>,\n view: PluridApplicationView,\n configuration: PluridConfiguration,\n origin = 'origin',\n): TreePlane[] => {\n // console.log('computeSpaceTree');\n // console.log('planes', planes);\n // console.log('configuration', configuration);\n // console.log('computeSpaceTree view', view);\n // console.log('computeSpaceTree origin', origin);\n\n const treePlanes: TreePlane[] = [];\n\n for (const viewItem of view) {\n const treePlane = resolveViewItem(\n planes,\n viewItem,\n configuration,\n origin,\n );\n\n if (treePlane) {\n treePlanes.push(treePlane);\n }\n }\n\n switch(configuration.space.layout.type) {\n case LAYOUT_TYPES.COLUMNS:\n {\n const {\n columns,\n columnLength,\n gap,\n } = configuration.space.layout;\n const columnLayoutTree = computeColumnLayout(\n treePlanes,\n columns,\n columnLength,\n gap,\n configuration,\n );\n return columnLayoutTree;\n }\n case LAYOUT_TYPES.ROWS:\n {\n const {\n rows,\n rowLength,\n gap,\n } = configuration.space.layout;\n const rowLayoutTree = computeRowLayout(\n treePlanes,\n rows,\n rowLength,\n gap,\n configuration,\n );\n return rowLayoutTree;\n }\n case LAYOUT_TYPES.ZIG_ZAG:\n {\n const {\n angle,\n } = configuration.space.layout;\n const zigzagLayoutTree = computeZigZagLayout(\n treePlanes,\n angle,\n configuration,\n );\n return zigzagLayoutTree;\n }\n case LAYOUT_TYPES.FACE_TO_FACE:\n {\n const {\n angle,\n gap,\n middle,\n } = configuration.space.layout;\n const faceToFaceLayoutTree = computeFaceToFaceLayout(\n treePlanes,\n angle,\n gap,\n middle,\n configuration,\n );\n return faceToFaceLayoutTree;\n }\n case LAYOUT_TYPES.SHEAVES:\n {\n const {\n depth,\n offsetX,\n offsetY,\n } = configuration.space.layout;\n const sheavesLayoutTree = computeSheavesLayout(\n treePlanes,\n depth,\n offsetX,\n offsetY,\n configuration,\n );\n return sheavesLayoutTree;\n }\n case LAYOUT_TYPES.META:\n {\n return [];\n }\n default:\n return [];\n }\n}\n\n\nexport const isParametric = (\n viewRoute: string,\n planeRoute: string,\n) => {\n return true;\n}\n\nexport const matchForParameters = (\n viewRoute: string,\n planeRoute: string,\n) => {\n const splitViewRoute = viewRoute.split('://');\n const splitPlaneRoute = planeRoute.split('://');\n // \"http://localhost:3000://p://s://u://c://one\"\n // \"http://localhost:3000://p://s://u://c://:id\"\n\n const pathViewRoute = splitViewRoute[2];\n const pathPlaneRoute = splitPlaneRoute[2];\n\n}\n\n\nexport const assignPagesFromView = (\n planes: TreePlane[],\n view?: PluridApplicationView,\n): TreePlane[] => {\n if (!view) {\n return planes;\n }\n\n const tree: TreePlane[] = [];\n\n // const routes: PluridRoute[] = pages.map(page => {\n // const route: PluridRoute = {\n // value: page.route,\n // // value: page.value,\n // // view: '',\n // };\n // return route;\n // });\n\n // const router = new Router(routes);\n\n // console.log('planes', planes);\n // console.log('view', view);\n\n for (const viewPlane of view) {\n if (typeof viewPlane === 'string') {\n for (const plane of planes) {\n if (viewPlane === plane.sourceID) {\n tree.push(plane);\n }\n\n if (isParametric(viewPlane, plane.sourceID)) {\n const parametricPlane = {\n ...plane,\n };\n parametricPlane.routeDivisions.plane.parameters.id = 'one';\n parametricPlane.routeDivisions.plane.value = 'one';\n parametricPlane.route = viewPlane;\n tree.push(parametricPlane);\n }\n }\n }\n }\n\n\n // for (const [index, viewPage] of view.entries()) {\n // const viewPagePath = typeof viewPage === 'string'\n // ? viewPage\n // : viewPage.path;\n\n // const matchedPage = router.match(viewPagePath);\n\n // console.log('matchedPage', matchedPage);\n\n // if (matchedPage) {\n // const page = pages.find(p => p.route === matchedPage?.path.value);\n // if (!page) {\n // break;\n // }\n\n // const newPage = {\n // ...page,\n // path: viewPagePath,\n // planeID: uuid.generate(),\n // };\n\n // const viewPageOrdinal = typeof viewPage === 'string'\n // ? index\n // : typeof viewPage.ordinal === 'number'\n // ? viewPage.ordinal\n // : index;\n\n // const treePage = tree[viewPageOrdinal];\n\n // if (typeof treePage === 'undefined') {\n // tree[viewPageOrdinal] = newPage;\n // } else {\n // let elementSet = false;\n // let pageIndex = viewPageOrdinal;\n\n // do {\n // const nextIndex = pageIndex + 1;\n // const nextTreePlane = tree[nextIndex];\n // if (typeof nextTreePlane === 'undefined') {\n // tree[nextIndex] = newPage;\n // elementSet = true;\n // }\n // } while (!elementSet);\n // }\n // }\n // }\n\n return tree;\n}\n\n\n\n\n\n\n\nexport const updateTreePlane = (\n tree: TreePlane[],\n updatedPlane: TreePlane,\n): TreePlane[] => {\n const updatedTree = tree.map(treePlane => {\n if (treePlane.planeID === updatedPlane.planeID) {\n return updatedPlane;\n }\n\n if (treePlane.children) {\n const children = updateTreePlane(\n treePlane.children,\n updatedPlane,\n );\n treePlane.children = children;\n return treePlane;\n }\n\n return treePlane;\n });\n\n return updatedTree;\n}\n\n\n\nexport interface UpdatedTreeWithNewPlane {\n pluridPlaneID: string;\n updatedTree: TreePlane[];\n updatedTreePlane?: TreePlane;\n}\n\nexport const updateTreeWithNewPlane = <C>(\n planeRoute: string,\n parentPlaneID: string,\n linkCoordinates: LinkCoordinates,\n tree: TreePlane[],\n planesRegistry: Map<string, RegisteredPluridPlane<C>>,\n configuration: PluridConfiguration,\n hostname = 'origin',\n): UpdatedTreeWithNewPlane => {\n const parentPlane = getTreePlaneByPlaneID(tree, parentPlaneID);\n // console.log('updateTreeWithNewPlane parentPlane', parentPlane);\n\n if (!parentPlane) {\n return {\n pluridPlaneID: '',\n updatedTree: tree,\n };\n }\n\n const location = computePluridPlaneLocation(\n linkCoordinates,\n parentPlane,\n );\n // console.log('location', location);\n // console.log('planeRoute', planeRoute);\n\n const treePlane = resolveViewItem(\n planesRegistry,\n planeRoute,\n configuration,\n hostname,\n );\n // console.log('updateTreeWithNewPlane treePlane', treePlane);\n\n if (!treePlane) {\n return {\n pluridPlaneID: '',\n updatedTree: tree,\n };\n }\n\n const updatedTreePlane = {\n ...treePlane,\n parentPlaneID,\n location: {\n translateX: location.x,\n translateY: location.y,\n translateZ: location.z,\n rotateX: 0,\n rotateY: parentPlane.location.rotateY + PLANE_DEFAULT_ANGLE,\n },\n bridgeLength: 100,\n planeAngle: 90,\n linkCoordinates,\n };\n // console.log('updatedTreePlane', updatedTreePlane);\n\n\n // const newPlane: TreePlane = {\n // sourceID: '',\n // route: planePath,\n // routeDivisions: {\n // protocol: '',\n // host: {\n // value: '',\n // controlled: false,\n // },\n // path: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // space: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // universe: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // cluster: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // plane: {\n // value: '',\n // parameters: {},\n // query: {},\n // },\n // valid: false,\n // },\n // // parameters: extractedParameters,\n // // parameters: {},\n // planeID,\n // width: 0,\n // height: 0,\n // parentPlaneID,\n // location: {\n // translateX: location.x,\n // translateY: location.y,\n // translateZ: location.z,\n // rotateX: 0,\n // rotateY: parentPlane.location.rotateY + PLANE_DEFAULT_ANGLE,\n // },\n // show: true,\n // bridgeLength: 100,\n // planeAngle: 90,\n // linkCoordinates,\n // };\n // console.log('newPlane', newPlane);\n\n const updatedParentPlane: TreePlane = {\n ...parentPlane,\n };\n\n if (updatedParentPlane.children) {\n updatedParentPlane.children.push(updatedTreePlane);\n } else {\n updatedParentPlane.children = [updatedTreePlane];\n }\n\n const updatedTree = updateTreePlane(tree, updatedParentPlane);\n\n return {\n pluridPlaneID: updatedTreePlane.planeID,\n updatedTree,\n updatedTreePlane,\n };\n}\n\n\nexport const updatePlaneLocation = (\n tree: TreePlane[],\n parentPlaneID: string,\n planeID: string,\n linkCoordinates: LinkCoordinates,\n) => {\n const parentPlane = getTreePlaneByPlaneID(tree, parentPlaneID);\n const plane = getTreePlaneByPlaneID(tree, planeID);\n\n if (!parentPlane || !plane) {\n return tree;\n }\n\n const location = computePluridPlaneLocation(\n linkCoordinates,\n parentPlane,\n );\n\n plane.location = {\n translateX: location.x,\n translateY: location.y,\n translateZ: location.z,\n rotateX: 0,\n rotateY: parentPlane.location.rotateY + PLANE_DEFAULT_ANGLE,\n };\n\n const updatedTree = updateTreePlane(\n tree,\n plane,\n );\n\n return updatedTree;\n}\n\n\n\nexport const updateTreeWithNewPage = (\n tree: TreePlane[],\n treePageParentPlaneID: string,\n pagePath: string,\n pageID: string,\n linkCoordinates: LinkCoordinates,\n parameters?: PathParameters,\n): UpdatedTreeWithNewPlane => {\n // to receive parameters and composePath from pagePath and parameters\n\n const treePageParent = getTreePlaneByPlaneID(tree, treePageParentPlaneID);\n // console.log('tree page parent', treePageParent);\n\n if (treePageParent) {\n const location = computePluridPlaneLocation(\n linkCoordinates,\n treePageParent,\n );\n\n // const extractedParameters = extractParameters(\n // pagePath,\n // parameters,\n // );\n\n const planeID = uuid.generate();\n const newTreePlane: TreePlane = {\n sourceID: pageID,\n route: pagePath,\n routeDivisions: {\n protocol: {\n value: '',\n secure: false,\n },\n host: {\n value: '',\n controlled: false,\n },\n path: {\n value: '',\n parameters: {},\n query: {},\n },\n space: {\n value: '',\n parameters: {},\n query: {},\n },\n universe: {\n value: '',\n parameters: {},\n query: {},\n },\n cluster: {\n value: '',\n parameters: {},\n query: {},\n },\n plane: {\n value: '',\n parameters: {},\n query: {},\n fragments: {\n texts: [],\n elements: [],\n },\n },\n valid: false,\n },\n // parameters: extractedParameters,\n // parameters: {},\n planeID,\n width: 0,\n height: 0,\n parentPlaneID: treePageParentPlaneID,\n location: {\n translateX: location.x,\n translateY: location.y,\n translateZ: location.z,\n rotateX: 0,\n rotateY: treePageParent.location.rotateY + PLANE_DEFAULT_ANGLE,\n },\n show: true,\n bridgeLength: 100,\n planeAngle: 90,\n linkCoordinates,\n };\n\n const updatedTreePlaneParent = {...treePageParent};\n if (updatedTreePlaneParent.children) {\n updatedTreePlaneParent.children.push(newTreePlane);\n } else {\n updatedTreePlaneParent.children = [newTreePlane];\n }\n\n const updatedTree = updateTreePlane(tree, updatedTreePlaneParent);\n\n return {\n pluridPlaneID: planeID,\n updatedTree,\n };\n }\n\n return {\n pluridPlaneID: '',\n updatedTree: tree,\n };\n}\n\n\nexport const removePageFromTree = (\n tree: TreePlane[],\n pluridPlaneID: string,\n): TreePlane[] => {\n const updatedTree = tree.filter(page => {\n if (page.planeID === pluridPlaneID) {\n return false;\n }\n\n if (page.children) {\n const pageTree = removePageFromTree(page.children, pluridPlaneID);\n page.children = pageTree;\n return page;\n }\n\n return page;\n });\n\n return updatedTree;\n}\n\n\nexport const toggleChildren = (\n children: TreePlane[],\n): TreePlane[] => {\n const updatedChildren = children.map(child => {\n if (child.children) {\n const updatedChild = {\n ...child,\n show: !child.show,\n children: toggleChildren(child.children),\n }\n return updatedChild;\n }\n\n const updatedChild: TreePlane = {\n ...child,\n show: !child.show,\n };\n return updatedChild;\n });\n\n return updatedChildren;\n}\n\n\nexport const toggleAllChildren = (\n tree: TreePlane[],\n show: boolean,\n) => {\n const updatedTree: TreePlane[] = [];\n\n for (const plane of tree) {\n if (plane.children) {\n plane.children = toggleAllChildren(\n plane.children,\n show,\n );\n }\n\n plane.show = show;\n\n updatedTree.push(plane);\n }\n\n return tree;\n}\n\n\nexport interface TogglePlaneFromTree {\n updatedTree: TreePlane[];\n updatedPlane: TreePlane | undefined;\n}\n\nexport const togglePlaneFromTree = (\n tree: TreePlane[],\n pluridPlaneID: string,\n forceShow?: boolean,\n): TogglePlaneFromTree => {\n const updatedTree: TreePlane[] = [];\n\n let updatedPlane: TreePlane | undefined;\n\n for (const plane of tree) {\n if (plane.planeID === pluridPlaneID) {\n const show = forceShow ?? !plane.show;\n\n const treeUpdatedPlane: TreePlane = {\n ...plane,\n show,\n };\n\n if (treeUpdatedPlane.children) {\n const children = toggleAllChildren(\n treeUpdatedPlane.children,\n show,\n );\n treeUpdatedPlane.children = children;\n }\n\n updatedTree.push(treeUpdatedPlane);\n updatedPlane = {\n ...treeUpdatedPlane,\n };\n\n continue;\n }\n\n\n if (plane.children) {\n const {\n updatedTree: childrenUpdatedTree,\n updatedPlane: childrenUpdatedPlane,\n } = togglePlaneFromTree(\n plane.children,\n pluridPlaneID,\n forceShow,\n );\n\n plane.children = [ ...childrenUpdatedTree ];\n updatedTree.push(plane);\n\n if (childrenUpdatedPlane) {\n updatedPlane = {\n ...childrenUpdatedPlane,\n };\n }\n\n continue;\n }\n\n\n updatedTree.push(plane);\n }\n\n return {\n updatedTree,\n updatedPlane,\n };\n}\n\n\nexport const getTreePlaneByID = (\n stateTree: TreePlane[],\n id: string | undefined,\n): TreePlane | undefined => {\n if (!id) {\n return;\n }\n\n for (const plane of stateTree) {\n if (plane.planeID === id) {\n return plane;\n }\n\n if (plane.children) {\n const found = getTreePlaneByID(\n plane.children,\n id,\n );\n\n if (found) {\n return found;\n }\n }\n }\n\n return;\n}\n\n\nexport const removeRootFromTree = (\n tree: TreePlane[],\n pluridPlaneID: string,\n) => {\n const updatedTree = tree.filter(plane => plane.planeID !== pluridPlaneID);\n\n return {\n updatedTree,\n };\n}\n\n\nexport const removePlaneFromTree = (\n tree: TreePlane[],\n pluridPlaneID: string,\n) => {\n const updatedTree: TreePlane[] = [];\n\n for (const plane of tree) {\n if (plane.planeID === pluridPlaneID) {\n continue;\n }\n\n if (plane.children) {\n const children = removePlaneFromTree(\n plane.children,\n pluridPlaneID,\n );\n plane.children = children;\n }\n\n updatedTree.push(plane);\n }\n\n return updatedTree;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n TreePlane,\n RegisteredPluridPlane,\n PluridConfiguration,\n PluridApplicationView,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region internal\n import {\n computeSpaceTree,\n } from './logic';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nexport interface TreeData<C> {\n planes: Map<string, RegisteredPluridPlane<C>>,\n view: PluridApplicationView,\n configuration: PluridConfiguration,\n previousTree?: TreePlane[],\n}\n\nexport default class Tree<C> {\n private data: TreeData<C>;\n private origin: string;\n\n constructor(\n data: TreeData<C>,\n origin: string = 'origin',\n ) {\n this.data = data;\n this.origin = origin;\n }\n\n public compute() {\n const {\n planes,\n view,\n configuration,\n } = this.data;\n\n return computeSpaceTree(\n planes,\n view,\n configuration,\n this.origin,\n );\n }\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n /** interfaces */\n PluridView,\n TreePlane,\n SpaceLocation,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import {\n findPage,\n } from '../utilities';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const computeViewTree = (\n pages: TreePlane[],\n view: string[] | PluridView[],\n): TreePlane[] => {\n const viewTree: TreePlane[] = [];\n\n for (const pageView of view) {\n const page = pages.find(p => p.route === pageView);\n\n if (page) {\n viewTree.push(page);\n }\n }\n\n return viewTree;\n}\n\n\n/**\n * Compute only the view within a given radius around the user.\n *\n * @param pages\n * @param view\n * @param location\n */\nexport const computeCulledView = (\n pages: TreePlane[],\n view: string[] | PluridView[],\n location: SpaceLocation,\n radius: number = 8000,\n) => {\n const culledView: string[] = [];\n\n for (const viewPage of view) {\n const path = typeof viewPage === 'string'\n ? viewPage\n : viewPage.plane;\n\n const page = findPage(\n path,\n pages,\n );\n if (!page) {\n return;\n }\n\n const pageInView = checkPageInView(\n page,\n location,\n radius,\n );\n\n if (pageInView) {\n culledView.push(\n page.route,\n );\n }\n }\n\n return culledView;\n}\n\n\nexport const checkPageInView = (\n page: TreePlane,\n location: SpaceLocation,\n radius: number,\n) => {\n const radiusLeft = location.translationX < 0\n ? Math.abs(location.translationX) - radius\n : -1 * location.translationX - radius;\n const radiusRight = location.translationX < 0\n ? Math.abs(location.translationX) + radius\n : -1 * location.translationX + radius;\n const locationX = page.location.translateX;\n\n const radiusTop = location.translationY < 0\n ? Math.abs(location.translationY) - radius\n : -1 * location.translationY - radius;\n const radiusBottom = location.translationY < 0\n ? Math.abs(location.translationY) + radius\n : -1 * location.translationY + radius;\n const locationY = page.location.translateY;\n\n const inViewOnX = radiusLeft <= locationX && locationX <= radiusRight;\n const inViewOnY = radiusTop <= locationY && locationY <= radiusBottom;\n\n if (\n inViewOnX && inViewOnY\n ) {\n return true;\n }\n\n return false;\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PluridApplicationView,\n PluridConfiguration,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n PluridState,\n PluridMetastateState,\n PluridStateSpace,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import * as space from '~modules/space';\n\n import {\n getRegisteredPlanes,\n } from '~modules/planes';\n // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst resolveSpace = <C>(\n view: PluridApplicationView,\n configuration: PluridConfiguration,\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n currentState: PluridState | undefined,\n localState: PluridState | undefined,\n precomputedState: Partial<PluridState> | undefined,\n contextState: PluridMetastateState | undefined,\n hostname = 'origin',\n) => {\n const registeredPlanes = getRegisteredPlanes(planesRegistrar);\n // console.log('resolveSpace > registeredPlanes', registeredPlanes);\n\n const spaceTree = new space.tree.Tree(\n {\n planes: registeredPlanes,\n configuration,\n view,\n },\n hostname,\n );\n // console.log('resolveSpace > spaceTree', spaceTree);\n\n const computedTree = spaceTree.compute();\n // console.log('resolveSpace > computedTree', computedTree);\n\n\n const stateSpace: PluridStateSpace = {\n loading: true,\n animatedTransform: false,\n transformTime: 450,\n scale: 1,\n rotationX: 0,\n rotationY: 0,\n translationX: 0,\n translationY: 0,\n translationZ: 0,\n activeUniverseID: '',\n camera: {\n x: 0,\n y: 0,\n z: 0,\n },\n viewSize: {\n width: 771,\n height: 764,\n },\n spaceSize: {\n width: 771,\n height: 764,\n depth: 0,\n topCorner: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n culledView: [],\n\n view,\n tree: computedTree,\n\n ...precomputedState?.space,\n ...contextState?.space,\n ...localState?.space,\n ...currentState?.space,\n };\n // console.log({stateSpace});\n\n if (currentState) {\n stateSpace.translationX = currentState.space.translationX;\n stateSpace.translationY = currentState.space.translationY;\n stateSpace.translationZ = currentState.space.translationZ;\n stateSpace.rotationX = currentState.space.rotationX;\n stateSpace.rotationY = currentState.space.rotationY;\n stateSpace.scale = currentState.space.scale;\n }\n\n if (localState && !currentState) {\n stateSpace.translationX = localState.space.translationX;\n stateSpace.translationY = localState.space.translationY;\n stateSpace.translationZ = localState.space.translationZ;\n stateSpace.rotationX = localState.space.rotationX;\n stateSpace.rotationY = localState.space.rotationY;\n stateSpace.scale = localState.space.scale;\n }\n\n return stateSpace;\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n resolveSpace,\n};\n// #endregion exports\n","// #region imports\n // #region libraries\n import themes, {\n Theme,\n THEME_NAMES,\n } from '@plurid/plurid-themes';\n\n import {\n PluridConfiguration,\n PluridStateThemes,\n PluridState,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst resolveThemes = (\n configuration: PluridConfiguration,\n precomputedState: Partial<PluridState> | undefined,\n) => {\n let generalTheme: Theme | undefined;\n let interactionTheme: Theme | undefined;\n\n if (typeof configuration.global.theme === 'object') {\n const {\n general,\n interaction,\n } = configuration.global.theme;\n\n if (typeof general === 'string') {\n if (Object.keys(THEME_NAMES).includes(general)) {\n generalTheme = (themes as any)[general];\n }\n }\n\n if (typeof interaction === 'string') {\n if (Object.keys(THEME_NAMES).includes(interaction)) {\n interactionTheme = (themes as any)[interaction];\n }\n }\n } else {\n if (Object.keys(THEME_NAMES).includes(configuration.global.theme)) {\n generalTheme = (themes as any)[configuration.global.theme];\n interactionTheme = (themes as any)[configuration.global.theme];\n }\n }\n\n const stateThemes: PluridStateThemes = {\n general: generalTheme || themes.plurid,\n interaction: interactionTheme || themes.plurid,\n ...precomputedState?.themes,\n };\n\n return stateThemes;\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n resolveThemes,\n};\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridApplicationView,\n PluridConfiguration,\n PluridPlanesRegistrar as IPluridPlanesRegistrar,\n PluridState,\n PluridMetastateState,\n\n RecursivePartial,\n } from '@plurid/plurid-data';\n // #endregion libraries\n\n\n // #region external\n import * as generalEngine from '../../general';\n // #endregion external\n\n\n // #region internal\n import {\n resolveSpace,\n } from './space';\n\n import {\n resolveThemes,\n } from './themes';\n // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nconst compute = <C>(\n view: PluridApplicationView,\n configuration: RecursivePartial<PluridConfiguration> | undefined,\n planesRegistrar: IPluridPlanesRegistrar<C> | undefined,\n currentState: PluridState | undefined,\n localState: PluridState | undefined,\n precomputedState: Partial<PluridState> | undefined,\n contextState: PluridMetastateState | undefined,\n hostname = 'origin',\n) => {\n // TODO\n // the compute call also needs to make clear the nature of the change\n // i.e. if any of the states overwrite the current state\n // or if the current state takes precedence.\n\n let stateConfiguration = generalEngine.configuration.merge(configuration);\n\n const configurations = [\n precomputedState?.configuration,\n contextState?.configuration,\n localState?.configuration,\n currentState?.configuration,\n ];\n\n for (const configuration of configurations) {\n if (configuration) {\n stateConfiguration = generalEngine.configuration.merge(configuration);\n }\n }\n\n const stateSpace = resolveSpace(\n view,\n stateConfiguration,\n planesRegistrar,\n currentState,\n localState,\n precomputedState,\n contextState,\n hostname,\n );\n\n const stateThemes = resolveThemes(\n stateConfiguration,\n precomputedState,\n );\n\n\n const state: PluridState = {\n configuration: {\n ...stateConfiguration,\n },\n shortcuts: {\n global: true,\n ...precomputedState?.shortcuts,\n },\n space: {\n ...stateSpace,\n },\n themes: {\n ...stateThemes,\n },\n ui: {\n toolbarScrollPosition: 0,\n ...precomputedState?.ui,\n ...contextState?.ui,\n },\n };\n\n return state;\n}\n// #endregion module\n\n\n\n// #region exports\nexport default compute;\n// #endregion exports\n","// #region imports\n // #region libraries\n import {\n PluridState,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst load = (\n id: string | undefined,\n useLocalStorage: boolean | undefined,\n) => {\n if (!useLocalStorage) {\n return;\n }\n\n if (typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n const stateID = id || 'default';\n\n const stateData = localStorage.getItem('pluridState-' + stateID);\n\n if (!stateData) {\n return;\n }\n\n const state: PluridState = JSON.parse(stateData);\n\n // TODO\n // check state conforms to the PluridState datashape using datasign\n\n return state;\n } catch (error) {\n return;\n }\n}\n// #endregion module\n\n\n\n// #region exports\nexport {\n load,\n};\n// #endregion exports\n","// #region module\nexport const cleanTemplate = (\n template: string,\n) => {\n return template\n .replace(/(?:\\r\\n|\\r|\\n)/g, ' ')\n .replace(/ +/g, ' ')\n .trim();\n}\n// #endregion module\n","// #region imports\n // #region libraries\n import {\n PLURID_ROUTER_LOCATION_CHANGED,\n } from '@plurid/plurid-data';\n // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const pluridRouterNavigate = (\n path: string,\n) => {\n if (!CustomEvent || !window) {\n return;\n }\n\n const event = new CustomEvent(\n PLURID_ROUTER_LOCATION_CHANGED,\n {\n detail: {\n path,\n },\n },\n );\n\n window.dispatchEvent(event);\n}\n// #endregion module\n"],"names":["resolveTheme","theme","type","general","interaction","merge","configuration","target","targetConfiguration","Object","assign","objects","clone","defaultConfiguration","mergedConfiguration","_a","global","_b","extractPathname","location","queryIndex","indexOf","noQueryPath","substring","fragmentIndex","noFragmentPath","extractParametersAndMatch","route","routeElements","splitPath","parameters","forEach","routeElement","push","locationElements","comparingPath","computeComparingPath","match","elements","parametersValues","extractParametersValues","pathElements","parameter","index","parameterKey","slice","path","pathname","comparingPathElements","keys","join","split","filter","i","extractQuery","querySplit","length","queryValues","query","queryItems","item","queryValue","id","value","decodeURIComponent","extractFragments","texts","fragmentsValues","fragmentItems","textFragments","elementFragments","parsedFragment","parseFragment","fragment","fragmentData","fragmentType","fragmentValues","toLowerCase","textValues","textStart","textEnd","textOccurence","extractOccurence","start","end","occurence","elementValues","elementID","elementOccurence","undefined","occurenceMatch","occurenceValue","parseInt","stringInsertInitial","insert","startsWith","stringRemoveTrailing","trail","endsWith","PATH_SEPARATOR","cleanupPath","computePlaneAddress","plane","origin","host","cleanPlane","planeAddressType","checkPlaneAddressType","absolutePlane","isAbsolutePlane","planeAddress","protocols","plurid","trim","https","HTTPS_PROTOCOL","http","HTTP_PROTOCOL","removeTrailingSlash","cleanPathValue","queryStart","checkParameterLength","compareType","parameterLength","compareTypes","equal","equalLessThan","lessThan","equalGreaterThan","greaterThan","checkValidPath","validationParameters","parameterData","entries","lengthType","includes","paramaterValue","validLength","cleanPathElement","mapPathsToRoutes","paths","view","routes","key","pathView","pluridLinkPathDivider","windowProtocol","window","protocol","replace","windowHost","map","controlled","space","universe","cluster","fragments","valid","url","secure","routeSplit","resolveRoute","divisions","defaultPathname","protocolDivision","hostDivision","separator","resolvers","absoluteRoute","updateTreePlane","tree","page","updatedTree","treePlane","planeID","children","updateTreeByPlaneIDWithLinkCoordinates","linkCoordinates","updatedPlane","updatedChildren","getWheelDirection","deltas","ABSTHRESHOLD","THRESHOLD","direction","wheelDeltaX","deltaX","wheelDeltaY","deltaY","absWheelDeltaX","Math","abs","absWheelDeltaY","degToRad","deg","radToDeg","rad","makeQuaternion","x","y","z","w","zeroQuaternion","inverseQuaternion","quaternion","conjugateQuaternion","computeQuaternionFromEulers","alpha","beta","gamma","radians","cX","cos","cY","cZ","sX","sin","sY","sZ","xQ","yQ","zQ","wQ","quaternionFromAxisAngle","angle","q","halfAngle","sine","quaternionMultiply","quaternionArray","firstQuaternion","valueQuaternion","nextQuaternion","rotatePointViaQuaternion","pointRotate","temporaryQuaternion","rotatedPointQuaternion","makeRotationMatrixFromQuaternion","num","num2","num3","num4","num5","num6","num7","num8","num9","num10","num11","num12","rotateMatrix","xAngle","yAngle","zAngle","xQuaternion","yQuaternion","zQuaternion","quartenionMultiplication","rotationMatrix","translateMatrix","scaleMatrix","s","multiplyMatrices","matrixA","matrixB","result","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","multiplyArrayOfMatrices","matrices","inputMatrix","matrixArrayToCSSMatrix","array","getInitialMatrix","matrix","m1","m2","j","sum","k","multiplyMatricesArray","Error","first","arrayToMatrix","row","matrixToArray","flat","matrix3DToMatrix","values","val","parseFloat","printMatrix","name","normalize","toFixed","console","log","rotateXMatrix","m","rotateYMatrix","rotateZMatrix","rotationMatrixFromQuaternion","matrixToCSSMatrix","identityMatrix","inverseMatrix","cols","rows","A","B","r","f","temp","c","ABig","rBig","Ac","Bc","Ar","Br","getMatrixValues","matrix3d","matrixValues","matrixValuesInt","getRotationMatrix","valuesMatrix","scale","getScalationValue","getTranslationMatrix","translationMatrix","el","sqrt","toPrecision","setTransform","scalationMatrix","transformMatrix","getTransformRotate","pi","PI","rotateX","rotateY","cosa","sina","asin","acos","cosaX1","sinaX3","cosaY1","sinaY2","atan2","rotateZ","getTransformTranslate","translateX","translateY","translateZ","getTransformScale","rotatePlurid","angleIncrement","transformRotate","transformTranslate","valRotationMatrix","valTranslationMatrix","valScalationMatrix","transformedMatrix3d","translatePlurid","linearIncrement","scalePlurid","scaleIncrement","internatiolate","lamguage","field","internationalization","resolvePluridPlaneData","Array","isArray","component","options","resolvePluridRoutePlaneData","getPluridPlaneIDByData","element","parent","parentElement","dataset","pluridPlane","IsoMatcher","constructor","data","this","routesIndex","Map","planesIndex","routesKeys","planesKeys","updateIndexes","routePlanes","planes","context","matchPlane","matchRoute","clear","getPlanesIndex","indexPlanes","set","from","kind","planeData","address","indexedPlane","get","planePath","normalizedPlanePath","normalizedPlaneAddress","planePathSplit","planeAddressSplit","parametersAndMatch","validPath","routeValue","routePath","valueSplit","routePlane","Parser","handleOptions","parserOptions","extract","queryData","queryString","parserResponse","PluridPlanesRegistrar","isoMatcher","register","identify","registeredPlane","absolute","getAll","all","registerPlanes","planesRegistrar","__pluridPlanesRegistrar__","pluridPlanesRegistrar","getPlanesRegistrar","getRegisteredPlanes","getRegisteredPlane","computeSpaceSize","width","height","depth","topCorner","treePage","spaceWidth","spaceHeight","spaceDepth","findPage","pages","splitIntoGroups","initialArray","groups","group","splice","getTreePlaneByPlaneID","_page","toRadians","mathematics","geometry","computePath","parentID","parentPlaneID","parentPage","reverse","computePluridPlaneLocation","treePageParent","bridgeLength","linkPlaneAngle","parentAngleRadians","linkPoint","linkAngleRadians","locationCoordinates","recomputeChildrenLocation","child","planeAngle","updatedChild","updatedChildWithChildren","computeColumnLayout","roots","columns","columnLength","gap","ROOTS_GAP","windowInnerWidth","innerWidth","windowInnerHeight","innerHeight","configurationWidth","numbers","checkIntegerNonUnit","gapValue","ceil","root","rowIndex","columnIndex","floor","treePageWithChildren","computeRowLayout","rowLength","computeFaceToFaceTranslateZ","computeFaceToFaceTranslateX","firstTranslateX","computeFaceToFaceRotateY","last","computeFaceToFaceLayout","middle","Number","isInteger","computeSheavesLayout","offsetX","offsetY","computeZigZagLayout","singleColumnedRoots","resolveViewItem","network","viewData","viewAddress","iPlanes","pluridPlanes","iPlane","sourceID","uuid","generate","routeDivisions","show","computeSpaceTree","treePlanes","viewItem","layout","LAYOUT_TYPES","COLUMNS","columnLayoutTree","ROWS","rowLayoutTree","ZIG_ZAG","zigzagLayoutTree","FACE_TO_FACE","faceToFaceLayoutTree","SHEAVES","sheavesLayoutTree","META","isParametric","viewRoute","planeRoute","matchForParameters","splitViewRoute","splitPlaneRoute","assignPagesFromView","viewPlane","parametricPlane","updateTreeWithNewPlane","planesRegistry","hostname","parentPlane","pluridPlaneID","updatedTreePlane","PLANE_DEFAULT_ANGLE","updatedParentPlane","updatePlaneLocation","updateTreeWithNewPage","treePageParentPlaneID","pagePath","pageID","newTreePlane","updatedTreePlaneParent","removePageFromTree","pageTree","toggleChildren","toggleAllChildren","togglePlaneFromTree","forceShow","treeUpdatedPlane","childrenUpdatedTree","childrenUpdatedPlane","getTreePlaneByID","stateTree","found","removeRootFromTree","removePlaneFromTree","Tree","compute","computeViewTree","viewTree","pageView","find","p","computeCulledView","radius","culledView","viewPage","pageInView","checkPageInView","radiusLeft","translationX","radiusRight","locationX","radiusTop","translationY","radiusBottom","locationY","inViewOnX","inViewOnY","resolveSpace","currentState","localState","precomputedState","contextState","registeredPlanes","spaceTree","space.tree.Tree","computedTree","stateSpace","loading","animatedTransform","transformTime","rotationX","rotationY","translationZ","activeUniverseID","camera","viewSize","spaceSize","resolveThemes","generalTheme","interactionTheme","THEME_NAMES","themes","stateThemes","stateConfiguration","generalEngine.configuration.merge","configurations","state","shortcuts","ui","toolbarScrollPosition","load","useLocalStorage","localStorage","stateID","stateData","getItem","JSON","parse","error","cleanTemplate","template","pluridRouterNavigate","CustomEvent","event","PLURID_ROUTER_LOCATION_CHANGED","detail","dispatchEvent"],"mappings":"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"}
|