diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 8567e4e87..000000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["airbnb", "@babel/preset-typescript"] -} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index 4deec5062..7cc3223f3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,6 +1,5 @@ { "extends": [ - "airbnb", "plugin:jest/recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", diff --git a/.gitignore b/.gitignore index 56d0577f7..aa3509cac 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ src/extension/build.pem bower_components sandboxes/manual-tests/NextJS/.next .vscode -src/app/components/Map.tsx package-lock.json -yarn.lock \ No newline at end of file +yarn.lock +docs/**/* +docs/* \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index e7c0c9a29..2fc98bd91 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "tests/manual-tests/recoilTest"] - path = tests/manual-tests/recoilTest - url = https://github.com/kevinfey/recoilTest [submodule "reactime-website"] path = reactime-website url = https://github.com/reactimetravel/reactime-website diff --git a/.npmcheckrc b/.npmcheckrc new file mode 100644 index 000000000..297d19125 --- /dev/null +++ b/.npmcheckrc @@ -0,0 +1,10 @@ +{"depcheck": + { + "ignoreMatches": [ + "css-loader", + "sass-loader", + "style-loader", + "typedoc-webpack-plugin" + ] + } +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ec43b159d..75a7940e3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Welcome to the Reactime contributing guide! -Thank you for investing your time in contributing to our project! :sparkles:. +Thank you for investing your time in contributing to our project! :sparkles:. In this guide you will get an overview of the contribution workflow from opening an issue, creating a PR, reviewing, and merging the PR. @@ -13,16 +13,15 @@ To get an overview of the project, read the [README](README.md). Here are some r - [GitHub flow](https://docs.github.com/en/get-started/quickstart/github-flow) - [Collaborating with pull requests](https://docs.github.com/en/github/collaborating-with-pull-requests) - ## Getting started -To navigate our codebase with confidence, see the [Developer Guidelines](/src/README.md) :confetti_ball:. +To navigate our codebase with confidence, see the [Developer Guidelines](src/DEVELOPER_README.md) :confetti_ball:. ### Issues #### Create a new issue -If you spot a problem with the docs, [search if an issue already exists](https://github.com/open-source-labs/reactime/issues). If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com/open-source-labs/reactime/issues/new). +If you spot a problem with the docs, [search if an issue already exists](https://github.com/open-source-labs/reactime/issues). If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com/open-source-labs/reactime/issues/new). #### Solve an issue @@ -32,14 +31,16 @@ Scan through our [existing issues](https://github.com/open-source-labs/reactime/ #### Make changes in the UI -Click **Make a contribution** at the bottom of any docs page to make small changes such as a typo, sentence fix, or a broken link. This takes you to the `.md` file where you can make your changes and [create a pull request](#pull-request) for a review. +Click **Make a contribution** at the bottom of any docs page to make small changes such as a typo, sentence fix, or a broken link. This takes you to the `.md` file where you can make your changes and [create a pull request](#pull-request) for a review. #### Make changes locally 1. [Install Git LFS](https://docs.github.com/en/github/managing-large-files/versioning-large-files/installing-git-large-file-storage). 2. Fork the repository. + - Using GitHub Desktop: + - [Getting started with GitHub Desktop](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/getting-started-with-github-desktop) will guide you through setting up Desktop. - Once Desktop is set up, you can use it to [fork the repo](https://github.com/open-source-labs/reactime.git)! @@ -55,16 +56,17 @@ Commit the changes once you are happy with them. ### Pull Request When you're finished with the changes, create a pull request, also known as a PR. -- Fill the "Ready for review" template so that we can review your PR. This template helps reviewers understand your changes as well as the purpose of your pull request. + +- Fill the "Ready for review" template so that we can review your PR. This template helps reviewers understand your changes as well as the purpose of your pull request. - Don't forget to [link PR to issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if you are solving one. - Enable the checkbox to [allow maintainer edits](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so the branch can be updated for a merge. -Once you submit your PR, a Docs team member will review your proposal. We may ask questions or request additional information. + Once you submit your PR, a Docs team member will review your proposal. We may ask questions or request additional information. - We may ask for changes to be made before a PR can be merged, either using [suggested changes](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/incorporating-feedback-in-your-pull-request) or pull request comments. You can apply suggested changes directly through the UI. You can make any other changes in your fork, then commit them to your branch. - As you update your PR and apply changes, mark each conversation as [resolved](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request#resolving-conversations). - If you run into any merge issues, checkout this [git tutorial](https://github.com/skills/resolve-merge-conflicts) to help you resolve merge conflicts and other issues. ### Your PR is merged! -Congratulations :tada::tada: The Reactime team thanks you! :sparkles:. +Congratulations :tada::tada: The Reactime team thanks you! :sparkles:. Once your PR is merged, your contributions will be publicly visible on [Reactime](https://github.com/open-source-labs/reactime)! diff --git a/README.fr.md b/README.fr.md index c0073e876..147e1d70d 100644 --- a/README.fr.md +++ b/README.fr.md @@ -36,7 +36,7 @@

- +

diff --git a/README.md b/README.md index b1da405f6..932694186 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -

- +



@@ -17,7 +16,6 @@ GitHub - BabelPresetPrefs LintPrefs

@@ -29,7 +27,7 @@

- +

@@ -42,13 +40,14 @@ You can view your application's file structure and click on a snapshot to view your app's state. State can be visualized in a Component Graph, JSON Tree, or -Performance Graph. Snapshots can be compared with the previous snapshot, which can -be viewed in Diff mode. +Performance Graph. Snapshot history can be visualized in the History tab. +The Web Metrics tab provides some useful metrics for site performance. +Snapshots can be compared with the previous snapshot, which can be viewed in Diff mode.

- +


@@ -85,7 +84,7 @@ Download the recorded snapshots as a JSON file and upload them to access state t

- +


@@ -95,11 +94,6 @@ If Reactime loses its connection to the tab you're monitoring, simply click the

-

- -

-
- ### 🔹 Re-render Optimization One of the most common issues that affects performance in React is unnecessary @@ -168,16 +162,22 @@ of the structure and interfaces of the codebase.

What's New!

-Reactime 22.0 heralds significant enhancements, addressing core performance issues and fortifying the overall application's stability and reliability. In our pursuit of consistent evolution, we've updated outdated packages and transitioned state management to Redux Toolkit. This strategic shift not only modernizes our tech stack but also ensures our application is positioned for easier maintenance and scalability in the future. Complementing these upgrades, this release also mends various bugs. The debut of features like the reconnection button, a status icon, and the integration of key web metrics – Cumulative Layout Shift (CLS) and Interaction To Next Paint (INP) – amplifies its functionality and offers users a more refined experience. +Reactime 23.0 brings a new look to the UI, completely updates all outdated packages, and significantly improves stability by solving loading bugs. + +UI -Taking a deeper look +V23 showcases a sharp new theme to our extension’s UI. We also opted to completely overhaul the styling architecture to make it easier for future developers to change it to their liking. -Addressing the persistent disconnection/black screen issues that occasionally affected users during regular application use, we made decisive improvements by removing the "keepAlive" function and implementing robust logic to fix the core issue. This enabled us to refine the communication protocol between our application and the Chrome extension API, delivering a more consistent and stable connection. To further enhance the user experience and foster resilience, we introduced a user-friendly reconnection feature. This not only offers users a swift recovery route but also acts as an added layer of protection against any unexpected disconnections in the future. +Dependencies -In an effort to improve maintainability, scalability, and longevity, we updated and phased out certain dependencies. To name a few, we moved away from the Immer library and transitioned our state management to use Redux Toolkit, while upgrading the Web Vitals API from version 1.1.2 to 3.5.0, allowing us to harness a broader range of web metrics. As part of this transition, we also converted all of the existing tests to work with the updated state management system, while further expanding testing suites to increase overall testing coverage. Lastly, we achieved a notable increase in TypeScript coverage, strengthening code quality and early detection of potential development issues. +As of Reactime v22, installing node modules required the use of npm --force due to numerous lingering peer dependency issues. We have tackled this issue head-on in v23 of Reactime. We trimmed bulky packages that already served their purpose. We completely updated those that played a vital role in our extension’s current operation, and we fully resolved their conflicts with other dependencies. By downsizing from 124 to 70 packages, we have made Reactime much lighter and more future-proof. -For an improved user experience, we set our sights on several impactful enhancements. First on our list is the reconnection feature, designed as a protective measure for those unexpected moments when a user gets disconnected. In such events, an intuitive pop-up dialog will instantly emerge, offering users a seamless way to dive right back into their session, while also offering the option to download recorded snapshots of state as a JSON file. Complementing this, we've integrated a dynamic status indicator that transparently displays a user's current app status, highlighting whether they're online or offline. But that's not all. We've enriched the application with two vital web performance metrics: Cumulative Layout Shift (CLS) and Interaction to Next Paint (INP). These metrics are pivotal, providing developers with insights into layout stability and responsiveness, empowering them to optimize user interactions with precision. +This effort serves to bolster Reactime in two ways: First, updating packages like react router and webpack gives Reactime’s users access to the performance upgrades that come with modern versions. Additionally, we have future-proofed Reactime by leaving our dependencies at their latest versions. This effort gives future developers of the extension a head start in adding new features and expanding the power of existing ones. +Loading stability + +Reactime has experienced persistent issues with stably loading up. Our first step in tackling these loading inconsistencies was to thoroughly unpack Reactime’s inner workings. Tracking the flow of messages from our content script, our background service workers, the Redux state management and our extension’s backend allowed us to diagnose potential roadblocks as Reactime was spinning up. An exhaustive period of trial and error further deepened our understanding of the problem and ultimately led us towards our new and robustly stable launch experience. +Beyond this, we have built out a road map of documentation with the goal of setting future Reactime developers on the fast track to further enhance the stability of Reactime’s launch and overall user experience. If you would like to read more about previous releases, click here! @@ -213,14 +213,16 @@ locally. Please refer to Developer Install for a detailed guide: -Refer [DEVELOPER README](src/README.md) for more info on the project, and +Refer to the [DEVELOPER README](src/DEVELOPER_README.md) for more info on the project, and instructions on building from source. ### How to Use After installing the Chrome extension, just open up your project in the browser. -Then open up your Chrome DevTools and navigate to the Reactime panel. +Then right click on your application and choose the 'Reactime' context menu item to open up a Reactime panel. + +Alternatively, you can open up your Chrome DevTools and navigate to the Reactime panel. ## Troubleshooting @@ -242,7 +244,7 @@ clicking the right mouse button “Reload frame”. ### ❓ I found a bug in Reactime Reactime is an open-source project, and we'd love to hear from you about -improving the user experience. Please read [DEVELOPER README](src/README.md), +improving the user experience. Please read [DEVELOPER README](src/DEVELOPER_README.md), and create a pull request (or issue) to propose and collaborate on changes to Reactime. ### ❓ Node version compatibility @@ -253,7 +255,7 @@ Node v16.16.0, please use script 'npm run devlegacy' | 'npm run buildlegacy' ## Read More -- [Reactime: Real-time Debugging, Timeless Results](https://medium.com/@kelvinmirhan/reactime-real-time-debugging-timeless-results-3f163b721d01) +- [Reactime renovation: Updates Coming in Version 23.0!](https://medium.com/@liam.donaher/reactime-renovation-updates-coming-in-version-23-0-37b2ef2a2771) ## Authors @@ -353,6 +355,10 @@ Node v16.16.0, please use script 'npm run devlegacy' | 'npm run buildlegacy' - **Jimmy Phy** - [@jimmally](https://github.com/jimmally) - **Andrew Byun** - [@AndrewByun](https://github.com/AndrewByun) - **Kelvin Mirhan** - [@kelvinmirhan](https://github.com/kelvinmirhan) +- **Jesse Rosengrant** - [@jrosengrant](https://github.com/jrosengrant) +- **Liam Donaher** - [@leebology](https://github.com/leebology) +- **David Moore** - [@Solodt55](https://github.com/Solodt55) +- **John Banks** - [@Jbanks123](https://github.com/Jbanks123) ## License diff --git a/assets/DataFlowDiagram.PNG b/assets/DataFlowDiagram.PNG deleted file mode 100644 index 8a50bbcfd..000000000 Binary files a/assets/DataFlowDiagram.PNG and /dev/null differ diff --git a/assets/DataFlowDiagramV23.png b/assets/DataFlowDiagramV23.png new file mode 100644 index 000000000..f835c0673 Binary files /dev/null and b/assets/DataFlowDiagramV23.png differ diff --git a/assets/gifs/GeneralDemoGif.gif b/assets/gifs/GeneralDemoGif.gif deleted file mode 100644 index 50e7aad63..000000000 Binary files a/assets/gifs/GeneralDemoGif.gif and /dev/null differ diff --git a/assets/gifs/GeneralDemoGif_V23.gif b/assets/gifs/GeneralDemoGif_V23.gif new file mode 100644 index 000000000..4dc6f8924 Binary files /dev/null and b/assets/gifs/GeneralDemoGif_V23.gif differ diff --git a/assets/gifs/ImportExportGif_V23.gif b/assets/gifs/ImportExportGif_V23.gif new file mode 100644 index 000000000..0b8d9f3da Binary files /dev/null and b/assets/gifs/ImportExportGif_V23.gif differ diff --git a/assets/gifs/PerformanceGif_V23.gif b/assets/gifs/PerformanceGif_V23.gif new file mode 100644 index 000000000..99b9bc1c4 Binary files /dev/null and b/assets/gifs/PerformanceGif_V23.gif differ diff --git a/assets/gifs/TimeTravelGif.gif b/assets/gifs/TimeTravelGif.gif deleted file mode 100644 index e14273036..000000000 Binary files a/assets/gifs/TimeTravelGif.gif and /dev/null differ diff --git a/assets/gifs/TimeTravelGif_V23.gif b/assets/gifs/TimeTravelGif_V23.gif new file mode 100644 index 000000000..4e14f229b Binary files /dev/null and b/assets/gifs/TimeTravelGif_V23.gif differ diff --git a/assets/gifs/importExport_v22.gif b/assets/gifs/importExport_v22.gif deleted file mode 100644 index 30afb5bd3..000000000 Binary files a/assets/gifs/importExport_v22.gif and /dev/null differ diff --git a/assets/gifs/main_v21.gif b/assets/gifs/main_v21.gif deleted file mode 100644 index 6f092c228..000000000 Binary files a/assets/gifs/main_v21.gif and /dev/null differ diff --git a/demo-app-next/src/components/Board.tsx b/demo-app-next/src/components/Board.tsx index c94d0779c..950f292df 100644 --- a/demo-app-next/src/components/Board.tsx +++ b/demo-app-next/src/components/Board.tsx @@ -1,6 +1,6 @@ -import React, { Component } from "react"; -import Row from "./Row"; -import { BoardContent, Scoreboard, Player } from "../types/types"; +import React, { Component } from 'react'; +import Row from './Row'; +import { BoardContent, Scoreboard, Player } from '../types/types'; type BoardState = { board: BoardContent; @@ -15,9 +15,9 @@ class Board extends Component<{}, BoardState> { super(props); this.state = { board: this.newBoard(), - currentPlayer: "X", + currentPlayer: 'X', gameOver: false, - message: "", + message: '', scoreboard: { X: 0, O: 0 }, }; @@ -25,7 +25,7 @@ class Board extends Component<{}, BoardState> { this.handleBoxClick = this.handleBoxClick.bind(this); } - componentDidUpdate():void { + componentDidUpdate(): void { this.checkForWinner(); } @@ -36,9 +36,9 @@ class Board extends Component<{}, BoardState> { */ newBoard(): BoardContent { return [ - ["-", "-", "-"], - ["-", "-", "-"], - ["-", "-", "-"], + ['-', '-', '-'], + ['-', '-', '-'], + ['-', '-', '-'], ]; } @@ -51,7 +51,7 @@ class Board extends Component<{}, BoardState> { this.setState({ gameOver: false, board: this.newBoard(), - message: "", + message: '', }); } @@ -65,7 +65,7 @@ class Board extends Component<{}, BoardState> { const spacesLeft = (): boolean => { for (let i of board) { - if (i.includes("-")) return true; + if (i.includes('-')) return true; } return false; }; @@ -73,33 +73,17 @@ class Board extends Component<{}, BoardState> { if (!gameOver) { // win conditions: matching rows, columns, or diagonals, that are not empty('-') if ( - (board[0][0] === board[0][1] && - board[0][1] === board[0][2] && - board[0][2] !== "-") || - (board[1][0] === board[1][1] && - board[1][1] === board[1][2] && - board[1][2] !== "-") || - (board[2][0] === board[2][1] && - board[2][1] === board[2][2] && - board[2][2] !== "-") || - (board[0][0] === board[1][0] && - board[1][0] === board[2][0] && - board[2][0] !== "-") || - (board[0][1] === board[1][1] && - board[1][1] === board[2][1] && - board[2][1] !== "-") || - (board[0][2] === board[1][2] && - board[1][2] === board[2][2] && - board[2][2] !== "-") || - (board[0][0] === board[1][1] && - board[1][1] === board[2][2] && - board[2][2] !== "-") || - (board[2][0] === board[1][1] && - board[1][1] === board[0][2] && - board[0][2] !== "-") + (board[0][0] === board[0][1] && board[0][1] === board[0][2] && board[0][2] !== '-') || + (board[1][0] === board[1][1] && board[1][1] === board[1][2] && board[1][2] !== '-') || + (board[2][0] === board[2][1] && board[2][1] === board[2][2] && board[2][2] !== '-') || + (board[0][0] === board[1][0] && board[1][0] === board[2][0] && board[2][0] !== '-') || + (board[0][1] === board[1][1] && board[1][1] === board[2][1] && board[2][1] !== '-') || + (board[0][2] === board[1][2] && board[1][2] === board[2][2] && board[2][2] !== '-') || + (board[0][0] === board[1][1] && board[1][1] === board[2][2] && board[2][2] !== '-') || + (board[2][0] === board[1][1] && board[1][1] === board[0][2] && board[0][2] !== '-') ) { // winner is the person who's turn was previous - const winner: Player = currentPlayer === "X" ? "O" : "X"; + const winner: Player = currentPlayer === 'X' ? 'O' : 'X'; this.setState({ gameOver: true, @@ -110,7 +94,7 @@ class Board extends Component<{}, BoardState> { } else if (!spacesLeft()) { this.setState({ gameOver: true, - message: "Draw!", + message: 'Draw!', }); } } @@ -123,7 +107,7 @@ class Board extends Component<{}, BoardState> { [...this.state.board[2]], ]; boardCopy[row][column] = this.state.currentPlayer; - const newPlayer: Player = this.state.currentPlayer === "X" ? "O" : "X"; + const newPlayer: Player = this.state.currentPlayer === 'X' ? 'O' : 'X'; this.setState({ board: boardCopy, currentPlayer: newPlayer }); } @@ -131,22 +115,17 @@ class Board extends Component<{}, BoardState> { const rows: Array = []; for (let i = 0; i < 3; i++) { rows.push( - + , ); } // const { X, O }: Scoreboard = this.state.scoreboard; return ( -
+

Tic Tac Toe

{this.state.gameOver &&

{this.state.message}

} {rows} -
diff --git a/demo-app-next/src/components/Box.tsx b/demo-app-next/src/components/Box.tsx index 325c0d8ad..f44c00d62 100644 --- a/demo-app-next/src/components/Box.tsx +++ b/demo-app-next/src/components/Box.tsx @@ -1,4 +1,4 @@ -import { BoardText } from "../types/types"; +import { BoardText } from '../types/types'; type BoxProps = { value: BoardText; @@ -9,10 +9,7 @@ type BoxProps = { const Box = (props: BoxProps): JSX.Element => { return ( - ); diff --git a/demo-app-next/src/components/Increment.tsx b/demo-app-next/src/components/Increment.tsx index 129eab416..791f08f23 100644 --- a/demo-app-next/src/components/Increment.tsx +++ b/demo-app-next/src/components/Increment.tsx @@ -1,10 +1,10 @@ -import React, { useState } from "react"; +import React, { useState } from 'react'; export default function Increment(): JSX.Element { const [count, setCount] = useState(0); return ( - ); diff --git a/demo-app-next/src/components/Row.tsx b/demo-app-next/src/components/Row.tsx index f8c66fd43..961a83c73 100644 --- a/demo-app-next/src/components/Row.tsx +++ b/demo-app-next/src/components/Row.tsx @@ -1,5 +1,5 @@ -import Box from "./Box"; -import { BoardText } from "../types/types"; +import Box from './Box'; +import { BoardText } from '../types/types'; type RowProps = { handleBoxClick: (row: number, column: number) => void; @@ -17,11 +17,11 @@ const Row = (props: RowProps) => { column={i} handleBoxClick={props.handleBoxClick} value={props.values[i]} - > + >, ); } - return
{boxes}
; + return
{boxes}
; }; export default Row; diff --git a/demo-app-next/src/pages/_app.tsx b/demo-app-next/src/pages/_app.tsx index b367bd103..279f38d6b 100644 --- a/demo-app-next/src/pages/_app.tsx +++ b/demo-app-next/src/pages/_app.tsx @@ -1,5 +1,5 @@ -import "../../styles/style.css"; -import React from "react" +import '../../styles/style.css'; +import React from 'react'; export default function MyApp({ Component, pageProps }): JSX.Element { return ; diff --git a/demo-app-next/src/pages/buttons/index.tsx b/demo-app-next/src/pages/buttons/index.tsx index 28af6481a..4e0b24237 100644 --- a/demo-app-next/src/pages/buttons/index.tsx +++ b/demo-app-next/src/pages/buttons/index.tsx @@ -1,5 +1,5 @@ -import Buttons from "../../components/Buttons"; -import Navbar from "../../components/navbar"; +import Buttons from '../../components/Buttons'; +import Navbar from '../../components/navbar'; export default function ButtonsPage(): JSX.Element { return ( diff --git a/demo-app-next/src/pages/index.tsx b/demo-app-next/src/pages/index.tsx index 11a5011a4..5bcd002d3 100644 --- a/demo-app-next/src/pages/index.tsx +++ b/demo-app-next/src/pages/index.tsx @@ -1,29 +1,27 @@ -import Navbar from "../components/navbar"; -import React from "react" +import Navbar from '../components/navbar'; +import React from 'react'; -export default function Home():JSX.Element { +export default function Home(): JSX.Element { return (
-
+

Lorem Ipsum

- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do - eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad - minim veniam, quis nostrud exercitation ullamco laboris nisi ut - aliquip ex ea commodo consequat. Duis aute irure dolor in - reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla - pariatur. Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum." + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id + est laborum."

- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do - eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad - minim veniam, quis nostrud exercitation ullamco laboris nisi ut - aliquip ex ea commodo consequat. Duis aute irure dolor in - reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla - pariatur. Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum." + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id + est laborum."

diff --git a/demo-app-next/src/pages/tictactoe/index.tsx b/demo-app-next/src/pages/tictactoe/index.tsx index f43fb0689..d2376d215 100644 --- a/demo-app-next/src/pages/tictactoe/index.tsx +++ b/demo-app-next/src/pages/tictactoe/index.tsx @@ -1,7 +1,7 @@ import Board from '../../components/Board'; import Navbar from '../../components/navbar'; -export default function BoardPage():JSX.Element { +export default function BoardPage(): JSX.Element { return (
diff --git a/demo-app-next/src/types/types.ts b/demo-app-next/src/types/types.ts index 8e6904d65..cc8252e42 100644 --- a/demo-app-next/src/types/types.ts +++ b/demo-app-next/src/types/types.ts @@ -3,8 +3,8 @@ export type Scoreboard = { O: number; }; -export type Player = "X" | "O"; +export type Player = 'X' | 'O'; -export type BoardText = "X" | "O" | "-"; +export type BoardText = 'X' | 'O' | '-'; export type BoardContent = Array>; diff --git a/demo-app-remix/.eslintrc.js b/demo-app-remix/.eslintrc.js index 2061cd226..f2faf1470 100644 --- a/demo-app-remix/.eslintrc.js +++ b/demo-app-remix/.eslintrc.js @@ -1,4 +1,4 @@ /** @type {import('eslint').Linter.Config} */ module.exports = { - extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"], + extends: ['@remix-run/eslint-config', '@remix-run/eslint-config/node'], }; diff --git a/demo-app-remix/app/components/Board.tsx b/demo-app-remix/app/components/Board.tsx index 2be8cffde..9eeb7ed58 100644 --- a/demo-app-remix/app/components/Board.tsx +++ b/demo-app-remix/app/components/Board.tsx @@ -1,7 +1,7 @@ -import React, { Component } from "react"; -import Row from "./Row"; -import type { BoardContent, Scoreboard, Player } from "../types/types"; -import type { BoardText } from "../types/types"; +import React, { Component } from 'react'; +import Row from './Row'; +import type { BoardContent, Scoreboard, Player } from '../types/types'; +import type { BoardText } from '../types/types'; type BoardState = { board: BoardContent; @@ -16,9 +16,9 @@ class Board extends Component<{}, BoardState> { super(props); this.state = { board: this.newBoard(), - currentPlayer: "X", + currentPlayer: 'X', gameOver: false, - message: "", + message: '', scoreboard: { X: 0, O: 0 }, }; @@ -37,9 +37,9 @@ class Board extends Component<{}, BoardState> { */ newBoard(): BoardContent { return [ - ["-", "-", "-"], - ["-", "-", "-"], - ["-", "-", "-"], + ['-', '-', '-'], + ['-', '-', '-'], + ['-', '-', '-'], ]; } @@ -52,7 +52,7 @@ class Board extends Component<{}, BoardState> { this.setState({ gameOver: false, board: this.newBoard(), - message: "", + message: '', }); } @@ -66,7 +66,7 @@ class Board extends Component<{}, BoardState> { const spacesLeft = (): boolean => { for (let i of board) { - if (i.includes("-")) return true; + if (i.includes('-')) return true; } return false; }; @@ -74,33 +74,17 @@ class Board extends Component<{}, BoardState> { if (!gameOver) { // win conditions: matching rows, columns, or diagonals, that are not empty('-') if ( - (board[0][0] === board[0][1] && - board[0][1] === board[0][2] && - board[0][2] !== "-") || - (board[1][0] === board[1][1] && - board[1][1] === board[1][2] && - board[1][2] !== "-") || - (board[2][0] === board[2][1] && - board[2][1] === board[2][2] && - board[2][2] !== "-") || - (board[0][0] === board[1][0] && - board[1][0] === board[2][0] && - board[2][0] !== "-") || - (board[0][1] === board[1][1] && - board[1][1] === board[2][1] && - board[2][1] !== "-") || - (board[0][2] === board[1][2] && - board[1][2] === board[2][2] && - board[2][2] !== "-") || - (board[0][0] === board[1][1] && - board[1][1] === board[2][2] && - board[2][2] !== "-") || - (board[2][0] === board[1][1] && - board[1][1] === board[0][2] && - board[0][2] !== "-") + (board[0][0] === board[0][1] && board[0][1] === board[0][2] && board[0][2] !== '-') || + (board[1][0] === board[1][1] && board[1][1] === board[1][2] && board[1][2] !== '-') || + (board[2][0] === board[2][1] && board[2][1] === board[2][2] && board[2][2] !== '-') || + (board[0][0] === board[1][0] && board[1][0] === board[2][0] && board[2][0] !== '-') || + (board[0][1] === board[1][1] && board[1][1] === board[2][1] && board[2][1] !== '-') || + (board[0][2] === board[1][2] && board[1][2] === board[2][2] && board[2][2] !== '-') || + (board[0][0] === board[1][1] && board[1][1] === board[2][2] && board[2][2] !== '-') || + (board[2][0] === board[1][1] && board[1][1] === board[0][2] && board[0][2] !== '-') ) { // winner is the person who's turn was previous - const winner: Player = currentPlayer === "X" ? "O" : "X"; + const winner: Player = currentPlayer === 'X' ? 'O' : 'X'; this.setState({ gameOver: true, @@ -111,7 +95,7 @@ class Board extends Component<{}, BoardState> { } else if (!spacesLeft()) { this.setState({ gameOver: true, - message: "Draw!", + message: 'Draw!', }); } } @@ -124,7 +108,7 @@ class Board extends Component<{}, BoardState> { [...this.state.board[2]], ]; boardCopy[row][column] = this.state.currentPlayer; - const newPlayer: Player = this.state.currentPlayer === "X" ? "O" : "X"; + const newPlayer: Player = this.state.currentPlayer === 'X' ? 'O' : 'X'; this.setState({ board: boardCopy, currentPlayer: newPlayer }); } @@ -132,22 +116,17 @@ class Board extends Component<{}, BoardState> { const rows: Array = []; for (let i = 0; i < 3; i++) { rows.push( - + , ); } const { X, O }: Scoreboard = this.state.scoreboard; return ( -
+

Tic Tac Toe

{this.state.gameOver &&

{this.state.message}

} {rows} -
diff --git a/demo-app-remix/app/components/Box.tsx b/demo-app-remix/app/components/Box.tsx index 2da62712e..038a557f3 100644 --- a/demo-app-remix/app/components/Box.tsx +++ b/demo-app-remix/app/components/Box.tsx @@ -1,4 +1,4 @@ -import type { BoardText } from "../types/types"; +import type { BoardText } from '../types/types'; type BoxProps = { value: BoardText; @@ -9,10 +9,7 @@ type BoxProps = { const Box = (props: BoxProps) => { return ( - ); diff --git a/demo-app-remix/app/components/Increment.tsx b/demo-app-remix/app/components/Increment.tsx index 85b572d59..6e6486908 100644 --- a/demo-app-remix/app/components/Increment.tsx +++ b/demo-app-remix/app/components/Increment.tsx @@ -10,4 +10,4 @@ function Increment() { ); } -export default Increment; \ No newline at end of file +export default Increment; diff --git a/demo-app-remix/app/components/Row.tsx b/demo-app-remix/app/components/Row.tsx index 7dc1171ab..011b7a8ae 100644 --- a/demo-app-remix/app/components/Row.tsx +++ b/demo-app-remix/app/components/Row.tsx @@ -1,5 +1,5 @@ -import Box from "./Box"; -import type { BoardText } from "../types/types"; +import Box from './Box'; +import type { BoardText } from '../types/types'; type RowProps = { handleBoxClick: (row: number, column: number) => void; @@ -17,11 +17,11 @@ const Row = (props: RowProps) => { column={i} handleBoxClick={props.handleBoxClick} value={props.values[i]} - > + >, ); } - return
{boxes}
; + return
{boxes}
; }; export default Row; diff --git a/demo-app-remix/app/components/navbar.js b/demo-app-remix/app/components/navbar.js index 018ad3e7f..885e6f473 100644 --- a/demo-app-remix/app/components/navbar.js +++ b/demo-app-remix/app/components/navbar.js @@ -1,15 +1,15 @@ -import { Link } from "@remix-run/react"; +import { Link } from '@remix-run/react'; export default function Navbar() { return ( -
- +
+ About - + Tic-Tac-Toe - + Counter
diff --git a/demo-app-remix/app/root.tsx b/demo-app-remix/app/root.tsx index 2565a4581..26ac3df47 100644 --- a/demo-app-remix/app/root.tsx +++ b/demo-app-remix/app/root.tsx @@ -1,24 +1,17 @@ -import type { MetaFunction, LinksFunction } from "@remix-run/node"; -import { - Links, - LiveReload, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "@remix-run/react"; -import styles from "./styles/style.css"; +import type { MetaFunction, LinksFunction } from '@remix-run/node'; +import { Links, LiveReload, Meta, Outlet, Scripts, ScrollRestoration } from '@remix-run/react'; +import styles from './styles/style.css'; export const meta: MetaFunction = () => ({ - charset: "utf-8", - title: "New Remix App", - viewport: "width=device-width,initial-scale=1", + charset: 'utf-8', + title: 'New Remix App', + viewport: 'width=device-width,initial-scale=1', }); export const links: LinksFunction = () => { return [ { - rel: "stylesheet", + rel: 'stylesheet', href: styles, }, ]; @@ -26,7 +19,7 @@ export const links: LinksFunction = () => { export default function App() { return ( - + diff --git a/demo-app-remix/app/routes/buttons/index.tsx b/demo-app-remix/app/routes/buttons/index.tsx index c6458afcc..1842d8240 100644 --- a/demo-app-remix/app/routes/buttons/index.tsx +++ b/demo-app-remix/app/routes/buttons/index.tsx @@ -1,5 +1,5 @@ -import Button from "../../components/Buttons"; -import Navbar from "../../components/navbar"; +import Button from '../../components/Buttons'; +import Navbar from '../../components/navbar'; export default function ButtonsPage() { return ( diff --git a/demo-app-remix/app/routes/index.tsx b/demo-app-remix/app/routes/index.tsx index 1e04f2d8a..1e26e26d0 100644 --- a/demo-app-remix/app/routes/index.tsx +++ b/demo-app-remix/app/routes/index.tsx @@ -1,28 +1,26 @@ -import Navbar from "../components/navbar.js"; +import Navbar from '../components/navbar.js'; export default function Home() { return (
-
+

Lorem Ipsum

- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do - eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad - minim veniam, quis nostrud exercitation ullamco laboris nisi ut - aliquip ex ea commodo consequat. Duis aute irure dolor in - reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla - pariatur. Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum." + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id + est laborum."

- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do - eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad - minim veniam, quis nostrud exercitation ullamco laboris nisi ut - aliquip ex ea commodo consequat. Duis aute irure dolor in - reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla - pariatur. Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum." + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id + est laborum."

diff --git a/demo-app-remix/app/routes/tictactoe/index.tsx b/demo-app-remix/app/routes/tictactoe/index.tsx index 903fadf76..8cd5fae85 100644 --- a/demo-app-remix/app/routes/tictactoe/index.tsx +++ b/demo-app-remix/app/routes/tictactoe/index.tsx @@ -1,7 +1,7 @@ -import Board from "../../components/Board"; -import Box from "../../components/Box"; -import Row from "../../components/Row"; -import Navbar from "../../components/navbar"; +import Board from '../../components/Board'; +import Box from '../../components/Box'; +import Row from '../../components/Row'; +import Navbar from '../../components/navbar'; export default function Tictactoe() { return ( diff --git a/demo-app-remix/app/types/types.ts b/demo-app-remix/app/types/types.ts index 8e6904d65..cc8252e42 100644 --- a/demo-app-remix/app/types/types.ts +++ b/demo-app-remix/app/types/types.ts @@ -3,8 +3,8 @@ export type Scoreboard = { O: number; }; -export type Player = "X" | "O"; +export type Player = 'X' | 'O'; -export type BoardText = "X" | "O" | "-"; +export type BoardText = 'X' | 'O' | '-'; export type BoardContent = Array>; diff --git a/demo-app-remix/package.json b/demo-app-remix/package.json index 785aa40a0..5add33863 100644 --- a/demo-app-remix/package.json +++ b/demo-app-remix/package.json @@ -4,9 +4,9 @@ "scripts": { "build": "remix build", "dev": "npm-run-all build --parallel \"dev:*\"", - "dev:node": "cross-env NODE_ENV=development nodemon --require dotenv/config ./server.js --watch ./server.js", + "dev:node": "cross-env NODE_ENV=development nodemon --require dotenv/config ./server.ts --watch ./server.ts", "dev:remix": "remix watch", - "start": "cross-env NODE_ENV=production node ./server.js", + "start": "cross-env NODE_ENV=production node ./server.ts", "typecheck": "tsc" }, "dependencies": { @@ -19,7 +19,8 @@ "isbot": "^3.6.5", "morgan": "^1.10.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "ts-node": "^10.9.2" }, "devDependencies": { "@remix-run/dev": "^1.14.1", diff --git a/demo-app-remix/server.ts b/demo-app-remix/server.ts index 1d7ef3982..1e24b658d 100644 --- a/demo-app-remix/server.ts +++ b/demo-app-remix/server.ts @@ -1,33 +1,31 @@ -const path = require("path"); -const express = require("express"); -const compression = require("compression"); -const morgan = require("morgan"); -const { createRequestHandler } = require("@remix-run/express"); +export {}; //JR: added to fix this error message: 'server.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module. +const path = require('path'); +const express = require('express'); +const compression = require('compression'); +const morgan = require('morgan'); +const { createRequestHandler } = require('@remix-run/express'); -const BUILD_DIR = path.join(process.cwd(), "build"); +const BUILD_DIR = path.join(process.cwd(), 'build'); const app = express(); app.use(compression()); // http://expressjs.com/en/advanced/best-practice-security.html#at-a-minimum-disable-x-powered-by-header -app.disable("x-powered-by"); +app.disable('x-powered-by'); // Remix fingerprints its assets so we can cache forever. -app.use( - "/build", - express.static("public/build", { immutable: true, maxAge: "1y" }) -); +app.use('/build', express.static('public/build', { immutable: true, maxAge: '1y' })); // Everything else (like favicon.ico) is cached for an hour. You may want to be // more aggressive with this caching. -app.use(express.static("public", { maxAge: "1h" })); +app.use(express.static('public', { maxAge: '1h' })); -app.use(morgan("tiny")); +app.use(morgan('tiny')); app.all( - "*", - process.env.NODE_ENV === "development" + '*', + process.env.NODE_ENV === 'development' ? (req: any, res: any, next: any) => { purgeRequireCache(); @@ -39,7 +37,7 @@ app.all( : createRequestHandler({ build: require(BUILD_DIR), mode: process.env.NODE_ENV, - }) + }), ); const port: number | string = process.env.PORT || 3003; diff --git a/demo-app/package.json b/demo-app/package.json index 7bb3a9b23..17ed638c0 100644 --- a/demo-app/package.json +++ b/demo-app/package.json @@ -19,6 +19,7 @@ "copy-webpack-plugin": "^10.2.0", "css-loader": "^6.5.1", "html-webpack-plugin": "^5.5.0", + "node": "^16.0.0", "nodemon": "^2.0.15", "ts-loader": "^9.2.6", "typescript": "^4.5.4", diff --git a/demo-app/src/client/Components/Board.tsx b/demo-app/src/client/Components/Board.tsx index 4e45c4c5d..416bef2c0 100644 --- a/demo-app/src/client/Components/Board.tsx +++ b/demo-app/src/client/Components/Board.tsx @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import Row from './Row'; import { BoardContent, Scoreboard, Player } from './../../types'; -//Took away BoardText from import +//Took away BoardText from import //thinking about changing this to an interface type BoardState = { diff --git a/demo-app/src/client/Components/Box.tsx b/demo-app/src/client/Components/Box.tsx index 87a2a88d1..d9c45512e 100644 --- a/demo-app/src/client/Components/Box.tsx +++ b/demo-app/src/client/Components/Box.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React from 'react'; import { BoardText } from '../../types'; type BoxProps = { @@ -8,12 +8,12 @@ type BoxProps = { handleBoxClick: (row: number, column: number) => void; }; -const Box = (props: BoxProps) : JSX.Element => { +const Box = (props: BoxProps): JSX.Element => { return ( <> - + ); }; diff --git a/demo-app/src/client/Components/ButtonsWithMoreHooks.jsx b/demo-app/src/client/Components/ButtonsWithMoreHooks.jsx index 1d7d94c79..5d9398b51 100644 --- a/demo-app/src/client/Components/ButtonsWithMoreHooks.jsx +++ b/demo-app/src/client/Components/ButtonsWithMoreHooks.jsx @@ -1,40 +1,40 @@ -import React, {useState, createContext} from 'react'; +import React, { useState, createContext } from 'react'; import IncrementWithMoreHooks from './IncrementWithMoreHooks'; /** - * This component as well as IncrementWithMoreHooks were made to show where data for different + * This component as well as IncrementWithMoreHooks were made to show where data for different * hooks show up in the react fiber tree. */ -/** +/** * This file is a JSX file, not a TSX file, on purpose. The code won't be converted to common JS - * before being bundled by webpack. There were some errors that weren't showing up for the other + * before being bundled by webpack. There were some errors that weren't showing up for the other * Increment.tsx file based on how webpack uglifies ES6 files. Maintaining this as a JSX file * will help check for these types of issues. */ /** - * How Reactime extracts useState data and what would have to be done + * How Reactime extracts useState data and what would have to be done * to extract useContext and useReducer data: - * - * When extracting a functional component's useState data from the fiber tree in the backend of - * Reactime, said data is stored on said component's fiber tree node at its memoizedState property, - * which is a linked list with each node holding data for each useState invocation (some but + * + * When extracting a functional component's useState data from the fiber tree in the backend of + * Reactime, said data is stored on said component's fiber tree node at its memoizedState property, + * which is a linked list with each node holding data for each useState invocation (some but * not all other hooks also store nodes with data here). Each useState memoizedState node includes * the variable (e.g. user) and its corresponding dispatch function (e.g. setUser). This dispatch * function is required to use Reactime's timeJump feature. - * + * * useContext data is stored on the property "dependencies", and only the data passed into the * value attritibute of the 'context'.Provider element will be there. For tripContext.Provider, - * we pass down "trip" without "setTrip", so we won't have access to the 'trip' dispatch function - * in the "IncrementWithMoreHooks" component, meaning Reactime's timeJump won't work without + * we pass down "trip" without "setTrip", so we won't have access to the 'trip' dispatch function + * in the "IncrementWithMoreHooks" component, meaning Reactime's timeJump won't work without * finding the 'trip' dispatch function by coming into this component where useState was invoked and - * storing it in the appropriate place. This is easy enough for useState variables, but useContext - * is commonly used with useReducer which is an entirely different beast. - * - * I advise solving the puzzle of making useReducer work with the timeJump functionality before - * integrating other hooks. Look at time jumping in the Redux dev tools chrome extension for - * inspiration, because you essentially need to recreate that within Reactime. + * storing it in the appropriate place. This is easy enough for useState variables, but useContext + * is commonly used with useReducer which is an entirely different beast. + * + * I advise solving the puzzle of making useReducer work with the timeJump functionality before + * integrating other hooks. Look at time jumping in the Redux dev tools chrome extension for + * inspiration, because you essentially need to recreate that within Reactime. */ // userInCreateContext is different from 'user' to see where this variable name showed up in the AST @@ -44,18 +44,18 @@ export const tripContext = createContext({ trip: 'null', setTrip: undefined }); const ButtonsWithMoreHooks = () => { const [user, setUser] = useState('null'); const userValue = { user, setUser }; - const [trip, setTrip ] = useState('Hawaii'); + const [trip, setTrip] = useState('Hawaii'); const tripValue = { trip }; return (
- - + +
); -} +}; export default ButtonsWithMoreHooks; diff --git a/demo-app/src/client/Components/Home.tsx b/demo-app/src/client/Components/Home.tsx index 44518e0c9..cafff52ef 100644 --- a/demo-app/src/client/Components/Home.tsx +++ b/demo-app/src/client/Components/Home.tsx @@ -3,7 +3,7 @@ import React from 'react'; function Home(): JSX.Element { return (
-

Lorem Ipsum

+

REACTIME - DEMO APP

"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco diff --git a/demo-app/src/client/Components/IncrementWithMoreHooks.jsx b/demo-app/src/client/Components/IncrementWithMoreHooks.jsx index 8c2f56752..4cba379b3 100644 --- a/demo-app/src/client/Components/IncrementWithMoreHooks.jsx +++ b/demo-app/src/client/Components/IncrementWithMoreHooks.jsx @@ -1,34 +1,41 @@ -import React, { useState, useEffect, useContext, useReducer, useRef, useMemo, useCallback } from 'react'; +import React, { + useState, + useEffect, + useContext, + useReducer, + useRef, + useMemo, + useCallback, +} from 'react'; import { userContext, tripContext } from './ButtonsWithMoreHooks'; import { useImmer } from 'use-immer'; -/** - * This component as well as ButtonsWithMoreHooks were made to show where data for different - * hooks show up in the react fiber tree. There are duplicates of most hooks so you can see +/** + * This component as well as ButtonsWithMoreHooks were made to show where data for different + * hooks show up in the react fiber tree. There are duplicates of most hooks so you can see * how the react fiber tree iterates over hook data. -*/ + */ -/** +/** * This file is a JSX file, not a TSX file, on purpose. The code won't be converted to common JS - * before being bundled by webpack. There were some errors that weren't showing up for the other + * before being bundled by webpack. There were some errors that weren't showing up for the other * Increment.tsx file based on how webpack uglifies ES6 files. Maintaining this as a JSX file * will help check for these types of issues. */ - + /** * ES5 function definitions are intentionally used for most functions as ES6 function definitions were one * of the reasons Reactime 18 was breaking. Handleclick within the component definitions is ES6 to cover - * this case, but having only 1 ES6 function definition in the file makes it easy to switch for testing + * this case, but having only 1 ES6 function definition in the file makes it easy to switch for testing * purposes. Functional component definitions made with ES6 - */ - + */ //---------useReducer reducer and initialState functions------------------------------------------------------------------ function reducer1(state, action) { if (action.type === 'INCREMENT_UR1COUNT') { return { - UR1Count: state.UR1Count + 1 + UR1Count: state.UR1Count + 1, }; } // This throws an error if you send a dispatch action to this reducer without having @@ -40,7 +47,7 @@ function reducer1(state, action) { function reducer2(state, action) { if (action.type === 'ADD_TO_ARRAY') { return { - UR2Array: state.UR2Array.concat(action.payload) + UR2Array: state.UR2Array.concat(action.payload), }; } // This throws an error if you send a dispatch action to this reducer without having @@ -50,10 +57,9 @@ function reducer2(state, action) { } function createInitialState(num) { - return { UR1Count: num } + return { UR1Count: num }; } - //---------Custom Hook Definition----------------------------------------------------------------------------------------- function useCustomHook() { @@ -61,23 +67,19 @@ function useCustomHook() { useEffect(() => { setCustomCount((customCount) => customCount + 1); - },[]) + }, []); - return {customCount} + return { customCount }; } - //-------IncrementWithMoreHooks Component Definition-------------------------------------------------------------------------- const IncrementWithMoreHooks = () => { - - //--------useState Invocations---------------------------------------------------------------------------------------------- - + // useState stores stateful data in the component it's defined in const [count, setCount] = useState(0); - const [buttonState, setButtonState] = useState(false) - + const [buttonState, setButtonState] = useState(false); //--------useContext Invocations-------------------------------------------------------------------------------------------- @@ -88,16 +90,14 @@ const IncrementWithMoreHooks = () => { const { user, setUser } = useContext(userContext); const { trip } = useContext(tripContext); - //--------useReduce Invocations---------------------------------------------------------------------------------------------- - // useReducer stores stateful data in the component it's defined in. + // useReducer stores stateful data in the component it's defined in. // It also takes custom 'reducer' functions which dictate how the stateful // data is updated when particular arguments are provided to invoked 'dispatch' functions const [UR1State, dispatch1] = useReducer(reducer1, 0, createInitialState); const [UR2State, dispatch2] = useReducer(reducer2, { UR2Array: [] }); - //--------useRef Invocations------------------------------------------------------------------------------------------------- // useRef stores stateful data that’s not needed for rendering. @@ -105,7 +105,6 @@ const IncrementWithMoreHooks = () => { const ref1 = useRef(null); const ref2 = useRef(1); - //--------useMemo Invocations------------------------------------------------------------------------------------------------ // useMemo takes a callback and dependency arrays holding values used in the callback. @@ -114,12 +113,11 @@ const IncrementWithMoreHooks = () => { // the callback again. This'll save resources if calling the callback is expensive. const memoValue1 = useMemo(() => count * ref2.current * 2, [count, ref2.current]); const memoValue2 = useMemo(() => count * 2, [count]); - //--------useCallback Invocations------------------------------------------------------------------------------------------- // useCallback is similar to useMemo, however it caches a function definition that changes - // based on the dependencies. This'll save resources when defining said function is expensive. + // based on the dependencies. This'll save resources when defining said function is expensive. const callback1 = useCallback(() => { return count * memoValue1; }, [count, memoValue1]); @@ -127,7 +125,6 @@ const IncrementWithMoreHooks = () => { return count * memoValue2; }, [count, memoValue2]); - //--------useEffect Invocations--------------------------------------------------------------------------------------------- // useEffect is a lifecycle hook that invokes its first argument 'setup' callback based on whether or not @@ -141,38 +138,34 @@ const IncrementWithMoreHooks = () => { useEffect(() => { setUser('Mark'); return () => { - console.log('I get executed when IncrementWithMoreHooks unmounts') - } + console.log('I get executed when IncrementWithMoreHooks unmounts'); + }; }, []); - useEffect(() => { setCount((count) => count + 1); }, [buttonState]); - //--------useImmer Invocation------------------------------------------------------------------------------------------------ - + // use-immer is an npm library used for writing simple immutable changes with mutable syntax const [person, updatePerson] = useImmer({ name: 'Jeff', - age: 34 + age: 34, }); // function to increment useImmer age value function incrementPersonAge() { - updatePerson(draft => { + updatePerson((draft) => { draft.age++; }); } - //--------Custom Hook Invocation--------------------------------------------------------------------------------------------- // Custom hook implementation const { customCount } = useCustomHook(); - - + //--------Other function definitions--------------------------------------------------------------------------------------------- //Click function to alter state of buttonState @@ -182,8 +175,7 @@ const IncrementWithMoreHooks = () => { } else { setButtonState(true); } - } - + }; // Converts values like functions, objects, and 'false 'booleans that wouldn't otherwise print in a JSX element to strings if possible function printString(val) { @@ -196,82 +188,71 @@ const IncrementWithMoreHooks = () => { try { result = JSON.stringify(val); } catch { - result = 'Failed to convert into JSON string' + result = 'Failed to convert into JSON string'; } return result; } - //--------Return Statement------------------------------------------------------------------------------------------------------ return (

-

Increment With More Hooks

-

useState data:

-

count: {printString(count)} +

+ count: {printString(count)}
count will increment via useEffect on buttonState state change

buttonState: {printString(buttonState)}

-
-

useContext data:

user: {printString(user)}

trip: {printString(trip)}

-

useReducer data:

UR1State: {printString(UR1State)}

+ dispatch1({ type: 'INCREMENT_UR1COUNT' }); + }} + > + Click to increment UR1Count +

UR2State: {printString(UR2State)}

+ dispatch2({ type: 'ADD_TO_ARRAY', payload: [UR1State.UR1Count] }); + }} + > + Click to push UR1Count count to UR2Array +
-

useRef data:

-

- ref1: {ref1.current - ? 'holds ref to element with id \'useRef-data\'' - : 'null'} -

+

ref1: {ref1.current ? "holds ref to element with id 'useRef-data'" : 'null'}

ref2: {printString(ref2)}
Notice that this change doesn't cause the page to re-render

-
-

useMemo data:

@@ -286,53 +267,46 @@ const IncrementWithMoreHooks = () => {

-

useCallback data:

callback1: {printString(callback1)}

callback2: {printString(callback2)}

-

useEffect data:

-

One useEffect sets useContext's user to {printString(user)} after the component's first render

+

+ One useEffect sets useContext's user to {printString(user)} after the component's first + render +

One useEffect increments useState's count every time buttonState's state changes

count: {printString(count)}
buttonState: {printString(buttonState)}

-
-

useImmer data:

person: {printString(person)}

- +
-

useCustomHook data:

customCount: {printString(customCount)}

- The custom hook utilizes useEffect to increments a useState - var customCount only on the first render. Remove the empty - dependency array from the second parameter of the useEffect + The custom hook utilizes useEffect to increments a useState var customCount only on the + first render. Remove the empty dependency array from the second parameter of the useEffect call to see a show!

); -} +}; -export default IncrementWithMoreHooks; \ No newline at end of file +export default IncrementWithMoreHooks; diff --git a/demo-app/src/types.ts b/demo-app/src/types.ts index c047eaf64..013fb8307 100644 --- a/demo-app/src/types.ts +++ b/demo-app/src/types.ts @@ -10,4 +10,4 @@ export type BoardText = 'X' | 'O' | '-'; export type BoardContent = Array>; //will move scoreboard and player into Board.tsx as these two types are only being used there -//wont make a difference but this is for cleanliness sake \ No newline at end of file +//wont make a difference but this is for cleanliness sake diff --git a/demo-app/webpack.config.js b/demo-app/webpack.config.js index 6f4e0f51e..84e00598d 100644 --- a/demo-app/webpack.config.js +++ b/demo-app/webpack.config.js @@ -52,6 +52,6 @@ module.exports = { }, watchOptions: { poll: true, - ignored: /node_modules/ + ignored: /node_modules/, }, }; diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e2ac6616a --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 000000000..160bb77f1 --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,64 @@ +:root { + --light-hl-0: #AF00DB; + --dark-hl-0: #C586C0; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #001080; + --dark-hl-2: #9CDCFE; + --light-hl-3: #A31515; + --dark-hl-3: #CE9178; + --light-hl-4: #0000FF; + --dark-hl-4: #569CD6; + --light-hl-5: #267F99; + --dark-hl-5: #4EC9B0; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 000000000..7270cff8d --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,59 @@ +"use strict"; +"use strict";(()=>{var Pe=Object.create;var ne=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Fe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!Re.call(t,i)&&i!==n&&ne(t,i,{get:()=>e[i],enumerable:!(r=Ie(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Pe(_e(t)):{},Fe(e||!t||!t.__esModule?ne(n,"default",{value:t,enumerable:!0}):n,t));var ae=Me((se,oe)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),v=s.str.charAt(1),f;v in s.node.edges?f=s.node.edges[v]:(f=new t.TokenSet,s.node.edges[v]=f),s.str.length==1&&(f.final=!0),i.push({node:f,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof se=="object"?oe.exports=n():e.lunr=n()}(this,function(){return t})})()});var re=[];function G(t,e){re.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureActivePageVisible(),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible())}createComponents(e){re.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(n&&n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var de=De(ae());async function le(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=de.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function he(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{le(e,t)}),le(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");let s=!1;i.addEventListener("mousedown",()=>s=!0),i.addEventListener("mouseup",()=>{s=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{s||(s=!1,t.classList.remove("has-focus"))}),Ae(t,i,r,e)}function Ae(t,e,n,r){n.addEventListener("input",ie(()=>{Ne(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ce(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${ce(l.parent,i)}.${d}`);let v=document.createElement("li");v.classList.value=l.classes??"";let f=document.createElement("a");f.href=r.base+l.url,f.innerHTML=u+d,v.append(f),e.appendChild(v)}}function ue(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(K(t.substring(s))),i.join("")}var Be={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>Be[e])}var C=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",pe="mousemove",B="mouseup",J={x:0,y:0},fe=!1,ee=!1,He=!1,D=!1,me=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(me?"is-mobile":"not-mobile");me&&"ontouchstart"in document.documentElement&&(He=!0,F="touchstart",pe="touchmove",B="touchend");document.addEventListener(F,t=>{ee=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(pe,t=>{if(ee&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ee=!1});document.addEventListener("click",t=>{fe&&(t.preventDefault(),t.stopImmediatePropagation(),fe=!1)});var X=class extends C{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(B,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var ve=document.head.appendChild(document.createElement("style"));ve.dataset.for="filters";var Y=class extends C{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ve.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.handleValueChange()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),document.querySelectorAll(".tsd-index-section").forEach(e=>{e.style.display="block";let n=Array.from(e.querySelectorAll(".tsd-index-link")).every(r=>r.offsetParent==null);e.style.display=n?"none":"block"})}};var Z=class extends C{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ge(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ye(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ye(t.value)})}function ye(t){document.documentElement.dataset.theme=t}var Le;function be(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",xe),xe())}async function xe(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();Le=t.dataset.base+"/",t.innerHTML="";for(let s of i)we(s,t,[]);window.app.createComponents(t),window.app.ensureActivePageVisible()}function we(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-index-accordion`:"tsd-index-accordion",s.dataset.key=i.join("$");let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.innerHTML='',Ee(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)we(u,l,i)}else Ee(t,r,t.class)}function Ee(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=Le+t.path,n&&(r.className=n),location.href===r.href&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("tsd-theme");Se&&ge(Se);var je=new U;Object.defineProperty(window,"app",{value:je});he();be();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js new file mode 100644 index 000000000..673abbe3f --- /dev/null +++ b/docs/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js new file mode 100644 index 000000000..2cc68638f --- /dev/null +++ b/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 000000000..98a437794 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1414 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + --light-color-link: #1f70c2; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: var(--light-color-ts-variable); + --light-color-ts-method: var(--light-color-ts-function); + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: var(--light-color-ts-property); + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: var(--dark-color-ts-variable); + --dark-color-ts-method: var(--dark-color-ts-function); + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: var(--dark-color-ts-property); + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 > a:not(.link), +h2 > a:not(.link), +h3 > a:not(.link), +h4 > a:not(.link), +h5 > a:not(.link), +h6 > a:not(.link) { + text-decoration: none; + color: var(--color-text); +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +.uppercase { + text-transform: uppercase; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1700px; + padding: 0 2rem; +} + +/* Footer */ +.tsd-generator { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} + +.tsd-generator > p { + margin-top: 0; + margin-bottom: 0; + padding: 0 1rem; +} + +.container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + position: relative; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h4, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} +.tsd-typography table { + border-collapse: collapse; + border: none; +} +.tsd-typography td, +.tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); +} +.tsd-typography thead, +.tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: fit-content; + width: -moz-fit-content; + align-items: center; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus + svg { + transform: scale(0.95); +} +.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { + transform: scale(1); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.tsd-theme-toggle { + padding-top: 0.75rem; +} +.tsd-theme-toggle > h4 { + display: inline; + vertical-align: middle; + margin-right: 0.75rem; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); +} +.tsd-full-hierarchy, +.tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; +} +.tsd-full-hierarchy ul { + padding-left: 1.5rem; +} +.tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: relative; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation.settings { + margin: 1rem 0; +} +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; +} +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; +} +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li, +.tsd-page-navigation li { + padding: 0; + max-width: 100%; +} +.tsd-nested-navigation { + margin-left: 3rem; +} +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; +} +.tsd-small-nested-navigation { + margin-left: 1.5rem; +} +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; +} + +.tsd-page-navigation ul { + padding-left: 1.75rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} +.tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ +} +.tsd-accordion-summary, +.tsd-accordion-summary a { + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + + cursor: pointer; +} +.tsd-accordion-summary a { + width: calc(100% - 1.5rem); +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-index-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 4rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current:not(.no-results), +#tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through !important; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-literal { + color: var(--color-ts-type-literal); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem 0; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/docs/classes/app_components_Buttons_Tutorial.default.html b/docs/classes/app_components_Buttons_Tutorial.default.html new file mode 100644 index 000000000..a05c27868 --- /dev/null +++ b/docs/classes/app_components_Buttons_Tutorial.default.html @@ -0,0 +1,9 @@ +default | reactime

Hierarchy (view full)

Constructors

Properties

Methods

Constructors

Properties

context: any
forceUpdate: any
props: any
refs: any
setState: any
state: any

Methods

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/app_components_ErrorHandling_ErrorHandler.default.html b/docs/classes/app_components_ErrorHandling_ErrorHandler.default.html new file mode 100644 index 000000000..ca214b255 --- /dev/null +++ b/docs/classes/app_components_ErrorHandling_ErrorHandler.default.html @@ -0,0 +1,4 @@ +default | reactime

Hierarchy

  • any
    • default

Constructors

Methods

Constructors

Methods

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/backend_models_routes.Route.html b/docs/classes/backend_models_routes.Route.html new file mode 100644 index 000000000..fc7afa567 --- /dev/null +++ b/docs/classes/backend_models_routes.Route.html @@ -0,0 +1,4 @@ +Route | reactime

Constructors

Properties

id +url +

Constructors

Properties

id: number
url: string

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/backend_models_routes.Routes.html b/docs/classes/backend_models_routes.Routes.html new file mode 100644 index 000000000..0c4f9b41e --- /dev/null +++ b/docs/classes/backend_models_routes.Routes.html @@ -0,0 +1,22 @@ +Routes | reactime

Constructors

Properties

Methods

Constructors

Properties

current: number = 0
id: number = 0
routeHistory: Route[] = ...

Methods

  • Parameters

    • url: string

      A url string.

      +

    Returns Route

    Either the current route if the user has not navigated away from it or a new instance of a route constructed from the url.

    +

    Method

    addRoute - Method to add a new route to the route history array. Also ensures that the routeHistory stack always matches the browser history stack.

    +
  • This method will perform the following:

    +
      +
    1. Evaluate if user need to navigate to another route
    2. +
    3. If navigation is needed, perform navigation and return true
    4. +
    5. Else return false
    6. +
    +

    Parameters

    Returns boolean

    A boolean indicating whether or not a new route was navigated to.

    +

    Invokes history.go passing in the delta between the current route and the target route. https://developer.mozilla.org/en-US/docs/Web/API/History/go

    +

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/backend_models_tree.default.html b/docs/classes/backend_models_tree.default.html new file mode 100644 index 000000000..a485ac74f --- /dev/null +++ b/docs/classes/backend_models_tree.default.html @@ -0,0 +1,31 @@ +default | reactime

This is the current snapshot that is being sent to the snapshots array. +Creates a Tree

+

Param: state

the current state of the component represented by this node.

+

Param: name

the name of the component represented by this node.

+

Param: componentData

an object containing the props of the component represented by this node.

+

Param: chilren

an array of child nodes.

+

Param: parent

a reference to the parent node.

+

Param: isExpanded

a boolean value indicating whether the node is expanded in the UI.

+

Param: rtid

a unique identifier for the node.

+

Param: route

an object representing the route associated with the node.

+

Constructors

Properties

children: default[]
componentData: {} | ComponentData

Type declaration

    isExpanded: boolean = true
    name: string
    route?: Route
    rtid: string
    state: string | {}

    Type declaration

      Methods

      • Parameters

        • state: string | {}

          string if root, serialized state otherwise

          +
        • name: string

          name of child

          +
        • componentData: {} | ComponentData

          props

          +
        • rtid: string

          ??

          +

        Returns default

          +
        • return new tree instance that is child
        • +
        +
      • Parameters

        • name: string

          Component name

          +

        Returns string

        Unique name for Tree.name

        +

        Function

        checkForDuplicates - Generates a unique name for a component that is being added to the component tree

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_App.default.html b/docs/functions/app_App.default.html new file mode 100644 index 000000000..a54350ab7 --- /dev/null +++ b/docs/functions/app_App.default.html @@ -0,0 +1 @@ +default | reactime

      Function default

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_Actions_Action.default.html b/docs/functions/app_components_Actions_Action.default.html new file mode 100644 index 000000000..9bd080563 --- /dev/null +++ b/docs/functions/app_components_Actions_Action.default.html @@ -0,0 +1,4 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_Actions_RouteDescription.default.html b/docs/functions/app_components_Actions_RouteDescription.default.html new file mode 100644 index 000000000..ccf84f763 --- /dev/null +++ b/docs/functions/app_components_Actions_RouteDescription.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_Actions_SwitchApp.default.html b/docs/functions/app_components_Actions_SwitchApp.default.html new file mode 100644 index 000000000..72fd14cae --- /dev/null +++ b/docs/functions/app_components_Actions_SwitchApp.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_Buttons_StatusDot.default.html b/docs/functions/app_components_Buttons_StatusDot.default.html new file mode 100644 index 000000000..638e10e0c --- /dev/null +++ b/docs/functions/app_components_Buttons_StatusDot.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_DiffRoute_Diff.default.html b/docs/functions/app_components_DiffRoute_Diff.default.html new file mode 100644 index 000000000..7194f24b6 --- /dev/null +++ b/docs/functions/app_components_DiffRoute_Diff.default.html @@ -0,0 +1,5 @@ +default | reactime
      • Displays tree showing two specific versions of tree: +one with specific state changes, the other the whole tree

        +

        Parameters

        Returns JSX.Element

        a diff tree or a string stating no state changes have happened

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_DiffRoute_DiffRoute.default.html b/docs/functions/app_components_DiffRoute_DiffRoute.default.html new file mode 100644 index 000000000..841a1d066 --- /dev/null +++ b/docs/functions/app_components_DiffRoute_DiffRoute.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_ErrorHandling_ErrorMsg.default.html b/docs/functions/app_components_ErrorHandling_ErrorMsg.default.html new file mode 100644 index 000000000..1ead806b9 --- /dev/null +++ b/docs/functions/app_components_ErrorHandling_ErrorMsg.default.html @@ -0,0 +1 @@ +default | reactime
      • Parameters

        • __namedParameters: {
              launchContent: any;
              loadingArray: any;
              reinitialize: any;
              status: any;
          }
          • launchContent: any
          • loadingArray: any
          • reinitialize: any
          • status: any

        Returns JSX.Element

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_ErrorHandling_Loader.default.html b/docs/functions/app_components_ErrorHandling_Loader.default.html new file mode 100644 index 000000000..5b10aa81c --- /dev/null +++ b/docs/functions/app_components_ErrorHandling_Loader.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_ComponentMap_ComponentMap.default.html b/docs/functions/app_components_StateRoute_ComponentMap_ComponentMap.default.html new file mode 100644 index 000000000..f6e59f000 --- /dev/null +++ b/docs/functions/app_components_StateRoute_ComponentMap_ComponentMap.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_ComponentMap_LinkControls.default.html b/docs/functions/app_components_StateRoute_ComponentMap_LinkControls.default.html new file mode 100644 index 000000000..4b6897f4b --- /dev/null +++ b/docs/functions/app_components_StateRoute_ComponentMap_LinkControls.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_ComponentMap_ToolTipDataDisplay.default.html b/docs/functions/app_components_StateRoute_ComponentMap_ToolTipDataDisplay.default.html new file mode 100644 index 000000000..ed86f6570 --- /dev/null +++ b/docs/functions/app_components_StateRoute_ComponentMap_ToolTipDataDisplay.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_ComponentMap_getLinkComponent.default.html b/docs/functions/app_components_StateRoute_ComponentMap_getLinkComponent.default.html new file mode 100644 index 000000000..9f8073f96 --- /dev/null +++ b/docs/functions/app_components_StateRoute_ComponentMap_getLinkComponent.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_History.default.html b/docs/functions/app_components_StateRoute_History.default.html new file mode 100644 index 000000000..c3d3a661f --- /dev/null +++ b/docs/functions/app_components_StateRoute_History.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraph.default.html b/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraph.default.html new file mode 100644 index 000000000..da57b6a61 --- /dev/null +++ b/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraph.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraphComparison.default.html b/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraphComparison.default.html new file mode 100644 index 000000000..891ab75cf --- /dev/null +++ b/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraphComparison.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraphComparisonActions.default.html b/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraphComparisonActions.default.html new file mode 100644 index 000000000..87b6f24bc --- /dev/null +++ b/docs/functions/app_components_StateRoute_PerformanceVisx_BarGraphComparisonActions.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_PerformanceVisx_PerformanceVisx.default.html b/docs/functions/app_components_StateRoute_PerformanceVisx_PerformanceVisx.default.html new file mode 100644 index 000000000..4af33857d --- /dev/null +++ b/docs/functions/app_components_StateRoute_PerformanceVisx_PerformanceVisx.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_PerformanceVisx_RenderingFrequency.default.html b/docs/functions/app_components_StateRoute_PerformanceVisx_RenderingFrequency.default.html new file mode 100644 index 000000000..603c95ba9 --- /dev/null +++ b/docs/functions/app_components_StateRoute_PerformanceVisx_RenderingFrequency.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_StateRoute.default.html b/docs/functions/app_components_StateRoute_StateRoute.default.html new file mode 100644 index 000000000..3221577cd --- /dev/null +++ b/docs/functions/app_components_StateRoute_StateRoute.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_Tree.default.html b/docs/functions/app_components_StateRoute_Tree.default.html new file mode 100644 index 000000000..086d47ce5 --- /dev/null +++ b/docs/functions/app_components_StateRoute_Tree.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_WebMetrics_WebMetrics.default.html b/docs/functions/app_components_StateRoute_WebMetrics_WebMetrics.default.html new file mode 100644 index 000000000..bebc55096 --- /dev/null +++ b/docs/functions/app_components_StateRoute_WebMetrics_WebMetrics.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_StateRoute_WebMetrics_WebMetricsContainer.default.html b/docs/functions/app_components_StateRoute_WebMetrics_WebMetricsContainer.default.html new file mode 100644 index 000000000..b58378e67 --- /dev/null +++ b/docs/functions/app_components_StateRoute_WebMetrics_WebMetricsContainer.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_TimeTravel_Dropdown.default.html b/docs/functions/app_components_TimeTravel_Dropdown.default.html new file mode 100644 index 000000000..245760f42 --- /dev/null +++ b/docs/functions/app_components_TimeTravel_Dropdown.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_components_TimeTravel_MainSlider.default.html b/docs/functions/app_components_TimeTravel_MainSlider.default.html new file mode 100644 index 000000000..1860191ee --- /dev/null +++ b/docs/functions/app_components_TimeTravel_MainSlider.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_containers_ActionContainer.default.html b/docs/functions/app_containers_ActionContainer.default.html new file mode 100644 index 000000000..c69ff5e0d --- /dev/null +++ b/docs/functions/app_containers_ActionContainer.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_containers_ButtonsContainer.default.html b/docs/functions/app_containers_ButtonsContainer.default.html new file mode 100644 index 000000000..3bb53292c --- /dev/null +++ b/docs/functions/app_containers_ButtonsContainer.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_containers_ErrorContainer.default.html b/docs/functions/app_containers_ErrorContainer.default.html new file mode 100644 index 000000000..5910f228e --- /dev/null +++ b/docs/functions/app_containers_ErrorContainer.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_containers_MainContainer.default.html b/docs/functions/app_containers_MainContainer.default.html new file mode 100644 index 000000000..1c6506c35 --- /dev/null +++ b/docs/functions/app_containers_MainContainer.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_containers_StateContainer.default.html b/docs/functions/app_containers_StateContainer.default.html new file mode 100644 index 000000000..f4a33cee5 --- /dev/null +++ b/docs/functions/app_containers_StateContainer.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_containers_TravelContainer.default.html b/docs/functions/app_containers_TravelContainer.default.html new file mode 100644 index 000000000..e5b23447f --- /dev/null +++ b/docs/functions/app_containers_TravelContainer.default.html @@ -0,0 +1 @@ +default | reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.aReactApp.html b/docs/functions/app_slices_mainSlice.aReactApp.html new file mode 100644 index 000000000..9fa940405 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.aReactApp.html @@ -0,0 +1,5 @@ +aReactApp | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/aReactApp";
        }

        • payload: any
        • type: "main/aReactApp"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/aReactApp";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/aReactApp";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/aReactApp";
          }

      type: "main/aReactApp"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.addNewSnapshots.html b/docs/functions/app_slices_mainSlice.addNewSnapshots.html new file mode 100644 index 000000000..927e04c2a --- /dev/null +++ b/docs/functions/app_slices_mainSlice.addNewSnapshots.html @@ -0,0 +1,5 @@ +addNewSnapshots | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/addNewSnapshots";
        }

        • payload: any
        • type: "main/addNewSnapshots"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/addNewSnapshots";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/addNewSnapshots";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/addNewSnapshots";
          }

      type: "main/addNewSnapshots"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.changeSlider.html b/docs/functions/app_slices_mainSlice.changeSlider.html new file mode 100644 index 000000000..13856ff1c --- /dev/null +++ b/docs/functions/app_slices_mainSlice.changeSlider.html @@ -0,0 +1,5 @@ +changeSlider | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/changeSlider";
        }

        • payload: any
        • type: "main/changeSlider"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/changeSlider";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/changeSlider";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/changeSlider";
          }

      type: "main/changeSlider"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.changeView.html b/docs/functions/app_slices_mainSlice.changeView.html new file mode 100644 index 000000000..a9bd22d91 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.changeView.html @@ -0,0 +1,5 @@ +changeView | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/changeView";
        }

        • payload: any
        • type: "main/changeView"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/changeView";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/changeView";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/changeView";
          }

      type: "main/changeView"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.deleteSeries.html b/docs/functions/app_slices_mainSlice.deleteSeries.html new file mode 100644 index 000000000..e5716c31f --- /dev/null +++ b/docs/functions/app_slices_mainSlice.deleteSeries.html @@ -0,0 +1,5 @@ +deleteSeries | reactime
      • Calling this redux#ActionCreator will +return a PayloadAction of type T with a payload of undefined

        +

        Parameters

        • noArgument: void

        Returns {
            payload: undefined;
            type: "main/deleteSeries";
        }

        • payload: undefined
        • type: "main/deleteSeries"

      Properties

      Properties

      match: ((action) => action is {
          payload: undefined;
          type: "main/deleteSeries";
      })

      Type declaration

        • (action): action is {
              payload: undefined;
              type: "main/deleteSeries";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: undefined;
              type: "main/deleteSeries";
          }

      type: "main/deleteSeries"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.deleteTab.html b/docs/functions/app_slices_mainSlice.deleteTab.html new file mode 100644 index 000000000..c0ba6a548 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.deleteTab.html @@ -0,0 +1,5 @@ +deleteTab | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/deleteTab";
        }

        • payload: any
        • type: "main/deleteTab"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/deleteTab";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/deleteTab";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/deleteTab";
          }

      type: "main/deleteTab"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.disconnected.html b/docs/functions/app_slices_mainSlice.disconnected.html new file mode 100644 index 000000000..64cc470d9 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.disconnected.html @@ -0,0 +1,5 @@ +disconnected | reactime
      • Calling this redux#ActionCreator will +return a PayloadAction of type T with a payload of undefined

        +

        Parameters

        • noArgument: void

        Returns {
            payload: undefined;
            type: "main/disconnected";
        }

        • payload: undefined
        • type: "main/disconnected"

      Properties

      Properties

      match: ((action) => action is {
          payload: undefined;
          type: "main/disconnected";
      })

      Type declaration

        • (action): action is {
              payload: undefined;
              type: "main/disconnected";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: undefined;
              type: "main/disconnected";
          }

      type: "main/disconnected"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.emptySnapshots.html b/docs/functions/app_slices_mainSlice.emptySnapshots.html new file mode 100644 index 000000000..a77f7eaa5 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.emptySnapshots.html @@ -0,0 +1,5 @@ +emptySnapshots | reactime
      • Calling this redux#ActionCreator will +return a PayloadAction of type T with a payload of undefined

        +

        Parameters

        • noArgument: void

        Returns {
            payload: undefined;
            type: "main/emptySnapshots";
        }

        • payload: undefined
        • type: "main/emptySnapshots"

      Properties

      Properties

      match: ((action) => action is {
          payload: undefined;
          type: "main/emptySnapshots";
      })

      Type declaration

        • (action): action is {
              payload: undefined;
              type: "main/emptySnapshots";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: undefined;
              type: "main/emptySnapshots";
          }

      type: "main/emptySnapshots"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.endConnect.html b/docs/functions/app_slices_mainSlice.endConnect.html new file mode 100644 index 000000000..3a1484026 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.endConnect.html @@ -0,0 +1,5 @@ +endConnect | reactime
      • Calling this redux#ActionCreator will +return a PayloadAction of type T with a payload of undefined

        +

        Parameters

        • noArgument: void

        Returns {
            payload: undefined;
            type: "main/endConnect";
        }

        • payload: undefined
        • type: "main/endConnect"

      Properties

      Properties

      match: ((action) => action is {
          payload: undefined;
          type: "main/endConnect";
      })

      Type declaration

        • (action): action is {
              payload: undefined;
              type: "main/endConnect";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: undefined;
              type: "main/endConnect";
          }

      type: "main/endConnect"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.importSnapshots.html b/docs/functions/app_slices_mainSlice.importSnapshots.html new file mode 100644 index 000000000..93a8117bb --- /dev/null +++ b/docs/functions/app_slices_mainSlice.importSnapshots.html @@ -0,0 +1,5 @@ +importSnapshots | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/importSnapshots";
        }

        • payload: any
        • type: "main/importSnapshots"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/importSnapshots";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/importSnapshots";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/importSnapshots";
          }

      type: "main/importSnapshots"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.initialConnect.html b/docs/functions/app_slices_mainSlice.initialConnect.html new file mode 100644 index 000000000..f1bd99402 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.initialConnect.html @@ -0,0 +1,5 @@ +initialConnect | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/initialConnect";
        }

        • payload: any
        • type: "main/initialConnect"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/initialConnect";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/initialConnect";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/initialConnect";
          }

      type: "main/initialConnect"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.launchContentScript.html b/docs/functions/app_slices_mainSlice.launchContentScript.html new file mode 100644 index 000000000..43959e06c --- /dev/null +++ b/docs/functions/app_slices_mainSlice.launchContentScript.html @@ -0,0 +1,5 @@ +launchContentScript | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/launchContentScript";
        }

        • payload: any
        • type: "main/launchContentScript"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/launchContentScript";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/launchContentScript";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/launchContentScript";
          }

      type: "main/launchContentScript"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.moveBackward.html b/docs/functions/app_slices_mainSlice.moveBackward.html new file mode 100644 index 000000000..074e82a2a --- /dev/null +++ b/docs/functions/app_slices_mainSlice.moveBackward.html @@ -0,0 +1,5 @@ +moveBackward | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/moveBackward";
        }

        • payload: any
        • type: "main/moveBackward"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/moveBackward";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/moveBackward";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/moveBackward";
          }

      type: "main/moveBackward"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.moveForward.html b/docs/functions/app_slices_mainSlice.moveForward.html new file mode 100644 index 000000000..4e49c9f7c --- /dev/null +++ b/docs/functions/app_slices_mainSlice.moveForward.html @@ -0,0 +1,5 @@ +moveForward | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/moveForward";
        }

        • payload: any
        • type: "main/moveForward"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/moveForward";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/moveForward";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/moveForward";
          }

      type: "main/moveForward"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.noDev.html b/docs/functions/app_slices_mainSlice.noDev.html new file mode 100644 index 000000000..32953e238 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.noDev.html @@ -0,0 +1,5 @@ +noDev | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/noDev";
        }

        • payload: any
        • type: "main/noDev"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/noDev";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/noDev";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/noDev";
          }

      type: "main/noDev"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.onHover.html b/docs/functions/app_slices_mainSlice.onHover.html new file mode 100644 index 000000000..9b4096908 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.onHover.html @@ -0,0 +1,5 @@ +onHover | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/onHover";
        }

        • payload: any
        • type: "main/onHover"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/onHover";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/onHover";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/onHover";
          }

      type: "main/onHover"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.onHoverExit.html b/docs/functions/app_slices_mainSlice.onHoverExit.html new file mode 100644 index 000000000..13d4daaa2 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.onHoverExit.html @@ -0,0 +1,5 @@ +onHoverExit | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/onHoverExit";
        }

        • payload: any
        • type: "main/onHoverExit"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/onHoverExit";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/onHoverExit";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/onHoverExit";
          }

      type: "main/onHoverExit"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.pause.html b/docs/functions/app_slices_mainSlice.pause.html new file mode 100644 index 000000000..9a81fdf86 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.pause.html @@ -0,0 +1,5 @@ +pause | reactime
      • Calling this redux#ActionCreator will +return a PayloadAction of type T with a payload of undefined

        +

        Parameters

        • noArgument: void

        Returns {
            payload: undefined;
            type: "main/pause";
        }

        • payload: undefined
        • type: "main/pause"

      Properties

      Properties

      match: ((action) => action is {
          payload: undefined;
          type: "main/pause";
      })

      Type declaration

        • (action): action is {
              payload: undefined;
              type: "main/pause";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: undefined;
              type: "main/pause";
          }

      type: "main/pause"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.playForward.html b/docs/functions/app_slices_mainSlice.playForward.html new file mode 100644 index 000000000..e5ff51534 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.playForward.html @@ -0,0 +1,5 @@ +playForward | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/playForward";
        }

        • payload: any
        • type: "main/playForward"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/playForward";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/playForward";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/playForward";
          }

      type: "main/playForward"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.resetSlider.html b/docs/functions/app_slices_mainSlice.resetSlider.html new file mode 100644 index 000000000..14a10c9be --- /dev/null +++ b/docs/functions/app_slices_mainSlice.resetSlider.html @@ -0,0 +1,5 @@ +resetSlider | reactime
      • Calling this redux#ActionCreator will +return a PayloadAction of type T with a payload of undefined

        +

        Parameters

        • noArgument: void

        Returns {
            payload: undefined;
            type: "main/resetSlider";
        }

        • payload: undefined
        • type: "main/resetSlider"

      Properties

      Properties

      match: ((action) => action is {
          payload: undefined;
          type: "main/resetSlider";
      })

      Type declaration

        • (action): action is {
              payload: undefined;
              type: "main/resetSlider";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: undefined;
              type: "main/resetSlider";
          }

      type: "main/resetSlider"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.save.html b/docs/functions/app_slices_mainSlice.save.html new file mode 100644 index 000000000..3893f0281 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.save.html @@ -0,0 +1,5 @@ +save | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/save";
        }

        • payload: any
        • type: "main/save"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/save";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/save";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/save";
          }

      type: "main/save"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.setCurrentLocation.html b/docs/functions/app_slices_mainSlice.setCurrentLocation.html new file mode 100644 index 000000000..3553c6e82 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.setCurrentLocation.html @@ -0,0 +1,5 @@ +setCurrentLocation | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/setCurrentLocation";
        }

        • payload: any
        • type: "main/setCurrentLocation"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/setCurrentLocation";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/setCurrentLocation";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/setCurrentLocation";
          }

      type: "main/setCurrentLocation"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.setCurrentTabInApp.html b/docs/functions/app_slices_mainSlice.setCurrentTabInApp.html new file mode 100644 index 000000000..ec13deb40 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.setCurrentTabInApp.html @@ -0,0 +1,5 @@ +setCurrentTabInApp | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/setCurrentTabInApp";
        }

        • payload: any
        • type: "main/setCurrentTabInApp"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/setCurrentTabInApp";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/setCurrentTabInApp";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/setCurrentTabInApp";
          }

      type: "main/setCurrentTabInApp"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.setPort.html b/docs/functions/app_slices_mainSlice.setPort.html new file mode 100644 index 000000000..553777810 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.setPort.html @@ -0,0 +1,5 @@ +setPort | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/setPort";
        }

        • payload: any
        • type: "main/setPort"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/setPort";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/setPort";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/setPort";
          }

      type: "main/setPort"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.setTab.html b/docs/functions/app_slices_mainSlice.setTab.html new file mode 100644 index 000000000..d999f376c --- /dev/null +++ b/docs/functions/app_slices_mainSlice.setTab.html @@ -0,0 +1,5 @@ +setTab | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/setTab";
        }

        • payload: any
        • type: "main/setTab"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/setTab";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/setTab";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/setTab";
          }

      type: "main/setTab"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.startPlaying.html b/docs/functions/app_slices_mainSlice.startPlaying.html new file mode 100644 index 000000000..2a14abb33 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.startPlaying.html @@ -0,0 +1,5 @@ +startPlaying | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/startPlaying";
        }

        • payload: any
        • type: "main/startPlaying"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/startPlaying";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/startPlaying";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/startPlaying";
          }

      type: "main/startPlaying"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.startReconnect.html b/docs/functions/app_slices_mainSlice.startReconnect.html new file mode 100644 index 000000000..5c22bb10b --- /dev/null +++ b/docs/functions/app_slices_mainSlice.startReconnect.html @@ -0,0 +1,5 @@ +startReconnect | reactime
      • Calling this redux#ActionCreator will +return a PayloadAction of type T with a payload of undefined

        +

        Parameters

        • noArgument: void

        Returns {
            payload: undefined;
            type: "main/startReconnect";
        }

        • payload: undefined
        • type: "main/startReconnect"

      Properties

      Properties

      match: ((action) => action is {
          payload: undefined;
          type: "main/startReconnect";
      })

      Type declaration

        • (action): action is {
              payload: undefined;
              type: "main/startReconnect";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: undefined;
              type: "main/startReconnect";
          }

      type: "main/startReconnect"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.toggleExpanded.html b/docs/functions/app_slices_mainSlice.toggleExpanded.html new file mode 100644 index 000000000..5e923b929 --- /dev/null +++ b/docs/functions/app_slices_mainSlice.toggleExpanded.html @@ -0,0 +1,5 @@ +toggleExpanded | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/toggleExpanded";
        }

        • payload: any
        • type: "main/toggleExpanded"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/toggleExpanded";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/toggleExpanded";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/toggleExpanded";
          }

      type: "main/toggleExpanded"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.toggleMode.html b/docs/functions/app_slices_mainSlice.toggleMode.html new file mode 100644 index 000000000..3d0363a0e --- /dev/null +++ b/docs/functions/app_slices_mainSlice.toggleMode.html @@ -0,0 +1,5 @@ +toggleMode | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/toggleMode";
        }

        • payload: any
        • type: "main/toggleMode"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/toggleMode";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/toggleMode";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/toggleMode";
          }

      type: "main/toggleMode"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/app_slices_mainSlice.tutorialSaveSeriesToggle.html b/docs/functions/app_slices_mainSlice.tutorialSaveSeriesToggle.html new file mode 100644 index 000000000..d761b924e --- /dev/null +++ b/docs/functions/app_slices_mainSlice.tutorialSaveSeriesToggle.html @@ -0,0 +1,5 @@ +tutorialSaveSeriesToggle | reactime
      • Calling this redux#ActionCreator with an argument will +return a PayloadAction of type T with a payload of P

        +

        Parameters

        • payload: any

        Returns {
            payload: any;
            type: "main/tutorialSaveSeriesToggle";
        }

        • payload: any
        • type: "main/tutorialSaveSeriesToggle"

      Properties

      Properties

      match: ((action) => action is {
          payload: any;
          type: "main/tutorialSaveSeriesToggle";
      })

      Type declaration

        • (action): action is {
              payload: any;
              type: "main/tutorialSaveSeriesToggle";
          }
        • Parameters

          • action: unknown

          Returns action is {
              payload: any;
              type: "main/tutorialSaveSeriesToggle";
          }

      type: "main/tutorialSaveSeriesToggle"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_controllers_createComponentActionsRecord.default.html b/docs/functions/backend_controllers_createComponentActionsRecord.default.html new file mode 100644 index 000000000..9c7f0067b --- /dev/null +++ b/docs/functions/backend_controllers_createComponentActionsRecord.default.html @@ -0,0 +1,7 @@ +default | reactime
      • This is a recursive function that runs after Fiber commit, if user is navigating to a new route during jumping. This function performs the following logic:

        +
          +
        1. Traverse from FiberRootNode
        2. +
        3. If the component is stateful, extract its update methods & push to the componentActionRecord array
        4. +
        +

        Parameters

        • currentFiberNode: Fiber

          A Fiber object

          +

        Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_controllers_createTree.default.html b/docs/functions/backend_controllers_createTree.default.html new file mode 100644 index 000000000..e5a2f2ce7 --- /dev/null +++ b/docs/functions/backend_controllers_createTree.default.html @@ -0,0 +1,10 @@ +default | reactime
      • This is a function that runs after every Fiber commit using the following logic:

        +
          +
        1. Traverse from FiberRootNode
        2. +
        3. Create an instance of custom Tree class
        4. +
        5. Build a new state snapshot +Every time a state change is made in the accompanying app, the extension creates a Tree “snapshot” of the current state, and adds it to the current “cache” of snapshots in the extension
        6. +
        +

        Parameters

        • currentFiberNode: Fiber

          A Fiber object

          +

        Returns default

        An instance of a Tree object

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_controllers_statePropExtractors.filterAndFormatData.html b/docs/functions/backend_controllers_statePropExtractors.filterAndFormatData.html new file mode 100644 index 000000000..3ab5d17d9 --- /dev/null +++ b/docs/functions/backend_controllers_statePropExtractors.filterAndFormatData.html @@ -0,0 +1,6 @@ +filterAndFormatData | reactime
      • This function receives raw Data from REACT DEV TOOL and filter the Data based on the exclude list. The filterd data is then converted to string (if applicable) before being sent to reacTime front end. +NOTE: the formating is important since Chrome will only accept JSON.stringfiable object. Circular object & function are not JSON stringifiable.

        +

        Parameters

        • reactDevData: {
              [key: string]: any;
          }

          The data object obtained from React Devtool. Ex: memoizedProps, memoizedState

          +
          • [key: string]: any
        • reactimeData: ReactimeData = {}

          The cached data from the current component. This can be data about states, context and/or props of the component.

          +

        Returns ReactimeData

        The update component data object to send to front end of ReactTime

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_controllers_statePropExtractors.getHooksNames.html b/docs/functions/backend_controllers_statePropExtractors.getHooksNames.html new file mode 100644 index 000000000..aa026fc18 --- /dev/null +++ b/docs/functions/backend_controllers_statePropExtractors.getHooksNames.html @@ -0,0 +1,6 @@ +getHooksNames | reactime
      • This function receive a string representation of a functional component. This function then use JSX parser to traverse through the function string, and extract the state variable name and its corresponding setState method.

        +

        Parameters

        • elementType: string

          The string representation of a functional component

          +

        Returns {
            hookName: string;
            varName: string;
        }[]

          +
        • An array of objects with key: hookName (the name of setState method) | value: varName (the state variable name)
        • +
        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_controllers_statePropExtractors.getHooksStateAndUpdateMethod.html b/docs/functions/backend_controllers_statePropExtractors.getHooksStateAndUpdateMethod.html new file mode 100644 index 000000000..520204e42 --- /dev/null +++ b/docs/functions/backend_controllers_statePropExtractors.getHooksStateAndUpdateMethod.html @@ -0,0 +1,9 @@ +getHooksStateAndUpdateMethod | reactime
      • Helper function to:

        +
          +
        • traverse through memoizedState
        • +
        • extract the state data & the dispatch method, which is stored in memoizedState.queue.
        • +
        +

        During time jump, dispatch method will be used to re-render historical state.

        +

        Parameters

        • memoizedState: any

          The current state of the component associated with the current Fiber node.

          +

        Returns HookStateItem[]

        An array of array of HookStateItem objects

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_controllers_throttle.default.html b/docs/functions/backend_controllers_throttle.default.html new file mode 100644 index 000000000..da61292c3 --- /dev/null +++ b/docs/functions/backend_controllers_throttle.default.html @@ -0,0 +1,5 @@ +default | reactime
      • Type Parameters

        • T extends ((...args) => any)

        Parameters

        • callback: T

          A function to throttle

          +
        • MIN_TIME_BETWEEN_UPDATE: number

          A number of milliseconds to use as throttling interval

          +

        Returns ((...arg) => ReturnType<T>)

        A function that limits input function, callback, from being called more than once every MIN_TIME_BETWEEN_UPDATE milliseconds

        +
          • (...arg): ReturnType<T>
          • Parameters

            • Rest ...arg: Parameters<T>

            Returns ReturnType<T>

        Method

        throttle

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_controllers_timeJump.default.html b/docs/functions/backend_controllers_timeJump.default.html new file mode 100644 index 000000000..15efcc821 --- /dev/null +++ b/docs/functions/backend_controllers_timeJump.default.html @@ -0,0 +1,4 @@ +default | reactime
      • This is a closure function to keep track of mode (jumping or not jumping)

        +

        Parameters

        • mode: Status

          The current mode (i.e. jumping)

          +

        Returns ((targetSnapshot) => Promise<void>)

        an async function that takes an targetSnapshot, then invokes updateReactFiberTree based on the state provided within that target snapshot

        +
          • (targetSnapshot): Promise<void>
          • Parameters

            Returns Promise<void>

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_models_tree.serializeState.html b/docs/functions/backend_models_tree.serializeState.html new file mode 100644 index 000000000..6d4256557 --- /dev/null +++ b/docs/functions/backend_models_tree.serializeState.html @@ -0,0 +1,6 @@ +serializeState | reactime
      • Parameters

        • state: any

          Object that contains the current state of the application or system that needs to be serialized.

          +

        Returns any

          +
        • Depclone of the passed in state. If there is any circulate state, return 'circularState'
        • +
        +

        Function

        serializeState - In the context of React, state is often used to store data that determines the behavior and appearance of a component. By serializing the state, we can preserve the component's data across page refreshes, server-side rendering, and other transitions. Additionally, by serializing the state and passing it to a child component, we can create a deep clone of the state, which allows the child component to manipulate the state without affecting the original component. This is useful in situations where we want to keep the state of the parent component immutable, but still allow child components to modify a copy of the state.

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_routers_linkFiber.default.html b/docs/functions/backend_routers_linkFiber.default.html new file mode 100644 index 000000000..53509591c --- /dev/null +++ b/docs/functions/backend_routers_linkFiber.default.html @@ -0,0 +1,12 @@ +default | reactime
      • Parameters

        • mode: Status

          The current mode (i.e. jumping, time-traveling, or paused)

          +

        Returns (() => Promise<void>)

        a function to be invoked by index.js that initiates snapshot monitoring

        +
          • (): Promise<void>
          • Returns Promise<void>

        Function

        linkFiber - linkFiber contains core module functionality, exported as an anonymous function, perform the following logic:

        +
          +
        1. Check if React Dev Tool is installed.
        2. +
        3. Check if the target application (on the browser) is a valid react application.
        4. +
        5. Initiate a event listener for visibility update of the target React Application.
        6. +
        7. Obtain the initial fiberRootNode, which is the root node of the fiber tree
        8. +
        9. Initialize the fiber tree snapShot to send to Front End, later rendered on Chrome Extension.
        10. +
        11. Monkey patching the onCommitFiberRoot from REACT DEV TOOL to obtain updated data after React Applicaiton is re-rendered.
        12. +
        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/functions/backend_routers_snapShot.default.html b/docs/functions/backend_routers_snapShot.default.html new file mode 100644 index 000000000..888258d9c --- /dev/null +++ b/docs/functions/backend_routers_snapShot.default.html @@ -0,0 +1,5 @@ +default | reactime
      • This function creates a new snapShot fiber tree with the provided fiberRoot, then send the updated snapshot to front end. +This runs after every Fiber commit if mode is not jumping. +This

        +

        Parameters

        • fiberRoot: FiberRoot

          The fiberRootNode, which is the root node of the fiber tree is stored in the current property of the fiber root object which we can use to traverse the tree

          +

        Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/hierarchy.html b/docs/hierarchy.html new file mode 100644 index 000000000..5c36716aa --- /dev/null +++ b/docs/hierarchy.html @@ -0,0 +1 @@ +reactime

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..1b7992086 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,275 @@ +reactime

      reactime

      +
      + +
      +
      + React Performance Tool +
      + Nominated for React Open Source Awards 2020 +
      +

      + +

      Reactime is an open-source Chrome developer tool for time travel debugging and performance monitoring in React applications. Reactime enables developers to record snapshots of application state, jump between and inspect state snapshots, and monitor performance metrics such as component render time and render frequency.

      + +
      +

      + + GitHub + + BabelPresetPrefs + LintPrefs +

      + +
      +
      + 🇷🇺   РУССКАЯ ВЕРСИЯ   •   🇫🇷   VERSION FRANÇAISE   •   DEVELOPER README +
      +
      +
      + +

      + +

      + +

      + Website +

      + +

      Features

      🔹 Viewing

      You can view your application's file structure and click on a snapshot to view +your app's state. State can be visualized in a Component Graph, JSON Tree, or +Performance Graph. Snapshots can be compared with the previous snapshot, which can +be viewed in Diff mode. +
      +

      +

      + +

      +
      + +

      🔹 Recording

      Whenever the state is changed (whenever setState, useState is called), this +extension will create a snapshot of the current state tree and record it. Each +snapshot will be displayed in Chrome DevTools under the Reactime panel. +
      +

      +

      🔹 Snapshot Series and Action Comparison

      You can save a series of state snapshots and use it to analyze changes in +component render performance between the current and the previous series of snapshots. +You can also name specific snapshots and compare all snapshots with the same +name. +
      +

      +

      🔹 Components Comparison

      When toggled to a specific snapshot, a visualization of the individual +components of the snapshot will be displayed. This can be done under the same +Performance tab where the snapshots are rendered. You will also find details of +each component upon hovering. +
      +

      +

      🔹 Download/Upload Snapshots

      Download the recorded snapshots as a JSON file and upload them to access state trees across different sessions. +
      +

      +

      + +

      +
      + +

      🔹 Reconnect and Status

      If Reactime loses its connection to the tab you're monitoring, simply click the "reconnect" button to resume your work. You'll notice a circle located to the right of the button, which will appear as either red (indicating disconnection) or green (signifying a successful reconnection). +
      +

      +

      + +

      +
      + +

      🔹 Re-render Optimization

      One of the most common issues that affects performance in React is unnecessary +render cycles. This problem can be fixed by checking your renders in the +Performance tab in Chrome DevTools under the Reactime panel. +
      +

      +

      🔹 Jumping

      Using the actions sidebar, a user can jump to any previously recorded snapshots. +Hitting the jump button on any snapshot will allow a user to view state data at +any point in the history of the target application. +
      +

      +

      🔹 Gatsby

      Reactime offers full support for Gatsby applications. You would be able to +identify unnecessary renders, duration of each rendering, travel-debugging +features and visual representation of the tree components. +
      +

      +

      🔹 Next.js

      Reactime offers debugging and performance tools for Next.js apps: time-traveling +debugging, preventing unnecessary component re-renders and making your +application faster. +
      +

      +

      🔹 Remix

      Reactime offers debugging and performance tools for Remix apps (in beta). Support still +needs to be added for multi-route time traveling. Every other feature works. +
      +

      +

      🔹 TypeScript Support

      Reactime offers support for TypeScript applications using stateful class +components and functional components. Further testing and development is +required for custom hooks and Concurrent Mode. +
      +

      +

      🔹 Documentation

      After cloning this repository, developers can simply run npm run docs at the +root level and serve the dynamically generated /docs/index.html file on a +browser. Doing so will provide a readable, extensible, and interactive GUI view +of the structure and interfaces of the codebase. +
      +

      +

      Additional Features

        +
      • In-app tab-specific tutorial walkthroughs
      • +
      • Hover over a component to view tooltip details on state visualizations
      • +
      • Double-click to collapse child components
      • +
      • Click to focus on a portion of the component map
      • +
      • A dropdown to support the development of projects on multiple tabs
      • +
      • Intuitive navigation between state snapshots
      • +
      • Locked/unlocked feature allowing temporary pause of state monitoring
      • +
      +

      What's New!

      + +

      Reactime 22.0 heralds significant enhancements, addressing core performance issues and fortifying the overall application's stability and reliability. In our pursuit of consistent evolution, we've updated outdated packages and transitioned state management to Redux Toolkit. This strategic shift not only modernizes our tech stack but also ensures our application is positioned for easier maintenance and scalability in the future. Complementing these upgrades, this release also mends various bugs. The debut of features like the reconnection button, a status icon, and the integration of key web metrics – Cumulative Layout Shift (CLS) and Interaction To Next Paint (INP) – amplifies its functionality and offers users a more refined experience.

      +

      Taking a deeper look

      +

      Addressing the persistent disconnection/black screen issues that occasionally affected users during regular application use, we made decisive improvements by removing the "keepAlive" function and implementing robust logic to fix the core issue. This enabled us to refine the communication protocol between our application and the Chrome extension API, delivering a more consistent and stable connection. To further enhance the user experience and foster resilience, we introduced a user-friendly reconnection feature. This not only offers users a swift recovery route but also acts as an added layer of protection against any unexpected disconnections in the future.

      +

      In an effort to improve maintainability, scalability, and longevity, we updated and phased out certain dependencies. To name a few, we moved away from the Immer library and transitioned our state management to use Redux Toolkit, while upgrading the Web Vitals API from version 1.1.2 to 3.5.0, allowing us to harness a broader range of web metrics. As part of this transition, we also converted all of the existing tests to work with the updated state management system, while further expanding testing suites to increase overall testing coverage. Lastly, we achieved a notable increase in TypeScript coverage, strengthening code quality and early detection of potential development issues.

      +

      For an improved user experience, we set our sights on several impactful enhancements. First on our list is the reconnection feature, designed as a protective measure for those unexpected moments when a user gets disconnected. In such events, an intuitive pop-up dialog will instantly emerge, offering users a seamless way to dive right back into their session, while also offering the option to download recorded snapshots of state as a JSON file. Complementing this, we've integrated a dynamic status indicator that transparently displays a user's current app status, highlighting whether they're online or offline. But that's not all. We've enriched the application with two vital web performance metrics: Cumulative Layout Shift (CLS) and Interaction to Next Paint (INP). These metrics are pivotal, providing developers with insights into layout stability and responsiveness, empowering them to optimize user interactions with precision.

      +

      If you would like to read more about previous releases, click here!

      +

      + +

      Installation

      + +

      To get started, install the Reactime +extension +from Chrome Web Store.

      +

      After installing Reactime, you can test its functionalities with your React +application in development mode.

      +

      Please note, the time jumping feature will ONLY work when your +application is running in development mode. In production mode, you are +able to view your application’s component map but no additional features.

      +

      NOTE: The React Developer Tools +extension +is also required for Reactime to run, if you do not already have it installed on +your browser.

      +

      Manual Installation

      Go to Chrome Extensions (make sure Chrome Extension is in Developer Mode) for +manual installation in (https://developer.chrome.com/extensions/faq#faq-dev-01) +and click on Load Unpacked. Use src/extension/build/ to load this extension. +Turn on 'Allow access to file URLs' in the extension details page if testing +locally.

      +

      Looking to contribute to Reactime?

      Please refer to Developer Install for a detailed guide:

      +

      Refer DEVELOPER README for more info on the project, and +instructions on building from source.

      +

      How to Use

      After installing the Chrome extension, just open up your project in the browser.

      +

      Then open up your Chrome DevTools and navigate to the Reactime panel.

      +

      Troubleshooting

      Why is Reactime telling me that no React application is found?

      Reactime initially runs using the dev tools global hook from the Chrome API. It +takes time for Chrome to load this. Try refreshing your application a couple of +times until you see Reactime running.

      +

      Why do I need to have React Dev Tools enabled?

      Reactime works in tandem with the React Developer Tools to access a React application's Fiber tree; under the hood, Reactime traverses the Fiber tree through the React Developer Tool's global hook, pulling all relevant information needed to display to the developer

      +

      There is a black screen instead of the Reactime extension

      Try refreshing the application you want to test and refresh the DevTools by +clicking the right mouse button “Reload frame”.

      +

      I found a bug in Reactime

      Reactime is an open-source project, and we'd love to hear from you about +improving the user experience. Please read DEVELOPER README, +and create a pull request (or issue) to propose and collaborate on changes to Reactime.

      +

      Node version compatibility

      With the release of Node v18.12.1(LTS) on 11/4/22, the script has been updated to +'npm run dev' | 'npm run build' for backwards compatibility.
      For version +Node v16.16.0, please use script 'npm run devlegacy' | 'npm run buildlegacy'

      +

      Read More

      +

      Authors

      +

      License

      This project is licensed under the MIT License - see the LICENSE file +for details.

      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.ActionContainerProps.html b/docs/interfaces/app_FrontendTypes.ActionContainerProps.html new file mode 100644 index 000000000..bc136a3ef --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.ActionContainerProps.html @@ -0,0 +1,4 @@ +ActionContainerProps | reactime

      Interface ActionContainerProps

      interface ActionContainerProps {
          actionView: boolean;
          setActionView: Dispatch<SetStateAction<boolean>>;
          toggleActionContainer: (() => void);
      }

      Properties

      actionView: boolean
      setActionView: Dispatch<SetStateAction<boolean>>
      toggleActionContainer: (() => void)

      Type declaration

        • (): void
        • Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.ActionObj.html b/docs/interfaces/app_FrontendTypes.ActionObj.html new file mode 100644 index 000000000..385950ddc --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.ActionObj.html @@ -0,0 +1,4 @@ +ActionObj | reactime
      interface ActionObj {
          currentTab: string;
          name: string;
          seriesName: string;
      }

      Properties

      Properties

      currentTab: string
      name: string
      seriesName: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.ActionProps.html b/docs/interfaces/app_FrontendTypes.ActionProps.html new file mode 100644 index 000000000..02659f23b --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.ActionProps.html @@ -0,0 +1,15 @@ +ActionProps | reactime

      Template: ActionProps

      Props for the action component

      +
      interface ActionProps {
          componentData: {
              actualDuration: number;
          };
          componentName: string;
          displayName: string;
          handleOnkeyDown: ((e, i) => void);
          index: number;
          isCurrIndex: boolean;
          key: string;
          last: boolean;
          routePath: unknown;
          selected: boolean;
          sliderIndex: number;
          state?: Record<string, unknown>;
          viewIndex: number;
      }

      Properties

      componentData: {
          actualDuration: number;
      }

      Type declaration

      • actualDuration: number
      componentName: string
      displayName: string
      handleOnkeyDown: ((e, i) => void)

      Type declaration

        • (e, i): void
        • Parameters

          • e: KeyboardEvent
          • i: number

          Returns void

      index: number
      isCurrIndex: boolean
      key: string
      last: boolean
      routePath: unknown
      selected: boolean
      sliderIndex: number
      state?: Record<string, unknown>
      viewIndex: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.BarGraphBase.html b/docs/interfaces/app_FrontendTypes.BarGraphBase.html new file mode 100644 index 000000000..829346b79 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.BarGraphBase.html @@ -0,0 +1,5 @@ +BarGraphBase | reactime
      interface BarGraphBase {
          comparison: Series[];
          data: PerfData;
          height: number;
          width: number;
      }

      Hierarchy (view full)

      Properties

      Properties

      comparison: Series[]
      data: PerfData
      height: number
      width: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.BarGraphComparisonAction.html b/docs/interfaces/app_FrontendTypes.BarGraphComparisonAction.html new file mode 100644 index 000000000..74cfa8dc4 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.BarGraphComparisonAction.html @@ -0,0 +1,9 @@ +BarGraphComparisonAction | reactime

      Interface BarGraphComparisonAction

      interface BarGraphComparisonAction {
          action: ActionObj;
          comparison: Series[];
          data: ActionObj[];
          height: number;
          series?: number;
          setAction: ((e) => void);
          setSeries: ((e) => void);
          width: number;
      }

      Properties

      action: ActionObj
      comparison: Series[]
      data: ActionObj[]
      height: number
      series?: number
      setAction: ((e) => void)

      Type declaration

        • (e): void
        • Parameters

          • e: string | boolean

          Returns void

      setSeries: ((e) => void)

      Type declaration

        • (e): void
        • Parameters

          • e: string | boolean

          Returns void

      width: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.BarGraphComparisonProps.html b/docs/interfaces/app_FrontendTypes.BarGraphComparisonProps.html new file mode 100644 index 000000000..5675c09f1 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.BarGraphComparisonProps.html @@ -0,0 +1,8 @@ +BarGraphComparisonProps | reactime

      Interface BarGraphComparisonProps

      interface BarGraphComparisonProps {
          comparison: Series[];
          data: PerfData;
          height: number;
          series: number;
          setAction: ((e) => void);
          setSeries: ((e) => void);
          width: number;
      }

      Hierarchy (view full)

      Properties

      comparison: Series[]
      data: PerfData
      height: number
      series: number
      setAction: ((e) => void)

      Type declaration

        • (e): void
        • Parameters

          • e: string | boolean

          Returns void

      setSeries: ((e) => void)

      Type declaration

        • (e): void
        • Parameters

          • e: string | boolean

          Returns void

      width: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.BarGraphProps.html b/docs/interfaces/app_FrontendTypes.BarGraphProps.html new file mode 100644 index 000000000..cbdb88223 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.BarGraphProps.html @@ -0,0 +1,10 @@ +BarGraphProps | reactime
      interface BarGraphProps {
          allRoutes: unknown;
          comparison: Series[];
          data: PerfData;
          filteredSnapshots: unknown;
          height: number;
          setRoute: (() => void);
          setSnapshot: (() => void);
          snapshot: unknown;
          width: number;
      }

      Hierarchy (view full)

      Properties

      allRoutes: unknown
      comparison: Series[]
      data: PerfData
      filteredSnapshots: unknown
      height: number
      setRoute: (() => void)

      Type declaration

        • (): void
        • Returns void

      setSnapshot: (() => void)

      Type declaration

        • (): void
        • Returns void

      snapshot: unknown
      width: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.BarStackProp.html b/docs/interfaces/app_FrontendTypes.BarStackProp.html new file mode 100644 index 000000000..ec6535921 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.BarStackProp.html @@ -0,0 +1,4 @@ +BarStackProp | reactime
      interface BarStackProp {
          currentTab?: string;
          route: string;
          snapshotId: string;
      }

      Properties

      currentTab?: string
      route: string
      snapshotId: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.ControlStyles.html b/docs/interfaces/app_FrontendTypes.ControlStyles.html new file mode 100644 index 000000000..54a0dce32 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.ControlStyles.html @@ -0,0 +1,2 @@ +ControlStyles | reactime
      interface ControlStyles {
          padding: string;
      }

      Properties

      Properties

      padding: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.CurrentTab.html b/docs/interfaces/app_FrontendTypes.CurrentTab.html new file mode 100644 index 000000000..14eb5a5a8 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.CurrentTab.html @@ -0,0 +1,16 @@ +CurrentTab | reactime
      interface CurrentTab {
          currBranch: number;
          currLocation: {
              [k: string]: any;
          };
          currParent: number;
          hierarchy: {
              branch: number;
              children?: [];
              index: number;
              name: number;
              stateSnapshot: {
                  children: any[];
                  route: any;
              };
          };
          index: number;
          intervalId: number;
          mode: {
              paused: boolean;
          };
          playing: boolean;
          seriesSavedStatus: boolean;
          sliderIndex: number;
          snapshots: {
              [k: string]: any;
          }[];
          status: {
              [k: string]: any;
          };
          title: string;
          viewIndex: number;
          webMetrics: {
              CLS: number;
              FCP: number;
              FID: number;
              INP: number;
              LCP: number;
              TTFB: number;
          };
      }

      Properties

      currBranch: number
      currLocation: {
          [k: string]: any;
      }

      Type declaration

      • [k: string]: any
      currParent: number
      hierarchy: {
          branch: number;
          children?: [];
          index: number;
          name: number;
          stateSnapshot: {
              children: any[];
              route: any;
          };
      }

      Type declaration

      • branch: number
      • Optional children?: []
      • index: number
      • name: number
      • stateSnapshot: {
            children: any[];
            route: any;
        }
        • children: any[]
        • route: any
      index: number
      intervalId: number
      mode: {
          paused: boolean;
      }

      Type declaration

      • paused: boolean
      playing: boolean
      seriesSavedStatus: boolean
      sliderIndex: number
      snapshots: {
          [k: string]: any;
      }[]

      Type declaration

      • [k: string]: any
      status: {
          [k: string]: any;
      }

      Type declaration

      • [k: string]: any
      title: string
      viewIndex: number
      webMetrics: {
          CLS: number;
          FCP: number;
          FID: number;
          INP: number;
          LCP: number;
          TTFB: number;
      }

      Type declaration

      • CLS: number
      • FCP: number
      • FID: number
      • INP: number
      • LCP: number
      • TTFB: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.DefaultMargin.html b/docs/interfaces/app_FrontendTypes.DefaultMargin.html new file mode 100644 index 000000000..5551779ce --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.DefaultMargin.html @@ -0,0 +1,5 @@ +DefaultMargin | reactime
      interface DefaultMargin {
          bottom: number;
          left: number;
          right: number;
          top: number;
      }

      Properties

      Properties

      bottom: number
      left: number
      right: number
      top: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.DiffProps.html b/docs/interfaces/app_FrontendTypes.DiffProps.html new file mode 100644 index 000000000..a6a0e563b --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.DiffProps.html @@ -0,0 +1,3 @@ +DiffProps | reactime
      interface DiffProps {
          show?: boolean;
          snapshot: {
              state?: Record<string, unknown>;
          };
      }

      Properties

      Properties

      show?: boolean
      snapshot: {
          state?: Record<string, unknown>;
      }

      Type declaration

      • Optional state?: Record<string, unknown>

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.DiffRouteProps.html b/docs/interfaces/app_FrontendTypes.DiffRouteProps.html new file mode 100644 index 000000000..fe7c4dd14 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.DiffRouteProps.html @@ -0,0 +1,2 @@ +DiffRouteProps | reactime
      interface DiffRouteProps {
          snapshot: Record<string, {
              children?: unknown[];
              componentData?: Record<string, unknown>;
              name?: string;
              state?: unknown;
              stateSnaphot?: Record<string, unknown>;
          }>;
      }

      Properties

      Properties

      snapshot: Record<string, {
          children?: unknown[];
          componentData?: Record<string, unknown>;
          name?: string;
          state?: unknown;
          stateSnaphot?: Record<string, unknown>;
      }>

      Type declaration

      • Optional children?: unknown[]
      • Optional componentData?: Record<string, unknown>
      • Optional name?: string
      • Optional state?: unknown
      • Optional stateSnaphot?: Record<string, unknown>

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.DropDownStyle.html b/docs/interfaces/app_FrontendTypes.DropDownStyle.html new file mode 100644 index 000000000..b3e2e0bc5 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.DropDownStyle.html @@ -0,0 +1,9 @@ +DropDownStyle | reactime
      interface DropDownStyle {
          backgroundColor: string;
          borderRadius: string;
          borderStyle: string;
          borderWidth: string;
          color: string;
          fontFamily: string;
          margin: string;
          padding: string;
      }

      Properties

      backgroundColor: string
      borderRadius: string
      borderStyle: string
      borderWidth: string
      color: string
      fontFamily: string
      margin: string
      padding: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.DropdownProps.html b/docs/interfaces/app_FrontendTypes.DropdownProps.html new file mode 100644 index 000000000..b13c40b09 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.DropdownProps.html @@ -0,0 +1,4 @@ +DropdownProps | reactime
      interface DropdownProps {
          selectedSpeed: {
              label: string;
              value: number;
          };
          setSpeed: (() => void);
          speeds: {
              label: string;
              value: number;
          }[];
      }

      Properties

      selectedSpeed: {
          label: string;
          value: number;
      }

      Type declaration

      • label: string
      • value: number
      setSpeed: (() => void)

      Type declaration

        • (): void
        • Returns void

      speeds: {
          label: string;
          value: number;
      }[]

      Type declaration

      • label: string
      • value: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.ErrorContainerProps.html b/docs/interfaces/app_FrontendTypes.ErrorContainerProps.html new file mode 100644 index 000000000..c7e8dc8aa --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.ErrorContainerProps.html @@ -0,0 +1,2 @@ +ErrorContainerProps | reactime
      interface ErrorContainerProps {
          port: Port;
      }

      Properties

      Properties

      port: Port

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.HandleProps.html b/docs/interfaces/app_FrontendTypes.HandleProps.html new file mode 100644 index 000000000..f3ad2bfb0 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.HandleProps.html @@ -0,0 +1,4 @@ +HandleProps | reactime
      interface HandleProps {
          dragging: boolean;
          index: number;
          value: number;
      }

      Properties

      Properties

      dragging: boolean
      index: number
      value: number

      Generated using TypeDoc

      \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.InitialState.html b/docs/interfaces/app_FrontendTypes.InitialState.html new file mode 100644 index 000000000..7b282709e --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.InitialState.html @@ -0,0 +1,8 @@ +InitialState | reactime
      interface InitialState {
          connectRequested: boolean;
          connectionStatus: boolean;
          currentTab: number;
          currentTabInApp: string;
          currentTitle: string;
          port: Port;
          tabs: {} | {
              [k: string]: {
                  [k: string]: unknown;
              };
          };
      }

      Properties

      connectRequested: boolean
      connectionStatus: boolean
      currentTab: number
      currentTabInApp: string
      currentTitle: string
      port: Port
      tabs: {} | {
          [k: string]: {
              [k: string]: unknown;
          };
      }

      Type declaration

        Type declaration

        • [k: string]: {
              [k: string]: unknown;
          }
          • [k: string]: unknown

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.LinkComponent.html b/docs/interfaces/app_FrontendTypes.LinkComponent.html new file mode 100644 index 000000000..e3ba72d4b --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.LinkComponent.html @@ -0,0 +1,4 @@ +LinkComponent | reactime
        interface LinkComponent {
            layout: string;
            linkType: string;
            orientation: string;
        }

        Properties

        layout: string
        linkType: string
        orientation: string

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.LinkControlProps.html b/docs/interfaces/app_FrontendTypes.LinkControlProps.html new file mode 100644 index 000000000..11c7d3e80 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.LinkControlProps.html @@ -0,0 +1,12 @@ +LinkControlProps | reactime
        interface LinkControlProps {
            layout: string;
            linkType: string;
            orientation: string;
            selectedNode: string;
            setLayout: ((layout) => void);
            setLinkType: ((linkType) => void);
            setOrientation: ((orientation) => void);
            setSelectedNode: ((selectedNode) => void);
            setStepPercent: ((percent) => void);
            snapShots: Record<string, unknown>;
            stepPercent: number;
        }

        Properties

        layout: string
        linkType: string
        orientation: string
        selectedNode: string
        setLayout: ((layout) => void)

        Type declaration

          • (layout): void
          • Parameters

            • layout: string

            Returns void

        setLinkType: ((linkType) => void)

        Type declaration

          • (linkType): void
          • Parameters

            • linkType: string

            Returns void

        setOrientation: ((orientation) => void)

        Type declaration

          • (orientation): void
          • Parameters

            • orientation: string

            Returns void

        setSelectedNode: ((selectedNode) => void)

        Type declaration

          • (selectedNode): void
          • Parameters

            • selectedNode: string

            Returns void

        setStepPercent: ((percent) => void)

        Type declaration

          • (percent): void
          • Parameters

            • percent: number

            Returns void

        snapShots: Record<string, unknown>
        stepPercent: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.LinkTypesProps.html b/docs/interfaces/app_FrontendTypes.LinkTypesProps.html new file mode 100644 index 000000000..94508a122 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.LinkTypesProps.html @@ -0,0 +1,6 @@ +LinkTypesProps | reactime
        interface LinkTypesProps {
            currentSnapshot?: Record<string, unknown>;
            height: number;
            margin?: {
                bottom: number;
                left: number;
                right: number;
                top: number;
            };
            snapshots: Record<string, unknown>;
            width: number;
        }

        Properties

        currentSnapshot?: Record<string, unknown>
        height: number
        margin?: {
            bottom: number;
            left: number;
            right: number;
            top: number;
        }

        Type declaration

        • bottom: number
        • left: number
        • right: number
        • top: number
        snapshots: Record<string, unknown>
        width: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.MainSliderProps.html b/docs/interfaces/app_FrontendTypes.MainSliderProps.html new file mode 100644 index 000000000..e1e1a94b4 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.MainSliderProps.html @@ -0,0 +1,3 @@ +MainSliderProps | reactime
        interface MainSliderProps {
            className: string;
            snapshotsLength: number;
        }

        Properties

        className: string
        snapshotsLength: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.MainState.html b/docs/interfaces/app_FrontendTypes.MainState.html new file mode 100644 index 000000000..22ec4dfaa --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.MainState.html @@ -0,0 +1,8 @@ +MainState | reactime
        interface MainState {
            connectRequested: boolean;
            connectionStatus: boolean;
            currentTab: number;
            currentTabInApp: string;
            currentTitle: string;
            port: Port;
            tabs: {
                [k: string]: {
                    [k: string]: unknown;
                };
            };
        }

        Properties

        connectRequested: boolean
        connectionStatus: boolean
        currentTab: number
        currentTabInApp: string
        currentTitle: string
        port: Port
        tabs: {
            [k: string]: {
                [k: string]: unknown;
            };
        }

        Type declaration

        • [k: string]: {
              [k: string]: unknown;
          }
          • [k: string]: unknown

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.Margin.html b/docs/interfaces/app_FrontendTypes.Margin.html new file mode 100644 index 000000000..dd6aa151b --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.Margin.html @@ -0,0 +1,5 @@ +Margin | reactime
        interface Margin {
            bottom: number;
            left: number;
            right: number;
            top: number;
        }

        Properties

        Properties

        bottom: number
        left: number
        right: number
        top: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.Node.html b/docs/interfaces/app_FrontendTypes.Node.html new file mode 100644 index 000000000..dfcb4dbda --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.Node.html @@ -0,0 +1,3 @@ +Node | reactime
        interface Node {
            children?: Node[];
            name?: string;
        }

        Properties

        Properties

        children?: Node[]
        name?: string

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.Obj.html b/docs/interfaces/app_FrontendTypes.Obj.html new file mode 100644 index 000000000..f95b07c73 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.Obj.html @@ -0,0 +1,6 @@ +Obj | reactime
        interface Obj {
            branch: number;
            children?: [];
            index: number;
            name: number;
            stateSnapshot: {
                children: any[];
                route: any;
            };
        }

        Properties

        branch: number
        children?: []
        index: number
        name: number
        stateSnapshot: {
            children: any[];
            route: any;
        }

        Type declaration

        • children: any[]
        • route: any

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.OptionsCursorTrueWithMargin.html b/docs/interfaces/app_FrontendTypes.OptionsCursorTrueWithMargin.html new file mode 100644 index 000000000..644b79024 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.OptionsCursorTrueWithMargin.html @@ -0,0 +1,4 @@ +OptionsCursorTrueWithMargin | reactime

        Interface OptionsCursorTrueWithMargin

        interface OptionsCursorTrueWithMargin {
            followCursor: boolean;
            shiftX: number;
            shiftY: number;
        }

        Properties

        Properties

        followCursor: boolean
        shiftX: number
        shiftY: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.PerfData.html b/docs/interfaces/app_FrontendTypes.PerfData.html new file mode 100644 index 000000000..9be0ae923 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.PerfData.html @@ -0,0 +1,4 @@ +PerfData | reactime
        interface PerfData {
            barStack: BarStackProp[];
            componentData?: Record<string, unknown>;
            maxTotalRender: number;
        }

        Properties

        barStack: BarStackProp[]
        componentData?: Record<string, unknown>
        maxTotalRender: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.PerformanceVisxProps.html b/docs/interfaces/app_FrontendTypes.PerformanceVisxProps.html new file mode 100644 index 000000000..934522a8c --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.PerformanceVisxProps.html @@ -0,0 +1,5 @@ +PerformanceVisxProps | reactime

        Interface PerformanceVisxProps

        interface PerformanceVisxProps {
            height: number;
            hierarchy: any;
            snapshots: [];
            width: number;
        }

        Properties

        height: number
        hierarchy: any
        snapshots: []
        width: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.RootState.html b/docs/interfaces/app_FrontendTypes.RootState.html new file mode 100644 index 000000000..13523fe8a --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.RootState.html @@ -0,0 +1,2 @@ +RootState | reactime
        interface RootState {
            main: MainState;
        }

        Properties

        Properties

        main: MainState

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.Series.html b/docs/interfaces/app_FrontendTypes.Series.html new file mode 100644 index 000000000..67a387606 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.Series.html @@ -0,0 +1,3 @@ +Series | reactime
        interface Series {
            data: {
                barStack: ActionObj[];
            };
            name: string;
        }

        Properties

        Properties

        data: {
            barStack: ActionObj[];
        }

        Type declaration

        name: string

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.Snapshots.html b/docs/interfaces/app_FrontendTypes.Snapshots.html new file mode 100644 index 000000000..fb9830371 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.Snapshots.html @@ -0,0 +1,6 @@ +Snapshots | reactime
        interface Snapshots {
            all others: number;
            component1: number;
            component2: number;
            component3: number;
            snapshot: number;
        }

        Properties

        all others: number
        component1: number
        component2: number
        component3: number
        snapshot: number

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.StateContainerProps.html b/docs/interfaces/app_FrontendTypes.StateContainerProps.html new file mode 100644 index 000000000..eb8d4c3ce --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.StateContainerProps.html @@ -0,0 +1,8 @@ +StateContainerProps | reactime
        interface StateContainerProps {
            currLocation?: object;
            hierarchy: Record<string, unknown>;
            snapshot: Record<number, {
                children?: unknown[];
                componentData?: Record<string, unknown>;
                name?: string;
                state?: Record<string, unknown>;
                stateSnaphot?: Record<string, unknown>;
            }>;
            snapshots?: [];
            toggleActionContainer?: any;
            viewIndex?: number;
            webMetrics?: object;
        }

        Properties

        currLocation?: object
        hierarchy: Record<string, unknown>
        snapshot: Record<number, {
            children?: unknown[];
            componentData?: Record<string, unknown>;
            name?: string;
            state?: Record<string, unknown>;
            stateSnaphot?: Record<string, unknown>;
        }>

        Type declaration

        • Optional children?: unknown[]
        • Optional componentData?: Record<string, unknown>
        • Optional name?: string
        • Optional state?: Record<string, unknown>
        • Optional stateSnaphot?: Record<string, unknown>
        snapshots?: []
        toggleActionContainer?: any
        viewIndex?: number
        webMetrics?: object

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.StateRouteProps.html b/docs/interfaces/app_FrontendTypes.StateRouteProps.html new file mode 100644 index 000000000..ec67328ff --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.StateRouteProps.html @@ -0,0 +1,7 @@ +StateRouteProps | reactime
        interface StateRouteProps {
            currLocation: object;
            hierarchy: any;
            snapshot: {
                children?: any[];
                componentData?: object;
                name?: string;
                state?: string | object;
                stateSnaphot?: object;
            };
            snapshots: [];
            viewIndex: number;
            webMetrics: object;
        }

        Properties

        currLocation: object
        hierarchy: any
        snapshot: {
            children?: any[];
            componentData?: object;
            name?: string;
            state?: string | object;
            stateSnaphot?: object;
        }

        Type declaration

        • Optional children?: any[]
        • Optional componentData?: object
        • Optional name?: string
        • Optional state?: string | object
        • Optional stateSnaphot?: object
        snapshots: []
        viewIndex: number
        webMetrics: object

        Generated using TypeDoc

        \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.StatelessCleaning.html b/docs/interfaces/app_FrontendTypes.StatelessCleaning.html new file mode 100644 index 000000000..6ce6dd28b --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.StatelessCleaning.html @@ -0,0 +1,6 @@ +StatelessCleaning | reactime
        interface StatelessCleaning {
            children?: StatelessCleaning[];
            componentData?: Record<string, unknown>;
            name?: string;
            state?: string | {};
            stateSnaphot?: Record<string, unknown>;
        }

        Properties

        children?: StatelessCleaning[]
        componentData?: Record<string, unknown>
        name?: string
        state?: string | {}

        Type declaration

          stateSnaphot?: Record<string, unknown>

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.StepsObj.html b/docs/interfaces/app_FrontendTypes.StepsObj.html new file mode 100644 index 000000000..1b3255b62 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.StepsObj.html @@ -0,0 +1,5 @@ +StepsObj | reactime
          interface StepsObj {
              element?: string | Element;
              intro: string;
              position: string;
              title: string;
          }

          Properties

          Properties

          element?: string | Element
          intro: string
          position: string
          title: string

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.ToolTipStyles.html b/docs/interfaces/app_FrontendTypes.ToolTipStyles.html new file mode 100644 index 000000000..4b86a1500 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.ToolTipStyles.html @@ -0,0 +1,11 @@ +ToolTipStyles | reactime
          interface ToolTipStyles {
              backgroundColor: string;
              color: string;
              defaultStyles: CSSProperties;
              fontFamily: string;
              fontSize: string;
              lineHeight: string;
              maxWidth: number;
              minWidth: number;
              pointerEvents: string;
              zIndex: number;
          }

          Properties

          backgroundColor: string
          color: string
          defaultStyles: CSSProperties
          fontFamily: string
          fontSize: string
          lineHeight: string
          maxWidth: number
          minWidth: number
          pointerEvents: string
          zIndex: number

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.TooltipData.html b/docs/interfaces/app_FrontendTypes.TooltipData.html new file mode 100644 index 000000000..d6b340c8c --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.TooltipData.html @@ -0,0 +1,9 @@ +TooltipData | reactime
          interface TooltipData {
              bar: SeriesPoint<snapshot>;
              color: string;
              height: number;
              index: number;
              key: string;
              width: number;
              x: number;
              y: number;
          }

          Properties

          Properties

          bar: SeriesPoint<snapshot>
          color: string
          height: number
          index: number
          key: string
          width: number
          x: number
          y: number

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.TravelContainerProps.html b/docs/interfaces/app_FrontendTypes.TravelContainerProps.html new file mode 100644 index 000000000..063cd8e65 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.TravelContainerProps.html @@ -0,0 +1,2 @@ +TravelContainerProps | reactime

          Interface TravelContainerProps

          interface TravelContainerProps {
              snapshotsLength: number;
          }

          Properties

          Properties

          snapshotsLength: number

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.TreeProps.html b/docs/interfaces/app_FrontendTypes.TreeProps.html new file mode 100644 index 000000000..4bbe5b65a --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.TreeProps.html @@ -0,0 +1,4 @@ +TreeProps | reactime
          interface TreeProps {
              currLocation?: object;
              snapshot: {
                  children?: any[];
                  componentData?: object;
                  name?: string;
                  state?: string | object;
                  stateSnaphot?: object;
              };
              snapshots?: [];
          }

          Properties

          currLocation?: object
          snapshot: {
              children?: any[];
              componentData?: object;
              name?: string;
              state?: string | object;
              stateSnaphot?: object;
          }

          Type declaration

          • Optional children?: any[]
          • Optional componentData?: object
          • Optional name?: string
          • Optional state?: string | object
          • Optional stateSnaphot?: object
          snapshots?: []

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.TutorialProps.html b/docs/interfaces/app_FrontendTypes.TutorialProps.html new file mode 100644 index 000000000..1962772d8 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.TutorialProps.html @@ -0,0 +1,3 @@ +TutorialProps | reactime
          interface TutorialProps {
              currentTabInApp: string;
              dispatch: Dispatch<UnknownAction>;
          }

          Properties

          currentTabInApp: string
          dispatch: Dispatch<UnknownAction>

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.TutorialState.html b/docs/interfaces/app_FrontendTypes.TutorialState.html new file mode 100644 index 000000000..467731179 --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.TutorialState.html @@ -0,0 +1,2 @@ +TutorialState | reactime
          interface TutorialState {
              stepsEnabled: boolean;
          }

          Properties

          Properties

          stepsEnabled: boolean

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/app_FrontendTypes.snapshot.html b/docs/interfaces/app_FrontendTypes.snapshot.html new file mode 100644 index 000000000..d59adf2cd --- /dev/null +++ b/docs/interfaces/app_FrontendTypes.snapshot.html @@ -0,0 +1,6 @@ +snapshot | reactime
          interface snapshot {
              children: [];
              componentData: {
                  actualDuration: number;
              };
              name: string;
              snapshotId?: string;
              state: string;
          }

          Properties

          children: []
          componentData: {
              actualDuration: number;
          }

          Type declaration

          • actualDuration: number
          name: string
          snapshotId?: string
          state: string

          Generated using TypeDoc

          \ No newline at end of file diff --git a/docs/interfaces/backend_types_backendTypes.ComponentData.html b/docs/interfaces/backend_types_backendTypes.ComponentData.html new file mode 100644 index 000000000..a402fc153 --- /dev/null +++ b/docs/interfaces/backend_types_backendTypes.ComponentData.html @@ -0,0 +1,34 @@ +ComponentData | reactime

          Member

          actualDuration - The time taken to render the current Fiber node and its descendants during the previous render cycle. This value is used to optimize the rendering of components and to provide performance metrics to developers.

          +

          Member

          actualStartTime - The time at which the rendering of the current Fiber node started during the previous render cycle.

          +

          Member

          key - The key a user assigned to the component or null if they didn't assign one

          +

          Member

          context - {in experiment} - An object contains all context information of the current component

          +

          Member

          index - {class component only} - The index of the bound setState method stored in componentActionsRecord

          +

          Member

          hooksState - {functional component only} - An object contains all states of the current functional component

          +

          Member

          hooksIndex - {functional component only} - An array of index of the bound dispatch method stored in componentActionsRecord

          +

          Member

          props - An object contains all props of the current component

          +

          Member

          selfBaseDuration - The base duration of the current Fiber node's render phase (excluding the time taken to render its children). This field is only set when the enableProfilerTimer flag is enabled.

          +

          Member

          state - {class component only} - An object contains all states of the current class component

          +

          Member

          treeBaseDuration - The total base duration of the current Fiber node's subtree. This field is only set when the enableProfilerTimer flag is enabled.

          +
          interface ComponentData {
              actualDuration?: number;
              actualStartTime?: number;
              context: {};
              hooksIndex: number[];
              hooksState: {};
              index: number;
              key: string;
              props: {
                  [key: string]: any;
              };
              selfBaseDuration?: number;
              state: {
                  [key: string]: any;
              };
              treeBaseDuration?: number;
          }

          Properties

          actualDuration?: number

          The time taken to render the current Fiber node and its descendants during the previous render cycle.

          +
          actualStartTime?: number

          The time at which the rendering of the current Fiber node started during the previous render cycle.

          +
          context: {}

          {in experiment} - An object contains all context information of the current component

          +

          Type declaration

            hooksIndex: number[]

            {functional component only} - An array of index of the bound dispatch method stored in componentActionsRecord

            +
            hooksState: {}

            {functional component only} - An object contains all states of the current functional component

            +

            Type declaration

              index: number

              {class component only} - The index of the bound setState method stored in componentActionsRecord

              +
              key: string

              The key a user assigned to the component or null if they didn't assign one

              +
              props: {
                  [key: string]: any;
              }

              An object contains all props of the current component

              +

              Type declaration

              • [key: string]: any
              selfBaseDuration?: number

              The base duration of the current Fiber node's render phase (excluding the time taken to render its children).

              +
              state: {
                  [key: string]: any;
              }

              An object contains all states of the current class component

              +

              Type declaration

              • [key: string]: any
              treeBaseDuration?: number

              The total base duration of the current Fiber node's subtree.

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/interfaces/backend_types_backendTypes.HookStateItem.html b/docs/interfaces/backend_types_backendTypes.HookStateItem.html new file mode 100644 index 000000000..6794baa30 --- /dev/null +++ b/docs/interfaces/backend_types_backendTypes.HookStateItem.html @@ -0,0 +1,7 @@ +HookStateItem | reactime

              Member

              state - states within the current functional component

              +

              Member

              component - contains bound dispatch method to update state of the current functional component

              +
              interface HookStateItem {
                  component: any;
                  state: any;
              }

              Properties

              Properties

              component: any

              an object contains bound dispatch method to update state of the current functional component

              +
              state: any

              states within the current functional component

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/interfaces/backend_types_backendTypes.MsgData.html b/docs/interfaces/backend_types_backendTypes.MsgData.html new file mode 100644 index 000000000..036940116 --- /dev/null +++ b/docs/interfaces/backend_types_backendTypes.MsgData.html @@ -0,0 +1,3 @@ +MsgData | reactime

              Member

              data - an object with action & payload properties

              +
              interface MsgData {
                  data: {
                      action: string;
                      payload: any;
                  };
              }

              Properties

              Properties

              data: {
                  action: string;
                  payload: any;
              }

              Type declaration

              • action: string
              • payload: any

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/interfaces/backend_types_backendTypes.Snapshot.html b/docs/interfaces/backend_types_backendTypes.Snapshot.html new file mode 100644 index 000000000..143edce98 --- /dev/null +++ b/docs/interfaces/backend_types_backendTypes.Snapshot.html @@ -0,0 +1,5 @@ +Snapshot | reactime

              Contain snapshot of the current ReactFiber tree

              +

              Member

              tree - A snapshot of ReactFiber Tree to send to front end

              +
              interface Snapshot {
                  tree: default;
              }

              Properties

              Properties

              tree: default

              A snapshot of ReactFiber Tree to send to front end

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/interfaces/backend_types_backendTypes.Status.html b/docs/interfaces/backend_types_backendTypes.Status.html new file mode 100644 index 000000000..db7203cf0 --- /dev/null +++ b/docs/interfaces/backend_types_backendTypes.Status.html @@ -0,0 +1,14 @@ +Status | reactime

              Indicate if mode is jumping/not jumping or navigating during jumping

              +

              Member

              jumping - Describe whether we are jumping

              +

              When jumping = true, no new snapShot will be sent to front end.

              +

              Member

              navigating - Cache timeJump function to be invoked after ReactFibe tree update with new states from new route

              +

              Example

              if user uses click left/right arrow or play button, front end will post a message `jumpToSnap` and a payload of the cached snapShot tree, we will set `jumping = true`
              +
              +

              Example

              if during jumping, we navigate to another route, such as from buttons to tictactoe, backend will set `navigating = cache of timeJump function`
              +
              +
              interface Status {
                  jumping: boolean;
                  navigating?: Function;
              }

              Properties

              Properties

              jumping: boolean

              Describe whether we are jumping

              +

              When jumping = true, no new snapShot will be sent to front end.

              +
              navigating?: Function

              Cache timeJump function to be invoked after ReactFibe tree update with new states from new route

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/interfaces/backend_types_linkFiberTypes.DevTools.html b/docs/interfaces/backend_types_linkFiberTypes.DevTools.html new file mode 100644 index 000000000..7a3967979 --- /dev/null +++ b/docs/interfaces/backend_types_linkFiberTypes.DevTools.html @@ -0,0 +1,18 @@ +DevTools | reactime

              DevTools - A global object provided by the React Developer Tools extension. It provides a set of methods that allow developers to inspect and manipulate React components in the browser.

              +
              interface DevTools {
                  getFiberRoots: ((rendererID) => Set<FiberRoot>);
                  onCommitFiberRoot: ((rendererID, root, priorityLevel) => void);
                  renderers: Map<1, {
                      version: string;
                  }>;
              }

              Properties

              getFiberRoots: ((rendererID) => Set<FiberRoot>)

              Type declaration

                • (rendererID): Set<FiberRoot>
                • Parameters

                  • rendererID: number

                  Returns Set<FiberRoot>

                  A set of fiberRoot.

                  +

                  Method

                  getFiberRoots - get the Set of fiber roots that are currently mounted for the given rendererID. If not found, initalize a new empty Set at renderID key.

                  +

              Method

              getFiberRoots - get the Set of fiber roots that are currently mounted for the given rendererID. If not found, initalize a new empty Set at renderID key.

              +

              Param: renderID

              a unique identifier for a specific instance of a React renderer. When a React application is first mounted, it will receive a rendererID. This rendererID will remain the same for the entire lifecycle of the application, even if the state is updated and the components are re-rendered/unmounted/added. However, if the application is unmounted and re-mounted again, it will receive a new rendererID.

              +

              Returns

              A set of fiberRoot.

              +
              onCommitFiberRoot: ((rendererID, root, priorityLevel) => void)

              Type declaration

                • (rendererID, root, priorityLevel): void
                • Parameters

                  • rendererID: number

                    a unique identifier for a specific instance of a React renderer

                    +
                  • root: FiberRoot

                    root of the rendered tree (a.k.a the root of the React Application)

                    +
                  • priorityLevel: any

                  Returns void

                  void

                  +

                  Method

                  onCommitFiberRoot - After the state of a component in a React Application is updated, the virtual DOM will be updated. When a render has been commited for a root, onCommitFiberRoot will be invoked to determine if the component is being mounted, updated, or unmounted. After that, this method will send update information to the React DevTools to update its UI to reflect the change.

                  +

              Method

              onCommitFiberRoot - After the state of a component in a React Application is updated, the virtual DOM will be updated. When a render has been commited for a root, onCommitFiberRoot will be invoked to determine if the component is being mounted, updated, or unmounted. After that, this method will send update information to the React DevTools to update its UI to reflect the change.

              +

              Param: rendererID

              a unique identifier for a specific instance of a React renderer

              +

              Param: root

              root of the rendered tree (a.k.a the root of the React Application)

              +

              Param: priorityLevel

              Returns

              void

              +
              renderers: Map<1, {
                  version: string;
              }>

              Type declaration

              • version: string

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app.html b/docs/modules/app.html new file mode 100644 index 000000000..9a5a9062c --- /dev/null +++ b/docs/modules/app.html @@ -0,0 +1 @@ +app | reactime

              Module app

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_App.html b/docs/modules/app_App.html new file mode 100644 index 000000000..eb1f323df --- /dev/null +++ b/docs/modules/app_App.html @@ -0,0 +1,2 @@ +app/App | reactime

              Module app/App

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_FrontendTypes.html b/docs/modules/app_FrontendTypes.html new file mode 100644 index 000000000..9691e53cd --- /dev/null +++ b/docs/modules/app_FrontendTypes.html @@ -0,0 +1,44 @@ +app/FrontendTypes | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_Actions_Action.html b/docs/modules/app_components_Actions_Action.html new file mode 100644 index 000000000..679f3c993 --- /dev/null +++ b/docs/modules/app_components_Actions_Action.html @@ -0,0 +1,2 @@ +app/components/Actions/Action | reactime

              Module app/components/Actions/Action

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_Actions_RouteDescription.html b/docs/modules/app_components_Actions_RouteDescription.html new file mode 100644 index 000000000..84d87869a --- /dev/null +++ b/docs/modules/app_components_Actions_RouteDescription.html @@ -0,0 +1,2 @@ +app/components/Actions/RouteDescription | reactime

              Module app/components/Actions/RouteDescription

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_Actions_SwitchApp.html b/docs/modules/app_components_Actions_SwitchApp.html new file mode 100644 index 000000000..a21c4fcd5 --- /dev/null +++ b/docs/modules/app_components_Actions_SwitchApp.html @@ -0,0 +1,2 @@ +app/components/Actions/SwitchApp | reactime

              Module app/components/Actions/SwitchApp

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_Buttons_StatusDot.html b/docs/modules/app_components_Buttons_StatusDot.html new file mode 100644 index 000000000..33de43c83 --- /dev/null +++ b/docs/modules/app_components_Buttons_StatusDot.html @@ -0,0 +1,2 @@ +app/components/Buttons/StatusDot | reactime

              Module app/components/Buttons/StatusDot

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_Buttons_Tutorial.html b/docs/modules/app_components_Buttons_Tutorial.html new file mode 100644 index 000000000..f69fa8e78 --- /dev/null +++ b/docs/modules/app_components_Buttons_Tutorial.html @@ -0,0 +1,2 @@ +app/components/Buttons/Tutorial | reactime

              Module app/components/Buttons/Tutorial

              Index

              Classes

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_DiffRoute_Diff.html b/docs/modules/app_components_DiffRoute_Diff.html new file mode 100644 index 000000000..dacf73634 --- /dev/null +++ b/docs/modules/app_components_DiffRoute_Diff.html @@ -0,0 +1,2 @@ +app/components/DiffRoute/Diff | reactime

              Module app/components/DiffRoute/Diff

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_DiffRoute_DiffRoute.html b/docs/modules/app_components_DiffRoute_DiffRoute.html new file mode 100644 index 000000000..297420fe1 --- /dev/null +++ b/docs/modules/app_components_DiffRoute_DiffRoute.html @@ -0,0 +1,2 @@ +app/components/DiffRoute/DiffRoute | reactime

              Module app/components/DiffRoute/DiffRoute

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_ErrorHandling_ErrorHandler.html b/docs/modules/app_components_ErrorHandling_ErrorHandler.html new file mode 100644 index 000000000..2f52c9a60 --- /dev/null +++ b/docs/modules/app_components_ErrorHandling_ErrorHandler.html @@ -0,0 +1,2 @@ +app/components/ErrorHandling/ErrorHandler | reactime

              Module app/components/ErrorHandling/ErrorHandler

              Index

              Classes

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_ErrorHandling_ErrorMsg.html b/docs/modules/app_components_ErrorHandling_ErrorMsg.html new file mode 100644 index 000000000..4cc027203 --- /dev/null +++ b/docs/modules/app_components_ErrorHandling_ErrorMsg.html @@ -0,0 +1,2 @@ +app/components/ErrorHandling/ErrorMsg | reactime

              Module app/components/ErrorHandling/ErrorMsg

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_ErrorHandling_Loader.html b/docs/modules/app_components_ErrorHandling_Loader.html new file mode 100644 index 000000000..0644759f2 --- /dev/null +++ b/docs/modules/app_components_ErrorHandling_Loader.html @@ -0,0 +1,2 @@ +app/components/ErrorHandling/Loader | reactime

              Module app/components/ErrorHandling/Loader

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_ComponentMap_ComponentMap.html b/docs/modules/app_components_StateRoute_ComponentMap_ComponentMap.html new file mode 100644 index 000000000..2ad83ccf9 --- /dev/null +++ b/docs/modules/app_components_StateRoute_ComponentMap_ComponentMap.html @@ -0,0 +1,2 @@ +app/components/StateRoute/ComponentMap/ComponentMap | reactime

              Module app/components/StateRoute/ComponentMap/ComponentMap

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_ComponentMap_LinkControls.html b/docs/modules/app_components_StateRoute_ComponentMap_LinkControls.html new file mode 100644 index 000000000..2d0cc7031 --- /dev/null +++ b/docs/modules/app_components_StateRoute_ComponentMap_LinkControls.html @@ -0,0 +1,2 @@ +app/components/StateRoute/ComponentMap/LinkControls | reactime

              Module app/components/StateRoute/ComponentMap/LinkControls

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_ComponentMap_ToolTipDataDisplay.html b/docs/modules/app_components_StateRoute_ComponentMap_ToolTipDataDisplay.html new file mode 100644 index 000000000..93d7fc268 --- /dev/null +++ b/docs/modules/app_components_StateRoute_ComponentMap_ToolTipDataDisplay.html @@ -0,0 +1,2 @@ +app/components/StateRoute/ComponentMap/ToolTipDataDisplay | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_ComponentMap_getLinkComponent.html b/docs/modules/app_components_StateRoute_ComponentMap_getLinkComponent.html new file mode 100644 index 000000000..ded9c6cf3 --- /dev/null +++ b/docs/modules/app_components_StateRoute_ComponentMap_getLinkComponent.html @@ -0,0 +1,2 @@ +app/components/StateRoute/ComponentMap/getLinkComponent | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_History.html b/docs/modules/app_components_StateRoute_History.html new file mode 100644 index 000000000..292cc4ff2 --- /dev/null +++ b/docs/modules/app_components_StateRoute_History.html @@ -0,0 +1,2 @@ +app/components/StateRoute/History | reactime

              Module app/components/StateRoute/History

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraph.html b/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraph.html new file mode 100644 index 000000000..070786338 --- /dev/null +++ b/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraph.html @@ -0,0 +1,2 @@ +app/components/StateRoute/PerformanceVisx/BarGraph | reactime

              Module app/components/StateRoute/PerformanceVisx/BarGraph

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraphComparison.html b/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraphComparison.html new file mode 100644 index 000000000..bd5b54fc7 --- /dev/null +++ b/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraphComparison.html @@ -0,0 +1,2 @@ +app/components/StateRoute/PerformanceVisx/BarGraphComparison | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraphComparisonActions.html b/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraphComparisonActions.html new file mode 100644 index 000000000..ab8c74622 --- /dev/null +++ b/docs/modules/app_components_StateRoute_PerformanceVisx_BarGraphComparisonActions.html @@ -0,0 +1,2 @@ +app/components/StateRoute/PerformanceVisx/BarGraphComparisonActions | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_PerformanceVisx_PerformanceVisx.html b/docs/modules/app_components_StateRoute_PerformanceVisx_PerformanceVisx.html new file mode 100644 index 000000000..6009860de --- /dev/null +++ b/docs/modules/app_components_StateRoute_PerformanceVisx_PerformanceVisx.html @@ -0,0 +1,2 @@ +app/components/StateRoute/PerformanceVisx/PerformanceVisx | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_PerformanceVisx_RenderingFrequency.html b/docs/modules/app_components_StateRoute_PerformanceVisx_RenderingFrequency.html new file mode 100644 index 000000000..8b74bbaca --- /dev/null +++ b/docs/modules/app_components_StateRoute_PerformanceVisx_RenderingFrequency.html @@ -0,0 +1,2 @@ +app/components/StateRoute/PerformanceVisx/RenderingFrequency | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_StateRoute.html b/docs/modules/app_components_StateRoute_StateRoute.html new file mode 100644 index 000000000..381f77925 --- /dev/null +++ b/docs/modules/app_components_StateRoute_StateRoute.html @@ -0,0 +1,2 @@ +app/components/StateRoute/StateRoute | reactime

              Module app/components/StateRoute/StateRoute

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_Tree.html b/docs/modules/app_components_StateRoute_Tree.html new file mode 100644 index 000000000..e2fe582d2 --- /dev/null +++ b/docs/modules/app_components_StateRoute_Tree.html @@ -0,0 +1,2 @@ +app/components/StateRoute/Tree | reactime

              Module app/components/StateRoute/Tree

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_WebMetrics_WebMetrics.html b/docs/modules/app_components_StateRoute_WebMetrics_WebMetrics.html new file mode 100644 index 000000000..e4ad4de94 --- /dev/null +++ b/docs/modules/app_components_StateRoute_WebMetrics_WebMetrics.html @@ -0,0 +1,2 @@ +app/components/StateRoute/WebMetrics/WebMetrics | reactime

              Module app/components/StateRoute/WebMetrics/WebMetrics

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_StateRoute_WebMetrics_WebMetricsContainer.html b/docs/modules/app_components_StateRoute_WebMetrics_WebMetricsContainer.html new file mode 100644 index 000000000..ee6a96d93 --- /dev/null +++ b/docs/modules/app_components_StateRoute_WebMetrics_WebMetricsContainer.html @@ -0,0 +1,2 @@ +app/components/StateRoute/WebMetrics/WebMetricsContainer | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_TimeTravel_Dropdown.html b/docs/modules/app_components_TimeTravel_Dropdown.html new file mode 100644 index 000000000..d18446454 --- /dev/null +++ b/docs/modules/app_components_TimeTravel_Dropdown.html @@ -0,0 +1,2 @@ +app/components/TimeTravel/Dropdown | reactime

              Module app/components/TimeTravel/Dropdown

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_components_TimeTravel_MainSlider.html b/docs/modules/app_components_TimeTravel_MainSlider.html new file mode 100644 index 000000000..b2116f394 --- /dev/null +++ b/docs/modules/app_components_TimeTravel_MainSlider.html @@ -0,0 +1,2 @@ +app/components/TimeTravel/MainSlider | reactime

              Module app/components/TimeTravel/MainSlider

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_containers_ActionContainer.html b/docs/modules/app_containers_ActionContainer.html new file mode 100644 index 000000000..4818ee220 --- /dev/null +++ b/docs/modules/app_containers_ActionContainer.html @@ -0,0 +1,2 @@ +app/containers/ActionContainer | reactime

              Module app/containers/ActionContainer

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_containers_ButtonsContainer.html b/docs/modules/app_containers_ButtonsContainer.html new file mode 100644 index 000000000..8ef84e1cf --- /dev/null +++ b/docs/modules/app_containers_ButtonsContainer.html @@ -0,0 +1,2 @@ +app/containers/ButtonsContainer | reactime

              Module app/containers/ButtonsContainer

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_containers_ErrorContainer.html b/docs/modules/app_containers_ErrorContainer.html new file mode 100644 index 000000000..ea2bb19d4 --- /dev/null +++ b/docs/modules/app_containers_ErrorContainer.html @@ -0,0 +1,2 @@ +app/containers/ErrorContainer | reactime

              Module app/containers/ErrorContainer

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_containers_MainContainer.html b/docs/modules/app_containers_MainContainer.html new file mode 100644 index 000000000..df0a00627 --- /dev/null +++ b/docs/modules/app_containers_MainContainer.html @@ -0,0 +1,2 @@ +app/containers/MainContainer | reactime

              Module app/containers/MainContainer

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_containers_StateContainer.html b/docs/modules/app_containers_StateContainer.html new file mode 100644 index 000000000..af05408ca --- /dev/null +++ b/docs/modules/app_containers_StateContainer.html @@ -0,0 +1,2 @@ +app/containers/StateContainer | reactime

              Module app/containers/StateContainer

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_containers_TravelContainer.html b/docs/modules/app_containers_TravelContainer.html new file mode 100644 index 000000000..a45d908e2 --- /dev/null +++ b/docs/modules/app_containers_TravelContainer.html @@ -0,0 +1,2 @@ +app/containers/TravelContainer | reactime

              Module app/containers/TravelContainer

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._d3_.html b/docs/modules/app_module._d3_.html new file mode 100644 index 000000000..2f25300c0 --- /dev/null +++ b/docs/modules/app_module._d3_.html @@ -0,0 +1 @@ +"d3" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._html_react_parser_.html b/docs/modules/app_module._html_react_parser_.html new file mode 100644 index 000000000..e66127b7a --- /dev/null +++ b/docs/modules/app_module._html_react_parser_.html @@ -0,0 +1 @@ +"html-react-parser" | reactime

              Namespace "html-react-parser"

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._immer_.html b/docs/modules/app_module._immer_.html new file mode 100644 index 000000000..82ba0d231 --- /dev/null +++ b/docs/modules/app_module._immer_.html @@ -0,0 +1 @@ +"immer" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._jsondiffpatch_.html b/docs/modules/app_module._jsondiffpatch_.html new file mode 100644 index 000000000..92a96ff61 --- /dev/null +++ b/docs/modules/app_module._jsondiffpatch_.html @@ -0,0 +1 @@ +"jsondiffpatch" | reactime

              Namespace "jsondiffpatch"

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._rc_slider_.html b/docs/modules/app_module._rc_slider_.html new file mode 100644 index 000000000..df45c28c2 --- /dev/null +++ b/docs/modules/app_module._rc_slider_.html @@ -0,0 +1 @@ +"rc-slider" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._rc_tooltip_.html b/docs/modules/app_module._rc_tooltip_.html new file mode 100644 index 000000000..ea6adf11a --- /dev/null +++ b/docs/modules/app_module._rc_tooltip_.html @@ -0,0 +1 @@ +"rc-tooltip" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_.html b/docs/modules/app_module._react_.html new file mode 100644 index 000000000..6527aa8a1 --- /dev/null +++ b/docs/modules/app_module._react_.html @@ -0,0 +1 @@ +"react" | reactime

              Namespace "react"

              Hierarchy (view full)

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_apexcharts_.html b/docs/modules/app_module._react_apexcharts_.html new file mode 100644 index 000000000..fa7c41a49 --- /dev/null +++ b/docs/modules/app_module._react_apexcharts_.html @@ -0,0 +1 @@ +"react-apexcharts" | reactime

              Namespace "react-apexcharts"

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_dom_.html b/docs/modules/app_module._react_dom_.html new file mode 100644 index 000000000..e69673b4d --- /dev/null +++ b/docs/modules/app_module._react_dom_.html @@ -0,0 +1 @@ +"react-dom" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_hover_.html b/docs/modules/app_module._react_hover_.html new file mode 100644 index 000000000..587e58a1b --- /dev/null +++ b/docs/modules/app_module._react_hover_.html @@ -0,0 +1 @@ +"react-hover" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_json_tree_.html b/docs/modules/app_module._react_json_tree_.html new file mode 100644 index 000000000..8b3e3a7c3 --- /dev/null +++ b/docs/modules/app_module._react_json_tree_.html @@ -0,0 +1 @@ +"react-json-tree" | reactime

              Namespace "react-json-tree"

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_router_dom_.html b/docs/modules/app_module._react_router_dom_.html new file mode 100644 index 000000000..311efe2a8 --- /dev/null +++ b/docs/modules/app_module._react_router_dom_.html @@ -0,0 +1 @@ +"react-router-dom" | reactime

              Namespace "react-router-dom"

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_select_.html b/docs/modules/app_module._react_select_.html new file mode 100644 index 000000000..fe580f204 --- /dev/null +++ b/docs/modules/app_module._react_select_.html @@ -0,0 +1 @@ +"react-select" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module._react_spinners_.html b/docs/modules/app_module._react_spinners_.html new file mode 100644 index 000000000..47a975031 --- /dev/null +++ b/docs/modules/app_module._react_spinners_.html @@ -0,0 +1 @@ +"react-spinners" | reactime

              Namespace "react-spinners"

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_module.html b/docs/modules/app_module.html new file mode 100644 index 000000000..88b7ed1fc --- /dev/null +++ b/docs/modules/app_module.html @@ -0,0 +1,15 @@ +app/module | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_slices_mainSlice.html b/docs/modules/app_slices_mainSlice.html new file mode 100644 index 000000000..5a4af5744 --- /dev/null +++ b/docs/modules/app_slices_mainSlice.html @@ -0,0 +1,32 @@ +app/slices/mainSlice | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_store.html b/docs/modules/app_store.html new file mode 100644 index 000000000..e151789ec --- /dev/null +++ b/docs/modules/app_store.html @@ -0,0 +1,2 @@ +app/store | reactime

              Module app/store

              Index

              Variables

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/app_styles_theme.html b/docs/modules/app_styles_theme.html new file mode 100644 index 000000000..2c470e941 --- /dev/null +++ b/docs/modules/app_styles_theme.html @@ -0,0 +1,2 @@ +app/styles/theme | reactime

              Module app/styles/theme

              Index

              Variables

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend.html b/docs/modules/backend.html new file mode 100644 index 000000000..903c8d062 --- /dev/null +++ b/docs/modules/backend.html @@ -0,0 +1 @@ +backend | reactime

              Module backend

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_controllers_createComponentActionsRecord.html b/docs/modules/backend_controllers_createComponentActionsRecord.html new file mode 100644 index 000000000..0b2e39e58 --- /dev/null +++ b/docs/modules/backend_controllers_createComponentActionsRecord.html @@ -0,0 +1,2 @@ +backend/controllers/createComponentActionsRecord | reactime

              Module backend/controllers/createComponentActionsRecord

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_controllers_createTree.html b/docs/modules/backend_controllers_createTree.html new file mode 100644 index 000000000..96b44085b --- /dev/null +++ b/docs/modules/backend_controllers_createTree.html @@ -0,0 +1,2 @@ +backend/controllers/createTree | reactime

              Module backend/controllers/createTree

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_controllers_statePropExtractors.html b/docs/modules/backend_controllers_statePropExtractors.html new file mode 100644 index 000000000..492a5a371 --- /dev/null +++ b/docs/modules/backend_controllers_statePropExtractors.html @@ -0,0 +1,4 @@ +backend/controllers/statePropExtractors | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_controllers_throttle.html b/docs/modules/backend_controllers_throttle.html new file mode 100644 index 000000000..cbc672419 --- /dev/null +++ b/docs/modules/backend_controllers_throttle.html @@ -0,0 +1,2 @@ +backend/controllers/throttle | reactime

              Module backend/controllers/throttle

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_controllers_timeJump.html b/docs/modules/backend_controllers_timeJump.html new file mode 100644 index 000000000..f5b0f0739 --- /dev/null +++ b/docs/modules/backend_controllers_timeJump.html @@ -0,0 +1,2 @@ +backend/controllers/timeJump | reactime

              Module backend/controllers/timeJump

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_models_filterConditions.html b/docs/modules/backend_models_filterConditions.html new file mode 100644 index 000000000..14b4f7f78 --- /dev/null +++ b/docs/modules/backend_models_filterConditions.html @@ -0,0 +1,5 @@ +backend/models/filterConditions | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_models_masterState.html b/docs/modules/backend_models_masterState.html new file mode 100644 index 000000000..242f5f942 --- /dev/null +++ b/docs/modules/backend_models_masterState.html @@ -0,0 +1,2 @@ +backend/models/masterState | reactime

              Module backend/models/masterState

              Index

              Variables

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_models_routes.html b/docs/modules/backend_models_routes.html new file mode 100644 index 000000000..7e257dc5d --- /dev/null +++ b/docs/modules/backend_models_routes.html @@ -0,0 +1,4 @@ +backend/models/routes | reactime

              Module backend/models/routes

              Index

              Classes

              Variables

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_models_tree.html b/docs/modules/backend_models_tree.html new file mode 100644 index 000000000..4ad225959 --- /dev/null +++ b/docs/modules/backend_models_tree.html @@ -0,0 +1,3 @@ +backend/models/tree | reactime

              Module backend/models/tree

              Index

              Classes

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_module._core_js_.html b/docs/modules/backend_module._core_js_.html new file mode 100644 index 000000000..d0d884083 --- /dev/null +++ b/docs/modules/backend_module._core_js_.html @@ -0,0 +1 @@ +"core-js" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_module._regenerator_runtime_runtime_.html b/docs/modules/backend_module._regenerator_runtime_runtime_.html new file mode 100644 index 000000000..c07a02a5a --- /dev/null +++ b/docs/modules/backend_module._regenerator_runtime_runtime_.html @@ -0,0 +1 @@ +"regenerator-runtime/runtime" | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_module.html b/docs/modules/backend_module.html new file mode 100644 index 000000000..79d4d600e --- /dev/null +++ b/docs/modules/backend_module.html @@ -0,0 +1,3 @@ +backend/module | reactime

              Module backend/module

              Index

              Namespaces

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_puppeteerServer.html b/docs/modules/backend_puppeteerServer.html new file mode 100644 index 000000000..61775fc73 --- /dev/null +++ b/docs/modules/backend_puppeteerServer.html @@ -0,0 +1 @@ +backend/puppeteerServer | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_routers_linkFiber.html b/docs/modules/backend_routers_linkFiber.html new file mode 100644 index 000000000..595f41014 --- /dev/null +++ b/docs/modules/backend_routers_linkFiber.html @@ -0,0 +1,2 @@ +backend/routers/linkFiber | reactime

              Module backend/routers/linkFiber

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_routers_snapShot.html b/docs/modules/backend_routers_snapShot.html new file mode 100644 index 000000000..4ca11f7eb --- /dev/null +++ b/docs/modules/backend_routers_snapShot.html @@ -0,0 +1,2 @@ +backend/routers/snapShot | reactime

              Module backend/routers/snapShot

              Index

              Functions

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_types_backendTypes.html b/docs/modules/backend_types_backendTypes.html new file mode 100644 index 000000000..f21fe44ff --- /dev/null +++ b/docs/modules/backend_types_backendTypes.html @@ -0,0 +1,34 @@ +backend/types/backendTypes | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/backend_types_linkFiberTypes.html b/docs/modules/backend_types_linkFiberTypes.html new file mode 100644 index 000000000..921ea854a --- /dev/null +++ b/docs/modules/backend_types_linkFiberTypes.html @@ -0,0 +1,2 @@ +backend/types/linkFiberTypes | reactime

              Module backend/types/linkFiberTypes

              Index

              Interfaces

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/extension_background.html b/docs/modules/extension_background.html new file mode 100644 index 000000000..6b827201f --- /dev/null +++ b/docs/modules/extension_background.html @@ -0,0 +1 @@ +extension/background | reactime

              Module extension/background

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/extension_build_devtools.html b/docs/modules/extension_build_devtools.html new file mode 100644 index 000000000..c1d948952 --- /dev/null +++ b/docs/modules/extension_build_devtools.html @@ -0,0 +1 @@ +extension/build/devtools | reactime

              Module extension/build/devtools

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/modules/extension_contentScript.html b/docs/modules/extension_contentScript.html new file mode 100644 index 000000000..b947372e7 --- /dev/null +++ b/docs/modules/extension_contentScript.html @@ -0,0 +1 @@ +extension/contentScript | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/types/backend_types_backendTypes.Fiber.html b/docs/types/backend_types_backendTypes.Fiber.html new file mode 100644 index 000000000..f228a8f27 --- /dev/null +++ b/docs/types/backend_types_backendTypes.Fiber.html @@ -0,0 +1,34 @@ +Fiber | reactime
              Fiber: {
                  _debugHookTypes: string[] | null;
                  actualDuration?: number;
                  actualStartTime?: number;
                  child: Fiber | null;
                  elementType: any;
                  key: string | null;
                  memoizedProps: any;
                  memoizedState: any;
                  selfBaseDuration?: number;
                  sibling: Fiber | null;
                  stateNode: any;
                  tag: WorkTag;
                  treeBaseDuration?: number;
              }

              Type declaration

              • _debugHookTypes: string[] | null

                An array of hooks used for debugging purposes.

                +
              • Optional actualDuration?: number

                Time spent rendering this Fiber and its descendants for the current update.

                +

                This tells us how well the tree makes use of sCU for memoization. It is reset to 0 each time we render and only updated when we don't bailout.

                +

                This field is only set when the enableProfilerTimer flag is enabled.

                +
              • Optional actualStartTime?: number

                If the Fiber is currently active in the "render" phase, this marks the time at which the work began.

                +

                This field is only set when the enableProfilerTimer flag is enabled.

                +
              • child: Fiber | null

                Pointer to the first child.

                +
              • elementType: any

                The type of the current Fiber node's element (e.g. the component function or class, or the DOM element type).

                +

                For class/functional component, elmementType stores the function definition.

                +
              • key: string | null

                Unique key string assigned by the user when making component on null if they didn't assign one

                +
              • memoizedProps: any

                The current props of the component associated with the current Fiber node.

                +
              • memoizedState: any

                The current state for a functional component associated with the current Fiber node.

                +
              • Optional selfBaseDuration?: number

                Duration of the most recent render time for this Fiber. This value is not updated when we bailout for memoization purposes.

                +

                This field is only set when the enableProfilerTimer flag is enabled.

                +
              • sibling: Fiber | null

                Pointer to next sibling

                +
              • stateNode: any

                The local state associated with this fiber.

                +

                For classComponent, stateNode contains current state and the bound update methods of the component.

                +
              • tag: WorkTag

                The type of the current Fiber node, such as FunctionComponent, ClassComponent, or HostComponent (for DOM elements).

                +
              • Optional treeBaseDuration?: number

                Sum of base times for all descendants of this Fiber. This value bubbles up during the "complete" phase.

                +

                This field is only set when the enableProfilerTimer flag is enabled.

                +

              Member

              actualDuration - The time taken to render the current Fiber node and its descendants during the previous render cycle. This value is used to optimize the rendering of components and to provide performance metrics to developers.

              +

              Member

              actualStartTime - The time at which the rendering of the current Fiber node started during the previous render cycle.

              +

              Member

              child - Pointer to the first child.

              +

              Member

              elementType - The type of the current Fiber node's element (e.g. the component function or class, or the DOM element type). For class/functional component, elmementType stores the function definition.

              +

              Member

              key - The key a user assigned to the component or null if they didn't assign one

              +

              Member

              memoizedProps - The current props of the component associated with the current Fiber node.

              +

              Member

              memoizedState - The current state of the component associated with the current Fiber node.

              +

              Member

              selfBaseDuration - The base duration of the current Fiber node's render phase (excluding the time taken to render its children). This field is only set when the enableProfilerTimer flag is enabled.

              +

              Member

              sibling - Pointer to next sibling

              +

              Member

              stateNode - The local state associated with this fiber. For classComponent, stateNode contains current state and the bound update methods of the component

              +

              Member

              tag - The type of the current Fiber node, such as FunctionComponent, ClassComponent, or HostComponent (for DOM elements).

              +

              Member

              treeBaseDuration - The total base duration of the current Fiber node's subtree. This field is only set when the enableProfilerTimer flag is enabled.

              +

              Member

              _debugHookTypes - An array of hooks used for debugging purposes.

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/types/backend_types_backendTypes.FiberRoot.html b/docs/types/backend_types_backendTypes.FiberRoot.html new file mode 100644 index 000000000..18fedcc49 --- /dev/null +++ b/docs/types/backend_types_backendTypes.FiberRoot.html @@ -0,0 +1 @@ +FiberRoot | reactime
              FiberRoot: {
                  current: Fiber;
              }

              Type declaration

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/types/backend_types_backendTypes.WorkTag.html b/docs/types/backend_types_backendTypes.WorkTag.html new file mode 100644 index 000000000..b6e08c77c --- /dev/null +++ b/docs/types/backend_types_backendTypes.WorkTag.html @@ -0,0 +1 @@ +WorkTag | reactime
              WorkTag: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/app_slices_mainSlice.mainSlice.html b/docs/variables/app_slices_mainSlice.mainSlice.html new file mode 100644 index 000000000..e98fd4939 --- /dev/null +++ b/docs/variables/app_slices_mainSlice.mainSlice.html @@ -0,0 +1 @@ +mainSlice | reactime
              mainSlice: Slice<InitialState, {
                  aReactApp: ((state, action) => void);
                  addNewSnapshots: ((state, action) => void);
                  changeSlider: ((state, action) => void);
                  changeView: ((state, action) => void);
                  deleteSeries: ((state) => void);
                  deleteTab: ((state, action) => void);
                  disconnected: ((state) => void);
                  emptySnapshots: ((state) => void);
                  endConnect: ((state) => void);
                  importSnapshots: ((state, action) => void);
                  initialConnect: ((state, action) => void);
                  launchContentScript: ((state, action) => void);
                  moveBackward: ((state, action) => void);
                  moveForward: ((state, action) => void);
                  noDev: ((state, action) => void);
                  onHover: ((state, action) => void);
                  onHoverExit: ((state, action) => void);
                  pause: ((state) => void);
                  playForward: ((state, action) => void);
                  resetSlider: ((state) => void);
                  save: ((state, action) => void);
                  setCurrentLocation: ((state, action) => void);
                  setCurrentTabInApp: ((state, action) => void);
                  setPort: ((state, action) => void);
                  setTab: ((state, action) => void);
                  startPlaying: ((state, action) => void);
                  startReconnect: ((state) => void);
                  toggleExpanded: ((state, action) => void);
                  toggleMode: ((state, action) => void);
                  tutorialSaveSeriesToggle: ((state, action) => void);
              }, "main", "main", SliceSelectors<InitialState>> = ...

              Type declaration

              • aReactApp: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • addNewSnapshots: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • changeSlider: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • changeView: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • deleteSeries: ((state) => void)
                  • (state): void
                  • Parameters

                    • state: Draft<S>

                    Returns void

              • deleteTab: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • disconnected: ((state) => void)
                  • (state): void
                  • Parameters

                    • state: Draft<S>

                    Returns void

              • emptySnapshots: ((state) => void)
                  • (state): void
                  • Parameters

                    • state: Draft<S>

                    Returns void

              • endConnect: ((state) => void)
                  • (state): void
                  • Parameters

                    • state: Draft<S>

                    Returns void

              • importSnapshots: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • initialConnect: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • launchContentScript: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • moveBackward: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • moveForward: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • noDev: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • onHover: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • onHoverExit: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • pause: ((state) => void)
                  • (state): void
                  • Parameters

                    • state: Draft<S>

                    Returns void

              • playForward: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • resetSlider: ((state) => void)
                  • (state): void
                  • Parameters

                    • state: Draft<S>

                    Returns void

              • save: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • setCurrentLocation: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • setCurrentTabInApp: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • setPort: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • setTab: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • startPlaying: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • startReconnect: ((state) => void)
                  • (state): void
                  • Parameters

                    • state: Draft<S>

                    Returns void

              • toggleExpanded: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • toggleMode: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              • tutorialSaveSeriesToggle: ((state, action) => void)
                  • (state, action): void
                  • Parameters

                    • state: Draft<S>
                    • action: {
                          payload: any;
                          type: string;
                      }
                      • payload: any
                      • type: string

                    Returns void

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/app_store.store.html b/docs/variables/app_store.store.html new file mode 100644 index 000000000..f7ee3bc9d --- /dev/null +++ b/docs/variables/app_store.store.html @@ -0,0 +1 @@ +store | reactime

              Variable storeConst

              store: EnhancedStore<{
                  main: InitialState;
              }, UnknownAction, Tuple<[StoreEnhancer<{
                  dispatch: ThunkDispatch<{
                      main: InitialState;
                  }, undefined, UnknownAction>;
              }>, StoreEnhancer]>> = ...

              Type declaration

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/app_styles_theme.default.html b/docs/variables/app_styles_theme.default.html new file mode 100644 index 000000000..1365ffb93 --- /dev/null +++ b/docs/variables/app_styles_theme.default.html @@ -0,0 +1 @@ +default | reactime

              Variable defaultConst

              default: Theme = ...

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_models_filterConditions.allowedComponentTypes.html b/docs/variables/backend_models_filterConditions.allowedComponentTypes.html new file mode 100644 index 000000000..048523ab7 --- /dev/null +++ b/docs/variables/backend_models_filterConditions.allowedComponentTypes.html @@ -0,0 +1 @@ +allowedComponentTypes | reactime
              allowedComponentTypes: Set<WorkTag> = ...

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_models_filterConditions.exclude.html b/docs/variables/backend_models_filterConditions.exclude.html new file mode 100644 index 000000000..37d367986 --- /dev/null +++ b/docs/variables/backend_models_filterConditions.exclude.html @@ -0,0 +1,2 @@ +exclude | reactime
              exclude: Set<string> = ...

              A set of excluded props and variable name

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_models_filterConditions.nextJSDefaultComponent.html b/docs/variables/backend_models_filterConditions.nextJSDefaultComponent.html new file mode 100644 index 000000000..a78a61c15 --- /dev/null +++ b/docs/variables/backend_models_filterConditions.nextJSDefaultComponent.html @@ -0,0 +1 @@ +nextJSDefaultComponent | reactime
              nextJSDefaultComponent: Set<string> = ...

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_models_filterConditions.remixDefaultComponents.html b/docs/variables/backend_models_filterConditions.remixDefaultComponents.html new file mode 100644 index 000000000..cf357fa1f --- /dev/null +++ b/docs/variables/backend_models_filterConditions.remixDefaultComponents.html @@ -0,0 +1 @@ +remixDefaultComponents | reactime
              remixDefaultComponents: Set<string> = ...

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_models_masterState.default.html b/docs/variables/backend_models_masterState.default.html new file mode 100644 index 000000000..3b6757df9 --- /dev/null +++ b/docs/variables/backend_models_masterState.default.html @@ -0,0 +1,41 @@ +default | reactime
              default: {
                  clear: (() => void);
                  getAllComponents: (() => any[]);
                  getComponentByIndex: ((inputIndex) => any);
                  getComponentByIndexHooks: ((inputIndex) => any[]);
                  saveNew: ((component) => number);
              }

              Type declaration

              • clear: (() => void)

                Function

                clear - Clears componentActionsRecord

                +
                  • (): void
                  • Returns void

                    Function

                    clear - Clears componentActionsRecord

                    +
              • getAllComponents: (() => any[])

                Function

                getAllComponents - This method is used for debugging purpose to access the array of setState/dispatch methods

                +

                Returns

                  +
                • an array of objects containing the bound methods for updating state
                • +
                +
                  • (): any[]
                  • Returns any[]

                      +
                    • an array of objects containing the bound methods for updating state
                    • +
                    +

                    Function

                    getAllComponents - This method is used for debugging purpose to access the array of setState/dispatch methods

                    +
              • getComponentByIndex: ((inputIndex) => any)

                Function

                getComponentByIndex - This function is used for stateful Class Component to retrieve an object that has the bound setState method

                +

                Param: inputIndex

                index of component inside componentActionsRecord coming from timeJump.ts

                +

                Returns

                  +
                • an object containing the bound setState method
                • +
                +
                  • (inputIndex): any
                  • Parameters

                    • inputIndex: number

                      index of component inside componentActionsRecord coming from timeJump.ts

                      +

                    Returns any

                      +
                    • an object containing the bound setState method
                    • +
                    +

                    Function

                    getComponentByIndex - This function is used for stateful Class Component to retrieve an object that has the bound setState method

                    +
              • getComponentByIndexHooks: ((inputIndex) => any[])

                Function

                getComponentByIndexHooks - This function is used for Functional Component to retrieve an array of objects that have the bound dispatch methods.

                +

                Param: inputIndex

                index of component inside componentActionsRecord coming from timeJump.ts

                +

                Returns

                  +
                • an array of objects containing the bound dispatch methods
                • +
                +
                  • (inputIndex): any[]
                  • Parameters

                    • inputIndex: number[]

                      index of component inside componentActionsRecord coming from timeJump.ts

                      +

                    Returns any[]

                      +
                    • an array of objects containing the bound dispatch methods
                    • +
                    +

                    Function

                    getComponentByIndexHooks - This function is used for Functional Component to retrieve an array of objects that have the bound dispatch methods.

                    +
              • saveNew: ((component) => number)

                Function

                saveNew - Adds a new component to the componentActionsRecord array and returns its index.

                +

                Param: component

                An object that contains bound update method. For class component, the udpate method is setState. For functional component, the update method is dispatch.

                +

                Returns

                  +
                • the index of the newly added component
                • +
                +
                  • (component): number
                  • Parameters

                    • component: any

                      An object that contains bound update method. For class component, the udpate method is setState. For functional component, the update method is dispatch.

                      +

                    Returns number

                      +
                    • the index of the newly added component
                    • +
                    +

                    Function

                    saveNew - Adds a new component to the componentActionsRecord array and returns its index.

                    +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_models_routes.default.html b/docs/variables/backend_models_routes.default.html new file mode 100644 index 000000000..b64fa9dd9 --- /dev/null +++ b/docs/variables/backend_models_routes.default.html @@ -0,0 +1 @@ +default | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.Block.html b/docs/variables/backend_types_backendTypes.Block.html new file mode 100644 index 000000000..6563ff08c --- /dev/null +++ b/docs/variables/backend_types_backendTypes.Block.html @@ -0,0 +1 @@ +Block | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.ClassComponent.html b/docs/variables/backend_types_backendTypes.ClassComponent.html new file mode 100644 index 000000000..fc8c57d44 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.ClassComponent.html @@ -0,0 +1 @@ +ClassComponent | reactime
              ClassComponent: 1 = 1

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.ContextConsumer.html b/docs/variables/backend_types_backendTypes.ContextConsumer.html new file mode 100644 index 000000000..413188522 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.ContextConsumer.html @@ -0,0 +1 @@ +ContextConsumer | reactime
              ContextConsumer: 9 = 9

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.ContextProvider.html b/docs/variables/backend_types_backendTypes.ContextProvider.html new file mode 100644 index 000000000..e0060fecb --- /dev/null +++ b/docs/variables/backend_types_backendTypes.ContextProvider.html @@ -0,0 +1 @@ +ContextProvider | reactime
              ContextProvider: 10 = 10

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.DehydratedFragment.html b/docs/variables/backend_types_backendTypes.DehydratedFragment.html new file mode 100644 index 000000000..9bbfdfb32 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.DehydratedFragment.html @@ -0,0 +1 @@ +DehydratedFragment | reactime
              DehydratedFragment: 18 = 18

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.ForwardRef.html b/docs/variables/backend_types_backendTypes.ForwardRef.html new file mode 100644 index 000000000..edc12d560 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.ForwardRef.html @@ -0,0 +1 @@ +ForwardRef | reactime
              ForwardRef: 11 = 11

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.Fragment.html b/docs/variables/backend_types_backendTypes.Fragment.html new file mode 100644 index 000000000..1f56e44cf --- /dev/null +++ b/docs/variables/backend_types_backendTypes.Fragment.html @@ -0,0 +1 @@ +Fragment | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.FunctionComponent.html b/docs/variables/backend_types_backendTypes.FunctionComponent.html new file mode 100644 index 000000000..e3e86a9fe --- /dev/null +++ b/docs/variables/backend_types_backendTypes.FunctionComponent.html @@ -0,0 +1 @@ +FunctionComponent | reactime
              FunctionComponent: 0 = 0

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.FundamentalComponent.html b/docs/variables/backend_types_backendTypes.FundamentalComponent.html new file mode 100644 index 000000000..0002aaf5a --- /dev/null +++ b/docs/variables/backend_types_backendTypes.FundamentalComponent.html @@ -0,0 +1 @@ +FundamentalComponent | reactime
              FundamentalComponent: 20 = 20

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.HostComponent.html b/docs/variables/backend_types_backendTypes.HostComponent.html new file mode 100644 index 000000000..a1ba66613 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.HostComponent.html @@ -0,0 +1,2 @@ +HostComponent | reactime
              HostComponent: 5 = 5

              Host Component: a type of component that represents a native DOM element in the browser environment, such as div, span, input, h1 etc.

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.HostPortal.html b/docs/variables/backend_types_backendTypes.HostPortal.html new file mode 100644 index 000000000..546e856b5 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.HostPortal.html @@ -0,0 +1,2 @@ +HostPortal | reactime
              HostPortal: 4 = 4

              A subtree. Could be an entry point to a different renderer.

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.HostRoot.html b/docs/variables/backend_types_backendTypes.HostRoot.html new file mode 100644 index 000000000..e1624929b --- /dev/null +++ b/docs/variables/backend_types_backendTypes.HostRoot.html @@ -0,0 +1,2 @@ +HostRoot | reactime
              HostRoot: 3 = 3

              Root of a host tree. Could be nested inside another node.

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.HostText.html b/docs/variables/backend_types_backendTypes.HostText.html new file mode 100644 index 000000000..ea86e9087 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.HostText.html @@ -0,0 +1 @@ +HostText | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.IncompleteClassComponent.html b/docs/variables/backend_types_backendTypes.IncompleteClassComponent.html new file mode 100644 index 000000000..ff787bc76 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.IncompleteClassComponent.html @@ -0,0 +1 @@ +IncompleteClassComponent | reactime

              Variable IncompleteClassComponentConst

              IncompleteClassComponent: 17 = 17

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.IndeterminateComponent.html b/docs/variables/backend_types_backendTypes.IndeterminateComponent.html new file mode 100644 index 000000000..aba08e09a --- /dev/null +++ b/docs/variables/backend_types_backendTypes.IndeterminateComponent.html @@ -0,0 +1,2 @@ +IndeterminateComponent | reactime
              IndeterminateComponent: 2 = 2

              Before we know whether it is function or class

              +

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.LazyComponent.html b/docs/variables/backend_types_backendTypes.LazyComponent.html new file mode 100644 index 000000000..0410dd8d2 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.LazyComponent.html @@ -0,0 +1 @@ +LazyComponent | reactime
              LazyComponent: 16 = 16

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.LegacyHiddenComponent.html b/docs/variables/backend_types_backendTypes.LegacyHiddenComponent.html new file mode 100644 index 000000000..b7f0e5d84 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.LegacyHiddenComponent.html @@ -0,0 +1 @@ +LegacyHiddenComponent | reactime
              LegacyHiddenComponent: 24 = 24

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.MemoComponent.html b/docs/variables/backend_types_backendTypes.MemoComponent.html new file mode 100644 index 000000000..0d59a6a98 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.MemoComponent.html @@ -0,0 +1 @@ +MemoComponent | reactime
              MemoComponent: 14 = 14

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.Mode.html b/docs/variables/backend_types_backendTypes.Mode.html new file mode 100644 index 000000000..1fc0db3a7 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.Mode.html @@ -0,0 +1 @@ +Mode | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.OffscreenComponent.html b/docs/variables/backend_types_backendTypes.OffscreenComponent.html new file mode 100644 index 000000000..67d567d96 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.OffscreenComponent.html @@ -0,0 +1 @@ +OffscreenComponent | reactime
              OffscreenComponent: 23 = 23

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.Profiler.html b/docs/variables/backend_types_backendTypes.Profiler.html new file mode 100644 index 000000000..b6c15852f --- /dev/null +++ b/docs/variables/backend_types_backendTypes.Profiler.html @@ -0,0 +1 @@ +Profiler | reactime

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.ScopeComponent.html b/docs/variables/backend_types_backendTypes.ScopeComponent.html new file mode 100644 index 000000000..51f9e7c72 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.ScopeComponent.html @@ -0,0 +1 @@ +ScopeComponent | reactime
              ScopeComponent: 21 = 21

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.SimpleMemoComponent.html b/docs/variables/backend_types_backendTypes.SimpleMemoComponent.html new file mode 100644 index 000000000..83ca47489 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.SimpleMemoComponent.html @@ -0,0 +1 @@ +SimpleMemoComponent | reactime
              SimpleMemoComponent: 15 = 15

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.SuspenseComponent.html b/docs/variables/backend_types_backendTypes.SuspenseComponent.html new file mode 100644 index 000000000..e643681e9 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.SuspenseComponent.html @@ -0,0 +1 @@ +SuspenseComponent | reactime
              SuspenseComponent: 13 = 13

              Generated using TypeDoc

              \ No newline at end of file diff --git a/docs/variables/backend_types_backendTypes.SuspenseListComponent.html b/docs/variables/backend_types_backendTypes.SuspenseListComponent.html new file mode 100644 index 000000000..84ba032f9 --- /dev/null +++ b/docs/variables/backend_types_backendTypes.SuspenseListComponent.html @@ -0,0 +1 @@ +SuspenseListComponent | reactime
              SuspenseListComponent: 19 = 19

              Generated using TypeDoc

              \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 3b713ba93..d7a454f7b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,8 +6,19 @@ module.exports = { transform: { '^.+\\.(js|ts|tsx)$': 'ts-jest', }, - testPathIgnorePatterns: ['www', './src/backend/__tests__/ignore', './src/app/__tests__enzyme/ignore', './src/backend/__tests__/linkFiber.test.ts', './src/app/slices/mainSlice.ts'], - coveragePathIgnorePatterns: ['/src/backend/__tests__/ignore/', '/src/app/__tests__enzyme/ignore', './src/backend/__tests__/linkFiber.test.ts', './src/app/slices/mainSlice.ts'], + testPathIgnorePatterns: [ + 'www', + './src/backend/__tests__/ignore', + './src/app/__tests__enzyme/ignore', + './src/backend/__tests__/linkFiber.test.ts', + './src/app/slices/mainSlice.ts', + ], + coveragePathIgnorePatterns: [ + '/src/backend/__tests__/ignore/', + '/src/app/__tests__enzyme/ignore', + './src/backend/__tests__/linkFiber.test.ts', + './src/app/slices/mainSlice.ts', + ], transformIgnorePatterns: ['/node_modules/(?!d3|d3-array|internmap|delaunator|robust-predicates)'], testRegex: '(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$', moduleFileExtensions: ['ts', 'tsx', 'js'], diff --git a/package.json b/package.json index a0ac8db01..137db6e05 100644 --- a/package.json +++ b/package.json @@ -2,16 +2,16 @@ "name": "reactime", "description": "build web extension bundle.js", "scripts": { - "build": "NODE_OPTIONS=--openssl-legacy-provider webpack --mode production", - "dev": "NODE_OPTIONS=--openssl-legacy-provider webpack --mode development --watch", - "buildlegacy": "webpack --mode production", - "devlegacy": "webpack --mode development --watch", + "build": "webpack --mode production", + "dev": "cross-env NODE_ENV=development webpack --mode development --watch", + "buildlegacy": "NODE_OPTIONS=--openssl-legacy-provider webpack --mode production", + "devlegacy": "NODE_OPTIONS=--openssl-legacy-provider webpack --mode development --watch", "test": "jest --verbose --coverage", "test-backend": "jest --verbose --coverage src/backend", "test-frontend": "jest --verbose --coverage src/app", "test-on": "./node_modules/.bin/jest $1", "docker-test-lint": "eslint --ext .js --ext .jsx src", - "docs": "typedoc --json docs --inputFiles src/app --inputFiles src/backend --readme docs/readme.md", + "docs": "typedoc", "format": "prettier --config .prettierrc './**/*.{ts,tsx,js,jsx}' --write" }, "keywords": [ @@ -55,6 +55,7 @@ "David Bernstein", "David Chai", "David Kim", + "David Moore", "Dennis Lopez", "Edar Liu", "Edwin Menendez", @@ -73,7 +74,9 @@ "James Nghiem", "Jasmine Noor", "Jason Victor", + "Jesse Rosengrant", "Jimmy Phy", + "John Banks", "Joseph Park", "Joseph Stern", "Josh Kim", @@ -87,6 +90,7 @@ "Kristina Wallen", "Kyle Bell", "Lance Ziegler", + "Liam Donaher", "Lina Shin", "Mark Teets", "Mike Bednarz", @@ -119,131 +123,77 @@ ], "license": "ISC", "devDependencies": { - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-decorators": "^7.10.5", - "@babel/preset-env": "^7.12.7", - "@babel/preset-react": "^7.12.7", - "@babel/preset-typescript": "^7.21.5", - "@inrupt/jest-jsdom-polyfills": "^1.6.2", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^14.4.3", - "@types/chai": "^4.2.14", - "@types/chrome": "^0.0.119", - "@types/d3": "^7.4.0", - "@types/d3-scale-chromatic": "^2.0.0", - "@types/jest": "^29.5.0", - "@types/lodash.isequal": "^4.5.5", - "@types/node": "^12.19.6", - "@types/react": "^17.0.43", - "@types/react-router": "^5.1.20", - "@typescript-eslint/eslint-plugin": "^3.6.1", - "@typescript-eslint/parser": "^3.6.1", - "babel-loader": "^8.1.0", - "babel-preset-airbnb": "^5.0.0", - "core-js": "^3.6.5", - "css-loader": "^3.6.0", - "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.6", - "eslint": "^8.36.0", - "eslint-config-airbnb": "^18.2.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jest": "^22.21.0", - "eslint-plugin-jest-dom": "^4.0.3", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.3", - "eslint-plugin-react-hooks": "^1.7.0", - "eslint-plugin-testing-library": "^5.10.3", - "express": "^4.17.1", - "jest": "^29.5.0", - "jest-cli": "^26.1.0", - "jest-diff": "^26.1.0", - "jest-environment-jsdom": "^29.5.0", - "jest-runner-eslint": "^2.0.0", - "jscharting-react": "^1.2.1", - "jsdom": "^21.1.2", - "prettier": "2.8.4", - "puppeteer": "^14.3.0", - "react-devtools-core": "^4.27.3", - "sass": "^1.26.10", - "sass-loader": "^7.3.1", - "sinon-chrome": "^3.0.1", - "style-loader": "^0.23.1", - "ts-jest": "^29.0.5", - "ts-loader": "^8.0.0", - "ts-node": "^9.1.1", - "typedoc": "^0.5.0", - "typedoc-webpack-plugin": "^1.1.4", - "typescript": "^4.9.0", - "webpack": "^4.43.0", - "webpack-chrome-extension-reloader": "^1.3.0", - "webpack-cli": "^3.3.12" + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", + "@testing-library/user-event": "^14.5.1", + "@types/chrome": "^0.0.254", + "@types/jest": "^29.5.11", + "@types/node": "^20.10.5", + "@typescript-eslint/eslint-plugin": "^6.15.0", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-jest-dom": "^5.1.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-testing-library": "^6.2.0", + "html-webpack-plugin": "^5.5.4", + "identity-obj-proxy": "^3.0.0", + "jsdom": "^23.0.1", + "react-dom": "^18.2.0", + "react-router-dom": "^6.21.1", + "sass-loader": "^13.3.2", + "style-loader": "^3.3.3", + "ts-loader": "^9.5.1", + "typedoc": "^0.25.4", + "typescript": "^5.3.3", + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4" }, "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@fortawesome/fontawesome-free": "^5.15.1", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-regular-svg-icons": "^5.15.1", - "@fortawesome/free-solid-svg-icons": "^5.15.1", - "@fortawesome/react-fontawesome": "^0.1.12", - "@mui/icons-material": "^5.14.1", - "@mui/material": "^5.14.12", - "@mui/styled-engine-sc": "^5.12.0", - "@mui/system": "^5.14.12", - "@reduxjs/toolkit": "^1.9.6", - "@types/react-dom": "^17.0.14", - "@types/react-router-dom": "^5.3.3", - "@visx/axis": "^1.0.0", - "@visx/brush": "^1.2.0", - "@visx/clip-path": "^1.0.0", - "@visx/event": "^1.0.0", - "@visx/glyph": "^1.0.0", - "@visx/gradient": "^1.0.0", - "@visx/grid": "^1.0.0", - "@visx/group": "^3.0.0", - "@visx/hierarchy": "^1.0.0", - "@visx/legend": "^1.0.0", - "@visx/responsive": "^1.0.0", - "@visx/scale": "^1.0.0", - "@visx/shape": "^3.0.0", - "@visx/text": "^3.0.0", - "@visx/tooltip": "^1.0.0", - "@visx/zoom": "^1.0.0", - "acorn": "^7.3.1", - "acorn-jsx": "^5.2.0", - "apexcharts": "^3.23.1", - "chai": "^4.2.0", - "d3": "^7.6.1", + "@mui/icons-material": "^5.15.1", + "@mui/material": "^5.15.1", + "@mui/system": "^5.15.1", + "@reduxjs/toolkit": "^2.0.1", + "@visx/axis": "^3.5.0", + "@visx/event": "^3.3.0", + "@visx/gradient": "^3.3.0", + "@visx/grid": "^3.5.0", + "@visx/group": "^3.3.0", + "@visx/hierarchy": "^3.3.0", + "@visx/responsive": "^3.3.0", + "@visx/scale": "^3.5.0", + "@visx/shape": "^3.5.0", + "@visx/text": "^3.3.0", + "@visx/tooltip": "^3.3.0", + "cross-env": "^7.0.3", + "d3": "^7.8.5", "d3-scale-chromatic": "^3.0.0", - "d3-shape": "^2.0.0", - "d3-zoom": "^3.0.0", - "identity-obj-proxy": "^3.0.0", - "intro.js": "^5.0.0", - "intro.js-react": "^0.6.0", - "jest-runner": "^26.1.0", - "jscharting": "^3.0.2", - "jsondiffpatch": "^0.3.11", + "d3-shape": "^3.2.0", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "html-react-parser": "^5.0.11", + "intro.js": "^7.2.0", + "intro.js-react": "^1.0.0", + "jsondiffpatch": "^0.5.0", "lodash": "^4.17.21", - "prop-types": "^15.7.2", - "rc-slider": "^8.7.1", - "rc-tooltip": "^3.7.3", - "react": "^18.0.0", - "react-apexcharts": "^1.3.7", - "react-dom": "^18.2.0", - "react-hover": "^2.0.0", - "react-html-parser": "^2.0.2", - "react-json-tree": "^0.11.2", - "react-redux": "^8.1.3", - "react-router-dom": "^5.2.0", - "react-select": "^3.2.0", - "react-spinners": "^0.11.0", - "recoil": "0.0.10", - "redux": "^4.2.1", - "redux-mock-store": "^1.5.4", - "styled-components": "^6.0.4", - "util": "^0.12.4", - "web-vitals": "^3.5.0", - "yarn": "^1.22.19" + "node": "^18.12.1", + "prettier": "^3.1.1", + "rc-slider": "^10.5.0", + "rc-tooltip": "^6.1.3", + "react": "^18.2.0", + "react-apexcharts": "^1.4.1", + "react-hover": "^3.0.1", + "react-json-tree": "^0.18.0", + "react-redux": "^9.0.4", + "react-select": "^5.8.0", + "react-spinners": "^0.13.8", + "redux": "^5.0.0", + "regenerator-runtime": "^0.14.1", + "sass": "^1.69.5", + "styled-components": "^6.1.2", + "web-vitals": "^3.5.0" } } diff --git a/reactime-website b/reactime-website index c26af6f6f..9ce6cdc9d 160000 --- a/reactime-website +++ b/reactime-website @@ -1 +1 @@ -Subproject commit c26af6f6f3e4949e89c2036dd8cedafba8592756 +Subproject commit 9ce6cdc9d25d3e91aea973ae58726f9d5c9912d3 diff --git a/src/README.md b/src/DEVELOPER_README.md similarity index 85% rename from src/README.md rename to src/DEVELOPER_README.md index a2a2769f4..a4d6c329d 100644 --- a/src/README.md +++ b/src/DEVELOPER_README.md @@ -18,12 +18,10 @@ git clone https://github.com/open-source-labs/reactime.git ``` cd reactime -npm install --legacy-peer-deps +npm install npm run dev ``` -If ‘npm install –legacy-peer-deps’ doesn’t work, install dependencies using ‘npm install --force’ - With release of Node v18.12.1 (LTS) on 11/4/22, the script has been updated to 'npm run dev' || 'npm run build' for backwards compatibility.
              For version Node v16.16.0, please use script 'npm run devlegacy' || 'npm run buildlegacy' @@ -56,6 +54,24 @@ _Before_ beginning development, especially on teams, make sure to configure your Here are some notes on the current state of Reactime and considerations for future development. +## Address open issues on the main OSLabs Reactime Github + +There are a variety of open issues on the [OSLabs Reactime Github](https://github.com/open-source-labs/reactime) that remain to be addressed. + +## Main Slice Modularity + +Currently, Reactime employs Redux Toolkit for state management. At present, all actions are housed within the mainSlice.ts file. As this file has expanded significantly, it would be beneficial to modularize it, creating separate slices for distinct components. + +## Testing + +With Reactime V23, as a result of updating all outdated packages and peer dependencies, the Jest testing framework has unresolved errors. This should be a pretty easy win for future iterators to bring the Jest library back up and running smoothly. The jest-environment-jsdom package has some deprecated sub-packages, so if there is an alternative that can be used, that would be best, so it does not introduce new deprecated packages. + +In addition, while our current test coverage provides a sturdy base, the application can benefit from deeper exploration into critical user paths and broadening end-to-end testing scenarios. Embracing automation and periodic reviews can further ensure consistent quality and robustness in the face of evolving requirements. + +## Continue to investigate app behavior on load + +With Reactime V23, loading errors were eliminated by having the web app reload upon a Reactime panel being opened. While this provides a working solution to what were persistent loading issues, the app's behavior on load should still be examined. There are odd interactions happening within the message passing framework of chrome which may be a root cause. Please examine the interaction between background.js, contentscript, maincontainer, and redux toolkit. + ## Including Support for Hooks Beyond useState Reactime currently shows data stored via useState, but does not show data stored via other hooks such as useContext or useReducer. While showing this data would be simple, maintaining the time travel functionality of Reactime with these hooks would not. _Please see file demo-app/src/client/Components/ButtonsWithMoreHooks.jsx for more details._ @@ -71,11 +87,7 @@ To see how hook data is stored on the fiber tree: Any changes to console.logs in Reactime can be seen by refreshing the browser the app is running in. -## Replace Functionality for Outdated Packages - -Package dependencies need to be trimmed down, updated, and/or removed. Peer dependency errors are the reason npm install --force may be necessary when installing the dependencies of Reactime. While Reactime v22.0 has reduced package dependency errors for developers from multiple pages of errors down to ~15 errors, the goal is to decrease overall package/library dependency to a minimum to promote long-term maintainability - -Material-ui/core has been updated to use React 18. Future developers may choose to remove Material-ui/core from the application to ensure compatibility in the future or continue to build out the UI. The choice is yours! +## React DevTools Global Hook React Developer Tools has NOT deprecated \_\_REACT_DEVTOOLS_GLOBAL_HOOK\_\_. However, Reactime v21 has sleuthed and learned the following from the team at React: @@ -90,13 +102,13 @@ Can Reactime functionality be extended so applications using Redux can track sta Yes, but it would be very time-consuming and not the most feasible option while Redux devtools exists already. With how Redux devtools is currently set up, a developer is unable to use Redux devtools as a third-party user and integrate its functionality into their own application, as Redux devtools is meant to be used directly on an application using Redux for state-tracking purposes. Since the devtools do not appear to have a public API for integrated use in an application or it simply does not exist, Redux devtools would need to be rebuilt from the ground up and then integrated into Reactime, or built into Reactime directly still from scratch. -## Main Slice Modularity +## Newsletter functionality on the Reactime website -Currently, Reactime employs Redux Toolkit for state management. At present, all actions are housed within the mainSlice.ts file. As this file has expanded significantly, it would be beneficial to modularize it, creating separate slices for distinct components. +As noted in the [Reactime Webite Github](https://github.com/reactimetravel/reactime-website), a newsletter functionality would be nice but has not been implemented yet. -## Testing +## Optimize webpack bundle size in production mode -While our current test coverage provides a sturdy base, the application can benefit from deeper exploration into critical user paths and broadening end-to-end testing scenarios. Embracing automation and periodic reviews can further ensure consistent quality and robustness in the face of evolving requirements. +Currently, the webpack bundle size when running in production mode (through npm run build) is much larger than the recommended size. Implementing new rules, plugins, and/or uglification and minification strategies could help reduce the size. # File Structure @@ -106,12 +118,11 @@ In the _src_ folder, there are three directories we care about: _app_, _backend_ src/ ├── app/ # Frontend code │ ├── __tests__/ # React Testing Library -│ ├── actions/ # Redux action creators │ ├── components/ # React components -│ ├── constants/ # │ ├── containers/ # More React components │ ├── slices/ # Redux Toolkit mechanism for updating state │ ├── styles/ # +| ├── App.tsx │ ├── FrontendTypes.ts # Library of typescript interfaces │ ├── index.tsx # Starting point for root App component │ ├── module.d.ts # @@ -175,11 +186,11 @@ All the diagrams of data flows are available on [MIRO](https://miro.com/app/boar The general flow of data is described in the following steps: -![GENERAL DATA FLOW](../assets/DataFlowDiagram.PNG) +![GENERAL DATA FLOW](../assets/DataFlowDiagramV23.PNG) 1. When the background bundle is loaded by the browser, it executes a script injection into the dom. (see section on _backend_). This script uses a technique called [throttle](https://medium.com/@bitupon.211/debounce-and-throttle-160affa5457b) to send state data from the app to the content script every specified milliseconds (in our case, this interval is 70ms). -2. The content script (now contentScript.ts) always listens for messages being passed from the extension's target application. Upon receiving data from the target app, the content script will immediately forward this data to the background script which then updates an object called `tabsObj`. Each time `tabsObj` is updated, its latest version will be passed to Reactime, where it is processed for displaying to the user by the _app_ folder scripts. +2. The content script always listens for messages being passed from the extension's target application. Upon receiving data from the target app, the content script will immediately forward this data to the background script which then updates an object called `tabsObj`. Each time `tabsObj` is updated, its latest version will be passed to Reactime, where it is processed for displaying to the user by the _app_ folder scripts. 3. Likewise, when Reactime emits an action due to user interaction -- a "jump" request for example -- a message will be passed from Reactime via the background script to the content script. Then, the content script will pass a message to the target application containing a payload that represents the state the user wants the DOM to reflect or "jump" to. - One important thing to note here is that this jump action must be dispatched in the target application (i.e. _backend_ land), because only there do we have direct access to the DOM. @@ -262,8 +273,10 @@ Once you are ready for launch, follow these steps to simplify deployment to the 4. Update the Store Listing and that’s it! Click “Submit for review” and wait for the Chrome store to process your request # Past Medium Articles for Reference --[Reactime 22: Reactime: Real-time Debugging, Timless Results](https://medium.com/@kelvinmirhan/reactime-real-time-debugging-timeless-results-3f163b721d01) +- [Reactime renovation: Updates Coming in Version 23.0!](https://medium.com/@liam.donaher/reactime-renovation-updates-coming-in-version-23-0-37b2ef2a2771) + +- [Reactime 22: Reactime: Real-time Debugging, Timless Results](https://medium.com/@kelvinmirhan/reactime-real-time-debugging-timeless-results-3f163b721d01) - [Reactime 21: Cheers to Reactime, Version 21!](https://medium.com/@brok3turtl3/cheers-to-reactime-version-21-fa4dafa4bc74) - [Reactime 20: Reactime just keeps getting better!](https://medium.com/@njhuemmer/reactime-just-keeps-getting-better-b37659ff8b71) - [Reactime 19: What time is it? It’s still Reactime!](https://medium.com/@minzo.kim/what-time-is-it-its-still-reactime-d496adfa908c) diff --git a/src/app/components/App.tsx b/src/app/App.tsx similarity index 89% rename from src/app/components/App.tsx rename to src/app/App.tsx index 06d4050b0..df58c3232 100644 --- a/src/app/components/App.tsx +++ b/src/app/App.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { MemoryRouter as Router } from 'react-router-dom'; -import MainContainer from '../containers/MainContainer'; +import MainContainer from './containers/MainContainer'; import { ThemeProvider } from '@mui/material/styles'; -import theme from './theme'; +import theme from './styles/theme'; /* 'currentTab' is the current active tab within Google Chrome. diff --git a/src/app/FrontendTypes.ts b/src/app/FrontendTypes.ts index dcc313f5c..223c3a360 100644 --- a/src/app/FrontendTypes.ts +++ b/src/app/FrontendTypes.ts @@ -247,6 +247,7 @@ export interface HandleProps { } export interface MainSliderProps { + className: string; snapshotsLength: number; } @@ -309,13 +310,12 @@ export interface LinkControlProps { } export interface ControlStyles { - fontSize: string; + //fontSize: string; padding: string; } export interface DropDownStyle { margin: string; - fontSize: string; fontFamily: string; borderRadius: string; borderStyle: string; @@ -379,3 +379,7 @@ export interface Snapshots { component3: number; 'all others': number; } + +export interface ErrorContainerProps { + port: chrome.runtime.Port | null; +} diff --git a/src/app/__tests__/ActionContainer.test.tsx b/src/app/__tests__/ActionContainer.test.tsx index ae885957b..0d89a2260 100644 --- a/src/app/__tests__/ActionContainer.test.tsx +++ b/src/app/__tests__/ActionContainer.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { render as rtlRender, screen, fireEvent } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; +import '@testing-library/jest-dom'; import ActionContainer from '../containers/ActionContainer'; import TravelContainer from '../containers/TravelContainer'; import { Provider } from 'react-redux'; @@ -132,7 +132,7 @@ const customStore = configureStore({ const render = (component) => rtlRender({component}); const MockRouteDescription = jest.fn(); -jest.mock('../components/RouteDescription', () => () => { +jest.mock('../components/Actions/RouteDescription', () => () => { MockRouteDescription(); return
              MockRouteDescription
              ; }); diff --git a/src/app/__tests__/ButtonContainer.test.tsx b/src/app/__tests__/ButtonContainer.test.tsx index 7fbb048a4..0cb84ddae 100644 --- a/src/app/__tests__/ButtonContainer.test.tsx +++ b/src/app/__tests__/ButtonContainer.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { render as rtlRender, screen, fireEvent } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; +import '@testing-library/jest-dom'; import { TextEncoder } from 'util'; global.TextEncoder = TextEncoder; import ButtonsContainer from '../containers/ButtonsContainer'; diff --git a/src/app/__tests__/ErrorContainer.test.tsx b/src/app/__tests__/ErrorContainer.test.tsx index c7cda0144..8072f86d0 100644 --- a/src/app/__tests__/ErrorContainer.test.tsx +++ b/src/app/__tests__/ErrorContainer.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { render as rtlRender, screen } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) +import '@testing-library/jest-dom'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) import ErrorContainer from '../containers/ErrorContainer'; import { configureStore } from '@reduxjs/toolkit'; import { mainSlice } from '../slices/mainSlice'; diff --git a/src/app/__tests__/ErrorMsg.test.tsx b/src/app/__tests__/ErrorMsg.test.tsx index 5c1ef1bf0..e0247929f 100644 --- a/src/app/__tests__/ErrorMsg.test.tsx +++ b/src/app/__tests__/ErrorMsg.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) -import ErrorMsg from '../components/ErrorMsg'; +import '@testing-library/jest-dom'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) +import ErrorMsg from '../components/ErrorHandling/ErrorMsg'; const props = { loadingArray: [false], @@ -11,6 +11,7 @@ const props = { targetPageisaReactApp: true, }, launchContent: null, + reinitialize: null, }; describe('unit testing for ErrorContainer.tsx', () => { diff --git a/src/app/__tests__/Loader.test.tsx b/src/app/__tests__/Loader.test.tsx index a60438323..0e96910a9 100644 --- a/src/app/__tests__/Loader.test.tsx +++ b/src/app/__tests__/Loader.test.tsx @@ -1,16 +1,18 @@ import React from 'react'; import { render } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) -import Loader from '../components/Loader'; +import '@testing-library/jest-dom'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) +import Loader from '../components/ErrorHandling/Loader'; describe('unit testing for Loader.tsx', () => { test('renders a loading icon', () => { const { container } = render(); - expect(container.firstChild).toHaveClass('css-1tm071a'); + // console.log('this is our container.firstChild: ', container.firstChild); + expect(container.firstChild).toHaveClass('docs-story css-kdwx3d'); }); test('renders a fail icon', () => { const { container } = render(); + // console.log('this is a fail2: ', container.getElementsByClassName('fail')[0]); expect(container.getElementsByClassName('fail').length).toBe(1); }); diff --git a/src/app/__tests__/MainContainer.test.tsx b/src/app/__tests__/MainContainer.test.tsx index e279bb24f..93cf50054 100644 --- a/src/app/__tests__/MainContainer.test.tsx +++ b/src/app/__tests__/MainContainer.test.tsx @@ -16,7 +16,7 @@ const mockState = { }, }; // End -const chrome = require('sinon-chrome'); +// const chrome = require('sinon-chrome'); const mockActionContainer = jest.fn(); jest.mock('../containers/ActionContainer', () => (props) => { @@ -55,17 +55,17 @@ jest.mock('../../../node_modules/intro.js/introjs.css', () => jest.fn()); useDispatch.mockReturnValue(dispatch); useSelector.mockImplementation((callback) => callback(mockState)); -global.chrome = chrome; -const port = { - onMessage: { - addListener: () => {}, - hasListener: () => {}, - }, - onDisconnect: { - addListener: () => {}, - }, -}; -chrome.runtime.connect.returns(port); +// global.chrome = chrome; +// const port = { +// onMessage: { +// addListener: () => {}, +// hasListener: () => {}, +// }, +// onDisconnect: { +// addListener: () => {}, +// }, +// }; +// chrome.runtime.connect.returns(port); describe('With no snapshots, should not render any containers', () => { test('With no snapshots, ErrorContainer should render', () => { diff --git a/src/app/__tests__/MainSlider.test.tsx b/src/app/__tests__/MainSlider.test.tsx index 8f9d99b08..30a152f4c 100644 --- a/src/app/__tests__/MainSlider.test.tsx +++ b/src/app/__tests__/MainSlider.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render as rtlRender, screen } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; -import MainSlider from '../components/MainSlider'; +import '@testing-library/jest-dom'; +import MainSlider from '../components/TimeTravel/MainSlider'; import { mainSlice } from '../slices/mainSlice'; import { Provider } from 'react-redux'; import { configureStore } from '@reduxjs/toolkit'; diff --git a/src/app/__tests__/TravelContainer.test.tsx b/src/app/__tests__/TravelContainer.test.tsx index fb3d06b85..357b474eb 100644 --- a/src/app/__tests__/TravelContainer.test.tsx +++ b/src/app/__tests__/TravelContainer.test.tsx @@ -6,8 +6,8 @@ import { configureStore } from '@reduxjs/toolkit'; import { mainSlice } from '../slices/mainSlice'; import { useDispatch } from 'react-redux'; import { ThemeProvider } from '@mui/material/styles'; -import theme from '../components/theme'; -import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) +import theme from '../styles/theme'; +import '@testing-library/jest-dom'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) const customTabs = { 87: { diff --git a/src/app/__tests__/TravelForwardBackward.test.tsx b/src/app/__tests__/TravelForwardBackward.test.tsx index 3b482e567..7d7069882 100644 --- a/src/app/__tests__/TravelForwardBackward.test.tsx +++ b/src/app/__tests__/TravelForwardBackward.test.tsx @@ -5,7 +5,7 @@ import { Provider } from 'react-redux'; import { configureStore } from '@reduxjs/toolkit'; import { mainSlice } from '../slices/mainSlice'; import { useDispatch } from 'react-redux'; -import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) +import '@testing-library/jest-dom'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) const customTabs = { 87: { diff --git a/src/app/__tests__/Tutorial.test.tsx b/src/app/__tests__/Tutorial.test.tsx index 49a3f3724..103496748 100644 --- a/src/app/__tests__/Tutorial.test.tsx +++ b/src/app/__tests__/Tutorial.test.tsx @@ -3,8 +3,8 @@ import { render, screen, fireEvent } from '@testing-library/react'; import '@testing-library/jest-dom'; import { TextEncoder } from 'util'; global.TextEncoder = TextEncoder; -import '@testing-library/jest-dom/extend-expect'; -import Tutorial from '../components/Tutorial'; +import '@testing-library/jest-dom'; +import Tutorial from '../components/Buttons/Tutorial'; const dispatch = jest.fn(); const props = { diff --git a/src/app/__tests__/WebMetrics.test.tsx b/src/app/__tests__/WebMetrics.test.tsx index 4db91a7e6..7702871cc 100644 --- a/src/app/__tests__/WebMetrics.test.tsx +++ b/src/app/__tests__/WebMetrics.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render as rtlRender } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; -import WebMetrics from '../components/WebMetrics'; +import '@testing-library/jest-dom'; +import WebMetrics from '../components/StateRoute/WebMetrics/WebMetrics'; import { useDispatch, Provider } from 'react-redux'; import { configureStore } from '@reduxjs/toolkit'; import { mainSlice } from '../slices/mainSlice'; diff --git a/src/app/__tests__/action.test.tsx b/src/app/__tests__/action.test.tsx index 2574fea1d..c20ef3065 100644 --- a/src/app/__tests__/action.test.tsx +++ b/src/app/__tests__/action.test.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { render as rtlRender, screen, fireEvent } from '@testing-library/react'; // import user from '@testing-library/user-event'; //might be unused -import '@testing-library/jest-dom/extend-expect'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) -import Action from '../components/Action'; +import '@testing-library/jest-dom'; // needed this to extend the jest-dom assertions (ex toHaveTextContent) +import Action from '../components/Actions/Action'; import { changeView, changeSlider } from '../slices/mainSlice'; import { Provider } from 'react-redux'; import { store } from '../store'; //importing store for testing to give us access to Redux Store we configured diff --git a/src/app/__tests__/dropdown.test.tsx b/src/app/__tests__/dropdown.test.tsx index 1ccc7924b..6bf73e349 100644 --- a/src/app/__tests__/dropdown.test.tsx +++ b/src/app/__tests__/dropdown.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; -import Dropdown from '../components/Dropdown'; -import '@testing-library/jest-dom/extend-expect'; +import Dropdown from '../components/TimeTravel/Dropdown'; +import '@testing-library/jest-dom'; describe('Dropdown component test', () => { const speeds = [ diff --git a/src/app/components/Action.tsx b/src/app/components/Actions/Action.tsx similarity index 97% rename from src/app/components/Action.tsx rename to src/app/components/Actions/Action.tsx index db42583c8..34f84b740 100644 --- a/src/app/components/Action.tsx +++ b/src/app/components/Actions/Action.tsx @@ -4,8 +4,8 @@ import React from 'react'; import ReactHover, { Trigger, Hover } from 'react-hover'; -import { changeView, changeSlider } from '../slices/mainSlice'; -import { ActionProps, OptionsCursorTrueWithMargin } from '../FrontendTypes'; +import { changeView, changeSlider } from '../../slices/mainSlice'; +import { ActionProps, OptionsCursorTrueWithMargin } from '../../FrontendTypes'; import { useDispatch } from 'react-redux'; /* @@ -117,9 +117,9 @@ const Action = (props: ActionProps): JSX.Element => { >
              diff --git a/src/app/components/RouteDescription.tsx b/src/app/components/Actions/RouteDescription.tsx similarity index 100% rename from src/app/components/RouteDescription.tsx rename to src/app/components/Actions/RouteDescription.tsx diff --git a/src/app/components/SwitchApp.tsx b/src/app/components/Actions/SwitchApp.tsx similarity index 93% rename from src/app/components/SwitchApp.tsx rename to src/app/components/Actions/SwitchApp.tsx index 8901bce54..03c2c4757 100644 --- a/src/app/components/SwitchApp.tsx +++ b/src/app/components/Actions/SwitchApp.tsx @@ -1,9 +1,10 @@ import React from 'react'; import Select from 'react-select'; -import { setTab } from '../slices/mainSlice'; +import { setTab } from '../../slices/mainSlice'; //importing these methods for RTK import { useSelector, useDispatch } from 'react-redux'; -import { MainState, RootState } from '../FrontendTypes'; +import { MainState, RootState } from '../../FrontendTypes'; +import { current } from '@reduxjs/toolkit'; /* This is the dropdown menu on the left column above the 'clear' button and the state snapshots list. It allows us to switch between which website/application we are currently working on. @@ -17,7 +18,6 @@ const SwitchAppDropdown = (): JSX.Element => { const { currentTab, tabs }: MainState = useSelector((state: RootState) => state.main); const tabsArray: {}[] = []; // tabsArray is an empty array that will take objects as it's elements - Object.keys(tabs).forEach((tab) => { // We populate our 'tabsArray' with objects derived from the 'tab' that is currently being iterated on. tabsArray.unshift({ value: tab, label: tabs[tab].title }); diff --git a/src/app/components/StatusDot.tsx b/src/app/components/Buttons/StatusDot.tsx similarity index 100% rename from src/app/components/StatusDot.tsx rename to src/app/components/Buttons/StatusDot.tsx diff --git a/src/app/components/Tutorial.tsx b/src/app/components/Buttons/Tutorial.tsx similarity index 98% rename from src/app/components/Tutorial.tsx rename to src/app/components/Buttons/Tutorial.tsx index a07624ecb..7e86bc094 100644 --- a/src/app/components/Tutorial.tsx +++ b/src/app/components/Buttons/Tutorial.tsx @@ -5,11 +5,11 @@ import * as React from 'react'; import { Component } from 'react'; import 'intro.js/introjs.css'; -import { TutorialProps, TutorialState, StepsObj } from '../FrontendTypes'; +import { TutorialProps, TutorialState, StepsObj } from '../../FrontendTypes'; import { Button } from '@mui/material'; import HelpOutlineIcon from '@mui/icons-material/HelpOutline'; const { Steps } = require('intro.js-react'); //Must be required in. This enables compatibility with TS. If imported in, throws ts error of not rendering steps as a class component correctly. The package 'intro.js-react' is small React wrapper around Intro.js. The wrapper provides support for both steps and hints. https://introjs.com/docs/ -import { setCurrentTabInApp, tutorialSaveSeriesToggle } from '../slices/mainSlice'; +import { setCurrentTabInApp, tutorialSaveSeriesToggle } from '../../slices/mainSlice'; import { useDispatch, useSelector } from 'react-redux'; /* This is the tutorial displayed when the "How to use" button is clicked @@ -365,7 +365,7 @@ export default class Tutorial extends Component { type='button' onClick={() => startIntro()} > - Tutorial + Tutorial ); diff --git a/src/app/components/DiffRoute.tsx b/src/app/components/DiffRoute.tsx deleted file mode 100644 index 1cb29c2a2..000000000 --- a/src/app/components/DiffRoute.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import { MemoryRouter as Router, Route, NavLink, Switch } from 'react-router-dom'; -import Diff from './Diff'; -import { DiffRouteProps } from '../FrontendTypes'; - -/* - Loads the appropriate DiffRoute view and renders the 'Tree' and 'Raw' navbar buttons after clicking on the 'Diff' button located near the top rightmost corner. -*/ - -// 'DiffRoute' only passed in prop is 'snapshot' from 'tabs[currentTab]' object in 'MainContainer' -const DiffRoute = (props: DiffRouteProps): JSX.Element => ( - -
              - - Tree - - - Raw - -
              - - } /> - } /> - -
              -); - -export default DiffRoute; diff --git a/src/app/components/Diff.tsx b/src/app/components/DiffRoute/Diff.tsx similarity index 85% rename from src/app/components/Diff.tsx rename to src/app/components/DiffRoute/Diff.tsx index cadf466bd..340c88790 100644 --- a/src/app/components/Diff.tsx +++ b/src/app/components/DiffRoute/Diff.tsx @@ -1,7 +1,14 @@ import React from 'react'; import { diff, formatters } from 'jsondiffpatch'; -import ReactHtmlParser from 'react-html-parser'; -import { CurrentTab, DiffProps, MainState, RootState, StatelessCleaning } from '../FrontendTypes'; +// const jsondiffpatch = require('jsondiffpatch'); +import Parse from 'html-react-parser'; +import { + CurrentTab, + DiffProps, + MainState, + RootState, + StatelessCleaning, +} from '../../FrontendTypes'; import { useSelector } from 'react-redux'; /** @@ -29,7 +36,7 @@ function Diff(props: DiffProps): JSX.Element { } /* - State snapshot objects have the following structure: + State snapshot objects have the following structure: { children: array of objects componentData: object @@ -82,9 +89,10 @@ function Diff(props: DiffProps): JSX.Element { const previousDisplay: StatelessCleaning = statelessCleaning(previous); // displays stateful data from the first snapshot that was taken before our current snapshot. - const delta: StatelessCleaning = diff(previousDisplay, snapshot); // diff function from 'jsondiffpatch' returns the difference in state between 'previousDisplay' and 'snapshot' + const delta = diff(previousDisplay, snapshot); // diff function from 'jsondiffpatch' returns the difference in state between 'previousDisplay' and 'snapshot' - const html: StatelessCleaning = formatters.html.format(delta, previousDisplay); // formatters function from 'jsondiffpatch' returns an html string that shows the difference between delta and the previousDisplay + const html = formatters.html.format(delta, previousDisplay); // formatters function from 'jsondiffpatch' returns an html string that shows the difference between delta and the previousDisplay + // console.log(html); if (show) formatters.html.showUnchanged(); // shows unchanged values if we're on the '/diffRaw' path @@ -100,7 +108,7 @@ function Diff(props: DiffProps): JSX.Element {
              ); } - return
              {ReactHtmlParser(html)}
              ; // ReactHTMLParser from 'react-html-parser' package converts the HTML string into a react component. + return
              {Parse(html)}
              ; // HTMLReactParser from 'html-react-parser' package converts the HTML string into a react component. } export default Diff; diff --git a/src/app/components/DiffRoute/DiffRoute.tsx b/src/app/components/DiffRoute/DiffRoute.tsx new file mode 100644 index 000000000..081f7ebd1 --- /dev/null +++ b/src/app/components/DiffRoute/DiffRoute.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { MemoryRouter as Router, Route, NavLink, Routes } from 'react-router-dom'; +import Diff from './Diff'; +import { DiffRouteProps } from '../../FrontendTypes'; + +/* + Loads the appropriate DiffRoute view and renders the 'Tree' and 'Raw' navbar buttons after clicking on the 'Diff' button located near the top rightmost corner. +*/ + +// 'DiffRoute' only passed in prop is 'snapshot' from 'tabs[currentTab]' object in 'MainContainer' +const DiffRoute = (props: DiffRouteProps): JSX.Element => ( +
              +
              + (navData.isActive ? 'is-active router-link' : 'router-link')} + to='/diff/tree' + > + Tree + + (navData.isActive ? 'is-active router-link' : 'router-link')} + to='/diff/diffRaw' + > + Raw + +
              +
              + + } /> + } /> + +
              +
              +); + +export default DiffRoute; diff --git a/src/app/components/ErrorHandler.tsx b/src/app/components/ErrorHandling/ErrorHandler.tsx similarity index 100% rename from src/app/components/ErrorHandler.tsx rename to src/app/components/ErrorHandling/ErrorHandler.tsx diff --git a/src/app/components/ErrorMsg.tsx b/src/app/components/ErrorHandling/ErrorMsg.tsx similarity index 92% rename from src/app/components/ErrorMsg.tsx rename to src/app/components/ErrorHandling/ErrorMsg.tsx index 53db3c899..7ad1935a2 100644 --- a/src/app/components/ErrorMsg.tsx +++ b/src/app/components/ErrorHandling/ErrorMsg.tsx @@ -26,18 +26,18 @@ function parseError(loadingArray: [], status: Record): string { return 'default'; } -function ErrorMsg({ loadingArray, status, launchContent }): JSX.Element { +function ErrorMsg({ loadingArray, status, launchContent, reinitialize }): JSX.Element { switch ( parseError(loadingArray, status) // parseError returns a string based on the loadingArray and status. The returned string is matched to a case so that an appropriate error message will be displayed to the user ) { case 'Content Script Error': return (
              - Could not connect to the Target App. Try closing Reactime and reloading the page. + Target App not yet found...
              + If you encounter this error on the initial launch of Reactime, try refreshing the webpage + you are developing.
              - If you encounter this error on the initial launch of Reactime, refresh the webpage you are - developing.
              If Reactime is running as an iframe in your developer tools, right click on the Reactime application and click 'Reload Frame' @@ -81,7 +81,7 @@ function ErrorMsg({ loadingArray, status, launchContent }): JSX.Element { case 'Not React App': return (
              - The Target app is either not a React application or is not compatible with Reactime + The Target app is either not a React application or is not compatible with Reactime.
              ); default: diff --git a/src/app/components/Loader.tsx b/src/app/components/ErrorHandling/Loader.tsx similarity index 100% rename from src/app/components/Loader.tsx rename to src/app/components/ErrorHandling/Loader.tsx diff --git a/src/app/components/StateRoute/ComponentMap/ComponentMap.tsx b/src/app/components/StateRoute/ComponentMap/ComponentMap.tsx index f27616ab7..791397bd5 100644 --- a/src/app/components/StateRoute/ComponentMap/ComponentMap.tsx +++ b/src/app/components/StateRoute/ComponentMap/ComponentMap.tsx @@ -22,6 +22,13 @@ import { toggleExpanded, setCurrentTabInApp } from '../../../slices/mainSlice'; import { useDispatch } from 'react-redux'; import { LinkTypesProps, DefaultMargin, ToolTipStyles } from '../../../FrontendTypes'; +const linkStroke = '#F00008'; //#F00008 original +const rootStroke = '#F00008'; //#F00008 original +const nodeParentFill = '#161521'; //#161521 original +const nodeChildFill = '#62d6fb'; //#62d6fb original +const nodeParentStroke = '#F00008'; //#F00008 original +const nodeChildStroke = '#4D4D4D'; //#4D4D4D original + const defaultMargin: DefaultMargin = { top: 30, left: 30, @@ -29,6 +36,13 @@ const defaultMargin: DefaultMargin = { bottom: 70, }; +const nodeCoords: object = {}; +let count: number = 0; +let aspect: number = 1; // aspect resizes the component map container to accommodate large node trees on complex sites +let nodeCoordTier = 0; +let nodeOneLeft = 0; +let nodeTwoLeft = 2; + export default function ComponentMap({ // imported props to be used to display the dendrogram width: totalWidth, @@ -127,6 +141,7 @@ export default function ComponentMap({ }; const formatRenderTime: string = (time: number): string => { + if (!time) return 'No time information'; const renderTime = time.toFixed(3); return `${renderTime} ms `; }; @@ -189,31 +204,34 @@ export default function ComponentMap({ setSelectedNode={setSelectedNode} /> - - + + {/* */} + + { hideTooltip(); }} - width={totalWidth} - height={totalHeight} + width={sizeWidth / aspect} + height={sizeHeight / aspect + 0} rx={14} - fill='#242529' /> - + (d.isExpanded ? d.children : null))} - size={[sizeWidth, sizeHeight]} - separation={(a, b) => (a.parent === b.parent ? 1 : 0.5) / a.depth} + size={[sizeWidth / aspect, sizeHeight / aspect]} + separation={(a, b) => (a.parent === b.parent ? 0.5 : 0.5) / a.depth} > {(tree) => ( - + {tree.links().map((link, i) => ( @@ -221,11 +239,12 @@ export default function ComponentMap({ {tree.descendants().map((node, key) => { const widthFunc: number = (name) => { - // function that takes in a node's name and returns a number that is related to the length of the name. Used for determining the node width. + //returns a number that is related to the length of the name. Used for determining the node width. const nodeLength = name.length; - if (nodeLength <= 5) return nodeLength + 80; // returns a number between 80-85 - if (nodeLength <= 10) return nodeLength + 120; // returns a number between 125-130 - return nodeLength + 140; // returns a number greater than 150 + //return nodeLength * 7 + 20; //uncomment this line if we want each node to be directly proportional to the name.length (instead of nodes of similar sizes to snap to the same width) + if (nodeLength <= 5) return nodeLength + 50; + if (nodeLength <= 10) return nodeLength + 120; + return nodeLength + 140; }; const width: number = widthFunc(node.data.name); // the width is determined by the length of the node.name @@ -244,6 +263,73 @@ export default function ComponentMap({ top = node.x; left = node.y; } + //setup a nodeCoords Object that will have keys of unique y coordinates and value arrays of all the left and right x coordinates of the nodes on that level + count < nodeList.length + ? !nodeCoords[top] + ? (nodeCoords[top] = [left - width / 2, left + width / 2]) + : nodeCoords[top].push(left - width / 2, left + width / 2) + : null; + count++; + + //check if the node coordinate object has been constructed + if (count === nodeList.length) { + //check if there is still a tier of the node tree to collision check + while (Object.values(nodeCoords)[nodeCoordTier]) { + //check if there are atleast two nodes on the current tier + if ( + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft] && + Object.values(nodeCoords)[nodeCoordTier][nodeTwoLeft] + ) { + //check if the left side of the righthand node is to the right of the right side of the lefthand node (i.e. collision) + if ( + Object.values(nodeCoords)[nodeCoordTier][nodeTwoLeft] < + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft + 1] + ) { + //check if the visible percentage of the left hand node is less than the current lowest (this will be used to resize and rescale the map) + if ( + Math.abs( + Object.values(nodeCoords)[nodeCoordTier][nodeTwoLeft] - + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft], + ) / + Math.abs( + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft + 1] - + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft], + ) < + aspect + ) { + //assign a new lowest percentage if one is found + aspect = + Math.abs( + Object.values(nodeCoords)[nodeCoordTier][nodeTwoLeft] - + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft], + ) / + Math.abs( + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft + 1] - + Object.values(nodeCoords)[nodeCoordTier][nodeOneLeft], + ); + } + //move the node pointers down the list after checking the current overlap percentage + else { + nodeOneLeft += 2; + nodeTwoLeft += 2; + } + } + //move the node pointers if no collision is found + else { + nodeOneLeft += 2; + nodeTwoLeft += 2; + } + } + //move to the next tier of the node tree if done checking the current one + else { + nodeOneLeft = 0; + nodeTwoLeft = 2; + nodeCoordTier++; + } + } + } else { + aspect = Math.max(aspect, 0.2); + } // mousing controls & Tooltip display logic const handleMouseAndClickOver: void = (event) => { @@ -263,9 +349,10 @@ export default function ComponentMap({ {node.depth === 0 && ( { dispatch(toggleExpanded(node.data)); hideTooltip(); @@ -277,16 +364,19 @@ export default function ComponentMap({ and sets it relative position to other parent nodes of the same level. */} {node.depth !== 0 && ( 0 - ? '#F00008' - : '#4D4D4D' - } + fill="url('#parent-gradient')" + //color={'#ff0000'} + //fill={node.children ? nodeParentFill : nodeChildFill} + //stroke={ + // node.data.isExpanded && node.data.children.length > 0 + // ? nodeParentStroke + // : nodeChildStroke + // } strokeWidth={1.5} strokeOpacity='1' rx={node.children ? 4 : 10} @@ -332,12 +422,19 @@ export default function ComponentMap({ {/* Display text inside of each component node */} {node.data.name} diff --git a/src/app/components/StateRoute/ComponentMap/LinkControls.tsx b/src/app/components/StateRoute/ComponentMap/LinkControls.tsx index 891b1c40f..69b80447f 100644 --- a/src/app/components/StateRoute/ComponentMap/LinkControls.tsx +++ b/src/app/components/StateRoute/ComponentMap/LinkControls.tsx @@ -3,19 +3,19 @@ import React from 'react'; import { LinkControlProps, ControlStyles, DropDownStyle, Node } from '../../../FrontendTypes'; // Font size of the Controls label and Dropdowns const controlStyles: ControlStyles = { - fontSize: '16px', + //fontSize: '16px', padding: '10px', }; const dropDownStyle: DropDownStyle = { - margin: '0.5em', - fontSize: '16px', + margin: '0.1em', + //fontSize: '16px', fontFamily: 'Roboto, sans-serif', borderRadius: '4px', borderStyle: 'solid', borderWidth: '1px', - backgroundColor: '#242529', - color: 'white', + backgroundColor: '#d9d9d9', + color: '#161617', padding: '2px', }; @@ -49,13 +49,14 @@ export default function LinkControls({ collectNodes(snapShots); return ( -
              +
              {' '} {/* Controls for the layout selection */}  {' '} {/* This is a non-breaking space - Prevents an automatic line break at this position */} { @@ -173,7 +188,7 @@ const BarGraph = (props: BarGraphProps): JSX.Element => {
              { onOpen={handleOpen} onChange={handleSeriesChange} sx={{ - backgroundColor: '#53b6d5', + backgroundColor: '#d9d9d9', color: 'white', height: 34, fontWeight: 400, @@ -430,7 +432,7 @@ const BarGraphComparison = (props: BarGraphComparisonProps): JSX.Element => { tickStroke={axisColor} strokeWidth={2} tickLabelProps={() => ({ - fill: 'rgb(231, 231, 231)', + fill: axisTickLabelColor, fontSize: 11, verticalAnchor: 'middle', textAnchor: 'end', @@ -444,15 +446,15 @@ const BarGraphComparison = (props: BarGraphComparisonProps): JSX.Element => { tickStroke={axisColor} strokeWidth={2} tickLabelProps={() => ({ - fill: 'rgb(231, 231, 231)', + fill: axisTickLabelColor, fontSize: 11, textAnchor: 'middle', })} /> - + Rendering Time (ms) - + Series ID diff --git a/src/app/components/StateRoute/PerformanceVisx/BarGraphComparisonActions.tsx b/src/app/components/StateRoute/PerformanceVisx/BarGraphComparisonActions.tsx index 99120808d..837e4ba03 100644 --- a/src/app/components/StateRoute/PerformanceVisx/BarGraphComparisonActions.tsx +++ b/src/app/components/StateRoute/PerformanceVisx/BarGraphComparisonActions.tsx @@ -25,7 +25,7 @@ const margin: Margin = { bottom: 0, left: 50, }; -const axisColor = '#62d6fb'; +const axisColor = '#ff0000'; //#62d6fb const background = '#242529'; const tooltipStyles = { ...defaultStyles, @@ -274,6 +274,7 @@ const BarGraphComparisonActions = (props: BarGraphComparisonAction) => { {/* Insert Action Comparison Barstack here */} { useEffect(() => { dispatch(setCurrentTabInApp('performance')); // dispatch sent at initial page load allowing changing "immer's" draft.currentTabInApp to 'performance' to facilitate render. - }, [dispatch]); - - const renderComparisonBargraph = () => { - if (hierarchy && series !== false) { - return ( - - ); - } - return ( - - ); - }; + renderForTutorial(); + }, []); const allRoutes = []; // create allRoutes variable to hold urls const filteredSnapshots = []; @@ -267,72 +241,107 @@ const PerformanceVisx = (props: PerformanceVisxProps): JSX.Element => { if (holdData) data.barStack = holdData; // assign holdData to data.barStack to be used later to create graph } - const renderBargraph = (): JSX.Element | null => { - if (hierarchy) { - return ( -
              - -
              - ); - } - return null; - }; - - const renderComponentDetailsView = () => { - if (hierarchy) { - return ; - } - return
              {NO_STATE_MSG}
              ; - }; - const renderForTutorial = () => { // This will redirect to the proper tabs during the tutorial - if (currentTabInApp === 'performance') return ; - if (currentTabInApp === 'performance-comparison') return ; + // Updated redirect to Navigate v23 redirect no longer supported in react router dom after v6 + if (currentTabInApp === 'performance') return ; + if (currentTabInApp === '/performance-comparison') + return ; return null; }; return ( - + <>
              - + + navData.isActive ? 'is-active router-link-performance' : 'router-link-performance' + } + end + to='/performance/' + > Snapshots View + navData.isActive ? 'is-active router-link-performance' : 'router-link-performance' + } id='router-link-performance-comparison' - activeClassName='is-active' - to='/comparison' + to='/performance/comparison' > Comparison View + navData.isActive ? 'is-active router-link-performance' : 'router-link-performance' + } + to='/performance/componentdetails' > Component Details
              - {renderForTutorial()} + {/* {renderForTutorial()} */} - - - - - -
              + + + ) : ( + + ) + } + /> + + ) : ( +
              {NO_STATE_MSG}
              + ) + } + /> + + +
              + ) : null + } + /> + + ); }; diff --git a/src/app/components/StateRoute/StateRoute.tsx b/src/app/components/StateRoute/StateRoute.tsx index ffb1a3161..119236b08 100644 --- a/src/app/components/StateRoute/StateRoute.tsx +++ b/src/app/components/StateRoute/StateRoute.tsx @@ -6,14 +6,14 @@ /* eslint-disable max-len */ /* eslint-disable object-curly-newline */ import React from 'react'; -import { MemoryRouter as Router, Route, NavLink, Switch } from 'react-router-dom'; +import { MemoryRouter as Router, Route, NavLink, Routes, Outlet, Link } from 'react-router-dom'; import { ParentSize } from '@visx/responsive'; import Tree from './Tree'; import ComponentMap from './ComponentMap/ComponentMap'; import { changeView, changeSlider } from '../../slices/mainSlice'; import { useSelector } from 'react-redux'; import PerformanceVisx from './PerformanceVisx/PerformanceVisx'; -import WebMetrics from '../WebMetrics'; +import WebMetricsContainer from './WebMetrics/WebMetricsContainer'; import { MainState, RootState, StateRouteProps } from '../../FrontendTypes'; /* @@ -26,238 +26,145 @@ const NO_STATE_MSG = 'No state change detected. Trigger an event to change state const StateRoute = (props: StateRouteProps) => { const { snapshot, // from 'tabs[currentTab]' object in 'MainContainer' - hierarchy, // from 'tabs[currentTab]' object in 'MainContainer' + hierarchy: propsHierarchy, // from 'tabs[currentTab]' object in 'MainContainer' snapshots, // from 'tabs[currentTab].snapshotDisplay' object in 'MainContainer' - viewIndex, // from 'tabs[currentTab]' object in 'MainContainer' + viewIndex: propsViewIndex, // from 'tabs[currentTab]' object in 'MainContainer' webMetrics, // from 'tabs[currentTab]' object in 'MainContainer' currLocation, // from 'tabs[currentTab]' object in 'MainContainer' } = props; const { tabs, currentTab }: MainState = useSelector((state: RootState) => state.main); - const { hierarchy, sliderIndex, viewIndex } = tabs[currentTab]; - - const renderComponentMap = () => { - if (hierarchy) { - // if hierarchy was initialized/created render the Map - return ( - - {({ width, height }) => ( - // eslint-disable-next-line react/prop-types - - )} - - ); - } - return
              {NO_STATE_MSG}
              ; // otherwise, inform the user that there has been no state change in the target/hooked application. - }; - - const renderHistory: JSX.Element = () => { - if (hierarchy) { - // if hierarchy was initialized/created render the history - return ( - - {({ width, height }) => ( - - )} - - ); - } - return
              {NO_STATE_MSG}
              ; // otherwise, inform the user that there has been no state change in the target/hooked application. - }; - - const renderTree = () => { - if (hierarchy) { - // if a hierarchy has been created/initialized, render the appropriate tree based on the active snapshot - return ; - } - return
              {NO_STATE_MSG}
              ; // otherwise, inform the user that there has been no state change in the target/hooked application. - }; - const renderWebMetrics = () => { - let LCPColor: String; - let FIDColor: String; - let FCPColor: String; - let TTFBColor: String; - let CLSColor: String; - let INPColor: String; - - // adjust the strings that represent colors of the webmetrics performance bar for 'Largest Contentful Paint (LCP)', 'First Input Delay (FID)', 'First Contentfuly Paint (FCP)', 'Time to First Byte (TTFB)', 'Cumulative Layout Shift (CLS)', and 'Interaction to Next Paint (INP)' based on webMetrics outputs. - if (webMetrics.LCP <= 2500) LCPColor = '#0bce6b'; - if (webMetrics.LCP > 2500 && webMetrics.LCP <= 4000) LCPColor = '#fc5a03'; - if (webMetrics.LCP > 4000) LCPColor = '#fc2000'; - - if (webMetrics.FID <= 100) FIDColor = '#0bce6b'; - if (webMetrics.FID > 100 && webMetrics.FID <= 300) FIDColor = '#fc5a03'; - if (webMetrics.FID > 300) FIDColor = '#fc2000'; - - if (webMetrics.FCP <= 1800) FCPColor = '#0bce6b'; - if (webMetrics.FCP > 1800 && webMetrics.FCP <= 3000) FCPColor = '#fc5a03'; - if (webMetrics.FCP > 3000) FCPColor = '#fc2000'; - - if (webMetrics.TTFB <= 800) TTFBColor = '#0bce6b'; - if (webMetrics.TTFB > 800 && webMetrics.TTFB <= 1800) TTFBColor = '#fc5a03'; - if (webMetrics.TTFB > 1800) TTFBColor = '#fc2000'; - - if (webMetrics.CLS <= 0.1) CLSColor = '#0bce6b'; - if (webMetrics.CLS > 0.1 && webMetrics.CLS <= 0.25) CLSColor = '#fc5a03'; - if (webMetrics.CLS > 0.25) CLSColor = '#fc2000'; - - if (webMetrics.INP <= 200) INPColor = '#0bce6b'; - if (webMetrics.INP > 200 && webMetrics.INP <= 500) INPColor = '#fc5a03'; - if (webMetrics.INP > 500) INPColor = '#fc2000'; - - return ( -
              - - typeof webMetrics.LCP !== 'number' ? '- ms' : `${webMetrics.LCP.toFixed(2)} ms` - } - score={['2500 ms', '4000 ms']} - overLimit={webMetrics.LCP > 7000} - label='Largest Contentful Paint' - name='Largest Contentful Paint' - description='Measures loading performance.' - /> - - typeof webMetrics.FID !== 'number' ? '- ms' : `${webMetrics.FID.toFixed(2)} ms` - } - score={['100 ms', '300 ms']} - overLimit={webMetrics.FID > 500} - label='First Input Delay' - name='First Input Delay' - description='Measures interactivity.' - /> - - typeof webMetrics.FCP !== 'number' ? '- ms' : `${webMetrics.FCP.toFixed(2)} ms` - } - score={['1800 ms', '3000 ms']} - overLimit={webMetrics.FCP > 5000} - label='First Contentful Paint' - name='First Contentful Paint' - description='Measures the time it takes the browser to render the first piece of DOM content.' - /> - - typeof webMetrics.TTFB !== 'number' ? '- ms' : `${webMetrics.TTFB.toFixed(2)} ms` - } - score={['800 ms', '1800 ms']} - overLimit={webMetrics.TTFB > 3000} - label='Time To First Byte' - name='Time to First Byte' - description='Measures the time it takes for a browser to receive the first byte of page content.' - /> - - `CLS Score: ${ - typeof webMetrics.CLS !== 'number' - ? 'N/A' - : `${webMetrics.CLS < 0.01 ? '~0' : webMetrics.CLS.toFixed(2)}` - }` - } - score={['0.1', '0.25']} - overLimit={webMetrics.CLS > 0.5} - label='Cumulative Layout Shift' - name='Cumulative Layout Shift' - description={`Quantifies the visual stability of a web page by measuring layout shifts during the application's loading and interaction.`} - /> - - typeof webMetrics.INP !== 'number' ? '- ms' : `${webMetrics.INP.toFixed(2)} ms` - } - score={['200 ms', '500 ms']} - overLimit={webMetrics.INP > 700} - label='Interaction to Next Paint' - name='Interaction to Next Paint' - description={`Assesses a page's overall responsiveness to user interactions by observing the latency of all click, tap, and keyboard interactions that occur throughout the lifespan of a user's visit to a page`} - /> -
              - ); - }; - - const renderPerfView = () => { - if (hierarchy) { - // if hierarchy was initialized/created render the PerformanceVisx - return ( - - {({ width, height }) => ( - - )} - - ); - } - return
              {NO_STATE_MSG}
              ; // otherwise, inform the user that there has been no state change in the target/hooked application. - }; + const { hierarchy: tabsHierarchy, sliderIndex, viewIndex: tabsViewIndex } = tabs[currentTab]; + const hierarchy = propsHierarchy || tabsHierarchy; + const viewIndex = propsViewIndex || tabsViewIndex; return ( - +
              - + + navData.isActive ? 'is-active router-link map-tab' : 'router-link map-tab' + } + end + > Map + navData.isActive ? 'is-active router-link map-tab' : 'router-link map-tab' + } to='/performance' > Performance - + + navData.isActive ? 'is-active router-link history-tab' : 'router-link history-tab' + } + to='/history' + > History + navData.isActive + ? 'is-active router-link web-metrics-tab' + : 'router-link web-metrics-tab' + } to='/webMetrics' > Web Metrics - + + navData.isActive ? 'is-active router-link tree-tab' : 'router-link tree-tab' + } + to='/tree' + > Tree
              - - - - - - - - +
              + + + {({ width, height }) => ( + + )} + + ) : ( +
              {NO_STATE_MSG}
              + ) + } + /> + + + {({ width, height }) => ( + + )} + + +
              + ) : ( +
              {NO_STATE_MSG}
              + ) + } + /> + } /> + } + /> + + {({ width, height }) => { + // eslint-disable-next-line react/prop-types + const maxHeight: number = 1200; + const h = Math.min(height, maxHeight); + return ( + + ); + }} + + ) : null + } + /> + +
              +
              ); }; diff --git a/src/app/components/StateRoute/Tree.tsx b/src/app/components/StateRoute/Tree.tsx index 4c9fdea94..6c1ba84ef 100644 --- a/src/app/components/StateRoute/Tree.tsx +++ b/src/app/components/StateRoute/Tree.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import JSONTree from 'react-json-tree'; // React JSON Viewer Component +import { JSONTree } from 'react-json-tree'; // React JSON Viewer Component import { setCurrentTabInApp } from '../../slices/mainSlice'; import { useDispatch } from 'react-redux'; import { TreeProps } from '../../FrontendTypes'; diff --git a/src/app/components/WebMetrics.tsx b/src/app/components/StateRoute/WebMetrics/WebMetrics.tsx similarity index 94% rename from src/app/components/WebMetrics.tsx rename to src/app/components/StateRoute/WebMetrics/WebMetrics.tsx index 6acb5d37e..164530fc3 100644 --- a/src/app/components/WebMetrics.tsx +++ b/src/app/components/StateRoute/WebMetrics/WebMetrics.tsx @@ -1,8 +1,8 @@ import React, { useEffect } from 'react'; import Charts from 'react-apexcharts'; import ReactHover, { Trigger, Hover } from 'react-hover'; -import { OptionsCursorTrueWithMargin } from '../FrontendTypes'; -import { setCurrentTabInApp } from '../slices/mainSlice'; +import { OptionsCursorTrueWithMargin } from '../../../FrontendTypes'; +import { setCurrentTabInApp } from '../../../slices/mainSlice'; import { useDispatch } from 'react-redux'; /* Used to render a single radial graph on the 'Web Metrics' tab @@ -49,7 +49,7 @@ const radialGraph = (props) => { }, }, track: { - background: '#fff', + background: '#161617', strokeWidth: '3%', margin: 0, // margin is in pixels dropShadow: { @@ -66,12 +66,12 @@ const radialGraph = (props) => { name: { offsetY: -10, show: true, - color: '#fff', + color: '#161617', fontSize: '24px', }, value: { formatter: props.formatted, - color: '#fff', + color: '#3c6e71', fontSize: '16px', show: true, }, diff --git a/src/app/components/StateRoute/WebMetrics/WebMetricsContainer.tsx b/src/app/components/StateRoute/WebMetrics/WebMetricsContainer.tsx new file mode 100644 index 000000000..ae0e34e74 --- /dev/null +++ b/src/app/components/StateRoute/WebMetrics/WebMetricsContainer.tsx @@ -0,0 +1,125 @@ +import React from 'react'; +import WebMetrics from './WebMetrics'; + +/* + Used to render a container for all of the 'Web Metrics' tab +*/ + +const WebMetricsContainer = (props) => { + const { webMetrics } = props; + + let LCPColor: String; + let FIDColor: String; + let FCPColor: String; + let TTFBColor: String; + let CLSColor: String; + let INPColor: String; + + // adjust the strings that represent colors of the webmetrics performance bar for 'Largest Contentful Paint (LCP)', 'First Input Delay (FID)', 'First Contentfuly Paint (FCP)', 'Time to First Byte (TTFB)', 'Cumulative Layout Shift (CLS)', and 'Interaction to Next Paint (INP)' based on webMetrics outputs. + if (webMetrics.LCP <= 2500) LCPColor = '#0bce6b'; + if (webMetrics.LCP > 2500 && webMetrics.LCP <= 4000) LCPColor = '#fc5a03'; + if (webMetrics.LCP > 4000) LCPColor = '#fc2000'; + + if (webMetrics.FID <= 100) FIDColor = '#0bce6b'; + if (webMetrics.FID > 100 && webMetrics.FID <= 300) FIDColor = '#fc5a03'; + if (webMetrics.FID > 300) FIDColor = '#fc2000'; + + if (webMetrics.FCP <= 1800) FCPColor = '#0bce6b'; + if (webMetrics.FCP > 1800 && webMetrics.FCP <= 3000) FCPColor = '#fc5a03'; + if (webMetrics.FCP > 3000) FCPColor = '#fc2000'; + + if (webMetrics.TTFB <= 800) TTFBColor = '#0bce6b'; + if (webMetrics.TTFB > 800 && webMetrics.TTFB <= 1800) TTFBColor = '#fc5a03'; + if (webMetrics.TTFB > 1800) TTFBColor = '#fc2000'; + + if (webMetrics.CLS <= 0.1) CLSColor = '#0bce6b'; + if (webMetrics.CLS > 0.1 && webMetrics.CLS <= 0.25) CLSColor = '#fc5a03'; + if (webMetrics.CLS > 0.25) CLSColor = '#fc2000'; + + if (webMetrics.INP <= 200) INPColor = '#0bce6b'; + if (webMetrics.INP > 200 && webMetrics.INP <= 500) INPColor = '#fc5a03'; + if (webMetrics.INP > 500) INPColor = '#fc2000'; + + return ( +
              + + typeof webMetrics.LCP !== 'number' ? '- ms' : `${webMetrics.LCP.toFixed(2)} ms` + } + score={['2500 ms', '4000 ms']} + overLimit={webMetrics.LCP > 7000} + label='Largest Contentful Paint' + name='Largest Contentful Paint' + description='Measures loading performance.' + /> + + typeof webMetrics.FID !== 'number' ? '- ms' : `${webMetrics.FID.toFixed(2)} ms` + } + score={['100 ms', '300 ms']} + overLimit={webMetrics.FID > 500} + label='First Input Delay' + name='First Input Delay' + description='Measures interactivity.' + /> + + typeof webMetrics.FCP !== 'number' ? '- ms' : `${webMetrics.FCP.toFixed(2)} ms` + } + score={['1800 ms', '3000 ms']} + overLimit={webMetrics.FCP > 5000} + label='First Contentful Paint' + name='First Contentful Paint' + description='Measures the time it takes the browser to render the first piece of DOM content.' + /> + + typeof webMetrics.TTFB !== 'number' ? '- ms' : `${webMetrics.TTFB.toFixed(2)} ms` + } + score={['800 ms', '1800 ms']} + overLimit={webMetrics.TTFB > 3000} + label='Time To First Byte' + name='Time to First Byte' + description='Measures the time it takes for a browser to receive the first byte of page content.' + /> + + `CLS Score: ${ + typeof webMetrics.CLS !== 'number' + ? 'N/A' + : `${webMetrics.CLS < 0.01 ? '~0' : webMetrics.CLS.toFixed(2)}` + }` + } + score={['0.1', '0.25']} + overLimit={webMetrics.CLS > 0.5} + label='Cumulative Layout Shift' + name='Cumulative Layout Shift' + description={`Quantifies the visual stability of a web page by measuring layout shifts during the application's loading and interaction.`} + /> + + typeof webMetrics.INP !== 'number' ? '- ms' : `${webMetrics.INP.toFixed(2)} ms` + } + score={['200 ms', '500 ms']} + overLimit={webMetrics.INP > 700} + label='Interaction to Next Paint' + name='Interaction to Next Paint' + description={`Assesses a page's overall responsiveness to user interactions by observing the latency of all click, tap, and keyboard interactions that occur throughout the lifespan of a user's visit to a page`} + /> +
              + ); +}; + +export default WebMetricsContainer; diff --git a/src/app/components/Dropdown.tsx b/src/app/components/TimeTravel/Dropdown.tsx similarity index 93% rename from src/app/components/Dropdown.tsx rename to src/app/components/TimeTravel/Dropdown.tsx index 54fe00b98..db3d86350 100644 --- a/src/app/components/Dropdown.tsx +++ b/src/app/components/TimeTravel/Dropdown.tsx @@ -1,6 +1,6 @@ import React from 'react'; import Select from 'react-select'; -import { DropdownProps } from '../FrontendTypes'; +import { DropdownProps } from '../../FrontendTypes'; /* Allows the user to change the speed of the time-travel based on the selected dropdown value diff --git a/src/app/components/MainSlider.tsx b/src/app/components/TimeTravel/MainSlider.tsx similarity index 93% rename from src/app/components/MainSlider.tsx rename to src/app/components/TimeTravel/MainSlider.tsx index 756d51fcd..7af7c7673 100644 --- a/src/app/components/MainSlider.tsx +++ b/src/app/components/TimeTravel/MainSlider.tsx @@ -1,9 +1,9 @@ import React, { useState, useEffect } from 'react'; import Slider from 'rc-slider'; import Tooltip from 'rc-tooltip'; -import { changeSlider, pause } from '../slices/mainSlice'; +import { changeSlider, pause } from '../../slices/mainSlice'; import { useDispatch, useSelector } from 'react-redux'; -import { HandleProps, MainSliderProps, MainState, RootState } from '../FrontendTypes'; +import { HandleProps, MainSliderProps, MainState, RootState } from '../../FrontendTypes'; const { Handle } = Slider; // component constructor of Slider that allows customization of the handle @@ -12,6 +12,7 @@ const handle = (props: HandleProps): JSX.Element => { return ( number { - const [, setValue] = useState(0); - return (): number => setValue((value: number): number => value + 1); -} diff --git a/src/app/containers/ActionContainer.tsx b/src/app/containers/ActionContainer.tsx index 285ff7370..ed0747a2c 100644 --- a/src/app/containers/ActionContainer.tsx +++ b/src/app/containers/ActionContainer.tsx @@ -1,10 +1,10 @@ /* eslint-disable max-len */ import React, { useEffect, useState } from 'react'; -import Action from '../components/Action'; -import SwitchAppDropdown from '../components/SwitchApp'; +import Action from '../components/Actions/Action'; +import SwitchAppDropdown from '../components/Actions/SwitchApp'; import { emptySnapshots, changeView, changeSlider } from '../slices/mainSlice'; import { useDispatch, useSelector } from 'react-redux'; -import RouteDescription from '../components/RouteDescription'; +import RouteDescription from '../components/Actions/RouteDescription'; import { ActionContainerProps, CurrentTab, MainState, Obj, RootState } from '../FrontendTypes'; import { Button, Switch } from '@mui/material'; @@ -146,9 +146,11 @@ function ActionContainer(props: ActionContainerProps): JSX.Element { ); }, ); - useEffect(() => { - setActionView(true); - }, [setActionView]); + + // JR: this is questionable, why would you always set it to true? + // useEffect(() => { + // setActionView(true); + // }, [setActionView]); // Function sends message to background.js which sends message to the content script const toggleRecord = (): void => { @@ -181,13 +183,28 @@ function ActionContainer(props: ActionContainerProps): JSX.Element { @@ -196,9 +213,9 @@ function ActionContainer(props: ActionContainerProps): JSX.Element {
              {/* The component below renders a button for the tutorial walkthrough of Reactime */} @@ -129,7 +133,7 @@ function ButtonsContainer(): JSX.Element { } > - + Reconnect diff --git a/src/app/containers/ErrorContainer.tsx b/src/app/containers/ErrorContainer.tsx index 6def945e3..4725d2d9a 100644 --- a/src/app/containers/ErrorContainer.tsx +++ b/src/app/containers/ErrorContainer.tsx @@ -1,10 +1,11 @@ /* eslint-disable max-len */ import React, { useState, useEffect, useRef } from 'react'; import { launchContentScript } from '../slices/mainSlice'; -import Loader from '../components/Loader'; -import ErrorMsg from '../components/ErrorMsg'; +import Loader from '../components/ErrorHandling/Loader'; +import ErrorMsg from '../components/ErrorHandling/ErrorMsg'; import { useDispatch, useSelector } from 'react-redux'; -import { MainState, RootState } from '../FrontendTypes'; +import { MainState, RootState, ErrorContainerProps } from '../FrontendTypes'; +import { current } from '@reduxjs/toolkit'; /* This is the loading screen that a user may get when first initalizing the application. This page checks: @@ -13,7 +14,7 @@ This is the loading screen that a user may get when first initalizing the applic 3. if target tab contains a compatible React app */ -function ErrorContainer(): JSX.Element { +function ErrorContainer(props: ErrorContainerProps): JSX.Element { const dispatch = useDispatch(); const { tabs, currentTitle, currentTab }: MainState = useSelector( (state: RootState) => state.main, @@ -21,13 +22,21 @@ function ErrorContainer(): JSX.Element { const [loadingArray, setLoading] = useState([true, true, true]); // We create a local state "loadingArray" and set it to an array with three true elements. These will be used as hooks for error checking against a 'status' object that is declared later in a few lines. 'loadingArray' is used later in the return statement to display a spinning loader icon if it's true. If it's false, either a checkmark icon or an exclamation icon will be displayed to the user. const titleTracker = useRef(currentTitle); // useRef returns an object with a property 'initialValue' and a value of whatever was passed in. This allows us to reference a value that's not needed for rendering const timeout = useRef(null); + const { port } = props; // function that launches the main app function launch(): void { dispatch(launchContentScript(tabs[currentTab])); } - const status = { + function reinitialize(): void { + port.postMessage({ + action: 'reinitialize', + tabId: currentTab, + }); + } + + let status = { // We create a status object that we may use later if tabs[currentTab] exists contentScriptLaunched: false, reactDevToolsInstalled: false, @@ -81,6 +90,9 @@ function ErrorContainer(): JSX.Element { // The next two if statements are written in a way to allow the checking of 'content script hook', 'reactDevTools check', and 'target page is a react app' to be run in chronological order. if (loadingArray[0] === false && status.contentScriptLaunched === true) { + timeout.current = setTimeout(() => { + setLoadingArray(1, false); + }, 3000); // increased from 1500 setLoadingArray(1, false); } if (loadingArray[1] === false && status.reactDevToolsInstalled === true) { @@ -112,7 +124,12 @@ function ErrorContainer(): JSX.Element {
              - +

              state.main); + //JR: check connection status + const { connectionStatus }: MainState = useSelector((state: RootState) => state.main); + + // JR 12.22.23: so far this log always returns true + //console.log('MainContainer connectionStatus at initialization: ', connectionStatus); const [actionView, setActionView] = useState(true); // We create a local state 'actionView' and set it to true @@ -37,6 +43,10 @@ function MainContainer(): JSX.Element { const toggleElem = document.querySelector('aside'); // aside is like an added text that appears "on the side" aside some text. toggleElem.classList.toggle('no-aside'); // toggles the addition or the removal of the 'no-aside' class + //JR: added for collapse label + const collapse = document.querySelector('.collapse'); + collapse.classList.toggle('hidden'); + const recordBtn = document.getElementById('recordBtn'); if (recordBtn.style.display === 'none') { @@ -53,12 +63,16 @@ function MainContainer(): JSX.Element { }; // Function to listen for a message containing snapshots from the /extension/build/background.js service worker - const messageListener = (message: { + const messageListener = ({ + action, + payload, + sourceTab, + }: { action: string; payload: Record; sourceTab: number; }) => { - const { action, payload, sourceTab } = message; + // const { action, payload, sourceTab } = message; let maxTab: number; if (!sourceTab && action !== 'keepAlive') { @@ -78,6 +92,11 @@ function MainContainer(): JSX.Element { dispatch(noDev(payload)); break; } + // JR 12.20.23 9.53pm added a listener case for sending aReactApp to frontend + case 'aReactApp': { + dispatch(aReactApp(payload)); + break; + } case 'changeTab': { dispatch(setTab(payload)); break; @@ -100,11 +119,12 @@ function MainContainer(): JSX.Element { } }; - useEffect(() => { + // useEffect(() => { + async function awaitPortConnection() { if (port) return; // only open port once so if it exists, do not run useEffect again // Connect ot port and assign evaluated result (obj) to currentPort - const currentPort = chrome.runtime.connect(); + const currentPort = await chrome.runtime.connect({ name: 'panel' }); // If messageListener exists on currentPort, remove it while (currentPort.onMessage.hasListener(messageListener)) @@ -124,9 +144,12 @@ function MainContainer(): JSX.Element { dispatch(setPort(currentPort)); dispatch(endConnect()); - }); + } + awaitPortConnection(); + // }); // Error Page launch IF(Content script not launched OR RDT not installed OR Target not React app) + // setTimeout(() => { if ( !tabs[currentTab] || //@ts-ignore @@ -134,9 +157,12 @@ function MainContainer(): JSX.Element { //@ts-ignore !tabs[currentTab].status.targetPageisaReactApp ) { - return ; + // @ts-ignore + return ; } + // }, 5000); + const { currLocation, viewIndex, sliderIndex, snapshots, hierarchy, webMetrics } = tabs[currentTab]; // we destructure the currentTab object //@ts-ignore diff --git a/src/app/containers/StateContainer.tsx b/src/app/containers/StateContainer.tsx index 48a823257..15b2882d0 100644 --- a/src/app/containers/StateContainer.tsx +++ b/src/app/containers/StateContainer.tsx @@ -3,10 +3,11 @@ import React, { useState } from 'react'; /* that keeps the history of your “URL” in memory (does not read/write to the address bar) Useful in tests and non-browser environments like React Native. */ -import { MemoryRouter as Router, Route, NavLink, Switch } from 'react-router-dom'; +import { MemoryRouter as Router, Route, NavLink, Routes, Outlet } from 'react-router-dom'; import StateRoute from '../components/StateRoute/StateRoute'; -import DiffRoute from '../components/DiffRoute'; +import DiffRoute from '../components/DiffRoute/DiffRoute'; import { StateContainerProps } from '../FrontendTypes'; +import { Outlet } from 'react-router'; // eslint-disable-next-line react/prop-types const StateContainer = (props: StateContainerProps): JSX.Element => { @@ -20,24 +21,42 @@ const StateContainer = (props: StateContainerProps): JSX.Element => { } = props; return ( - -
              -
              -
              -
              - - State - - - Diff - -
              +
              +
              +
              +
              + + navData.isActive ? 'is-active main-router-link' : 'main-router-link' + } + to='/' + > + State + + + navData.isActive ? 'is-active main-router-link' : 'main-router-link' + } + to='/diff' + > + Diff +
              - - } /> - ( +
              + + + + {/* */} +
              + } + /> + { snapshots={snapshots} currLocation={currLocation} /> - )} - /> - -
              - + {/* */} +
              + } + /> + +
              ); }; diff --git a/src/app/containers/TravelContainer.tsx b/src/app/containers/TravelContainer.tsx index 327424eef..7fc2506a2 100644 --- a/src/app/containers/TravelContainer.tsx +++ b/src/app/containers/TravelContainer.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-len */ import React, { useState } from 'react'; -import MainSlider from '../components/MainSlider'; -import Dropdown from '../components/Dropdown'; +import MainSlider from '../components/TimeTravel/MainSlider'; +import Dropdown from '../components/TimeTravel/Dropdown'; import { playForward, pause, @@ -73,8 +73,8 @@ function TravelContainer(props: TravelContainerProps): JSX.Element { return (
              - +
              diff --git a/src/app/index.tsx b/src/app/index.tsx index 914d1c499..99145962e 100644 --- a/src/app/index.tsx +++ b/src/app/index.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/jsx-filename-extension */ import React from 'react'; import { createRoot } from 'react-dom/client'; -import App from './components/App'; +import App from './App'; import './styles/main.scss'; import { store } from './store'; //imported RTK Store import { Provider } from 'react-redux'; //imported Provider diff --git a/src/app/module.d.ts b/src/app/module.d.ts index b8cb76a96..8b5ed8d9c 100644 --- a/src/app/module.d.ts +++ b/src/app/module.d.ts @@ -7,10 +7,8 @@ declare module 'd3'; declare module 'react-spinners'; declare module 'immer'; declare module 'jsondiffpatch'; -declare module 'react-html-parser'; +declare module 'html-react-parser'; declare module 'react-json-tree'; declare module 'react-router-dom'; -declare module 'enzyme-adapter-react-16'; -declare module 'enzyme'; declare module 'react-apexcharts'; declare module 'react-hover'; diff --git a/src/app/slices/mainSlice.ts b/src/app/slices/mainSlice.ts index 5f44e793b..c31b0ea5d 100644 --- a/src/app/slices/mainSlice.ts +++ b/src/app/slices/mainSlice.ts @@ -41,7 +41,6 @@ export const mainSlice = createSlice({ const { tabs, currentTab, port } = state; port.postMessage({ action: 'emptySnap', tabId: currentTab }); //communicate with background.js (service worker) - // properties associated with timetravel + seek bar tabs[currentTab].sliderIndex = 0; tabs[currentTab].viewIndex = 0; @@ -123,10 +122,17 @@ export const mainSlice = createSlice({ state.port = action.payload; }, + // JR: REFACTOR: 12.20.23 this code has if statement to catch diff shapes of payload ('number' vs 'object'). This should not be the case, the payload should always come in as expected. + // consider creating a custom typescript type for the action that setTab receives. + + //JR: DOCS: 12.20.23 This code will update the currentTab being tracked in the Redux state. It depends, however, on the 'mode', which is a label for the "Locked" button status. + // The naming is unfortunate because the backend also has a mode variable that does a completely different thing (related to time travel navigation), which creates confusion. Consider renaming this to 'locked' or somesuch. + // Mode is an object that expects to contain a single key, paused, with a boolean value. + // If true: Reactime is 'Locked', and navigating to another tab will not update the Redux state and trigger Reactime to take any actions. + // If false: Reactime is 'Unlocked', and navigating to another tab will update the Redux state's currentTab, which will trigger Reactime to try to run on that new tab. setTab: (state, action) => { const { tabs, currentTab } = state; const { mode } = tabs[currentTab] || {}; - if (!mode?.paused) { if (typeof action.payload === 'number') { state.currentTab = action.payload; @@ -149,7 +155,18 @@ export const mainSlice = createSlice({ if (tabs[currentTab]) { const { reactDevToolsInstalled } = payload[currentTab].status; - tabs[currentTab].status.reactDevToolsInstalled = reactDevToolsInstalled; + // JR 12.20. 9.47pm this was not applying to state before + state.tabs[currentTab].status.reactDevToolsInstalled = reactDevToolsInstalled; + } + }, + + aReactApp: (state, action) => { + const { payload } = action; + const { tabs, currentTab } = state; + + if (tabs[currentTab]) { + // JR 12.20. 9.47pm this was not applying to state before + state.tabs[currentTab].status.targetPageisaReactApp = true; } }, @@ -175,6 +192,7 @@ export const mainSlice = createSlice({ changeView: (state, action) => { const { tabs, currentTab } = state; const { viewIndex } = tabs[currentTab] || {}; + // unselect view if same index was selected tabs[currentTab].viewIndex = viewIndex === action.payload ? -1 : action.payload; }, @@ -482,6 +500,7 @@ export const { setTab, deleteTab, noDev, + aReactApp, setCurrentLocation, changeView, changeSlider, diff --git a/src/app/styles/abstracts/_variables.scss b/src/app/styles/abstracts/_variables.scss deleted file mode 100644 index bf99d8033..000000000 --- a/src/app/styles/abstracts/_variables.scss +++ /dev/null @@ -1,62 +0,0 @@ -/// fontFamily: 'monaco, Consolas, Lucida Console, monospace' -@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@100;200;300;400;500;600;700;800;900&display=swap'); -/// @type List -$text-font-stack: 'Outfit', sans-serif !default; - -/// @type Color -/// fiery-rose changed from ff6569 to F00008 globally to improve contrast -$fiery-rose: #f00008; -$blue-brand: #62d6fb; - -/// @type Color -$blue-color-gradient: linear-gradient(145deg, #69e5ff, #58c1e2); -$red-color-gradient: linear-gradient(145deg, #f92f35, #f00008); -$grey-color-gradient: linear-gradient(145deg, #5c6068, #4d5157); - -/// @type Color: -$box-shadow-blue: inset 5px 5px 10px #53b6d5, inset -5px -5px 10px #71f6ff; -$box-shadow-red: inset 5px 5px 10px #ff0004, inset -5px -5px 10px #f9393f; - -/// @type Color -$text-color: #e7e7e7; - -/// @type Color -$brand-color: #242529 !default; - -/// @type Color -$background-color: #333333 !default; -$medium-background-color: #51565e !default; -$light-background-color: #585d65 !default; - -/// Light grey -/// @type Color -$light-grey-one: #474c55 !default; - -/// @type Color -$light-grey-two: #5f6369 !default; - -$light-grey-three: #65686e !default; - -$light-grey-four: #4c4c4d !default; - -/// @type Color -$navbar-color: #44484e !default; - -/// @type Color -$head-color: #242529 !default; - -/// @type Color -$border-color: #292929 !default; - -/// @type Color -$border-slider: #57c5f7 !default; - -/// @type Color -$border-rc: #373737 !default; -$background-rc-color: #e9e9e9 !default; - -/// @type Color -$highlight-color: rgba(224, 224, 224, 0.5) !default; - -/// @type Font Size -$button-text-size: 16px; diff --git a/src/app/styles/abstracts/_variablesLM.scss b/src/app/styles/abstracts/_variablesLM.scss new file mode 100644 index 000000000..f62c0e110 --- /dev/null +++ b/src/app/styles/abstracts/_variablesLM.scss @@ -0,0 +1,175 @@ +/// fontFamily: 'monaco, Consolas, Lucida Console, monospace' +@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@100;200;300;400;500;600;700;800;900&display=swap'); + +/// @type List +$text-font-stack: 'Outfit', sans-serif !default; + +/// @type Color +/// LIGHT MODE (LM) THEME COLORS +$primary-color: #284b63; +$primary-color-weak: #81929e; +$primary-color-strong: #3c6e71; +$secondary-color: #df6f37; + +//gradient used for some buttons +$primary-strong-gradient: linear-gradient( + 145deg, + lighten($primary-color-strong, 20%), + $primary-color-strong +); + +/// GRAYSCALE THEME COLORS +$background-color: #f0f0f0; +$background-color-strong: #ffffff; +$background-color-weak: #d9d9d9; +$contrasting-color: #161617; +$contrasting-color-weak: #353536; + +///////////////////////////////////////////////////////////////////// +// ALL OF THE FOLLOWING COLORS SHOULD REFERENCE A COLOR FROM ABOVE // +///////////////////////////////////////////////////////////////////// + +/// @type Color + +//general text color theme +$dark-text: $contrasting-color; +$light-text: $background-color; +//general icon color theme +$icon-primary: $primary-color-strong; +$icon-secondary: lighten($primary-color-strong, 50%); +$icon-bg: $primary-color-weak; + +//the first window that pops up that checks for react devtools being installed +$loader-background: $background-color; +$loader-text: $dark-text; +$loader-checks-border: $primary-color-strong; +$launch-button: $primary-color-strong; +$launch-button-hover: $primary-color; +$launch-button-text: $light-text; + +//Collapse and Toggle Record labels in the top left of the screen +$collapse-text: $dark-text; +$toggle-record-text: $dark-text; + +//ACTION TAB COLORS (the main column on the left side) + +//drop-down menu for selecting which tab Reactime is observing +$tab-select-background: $background-color-weak; +$tab-select-text: $dark-text; +$tab-dropdown-background: $background-color-weak; +$tab-dropdown-hover: darken($background-color-weak, 10%); +$tab-vertical-line: lighten($contrasting-color, 30%); +$tab-arrow-indicator: lighten($contrasting-color, 30%); + +//SNAPSHOTS AND ROUTES LIST +$action-tab-background: $background-color; +$action-cont-border: $contrasting-color; +//$action-clear-button: $primary-color; //currently being handled by mui theme.ts file +//$action-clear-button-text: $background-color; //currently being handled by mui theme.ts file +$route-bar: $primary-color-strong; +$route-bar-text: $light-text; +$indiv-action-input-bg: $background-color-strong; +$indiv-action-selected: darken($background-color, 15%); +$indiv-action-selected-text: $light-text; +$indiv-action-filler-text: lighten($contrasting-color,60%); +$indiv-action-custom-text: $dark-text; +$indiv-action-border: $contrasting-color-weak; +$indiv-action-time: $primary-color-weak; +$indiv-action-time-text: $light-text; +$time-button-height: 20px; +$current: $contrasting-color-weak; +$current-text: $light-text; +$jump: $contrasting-color-weak; +$jump-hover: $primary-color; +$jump-text: $light-text; + +//the State + Diff toggle // THIS FEATURE IS CURRENTLY COMMENTED OUT +$header-background: $background-color; +$header-button-active: $primary-color; +$header-button-active-text: $light-text; +$header-button-inactive: $primary-color-weak; +$header-button-inactive-text: $dark-text; +$header-button-hover: lighten($header-button-inactive, 20%); + +//the buttons/tabs controlling what is displayed in STATECONTAINER (Map, Performance, History, Web Metrics, Tree) +$navbar-background: $background-color; //this color only shows up in Diff mode when buttons don't fill the whole bar //DIFF FEATURE IS CURRENTLY COMMENTED OUT +$navbar-selected: $primary-color-strong; +$navbar-selected-text: $light-text; +$navbar-unselected: $primary-color-weak; +$navbar-unselected-text: $dark-text; +$navbar-hover: darken($navbar-unselected,15%); + +$state-background: $background-color-strong; +$state-cont-border: $contrasting-color; + +//MAP TAB +$map-options-label: $dark-text; +//the dropdown colors are determined in the dropDownStyle object in LinkControls.tsx +$map-link: $contrasting-color; +// $map-root-fill: $primary-color; //root fill is currently a visx LinearGradient defined in ComponentMap.tsx +$map-root-stroke: $primary-color; +$map-root-text: $light-text; +//$map-parent-fill: $primary-color-strong; //parent fill is currently a visx LinearGradient defined in ComponentMap.tsx +$map-parent-stroke: darken($primary-color-strong, 20%); +$map-parent-text: $light-text; +$map-child-fill: $primary-color-weak; +$map-child-stroke: lighten($primary-color, 50%); +$map-child-text: $dark-text; + +//PERFORMANCE TAB +$performance-subtab-border: 1px; +$performance-subtab-text: $contrasting-color; +$performance-subtab-hover: $background-color-weak; +$performance-options-dropdown: $primary-color-strong; +$performance-options-label: $dark-text; +$performance-save-series-button: $primary-color; +$performance-save-series-button-text: $light-text; +$perf-background: $background-color-strong; +//axis tick colors and labels determined in BarGraph.tsx on line 29 and BarGraphComparison.tsx on line 39 +//on comparison view, button colors are in BarGraphComparison.tsx on line 220, 240 + +//HISTORY TAB +$history-node: $primary-color; //this is currently set in History.tsx line 291 +$history-link: $contrasting-color; // this is currently set in d3graph.css line 26 +//$history-text: $light-text; + +//WEB METRICS TAB +//web metrics colors are selected in WebMetrics.tsx (text color line 69) +$web-circles: $contrasting-color; +$web-text: $dark-text; + +$tree-background: $background-color; + +//CONTORL BAR for time travel +$travel-background: $background-color; +$travel-top-border: lighten($contrasting-color, 50%); +$play-button: $primary-strong-gradient; +$play-button-text: $light-text; +$slider-handle: $primary-strong-gradient; +$slider-rail-left: $primary-color; +$slider-rail-right: $background-color-weak; +$scrub-button: $primary-strong-gradient; +$scrub-icon: $light-text; +$speed-dropdown: $primary-color-strong; +$speed-dropdown-text: $light-text; +$speed-dropdown-expanded: lighten($primary-color-strong, 20%); +$speed-dropdown-expanded-hover: $primary-color; +$speed-dropdown-expanded-text: $light-text; + +//the buttons at the very bottom of the screen (locked, download, upload, tutorial, reconnect) +$function-bar-background: $background-color; +//outline color currently handled in mui theme.ts file +$function-bar-button-outlines: $primary-color; +$function-bar-text: $primary-color-strong; +$function-bar-text-hover: $primary-color; +$function-bar-text-highlight: $primary-color-strong; +$function-bar-icons: $primary-color-strong; + +//colors for pop-up window that opens when clicking the reconnect button +$pop-up-window-background: $background-color; +$pop-up-window-text: $dark-text; +$reconnect-button: $primary-color-strong; +$reconnect-button-text: $light-text; + +/// @type Font Size +$button-text-size: 16px; diff --git a/src/app/styles/base/_base.scss b/src/app/styles/base/_base.scss index 5c451bbbb..3dc53f1cc 100644 --- a/src/app/styles/base/_base.scss +++ b/src/app/styles/base/_base.scss @@ -20,24 +20,46 @@ body { grid-area: actions; transition: 0.5s; } + +.perf-rect { + fill: $perf-background; +} + .state-container-container { grid-area: states; } .buttons-container { + //color: #ff0000; grid-area: buttons; - border-color: rgba(41, 41, 41, 1); + //border-color: #ff0000; +} + +.action-container { + border-style: solid; + border-color: $action-cont-border; + border-width: 0px; +} + +.state-container { + border-style: solid; + border-color: $state-cont-border; + border-width: 0px; } -.action-container, -.state-container, .travel-container { border-style: solid; - border-color: $border-color; - border-width: 1px; + border-color: $travel-top-border; + border-left: 0px; + border-right: 0px; + border-bottom: 0px; } .saveSeriesContainer { padding-bottom: 15px; padding-top: 10px; } + +.performance-dropdown { + background-color: #f5b9b9; +} diff --git a/src/app/styles/base/_typography.scss b/src/app/styles/base/_typography.scss index 2166a453e..c550ea0d2 100644 --- a/src/app/styles/base/_typography.scss +++ b/src/app/styles/base/_typography.scss @@ -1,4 +1,4 @@ body { - color: $text-color; + color: $contrasting-color; font: normal 16px $text-font-stack; } diff --git a/src/app/styles/components/_actionComponent.scss b/src/app/styles/components/_actionComponent.scss index ff41f789c..b28f8fcfc 100644 --- a/src/app/styles/components/_actionComponent.scss +++ b/src/app/styles/components/_actionComponent.scss @@ -1,30 +1,38 @@ .action-component { - padding: 5px 10px; + padding: 3px 10px; display: grid; grid-template-columns: none; align-items: center; - height: 20px; + height: 24px; // background-color: $brand-color; - border-bottom-style: solid; - border-bottom-width: 1px; - background-color: none; - border-color: #292929; + // border-bottom-style: solid; + // border-bottom-width: 1px; + // background-color: none; + // border-color: #292929; // border-color: $border-color; cursor: pointer; overflow: hidden; @extend %disable-highlight; } +.clear-button { + background-color:#187924; + color:#187924; +} + .action-component-text { margin-bottom: 8px; + color: $indiv-action-custom-text } .action-component.selected { - font-size: 16px; - background-color: $light-grey-one; + //font-size: 16px; + background-color: $indiv-action-selected; + color: $indiv-action-selected-text } .action-component.exclude { + color: #ff0000; display: flex; justify-content: center; margin-top: 10px; @@ -38,7 +46,7 @@ display: grid; grid-template-columns: 4fr 1fr; align-items: center; - height: 20px; + //height: 20px; cursor: pointer; overflow: hidden; @extend %disable-highlight; diff --git a/src/app/styles/components/_buttons.scss b/src/app/styles/components/_buttons.scss index daa29b865..5eb55191e 100644 --- a/src/app/styles/components/_buttons.scss +++ b/src/app/styles/components/_buttons.scss @@ -1,10 +1,9 @@ @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@100;200;300;400;500;600;700;800;900&display=swap'); - .save-series-button { padding: 3px; outline: transparent; - color: white; + color: $performance-save-series-button-text; font-size: 16px; display: flex; justify-content: center; @@ -16,7 +15,7 @@ line-height: 1.5em; font: 400 16px 'Outfit', sans-serif; width: 120px; - background: $red-color-gradient; + background: $performance-save-series-button; height: 30px; position: absolute; right: 3rem; @@ -62,12 +61,18 @@ line-height: 1.5em; font: 500 16px 'Roboto', sans-serif; width: 120px; - background: #62d6fb; + //background: #ff0000; +} + +.clear-button { + background: #3256f1; + background-color: #050787; + color: #3256f1; } .empty-button:hover { color: black; - box-shadow: $box-shadow-red; + box-shadow: #ff0001; } .state-dropdown { @@ -87,13 +92,12 @@ .time-button { outline: none; - height: 20px; + height: $time-button-height; margin-bottom: 8px; width: 100px; border: none; - background: linear-gradient(145deg, #5c6068, #4d5157); - font: normal 16px 'Outfit', sans-serif; - color: #ffffff; + background: $indiv-action-time; + color: $indiv-action-time-text; display: flex; justify-content: center; align-items: center; @@ -102,13 +106,12 @@ .jump-button { outline: none; - height: 20px; + height: $time-button-height; margin-bottom: 8px; width: 100px; border: transparent; border-radius: 3px; background-color: #232529; - font: normal 16px 'Outfit', sans-serif; color: #ffffff; transform: rotateX(90deg); transition: opacity 300ms, transform 0.15s linear; @@ -122,33 +125,32 @@ .jump-button:hover { // remove the blue border when button is clicked - color: white; - background-color: $fiery-rose; + color: $jump-text; + background-color: $jump-hover; cursor: pointer; } .current-location { outline: none; - height: 20px; + height: $time-button-height; margin-bottom: 8px; width: 100px; border: transparent; border-radius: 3px; - font: normal 16px 'Outfit', sans-serif; } .empty-button:hover { color: white; - background-color: $highlight-color; + background-color: #ff0001; } .play-button { width: 100px; height: 25px; margin: 0 1% 0 2%; - color: $brand-color; + color: $play-button-text; border-color: transparent; - background: $blue-color-gradient; + background: $play-button; border-radius: 5px; font-weight: 500; font-size: 16px; @@ -156,45 +158,47 @@ } .play-button:hover { - background: $blue-color-gradient; transform: translate3d(0, -3px, 0); cursor: pointer; } -.backward-button { - color: $brand-color; +.backward-button, +.forward-button { + color: $scrub-icon; border-color: transparent; - background: $blue-color-gradient; + background: $scrub-button; border-radius: 5px; } -.forward-button { - color: $brand-color; - border-color: transparent; - background: $blue-color-gradient; - border-radius: 5px; +.backward-button-icon, +.forward-button-icon { + color: $scrub-icon; } .forward-button:hover, .backward-button:hover { - background: $blue-color-gradient; transform: translate3d(0, -3px, 0); cursor: pointer; } +// .pause-button { +// color: #ff0000; +// background-color: #ff0000; +// } + .import-button:hover, .howToUse-button:hover, .export-button:hover, .pause-button:hover, .reconnect-button:hover { - @extend %button-shared; - color: #62d6fb; + //@extend %button-shared; + color: $function-bar-text-hover; box-shadow: 1px 1px 2px 1px rgba(30, 86, 171, 0.25); transform: translate3d(0, -3px, 0); } .svg-inline--fa { - color: $blue-brand; + //color: $blue-brand; margin-right: 0.75em; display: inline-block; font-size: inherit; @@ -214,7 +218,7 @@ font: 300 16px 'Outfit', sans-serif; font-size: $button-text-size; - background: $brand-color; + background: #ff0001; border-radius: 5px; position: relative; border: 1px solid #b8c4c240; @@ -271,6 +275,7 @@ } .dropdown-and-delete-series-container { + display: flex; align-items: center; justify-content: space-around; @@ -302,20 +307,38 @@ /* sidebar button open and closing functionality */ aside { - background: #242529; + //background: #242529; color: #fff; transition: width 1s; + width: 100%; //JR } .no-aside { - width: 30px; - margin-right: 15px; + width: 45px; + // margin-right: 15px; +} + +//JR added for collapse label +.collapse { + color: $collapse-text; + display: flex; + align-items: center; + justify-content: flex-start; +} + +.hidden { + display: none; +} + +.toggle:hover { + cursor: pointer; } .toggle { - display: block; - position: relative; - margin-top: 1rem; + // display: block; + // position: relative; + // margin-top: 1rem; + height: 100%; //JR } /* toggle i handles arrow animation */ @@ -327,18 +350,18 @@ aside { height: 4px; border-radius: 4px; transition: transform 0.15s; - background-color: $blue-brand; + background-color: $icon-primary; } .toggle i { - top: 8px; - left: 9px; + top: 16px; + left: 10px; display: block; - background: $blue-brand; + background: $icon-primary; } .toggle i::before { - top: -5px; + top: -6px; } .toggle i::after { @@ -349,6 +372,7 @@ aside { .toggle i::before { content: ''; display: block; + // top: -5px; } .toggle i::before { @@ -365,15 +389,22 @@ aside { } #arrow { - margin-bottom: 40px; + // margin-bottom: 40px; + // display: flex; + // justify-content: flex-start; + + //JR + height: 100%; + display: grid; + grid-template-columns: 45px 1fr; } /* ^ sidebar button open and closing functionality */ .reconnect-button-pop-up { padding: 3px; outline: transparent; - background: $red-color-gradient; - color: $text-color !important; + background-color: #050787; + color: $reconnect-button-text !important; border: none; border-radius: 3px; cursor: pointer; @@ -382,7 +413,7 @@ aside { width: 120px; &:hover { color: black !important; - background-color: $highlight-color; + background-color: #ff0001; } } @@ -397,15 +428,15 @@ aside { font: 500 $button-text-size $text-font-stack; width: 120px; &:hover { - color: $text-color; - background-color: $highlight-color; + color: $contrasting-color; + background-color: #ff0001; } } .close-icon-pop-up { cursor: pointer; - color: $text-color; - font-size: 20px; + color: #ff0001; + font-size: 20px; padding-right: 8px; color: black; } @@ -418,11 +449,11 @@ aside { border-radius: 3px; line-height: 1.5em; outline: transparent; - background: $blue-color-gradient; - box-shadow: $box-shadow-blue; + //background: $blue-color-gradient; + //box-shadow: $box-shadow-blue; &:hover { - color: $text-color; - background-color: $highlight-color; + color: $contrasting-color; + background-color: #ff0001; } } @@ -430,4 +461,4 @@ aside { color: #d72828; margin-left: 5px; margin-right: -22px; -} \ No newline at end of file +} diff --git a/src/app/styles/components/_componentMap.scss b/src/app/styles/components/_componentMap.scss new file mode 100644 index 000000000..921d96c06 --- /dev/null +++ b/src/app/styles/components/_componentMap.scss @@ -0,0 +1,41 @@ +.compMapLink { + stroke: $map-link; +} + +.comp-map-options { + color: $map-options-label; +} + +//this was supposed to control the dropDownStyle object in LinkControls.tsx (the dropdown menus in ComponentMap) +// .comp-map-dropdown { +// backgroundColor: #ff0008; +// color: #ff0007; +// background: #ff0006; +// } + +// .compMapParent { +// //fill: $map-parent-fill; +// //stroke: $map-parent-stroke; +// } + +.compMapParentText { + fill: $map-parent-text +} + +.compMapChild { + fill: $map-child-fill; + stroke: $map-child-stroke; +} + +.compMapChildText { + fill: $map-child-text; +} + +.compMapRoot { + //fill: $map-root-fill; + stroke: $map-root-stroke; +} + +.compMapRootText { + fill: $map-root-text; +} \ No newline at end of file diff --git a/src/app/styles/components/_jsonTree.scss b/src/app/styles/components/_jsonTree.scss index 9150fe089..95bdf5e4c 100644 --- a/src/app/styles/components/_jsonTree.scss +++ b/src/app/styles/components/_jsonTree.scss @@ -4,6 +4,6 @@ margin: 10px; padding: 0; width: 900px; - background-color: $brand-color; + background-color: $tree-background; list-style: none; } diff --git a/src/app/styles/components/_performanceVisx.scss b/src/app/styles/components/_performanceVisx.scss index 3c088d10c..e631e27d1 100644 --- a/src/app/styles/components/_performanceVisx.scss +++ b/src/app/styles/components/_performanceVisx.scss @@ -6,15 +6,15 @@ } .MuiSwitch-colorPrimary.Mui-checked { - color: #62d6fb !important; + color: $icon-primary !important; } .MuiSwitch-switchBase { - color: #f00008 !important; + color: $icon-secondary !important; } .MuiSwitch-track { - background-color: #e7e7e7 !important; + background-color: $icon-bg !important; } .MuiTypography-body1 { @@ -29,7 +29,7 @@ } #routes-dropdown { - color: white !important; + color: $performance-options-label !important; font: 400 16px 'Outfit', sans-serif; text-align: left; } @@ -37,7 +37,7 @@ .saveSeriesContainer { #routes-select, #snapshot-select { - background-color: #f00008 !important; + background-color: $performance-options-dropdown !important; } } diff --git a/src/app/styles/components/_rc-slider.scss b/src/app/styles/components/_rc-slider.scss index b14bbbcad..e50d273a2 100644 --- a/src/app/styles/components/_rc-slider.scss +++ b/src/app/styles/components/_rc-slider.scss @@ -16,7 +16,7 @@ .rc-slider-rail { position: absolute; width: 100%; - background-color: #ebf2fa; + background-color: $slider-rail-right; height: 4px; border-radius: 6px; } @@ -25,7 +25,7 @@ left: 0; height: 4px; border-radius: 6px; - background-color: $fiery-rose; + background-color: $slider-rail-left; } .rc-slider-handle { position: absolute; @@ -37,23 +37,23 @@ cursor: -webkit-grab; cursor: grab; border-radius: 50%; - background: $red-color-gradient; + background: $slider-handle; -ms-touch-action: pan-x; touch-action: pan-x; } .rc-slider-handle:focus { - border-color: $border-slider; + border-color: #ff0001; outline: none; } .rc-slider-handle-click-focused:focus { - border-color: #96dbfa; + border-color: #ff0001; } .rc-slider-handle:hover { - border-color: $border-slider; + border-color: #ff0001; } .rc-slider-handle:active { - background: #f00004; - border-color: $border-slider; + //background: #f00004; + border-color: #ff0001; cursor: -webkit-grabbing; cursor: grabbing; } @@ -87,7 +87,7 @@ margin-left: -4px; width: 8px; height: 8px; - border: 2px solid $background-rc-color; + border: 2px solid #ff0001; background-color: #fff; cursor: pointer; border-radius: 50%; @@ -97,7 +97,7 @@ border-color: #96dbfa; } .rc-slider-disabled { - background-color: $background-rc-color; + background-color: #ff0001; } .rc-slider-disabled .rc-slider-track { background-color: #ccc; diff --git a/src/app/styles/components/_renderingFrequency.scss b/src/app/styles/components/_renderingFrequency.scss index c8b182afb..3786192d2 100644 --- a/src/app/styles/components/_renderingFrequency.scss +++ b/src/app/styles/components/_renderingFrequency.scss @@ -1,116 +1,115 @@ .borderStyling { - border-radius: 5px; - border: 1px solid rgba(184, 196, 194, 0.25); - box-shadow: 2px 3px 4px 2px rgba(0, 0, 0, 0.2); - width: 53vw; + border-radius: 5px; + border: 1px solid rgba(184, 196, 194, 0.25); + box-shadow: 2px 3px 4px 2px rgba(0, 0, 0, 0.2); + width: 53vw; } .borderCheck { - border: 1px solid rgba(184, 196, 194, 0.25); - box-shadow: 2px 3px 4px 2px rgba(0, 0, 0, 0.2); - padding: 5px; - width: 10vw; - height: 25vw; - overflow-y: scroll; - overflow-wrap: break-word; - overscroll-behavior: contain; + border: 1px solid rgba(184, 196, 194, 0.25); + box-shadow: 2px 3px 4px 2px rgba(0, 0, 0, 0.2); + padding: 5px; + width: 10vw; + height: 25vw; + overflow-y: scroll; + overflow-wrap: break-word; + overscroll-behavior: contain; } .DataComponent { - padding-left: 30px; - display: flex; - flex-direction: row; - flex-wrap: wrap; - width: 50vw; - height: 40vw; - overflow-y: scroll; - overflow-wrap: break-word; - overscroll-behavior: contain; + padding-left: 30px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 50vw; + height: 40vw; + overflow-y: scroll; + overflow-wrap: break-word; + overscroll-behavior: contain; } - .StyledGridElement { - display: flex; - align-items: center; - justify-content: space-between; - background: #242529; - padding: 20px; - height: 5vh; - margin: 20px 10px; - font-family: 'Roboto', sans-serif; + display: flex; + align-items: center; + justify-content: space-between; + background: $background-color-strong; + padding: 20px; + height: 5vh; + margin: 20px 10px; + font-family: 'Roboto', sans-serif; - h3 { - color: #FFFFFF; - margin-bottom: 5px; - margin-top: 5px; - text-transform: uppercase; - font-size: 16px; - font-weight: 500; - } + h3 { + color: $primary-color; + margin-bottom: 5px; + margin-top: 5px; + text-transform: uppercase; + font-size: 16px; + font-weight: 500; + } - h4 { - color: $text-color; - margin-bottom: 5px; - margin-top: 5px; - font-weight: 300; - } + h4 { + color: $primary-color-strong; + margin-bottom: 5px; + margin-top: 5px; + font-weight: 300; + } - p { - color: $brand-color; - line-height: 20px; - text-align: center; - font-size: 18px; - line-height: 18px; - } + p { + color: $primary-color-strong; + line-height: 20px; + text-align: center; + font-size: 18px; + line-height: 18px; + } } .ExpandStyledGridElement { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - background: #242529; - padding: 20px; - margin: 20px 10px; - font-family: 'Roboto', sans-serif; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + background: $background-color-strong; + padding: 20px; + margin: 20px 10px; + font-family: 'Roboto', sans-serif; - h3 { - color: $text-color; - margin-bottom: 5px; - margin-top: 5px; - text-transform: uppercase; - font-size: 16px; - font-weight: 500; - } + h3 { + color: $primary-color; + margin-bottom: 5px; + margin-top: 5px; + text-transform: uppercase; + font-size: 16px; + font-weight: 500; + } - h4 { - color: $text-color; - margin-bottom: 5px; - margin-top: 5px; - font-weight: 300; - } + h4 { + color: $primary-color-strong; + margin-bottom: 5px; + margin-top: 5px; + font-weight: 300; + } - p { - color: white; - line-height: 20px; - text-align: center; - font-size: 18px; - line-height: 18px; - } + p { + color: $primary-color-strong; + line-height: 20px; + text-align: center; + font-size: 18px; + line-height: 18px; + } } .RenderRight { - cursor: pointer; - padding-right: 5px; - border-right: 5px; - background: $blue-color-gradient; - width: 50px; - padding: 0 0.5em; - right: 10%; - opacity: 70%; - transition: 0.3s; + cursor: pointer; + padding-right: 5px; + border-right: 5px; + //background: $blue-color-gradient; + width: 50px; + padding: 0 0.5em; + right: 10%; + opacity: 70%; + transition: 0.3s; } .RenderRight:hover { - opacity: 100%; -} \ No newline at end of file + opacity: 100%; +} diff --git a/src/app/styles/components/_sliderHandle.scss b/src/app/styles/components/_sliderHandle.scss index 3c1eeb725..5806235cd 100644 --- a/src/app/styles/components/_sliderHandle.scss +++ b/src/app/styles/components/_sliderHandle.scss @@ -86,7 +86,7 @@ color: #fff; text-align: left; text-decoration: none; - background-color: $border-slider; + background-color: #ff0001; border-radius: 6px; box-shadow: 0 0 4px rgba(0, 0, 0, 0.17); min-height: 34px; @@ -104,7 +104,7 @@ bottom: 4px; margin-left: -5px; border-width: 5px 5px 0; - border-top-color: $border-slider; + border-top-color: #ff0001; } .rc-tooltip-placement-top .rc-tooltip-arrow { left: 50%; @@ -121,7 +121,7 @@ left: 4px; margin-top: -5px; border-width: 5px 5px 5px 0; - border-right-color: $border-slider; + border-right-color: #ff0001; } .rc-tooltip-placement-right .rc-tooltip-arrow { top: 50%; @@ -139,7 +139,7 @@ right: 4px; margin-top: -5px; border-width: 5px 0 5px 5px; - border-left-color: $border-slider; + border-left-color: #ff0001; } .rc-tooltip-placement-left .rc-tooltip-arrow { top: 50%; @@ -157,7 +157,7 @@ top: 4px; margin-left: -5px; border-width: 0 5px 5px; - border-bottom-color: $border-slider; + border-bottom-color: #ff0001; } .rc-tooltip-placement-bottom .rc-tooltip-arrow { left: 50%; diff --git a/src/app/styles/components/d3graph.css b/src/app/styles/components/d3graph.css index 4d3eeddea..d98105b1d 100644 --- a/src/app/styles/components/d3graph.css +++ b/src/app/styles/components/d3graph.css @@ -23,7 +23,7 @@ body { } .link { fill: none; - stroke: #fae6e4; + stroke: #161617; stroke-opacity: 0.4; stroke-width: 3px; } diff --git a/src/app/styles/components/diff.css b/src/app/styles/components/diff.css index 49d3fc010..caf3d4087 100644 --- a/src/app/styles/components/diff.css +++ b/src/app/styles/components/diff.css @@ -27,18 +27,18 @@ ul.jsondiffpatch-delta { .jsondiffpatch-added .jsondiffpatch-value pre, .jsondiffpatch-modified .jsondiffpatch-right-value pre, .jsondiffpatch-textdiff-added { - background: #5A6C46; + background: #5a6c46; } .jsondiffpatch-deleted .jsondiffpatch-property-name, .jsondiffpatch-deleted pre, .jsondiffpatch-modified .jsondiffpatch-left-value pre, .jsondiffpatch-textdiff-deleted { - background: #7E5C69; + background: #fccdda; text-decoration: line-through; } .jsondiffpatch-unchanged, .jsondiffpatch-movedestination { - color: white; + color: #81929e; } .jsondiffpatch-unchanged, .jsondiffpatch-movedestination > .jsondiffpatch-value { diff --git a/src/app/styles/layout/_actionContainer.scss b/src/app/styles/layout/_actionContainer.scss index 76e9e36ce..f6290a12a 100644 --- a/src/app/styles/layout/_actionContainer.scss +++ b/src/app/styles/layout/_actionContainer.scss @@ -1,21 +1,27 @@ .action-container { // overflow: auto; - // background-color: $brand-color; overflow-x: hidden; - background-color: #282828; + background-color: $action-tab-background; } .actionname { - background-color: inherit; - color: #ffffff; + background-color: $indiv-action-input-bg; + border: 1px solid $indiv-action-border; + color: $indiv-action-custom-text; +} + +::placeholder { + color: $indiv-action-filler-text; } #recordBtn { + color: #ffb3b3; height: 100%; display: flex; } .actionToolContainer { + color: #873b3b; display: flex; justify-content: space-between; align-items: center; @@ -27,8 +33,13 @@ } .route { - background-color: #da262c; + background-color: $route-bar; + color: $route-bar-text; padding-left: 10px; padding-top: 5px; padding-bottom: 5px; } + +.toggle-record { + color: $toggle-record-text; +} \ No newline at end of file diff --git a/src/app/styles/layout/_bodyContainer.scss b/src/app/styles/layout/_bodyContainer.scss index abf8e9251..c0f95df21 100644 --- a/src/app/styles/layout/_bodyContainer.scss +++ b/src/app/styles/layout/_bodyContainer.scss @@ -3,14 +3,13 @@ overflow: hidden; display: grid; grid-template-columns: min-content 1fr; - grid-template-rows: 90% 5% 5%; + grid-template-rows: 1fr minmax(min-content, 5%) minmax(min-content, 5%); grid-template-areas: 'actions states' 'travel travel' 'buttons buttons'; } - /* if extension width is less than 500px, stack the body containers */ @media (max-width: 500px) { .body-container { diff --git a/src/app/styles/layout/_buttonsContainer.scss b/src/app/styles/layout/_buttonsContainer.scss index 50ecbd5ca..c0ed67b3a 100644 --- a/src/app/styles/layout/_buttonsContainer.scss +++ b/src/app/styles/layout/_buttonsContainer.scss @@ -3,6 +3,7 @@ font-family: 'Outfit', sans-serif; } .buttons-container { + //color: #ff0000; margin: 0 1% 0 1%; display: grid; grid-template-columns: repeat(5, 1fr); @@ -39,6 +40,7 @@ @media (max-width: 500px) { .buttons-container { + //color: #ff0000; grid-template-columns: repeat(2, 1fr); } } @@ -71,21 +73,21 @@ } .dialog-pop-up { - border: 1px solid $border-color; + border: 1px solid #ff0001; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); padding: 13px; } .dialog-pop-up-header { - color: $text-color; + color: #ff0001; padding: 8px 16px; font-size: 20px; font-family: $text-font-stack; } .dialog-pop-up-contents { - background-color: $brand-color; - color: $text-color; + background-color: $pop-up-window-background; + color: $pop-up-window-text; font-family: $text-font-stack; line-height: 1.4; padding: 0px 15px 15px 15px !important; @@ -93,21 +95,21 @@ .dialog-pop-up-actions { padding: 15px; - background-color: $head-color; + background-color: #ff0001; } .close-icon-pop-up-div { height: 40px; width: 100%; - background-color: $light-background-color; + background-color: #ff0001; display: flex; justify-content: flex-end; align-items: center; } .warning-header-container { - background-color: $brand-color; + background-color: $pop-up-window-background; display: flex; align-items: center; height: 20%; diff --git a/src/app/styles/layout/_errorContainer.scss b/src/app/styles/layout/_errorContainer.scss index ede3e51ea..4f2057094 100644 --- a/src/app/styles/layout/_errorContainer.scss +++ b/src/app/styles/layout/_errorContainer.scss @@ -5,7 +5,8 @@ .error-container { height: 100%; margin: 0 auto; - background-color: $brand-color; + background-color: $loader-background; + color: $loader-text; overflow: hidden; font: 'Outfit', sans-serif; @@ -13,7 +14,7 @@ flex-direction: column; align-items: center; a { - color: white; + color: rgb(91, 54, 54); margin-top: 1%; height: 3%; } @@ -31,7 +32,7 @@ padding: 1%; border: 1px solid; border-style: solid; - border-color: white; + border-color: loader-checks-border; display: grid; grid-template-columns: 4fr 1fr; grid-template-rows: repeat(3, 1fr); @@ -64,8 +65,8 @@ } .launchContentButton { - background: $blue-brand; - color: $brand-color; + background: $launch-button; + color: $launch-button-text; margin: 3px; padding: 5px 10px; border-radius: 5px; @@ -73,7 +74,7 @@ } .launchContentButton:hover { - background: $light-background-color; + background: $launch-button-hover; } .launchContentButton:active { diff --git a/src/app/styles/layout/_headContainer.scss b/src/app/styles/layout/_headContainer.scss index 09bd9ad70..a8317d0d7 100644 --- a/src/app/styles/layout/_headContainer.scss +++ b/src/app/styles/layout/_headContainer.scss @@ -1,124 +1,118 @@ @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@100;200;300;400;500;600;700;800;900&display=swap'); * { - font-family: 'Outfit', sans-serif; + font-family: 'Outfit', sans-serif; } .head-container { - height: 5%; - background: linear-gradient( - 90deg, - rgba(41, 41, 41, 1) 0%, - rgba(51, 51, 51, 1) 50%, - rgba(41, 41, 41, 1) 100% - ); + height: 5%; + background: linear-gradient( + 90deg, + rgba(41, 41, 41, 1) 0%, + rgba(51, 51, 51, 1) 50%, + rgba(41, 41, 41, 1) 100% + ); } .head-container { - display: flex; - flex-direction: row-reverse; - align-items: center; - justify-content: center; + display: flex; + flex-direction: row-reverse; + align-items: center; + justify-content: center; } div .tab-select-container { - background-color: $background-color; - font-size: 14px; - height: 40px; - width: 100%; - margin-bottom: 0; + //background-color: #ff0002; + font-size: 14px; + height: 40px; + width: 100%; + margin-bottom: 0; } .tab-select-container:focus { - background-color: $background-color; + background-color: #ff0006; - outline: none; + outline: none; } .tab-select-container:active { - background-color: $background-color; - - outline: none; - border-color: transparent; -} - -svg { - color: #58c1e2; + outline: none; + border-color: transparent; } .tab-select-container { - background-color: $background-color; - height: 70%; + //background-color: #ff0004; + height: 70%; - .tab-select__control:focus { - outline: none; - } - div.tab-select-container.css-2b097c-container { - background-color: $background-color; - margin: 0; - } + .tab-select__control:focus { + outline: none; + } + div.tab-select-container.css-2b097c-container { + background-color: #ff0003; + margin: 0; + } - .tab-select__control, - .tab-select__menu { - background-color: $background-color; - outline: none; - font-size: 14px; - border-style: none; - background-color: $brand-color; - z-index: 2; - margin-bottom: 0; - @extend %disable-highlight; - } - .tab-select__single-value { - color: white; - } - .tab-select__value-container { - background-color: $background-color; - margin: 0; - padding: 0px; - } - .tab-select__value-container:focus { - outline: none; - } - .tab-select__option:hover { - margin-top: 0; - background-color: $light-grey-three; - color: black; - } - .tab-select__option--is-selected, - .tab-select__option--is-focused { - background-color: transparent; - outline: transparent; - } - .tab-select__indicator { - padding: 0; - } - .tab-select__indicator-separator { - margin-top: 3px; - margin-bottom: 3px; - } + .tab-select__control, + .tab-select__menu { + outline: none; + font-size: 14px; + border-style: none; + background-color: $tab-dropdown-background; + z-index: 2; + margin-bottom: 0; + @extend %disable-highlight; + } + .tab-select__single-value { + color: $tab-select-text; + } + .tab-select__value-container { + background-color: $tab-select-background; + margin: 0; + padding: 0px; + } + .tab-select__value-container:focus { + outline: none; + } + .tab-select__option:hover { + margin-top: 0; + background-color: $tab-dropdown-hover; + color: black; + } + .tab-select__option--is-selected, + .tab-select__option--is-focused { + background-color: transparent; + outline: transparent; + } + .tab-select__indicator { + color:$tab-arrow-indicator; + padding: 0; + } + .tab-select__indicator-separator { + margin-top: 3px; + margin-bottom: 3px; + background-color: $tab-vertical-line; + } - .css-1uccc91-singleValue { - margin-left: 8px; - } - // removes the cursor from blinking - .css-w8afj7-Input { - color: transparent; - } + .css-1uccc91-singleValue { + margin-left: 8px; + } + // removes the cursor from blinking + .css-w8afj7-Input { + color: transparent; + } - // removes min-height of dropdown and change it to 100% - .css-yk16xz-control, - .css-1pahdxg-control { - min-height: initial; - height: 100%; - background-color: $background-color; - border: none; - outline: none; - margin-bottom: 0; - border-radius: 0; - } - .css-yk16xz-control:focus, - .css-1pahdxg-control:focus { - outline: none; - border-radius: 0; - } + // removes min-height of dropdown and change it to 100% + .css-yk16xz-control, + .css-1pahdxg-control { + min-height: initial; + height: 100%; + border: none; + outline: none; + margin-bottom: 0; + border-radius: 0; + } + .css-yk16xz-control:focus, + .css-1pahdxg-control:focus { + outline: none; + border-radius: 0; + } } diff --git a/src/app/styles/layout/_mainContainer.scss b/src/app/styles/layout/_mainContainer.scss index 734aaae03..8e85a3ba5 100644 --- a/src/app/styles/layout/_mainContainer.scss +++ b/src/app/styles/layout/_mainContainer.scss @@ -1,11 +1,10 @@ .main-container { height: 100%; margin: 0 auto; - background-color: $brand-color; + background-color: $function-bar-background; overflow: hidden; } -.state-container-container{ +.state-container-container { display: contents; } - diff --git a/src/app/styles/layout/_stateContainer.scss b/src/app/styles/layout/_stateContainer.scss index 4c09d0c5a..6da4512d8 100644 --- a/src/app/styles/layout/_stateContainer.scss +++ b/src/app/styles/layout/_stateContainer.scss @@ -1,14 +1,14 @@ .state-container { font-size: 10px; overflow: auto; - background-color: $brand-color; + background-color: $state-background; // margin-left: 5px; } .toggleAC { // color: #00dffc; - color: $blue-brand; - background: $background-color; + //color: $blue-brand; + background: #ff0001; height: 50%; text-decoration: none; border: none; @@ -20,7 +20,8 @@ } .state-container .navbar { - background-color: $background-color; + //background-color: $state-background; + //color: #ff0000; display: flex; flex-direction: row; justify-content: flex-start; @@ -30,7 +31,8 @@ } .state-container .main-navbar { - background-color: $background-color; + background-color: $state-background; + color: #ff0000; display: flex; flex-direction: row; justify-content: flex-start; @@ -41,6 +43,7 @@ .state-container .componentMapContainer { height: 95% !important; + fill: $state-background; } .state-container .main-navbar-container { @@ -48,8 +51,7 @@ top: 0px; left: 0px; z-index: 1; - // background-color: $background-color; - background-color: #252525; + background-color: $state-background; display: flex; flex-direction: row; @@ -59,16 +61,15 @@ } .navbar { + color: #ff0000; // prevent navbar from scrolling with state/tree display - position: sticky; - top: 0px; left: 0px; z-index: 1; @extend %disable-highlight; } .no-data-message { - color: $text-color; + color: #ff0001; font: normal 13px $text-font-stack; padding: 10px; } @@ -86,20 +87,20 @@ justify-content: center; align-items: center; text-decoration: none; - color: $text-color; + color: $header-button-inactive-text; - background: $brand-color; + background: $header-button-inactive; border-radius: 5px; border: 1px solid rgba(184, 196, 194, 0.25); } .main-router-link:hover { - background: $light-background-color; + background: $header-button-hover; } .main-router-link.is-active { - background: $blue-brand; - color: $brand-color; + background: $header-button-active; + color: $header-button-active-text; margin: 3px; border-radius: 5px; border: 1px solid rgb(36, 37, 41); @@ -111,30 +112,36 @@ display: flex; justify-content: center; align-items: center; - background-color: $medium-background-color; + background-color: $navbar-unselected; text-decoration: none; - color: $text-color; + color: $navbar-unselected-text; } .router-link:hover { - background-color: $light-grey-three; + background-color: $navbar-hover; } .router-link.is-active { - background-color: $brand-color; + background-color: $navbar-selected; + color: $navbar-selected-text; } .navbar { - background-color: $navbar-color; + background-color: $navbar-background; display: flex; flex-direction: row; - justify-content: start; + justify-content: flex-start; align-items: center; height: 30px; + position: sticky; + top: 40px; //should revisit to figure out a more dynamic way of sticking the navbar to the bottom of the main-navbar + left: 0px; + z-index: 1; + @extend %disable-highlight; } .main-navbar { - background-color: $background-color; + background-color: $header-background; display: flex; flex-direction: row; justify-content: flex-start; @@ -147,7 +154,7 @@ top: 0px; left: 0px; z-index: 1; - background-color: $background-color; + background-color: $header-background; display: flex; flex-direction: row; justify-content: space-between; @@ -157,14 +164,15 @@ } .no-data-message { - color: $text-color; + color: #ff0001; font: normal 13px $text-font-stack; padding: 10px; } .performance-nav-bar-container { - background-color: $navbar-color; + background-color: #ff0002; display: flex; + border: $performance-subtab-border; height: 30px; } @@ -174,13 +182,13 @@ display: flex; justify-content: center; align-items: center; - background-color: $brand-color; + background-color: $state-background; text-decoration: none; - color: $text-color; + color: $performance-subtab-text; } .router-link-performance:hover { - background-color: $light-grey-four; + background-color: $performance-subtab-hover; } .router-link-performance.is-active { @@ -205,6 +213,10 @@ margin-top: 1rem; } +.bar-graph-axis { + stroke: cornflowerblue; +} + #hover-box { max-width: 230px; background-color: #51565e; @@ -264,4 +276,10 @@ background: #51565e; } +.app-body { + height: 100%; +} +.app-content { + height: 100%; +} diff --git a/src/app/styles/layout/_travelContainer.scss b/src/app/styles/layout/_travelContainer.scss index 1f56e2453..9938c8027 100644 --- a/src/app/styles/layout/_travelContainer.scss +++ b/src/app/styles/layout/_travelContainer.scss @@ -1,61 +1,63 @@ .travel-container { - // background: linear-gradient( - // 90deg, - // rgba(41, 41, 41, 1) 0%, - // rgba(51, 51, 51, 1) 50%, - // rgba(41, 41, 41, 1) 100% - // ); - // border-color: $border-color; - // display: flex; - // flex-direction: row; - // align-items: center; - // justify-content: space-around; + background: $travel-background; + // background: linear-gradient( + // 90deg, + // rgba(41, 41, 41, 1) 0%, + // rgba(51, 51, 51, 1) 50%, + // rgba(41, 41, 41, 1) 100% + // ); + // border-color: $border-color; + // display: flex; + // flex-direction: row; + // align-items: center; + // justify-content: space-around; - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-around; - border: none; - margin-top: 18px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-around; } -.visx-group{ - margin-top: 10px; +.visx-group { + margin-top: 10px; } - .react-select-container { - font-size: 16px; - min-width: 90px; - margin: 8px; - .react-select__control { - background-color: $light-grey-four; - border-color: transparent; - @extend %disable-highlight; - } - .react-select__control:hover { - cursor: pointer; - } - .react-select__menu { - background-color: $light-grey-four; - @extend %disable-highlight; - } - .react-select__single-value { - color: white; - } - .react-select__option:hover { - background-color: $fiery-rose; - cursor: pointer; - } - .react-select__option--is-selected, - .react-select__option--is-focused { - background-color: transparent; - cursor: pointer; + font-size: 16px; + min-width: 90px; + margin: 8px; + .react-select__control { + background-color: $speed-dropdown; + border-color: transparent; + @extend %disable-highlight; + } + .react-select__control:hover { + cursor: pointer; + } + .react-select__menu { + background-color: $speed-dropdown-expanded; + color: $speed-dropdown-text; + @extend %disable-highlight; + } + .react-select__single-value { + color: $speed-dropdown-text; + } + .react-select__option:hover { + background-color: $speed-dropdown-expanded-hover; + cursor: pointer; + } + .react-select__option--is-selected, + .react-select__option--is-focused { + background-color: transparent; + cursor: pointer; + } - } + // removes the cursor from blinking + .css-w8afj7-Input { + color: transparent; + } +} - // removes the cursor from blinking - .css-w8afj7-Input { - color: transparent; - } +.button-icon { + color: $icon-primary; } diff --git a/src/app/styles/main.scss b/src/app/styles/main.scss index 2079b29d6..febfbde16 100644 --- a/src/app/styles/main.scss +++ b/src/app/styles/main.scss @@ -3,7 +3,7 @@ * { font-family: 'Outfit', sans-serif; - font-size: 16px; + font-size: 14px; } /* width */ @@ -29,7 +29,8 @@ } // 1. Configuration and helpers -@import 'abstracts/variables'; +@import 'abstracts/variablesLM'; +//@import 'abstracts/variables'; // 3. Base stuff @import 'base/base', 'base/helpers', 'base/typography'; @@ -42,7 +43,7 @@ // 5. Components @import 'components/buttons', 'components/actionComponent', 'components/jsonTree', 'components/renderingFrequency', -'components/performanceVisx'; +'components/performanceVisx', 'components/componentMap'; // slider component @import './components/rc-slider', './components/sliderHandle'; diff --git a/src/app/components/theme.ts b/src/app/styles/theme.ts similarity index 82% rename from src/app/components/theme.ts rename to src/app/styles/theme.ts index 75e11a31a..d3e93e2bc 100644 --- a/src/app/components/theme.ts +++ b/src/app/styles/theme.ts @@ -1,11 +1,14 @@ import { createTheme } from '@mui/material/styles'; const theme = createTheme({ + // typography: { + // fontSize: 2, + // }, palette: { primary: { - main: '#8Fb5f9', + main: '#3c6e71', }, secondary: { - main: '#BF6DD2', + main: '#3c6e71', }, }, components: { diff --git a/src/backend/controllers/statePropExtractors.ts b/src/backend/controllers/statePropExtractors.ts index 75f5c0210..c01adfe21 100644 --- a/src/backend/controllers/statePropExtractors.ts +++ b/src/backend/controllers/statePropExtractors.ts @@ -1,6 +1,4 @@ -const acorn = require('acorn'); -const jsx = require('acorn-jsx'); -const JSXParser = acorn.Parser.extend(jsx()); +import parse from 'html-react-parser'; import { HookStateItem, Fiber } from '../types/backendTypes'; import { exclude } from '../models/filterConditions'; @@ -92,7 +90,7 @@ export function getHooksNames(elementType: string): { hookName: string; varName: // Abstract Syntax Tree let AST: any; try { - AST = JSXParser.parse(elementType).body; + AST = parse(elementType).body; // Begin search for hook names, only if ast has a body property. // Statements get all the names of the hooks. For example: useCount, useWildcard, ... const statements: { hookName: string; varName: string }[] = []; diff --git a/src/backend/controllers/throttle.ts b/src/backend/controllers/throttle.ts index 808b471ff..d4c9c9709 100644 --- a/src/backend/controllers/throttle.ts +++ b/src/backend/controllers/throttle.ts @@ -5,7 +5,7 @@ * @returns A function that limits input function, `callback`, from being called more than once every `MIN_TIME_BETWEEN_UPDATE` milliseconds * */ -export default function throttle any>( +export default function throttle any>( callback: T, MIN_TIME_BETWEEN_UPDATE: number, ): (...arg: Parameters) => ReturnType { diff --git a/src/backend/index.ts b/src/backend/index.ts index 49352a332..6f68440e8 100644 --- a/src/backend/index.ts +++ b/src/backend/index.ts @@ -6,7 +6,7 @@ // regenerator runtime supports async functionality : This package implements a fully-functional source transformation that takes the syntax for generators/yield from ECMAScript 2015 or ES2015 and Asynchronous Iteration proposal and spits out efficient JS-of-today (ES5) that behaves the same way. import 'regenerator-runtime/runtime'; // linkFiberInitialization (actually uses the function linkFiber but is labeled here as linkFiberInitialization, returns a function). When this returned function is invoked, it checks if devTools is installed, checks if the website is a reactApp, adds event listeners for timetravel, and allows us to obtain the initial FiberRoot Node from react dev tool -import linkFiberInitialization from './routers/linkFiber'; +import linkFiber from './routers/linkFiber'; // timeJumpInitialization (actually uses the function timeJumpInitiation but is labeled here as linkFiberInitialization, returns a function) returns a function that sets jumping to false and handles timetravel feature import timeJumpInitialization from './controllers/timeJump'; import { Snapshot, Status, MsgData } from './types/backendTypes'; @@ -20,7 +20,7 @@ const mode: Status = { // ---------------------INITIALIZE LINKFIBER & TIMEJUMP------------------------- // linkFiber is now assigned the default ASYNC function exported from the file linkFiber.ts -const linkFiber = linkFiberInitialization(mode); +const linkFiberInit = linkFiber(mode); // timeJump is now assigned the default ASYNC function exported from the file timeJump.ts const timeJump = timeJumpInitialization(mode); @@ -30,7 +30,7 @@ const timeJump = timeJumpInitialization(mode); * 2. Obtain the initial ReactFiber Tree from target React App * 3. Send a snapshot of ReactFiber Tree to frontend/Chrome Extension */ -linkFiber(); +linkFiberInit(); // --------------INITIALIZE EVENT LISTENER FOR TIME TRAVEL---------------------- /** @@ -57,6 +57,45 @@ window.addEventListener('message', async ({ data: { action, payload } }: MsgData await timeJump(payload); // * This sets state with given payload } break; + // case 'reinitialize': + // console.log('backend reinitialize received, performing checks again'); + // let devTools; + // while (!devTools) { + // devTools = window.__REACT_DEVTOOLS_GLOBAL_HOOK__; + // } + // console.log('backend react devtools: ', devTools); + // // If React Devtools is not installed, object will be undefined. + // if (!devTools) return; + // // If React Devtools is installed, send a message to front end. + + // console.log( + // 'backend react devtools check passed, sending devToolsInstalled to contentScript', + // ); + // window.postMessage( + // { + // action: 'devToolsInstalled', + // payload: 'devToolsInstalled', + // }, + // '*', + // ); + + // const reactInstance = devTools.renderers.get(1); + // // If target application is not a React App, this will return undefined. + // if (!reactInstance) { + // return; + // } + // console.log('backend react instance check passed, sending aReactApp to contentScript'); + // // If target application is a React App, send a message to front end. + // window.postMessage( + // { + // action: 'aReactApp', + // payload: 'aReactApp', + // }, + // '*', + // ); + + linkFiberInit(); + break; default: break; } diff --git a/src/backend/models/routes.ts b/src/backend/models/routes.ts index 729905bd7..9cba32261 100644 --- a/src/backend/models/routes.ts +++ b/src/backend/models/routes.ts @@ -3,7 +3,10 @@ */ export class Route { - constructor(public url: string, public id: number) { + constructor( + public url: string, + public id: number, + ) { this.url = url; this.id = id; } diff --git a/src/backend/module.d.ts b/src/backend/module.d.ts index 4a40bcdeb..5f8abd83e 100644 --- a/src/backend/module.d.ts +++ b/src/backend/module.d.ts @@ -10,9 +10,3 @@ declare module 'core-js'; // the resulting code uses regen runtime to run // https://stackoverflow.com/questions/65378542/what-is-regenerator-runtime-npm-package-used-for declare module 'regenerator-runtime/runtime'; -// Acorn is a jsx parser that was experimental to be faster than than the react.js jsx parser, -// however is not maintained at this time, last update was more than one year ago 10-5-21 -declare module 'acorn-jsx'; -// Traspiler to traspile code to JSX AST but to use with regular es5 compliant js, -// still needs babel and buble trasnpilers which use acorn-jsx under the hood -declare module 'acorn'; diff --git a/src/extension/background.js b/src/extension/background.js index 4497d6249..d2361821a 100644 --- a/src/extension/background.js +++ b/src/extension/background.js @@ -1,6 +1,7 @@ -// Import snapshots from "../app/components/snapshots". // import 'core-js'; +import { invoke } from 'lodash'; + // Store ports in an array. const portsArr = []; const reloaded = {}; @@ -55,7 +56,7 @@ function createTabObj(title) { // In practice, new Nodes are passed the following arguments: // 1. param 'obj' : arg request.payload, which is an object containing a tree from snapShot.ts and a route property // 2. param tabObj: arg tabsObj[tabId], which is an object that holds info about a specific tab. Should change the name of tabObj to tabCollection or something -class Node { +class HistoryNode { constructor(obj, tabObj) { // continues the order of number of total state changes this.index = tabObj.index; @@ -137,6 +138,7 @@ function changeCurrLocation(tabObj, rootNode, index, name) { This allows us to set up listener's for when we connect, message, and disconnect the script. */ +// INCOMING CONNECTION FROM FRONTEND (MainContainer) TO BACKGROUND.JS // Establishing incoming connection with Reactime. chrome.runtime.onConnect.addListener((port) => { /* @@ -158,11 +160,11 @@ chrome.runtime.onConnect.addListener((port) => { Again, this port object is used for communication within your extension, not for communication with external ports or tabs in the Chrome browser. If you need to interact with specific tabs or external ports, you would use other APIs or methods, such as chrome.tabs or other Chrome Extension APIs. */ - portsArr.push(port); // push each Reactime communication channel object to the portsArr - if (portsArr.length > 0) { - portsArr.forEach((bg) => { + // sets the current Title of the Reactime panel + if (portsArr.length > 0 && Object.keys(tabsObj).length > 0) { + portsArr.forEach((bg, index) => { // go through each port object (each Reactime instance) bg.postMessage({ // send passed in action object as a message to the current port @@ -184,12 +186,13 @@ chrome.runtime.onConnect.addListener((port) => { for (let i = 0; i < portsArr.length; i += 1) { if (portsArr[i] === e) { portsArr.splice(i, 1); - chrome.runtime.sendMessage('portDisconnect'); + chrome.runtime.sendMessage({ action: 'portDisconnect', port: e.name }); break; } } }); + // INCOMING MESSAGE FROM FRONTEND (MainContainer) TO BACKGROUND.js // listen for message containing a snapshot from devtools and send it to contentScript - // (i.e. they're all related to the button actions on Reactime) port.onMessage.addListener((msg) => { @@ -205,6 +208,7 @@ chrome.runtime.onConnect.addListener((port) => { const { action, payload, tabId } = msg; switch (action) { + // import action comes through when the user uses the "upload" button on the front end to import an existing snapshot tree case 'import': // create a snapshot property on tabId and set equal to tabs object // may need do something like filter payload from stateless tabsObj[tabId].snapshots = payload.snapshots; // reset snapshots to page last state recorded @@ -218,6 +222,7 @@ chrome.runtime.onConnect.addListener((port) => { return true; // return true so that port remains open + // emptySnap actions comes through when the user uses the 'clear' button on the front end to clear the snapshot history and move slider back to 0 position case 'emptySnap': tabsObj[tabId].snapshots = [tabsObj[tabId].snapshots[tabsObj[tabId].snapshots.length - 1]]; // reset snapshots to page last state recorded tabsObj[tabId].hierarchy.children = []; // resets hierarchy @@ -250,12 +255,17 @@ chrome.runtime.onConnect.addListener((port) => { chrome.tabs.sendMessage(tabId, msg); return true; + case 'reinitialize': + chrome.tabs.sendMessage(tabId, msg); + return true; + default: return true; } }); }); +// INCOMING MESSAGE FROM CONTENT SCRIPT TO BACKGROUND.JS // background.js listening for a message from contentScript.js chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // AUTOMATIC MESSAGE SENT BY CHROME WHEN CONTENT SCRIPT IS FIRST LOADED: set Content @@ -291,7 +301,7 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { switch (action) { case 'attemptReconnect': { - const success = portSuccessfullyConnected; + const success = 'portSuccessfullyConnected'; sendResponse({ success }); break; } @@ -310,6 +320,7 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // Confirmed React Dev Tools installed, send this info to frontend case 'devToolsInstalled': { tabsObj[tabId].status.reactDevToolsInstalled = true; + portsArr.forEach((bg) => bg.postMessage({ action: 'devTools', @@ -318,9 +329,16 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { ); break; } - // Confirmed target is a react app. No need to send to frontend + case 'aReactApp': { tabsObj[tabId].status.targetPageisaReactApp = true; + // JR 12.20.23 9.53pm added a message action to send to frontend + portsArr.forEach((bg) => + bg.postMessage({ + action: 'aReactApp', + payload: tabsObj, + }), + ); break; } // This injects a script into the app that you're testing Reactime on, @@ -337,7 +355,7 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { chrome.scripting.executeScript({ target: { tabId }, - function: injectScript, + func: injectScript, args: [chrome.runtime.getURL('bundles/backend.bundle.js'), tabId], }); break; @@ -350,7 +368,7 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { reloaded[tabId] = false; tabsObj[tabId].webMetrics = metrics; tabsObj[tabId].snapshots.push(request.payload); - sendToHierarchy(tabsObj[tabId], new Node(request.payload, tabsObj[tabId])); + sendToHierarchy(tabsObj[tabId], new HistoryNode(request.payload, tabsObj[tabId])); if (portsArr.length > 0) { portsArr.forEach((bg) => bg.postMessage({ @@ -378,7 +396,7 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { tabsObj[tabId].snapshots.push(request.payload); // INVOKING buildHierarchy FIGURE OUT WHAT TO PASS IN if (!tabsObj[tabId][index]) { - sendToHierarchy(tabsObj[tabId], new Node(request.payload, tabsObj[tabId])); + sendToHierarchy(tabsObj[tabId], new HistoryNode(request.payload, tabsObj[tabId])); } } // sends new tabs obj to devtools @@ -475,14 +493,43 @@ chrome.runtime.onInstalled.addListener(() => { // when context menu is clicked, listen for the menuItemId, // if user clicked on reactime, open the devtools window + +// JR 12.19.23 +// As of V22, if multiple monitors are used, it would open the reactime panel on the other screen, which was inconvenient when opening repeatedly for debugging. +// V23 fixes this by making use of chrome.windows.getCurrent to get the top and left of the screen which invoked the extension. +// As of chrome manifest V3, background.js is a 'service worker', which does not have access to the DOM or to the native 'window' method, so we use chrome.windows.getCurrent(callback) +// chrome.windows.getCurrent returns a promise (asynchronous), so all resulting functionality must happen in the callback function, or it will run before 'invokedScreen' variables have been captured. chrome.contextMenus.onClicked.addListener(({ menuItemId }) => { - const options = { - type: 'panel', - left: 0, - top: 0, - width: 1000, - height: 1000, - url: chrome.runtime.getURL('panel.html'), - }; - if (menuItemId === 'reactime') chrome.windows.create(options); + // // this was a test to see if I could dynamically set the left property to be the 0 origin of the invoked DISPLAY (as opposed to invoked window). + // // this would allow you to split your screen, keep the browser open on the right side, and reactime always opens at the top left corner. + // // however it does not tell you which display is the one that invoked it, just gives the array of all available displays. Depending on your monitor setup, it may differ. Leaving for future iterators + // chrome.system.display.getInfo((displayUnitInfo) => { + // console.log(displayUnitInfo); + // }); + chrome.windows.getCurrent((window) => { + const invokedScreenTop = 75; // window.top || 0; + const invokedScreenLeft = window.width < 1000 ? window.left + window.width - 1000 : window.left; + const invokedScreenWidth = 1000; + const invokedScreenHeight = window.height - invokedScreenTop || 1000; + const options = { + type: 'panel', + left: invokedScreenLeft, + top: invokedScreenTop, + width: invokedScreenWidth, + height: invokedScreenHeight, + url: chrome.runtime.getURL('panel.html'), + }; + if (menuItemId === 'reactime') chrome.windows.create(options); + }); + + // JR 1.9.23: this code fixes the no target error on load by triggering chrome tab reload before the panel spins up. + // It does not solve the root issue, which was deeply researched during v23 but we ran out of time to solve. Please see the readme for more information. + chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { + if (tabs.length) { + const invokedTab = tabs[0]; + const invokedTabId = invokedTab.id; + const invokedTabTitle = invokedTab.title; + chrome.tabs.reload(invokedTabId); + } + }); }); diff --git a/src/extension/build/devtools.html b/src/extension/build/devtools.html index a22ff95d3..bc851747d 100644 --- a/src/extension/build/devtools.html +++ b/src/extension/build/devtools.html @@ -1,10 +1,10 @@ - + - Reactime v21 + Reactime v23 diff --git a/src/extension/build/manifest.json b/src/extension/build/manifest.json index c807b79ee..1c0e34669 100644 --- a/src/extension/build/manifest.json +++ b/src/extension/build/manifest.json @@ -1,6 +1,6 @@ { "name": "Reactime", - "version": "22.0.0", + "version": "23.0.0", "devtools_page": "devtools.html", "description": "A Chrome extension that helps debug React applications by memorizing the state of components with every render.", "manifest_version": 3, @@ -24,6 +24,6 @@ "matches": [""] } ], - "permissions": ["contextMenus", "tabs", "activeTab", "scripting"], + "permissions": ["contextMenus", "tabs", "activeTab", "scripting", "system.display"], "host_permissions": [""] } diff --git a/src/extension/build/panel.html b/src/extension/build/panel.html index 317dc7efb..b97ee64aa 100644 --- a/src/extension/build/panel.html +++ b/src/extension/build/panel.html @@ -4,7 +4,7 @@ - Reactime 22.0 + Reactime 23.0 diff --git a/src/extension/contentScript.ts b/src/extension/contentScript.ts index 2dacfb447..b1ae376bf 100644 --- a/src/extension/contentScript.ts +++ b/src/extension/contentScript.ts @@ -10,6 +10,7 @@ let firstMessage = true; // Listens for window messages (from the injected script on the DOM) let isRecording = true; +// INCOMING MESSAGE FROM BACKEND (index.ts) TO CONTENT SCRIPT window.addEventListener('message', (msg) => { // Event listener runs constantly based on actions // recorded on the test application from backend files (linkFiber.ts). @@ -37,9 +38,10 @@ window.addEventListener('message', (msg) => { } }); +// FROM BACKGROUND TO CONTENT SCRIPT // Listening for messages from the UI of the Reactime extension. chrome.runtime.onMessage.addListener((request) => { - const { action }: { action: string } = request; + const { action, port }: { action: string; port?: string } = request; if (action) { // Message being sent from background.js // This is toggling the record button on Reactime when clicked @@ -49,11 +51,19 @@ chrome.runtime.onMessage.addListener((request) => { // this is only listening for Jump toSnap if (action === 'jumpToSnap') { chrome.runtime.sendMessage(request); + // After the jumpToSnap action has been sent back to background js, + // it will send the same action to backend files (index.ts) for it execute the jump feature + // '*' == target window origin required for event to be dispatched, '*' = no preference + window.postMessage(request, '*'); + } + + // JR: adding a response to a port disconnection message from background.js + if (action === 'portDisconnect') { + } + + if (action === 'reinitialize') { + window.postMessage(request, '*'); } - // After the jumpToSnap action has been sent back to background js, - // it will send the same action to backend files (index.ts) for it execute the jump feature - // '*' == target window origin required for event to be dispatched, '*' = no preference - window.postMessage(request, '*'); } }); @@ -63,7 +73,6 @@ chrome.runtime.onMessage.addListener((request) => { const metrics = {}; const gatherMetrics = ({ name, value }) => { metrics[name] = value; - chrome.runtime.sendMessage({ type: 'performance:metric', name, diff --git a/tsconfig.json b/tsconfig.json index ca9e2ada0..e2e7ac64f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,26 +1,95 @@ { "compilerOptions": { - /* Basic Options */ - //---------------------LANGUAGE AND ENVIRONEMNT----------------------------- - // Specifies the ECMAScript version that the TypeScript compiler should target. This allow the transpiled file being used in older browser. - "target": "es5", - // Specifies the syntax for writing React components in TypeScript - "jsx": "react", - "outDir": "./src/extension/build/bundles/", + /* Visit https://aka.ms/tsconfig to read more about this file */ - // --------------------------MODULES---------------------------------------- - // Specifies the module format for the compiled TypeScript files - "module": "es6", - "downlevelIteration": true, - // Specifies the folder where TypeScript should look for type definition files. - "typeRoots": ["./node_modules/@types"], - // Specifies which global types to include in the project. - // Specifies type package names to be included without being referenced in a source file. - "types": ["chrome", "jest", "node"], + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - // ---------------------------------TYPE CHECKING--------------------------- - // "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, + /* Language and Environment */ + "target": "ES6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "ES6" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node10" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + "typeRoots": [ + "./node_modules/@types" + ] /* Specify multiple folders that act like './node_modules/@types'. */, + "types": [ + "chrome", + "jest", + "node" + ] /* Specify type package names to be included without being referenced in a source file. */, + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + "resolveJsonModule": true /* Enable importing .json files. */, + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */, + // "checkJs": true /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./src/extension/build/bundles/" /* Specify an output folder for all emitted files. */, + "removeComments": true /* Disable emitting comments. */, + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + // "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ @@ -39,50 +108,21 @@ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - // -------------------------------EMIT-------------------------------------- - // Specifies TypeScript compiler to remove comments from the compiled JavaScript code. - "removeComments": true, - - // --------------------------JAVASCRIPT SUPPORT----------------------------- - // Specifies TypeScript compiler to allow JavaScript files to be included in the compilation process. => good to use if want to incrementally convert javascript to typescript files - "allowJs": true, - - // Specifies the module resolution strategy to use. - "moduleResolution": "node", - - // Enables TypeScript to import JSON files as modules. - "resolveJsonModule": true, - - //------------------------INTEROP CONSTRAINTS------------------------------ - // Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. - "esModuleInterop": true, - // Specifies TypeScript compiler to allow importing modules with a default export from modules - // some third party modules may still use - "allowSyntheticDefaultImports": true, - // Transiple each file as a seprate module => expect all files to have import/export statement - // "isolatedModules": true, - // Ensures that file names are consistently cased. - "forceConsistentCasingInFileNames": true, - - // -----------------------------COMPLETENESS-------------------------------- - // Skip type checking of type declartion files (.d.ts files) that are included with TypeScript. If we trust the type definition of our imported file, turn this flag on => reduce compiling time. - "skipLibCheck": true + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, - // Specifies which files should be included in the compilation. - "include": ["./src/app", "./src/backend", "./src/extension", "./jest-setup.ts", "./global.d.ts"], - // Specifies which files should be excluded from the compilation. + "include": ["./src/**/*", "./src/backend", "./src/extension", "./global.d.ts"], "exclude": [ "./src/app/__tests__", "./src/backend/__tests__", - "./src/app/__tests__enzyme", "node_modules", "./src/extension/build/bundles" ], - - // Specifies options for TypeDoc, a documentation generator for TypeScript. In this case, it tells TypeDoc to generate documentation for the project in "file" mode, and to output the documentation to a "docs" folder. - "typeDocOptions": { - "mode": "file", + "typedocOptions": { + "entryPoints": ["src"], + "entryPointStrategy": "expand", "out": "docs" } } diff --git a/typedoc.json b/typedoc.json deleted file mode 100644 index 0198442ae..000000000 --- a/typedoc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "mode": "modules", - "out": "docs", - "includes": ["./src/backend"], - "exclude": ["**/__tests__/**", "**/**/**/build/**", "**/types/**"], - "name": "Reactime 21.0" -} diff --git a/webpack.config.js b/webpack.config.js index 1397a1a22..b64c21032 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,14 +1,15 @@ +require('dotenv').config(); /* eslint-disable @typescript-eslint/no-var-requires */ const path = require('path'); /** ChromeExtensionReloader plugin is a tool for hot-reloading code in a Chrome extension during development. * It works by injecting a script into the extension that listens for file changes and automatically reloads the extension when a file is modified. */ -const ChromeExtensionReloader = require('webpack-chrome-extension-reloader'); // const TypedocWebpackPlugin = require('typedoc-webpack-plugin'); -const config = { +module.exports = { + mode: process.env.NODE_ENV || 'production', // use a "multi-main entry" to inject multiple dependent files together // and graph their dependencies into one "chunk" entry: { @@ -17,63 +18,17 @@ const config = { content: './src/extension/contentScript.ts', backend: './src/backend/index.ts', }, - /** - * Bundle each entry point into one "chunk" & store it in the extension/build/bundles folder - * When load the unpacked extension in the chrome extension store, the src/extension/build folder is selected => load all bundles (app, backend, background & content script) - */ watchOptions: { - poll: true, + aggregateTimeout: 1000, ignored: /node_modules/, }, - output: { path: path.resolve(__dirname, 'src/extension/build/bundles'), filename: '[name].bundle.js', }, - - node: { - net: 'empty', - tls: 'empty', - }, + devtool: 'cheap-module-source-map', module: { - /** The order of rules array is bottom to top. - * In your rules array, the order is: - * 1 .css and .scss files will be evaluated first will use the style-loader and css-loader, as well as the sass-loader (only applicable for .scss files). - * 2 .tsx and .ts files will be evaluated third and will use the ts-loader. - * 3 .jsx and .js files will be evaluated last and will use the babel-loader to transpile them into code that is compatible with older browsers. - */ rules: [ - /** - * For all files ending .js or .jsx, except those in node_modules - * => transpile them into code that is compatible with older browser using babel-loader - */ - { - test: /\.jsx?/, - exclude: /(node_modules)/, - resolve: { - extensions: ['.js', '.jsx'], - }, - use: { - loader: 'babel-loader', - options: { - presets: [ - [ - '@babel/preset-env', - { - useBuiltIns: 'entry', - corejs: 3, - debug: true, - }, - ], - - '@babel/preset-react', - { - plugins: ['@babel/plugin-proposal-class-properties'], - }, - ], - }, - }, - }, /** * For all files ending in .ts or .tsx, except those in node_modules * => transpile typescript files into javascript file. @@ -103,47 +58,8 @@ const config = { }, ], }, - plugins: [ - // new TypedocWebpackPlugin({ - // name: 'Contoso', - // mode: 'modules', - // theme: './typedoc-theme/', - // includeDeclarations: false, - // ignoreCompilerErrors: true, - // }), - ], - // Add `.ts` and `.tsx` as a resolvable extension. resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx'], }, }; - -module.exports = (env, argv) => { - /** - * env stands for "environment" and is an object that contains environment-specific configuration properties. - * argv stands for "argument vector" and is an object that contains the arguments passed to Webpack via the command line interface. - * argv.mode is an argument that is parsed by the Webpack CLI to specify the build mode. - * For example, running webpack --mode=production will set argv.mode to 'production'. - */ - if (argv.mode === 'development') { - /** - * "cheap-module-source-map" is a type of source map in webpack. - * A source map is a file that maps the source code to the compiled code, making it easier to debug and trace issues in the original source code. - * devtool is option to control if & how source maps are generated - * https://webpack.js.org/configuration/devtool/#root - */ - config.devtool = 'cheap-module-source-map'; - config.plugins.push( - new ChromeExtensionReloader({ - entries: { - contentScript: ['app', 'content'], - background: ['background'], - }, - }), - ); - } else { - config.mode = 'production'; - } - return config; -};