gitextract_zim1ay1i/ ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github/ │ ├── .yarnrc.publish.yml │ ├── actions/ │ │ └── yarn-nm-install/ │ │ └── action.yml │ └── workflows/ │ ├── ci.yml │ └── release-insiders.yml ├── .gitignore ├── .husky/ │ ├── .gitignore │ └── pre-commit ├── .prettierignore ├── .prettierrc ├── .yarn/ │ ├── plugins/ │ │ └── @yarnpkg/ │ │ ├── plugin-compat.cjs │ │ └── plugin-interactive-tools.cjs │ └── releases/ │ └── yarn-3.6.3.cjs ├── .yarnrc.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── Notes.md ├── README.md ├── compat-tests/ │ ├── .gitignore │ ├── README.md │ ├── fixtures/ │ │ ├── basic-react17/ │ │ │ ├── package/ │ │ │ │ ├── .gitignore │ │ │ │ ├── index.html │ │ │ │ ├── package.json │ │ │ │ ├── src/ │ │ │ │ │ ├── App/ │ │ │ │ │ │ ├── Scene.tsx │ │ │ │ │ │ └── useDrag.ts │ │ │ │ │ └── index.tsx │ │ │ │ └── tsconfig.json │ │ │ └── react17.compat-test.ts │ │ ├── basic-vite4/ │ │ │ ├── basic-vite4.compat-test.ts │ │ │ └── package/ │ │ │ ├── .gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ └── index.ts │ │ │ └── tsconfig.json │ │ ├── r3f-cra/ │ │ │ ├── cra.compat-test.ts │ │ │ └── package/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── package.json │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── src/ │ │ │ ├── App/ │ │ │ │ ├── App.tsx │ │ │ │ └── state.json │ │ │ └── index.tsx │ │ ├── r3f-next-latest/ │ │ │ ├── next-latest.compat-test.ts │ │ │ └── package/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── next-env.d.ts │ │ │ ├── package.json │ │ │ ├── pages/ │ │ │ │ └── index.js │ │ │ ├── src/ │ │ │ │ └── App/ │ │ │ │ ├── App.tsx │ │ │ │ └── state.json │ │ │ └── tsconfig.json │ │ ├── r3f-parcel1/ │ │ │ ├── package/ │ │ │ │ ├── .gitignore │ │ │ │ ├── index.html │ │ │ │ ├── package.json │ │ │ │ ├── src/ │ │ │ │ │ ├── App/ │ │ │ │ │ │ ├── App.tsx │ │ │ │ │ │ └── state.json │ │ │ │ │ └── index.tsx │ │ │ │ └── tsconfig.json │ │ │ └── parcel1.compat-test.ts │ │ ├── r3f-react18/ │ │ │ ├── package/ │ │ │ │ ├── .gitignore │ │ │ │ ├── index.html │ │ │ │ ├── package.json │ │ │ │ ├── src/ │ │ │ │ │ ├── App/ │ │ │ │ │ │ ├── App.tsx │ │ │ │ │ │ └── state.json │ │ │ │ │ └── index.js │ │ │ │ └── tsconfig.json │ │ │ └── react18.compat-test.ts │ │ ├── r3f-vite2/ │ │ │ ├── package/ │ │ │ │ ├── .gitignore │ │ │ │ ├── index.html │ │ │ │ ├── package.json │ │ │ │ ├── src/ │ │ │ │ │ ├── App/ │ │ │ │ │ │ ├── App.tsx │ │ │ │ │ │ └── state.json │ │ │ │ │ ├── main.tsx │ │ │ │ │ └── vite-env.d.ts │ │ │ │ ├── tsconfig.json │ │ │ │ ├── tsconfig.node.json │ │ │ │ └── vite.config.ts │ │ │ └── vite2.compat-test.ts │ │ └── r3f-vite4/ │ │ ├── package/ │ │ │ ├── .gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ └── state.json │ │ │ │ ├── main.tsx │ │ │ │ └── vite-env.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.ts │ │ └── vite4.compat-test.ts │ ├── integrity.compat-test.ts │ ├── package.json │ ├── scripts/ │ │ ├── clean.ts │ │ ├── install-fixtures.ts │ │ └── scripts.ts │ ├── tsconfig.json │ ├── utils/ │ │ └── testUtils.ts │ └── verdaccio.yml ├── credits.txt ├── devEnv/ │ ├── api-extractor-base.json │ ├── cli.ts │ ├── ensurePublishing.js │ ├── eslint/ │ │ └── rules/ │ │ └── no-relative-imports.js │ ├── getAliasesFromTsConfig.d.ts │ ├── getAliasesFromTsConfig.js │ ├── tsconfig.json │ ├── typecheck-all-projects/ │ │ └── tsconfig.all.json │ └── verify-docker-compose.test.ts ├── docker-compose.yml ├── examples/ │ ├── basic-dom/ │ │ ├── .gitignore │ │ ├── Scene.tsx │ │ ├── index.html │ │ ├── index.tsx │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── useDrag.ts │ ├── dom-cra/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ ├── public/ │ │ │ ├── index.html │ │ │ ├── manifest.json │ │ │ └── robots.txt │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── App.test.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── reportWebVitals.js │ │ │ ├── setupTests.js │ │ │ └── useDrag.js │ │ └── tsconfig.json │ └── r3f-cra/ │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── public/ │ │ ├── index.html │ │ ├── manifest.json │ │ └── robots.txt │ ├── src/ │ │ ├── App.css │ │ ├── App.js │ │ ├── App.test.js │ │ ├── index.css │ │ ├── index.js │ │ ├── react-app-env.d.ts │ │ ├── reportWebVitals.js │ │ ├── setupTests.js │ │ └── useDrag.js │ └── tsconfig.json ├── jest.compat-tests.config.js ├── jest.config.js ├── knip.config.json ├── lerna.json ├── package.json ├── packages/ │ ├── app/ │ │ ├── .gitignore │ │ ├── .vscode/ │ │ │ └── settings.json │ │ ├── LICENSE │ │ ├── README.md │ │ ├── components.json │ │ ├── devEnv/ │ │ │ └── cli.ts │ │ ├── docker-compose.yml │ │ ├── next.config.js │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── prisma/ │ │ │ ├── .gitignore │ │ │ ├── migrations/ │ │ │ │ ├── 20230409133858_init/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230514190125_lib_auth/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230813123201_1/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230813131020_2/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230820072612_3/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230820093151_4/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230820095524_/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230827165303_5/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20230828173601_2/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20231005010012_replace_auth0_with_next_auth/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20231014131018_referesh_token_grace_period/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20231017030424_add_teams_and_workspaces/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20231017070342_add_teams_and_workspaces/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20231127144216_/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20231127153849_pkce/ │ │ │ │ │ └── migration.sql │ │ │ │ ├── 20231202190130_scopes/ │ │ │ │ │ └── migration.sql │ │ │ │ └── migration_lock.toml │ │ │ ├── schema.prisma │ │ │ └── seed.ts │ │ ├── src/ │ │ │ ├── .eslintrc.json │ │ │ ├── app/ │ │ │ │ ├── (protected)/ │ │ │ │ │ ├── _components/ │ │ │ │ │ │ ├── AccountSettingsPrompt.tsx │ │ │ │ │ │ ├── AccountSwitcher.tsx │ │ │ │ │ │ ├── EditWorkspaceDialog.tsx │ │ │ │ │ │ ├── InviteGuestsDialog.tsx │ │ │ │ │ │ ├── InviteTeamMembersPrompt.tsx │ │ │ │ │ │ ├── Navigation.tsx │ │ │ │ │ │ ├── NewWorkspaceDialog.tsx │ │ │ │ │ │ ├── NotificationsPopover.tsx │ │ │ │ │ │ ├── SessionProvider.tsx │ │ │ │ │ │ ├── TeamMembers.tsx │ │ │ │ │ │ ├── TeamSettingsPrompt.tsx │ │ │ │ │ │ └── WorkspaceThumb.tsx │ │ │ │ │ ├── account-setup/ │ │ │ │ │ │ ├── _components/ │ │ │ │ │ │ │ └── AccountSetupForm.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── recents/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── shared-with-me/ │ │ │ │ │ │ ├── _components/ │ │ │ │ │ │ │ └── Shared.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── team/ │ │ │ │ │ │ └── [id]/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── Team.tsx │ │ │ │ │ │ ├── not-found.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── workspace/ │ │ │ │ │ └── [id]/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── (public)/ │ │ │ │ │ ├── _components/ │ │ │ │ │ │ └── SignIn.tsx │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── somethingpublic/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── _components/ │ │ │ │ │ └── Prompts.tsx │ │ │ │ ├── api/ │ │ │ │ │ ├── auth/ │ │ │ │ │ │ └── [...nextauth]/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── jwt-public-key/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── studio-auth/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── studio-trpc/ │ │ │ │ │ │ └── [trpc]/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ └── trpc/ │ │ │ │ │ └── [trpc]/ │ │ │ │ │ └── route.ts │ │ │ │ ├── global.css │ │ │ │ └── layout.tsx │ │ │ ├── env.d.ts │ │ │ ├── env.test.ts │ │ │ ├── envSchema.ts │ │ │ ├── prisma.ts │ │ │ ├── schemas/ │ │ │ │ └── index.ts │ │ │ ├── server/ │ │ │ │ ├── api/ │ │ │ │ │ ├── root.ts │ │ │ │ │ ├── routes/ │ │ │ │ │ │ ├── meRouter.ts │ │ │ │ │ │ ├── projectsRouter.ts │ │ │ │ │ │ ├── teamsRouter.ts │ │ │ │ │ │ └── workspaceRouter.ts │ │ │ │ │ └── trpc.ts │ │ │ │ └── studio-api/ │ │ │ │ ├── root.ts │ │ │ │ └── routes/ │ │ │ │ └── studioAuthRouter.ts │ │ │ ├── trpc/ │ │ │ │ ├── react.tsx │ │ │ │ ├── server.ts │ │ │ │ └── shared.ts │ │ │ ├── types.ts │ │ │ ├── ui/ │ │ │ │ ├── components/ │ │ │ │ │ └── ui/ │ │ │ │ │ ├── alert-dialog.tsx │ │ │ │ │ ├── avatar.tsx │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── context-menu.tsx │ │ │ │ │ ├── dialog.tsx │ │ │ │ │ ├── form.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── popover.tsx │ │ │ │ │ ├── select.tsx │ │ │ │ │ ├── separator.tsx │ │ │ │ │ ├── toast.tsx │ │ │ │ │ ├── toaster.tsx │ │ │ │ │ └── use-toast.ts │ │ │ │ └── lib/ │ │ │ │ └── utils.ts │ │ │ ├── useApi.ts │ │ │ └── utils/ │ │ │ ├── authUtils.ts │ │ │ └── index.ts │ │ ├── tailwind.config.js │ │ └── tsconfig.json │ ├── benchmarks/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── devEnv/ │ │ │ └── serveBenchmarks.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Bench project 1.theatre-project-state.json │ │ │ ├── benchmarks-globals.d.ts │ │ │ ├── index.html │ │ │ └── index.tsx │ │ └── tsconfig.json │ ├── browser-bundles/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ ├── build.ts │ │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── core-and-studio.ts │ │ │ └── core-only.ts │ │ ├── test.html │ │ └── tsconfig.json │ ├── core/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ ├── cli.ts │ │ │ ├── declarations-bundler/ │ │ │ │ ├── README.md │ │ │ │ └── rollup.config.js │ │ │ └── definedGlobals.ts │ │ ├── globals.d.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── .eslintrc.js │ │ │ ├── CoreBundle.ts │ │ │ ├── copyToClipboard.ts │ │ │ ├── coreExports.ts │ │ │ ├── coreTicker.ts │ │ │ ├── env.ts │ │ │ ├── envSchema.ts │ │ │ ├── globals.ts │ │ │ ├── index.ts │ │ │ ├── privateAPIs.ts │ │ │ ├── projects/ │ │ │ │ ├── Project.ts │ │ │ │ ├── TheatreProject.ts │ │ │ │ ├── initialiseProjectState.ts │ │ │ │ └── projectsSingleton.ts │ │ │ ├── propTypes/ │ │ │ │ ├── index.ts │ │ │ │ ├── internals.ts │ │ │ │ └── utils.ts │ │ │ ├── rafDrivers.ts │ │ │ ├── sequences/ │ │ │ │ ├── Sequence.ts │ │ │ │ ├── TheatreSequence.ts │ │ │ │ ├── interpolationTripleAtPosition.ts │ │ │ │ └── playbackControllers/ │ │ │ │ ├── AudioPlaybackController.ts │ │ │ │ └── DefaultPlaybackController.ts │ │ │ ├── sheetObjects/ │ │ │ │ ├── SheetObject.ts │ │ │ │ ├── SheetObjectTemplate.ts │ │ │ │ ├── TheatreSheetObject.ts │ │ │ │ ├── getOrderingOfPropTypeConfig.ts │ │ │ │ └── getPropDefaultsOfSheetObject.ts │ │ │ ├── sheets/ │ │ │ │ ├── Sheet.ts │ │ │ │ ├── SheetTemplate.ts │ │ │ │ └── TheatreSheet.ts │ │ │ ├── types/ │ │ │ │ ├── private/ │ │ │ │ │ ├── core.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── studio/ │ │ │ │ │ ├── ahistoric.ts │ │ │ │ │ ├── ephemeral.ts │ │ │ │ │ ├── historic.ts │ │ │ │ │ └── index.ts │ │ │ │ └── public.ts │ │ │ └── utils/ │ │ │ ├── ids.ts │ │ │ ├── instanceTypes.ts │ │ │ ├── keyframeUtils.ts │ │ │ └── notify.ts │ │ └── tsconfig.json │ ├── dataverse/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api/ │ │ │ ├── .nojekyll │ │ │ ├── README.md │ │ │ ├── classes/ │ │ │ │ ├── Atom.md │ │ │ │ ├── PointerProxy.md │ │ │ │ └── Ticker.md │ │ │ ├── interfaces/ │ │ │ │ ├── PointerToPrismProvider.md │ │ │ │ └── Prism-1.md │ │ │ └── modules/ │ │ │ └── prism.md │ │ ├── devEnv/ │ │ │ ├── api-extractor.json │ │ │ ├── api-extractor.tsconfig.json │ │ │ ├── build.ts │ │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Atom.test.ts │ │ │ ├── Atom.ts │ │ │ ├── PointerProxy.ts │ │ │ ├── Ticker.test.ts │ │ │ ├── Ticker.ts │ │ │ ├── atom.typeTest.ts │ │ │ ├── dataverse.test.ts │ │ │ ├── index.ts │ │ │ ├── integration.test.ts │ │ │ ├── pointer.test.ts │ │ │ ├── pointer.ts │ │ │ ├── pointer.typeTest.ts │ │ │ ├── pointerToPrism.ts │ │ │ ├── prism/ │ │ │ │ ├── Interface.ts │ │ │ │ ├── asyncIterateOver.ts │ │ │ │ ├── discoveryMechanism.ts │ │ │ │ ├── iterateAndCountTicks.ts │ │ │ │ ├── iterateOver.test.ts │ │ │ │ ├── iterateOver.ts │ │ │ │ ├── prism.test.ts │ │ │ │ └── prism.ts │ │ │ ├── setupTestEnv.ts │ │ │ ├── types.ts │ │ │ ├── utils/ │ │ │ │ ├── Stack.ts │ │ │ │ ├── typeTestUtils.ts │ │ │ │ └── updateDeep.ts │ │ │ └── val.ts │ │ ├── tsconfig.json │ │ └── typedoc.json │ ├── dataverse-experiments/ │ │ ├── .babelrc.js │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Atom.ts │ │ │ ├── Box.ts │ │ │ ├── Ticker.ts │ │ │ ├── atom.typeTest.ts │ │ │ ├── derivations/ │ │ │ │ ├── AbstractDerivation.ts │ │ │ │ ├── AbstractDerivation.typeTest.ts │ │ │ │ ├── ConstantDerivation.ts │ │ │ │ ├── DerivationEmitter.ts │ │ │ │ ├── DerivationFromSource.ts │ │ │ │ ├── Freshener.ts │ │ │ │ ├── IDerivation.ts │ │ │ │ ├── flatMap.ts │ │ │ │ ├── iterateAndCountTicks.ts │ │ │ │ ├── iterateOver.test.ts │ │ │ │ ├── iterateOver.ts │ │ │ │ ├── map.ts │ │ │ │ └── prism/ │ │ │ │ ├── discoveryMechanism.ts │ │ │ │ ├── prism.test.ts │ │ │ │ └── prism.ts │ │ │ ├── index.ts │ │ │ ├── integration.test.ts │ │ │ ├── pointer.ts │ │ │ ├── setupTestEnv.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ ├── Emitter.test.ts │ │ │ ├── Emitter.ts │ │ │ ├── EventEmitter.ts │ │ │ ├── PathBasedReducer.ts │ │ │ ├── Stack.ts │ │ │ ├── Tappable.ts │ │ │ ├── typeTestUtils.ts │ │ │ └── updateDeep.ts │ │ └── tsconfig.json │ ├── playground/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ ├── .gitignore │ │ │ ├── playwright-report/ │ │ │ │ └── index.html │ │ │ └── playwright.config.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── .gitignore │ │ │ ├── home/ │ │ │ │ ├── ItemSectionWithPreviews.tsx │ │ │ │ ├── PlaygroundHeader.tsx │ │ │ │ └── PlaygroundPage.tsx │ │ │ ├── index.html │ │ │ ├── index.tsx │ │ │ ├── playground-globals.d.ts │ │ │ ├── public/ │ │ │ │ └── _redirects │ │ │ ├── shared/ │ │ │ │ ├── camera/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── scene.glb │ │ │ │ ├── custom-editable-components/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── custom-raf-driver/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── dom/ │ │ │ │ │ ├── Scene.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── useDrag.ts │ │ │ │ ├── dom-basic/ │ │ │ │ │ ├── Box3D.tsx │ │ │ │ │ ├── Scene.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── file/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── hello-world-extension/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── hello-world-extension-dataverse/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── hello-world-extension-using-sheet-object/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── image/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── instances/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── scene.glb │ │ │ │ ├── notifications/ │ │ │ │ │ ├── Scene.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── useDrag.ts │ │ │ │ ├── r3f-rocket/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── scene.glb │ │ │ │ ├── remote/ │ │ │ │ │ ├── Box3D.tsx │ │ │ │ │ ├── Remote.ts │ │ │ │ │ ├── RemoteController.ts │ │ │ │ │ ├── Scene.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── sync/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── theatric/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── state.json │ │ │ │ ├── three-basic/ │ │ │ │ │ ├── ThreeScene.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ └── index.tsx │ │ │ │ ├── turtle/ │ │ │ │ │ ├── TurtleRenderer.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── turtle.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── utils/ │ │ │ │ └── useExtensionButton.ts │ │ │ └── tests/ │ │ │ ├── hot-reload-extension-pane/ │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── test.e2e.ts │ │ │ ├── hot-reload-extension-toolbar/ │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── test.e2e.ts │ │ │ ├── r3f-dynamic-tree/ │ │ │ │ ├── App.tsx │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── test.e2e.ts │ │ │ ├── r3f-stress-test/ │ │ │ │ ├── App.tsx │ │ │ │ ├── SpaceStress.theatre-project-state.json │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── scene.glb │ │ │ ├── reading-obj-value/ │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── reading obj value.theatre-project-state.json │ │ │ └── setting-static-props/ │ │ │ ├── index.html │ │ │ ├── index.tsx │ │ │ └── test.e2e.ts │ │ ├── tsconfig.json │ │ └── vite.config.ts │ ├── r3f/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ ├── bundle.ts │ │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── .eslintrc.js │ │ │ ├── drei/ │ │ │ │ ├── OrthographicCamera.tsx │ │ │ │ ├── PerspectiveCamera.tsx │ │ │ │ └── index.ts │ │ │ ├── extension/ │ │ │ │ ├── .eslintrc.js │ │ │ │ ├── InfiniteGridHelper/ │ │ │ │ │ └── index.ts │ │ │ │ ├── components/ │ │ │ │ │ ├── DragDetector.tsx │ │ │ │ │ ├── EditableProxy.tsx │ │ │ │ │ ├── OrbitControls/ │ │ │ │ │ │ ├── OrbitControlsImpl.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ProxyManager.tsx │ │ │ │ │ ├── ReferenceWindow/ │ │ │ │ │ │ ├── ReferenceWindow.tsx │ │ │ │ │ │ └── noiseImage.ts │ │ │ │ │ ├── SnapshotEditor.tsx │ │ │ │ │ ├── TransformControls.tsx │ │ │ │ │ ├── useRefAndState.ts │ │ │ │ │ ├── useSelected.tsx │ │ │ │ │ └── useSnapshotEditorCamera.tsx │ │ │ │ ├── editorStuff.ts │ │ │ │ ├── icons.tsx │ │ │ │ ├── index.ts │ │ │ │ └── useExtensionStore.ts │ │ │ ├── globals.d.ts │ │ │ ├── index.ts │ │ │ ├── main/ │ │ │ │ ├── .eslintrc.js │ │ │ │ ├── RafDriverProvider.tsx │ │ │ │ ├── RefreshSnapshot.tsx │ │ │ │ ├── SheetProvider.tsx │ │ │ │ ├── defaultEditableFactoryConfig.ts │ │ │ │ ├── editable.tsx │ │ │ │ ├── editableFactoryConfigUtils.ts │ │ │ │ ├── store.ts │ │ │ │ ├── useInvalidate.ts │ │ │ │ └── utils.ts │ │ │ └── types.ts │ │ └── tsconfig.json │ ├── react/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ ├── api-extractor.json │ │ │ ├── api-extractor.tsconfig.json │ │ │ ├── build.ts │ │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── saaz/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ ├── api-extractor.json │ │ │ ├── api-extractor.tsconfig.json │ │ │ ├── build.ts │ │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── __snapshots__/ │ │ │ │ └── rogue.test.ts.snap │ │ │ ├── back/ │ │ │ │ ├── BackMemoryAdapter.ts │ │ │ │ ├── BackStorage.ts │ │ │ │ └── SaazBack.ts │ │ │ ├── front/ │ │ │ │ ├── FrontIdbAdapter.ts │ │ │ │ ├── FrontMemoryAdapter.ts │ │ │ │ ├── FrontStorage.ts │ │ │ │ └── SaazFront.ts │ │ │ ├── index.test.ts │ │ │ ├── index.ts │ │ │ ├── rogue.test.ts │ │ │ ├── rogue.ts │ │ │ ├── shared/ │ │ │ │ ├── GeneratorSpy.ts │ │ │ │ ├── transactions.ts │ │ │ │ └── utils.ts │ │ │ └── types.ts │ │ ├── tsconfig.json │ │ └── typedoc.json │ ├── studio/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ └── cli.ts │ │ ├── globals.d.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── .eslintrc.js │ │ │ ├── Auth.ts │ │ │ ├── IDBStorage.ts │ │ │ ├── PaneManager.ts │ │ │ ├── Scrub.ts │ │ │ ├── Storno/ │ │ │ │ └── Storno.ts │ │ │ ├── Studio.ts │ │ │ ├── StudioBundle.ts │ │ │ ├── StudioStore/ │ │ │ │ ├── StudioStore.ts │ │ │ │ ├── createTransactionPrivateApi.ts │ │ │ │ └── generateDiskStateRevision.ts │ │ │ ├── SyncStore/ │ │ │ │ ├── AppLink.ts │ │ │ │ ├── SyncServerLink.ts │ │ │ │ ├── enhancedTrpcWsClient.ts │ │ │ │ └── utils.ts │ │ │ ├── TheatreStudio.ts │ │ │ ├── UI/ │ │ │ │ ├── UI.ts │ │ │ │ └── UINonSSRBits.ts │ │ │ ├── UIRoot/ │ │ │ │ ├── PanelsRoot.tsx │ │ │ │ ├── PointerCapturing.tsx │ │ │ │ ├── ProvideTheme.tsx │ │ │ │ ├── UIRoot.tsx │ │ │ │ └── useKeyboardShortcuts.ts │ │ │ ├── checkForUpdates.ts │ │ │ ├── css.tsx │ │ │ ├── env.ts │ │ │ ├── getStudio.ts │ │ │ ├── index.ts │ │ │ ├── integration-tests/ │ │ │ │ ├── Sequence.test.ts │ │ │ │ ├── SheetObject.test.ts │ │ │ │ ├── SheetObjectTemplate.test.ts │ │ │ │ ├── setupIntegrationTestEnv.ts │ │ │ │ └── testUtils.ts │ │ │ ├── notify.tsx │ │ │ ├── panels/ │ │ │ │ ├── BasePanel/ │ │ │ │ │ ├── BasePanel.tsx │ │ │ │ │ ├── ExtensionPaneWrapper.tsx │ │ │ │ │ ├── PanelDragZone.tsx │ │ │ │ │ ├── PanelResizeHandle.tsx │ │ │ │ │ ├── PanelResizers.tsx │ │ │ │ │ ├── PanelWrapper.tsx │ │ │ │ │ └── common.tsx │ │ │ │ ├── DetailPanel/ │ │ │ │ │ ├── DetailPanel.tsx │ │ │ │ │ ├── DeterminePropEditorForDetail/ │ │ │ │ │ │ ├── DetailCompoundPropEditor.tsx │ │ │ │ │ │ ├── DetailSimplePropEditor.tsx │ │ │ │ │ │ ├── SingleRowPropEditor.tsx │ │ │ │ │ │ ├── collapsedMap.tsx │ │ │ │ │ │ ├── getDetailRowHighlightBackground.tsx │ │ │ │ │ │ └── rowIndentationFormulaCSS.tsx │ │ │ │ │ ├── DeterminePropEditorForDetail.tsx │ │ │ │ │ ├── EmptyState.tsx │ │ │ │ │ ├── ObjectDetails.tsx │ │ │ │ │ ├── ProjectDetails/ │ │ │ │ │ │ └── StateConflictRow.tsx │ │ │ │ │ └── ProjectDetails.tsx │ │ │ │ ├── OutlinePanel/ │ │ │ │ │ ├── BaseItem.tsx │ │ │ │ │ ├── ObjectsList/ │ │ │ │ │ │ ├── ObjectItem.tsx │ │ │ │ │ │ └── ObjectsList.tsx │ │ │ │ │ ├── OutlinePanel.tsx │ │ │ │ │ ├── ProjectsList/ │ │ │ │ │ │ ├── ProjectListItem.tsx │ │ │ │ │ │ └── ProjectsList.tsx │ │ │ │ │ ├── SheetsList/ │ │ │ │ │ │ ├── SheetInstanceItem.tsx │ │ │ │ │ │ ├── SheetItem.tsx │ │ │ │ │ │ └── SheetsList.tsx │ │ │ │ │ └── outlinePanelUtils.ts │ │ │ │ └── SequenceEditorPanel/ │ │ │ │ ├── AGGREGATE_COPY_PASTE.md │ │ │ │ ├── DopeSheet/ │ │ │ │ │ ├── DopeSheet.tsx │ │ │ │ │ ├── Left/ │ │ │ │ │ │ ├── AnyCompositeRow.tsx │ │ │ │ │ │ ├── Left.tsx │ │ │ │ │ │ ├── PrimitivePropRow.tsx │ │ │ │ │ │ ├── PropWithChildrenRow.tsx │ │ │ │ │ │ ├── SheetObjectRow.tsx │ │ │ │ │ │ ├── SheetRow.tsx │ │ │ │ │ │ └── usePropHighlightMouseEnter.tsx │ │ │ │ │ ├── Right/ │ │ │ │ │ │ ├── AggregatedKeyframeTrack/ │ │ │ │ │ │ │ ├── AggregateKeyframeEditor/ │ │ │ │ │ │ │ │ ├── AggregateKeyframeConnector.tsx │ │ │ │ │ │ │ │ ├── AggregateKeyframeDot.tsx │ │ │ │ │ │ │ │ ├── AggregateKeyframeEditor.tsx │ │ │ │ │ │ │ │ ├── AggregateKeyframeVisualDot.tsx │ │ │ │ │ │ │ │ ├── iif.tsx │ │ │ │ │ │ │ │ └── useAggregateKeyframeEditorUtils.tsx │ │ │ │ │ │ │ └── AggregatedKeyframeTrack.tsx │ │ │ │ │ │ ├── BasicKeyframedTrack/ │ │ │ │ │ │ │ ├── BasicKeyframedTrack.tsx │ │ │ │ │ │ │ └── KeyframeEditor/ │ │ │ │ │ │ │ ├── BasicKeyframeConnector.tsx │ │ │ │ │ │ │ ├── CurveEditorPopover/ │ │ │ │ │ │ │ │ ├── CurveEditorPopover.tsx │ │ │ │ │ │ │ │ ├── CurveSegmentEditor.tsx │ │ │ │ │ │ │ │ ├── EasingOption.tsx │ │ │ │ │ │ │ │ ├── SVGCurveSegment.tsx │ │ │ │ │ │ │ │ ├── colors.ts │ │ │ │ │ │ │ │ ├── shared.ts │ │ │ │ │ │ │ │ ├── useFreezableMemo.ts │ │ │ │ │ │ │ │ └── useUIOptionGrid.tsx │ │ │ │ │ │ │ ├── DeterminePropEditorForSingleKeyframe.tsx │ │ │ │ │ │ │ ├── SingleKeyframeDot.tsx │ │ │ │ │ │ │ ├── SingleKeyframeEditor.tsx │ │ │ │ │ │ │ ├── useSingleKeyframeInlineEditorPopover.tsx │ │ │ │ │ │ │ └── useTempTransactionEditingTools.tsx │ │ │ │ │ │ ├── DopeSheetBackground.tsx │ │ │ │ │ │ ├── DopeSheetSelectionView.tsx │ │ │ │ │ │ ├── FocusRangeCurtains.tsx │ │ │ │ │ │ ├── HorizontallyScrollableArea.tsx │ │ │ │ │ │ ├── KeyframeSnapTarget.tsx │ │ │ │ │ │ ├── LengthIndicator/ │ │ │ │ │ │ │ ├── LengthEditorPopover.tsx │ │ │ │ │ │ │ └── LengthIndicator.tsx │ │ │ │ │ │ ├── PrimitivePropRow.tsx │ │ │ │ │ │ ├── PropWithChildrenRow.tsx │ │ │ │ │ │ ├── Right.tsx │ │ │ │ │ │ ├── Row.tsx │ │ │ │ │ │ ├── SheetObjectRow.tsx │ │ │ │ │ │ ├── SheetRow.tsx │ │ │ │ │ │ ├── collectAggregateKeyframes.tsx │ │ │ │ │ │ └── keyframeRowUI/ │ │ │ │ │ │ └── ConnectorLine.tsx │ │ │ │ │ ├── selections.ts │ │ │ │ │ └── setCollapsedSheetObjectOrCompoundProp.tsx │ │ │ │ ├── FrameGrid/ │ │ │ │ │ ├── FrameGrid.tsx │ │ │ │ │ ├── StampsGrid.tsx │ │ │ │ │ └── createGrid.ts │ │ │ │ ├── FrameStampPositionProvider.tsx │ │ │ │ ├── GraphEditor/ │ │ │ │ │ ├── BasicKeyframedTrack/ │ │ │ │ │ │ ├── BasicKeyframedTrack.tsx │ │ │ │ │ │ └── KeyframeEditor/ │ │ │ │ │ │ ├── Curve.tsx │ │ │ │ │ │ ├── CurveHandle.tsx │ │ │ │ │ │ ├── GraphEditorDotNonScalar.tsx │ │ │ │ │ │ ├── GraphEditorDotScalar.tsx │ │ │ │ │ │ ├── GraphEditorNonScalarDash.tsx │ │ │ │ │ │ └── KeyframeEditor.tsx │ │ │ │ │ ├── GraphEditor.tsx │ │ │ │ │ └── PrimitivePropGraph.tsx │ │ │ │ ├── GraphEditorToggle.tsx │ │ │ │ ├── RightOverlay/ │ │ │ │ │ ├── DopeSnap.tsx │ │ │ │ │ ├── DopeSnapHitZoneUI.tsx │ │ │ │ │ ├── FocusRangeZone/ │ │ │ │ │ │ ├── FocusRangeStrip.tsx │ │ │ │ │ │ ├── FocusRangeThumb.tsx │ │ │ │ │ │ └── FocusRangeZone.tsx │ │ │ │ │ ├── FrameStamp.tsx │ │ │ │ │ ├── HorizontalScrollbar.tsx │ │ │ │ │ ├── Markers/ │ │ │ │ │ │ ├── MarkerDot.tsx │ │ │ │ │ │ ├── MarkerEditorPopover.tsx │ │ │ │ │ │ └── Markers.tsx │ │ │ │ │ ├── Playhead.tsx │ │ │ │ │ ├── PlayheadPositionPopover.tsx │ │ │ │ │ ├── RightOverlay.tsx │ │ │ │ │ └── TopStrip.tsx │ │ │ │ ├── SequenceEditorPanel.tsx │ │ │ │ ├── VerticalScrollContainer.tsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── layout.ts │ │ │ │ │ └── tree.ts │ │ │ │ └── whatPropIsHighlighted.ts │ │ │ ├── propEditors/ │ │ │ │ ├── DefaultValueIndicator.tsx │ │ │ │ ├── NextPrevKeyframeCursors.tsx │ │ │ │ ├── getNearbyKeyframesOfTrack.tsx │ │ │ │ ├── simpleEditors/ │ │ │ │ │ ├── BooleanPropEditor.tsx │ │ │ │ │ ├── FilePropEditor.tsx │ │ │ │ │ ├── ISimplePropEditorReactProps.ts │ │ │ │ │ ├── ImagePropEditor.tsx │ │ │ │ │ ├── NumberPropEditor.tsx │ │ │ │ │ ├── RgbaPropEditor.tsx │ │ │ │ │ ├── StringLiteralPropEditor.tsx │ │ │ │ │ ├── StringPropEditor.tsx │ │ │ │ │ └── simplePropEditorByPropType.ts │ │ │ │ ├── useEditingToolsForCompoundProp.tsx │ │ │ │ ├── useEditingToolsForSimpleProp.tsx │ │ │ │ └── utils/ │ │ │ │ ├── IEditingTools.tsx │ │ │ │ ├── PropConfigForType.ts │ │ │ │ ├── getPropTypeByPointer.tsx │ │ │ │ └── propNameTextCSS.tsx │ │ │ ├── selectors.ts │ │ │ ├── toolbars/ │ │ │ │ ├── ExtensionToolbar/ │ │ │ │ │ ├── ExtensionToolbar.tsx │ │ │ │ │ ├── Toolset.tsx │ │ │ │ │ └── tools/ │ │ │ │ │ ├── ExtensionFlyoutMenu.tsx │ │ │ │ │ ├── IconButton.tsx │ │ │ │ │ └── Switch.tsx │ │ │ │ ├── GlobalToolbar/ │ │ │ │ │ ├── GlobalToolbar.tsx │ │ │ │ │ ├── LeftStrip/ │ │ │ │ │ │ ├── AppButton/ │ │ │ │ │ │ │ └── AppButton.tsx │ │ │ │ │ │ ├── LeftStrip.tsx │ │ │ │ │ │ └── WorkspaceButton/ │ │ │ │ │ │ └── WorkspaceButton.tsx │ │ │ │ │ ├── MoreMenu/ │ │ │ │ │ │ └── MoreMenu.tsx │ │ │ │ │ ├── RightStrip/ │ │ │ │ │ │ ├── AuthState/ │ │ │ │ │ │ │ ├── AuthState.tsx │ │ │ │ │ │ │ ├── Avatar.tsx │ │ │ │ │ │ │ ├── Unauthorized.tsx │ │ │ │ │ │ │ └── shared.tsx │ │ │ │ │ │ └── RightStrip.tsx │ │ │ │ │ └── globalToolbarHooks.tsx │ │ │ │ └── PinButton.tsx │ │ │ ├── uiComponents/ │ │ │ │ ├── DetailPanelButton.tsx │ │ │ │ ├── ExternalLink.tsx │ │ │ │ ├── PointerEventsHandler.tsx │ │ │ │ ├── Popover/ │ │ │ │ │ ├── ArrowContext.tsx │ │ │ │ │ ├── BasicPopover.tsx │ │ │ │ │ ├── BasicTooltip.tsx │ │ │ │ │ ├── ErrorTooltip.tsx │ │ │ │ │ ├── MinimalTooltip.tsx │ │ │ │ │ ├── PopoverArrow.tsx │ │ │ │ │ ├── PopoverPositioner.tsx │ │ │ │ │ ├── SimplePopover.tsx │ │ │ │ │ ├── TooltipContext.tsx │ │ │ │ │ ├── TooltipWithIcon.tsx │ │ │ │ │ ├── usePopover.tsx │ │ │ │ │ ├── usePopoverPosition.ts │ │ │ │ │ └── useTooltip.tsx │ │ │ │ ├── RoomToClick.tsx │ │ │ │ ├── SVGIcon.tsx │ │ │ │ ├── ShowMousePosition.tsx │ │ │ │ ├── chordial/ │ │ │ │ │ ├── ChordialOverlay.tsx │ │ │ │ │ ├── ContextOverlay.tsx │ │ │ │ │ ├── PopoverOverlay.tsx │ │ │ │ │ ├── TooltipOverlay.tsx │ │ │ │ │ ├── chordialInternals.ts │ │ │ │ │ ├── contextActor.ts │ │ │ │ │ ├── gestureActor.ts │ │ │ │ │ ├── hoverActor.ts │ │ │ │ │ ├── mousedownActor.ts │ │ │ │ │ ├── popoverActor.ts │ │ │ │ │ ├── tooltipActor.ts │ │ │ │ │ └── useChodrial.tsx │ │ │ │ ├── colorPicker/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── EditingProvider.tsx │ │ │ │ │ │ ├── RgbaColorPicker.tsx │ │ │ │ │ │ └── common/ │ │ │ │ │ │ ├── Alpha.tsx │ │ │ │ │ │ ├── AlphaColorPicker.tsx │ │ │ │ │ │ ├── Hue.tsx │ │ │ │ │ │ ├── Interactive.tsx │ │ │ │ │ │ ├── Pointer.tsx │ │ │ │ │ │ └── Saturation.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useColorManipulation.ts │ │ │ │ │ │ ├── useEventCallback.ts │ │ │ │ │ │ └── useIsomorphicLayoutEffect.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── clamp.ts │ │ │ │ │ ├── compare.ts │ │ │ │ │ ├── convert.ts │ │ │ │ │ ├── round.ts │ │ │ │ │ └── validate.ts │ │ │ │ ├── createCursorLock.ts │ │ │ │ ├── form/ │ │ │ │ │ ├── BasicCheckbox.tsx │ │ │ │ │ ├── BasicNumberInput.tsx │ │ │ │ │ ├── BasicSelect.tsx │ │ │ │ │ ├── BasicStringInput.tsx │ │ │ │ │ └── BasicSwitch.tsx │ │ │ │ ├── icons/ │ │ │ │ │ ├── AddImage.tsx │ │ │ │ │ ├── ArrowClockwise.tsx │ │ │ │ │ ├── ArrowsOutCardinal.tsx │ │ │ │ │ ├── Bell.tsx │ │ │ │ │ ├── Camera.tsx │ │ │ │ │ ├── ChevronDown.tsx │ │ │ │ │ ├── ChevronLeft.tsx │ │ │ │ │ ├── ChevronRight.tsx │ │ │ │ │ ├── Cube.tsx │ │ │ │ │ ├── CubeFull.tsx │ │ │ │ │ ├── CubeHalf.tsx │ │ │ │ │ ├── CubeRendered.tsx │ │ │ │ │ ├── Details.tsx │ │ │ │ │ ├── DoubleChevronLeft.tsx │ │ │ │ │ ├── DoubleChevronRight.tsx │ │ │ │ │ ├── DropdownChevron.tsx │ │ │ │ │ ├── Ellipsis.tsx │ │ │ │ │ ├── EllipsisFill.tsx │ │ │ │ │ ├── GlobeSimple.tsx │ │ │ │ │ ├── Outline.tsx │ │ │ │ │ ├── Package.tsx │ │ │ │ │ ├── Resize.tsx │ │ │ │ │ ├── Trash.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── isSafari.ts │ │ │ │ ├── onPointerOutside.ts │ │ │ │ ├── selects/ │ │ │ │ │ └── BasicSelect.tsx │ │ │ │ ├── simpleContextMenu/ │ │ │ │ │ ├── ContextMenu/ │ │ │ │ │ │ ├── BaseMenu.tsx │ │ │ │ │ │ ├── ContextMenu.tsx │ │ │ │ │ │ └── Item.tsx │ │ │ │ │ ├── useContextMenu.tsx │ │ │ │ │ └── useMenu.tsx │ │ │ │ ├── toolbar/ │ │ │ │ │ ├── ToolbarButton.tsx │ │ │ │ │ ├── ToolbarDropdownSelect.tsx │ │ │ │ │ ├── ToolbarIconButton.tsx │ │ │ │ │ ├── ToolbarSwitchSelect.tsx │ │ │ │ │ └── ToolbarSwitchSelectContainer.ts │ │ │ │ ├── useBoundingClientRect.ts │ │ │ │ ├── useDebugRefreshEvery.tsx │ │ │ │ ├── useDrag.ts │ │ │ │ ├── useHotspot.ts │ │ │ │ ├── useHover.ts │ │ │ │ ├── useHoverWithoutDescendants.ts │ │ │ │ ├── useKeyDown.ts │ │ │ │ ├── useKeyDownCallback.tsx │ │ │ │ ├── useLockSet.ts │ │ │ │ ├── useLogger.tsx │ │ │ │ ├── useOnClickOutside.ts │ │ │ │ ├── useOnKeyDown.ts │ │ │ │ ├── usePresence.tsx │ │ │ │ └── useValToAtom.ts │ │ │ └── utils/ │ │ │ ├── absoluteDims.tsx │ │ │ ├── assets.ts │ │ │ ├── contextualWebComponents.tsx │ │ │ ├── createStudioSheetItemKey.ts │ │ │ ├── derive-utils.tsx │ │ │ ├── ids.ts │ │ │ ├── invariant.ts │ │ │ ├── mousePositionD.ts │ │ │ ├── renderInPortalInContext.tsx │ │ │ ├── selectClosestHTMLAncestor.ts │ │ │ └── useRefAndState.ts │ │ └── tsconfig.json │ ├── sync-server/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── devEnv/ │ │ │ └── cli.ts │ │ ├── docker-compose.yml │ │ ├── env.d.ts │ │ ├── package.json │ │ ├── prisma/ │ │ │ ├── .gitignore │ │ │ ├── migrations/ │ │ │ │ ├── 20230409105406_init/ │ │ │ │ │ └── migration.sql │ │ │ │ └── migration_lock.toml │ │ │ ├── schema.prisma │ │ │ └── seed.ts │ │ ├── src/ │ │ │ ├── appClient.ts │ │ │ ├── env.test.ts │ │ │ ├── env.ts │ │ │ ├── envSchema.ts │ │ │ ├── index.ts │ │ │ ├── prisma.ts │ │ │ ├── saaz/ │ │ │ │ └── index.ts │ │ │ ├── state/ │ │ │ │ └── schema.ts │ │ │ ├── trpc/ │ │ │ │ ├── index.ts │ │ │ │ └── routes/ │ │ │ │ ├── index.ts │ │ │ │ └── projectStateRouter.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ └── authUtils.ts │ │ └── tsconfig.json │ ├── theatric/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── devEnv/ │ │ │ ├── api-extractor.json │ │ │ ├── api-extractor.tsconfig.json │ │ │ ├── build.ts │ │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsconfig.json │ └── utils/ │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── devEnv/ │ │ ├── api-extractor.json │ │ ├── api-extractor.tsconfig.json │ │ ├── build.ts │ │ └── tsconfig.json │ ├── package.json │ ├── src/ │ │ ├── Nominal.ts │ │ ├── PointableSet.ts │ │ ├── SimpleCache.ts │ │ ├── WeakMapWithGetOrSet.ts │ │ ├── _logger/ │ │ │ ├── logger.shouldLog.test.ts │ │ │ ├── logger.test-helpers.ts │ │ │ ├── logger.test.ts │ │ │ └── logger.ts │ │ ├── basicFSM.ts │ │ ├── color.ts │ │ ├── deepEqual.ts │ │ ├── deepMergeWithCache.ts │ │ ├── defer.ts │ │ ├── delay.ts │ │ ├── devStringify.ts │ │ ├── didYouMean.ts │ │ ├── ellipsify.ts │ │ ├── errors.ts │ │ ├── getDeep.ts │ │ ├── globals.d.ts │ │ ├── index.ts │ │ ├── isMac.ts │ │ ├── keyboardUtils.ts │ │ ├── logger.ts │ │ ├── memoizeFn.ts │ │ ├── minimalOverride.ts │ │ ├── mutableSetDeep.ts │ │ ├── niceNumberUtils.test.ts │ │ ├── niceNumberUtils.ts │ │ ├── noop.ts │ │ ├── pathToProp.ts │ │ ├── persistAtom.ts │ │ ├── pointerDeep.ts │ │ ├── removePathFromObject.test.ts │ │ ├── removePathFromObject.ts │ │ ├── resolvedPromise.ts │ │ ├── sanitizers.ts │ │ ├── setDeepImmutable.ts │ │ ├── slashedPaths.ts │ │ ├── stableJsonStringify.ts │ │ ├── subPrism.ts │ │ ├── subscribeDebounced.ts │ │ ├── tightJsonStringify.test.ts │ │ ├── tightJsonStringify.ts │ │ ├── transformNumber.ts │ │ ├── types.ts │ │ ├── uniqueKeyForAnyObject.ts │ │ ├── updateDeep.ts │ │ ├── userReadableTypeOfValue.ts │ │ ├── valToAtom.ts │ │ └── waitForPrism.ts │ ├── tsconfig.json │ └── typedoc.json ├── render.yaml ├── tsconfig.base.json └── wallaby.conf.js