├── .editorconfig ├── .git-blame-ignore-revs ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ ├── research_spike.md │ └── specification.md ├── pull_request_template.md └── workflows │ ├── ci.yml │ ├── codeql-analysis.yml │ ├── end-to-end-tests.yml │ ├── loom-slack.yml │ ├── pr.yml │ └── release.yaml ├── .gitignore ├── .idea ├── .gitignore ├── GitLinkConfig.xml ├── copyright │ ├── AGPLv3.xml │ └── profiles_settings.xml ├── icon.svg ├── inspectionProfiles │ └── Project_Default.xml ├── modules.xml └── nx-angular-config.xml ├── .npmrc ├── .nvmrc ├── .pre-commit-config.yaml ├── .prettierignore ├── .prettierrc ├── .secrets.baseline ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── applications └── browser-extension │ ├── .env.example │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .storybook │ ├── main.js │ ├── preview-body.html │ └── preview.js │ ├── contrib │ ├── bricks │ │ ├── amazon-search.yaml │ │ ├── duckduckgo-search.yaml │ │ ├── ebay-search.yaml │ │ ├── google-scholar-table.yaml │ │ ├── google-search.yaml │ │ ├── hackernews.yaml │ │ ├── hubspot-contact-timeline.yaml │ │ ├── hubspot-person-search.yaml │ │ ├── linkedin-search.yaml │ │ ├── nytimes-org.yaml │ │ ├── pipedrive-person-activity.yaml │ │ ├── quora-search.yaml │ │ ├── reddit-search.yaml │ │ ├── yelp-search.yaml │ │ ├── youtube-search.yaml │ │ └── youtube.yaml │ ├── integrations │ │ ├── automation-anywhere-oauth2.yaml │ │ ├── automation-anywhere.yaml │ │ ├── google-bigquery-dataset.yaml │ │ ├── google-geocode.yaml │ │ ├── google-oauth2-pkce.yaml │ │ ├── google-sheet.yaml │ │ ├── greenhouse.yaml │ │ ├── hubspot.yaml │ │ ├── hunter.yaml │ │ ├── microsoft-oauth2-pkce.yaml │ │ ├── nytimes.yaml │ │ ├── pipedrive.yaml │ │ ├── pixiebrix.yaml │ │ ├── rapidapi.yaml │ │ ├── salesforce.yaml │ │ ├── serpapi.yaml │ │ ├── slack-hook.yaml │ │ └── uipath.yaml │ ├── raw │ │ └── hunter.txt │ ├── readers │ │ ├── apartments-reader.yaml │ │ ├── empty-jquery-reader.yaml │ │ ├── linkedin-contact-reader.yaml │ │ ├── linkedin-organization-reader.yaml │ │ ├── linkedin-profile-reader.yaml │ │ ├── redfin-reader.yaml │ │ ├── trello-card-reader.yaml │ │ └── zillow-reader.yaml │ ├── recipes │ │ ├── apartments-sheets.yaml │ │ ├── apartments-slack.yaml │ │ ├── contextMenus │ │ │ ├── amazon.yaml │ │ │ ├── duckduckgo.yaml │ │ │ ├── ebay.yaml │ │ │ ├── google.yaml │ │ │ ├── linkedin.yaml │ │ │ ├── quora.yaml │ │ │ ├── reddit.yaml │ │ │ ├── yelp.yaml │ │ │ └── youtube.yaml │ │ ├── definition-example.yaml │ │ ├── linkedin-company-news.yaml │ │ ├── linkedin-google-search.yaml │ │ ├── linkedin-hubspot.yaml │ │ ├── linkedin-pipedrive-panel.yaml │ │ ├── linkedin-salesforce-hunter.yaml │ │ ├── linkedin-scholar.yaml │ │ ├── linkedin-slack-person.yaml │ │ ├── pipedrive-workday.yaml │ │ ├── redfin-sheets.yaml │ │ ├── trello-slack.yaml │ │ ├── v3-example.txt │ │ ├── v3-optional-services-example.txt │ │ └── zillow-sheets.yaml │ └── starterBricks │ │ ├── apartments-property-button.yaml │ │ ├── linkedin-contact-info-button.yaml │ │ ├── linkedin-contact-info-entry.yaml │ │ ├── linkedin-menu-extension.yaml │ │ ├── linkedin-organization-button.yaml │ │ ├── linkedin-organization-panel.yaml │ │ ├── linkedin-person-panel.yaml │ │ ├── pipedrive-deal-panel.yaml │ │ ├── pipedrive-organization-extension.yaml │ │ ├── pipedrive-person-extension.yaml │ │ ├── redfin-button.yaml │ │ ├── selection-search.yaml │ │ ├── trello-card-action.yaml │ │ └── zillow-button.yaml │ ├── end-to-end-tests │ ├── README.md │ ├── env.ts │ ├── fixtures │ │ ├── authentication.ts │ │ ├── environmentCheck.ts │ │ ├── modDefinitions.ts │ │ ├── modDefinitions │ │ │ ├── README.md │ │ │ ├── brick-actions.yaml │ │ │ ├── brick-configuration.yaml │ │ │ └── simple-sidebar-panel.yaml │ │ ├── pageContext.ts │ │ ├── responses │ │ │ └── giphy-search.json │ │ ├── testBase.ts │ │ └── utils.ts │ ├── pageObjects │ │ ├── basePageObject.ts │ │ ├── constants.ts │ │ ├── extensionConsole │ │ │ ├── localIntegrationsPage.ts │ │ │ ├── modsPage.ts │ │ │ └── workshop │ │ │ │ ├── createWorkshopModPage.ts │ │ │ │ ├── editWorkshopModPage.ts │ │ │ │ ├── modEditor.ts │ │ │ │ └── workshopPage.ts │ │ ├── extensionsShortcutsPage.ts │ │ ├── external │ │ │ └── googleAuthPopup.ts │ │ ├── floatingActionButton.ts │ │ └── pageEditor │ │ │ ├── brickActionsPanel.ts │ │ │ ├── configurationForm.ts │ │ │ ├── createModModal.ts │ │ │ ├── dataPanel.ts │ │ │ ├── deactivateModModal.ts │ │ │ ├── modEditorPane.ts │ │ │ ├── modListingPanel.ts │ │ │ ├── pageEditorPage.ts │ │ │ └── utils.ts │ ├── setup │ │ ├── affiliated.setup.ts │ │ ├── unaffiliated.setup.ts │ │ └── utils.ts │ ├── tests │ │ ├── bricks │ │ │ └── sidebarEffects.spec.ts │ │ ├── deployments │ │ │ └── deploymentActivation.spec.ts │ │ ├── extensionConsole │ │ │ ├── activation.spec.ts │ │ │ ├── modsPage.spec.ts │ │ │ └── zapierModal.spec.ts │ │ ├── modLifecycle.spec.ts │ │ ├── pageEditor │ │ │ ├── addStarterBrick.spec.ts │ │ │ ├── addStarterBrick.spec.ts-snapshots │ │ │ │ └── Add-starter-brick-to-mod │ │ │ │ │ ├── add-button-starter-brick-to-mod.yaml │ │ │ │ │ ├── add-context-menu-starter-brick-to-mod.diff │ │ │ │ │ ├── add-quick-bar-starter-brick-to-mod.diff │ │ │ │ │ ├── add-sidebar-panel-starter-brick-to-mod.diff │ │ │ │ │ └── add-trigger-starter-brick-to-mod.diff │ │ │ ├── brickActions.spec.ts │ │ │ ├── brickActions.spec.ts-snapshots │ │ │ │ └── brick-actions-panel-behavior │ │ │ │ │ ├── brick-added.diff │ │ │ │ │ ├── brick-copied-to-another-mod.diff │ │ │ │ │ ├── brick-copy-pasted.diff │ │ │ │ │ ├── brick-removed.diff │ │ │ │ │ └── bricks-moved.diff │ │ │ ├── brickConfiguration.spec.ts │ │ │ ├── brickConfiguration.spec.ts-snapshots │ │ │ │ └── brick-configuration │ │ │ │ │ └── starter-brick-configuration-changes.diff │ │ │ ├── clearChanges.spec.ts │ │ │ ├── copyMod.spec.ts │ │ │ ├── copyMod.spec.ts-snapshots │ │ │ │ ├── copying-a-mod-that-uses-the-PixieBrix-API-is-copied-correctly │ │ │ │ │ ├── write-to-db-static-copy.diff │ │ │ │ │ └── write-to-db-static-origin.yaml │ │ │ │ └── run-a-copied-mod-with-a-built-in-integration │ │ │ │ │ ├── giphy-search-copy.diff │ │ │ │ │ └── giphy-search-origin.yaml │ │ │ ├── draftInjection.spec.ts │ │ │ ├── liveEditing.spec.ts │ │ │ ├── logsPane.spec.ts │ │ │ ├── modEditorPane.spec.ts │ │ │ ├── modEditorPane.spec.ts-snapshots │ │ │ │ └── mod-editor-pane-behavior │ │ │ │ │ ├── updated-inputs.diff │ │ │ │ │ └── updated-metadata.diff │ │ │ ├── modVariablesDefinition.spec.ts │ │ │ ├── modVariablesDefinition.spec.ts-snapshots │ │ │ │ ├── add-save-mod-variable-definition │ │ │ │ │ └── mod-variables-definition.yaml │ │ │ │ └── new-mod-variable-without-brick │ │ │ │ │ └── mod-variables-definition-no-brick.yaml │ │ │ ├── moveOrCopyModComponent.spec.ts │ │ │ ├── optionsArgs.spec.ts │ │ │ ├── saveMod.spec.ts │ │ │ └── specialPages.spec.ts │ │ ├── regressions │ │ │ ├── doNotCloseSidebarOnPageEditorSave.spec.ts │ │ │ ├── formFlicker.spec.ts │ │ │ ├── hideModalsOnPageEditorRefresh.spec.ts │ │ │ ├── sandboxBrickErrors.spec.ts │ │ │ ├── sidebarLinks.spec.ts │ │ │ └── welcomeStarterBricks.spec.ts │ │ ├── runtime │ │ │ ├── allFrames.spec.ts │ │ │ ├── customEvents.spec.ts │ │ │ ├── googleSheetsIntegration.spec.ts │ │ │ ├── insertAtCursor.spec.ts │ │ │ ├── localIntegrations.spec.ts │ │ │ ├── modVariables │ │ │ │ └── variableSync.spec.ts │ │ │ ├── sandbox.spec.ts │ │ │ ├── screenshotTab.spec.ts │ │ │ ├── setInputValue.spec.ts │ │ │ ├── sidebar │ │ │ │ ├── sidebarActivation.spec.ts │ │ │ │ ├── sidebarAuth.spec.ts │ │ │ │ ├── sidebarController.spec.ts │ │ │ │ ├── sidebarNavigation.spec.ts │ │ │ │ └── sidebarPanelTheme.spec.ts │ │ │ ├── srcdocFrames.spec.ts │ │ │ └── textSnippets.spec.ts │ │ ├── smoke │ │ │ ├── floatingActionButton.spec.ts │ │ │ ├── modsPage.spec.ts │ │ │ ├── pageEditor.spec.ts │ │ │ ├── sidebar.spec.ts │ │ │ └── workshopPage.spec.ts │ │ ├── telemetry │ │ │ └── errors.spec.ts │ │ └── workshop │ │ │ ├── createMod.spec.ts │ │ │ └── createMod.spec.ts-snapshots │ │ │ └── can-create-a-new-mod-from-a-yaml-definition-and-update-it │ │ │ ├── description-change.diff │ │ │ ├── final-definition.yaml │ │ │ ├── heading-change.diff │ │ │ └── no-changes.diff │ └── utils.ts │ ├── eslint-local-rules │ ├── index.js │ ├── noCrossBoundaryImports.js │ ├── noCrossBoundaryImports.test.js │ ├── noExpressionLiterals.js │ ├── noExpressionLiterals.test.js │ ├── noInvalidDataTestId.js │ ├── noInvalidDataTestId.test.js │ ├── noNullRtkQueryArgs.js │ ├── noNullRtkQueryArgs.test.js │ ├── noRestrictedSyntax.tsx │ ├── notBothLabelAndLockableProps.js │ ├── notBothLabelAndLockableProps.test.js │ ├── persistBackgroundData.js │ ├── persistBackgroundData.txt │ ├── preferAxiosMockAdapter.js │ ├── preferAxiosMockAdapter.test.js │ ├── preferNullish.js │ ├── preferNullish.test.js │ ├── preferNullishable.js │ ├── preferNullishable.test.js │ └── preferUsingStepsForLongTests.js │ ├── img │ ├── aa-logo-small.png │ ├── aa-logo.svg │ ├── beta-logo-small.svg │ ├── beta-logo.svg │ ├── blueprint-activation-complete.png │ ├── demo.gif │ ├── devtools-dock-bottom-icon.svg │ ├── devtools-docking-context-menu.png │ ├── devtools-pixiebrix-toolbar-hidden.png │ ├── devtools-pixiebrix-toolbar-screenshot.png │ ├── devtools-pixiebrix-toolbar-tab.png │ ├── devtools-shortcut-mac.svg │ ├── devtools-shortcut-windows.svg │ ├── example-permissions-dialog.png │ ├── home-pane-bg-illustration.png │ ├── home.svg │ ├── inspect-context-menu.png │ ├── logo-small.svg │ ├── logo.svg │ ├── marketplace.svg │ ├── paintbrush.svg │ └── workshop.svg │ ├── jest.config.js │ ├── package.json │ ├── playwright.config.ts │ ├── project.json │ ├── public │ └── mockServiceWorker.js │ ├── schemas │ ├── component.json │ ├── database.json │ ├── draft-07.json │ ├── effect.json │ ├── element.json │ ├── extensionPoint.json │ ├── googleSheetId.json │ ├── icon.json │ ├── innerDefinition.json │ ├── key.json │ ├── metadata.json │ ├── pipeline.json │ ├── reader.json │ ├── recipe.json │ ├── ref.json │ ├── renderer.json │ └── service.json │ ├── scripts │ ├── DiscardFilePlugin.mjs │ ├── __snapshots__ │ │ └── manifest.test.js.snap │ ├── env.d.ts │ ├── env.mjs │ ├── manifest.mjs │ ├── manifest.test.js │ ├── rainforest-qa-local.sh │ ├── show-pr-e2e-report.sh │ ├── upload-extension.sh │ ├── upload-sourcemaps.sh │ └── uploadMixpanelLexicon.ts │ ├── src │ ├── Storyshots.test.js │ ├── __mocks__ │ │ ├── @ │ │ │ ├── auth │ │ │ │ ├── featureFlagStorage.ts │ │ │ │ └── useLinkState.ts │ │ │ ├── background │ │ │ │ └── messenger │ │ │ │ │ └── api.ts │ │ │ ├── components │ │ │ │ ├── DelayedRender.tsx │ │ │ │ ├── Stylesheets.tsx │ │ │ │ └── asyncIcon.ts │ │ │ ├── contentScript │ │ │ │ └── focusCaptureDialog.ts │ │ │ ├── data │ │ │ │ └── service │ │ │ │ │ └── apiClient.js │ │ │ ├── hooks │ │ │ │ └── useContextInvalidated.ts │ │ │ ├── icons │ │ │ │ ├── getSvgIcon.ts │ │ │ │ └── list.ts │ │ │ ├── sandbox │ │ │ │ └── messenger │ │ │ │ │ └── api.ts │ │ │ ├── store │ │ │ │ └── deactivateModHelpers.ts │ │ │ ├── telemetry │ │ │ │ ├── logging.ts │ │ │ │ ├── reportError.ts │ │ │ │ ├── reportEvent.ts │ │ │ │ └── telemetryHelpers.ts │ │ │ └── utils │ │ │ │ ├── expectContext.ts │ │ │ │ ├── injectScriptTag.ts │ │ │ │ ├── injectStylesheet.ts │ │ │ │ └── shadowWrap.js │ │ ├── @xobotyi │ │ │ └── scrollbar-width.js │ │ ├── browserMock.mjs │ │ ├── connected-react-router.js │ │ ├── fit-textarea.js │ │ ├── holderjs.js │ │ ├── react-virtualized-auto-sizer.js │ │ ├── readme.md │ │ ├── redux-state-sync.js │ │ ├── stringMock.js │ │ ├── webext-detect.ts │ │ └── webext-messenger.js │ ├── __snapshots__ │ │ └── Storyshots.test.js.snap │ ├── activation │ │ ├── ActivationLink.tsx │ │ ├── PersonalDeploymentField.tsx │ │ ├── WizardValuesModIntegrationsContextAdapter.tsx │ │ ├── activateLinkClickHandler.test.tsx │ │ ├── activateLinkClickHandler.ts │ │ ├── activationLinkUtils.test.ts │ │ ├── activationLinkUtils.ts │ │ ├── mapModComponentDefinitionToActivatedModComponent.ts │ │ ├── modOptionsHelpers.ts │ │ ├── useActivateMod.test.ts │ │ ├── useActivateMod.ts │ │ ├── useActivateModWizard.test.tsx │ │ ├── useActivateModWizard.ts │ │ ├── useOrganizationActivationPolicy.ts │ │ └── wizardTypes.ts │ ├── analysis │ │ ├── AnalysisAnnotationsContext.ts │ │ ├── ReduxAnalysisManager.ts │ │ ├── analysisSelectors.ts │ │ ├── analysisSlice.ts │ │ ├── analysisTypes.ts │ │ ├── analysisVisitors │ │ │ ├── baseAnalysisVisitors.ts │ │ │ ├── brickIdVisitor.ts │ │ │ ├── brickTypeAnalysis.test.ts │ │ │ ├── brickTypeAnalysis.ts │ │ │ ├── conditionAnalysis.test.ts │ │ │ ├── conditionAnalysis.ts │ │ │ ├── eventNameAnalysis │ │ │ │ ├── checkEventNamesAnalysis.test.ts │ │ │ │ ├── checkEventNamesAnalysis.ts │ │ │ │ ├── collectEventNamesVisitor.test.ts │ │ │ │ └── collectEventNamesVisitor.ts │ │ │ ├── formBrickAnalysis.ts │ │ │ ├── httpRequestAnalysis.test.ts │ │ │ ├── httpRequestAnalysis.ts │ │ │ ├── modComponentUrlPatternAnalysis.test.ts │ │ │ ├── modComponentUrlPatternAnalysis.ts │ │ │ ├── outputKeyAnalysis.test.ts │ │ │ ├── outputKeyAnalysis.ts │ │ │ ├── pageStateAnalysis │ │ │ │ ├── modVariableSchemasVisitor.test.ts │ │ │ │ ├── modVariableSchemasVisitor.ts │ │ │ │ ├── pageStateAnalysis.test.ts │ │ │ │ └── pageStateAnalysis.ts │ │ │ ├── regexAnalysis.ts │ │ │ ├── regexAnalysisTest.test.ts │ │ │ ├── renderersAnalysis.ts │ │ │ ├── requestPermissionAnalysis.test.ts │ │ │ ├── requestPermissionAnalysis.ts │ │ │ ├── selectorAnalysis.test.ts │ │ │ ├── selectorAnalysis.ts │ │ │ ├── templateAnalysis.test.ts │ │ │ ├── templateAnalysis.ts │ │ │ ├── traceAnalysis.test.ts │ │ │ ├── traceAnalysis.ts │ │ │ └── varAnalysis │ │ │ │ ├── parseTemplateVariables.test.ts │ │ │ │ ├── parseTemplateVariables.ts │ │ │ │ ├── varAnalysis.test.ts │ │ │ │ ├── varAnalysis.ts │ │ │ │ ├── varMap.test.ts │ │ │ │ └── varMap.ts │ │ ├── asyncAnalysisQueue.test.ts │ │ └── asyncAnalysisQueue.ts │ ├── auth │ │ ├── RequireAuth.test.tsx │ │ ├── RequireAuth.tsx │ │ ├── RequireScope.tsx │ │ ├── ScopeSettings.module.scss │ │ ├── ScopeSettings.tsx │ │ ├── authConstants.ts │ │ ├── authSelectors.ts │ │ ├── authSlice.ts │ │ ├── authStorage.test.ts │ │ ├── authStorage.ts │ │ ├── authTypes.ts │ │ ├── authUtils.ts │ │ ├── deploymentKey.ts │ │ ├── featureFlagStorage.test.ts │ │ ├── featureFlagStorage.ts │ │ ├── featureFlags.ts │ │ ├── isAuthenticationAxiosError.ts │ │ ├── selectAuthUserOrganizations.ts │ │ ├── useLinkState.ts │ │ ├── usePartnerAuthData.ts │ │ ├── useRequiredPartnerAuth.test.tsx │ │ └── useRequiredPartnerAuth.ts │ ├── background │ │ ├── auth │ │ │ ├── authHelpers.test.ts │ │ │ ├── authHelpers.ts │ │ │ ├── authStorage.ts │ │ │ ├── codeGrantFlow.ts │ │ │ ├── getToken.test.ts │ │ │ ├── getToken.ts │ │ │ ├── implicitGrantFlow.ts │ │ │ ├── launchInteractiveOAuth2Flow.ts │ │ │ ├── launchOAuth2Flow.test.ts │ │ │ ├── launchOAuth2Flow.ts │ │ │ └── partnerIntegrations │ │ │ │ ├── getPartnerPrincipals.test.ts │ │ │ │ ├── getPartnerPrincipals.ts │ │ │ │ ├── launchAuthIntegration.test.ts │ │ │ │ ├── launchAuthIntegration.ts │ │ │ │ ├── refreshPartnerAuthentication.test.ts │ │ │ │ ├── refreshPartnerAuthentication.ts │ │ │ │ └── types.ts │ │ ├── axiosFetch.ts │ │ ├── background.ts │ │ ├── backgroundDomWatcher.ts │ │ ├── backgroundPlatform.ts │ │ ├── browserAction.ts │ │ ├── capture.ts │ │ ├── clipboard.ts │ │ ├── contentScript.test.ts │ │ ├── contentScript.ts │ │ ├── contextMenus │ │ │ ├── ensureContextMenu.ts │ │ │ ├── initContextMenus.test.ts │ │ │ ├── initContextMenus.ts │ │ │ ├── makeMenuId.ts │ │ │ ├── preloadContextMenus.ts │ │ │ └── uninstallContextMenu.ts │ │ ├── deploymentUpdater.test.ts │ │ ├── deploymentUpdater.ts │ │ ├── executor.test.ts │ │ ├── executor.ts │ │ ├── externalProtocol.ts │ │ ├── getBuiltInIntegrationConfigs.ts │ │ ├── initBrowserCommands.ts │ │ ├── initTheme.ts │ │ ├── installer.test.ts │ │ ├── installer.ts │ │ ├── integrationConfigLocator.ts │ │ ├── messenger │ │ │ ├── api.ts │ │ │ ├── external │ │ │ │ ├── _implementation.ts │ │ │ │ ├── api.ts │ │ │ │ └── registration.ts │ │ │ └── registration.ts │ │ ├── modUpdater.test.ts │ │ ├── modUpdater.ts │ │ ├── navigation.ts │ │ ├── partnerHandlers.ts │ │ ├── performConfiguredRequest.test.ts │ │ ├── proxyUtils.test.ts │ │ ├── proxyUtils.ts │ │ ├── refreshRegistries.ts │ │ ├── refreshToken.test.ts │ │ ├── refreshToken.ts │ │ ├── removeModComponentForEveryTab.ts │ │ ├── requests.test.ts │ │ ├── requests.ts │ │ ├── restrictUnauthenticatedUrlAccess.test.ts │ │ ├── restrictUnauthenticatedUrlAccess.ts │ │ ├── setToolbarBadge.test.ts │ │ ├── setToolbarIconFromTheme.test.ts │ │ ├── setToolbarIconFromTheme.ts │ │ ├── sidePanel.ts │ │ ├── stateControllerListeners.test.ts │ │ ├── stateControllerListeners.ts │ │ ├── tabs.ts │ │ ├── teamTrialUpdater.ts │ │ ├── telemetry.test.ts │ │ ├── telemetry.ts │ │ ├── toolbarBadge.ts │ │ ├── utils │ │ │ ├── deactivateMod.test.ts │ │ │ ├── deactivateMod.ts │ │ │ ├── deactivateModInstancesAndSaveState.ts │ │ │ └── saveModComponentStateAndReloadTabs.ts │ │ ├── walkthroughModalTrigger.ts │ │ ├── welcomeMods.test.ts │ │ └── welcomeMods.ts │ ├── bricks │ │ ├── PipelineExpressionVisitor.test.ts │ │ ├── PipelineExpressionVisitor.ts │ │ ├── PipelineVisitor.test.ts │ │ ├── PipelineVisitor.ts │ │ ├── available.test.ts │ │ ├── available.ts │ │ ├── brickFilterHelpers.ts │ │ ├── effects │ │ │ ├── AddDynamicTextSnippet.test.ts │ │ │ ├── AddDynamicTextSnippet.ts │ │ │ ├── AddQuickBarAction.test.ts │ │ │ ├── AddQuickBarAction.tsx │ │ │ ├── AddTextSnippets.test.ts │ │ │ ├── AddTextSnippets.ts │ │ │ ├── CancelEffect.test.ts │ │ │ ├── CancelEffect.ts │ │ │ ├── CancelEphemeralElements.ts │ │ │ ├── CommentOptions.test.tsx │ │ │ ├── CommentOptions.tsx │ │ │ ├── InsertAtCursorEffect.test.ts │ │ │ ├── InsertAtCursorEffect.ts │ │ │ ├── TelemetryEffect.ts │ │ │ ├── ToggleQuickbarEffect.ts │ │ │ ├── __snapshots__ │ │ │ │ └── highlight.test.ts.snap │ │ │ ├── alert.test.ts │ │ │ ├── alert.ts │ │ │ ├── assignModVariable.test.ts │ │ │ ├── assignModVariable.ts │ │ │ ├── attachAutocomplete.test.ts │ │ │ ├── attachAutocomplete.ts │ │ │ ├── captureAudio.ts │ │ │ ├── clipboard.test.ts │ │ │ ├── clipboard.ts │ │ │ ├── comment.test.ts │ │ │ ├── comment.ts │ │ │ ├── confetti.ts │ │ │ ├── customEvent.test.ts │ │ │ ├── customEvent.ts │ │ │ ├── disable.test.ts │ │ │ ├── disable.ts │ │ │ ├── enable.test.ts │ │ │ ├── enable.ts │ │ │ ├── error.test.ts │ │ │ ├── error.ts │ │ │ ├── event.test.ts │ │ │ ├── event.ts │ │ │ ├── exportCsv.ts │ │ │ ├── exportFileEffect.test.ts │ │ │ ├── exportFileEffect.ts │ │ │ ├── forms.test.ts │ │ │ ├── forms.ts │ │ │ ├── getAllEffects.ts │ │ │ ├── hide.test.ts │ │ │ ├── hide.ts │ │ │ ├── highlight.test.ts │ │ │ ├── highlight.ts │ │ │ ├── highlightText.test.ts │ │ │ ├── highlightText.ts │ │ │ ├── insertHtml.ts │ │ │ ├── logger.ts │ │ │ ├── pageState.test.ts │ │ │ ├── pageState.ts │ │ │ ├── postMessage.test.ts │ │ │ ├── postMessage.ts │ │ │ ├── reactivate.ts │ │ │ ├── redirectPage.ts │ │ │ ├── replaceText.test.ts │ │ │ ├── replaceText.ts │ │ │ ├── scrollIntoView.ts │ │ │ ├── scrollToElement.test.ts │ │ │ ├── setToolbarBadge.test.ts │ │ │ ├── setToolbarBadge.ts │ │ │ ├── show.test.ts │ │ │ ├── show.ts │ │ │ ├── sidebarEffects.ts │ │ │ ├── sound.ts │ │ │ ├── submitPanel.test.ts │ │ │ ├── submitPanel.ts │ │ │ ├── tabs.ts │ │ │ ├── tourEffect.test.ts │ │ │ ├── tourEffect.ts │ │ │ ├── vue.ts │ │ │ ├── wait.test.ts │ │ │ └── wait.ts │ │ ├── errors.ts │ │ ├── exampleBrickConfigs.ts │ │ ├── hooks │ │ │ └── useTypedBrickMap.ts │ │ ├── readers │ │ │ ├── ArrayCompositeReader.ts │ │ │ ├── BlankReader.ts │ │ │ ├── CompositeReader.ts │ │ │ ├── DocumentReader.test.ts │ │ │ ├── DocumentReader.ts │ │ │ ├── ElementReader.test.ts │ │ │ ├── ElementReader.ts │ │ │ ├── HtmlReader.ts │ │ │ ├── ImageExifReader.ts │ │ │ ├── ImageReader.ts │ │ │ ├── ManifestReader.ts │ │ │ ├── PageMetadataReader.ts │ │ │ ├── PageSemanticReader.ts │ │ │ ├── ProfileReader.ts │ │ │ ├── SelectionReader.ts │ │ │ ├── SessionReader.ts │ │ │ ├── TimestampReader.test.ts │ │ │ ├── TimestampReader.ts │ │ │ ├── factory.ts │ │ │ ├── frameworkReader.ts │ │ │ ├── getAllReaders.ts │ │ │ ├── jquery.test.ts │ │ │ ├── jquery.ts │ │ │ ├── readerUtils.ts │ │ │ └── window.ts │ │ ├── registerBuiltinBricks.ts │ │ ├── registry.test.ts │ │ ├── registry.ts │ │ ├── renderers │ │ │ ├── CustomFormComponent.test.tsx │ │ │ ├── CustomFormComponent.tsx │ │ │ ├── HtmlRenderer.test.ts │ │ │ ├── HtmlRenderer.ts │ │ │ ├── MarkdownRenderer.test.tsx │ │ │ ├── MarkdownRenderer.ts │ │ │ ├── PropertyTree.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── customForm.test.tsx.snap │ │ │ │ └── table.test.ts.snap │ │ │ ├── customForm.css │ │ │ ├── customForm.test.tsx │ │ │ ├── customForm.tsx │ │ │ ├── dataTable.ts │ │ │ ├── document.tsx │ │ │ ├── documentView │ │ │ │ ├── DocumentView.tsx │ │ │ │ └── DocumentViewProps.tsx │ │ │ ├── getAllRenderers.ts │ │ │ ├── iframe.ts │ │ │ ├── propertyTable.tsx │ │ │ ├── table.test.ts │ │ │ └── table.tsx │ │ ├── rootModeHelpers.ts │ │ ├── transformers │ │ │ ├── FormData.test.ts │ │ │ ├── FormData.ts │ │ │ ├── GetBrickInterfaceTransformer.test.ts │ │ │ ├── GetBrickInterfaceTransformer.ts │ │ │ ├── IdentityTransformer.test.ts │ │ │ ├── IdentityTransformer.ts │ │ │ ├── IdentityTransformerOptions.test.tsx │ │ │ ├── IdentityTransformerOptions.tsx │ │ │ ├── ParseJson.ts │ │ │ ├── RunBrickByIdTransformer.test.ts │ │ │ ├── RunBrickByIdTransformer.ts │ │ │ ├── RunMetadataTransformer.test.ts │ │ │ ├── RunMetadataTransformer.ts │ │ │ ├── __snapshots__ │ │ │ │ └── parseDate.test.ts.snap │ │ │ ├── ai │ │ │ │ ├── LocalChatCompletion.ts │ │ │ │ ├── LocalPrompt.ts │ │ │ │ ├── LocalSummarization.ts │ │ │ │ └── domAiHelpers.ts │ │ │ ├── brickFactory.test.ts │ │ │ ├── brickFactory.ts │ │ │ ├── component │ │ │ │ ├── ComponentReader.ts │ │ │ │ ├── TableReader.test.ts │ │ │ │ └── TableReader.ts │ │ │ ├── controlFlow │ │ │ │ ├── ForEach.test.ts │ │ │ │ ├── ForEach.ts │ │ │ │ ├── ForEachElement.test.ts │ │ │ │ ├── ForEachElement.ts │ │ │ │ ├── IfElse.test.ts │ │ │ │ ├── IfElse.ts │ │ │ │ ├── MapValues.test.ts │ │ │ │ ├── MapValues.ts │ │ │ │ ├── Retry.test.ts │ │ │ │ ├── Retry.ts │ │ │ │ ├── Run.test.ts │ │ │ │ ├── Run.ts │ │ │ │ ├── TryExcept.test.ts │ │ │ │ ├── TryExcept.ts │ │ │ │ ├── WithAsyncModVariable.test.ts │ │ │ │ ├── WithAsyncModVariable.ts │ │ │ │ ├── WithCache.test.ts │ │ │ │ └── WithCache.ts │ │ │ ├── convertDocument.test.ts │ │ │ ├── convertDocument.ts │ │ │ ├── detect.test.ts │ │ │ ├── detect.ts │ │ │ ├── encode.ts │ │ │ ├── ephemeralForm │ │ │ │ ├── EphemeralForm.test.tsx │ │ │ │ ├── EphemeralForm.tsx │ │ │ │ ├── EphemeralFormContent.tsx │ │ │ │ ├── formTransformer.test.ts │ │ │ │ └── formTransformer.ts │ │ │ ├── extensionDiagnostics.ts │ │ │ ├── getAllTransformers.ts │ │ │ ├── httpGet.ts │ │ │ ├── javascript.test.ts │ │ │ ├── javascript.ts │ │ │ ├── jq.test.ts │ │ │ ├── jq.ts │ │ │ ├── jquery │ │ │ │ ├── JQueryReader.test.ts │ │ │ │ ├── JQueryReader.ts │ │ │ │ ├── JQueryReaderOptions.module.scss │ │ │ │ ├── JQueryReaderOptions.test.tsx │ │ │ │ └── JQueryReaderOptions.tsx │ │ │ ├── jsonPath.ts │ │ │ ├── mapping.ts │ │ │ ├── parseCsv.ts │ │ │ ├── parseDataUrl.test.ts │ │ │ ├── parseDataUrl.ts │ │ │ ├── parseDate.test.ts │ │ │ ├── parseDate.ts │ │ │ ├── parseJson.test.ts │ │ │ ├── parseUrl.test.ts │ │ │ ├── parseUrl.ts │ │ │ ├── prompt.ts │ │ │ ├── randomNumber.test.ts │ │ │ ├── randomNumber.ts │ │ │ ├── readable.test.ts │ │ │ ├── readable.ts │ │ │ ├── regex.test.ts │ │ │ ├── regex.ts │ │ │ ├── remoteMethod.ts │ │ │ ├── screenshotTab.ts │ │ │ ├── searchText.test.ts │ │ │ ├── searchText.ts │ │ │ ├── selectElement.test.ts │ │ │ ├── selectElement.ts │ │ │ ├── splitText.test.ts │ │ │ ├── splitText.ts │ │ │ ├── template.ts │ │ │ ├── temporaryInfo │ │ │ │ ├── DisplayTemporaryInfo.test.ts │ │ │ │ ├── DisplayTemporaryInfo.ts │ │ │ │ ├── EphemeralPanel.module.scss │ │ │ │ ├── EphemeralPanel.test.tsx │ │ │ │ ├── EphemeralPanel.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── EphemeralPanel.test.tsx.snap │ │ │ │ ├── messenger │ │ │ │ │ ├── api.ts │ │ │ │ │ └── registration.ts │ │ │ │ ├── receiverProtocol.test.ts │ │ │ │ ├── receiverProtocol.ts │ │ │ │ ├── temporaryPanelProtocol.test.ts │ │ │ │ └── useTemporaryPanelDefinition.ts │ │ │ ├── traverseElements.test.ts │ │ │ ├── traverseElements.ts │ │ │ └── url.ts │ │ ├── types.ts │ │ ├── util.test.ts │ │ └── util.ts │ ├── components │ │ ├── AceEditor.tsx │ │ ├── AceEditorSync.tsx │ │ ├── Alert.tsx │ │ ├── AsyncButton.stories.tsx │ │ ├── AsyncButton.tsx │ │ ├── AsyncStateGate.test.tsx │ │ ├── AsyncStateGate.tsx │ │ ├── BlockFormSubmissionViaEnterIfFirstChild.tsx │ │ ├── Centered.tsx │ │ ├── ClickableElement.test.tsx │ │ ├── ClickableElement.tsx │ │ ├── ConfirmNavigationModal.tsx │ │ ├── ConfirmationModal.stories.tsx │ │ ├── ConfirmationModal.tsx │ │ ├── DatabaseUnresponsiveBanner.test.tsx │ │ ├── DatabaseUnresponsiveBanner.tsx │ │ ├── DelayedRender.test.tsx │ │ ├── DelayedRender.tsx │ │ ├── DiffEditor.tsx │ │ ├── DiffEditorSync.tsx │ │ ├── Effect.tsx │ │ ├── EmotionShadowRoot.ts │ │ ├── ErrorBoundary.tsx │ │ ├── GridLoader.stories.tsx │ │ ├── InvalidatedContextGate.test.tsx │ │ ├── InvalidatedContextGate.tsx │ │ ├── IsolatedComponent.scss │ │ ├── IsolatedComponent.tsx │ │ ├── LayoutWidget.tsx │ │ ├── LinkButton.module.scss │ │ ├── LinkButton.stories.tsx │ │ ├── LinkButton.tsx │ │ ├── Loader.module.scss │ │ ├── Loader.stories.tsx │ │ ├── Loader.tsx │ │ ├── Markdown.tsx │ │ ├── MarkdownInline.test.tsx │ │ ├── MarkdownInline.tsx │ │ ├── MarketplaceListingIcon.tsx │ │ ├── MarketplaceListingModIcon.module.scss │ │ ├── ModalLayout.tsx │ │ ├── OfficialBadge.tsx │ │ ├── PackageIcon.tsx │ │ ├── StopPropagation.test.tsx │ │ ├── StopPropagation.tsx │ │ ├── Stylesheets.test.tsx │ │ ├── Stylesheets.tsx │ │ ├── StylesheetsContext.ts │ │ ├── TooltipIconButton.tsx │ │ ├── UnstyledButton.module.scss │ │ ├── UnstyledButton.tsx │ │ ├── __snapshots__ │ │ │ └── MarkdownInline.test.tsx.snap │ │ ├── annotationAlert │ │ │ ├── FieldAnnotationAlert.module.scss │ │ │ ├── FieldAnnotationAlert.stories.tsx │ │ │ ├── FieldAnnotationAlert.test.tsx │ │ │ ├── FieldAnnotationAlert.tsx │ │ │ └── __snapshots__ │ │ │ │ └── FieldAnnotationAlert.test.tsx.snap │ │ ├── asyncCard │ │ │ └── AsyncCard.tsx │ │ ├── asyncIcon.ts │ │ ├── banner │ │ │ ├── Banner.module.scss │ │ │ ├── Banner.stories.tsx │ │ │ └── Banner.tsx │ │ ├── ellipsisMenu │ │ │ ├── EllipsisMenu.module.scss │ │ │ ├── EllipsisMenu.stories.tsx │ │ │ ├── EllipsisMenu.test.tsx │ │ │ └── EllipsisMenu.tsx │ │ ├── errors │ │ │ ├── ErrorDetail.module.scss │ │ │ ├── InputValidationErrorDetail.tsx │ │ │ ├── InvalidSelectorErrorDetail.tsx │ │ │ ├── NetworkErrorDetail.tsx │ │ │ ├── OutputValidationErrorDetail.tsx │ │ │ ├── RemoteApiErrorDetail.tsx │ │ │ ├── __snapshots__ │ │ │ │ └── getErrorDetails.test.tsx.snap │ │ │ ├── getErrorDetails.test.tsx │ │ │ └── getErrorDetails.tsx │ │ ├── fields │ │ │ ├── IconWidget.tsx │ │ │ ├── fieldUtils.test.ts │ │ │ ├── fieldUtils.ts │ │ │ ├── optionsRegistry.ts │ │ │ └── schemaFields │ │ │ │ ├── AppApiIntegrationDependencyField.tsx │ │ │ │ ├── BasicSchemaField.test.tsx │ │ │ │ ├── BasicSchemaField.tsx │ │ │ │ ├── CssClassField.tsx │ │ │ │ ├── CssSpacingField.tsx │ │ │ │ ├── DatabaseGroupSelect.tsx │ │ │ │ ├── FieldRuntimeContext.ts │ │ │ │ ├── HeadingStyleField.tsx │ │ │ │ ├── RemoteSchemaObjectField.stories.tsx │ │ │ │ ├── RemoteSchemaObjectField.test.tsx │ │ │ │ ├── RemoteSchemaObjectField.tsx │ │ │ │ ├── RootAwareField.tsx │ │ │ │ ├── SchemaField.stories.tsx │ │ │ │ ├── SchemaField.test.tsx │ │ │ │ ├── SchemaField.tsx │ │ │ │ ├── SchemaFieldContext.tsx │ │ │ │ ├── WorkshopMessage.module.scss │ │ │ │ ├── WorkshopMessage.tsx │ │ │ │ ├── defaultFieldFactory.tsx │ │ │ │ ├── fieldInputMode.test.ts │ │ │ │ ├── fieldInputMode.ts │ │ │ │ ├── fieldTypeCheckers.test.ts │ │ │ │ ├── fieldTypeCheckers.ts │ │ │ │ ├── genericOptionsFactory.tsx │ │ │ │ ├── getToggleOptions.test.ts │ │ │ │ ├── getToggleOptions.tsx │ │ │ │ ├── integrations │ │ │ │ ├── IntegrationAuthSelectWidget.stories.tsx │ │ │ │ ├── IntegrationAuthSelectWidget.tsx │ │ │ │ ├── IntegrationDependencyField.tsx │ │ │ │ ├── IntegrationDependencyWidget.test.tsx │ │ │ │ ├── IntegrationDependencyWidget.tsx │ │ │ │ ├── integrationDependencyFieldUtils.test.ts │ │ │ │ └── integrationDependencyFieldUtils.ts │ │ │ │ ├── optionIcon │ │ │ │ ├── OptionIcon.module.scss │ │ │ │ ├── OptionIcon.tsx │ │ │ │ └── icons │ │ │ │ │ ├── array.svg │ │ │ │ │ ├── exclude.svg │ │ │ │ │ ├── key.svg │ │ │ │ │ ├── number.svg │ │ │ │ │ ├── object.svg │ │ │ │ │ ├── querySelector.svg │ │ │ │ │ ├── select.svg │ │ │ │ │ ├── text.svg │ │ │ │ │ ├── toggle.svg │ │ │ │ │ └── var.svg │ │ │ │ ├── propTypes.ts │ │ │ │ ├── schemaFieldTypes.ts │ │ │ │ ├── schemaFieldUtils.test.ts │ │ │ │ ├── schemaFieldUtils.ts │ │ │ │ ├── schemaUtils.test.ts │ │ │ │ ├── schemaUtils.ts │ │ │ │ ├── selectFieldUtils.test.ts │ │ │ │ ├── selectFieldUtils.ts │ │ │ │ ├── testHelpers.ts │ │ │ │ └── widgets │ │ │ │ ├── ArrayWidget.module.scss │ │ │ │ ├── ArrayWidget.test.tsx │ │ │ │ ├── ArrayWidget.tsx │ │ │ │ ├── BooleanWidget.tsx │ │ │ │ ├── CodeEditorWidget.stories.tsx │ │ │ │ ├── CodeEditorWidget.test.tsx │ │ │ │ ├── CodeEditorWidget.tsx │ │ │ │ ├── DatabaseCreateModal.tsx │ │ │ │ ├── DatabaseWidget.tsx │ │ │ │ ├── FixedInnerObjectWidget.test.tsx │ │ │ │ ├── FixedInnerObjectWidget.tsx │ │ │ │ ├── HeadingStyleWidget.module.scss │ │ │ │ ├── HeadingStyleWidget.tsx │ │ │ │ ├── IntegerWidget.tsx │ │ │ │ ├── NumberWidget.tsx │ │ │ │ ├── ObjectWidget.test.tsx │ │ │ │ ├── ObjectWidget.tsx │ │ │ │ ├── OmitFieldWidget.tsx │ │ │ │ ├── PasswordWidget.module.scss │ │ │ │ ├── PasswordWidget.tsx │ │ │ │ ├── SchemaButtonVariantWidget.module.scss │ │ │ │ ├── SchemaButtonVariantWidget.test.tsx │ │ │ │ ├── SchemaButtonVariantWidget.tsx │ │ │ │ ├── SchemaCustomEventWidget.tsx │ │ │ │ ├── SchemaSelectWidget.test.tsx │ │ │ │ ├── SchemaSelectWidget.tsx │ │ │ │ ├── TemplateToggleWidget.module.scss │ │ │ │ ├── TemplateToggleWidget.tsx │ │ │ │ ├── TextWidget.stories.tsx │ │ │ │ ├── TextWidget.test.tsx │ │ │ │ ├── TextWidget.tsx │ │ │ │ ├── UnsupportedWidget.tsx │ │ │ │ ├── UrlMatchPatternWidget.tsx │ │ │ │ ├── WidgetLoadingIndicator.tsx │ │ │ │ ├── WorkshopMessageWidget.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ ├── ArrayWidget.test.tsx.snap │ │ │ │ ├── CodeEditorWidget.test.tsx.snap │ │ │ │ ├── FixedInnerObjectWidget.test.tsx.snap │ │ │ │ ├── ObjectWidget.test.tsx.snap │ │ │ │ ├── SchemaButtonVariantWidget.test.tsx.snap │ │ │ │ ├── SchemaSelectWidget.test.tsx.snap │ │ │ │ └── TextWidget.test.tsx.snap │ │ │ │ ├── cssClassWidgets │ │ │ │ ├── CssClassWidget.module.scss │ │ │ │ ├── CssClassWidget.stories.tsx │ │ │ │ ├── CssClassWidget.test.tsx │ │ │ │ ├── CssClassWidget.tsx │ │ │ │ ├── CssSpacingWidget.module.scss │ │ │ │ ├── CssSpacingWidget.stories.tsx │ │ │ │ ├── CssSpacingWidget.test.tsx │ │ │ │ ├── CssSpacingWidget.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── CssClassWidget.test.tsx.snap │ │ │ │ │ └── CssSpacingWidget.test.tsx.snap │ │ │ │ ├── types.ts │ │ │ │ ├── utils.test.ts │ │ │ │ └── utils.ts │ │ │ │ ├── registerDefaultWidgets.ts │ │ │ │ ├── templateToggleWidgetTypes.tsx │ │ │ │ ├── urlMatchPatternWidgetTypes.tsx │ │ │ │ ├── varPopup │ │ │ │ ├── SourceLabel.module.scss │ │ │ │ ├── SourceLabel.tsx │ │ │ │ ├── VarMenu.module.scss │ │ │ │ ├── VarMenu.test.tsx │ │ │ │ ├── VarMenu.tsx │ │ │ │ ├── VarPopup.tsx │ │ │ │ ├── VariablesTree.stories.tsx │ │ │ │ ├── VariablesTree.test.tsx │ │ │ │ ├── VariablesTree.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── VarMenu.test.tsx.snap │ │ │ │ │ └── VariablesTree.test.tsx.snap │ │ │ │ ├── getMenuOptions.test.ts │ │ │ │ ├── getMenuOptions.ts │ │ │ │ ├── likelyVariableUtils.test.ts │ │ │ │ ├── likelyVariableUtils.ts │ │ │ │ ├── menuFilters.test.ts │ │ │ │ ├── menuFilters.ts │ │ │ │ ├── popoverTheme.ts │ │ │ │ ├── useAttachPopup.ts │ │ │ │ ├── useKeyboardNavigation.test.ts │ │ │ │ ├── useKeyboardNavigation.ts │ │ │ │ ├── useTreeRow.ts │ │ │ │ ├── utils.ts │ │ │ │ └── varSelectors.ts │ │ │ │ ├── widgetUtils.test.ts │ │ │ │ ├── widgetUtils.ts │ │ │ │ └── widgetsRegistry.ts │ │ ├── floatingActions │ │ │ ├── ActionButton.tsx │ │ │ ├── FloatingActions.scss │ │ │ ├── FloatingActions.tsx │ │ │ ├── floatingActionsConstants.ts │ │ │ ├── initFloatingActions.ts │ │ │ └── store.ts │ │ ├── form │ │ │ ├── ConnectedFieldTemplate.test.tsx │ │ │ ├── ConnectedFieldTemplate.tsx │ │ │ ├── FieldAnnotation.ts │ │ │ ├── FieldTemplate.module.scss │ │ │ ├── FieldTemplate.test.tsx │ │ │ ├── FieldTemplate.tsx │ │ │ ├── Form.module.scss │ │ │ ├── Form.stories.tsx │ │ │ ├── Form.tsx │ │ │ ├── lockedLabel │ │ │ │ ├── LockedStarterBrickLabel.module.scss │ │ │ │ └── LockedStarterBrickLabel.tsx │ │ │ ├── makeFieldActionForAnnotationAction.test.tsx │ │ │ ├── makeFieldActionForAnnotationAction.ts │ │ │ ├── makeFieldAnnotationsForValue.ts │ │ │ ├── popoverInfoLabel │ │ │ │ ├── PopoverInfoLabel.module.scss │ │ │ │ ├── PopoverInfoLabel.stories.tsx │ │ │ │ └── PopoverInfoLabel.tsx │ │ │ └── widgets │ │ │ │ ├── AsyncRemoteSelectWidget.test.tsx │ │ │ │ ├── AsyncRemoteSelectWidget.tsx │ │ │ │ ├── FieldTemplateLocalErrorContext.ts │ │ │ │ ├── KeyNameWidget.tsx │ │ │ │ ├── RegistryIdWidget.module.scss │ │ │ │ ├── RegistryIdWidget.test.tsx │ │ │ │ ├── RegistryIdWidget.tsx │ │ │ │ ├── RemoteMultiSelectWidget.test.tsx │ │ │ │ ├── RemoteMultiSelectWidget.tsx │ │ │ │ ├── RemoteSelectWidget.test.tsx │ │ │ │ ├── RemoteSelectWidget.tsx │ │ │ │ ├── SelectWidget.test.tsx │ │ │ │ ├── SelectWidget.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ └── SelectWidget.test.tsx.snap │ │ │ │ ├── createMenuListWithAddButton.tsx │ │ │ │ ├── switchButton │ │ │ │ ├── SwitchButtonWidget.module.scss │ │ │ │ ├── SwitchButtonWidget.stories.tsx │ │ │ │ ├── SwitchButtonWidget.test.tsx │ │ │ │ ├── SwitchButtonWidget.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── SwitchButtonWidget.test.tsx.snap │ │ │ │ ├── useAddCreatablePlaceholder.ts │ │ │ │ ├── useOptionsResolver.test.ts │ │ │ │ └── useOptionsResolver.ts │ │ ├── formBuilder │ │ │ ├── BaseInputTemplate.test.tsx │ │ │ ├── BaseInputTemplate.tsx │ │ │ ├── DescriptionField.tsx │ │ │ ├── DescriptionFieldTemplate.tsx │ │ │ ├── FieldTemplate.module.scss │ │ │ ├── FieldTemplate.tsx │ │ │ ├── RjsfSubmitContext.ts │ │ │ ├── RjsfTemplates.ts │ │ │ ├── demo │ │ │ │ ├── FormBuilderDemo.module.scss │ │ │ │ ├── FormBuilderDemo.stories.tsx │ │ │ │ ├── FormBuilderDemo.test.tsx │ │ │ │ └── FormBuilderDemo.tsx │ │ │ ├── edit │ │ │ │ ├── ActiveField.tsx │ │ │ │ ├── FormEditor.test.tsx │ │ │ │ ├── FormEditor.tsx │ │ │ │ ├── FormIntroFields.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── FormEditor.test.tsx.snap │ │ │ │ └── fieldEditor │ │ │ │ │ ├── FieldEditor.module.scss │ │ │ │ │ ├── FieldEditor.tsx │ │ │ │ │ ├── RichTextFields.tsx │ │ │ │ │ └── TextAreaFields.tsx │ │ │ ├── formBuilderHelpers.test.ts │ │ │ ├── formBuilderHelpers.ts │ │ │ ├── formBuilderTypes.ts │ │ │ ├── preview │ │ │ │ ├── FormPreview.test.tsx │ │ │ │ ├── FormPreview.tsx │ │ │ │ ├── FormPreviewSchemaField.tsx │ │ │ │ ├── ImageCropWidgetPreview.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── FormPreview.test.tsx.snap │ │ │ ├── schemaFieldNames.ts │ │ │ ├── testHelpers.ts │ │ │ └── widgets │ │ │ │ ├── ImageCropWidget.tsx │ │ │ │ ├── RichTextWidget.test.tsx │ │ │ │ ├── RichTextWidget.tsx │ │ │ │ ├── RjsfSelectWidget.test.tsx │ │ │ │ ├── RjsfSelectWidget.tsx │ │ │ │ ├── TextAreaWidget.module.scss │ │ │ │ ├── TextAreaWidget.test.tsx │ │ │ │ └── TextAreaWidget.tsx │ │ ├── imagePlaceholder │ │ │ ├── ImagePlaceholder.stories.tsx │ │ │ └── ImagePlaceholder.tsx │ │ ├── integrations │ │ │ ├── AuthWidget.module.scss │ │ │ ├── AuthWidget.test.tsx │ │ │ ├── AuthWidget.tsx │ │ │ ├── IntegrationConfigEditorModal.module.scss │ │ │ ├── IntegrationConfigEditorModal.stories.tsx │ │ │ ├── IntegrationConfigEditorModal.test.tsx │ │ │ ├── IntegrationConfigEditorModal.tsx │ │ │ ├── integrationHelpers.test.ts │ │ │ └── integrationHelpers.ts │ │ ├── isolatedComponentList.d.ts │ │ ├── isolatedComponentList.mjs │ │ ├── jsonTree │ │ │ ├── JsonTree.module.scss │ │ │ ├── JsonTree.stories.tsx │ │ │ ├── JsonTree.test.tsx │ │ │ ├── JsonTree.tsx │ │ │ └── treeHooks.tsx │ │ ├── logViewer │ │ │ ├── EntryRow.module.scss │ │ │ ├── EntryRow.tsx │ │ │ ├── LogCard.test.tsx │ │ │ ├── LogCard.tsx │ │ │ ├── LogTable.module.scss │ │ │ ├── LogTable.stories.tsx │ │ │ ├── LogTable.tsx │ │ │ ├── LogToolbar.stories.tsx │ │ │ ├── LogToolbar.tsx │ │ │ ├── __snapshots__ │ │ │ │ └── LogCard.test.tsx.snap │ │ │ ├── details │ │ │ │ ├── InputDetail.tsx │ │ │ │ └── OutputDetail.tsx │ │ │ ├── logSelectors.ts │ │ │ ├── logSlice.ts │ │ │ ├── logViewerTypes.ts │ │ │ ├── useLogEntriesView.ts │ │ │ └── usePollModLogs.ts │ │ ├── onboarding │ │ │ ├── OnboardingChecklistCard.module.scss │ │ │ ├── OnboardingChecklistCard.stories.tsx │ │ │ └── OnboardingChecklistCard.tsx │ │ ├── packageSearchModal │ │ │ ├── PackageDetail.tsx │ │ │ ├── PackageResult.tsx │ │ │ ├── PackageSearchModal.module.scss │ │ │ ├── PackageSearchModal.tsx │ │ │ ├── QuickAdd.module.scss │ │ │ └── QuickAdd.tsx │ │ ├── paginatedTable │ │ │ ├── PaginatedTable.module.scss │ │ │ ├── PaginatedTable.test.tsx │ │ │ └── PaginatedTable.tsx │ │ ├── pagination │ │ │ ├── Pagination.stories.tsx │ │ │ ├── Pagination.test.tsx │ │ │ ├── Pagination.tsx │ │ │ └── __snapshots__ │ │ │ │ └── Pagination.test.tsx.snap │ │ ├── quickBar │ │ │ ├── QuickBarApp.module.scss │ │ │ ├── QuickBarApp.test.tsx │ │ │ ├── QuickBarApp.tsx │ │ │ ├── QuickBarResults.tsx │ │ │ ├── __snapshots__ │ │ │ │ └── QuickBarApp.test.tsx.snap │ │ │ ├── defaultActions.tsx │ │ │ ├── quickBarRegistry.ts │ │ │ ├── quickBarTheme.tsx │ │ │ ├── quickbarTypes.ts │ │ │ ├── useActionGenerators.test.tsx │ │ │ ├── useActionGenerators.ts │ │ │ ├── useActions.test.tsx │ │ │ ├── useActions.ts │ │ │ └── utils.ts │ │ ├── richTextEditor │ │ │ ├── ErrorContext.tsx │ │ │ ├── ErrorToast.tsx │ │ │ ├── RichTextEditor.module.scss │ │ │ ├── RichTextEditor.stories.tsx │ │ │ ├── RichTextEditor.test.tsx │ │ │ ├── RichTextEditor.tsx │ │ │ └── toolbar │ │ │ │ ├── BoldButton.tsx │ │ │ │ ├── BulletedListButton.tsx │ │ │ │ ├── HeadingLevelDropdown.tsx │ │ │ │ ├── HorizontalRuleButton.tsx │ │ │ │ ├── ImageButton │ │ │ │ ├── index.tsx │ │ │ │ └── useFilePicker.ts │ │ │ │ ├── ItalicButton.tsx │ │ │ │ ├── LinkButton │ │ │ │ ├── LinkButton.module.scss │ │ │ │ ├── LinkEditForm.tsx │ │ │ │ ├── LinkPreviewActions.tsx │ │ │ │ ├── UrlInputPopover.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ │ ├── NumberedListButton.tsx │ │ │ │ ├── RemoveTextFormattingButton.tsx │ │ │ │ ├── StrikethroughButton.tsx │ │ │ │ ├── Toolbar.module.scss │ │ │ │ ├── Toolbar.tsx │ │ │ │ ├── ToolbarOverflow.tsx │ │ │ │ └── UnderlineButton.tsx │ │ ├── schemaTree │ │ │ ├── SchemaTree.module.scss │ │ │ ├── SchemaTree.stories.tsx │ │ │ └── SchemaTree.tsx │ │ ├── selectionToolPopover │ │ │ ├── SelectionToolPopover.module.scss │ │ │ ├── SelectionToolPopover.stories.tsx │ │ │ ├── SelectionToolPopover.tsx │ │ │ └── showSelectionToolPopover.tsx │ │ ├── tabLayout │ │ │ ├── EditorTabLayout.module.scss │ │ │ ├── EditorTabLayout.test.tsx │ │ │ ├── EditorTabLayout.tsx │ │ │ └── __snapshots__ │ │ │ │ └── EditorTabLayout.test.tsx.snap │ │ ├── teamTrials │ │ │ ├── TeamTrialBanner.test.tsx │ │ │ ├── TeamTrialBanner.tsx │ │ │ ├── TrialAwareButton.test.tsx │ │ │ ├── TrialAwareButton.tsx │ │ │ ├── TrialCallToActionLink.tsx │ │ │ ├── useGetAllTeamScopes.ts │ │ │ └── useTeamTrialStatus.ts │ │ └── walkthroughModal │ │ │ ├── WalkthroughModal.module.scss │ │ │ ├── WalkthroughModalApp.tsx │ │ │ └── showWalkthroughModal.ts │ ├── contentScript │ │ ├── activationConstants.ts │ │ ├── audio.ts │ │ ├── contentScript.scss │ │ ├── contentScript.ts │ │ ├── contentScriptCore.ts │ │ ├── contentScriptPlatform.test.ts │ │ ├── contentScriptPlatform.ts │ │ ├── context.ts │ │ ├── contextMenus.ts │ │ ├── elementReference.test.ts │ │ ├── elementReference.ts │ │ ├── ephemeralForm.ts │ │ ├── ephemeralPanel.ts │ │ ├── ephemeralPanelController.tsx │ │ ├── executor.ts │ │ ├── focusCaptureDialog.scss │ │ ├── focusCaptureDialog.ts │ │ ├── integrations │ │ │ ├── LoginBanners.scss │ │ │ ├── LoginBanners.test.tsx │ │ │ ├── LoginBanners.tsx │ │ │ ├── bannerDomController.tsx │ │ │ ├── deferredLoginController.test.tsx │ │ │ ├── deferredLoginController.ts │ │ │ └── deferredLoginTypes.ts │ │ ├── lifecycle.test.ts │ │ ├── lifecycle.ts │ │ ├── loadActivationEnhancements.ts │ │ ├── loadActivationEnhancementsCore.test.ts │ │ ├── loadActivationEnhancementsCore.ts │ │ ├── messenger │ │ │ ├── api.ts │ │ │ ├── registration.ts │ │ │ └── runBrickTypes.ts │ │ ├── modalDom.tsx │ │ ├── pageEditor │ │ │ ├── beautify.ts │ │ │ ├── draft │ │ │ │ ├── overlay.ts │ │ │ │ ├── runStarterBrickReaderPreview.ts │ │ │ │ └── updateDraftModComponent.ts │ │ │ ├── elementInformation.test.ts │ │ │ ├── elementInformation.ts │ │ │ ├── elementPicker.test.ts │ │ │ ├── elementPicker.ts │ │ │ ├── insertButton.tsx │ │ │ ├── resetTab.ts │ │ │ ├── runBrickPreview.ts │ │ │ ├── runRendererBrick.ts │ │ │ ├── selectElement.test.ts │ │ │ ├── selectElement.ts │ │ │ └── types.ts │ │ ├── partnerIntegrations.ts │ │ ├── performanceMonitoring.test.ts │ │ ├── performanceMonitoring.ts │ │ ├── pipelineProtocol │ │ │ ├── runHeadlessPipeline.ts │ │ │ ├── runMapArgs.ts │ │ │ ├── runRendererPipeline.ts │ │ │ └── types.ts │ │ ├── platform │ │ │ └── contentScriptPlatformProtocol.ts │ │ ├── popover.scss │ │ ├── popoverDom.ts │ │ ├── ready.ts │ │ ├── setExtensionIdInApp.ts │ │ ├── sidebarActivation.ts │ │ ├── sidebarController.tsx │ │ ├── snippetShortcutMenu │ │ │ ├── SnippetShortcutMenu.scss │ │ │ ├── SnippetShortcutMenu.stories.tsx │ │ │ ├── SnippetShortcutMenu.test.tsx │ │ │ ├── SnippetShortcutMenu.tsx │ │ │ ├── snippetShortcutMenuController.test.tsx │ │ │ ├── snippetShortcutMenuController.tsx │ │ │ ├── snippetShortcutMenuSlice.test.ts │ │ │ ├── snippetShortcutMenuSlice.ts │ │ │ ├── snippetShortcutRegistry.ts │ │ │ ├── snippetShortcutUtils.test.ts │ │ │ ├── snippetShortcutUtils.ts │ │ │ ├── useKeyboardQuery.ts │ │ │ └── useSnippetShortcutRegistry.ts │ │ ├── stateController │ │ │ ├── modVariablePolicyController.ts │ │ │ ├── stateController.test.ts │ │ │ ├── stateController.ts │ │ │ └── stateEventHelpers.ts │ │ ├── textEditorDom.ts │ │ ├── textSelectionMenu │ │ │ ├── ActionRegistry.test.ts │ │ │ ├── ActionRegistry.ts │ │ │ ├── SelectionMenu.scss │ │ │ ├── SelectionMenu.stories.tsx │ │ │ ├── SelectionMenu.tsx │ │ │ ├── selectionMenuController.test.ts │ │ │ ├── selectionMenuController.tsx │ │ │ └── useActionRegistry.ts │ │ ├── tooltipDom.ts │ │ └── walkthroughModalProtocol.tsx │ ├── contrib │ │ ├── automationanywhere │ │ │ ├── ApiTaskOptions.tsx │ │ │ ├── AwaitResultField.tsx │ │ │ ├── BotOptions.test.tsx │ │ │ ├── BotOptions.tsx │ │ │ ├── FolderIdConfigAlert.tsx │ │ │ ├── RemoteFileInputArguments.tsx │ │ │ ├── RemoteFileSelectField.test.tsx │ │ │ ├── RemoteFileSelectField.tsx │ │ │ ├── RunApiTask.test.ts │ │ │ ├── RunApiTask.ts │ │ │ ├── RunBot.test.ts │ │ │ ├── RunBot.ts │ │ │ ├── SetCopilotDataEffect.ts │ │ │ ├── WorkspaceTypeField.tsx │ │ │ ├── __snapshots__ │ │ │ │ └── BotOptions.test.tsx.snap │ │ │ ├── aaApi.test.ts │ │ │ ├── aaApi.ts │ │ │ ├── aaFrameProtocol.ts │ │ │ ├── aaTypes.ts │ │ │ ├── aaUtils.test.ts │ │ │ ├── aaUtils.ts │ │ │ ├── contract.ts │ │ │ ├── useWorkspaceTypeOptionsFactoryArgs.ts │ │ │ └── util.ts │ │ ├── ckeditor │ │ │ ├── ckeditor.test.ts │ │ │ ├── ckeditorDom.ts │ │ │ └── ckeditorProtocol.ts │ │ ├── deepgram │ │ │ └── deepgramTypes.ts │ │ ├── draftjs │ │ │ └── draftJsDom.ts │ │ ├── editors.ts │ │ ├── google │ │ │ ├── geocode.ts │ │ │ └── sheets │ │ │ │ ├── bricks │ │ │ │ ├── append.test.ts │ │ │ │ ├── append.ts │ │ │ │ ├── lookup.test.ts │ │ │ │ └── lookup.ts │ │ │ │ ├── core │ │ │ │ ├── getSheetIdIntegrationOutputKey.ts │ │ │ │ ├── getSheetServiceOutputKey.test.ts │ │ │ │ ├── handleGoogleRequestRejection.ts │ │ │ │ ├── schemas.ts │ │ │ │ ├── sheetsApi.test.ts │ │ │ │ ├── sheetsApi.ts │ │ │ │ ├── sheetsHelpers.test.ts │ │ │ │ ├── sheetsHelpers.ts │ │ │ │ ├── types.ts │ │ │ │ ├── useGoogleAccount.ts │ │ │ │ ├── useSpreadsheetId.test.tsx │ │ │ │ └── useSpreadsheetId.ts │ │ │ │ └── ui │ │ │ │ ├── AppendSpreadsheetOptions.test.tsx │ │ │ │ ├── AppendSpreadsheetOptions.tsx │ │ │ │ ├── LookupSpreadsheetOptions.test.tsx │ │ │ │ ├── LookupSpreadsheetOptions.tsx │ │ │ │ ├── RequireGoogleSheet.tsx │ │ │ │ ├── SpreadsheetPickerWidget.module.scss │ │ │ │ ├── SpreadsheetPickerWidget.test.tsx │ │ │ │ ├── SpreadsheetPickerWidget.tsx │ │ │ │ ├── TabField.test.tsx │ │ │ │ └── TabField.tsx │ │ ├── hubspot │ │ │ └── upsert.ts │ │ ├── navigationRules.ts │ │ ├── pipedrive │ │ │ ├── create.ts │ │ │ ├── readers.ts │ │ │ └── resolvers.ts │ │ ├── registerContribBricks.ts │ │ ├── remoteOptionUtils.ts │ │ ├── salesforce │ │ │ ├── lead.ts │ │ │ └── navigation.ts │ │ ├── slack │ │ │ └── message.ts │ │ ├── uipath │ │ │ ├── ProcessOptions.test.tsx │ │ │ ├── ProcessOptions.tsx │ │ │ ├── __snapshots__ │ │ │ │ └── ProcessOptions.test.tsx.snap │ │ │ ├── process.ts │ │ │ ├── typeUtils.ts │ │ │ ├── uipathContract.ts │ │ │ └── uipathHooks.ts │ │ └── zapier │ │ │ ├── PushOptions.tsx │ │ │ ├── contract.ts │ │ │ └── push.ts │ ├── data │ │ ├── model │ │ │ ├── Asset.ts │ │ │ ├── ControlRoom.ts │ │ │ ├── Me.ts │ │ │ ├── MeTeam.ts │ │ │ ├── MeTeamMembership.ts │ │ │ ├── MeUserGroupMembership.ts │ │ │ ├── PartnerPrincipal.ts │ │ │ ├── Team.ts │ │ │ ├── TeamMembershipGroups.ts │ │ │ ├── TeamMembershipUser.ts │ │ │ ├── TeamMemberships.ts │ │ │ ├── TeamTheme.ts │ │ │ ├── UserMilestone.ts │ │ │ ├── UserPartner.ts │ │ │ └── UserRole.ts │ │ └── service │ │ │ ├── api.test.tsx │ │ │ ├── api.ts │ │ │ ├── apiClient.test.ts │ │ │ ├── apiClient.ts │ │ │ ├── apiVersioning.ts │ │ │ ├── backgroundApi.ts │ │ │ ├── baseQuery.ts │ │ │ ├── baseService.test.ts │ │ │ ├── baseService.ts │ │ │ ├── constants.ts │ │ │ ├── errorService.test.ts │ │ │ ├── errorService.ts │ │ │ ├── requestErrorUtils.ts │ │ │ ├── responseTypeHelpers.ts │ │ │ └── urlPaths.ts │ ├── development │ │ ├── darkMode.js │ │ ├── errorsBadge.ts │ │ ├── headers.test.ts │ │ ├── hooks │ │ │ ├── useMessengerLogging.ts │ │ │ └── useRenderCount.ts │ │ ├── messengerLogging.ts │ │ ├── runtimeLogging.ts │ │ └── visualInjection.ts │ ├── domConstants.ts │ ├── errors │ │ ├── authErrors.ts │ │ ├── businessErrors.test.ts │ │ ├── businessErrors.ts │ │ ├── clientRequestErrors.test.ts │ │ ├── clientRequestErrors.ts │ │ ├── contextInvalidated.test.ts │ │ ├── contextInvalidated.ts │ │ ├── errorHelpers.test.tsx │ │ ├── errorHelpers.ts │ │ ├── genericErrors.ts │ │ ├── knownErrorMessages.ts │ │ ├── networkErrorHelpers.test.ts │ │ ├── networkErrorHelpers.ts │ │ └── rejectOnCancelled.ts │ ├── extensionConsole │ │ ├── App.tsx │ │ ├── Navbar.module.scss │ │ ├── Navbar.test.tsx │ │ ├── Navbar.tsx │ │ ├── Sidebar.test.tsx │ │ ├── Sidebar.tsx │ │ ├── SidebarLink.tsx │ │ ├── __snapshots__ │ │ │ └── Navbar.test.tsx.snap │ │ ├── components │ │ │ ├── IDBErrorDisplay.stories.tsx │ │ │ ├── IDBErrorDisplay.tsx │ │ │ ├── RequireBrickRegistry.tsx │ │ │ └── ServiceFieldError.tsx │ │ ├── options.html │ │ ├── options.scss │ │ ├── options.tsx │ │ ├── pages │ │ │ ├── BrowserBanner.test.tsx │ │ │ ├── BrowserBanner.tsx │ │ │ ├── InvitationBanner.tsx │ │ │ ├── UpdateBanner.tsx │ │ │ ├── __snapshots__ │ │ │ │ └── BrowserBanner.test.tsx.snap │ │ │ ├── activateMod │ │ │ │ ├── ActivateModCard.module.scss │ │ │ │ ├── ActivateModCard.tsx │ │ │ │ ├── ActivateModPage.test.tsx │ │ │ │ ├── ActivateModPage.tsx │ │ │ │ ├── IntegrationDescriptor.tsx │ │ │ │ ├── IntegrationsBody.module.scss │ │ │ │ ├── IntegrationsBody.test.tsx │ │ │ │ ├── IntegrationsBody.tsx │ │ │ │ ├── OptionsBody.stories.tsx │ │ │ │ ├── OptionsBody.test.tsx │ │ │ │ ├── OptionsBody.tsx │ │ │ │ ├── PermissionsBody.tsx │ │ │ │ ├── UrlPermissionsList.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── ActivateModPage.test.tsx.snap │ │ │ │ │ └── OptionsBody.test.tsx.snap │ │ │ │ └── useModPermissions.ts │ │ │ ├── deployments │ │ │ │ ├── CountdownTimer.stories.tsx │ │ │ │ ├── DeploymentBanner.tsx │ │ │ │ ├── DeploymentModal.stories.tsx │ │ │ │ ├── DeploymentModal.test.tsx │ │ │ │ ├── DeploymentModal.tsx │ │ │ │ ├── DeploymentsContext.test.tsx │ │ │ │ ├── DeploymentsContext.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── DeploymentModal.test.tsx.snap │ │ │ │ ├── activateDeployments.ts │ │ │ │ ├── useAutoDeploy.test.ts │ │ │ │ ├── useAutoDeploy.ts │ │ │ │ └── useDeactivateUnassignedDeploymentsEffect.ts │ │ │ ├── integrations │ │ │ │ ├── ConnectExtensionCard.tsx │ │ │ │ ├── IntegrationsPage.tsx │ │ │ │ ├── PrivateIntegrationsCard.module.scss │ │ │ │ ├── PrivateIntegrationsCard.tsx │ │ │ │ └── ZapierIntegrationModal.tsx │ │ │ ├── mods │ │ │ │ ├── GetStartedView.module.scss │ │ │ │ ├── GetStartedView.stories.tsx │ │ │ │ ├── GetStartedView.tsx │ │ │ │ ├── ListFilters.module.scss │ │ │ │ ├── ModsPage.stories.tsx │ │ │ │ ├── ModsPage.test.tsx │ │ │ │ ├── ModsPage.tsx │ │ │ │ ├── ModsPageActions.test.tsx │ │ │ │ ├── ModsPageActions.tsx │ │ │ │ ├── ModsPageContent.tsx │ │ │ │ ├── ModsPageSidebar.module.scss │ │ │ │ ├── ModsPageSidebar.tsx │ │ │ │ ├── ModsPageTableLayout.module.scss │ │ │ │ ├── ModsPageTableLayout.test.tsx │ │ │ │ ├── ModsPageTableLayout.tsx │ │ │ │ ├── ModsPageToolbar.tsx │ │ │ │ ├── Status.module.scss │ │ │ │ ├── Status.test.tsx │ │ │ │ ├── Status.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── ModsPageTableLayout.test.tsx.snap │ │ │ │ ├── emptyView │ │ │ │ │ ├── EmptyView.module.scss │ │ │ │ │ └── EmptyView.tsx │ │ │ │ ├── gridView │ │ │ │ │ ├── GridCard.module.scss │ │ │ │ │ ├── GridCard.tsx │ │ │ │ │ ├── GridCardErrorBoundary.tsx │ │ │ │ │ ├── GridView.module.scss │ │ │ │ │ ├── GridView.test.ts │ │ │ │ │ └── GridView.tsx │ │ │ │ ├── labels │ │ │ │ │ ├── LastUpdatedLabel.module.scss │ │ │ │ │ ├── LastUpdatedLabel.tsx │ │ │ │ │ ├── SharingLabel.module.scss │ │ │ │ │ └── SharingLabel.tsx │ │ │ │ ├── listView │ │ │ │ │ ├── ListGroupHeader.tsx │ │ │ │ │ ├── ListItem.module.scss │ │ │ │ │ ├── ListItem.tsx │ │ │ │ │ ├── ListItemErrorBoundary.tsx │ │ │ │ │ └── ListView.tsx │ │ │ │ ├── modals │ │ │ │ │ ├── Modals.tsx │ │ │ │ │ ├── modLogsModal │ │ │ │ │ │ ├── ModLogsModal.module.scss │ │ │ │ │ │ └── ModLogsModal.tsx │ │ │ │ │ ├── modModalsSelectors.ts │ │ │ │ │ ├── modModalsSlice.ts │ │ │ │ │ └── shareModals │ │ │ │ │ │ ├── CancelPublishContent.tsx │ │ │ │ │ │ ├── EditPublishContent.tsx │ │ │ │ │ │ ├── ModOwnerLabel.tsx │ │ │ │ │ │ ├── PublishContentLayout.tsx │ │ │ │ │ │ ├── PublishModContent.tsx │ │ │ │ │ │ ├── PublishModModals.test.tsx │ │ │ │ │ │ ├── PublishModModals.tsx │ │ │ │ │ │ ├── PublishedContent.tsx │ │ │ │ │ │ ├── ShareModModal.tsx │ │ │ │ │ │ ├── ShareModModalBody.tsx │ │ │ │ │ │ ├── ShareModals.module.scss │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── PublishModModals.test.tsx.snap │ │ │ │ │ │ ├── useHasEditPermissions.ts │ │ │ │ │ │ └── useSortOrganizations.ts │ │ │ │ ├── modsPageSelectors.ts │ │ │ │ ├── modsPageSlice.ts │ │ │ │ ├── modsPageTypes.ts │ │ │ │ ├── onboardingView │ │ │ │ │ ├── OnboardingView.module.scss │ │ │ │ │ ├── OnboardingView.stories.tsx │ │ │ │ │ ├── OnboardingView.test.tsx │ │ │ │ │ ├── OnboardingView.tsx │ │ │ │ │ └── useOnboarding.tsx │ │ │ │ └── utils │ │ │ │ │ ├── buildGetCanEditModScope.test.ts │ │ │ │ │ ├── buildGetCanEditModScope.ts │ │ │ │ │ ├── buildGetModActivationStatus.test.ts │ │ │ │ │ ├── buildGetModActivationStatus.ts │ │ │ │ │ ├── buildGetModSharingSource.test.ts │ │ │ │ │ ├── buildGetModSharingSource.ts │ │ │ │ │ ├── buildGetModVersionStatus.test.ts │ │ │ │ │ ├── buildGetModVersionStatus.ts │ │ │ │ │ ├── buildModViewItems.ts │ │ │ │ │ ├── buildModsList.test.ts │ │ │ │ │ ├── buildModsList.ts │ │ │ │ │ ├── useReactivateMod.test.ts │ │ │ │ │ └── useReactivateMod.ts │ │ │ ├── onboarding │ │ │ │ ├── DefaultSetupCard.stories.tsx │ │ │ │ ├── DefaultSetupCard.tsx │ │ │ │ ├── SetupPage.test.tsx │ │ │ │ ├── SetupPage.tsx │ │ │ │ └── partner │ │ │ │ │ ├── ControlRoomOAuthForm.tsx │ │ │ │ │ ├── ControlRoomTokenForm.tsx │ │ │ │ │ ├── PartnerSetupCard.stories.tsx │ │ │ │ │ ├── PartnerSetupCard.tsx │ │ │ │ │ ├── partnerOnboardingUtils.test.ts │ │ │ │ │ └── partnerOnboardingUtils.ts │ │ │ ├── packageEditor │ │ │ │ ├── CodeEditor.tsx │ │ │ │ ├── CreatePage.tsx │ │ │ │ ├── EditPage.tsx │ │ │ │ ├── Editor.test.tsx │ │ │ │ ├── Editor.tsx │ │ │ │ ├── PackageHistory.module.scss │ │ │ │ ├── PackageHistory.test.tsx │ │ │ │ ├── PackageHistory.tsx │ │ │ │ ├── SharingTable.tsx │ │ │ │ ├── referenceTab │ │ │ │ │ ├── DetailSection.tsx │ │ │ │ │ ├── PackageDetail.module.scss │ │ │ │ │ ├── PackageDetail.stories.tsx │ │ │ │ │ ├── PackageDetail.test.tsx │ │ │ │ │ ├── PackageDetail.tsx │ │ │ │ │ ├── PackageReference.module.scss │ │ │ │ │ ├── PackageReference.tsx │ │ │ │ │ ├── PackageResult.module.scss │ │ │ │ │ ├── PackageResult.tsx │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── PackageDetail.test.tsx.snap │ │ │ │ ├── useLogContext.ts │ │ │ │ ├── useSubmitPackage.test.tsx │ │ │ │ ├── useSubmitPackage.ts │ │ │ │ ├── validate.test.ts │ │ │ │ └── validate.ts │ │ │ ├── settings │ │ │ │ ├── AdvancedSettings.tsx │ │ │ │ ├── ExperimentalSettings.tsx │ │ │ │ ├── FactoryResetSettings.tsx │ │ │ │ ├── GeneralSettings.tsx │ │ │ │ ├── LoggingSettings.tsx │ │ │ │ ├── PrivacySettings.tsx │ │ │ │ ├── SettingToggle.tsx │ │ │ │ ├── SettingsCard.module.scss │ │ │ │ ├── SettingsPage.tsx │ │ │ │ ├── StorageSettings.tsx │ │ │ │ ├── useDeploymentKeySetting.test.ts │ │ │ │ ├── useDeploymentKeySetting.ts │ │ │ │ ├── useDiagnostics.test.ts │ │ │ │ ├── useDiagnostics.ts │ │ │ │ └── useServiceUrlSetting.ts │ │ │ ├── useRegistryIdParam.ts │ │ │ └── workshop │ │ │ │ ├── EditablePackagesCard.module.scss │ │ │ │ ├── EditablePackagesCard.tsx │ │ │ │ ├── WorkshopPage.test.tsx │ │ │ │ ├── WorkshopPage.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ └── WorkshopPage.test.tsx.snap │ │ │ │ ├── workshopTypes.ts │ │ │ │ ├── workshopUtils.test.ts │ │ │ │ └── workshopUtils.ts │ │ ├── store.ts │ │ ├── testHelpers.tsx │ │ └── toggleSidebar.tsx │ ├── extensionContext.ts │ ├── extensionPages │ │ ├── extensionPagePlatform.test.ts │ │ └── extensionPagePlatform.ts │ ├── globals.d.ts │ ├── hooks │ │ ├── logging.ts │ │ ├── useAbortSignal.test.ts │ │ ├── useAbortSignal.ts │ │ ├── useAdminConsoleUrl.ts │ │ ├── useAsyncExternalStore.test.ts │ │ ├── useAsyncExternalStore.ts │ │ ├── useAsyncModOptionsValidationSchema.ts │ │ ├── useAsyncState.test.ts │ │ ├── useAsyncState.ts │ │ ├── useAuthOptions.test.ts │ │ ├── useAuthOptions.ts │ │ ├── useAuthorizationGrantFlow.ts │ │ ├── useAutoFocus.test.ts │ │ ├── useAutoFocusConfiguration.ts │ │ ├── useBrickOptions.ts │ │ ├── useBrowserIdentifier.ts │ │ ├── useContextInvalidated.ts │ │ ├── useDatabaseOptions.ts │ │ ├── useDebouncedEffect.ts │ │ ├── useDeriveAsyncState.test.ts │ │ ├── useDeriveAsyncState.ts │ │ ├── useDocumentSelection.ts │ │ ├── useDocumentVisibility.test.ts │ │ ├── useDocumentVisibility.ts │ │ ├── useEventListener.test.ts │ │ ├── useEventListener.ts │ │ ├── useFlags.test.tsx │ │ ├── useFlags.ts │ │ ├── useInterval.ts │ │ ├── useIsEnterpriseUser.ts │ │ ├── useIsMounted.test.ts │ │ ├── useIsMounted.ts │ │ ├── useKeyboardShortcut.ts │ │ ├── useMemoCompare.test.ts │ │ ├── useMemoCompare.ts │ │ ├── useMergeAsyncState.test.ts │ │ ├── useMergeAsyncState.ts │ │ ├── useMilestones.test.ts │ │ ├── useMilestones.ts │ │ ├── useOnMountOnly.test.ts │ │ ├── useOnMountOnly.ts │ │ ├── usePreviousValue.ts │ │ ├── useQuickbarShortcut.ts │ │ ├── useReduxState.ts │ │ ├── useRefreshRegistries.ts │ │ ├── useReportError.ts │ │ ├── useScrollLock.module.scss │ │ ├── useScrollLock.test.ts │ │ ├── useScrollLock.ts │ │ ├── useSetDocumentTitle.test.tsx │ │ ├── useSetDocumentTitle.ts │ │ ├── useTheme.test.ts │ │ ├── useTheme.ts │ │ ├── useTimeoutState.test.ts │ │ ├── useTimeoutState.ts │ │ ├── useToggleFormField.test.tsx │ │ ├── useToggleFormField.tsx │ │ ├── useUndo.test.ts │ │ ├── useUndo.ts │ │ ├── useUpdatableAsyncState.ts │ │ ├── useUserAction.ts │ │ ├── useWindowSize.test.ts │ │ └── useWindowSize.ts │ ├── icons │ │ ├── Icon.module.scss │ │ ├── Icon.tsx │ │ ├── IconSelector.tsx │ │ ├── arrow-downward.svg │ │ ├── arrow-up-from-bracket-solid.svg │ │ ├── arrow-upward.svg │ │ ├── constants.ts │ │ ├── custom-icons │ │ │ ├── automation-anywhere.svg │ │ │ ├── favicon.svg │ │ │ ├── ic-unsaved.svg │ │ │ ├── ic-warning.svg │ │ │ ├── icon-sparkles.svg │ │ │ ├── logo.svg │ │ │ ├── uipath.ai │ │ │ └── uipath.svg │ │ ├── delete.svg │ │ ├── drag-handle.svg │ │ ├── duplicate.svg │ │ ├── error.svg │ │ ├── getSvgIcon.ts │ │ ├── info.svg │ │ ├── list.ts │ │ ├── select-parent.svg │ │ ├── types.ts │ │ └── warning.svg │ ├── integrations │ │ ├── UserDefinedIntegration.test.ts │ │ ├── UserDefinedIntegration.ts │ │ ├── autoConfigure.ts │ │ ├── components │ │ │ ├── IntegrationAuthSelector.tsx │ │ │ ├── RequireIntegrationConfig.test.tsx │ │ │ └── RequireIntegrationConfig.tsx │ │ ├── constants.ts │ │ ├── integrationConfigLocator.test.ts │ │ ├── integrationConfigLocator.ts │ │ ├── integrationTypes.ts │ │ ├── registry.ts │ │ ├── sanitizeIntegrationConfig.test.ts │ │ ├── sanitizeIntegrationConfig.ts │ │ ├── store │ │ │ ├── IntegrationsSliceModIntegrationsContextAdapter.tsx │ │ │ ├── integrationsMigrations.ts │ │ │ ├── integrationsSelectors.ts │ │ │ ├── integrationsSlice.test.ts │ │ │ └── integrationsSlice.ts │ │ ├── useSanitizedIntegrationConfigFormikAdapter.test.ts │ │ ├── useSanitizedIntegrationConfigFormikAdapter.ts │ │ └── util │ │ │ ├── checkIntegrationAuth.ts │ │ │ ├── collectExistingConfiguredDependenciesForMod.test.ts │ │ │ ├── collectExistingConfiguredDependenciesForMod.ts │ │ │ ├── extractIntegrationIdsFromSchema.test.ts │ │ │ ├── extractIntegrationIdsFromSchema.ts │ │ │ ├── findSanitizedIntegrationConfigWithRetry.ts │ │ │ ├── getModDefinitionIntegrationIds.test.ts │ │ │ ├── getModDefinitionIntegrationIds.ts │ │ │ ├── getUnconfiguredComponentIntegrations.test.ts │ │ │ ├── getUnconfiguredComponentIntegrations.ts │ │ │ ├── makeIntegrationContextFromDependencies.ts │ │ │ ├── permissionsHelpers.ts │ │ │ ├── pixiebrixConfigurationFactory.ts │ │ │ ├── pixiebrixIntegrationDependencyFactory.ts │ │ │ └── readRawConfigurations.ts │ ├── layout │ │ ├── EnvironmentBanner.tsx │ │ ├── ErrorDisplay.tsx │ │ ├── Footer.tsx │ │ ├── Page.stories.tsx │ │ └── Page.tsx │ ├── manifest.json │ ├── modDefinitions │ │ ├── modDefinitionConstants.ts │ │ ├── modDefinitionHooks.test.ts │ │ ├── modDefinitionHooks.ts │ │ ├── modDefinitionPermissionsHelpers.test.ts │ │ ├── modDefinitionPermissionsHelpers.ts │ │ ├── modDefinitionRawApiCalls.ts │ │ ├── modDefinitions.test.tsx │ │ ├── modDefinitionsListenerMiddleware.ts │ │ ├── modDefinitionsSelectors.ts │ │ ├── modDefinitionsSlice.test.ts │ │ ├── modDefinitionsSlice.ts │ │ ├── modDefinitionsTypes.ts │ │ ├── registry.ts │ │ └── util │ │ │ ├── isSchemaServicesFormat.ts │ │ │ ├── mapModDefinitionToModMetadata.test.ts │ │ │ └── mapModDefinitionToModMetadata.ts │ ├── mods │ │ ├── ModIntegrationsContext.tsx │ │ └── hooks │ │ │ ├── useFindModInstance.ts │ │ │ └── useModPermissions.ts │ ├── mv3 │ │ ├── SessionStorage.test.ts │ │ ├── SessionStorage.ts │ │ └── api.ts │ ├── pageEditor │ │ ├── components │ │ │ ├── DimensionGate.stories.tsx │ │ │ ├── DimensionGate.test.tsx │ │ │ ├── DimensionGate.tsx │ │ │ ├── LoginCard.stories.tsx │ │ │ ├── LoginCard.tsx │ │ │ ├── SelectorMatchWidget.tsx │ │ │ ├── TabConnectionErrorBanner.tsx │ │ │ ├── ToggleField.tsx │ │ │ ├── UrlPatternWidget.test.tsx │ │ │ ├── UrlPatternWidget.tsx │ │ │ └── __snapshots__ │ │ │ │ └── UrlPatternWidget.test.tsx.snap │ │ ├── consts.ts │ │ ├── context │ │ │ ├── TabInspectionGate.tsx │ │ │ └── connection.ts │ │ ├── documentBuilder │ │ │ ├── __snapshots__ │ │ │ │ └── documentTree.test.tsx.snap │ │ │ ├── allowedElementTypes.ts │ │ │ ├── createNewDocumentBuilderElement.test.ts │ │ │ ├── createNewDocumentBuilderElement.ts │ │ │ ├── documentBuilderTypes.ts │ │ │ ├── documentTree.test.tsx │ │ │ ├── documentTree.tsx │ │ │ ├── edit │ │ │ │ ├── ButtonOptions.tsx │ │ │ │ ├── DocumentOptions.test.tsx │ │ │ │ ├── DocumentOptions.tsx │ │ │ │ ├── ElementEditor.tsx │ │ │ │ ├── ListOptions.tsx │ │ │ │ ├── MoveElement.tsx │ │ │ │ ├── PipelineOptions.tsx │ │ │ │ ├── RemoveElement.tsx │ │ │ │ ├── getElementCollectionName.test.ts │ │ │ │ ├── getElementCollectionName.ts │ │ │ │ ├── getElementEditSchemas.tsx │ │ │ │ └── useElementOptions.tsx │ │ │ ├── elementTypeLabels.ts │ │ │ ├── hooks │ │ │ │ ├── useDeleteElement.ts │ │ │ │ ├── useDuplicateElement.test.ts │ │ │ │ ├── useDuplicateElement.ts │ │ │ │ ├── useMoveElement.test.ts │ │ │ │ ├── useMoveElement.ts │ │ │ │ ├── useMoveWithinParent.ts │ │ │ │ └── useSelectParentElement.ts │ │ │ ├── outline │ │ │ │ ├── DocumentOutline.module.scss │ │ │ │ ├── DocumentOutline.tsx │ │ │ │ ├── OutlineItem.stories.tsx │ │ │ │ ├── OutlineItem.test.tsx │ │ │ │ ├── OutlineItem.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── OutlineItem.test.tsx.snap │ │ │ │ └── outlineHelpers.ts │ │ │ ├── preview │ │ │ │ ├── AddElementAction.module.scss │ │ │ │ ├── AddElementAction.tsx │ │ │ │ ├── DocumentPreview.module.scss │ │ │ │ ├── DocumentPreview.test.tsx │ │ │ │ ├── DocumentPreview.tsx │ │ │ │ ├── ElementPreview.module.scss │ │ │ │ ├── ElementPreview.test.tsx │ │ │ │ ├── ElementPreview.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── ElementPreview.test.tsx.snap │ │ │ │ ├── documentTree.module.scss │ │ │ │ ├── elementsPreview │ │ │ │ │ ├── Basic.tsx │ │ │ │ │ ├── Button.tsx │ │ │ │ │ ├── Card.module.scss │ │ │ │ │ ├── Card.tsx │ │ │ │ │ ├── Container.tsx │ │ │ │ │ ├── Image.tsx │ │ │ │ │ ├── List.tsx │ │ │ │ │ ├── Pipeline.tsx │ │ │ │ │ └── Unknown.tsx │ │ │ │ ├── flaps │ │ │ │ │ ├── ActiveElementFlap.module.scss │ │ │ │ │ ├── ActiveElementFlap.tsx │ │ │ │ │ ├── Flaps.module.scss │ │ │ │ │ ├── Flaps.tsx │ │ │ │ │ └── HoveredFlap.tsx │ │ │ │ ├── getPreviewComponentDefinition.test.tsx │ │ │ │ ├── getPreviewComponentDefinition.tsx │ │ │ │ └── previewVariables.scss │ │ │ ├── render │ │ │ │ ├── BlockElement.tsx │ │ │ │ ├── ButtonElement.tsx │ │ │ │ ├── CardElement.tsx │ │ │ │ ├── DocumentContext.tsx │ │ │ │ └── ListElement.tsx │ │ │ └── utils.ts │ │ ├── editorPermissionsHelpers.ts │ │ ├── events.ts │ │ ├── fields │ │ │ ├── AlertOptions.tsx │ │ │ ├── ApiVersionField.tsx │ │ │ ├── AssignModVariableOptions.tsx │ │ │ ├── CollapsibleFieldSection.module.scss │ │ │ ├── CollapsibleFieldSection.test.tsx │ │ │ ├── CollapsibleFieldSection.tsx │ │ │ ├── ConfigErrorBoundary.tsx │ │ │ ├── ConnectedCollapsibleFieldSection.test.tsx │ │ │ ├── ConnectedCollapsibleFieldSection.tsx │ │ │ ├── DatabaseGetOptions.tsx │ │ │ ├── DatabaseOptions.tsx │ │ │ ├── DatabasePutOptions.tsx │ │ │ ├── FormModalOptions.test.tsx │ │ │ ├── FormModalOptions.tsx │ │ │ ├── FormRendererOptions.test.tsx │ │ │ ├── FormRendererOptions.tsx │ │ │ ├── LocationWidget.tsx │ │ │ ├── MultiSelectWidget.tsx │ │ │ ├── PipelineToggleField.test.tsx │ │ │ ├── PipelineToggleField.tsx │ │ │ ├── RemoteMethodOptions.test.ts │ │ │ ├── RemoteMethodOptions.tsx │ │ │ ├── SelectorMatchField.tsx │ │ │ ├── SelectorSelectorWidget.module.scss │ │ │ ├── SelectorSelectorWidget.test.ts │ │ │ ├── SelectorSelectorWidget.tsx │ │ │ ├── TemplateWidget.tsx │ │ │ ├── UrlMatchPatternField.stories.tsx │ │ │ ├── UrlMatchPatternField.tsx │ │ │ ├── UrlPatternField.stories.tsx │ │ │ ├── UrlPatternField.tsx │ │ │ ├── creatableAutosuggest │ │ │ │ ├── CreatableAutosuggest.module.scss │ │ │ │ ├── CreatableAutosuggest.stories.tsx │ │ │ │ └── CreatableAutosuggest.tsx │ │ │ ├── devtoolFieldOverrides.tsx │ │ │ ├── formFieldTypeOptions.ts │ │ │ ├── makeLockableFieldProps.tsx │ │ │ └── selectorListItem │ │ │ │ ├── SelectorListItem.module.css │ │ │ │ ├── SelectorListItem.stories.tsx │ │ │ │ └── SelectorListItem.tsx │ │ ├── hooks │ │ │ ├── updateReduxForSavedModDefinition.ts │ │ │ ├── useAddNewModComponent.ts │ │ │ ├── useApiVersionAtLeast.tsx │ │ │ ├── useBuildAndValidateMod.test.ts │ │ │ ├── useBuildAndValidateMod.ts │ │ │ ├── useCheckModStarterBrickInvariants.test.ts │ │ │ ├── useCheckModStarterBrickInvariants.ts │ │ │ ├── useClearModChanges.ts │ │ │ ├── useClearModComponentChanges.ts │ │ │ ├── useCompareModComponentCounts.test.ts │ │ │ ├── useCompareModComponentCounts.ts │ │ │ ├── useCreateModFromMod.test.ts │ │ │ ├── useCreateModFromMod.ts │ │ │ ├── useCreateModFromModComponent.test.ts │ │ │ ├── useCreateModFromModComponent.ts │ │ │ ├── useCreateModFromUnsavedMod.ts │ │ │ ├── useCurrentInspectedUrl.ts │ │ │ ├── useDeactivateMod.tsx │ │ │ ├── useDeleteDraftModComponent.test.ts │ │ │ ├── useDeleteDraftModComponent.tsx │ │ │ ├── useEnsureFormStates.ts │ │ │ ├── useEscapeHandler.ts │ │ │ ├── useModComponentTrace.ts │ │ │ ├── useRegisterDraftModInstanceOnAllFrames.ts │ │ │ ├── useSaveMod.test.ts │ │ │ └── useSaveMod.ts │ │ ├── layout │ │ │ ├── EditorContent.test.tsx │ │ │ ├── EditorContent.tsx │ │ │ ├── EditorLayout.module.scss │ │ │ ├── EditorLayout.tsx │ │ │ ├── ModComponentFormStateWizard.module.scss │ │ │ ├── ModComponentFormStateWizard.tsx │ │ │ ├── Panel.tsx │ │ │ ├── PanelContent.test.tsx │ │ │ └── PanelContent.tsx │ │ ├── modListingPanel │ │ │ ├── ActionButtons.module.scss │ │ │ ├── ActionMenu.module.scss │ │ │ ├── ActivatedModComponentListItem.test.tsx │ │ │ ├── ActivatedModComponentListItem.tsx │ │ │ ├── DraftModComponentListItem.test.tsx │ │ │ ├── DraftModComponentListItem.tsx │ │ │ ├── Entry.module.scss │ │ │ ├── HomeButton.module.scss │ │ │ ├── HomeButton.tsx │ │ │ ├── ModActionMenu.tsx │ │ │ ├── ModComponentActionMenu.stories.tsx │ │ │ ├── ModComponentActionMenu.tsx │ │ │ ├── ModComponentIcons.test.tsx │ │ │ ├── ModComponentIcons.tsx │ │ │ ├── ModComponentListItem.tsx │ │ │ ├── ModListItem.test.tsx │ │ │ ├── ModListItem.tsx │ │ │ ├── ModListingPanel.module.scss │ │ │ ├── ModListingPanel.test.tsx │ │ │ ├── ModListingPanel.tsx │ │ │ ├── ModSidebarListItems.module.scss │ │ │ ├── ModSidebarListItems.tsx │ │ │ ├── NewModButton.tsx │ │ │ ├── ReloadButton.tsx │ │ │ ├── SaveButton.module.scss │ │ │ ├── SaveButton.stories.tsx │ │ │ ├── SaveButton.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── DraftModComponentListItem.test.tsx.snap │ │ │ │ └── ModComponentIcons.test.tsx.snap │ │ │ ├── arrangeSidebarItems.test.ts │ │ │ ├── arrangeSidebarItems.ts │ │ │ ├── common.ts │ │ │ ├── filterSidebarItems.test.ts │ │ │ ├── filterSidebarItems.ts │ │ │ └── modals │ │ │ │ ├── CreateModModal.tsx │ │ │ │ ├── MoveOrCopyToModModal.tsx │ │ │ │ ├── SaveAsNewModModal.tsx │ │ │ │ ├── SaveModVersionModal.test.tsx │ │ │ │ └── SaveModVersionModal.tsx │ │ ├── modals │ │ │ ├── Modals.tsx │ │ │ └── addBrickModal │ │ │ │ ├── AddBrickModal.module.scss │ │ │ │ ├── AddBrickModal.test.tsx │ │ │ │ ├── AddBrickModal.tsx │ │ │ │ ├── BrickDetail.tsx │ │ │ │ ├── BrickGridItem.module.scss │ │ │ │ ├── BrickGridItem.tsx │ │ │ │ ├── BrickGridItemRenderer.tsx │ │ │ │ ├── QuickAdd.module.scss │ │ │ │ ├── TagList.module.scss │ │ │ │ ├── TagList.tsx │ │ │ │ ├── TagSearchInput.module.scss │ │ │ │ ├── TagSearchInput.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ └── AddBrickModal.test.tsx.snap │ │ │ │ ├── addBrickModalConstants.ts │ │ │ │ ├── addBrickModalHelpers.ts │ │ │ │ ├── addBrickModalTypes.ts │ │ │ │ ├── addBrickModalVariables.scss │ │ │ │ ├── groupListingsByTag.test.ts │ │ │ │ ├── groupListingsByTag.ts │ │ │ │ ├── useAddBrick.ts │ │ │ │ └── useBrickSearch.ts │ │ ├── pageEditor.html │ │ ├── pageEditor.tsx │ │ ├── panes │ │ │ ├── HomePane.module.scss │ │ │ ├── HomePane.stories.tsx │ │ │ ├── HomePane.tsx │ │ │ ├── ModComponentEditorPane.test.tsx │ │ │ ├── ModComponentEditorPane.tsx │ │ │ ├── ModEditorPane.module.scss │ │ │ ├── ModEditorPane.tsx │ │ │ ├── NoTabAccessPane.test.tsx │ │ │ ├── NoTabAccessPane.tsx │ │ │ ├── NonScriptablePage.module.scss │ │ │ ├── NonScriptablePage.test.tsx │ │ │ ├── NonScriptablePage.tsx │ │ │ ├── Pane.module.scss │ │ │ ├── RestrictedPane.stories.tsx │ │ │ ├── RestrictedPane.tsx │ │ │ ├── StaleSessionPane.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── ModComponentEditorPane.test.tsx.snap │ │ │ │ ├── NoTabAccessPane.test.tsx.snap │ │ │ │ └── NonScriptablePage.test.tsx.snap │ │ │ ├── insert │ │ │ │ ├── InsertButtonPane.tsx │ │ │ │ ├── InsertPane.tsx │ │ │ │ └── exampleStarterBrickConfigs.ts │ │ │ └── save │ │ │ │ ├── SaveDataIntegrityErrorModal.tsx │ │ │ │ ├── saveHelpers.test.ts │ │ │ │ └── saveHelpers.ts │ │ ├── protocol.ts │ │ ├── starterBricks │ │ │ ├── adapter.ts │ │ │ ├── base.test.ts │ │ │ ├── base.ts │ │ │ ├── button.ts │ │ │ ├── contextMenu.test.ts │ │ │ ├── contextMenu.ts │ │ │ ├── dynamicQuickBar.ts │ │ │ ├── formStateTypes.ts │ │ │ ├── modComponentFormStateAdapter.ts │ │ │ ├── pipelineMapping.test.ts │ │ │ ├── pipelineMapping.ts │ │ │ ├── quickBar.ts │ │ │ ├── sidebar.ts │ │ │ └── trigger.ts │ │ ├── store │ │ │ ├── analysisManager.ts │ │ │ ├── castState.ts │ │ │ ├── editor │ │ │ │ ├── baseFormStateTypes.ts │ │ │ │ ├── editorInvariantMiddleware.ts │ │ │ │ ├── editorSelectors │ │ │ │ │ ├── editorAnalysisSelectors.ts │ │ │ │ │ ├── editorClipboardSelectors.ts │ │ │ │ │ ├── editorDataPanelSelectors.ts │ │ │ │ │ ├── editorDesignViewSelectors.ts │ │ │ │ │ ├── editorErrorSelectors.ts │ │ │ │ │ ├── editorModComponentSelectors.ts │ │ │ │ │ ├── editorModSelectors.test.ts │ │ │ │ │ ├── editorModSelectors.ts │ │ │ │ │ ├── editorModalSelectors.ts │ │ │ │ │ ├── editorNavigationSelectors.ts │ │ │ │ │ ├── editorPipelineSelectors.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── editorSlice.test.ts │ │ │ │ ├── editorSlice.ts │ │ │ │ ├── editorSliceHelpers.test.ts │ │ │ │ ├── editorSliceHelpers.ts │ │ │ │ ├── pageEditorTypes │ │ │ │ │ ├── editorStateEphemeral.ts │ │ │ │ │ ├── editorStateMigrated.ts │ │ │ │ │ ├── editorStateSynced.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── uiState.ts │ │ │ │ └── uiStateTypes.ts │ │ │ ├── runtime │ │ │ │ ├── runtimeSelectors.ts │ │ │ │ ├── runtimeSlice.ts │ │ │ │ └── runtimeSliceTypes.ts │ │ │ ├── session │ │ │ │ ├── sessionSelectors.ts │ │ │ │ ├── sessionSlice.ts │ │ │ │ └── sessionSliceTypes.ts │ │ │ ├── store.ts │ │ │ └── tabState │ │ │ │ ├── tabStateSelectors.ts │ │ │ │ ├── tabStateSlice.ts │ │ │ │ └── tabStateTypes.ts │ │ ├── tabs │ │ │ ├── ExtraPermissionsSection.test.tsx │ │ │ ├── ExtraPermissionsSection.tsx │ │ │ ├── Logs.tsx │ │ │ ├── MatchRulesSection.test.tsx │ │ │ ├── MatchRulesSection.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── ExtraPermissionsSection.test.tsx.snap │ │ │ │ └── MatchRulesSection.test.tsx.snap │ │ │ ├── button │ │ │ │ └── ButtonConfiguration.tsx │ │ │ ├── contextMenu │ │ │ │ └── ContextMenuConfiguration.tsx │ │ │ ├── dynamicQuickBar │ │ │ │ └── DynamicQuickBarConfiguration.tsx │ │ │ ├── editTab │ │ │ │ ├── AnalysisResult.tsx │ │ │ │ ├── EditTab.module.scss │ │ │ │ ├── EditTab.tsx │ │ │ │ ├── StarterBrickConfigPanel.tsx │ │ │ │ ├── UnsupportedRuntimeVersion.tsx │ │ │ │ ├── dataPanel │ │ │ │ │ ├── BrickDataPanel.test.tsx │ │ │ │ │ ├── BrickDataPanel.tsx │ │ │ │ │ ├── DataTabJsonTree.module.scss │ │ │ │ │ ├── DataTabJsonTree.test.tsx │ │ │ │ │ ├── DataTabJsonTree.tsx │ │ │ │ │ ├── DataTabPane.tsx │ │ │ │ │ ├── ErrorDisplay.module.scss │ │ │ │ │ ├── ErrorDisplay.tsx │ │ │ │ │ ├── StarterBrickDataPanel.test.tsx │ │ │ │ │ ├── StarterBrickDataPanel.tsx │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ ├── BrickDataPanel.test.tsx.snap │ │ │ │ │ │ ├── DataTabJsonTree.test.tsx.snap │ │ │ │ │ │ └── StarterBrickDataPanel.test.tsx.snap │ │ │ │ │ ├── dataPanelTabs.module.scss │ │ │ │ │ ├── dataPanelTypes.ts │ │ │ │ │ ├── tabs │ │ │ │ │ │ ├── BrickInputTab.test.tsx │ │ │ │ │ │ ├── BrickInputTab.tsx │ │ │ │ │ │ ├── BrickOutputTab.tsx │ │ │ │ │ │ ├── CommentsTab.test.tsx │ │ │ │ │ │ ├── CommentsTab.tsx │ │ │ │ │ │ ├── DesignTab.tsx │ │ │ │ │ │ ├── FindTab │ │ │ │ │ │ │ ├── FindTab.test.tsx │ │ │ │ │ │ │ ├── FindTab.tsx │ │ │ │ │ │ │ ├── ResultItem.module.scss │ │ │ │ │ │ │ ├── ResultItem.tsx │ │ │ │ │ │ │ ├── breadcrumbLabelHelpers.test.ts │ │ │ │ │ │ │ ├── breadcrumbLabelHelpers.ts │ │ │ │ │ │ │ ├── findTypes.ts │ │ │ │ │ │ │ ├── searchIndexVisitor.test.ts │ │ │ │ │ │ │ ├── searchIndexVisitor.ts │ │ │ │ │ │ │ └── useFindInMod.ts │ │ │ │ │ │ ├── ModComponentFormStateTab.tsx │ │ │ │ │ │ ├── ModVariablesTab.test.tsx │ │ │ │ │ │ ├── ModVariablesTab.tsx │ │ │ │ │ │ ├── NodeFormStateTab.tsx │ │ │ │ │ │ ├── OutlineTab.tsx │ │ │ │ │ │ ├── StarterBrickInputTab.tsx │ │ │ │ │ │ ├── StarterBrickOutputTab.tsx │ │ │ │ │ │ ├── ViewModeField.module.scss │ │ │ │ │ │ ├── ViewModeField.tsx │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── ModVariablesTab.test.tsx.snap │ │ │ │ │ │ ├── useBrickTraceRecord.ts │ │ │ │ │ │ └── useIsSidebarPanelStale.ts │ │ │ │ │ └── useDataPanelActiveTabKey.ts │ │ │ │ ├── editHelpers.test.ts │ │ │ │ ├── editHelpers.ts │ │ │ │ ├── editTabTypes.ts │ │ │ │ ├── editTabVariables.scss │ │ │ │ ├── editorNodeConfigPanel │ │ │ │ │ ├── CommentsPreview.module.scss │ │ │ │ │ ├── CommentsPreview.test.tsx │ │ │ │ │ ├── CommentsPreview.tsx │ │ │ │ │ ├── EditorNodeConfigPanel.module.scss │ │ │ │ │ ├── EditorNodeConfigPanel.tsx │ │ │ │ │ ├── OutputVariableField.test.tsx │ │ │ │ │ └── OutputVariableField.tsx │ │ │ │ ├── editorNodeLayout │ │ │ │ │ ├── EditorNodeLayout.tsx │ │ │ │ │ ├── decideStatus.ts │ │ │ │ │ ├── nodeSummary.module.scss │ │ │ │ │ ├── nodeSummary.tsx │ │ │ │ │ ├── usePasteBrick.ts │ │ │ │ │ └── usePipelineNodes │ │ │ │ │ │ ├── helpers.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ ├── useCreateNodeActions.ts │ │ │ │ │ │ ├── useGetBrickContentProps.tsx │ │ │ │ │ │ ├── useGetIsBrickPipelineExpanded.ts │ │ │ │ │ │ ├── useGetNodeMovement.ts │ │ │ │ │ │ ├── useGetNodeState.ts │ │ │ │ │ │ ├── useGetSubPipelineNodes.ts │ │ │ │ │ │ ├── useGetTraceHandling.ts │ │ │ │ │ │ ├── useLastBrickHandling.ts │ │ │ │ │ │ ├── useMakeFoundationNode.ts │ │ │ │ │ │ ├── useMapBrickToNodes.tsx │ │ │ │ │ │ └── useMapPipelineToNodes.ts │ │ │ │ ├── editorNodes │ │ │ │ │ ├── OutputKeyView.module.scss │ │ │ │ │ ├── OutputKeyView.tsx │ │ │ │ │ ├── PipelineFooterNode.module.scss │ │ │ │ │ ├── PipelineFooterNode.tsx │ │ │ │ │ ├── PipelineHeaderNode.module.scss │ │ │ │ │ ├── PipelineHeaderNode.tsx │ │ │ │ │ ├── PipelineOffsetView.module.scss │ │ │ │ │ ├── PipelineOffsetView.tsx │ │ │ │ │ ├── TrailingMessage.module.scss │ │ │ │ │ ├── TrailingMessage.tsx │ │ │ │ │ ├── brickNode │ │ │ │ │ │ ├── BrickNode.module.scss │ │ │ │ │ │ ├── BrickNode.tsx │ │ │ │ │ │ ├── BrickNodeContent.module.scss │ │ │ │ │ │ ├── BrickNodeContent.tsx │ │ │ │ │ │ ├── MoveBrickControl.module.scss │ │ │ │ │ │ └── MoveBrickControl.tsx │ │ │ │ │ └── nodeActions │ │ │ │ │ │ ├── NodeActionsView.module.scss │ │ │ │ │ │ └── NodeActionsView.tsx │ │ │ │ ├── useReportTraceError.test.tsx │ │ │ │ └── useReportTraceError.ts │ │ │ ├── effect │ │ │ │ ├── AdvancedLinks.module.scss │ │ │ │ ├── AdvancedLinks.test.tsx │ │ │ │ ├── AdvancedLinks.tsx │ │ │ │ ├── BrickConfiguration.test.tsx │ │ │ │ ├── BrickConfiguration.tsx │ │ │ │ ├── BrickPreview.tsx │ │ │ │ ├── StarterBrickPreview.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── BrickConfiguration.test.tsx.snap │ │ │ │ ├── configurationConstants.ts │ │ │ │ └── useDocumentPreviewRunBlock.ts │ │ │ ├── logs │ │ │ │ ├── LogsTab.tsx │ │ │ │ ├── NavItemBadge.tsx │ │ │ │ └── useLogsBadgeState.ts │ │ │ ├── modMetadata │ │ │ │ ├── ModMetadataEditor.module.scss │ │ │ │ ├── ModMetadataEditor.test.tsx │ │ │ │ └── ModMetadataEditor.tsx │ │ │ ├── modOptionsArgs │ │ │ │ ├── ModOptionsArgsEditor.test.tsx │ │ │ │ ├── ModOptionsArgsEditor.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── ModOptionsArgsEditor.test.tsx.snap │ │ │ ├── modOptionsDefinitions │ │ │ │ ├── ModOptionsDefinitionEditor.module.scss │ │ │ │ ├── ModOptionsDefinitionEditor.test.tsx │ │ │ │ └── ModOptionsDefinitionEditor.tsx │ │ │ ├── modVariablesDefinition │ │ │ │ ├── ModVariablesDefinitionEditor.module.scss │ │ │ │ ├── ModVariablesDefinitionEditor.test.tsx │ │ │ │ ├── ModVariablesDefinitionEditor.tsx │ │ │ │ ├── ModVariablesTable.module.scss │ │ │ │ ├── ModVariablesTable.tsx │ │ │ │ ├── modVariablesDefinitionEditorHelpers.test.ts │ │ │ │ ├── modVariablesDefinitionEditorHelpers.ts │ │ │ │ ├── modVariablesDefinitionEditorTypes.ts │ │ │ │ └── useInferredModVariablesQuery.ts │ │ │ ├── modVersionHistory │ │ │ │ ├── ModVersionHistory.test.tsx │ │ │ │ └── ModVersionHistory.tsx │ │ │ ├── quickBar │ │ │ │ └── QuickBarConfiguration.tsx │ │ │ ├── sidebar │ │ │ │ └── SidebarConfiguration.tsx │ │ │ └── trigger │ │ │ │ ├── DebounceFieldSet.tsx │ │ │ │ ├── TriggerConfiguration.test.tsx │ │ │ │ ├── TriggerConfiguration.tsx │ │ │ │ └── __snapshots__ │ │ │ │ └── TriggerConfiguration.test.tsx.snap │ │ ├── testHelpers.ts │ │ ├── toolbar │ │ │ ├── PermissionsToolbar.tsx │ │ │ └── ReloadToolbar.tsx │ │ └── utils.ts │ ├── pageScript │ │ ├── elementInfo.ts │ │ ├── frameworks │ │ │ ├── adapters.ts │ │ │ ├── component.ts │ │ │ ├── contrib │ │ │ │ ├── angularjs.ts │ │ │ │ ├── ember.ts │ │ │ │ ├── react.ts │ │ │ │ └── vue.ts │ │ │ ├── dom.ts │ │ │ └── errors.ts │ │ ├── messenger │ │ │ ├── api.ts │ │ │ ├── constants.ts │ │ │ ├── receiver.ts │ │ │ └── sender.ts │ │ └── pageScript.ts │ ├── permissions │ │ ├── deploymentPermissionsHelpers.ts │ │ ├── modComponentPermissionsHelpers.ts │ │ ├── patterns.ts │ │ ├── permissionsTypes.ts │ │ ├── permissionsUtils.ts │ │ ├── useExtensionPermissions.test.ts │ │ ├── useExtensionPermissions.ts │ │ └── useRequestPermissionsCallback.ts │ ├── platform │ │ ├── capabilities.ts │ │ ├── forms │ │ │ ├── formController.ts │ │ │ └── formTypes.ts │ │ ├── panels │ │ │ ├── panelController.ts │ │ │ └── panelTypes.ts │ │ ├── platformBase.ts │ │ ├── platformContext.ts │ │ ├── platformProtocol.ts │ │ ├── platformTypes │ │ │ ├── audioProtocol.ts │ │ │ ├── badgeProtocol.ts │ │ │ ├── captureProtocol.ts │ │ │ ├── clipboardProtocol.ts │ │ │ ├── contextMenuProtocol.ts │ │ │ ├── debuggerProtocol.ts │ │ │ ├── panelProtocol.ts │ │ │ ├── quickBarProtocol.ts │ │ │ ├── registryProtocol.ts │ │ │ ├── snippetShortcutMenuProtocol.ts │ │ │ ├── stateProtocol.ts │ │ │ ├── templateProtocol.ts │ │ │ ├── textSelectionMenuProtocol.ts │ │ │ └── toastProtocol.ts │ │ └── state │ │ │ ├── stateHelpers.test.ts │ │ │ ├── stateHelpers.ts │ │ │ └── stateTypes.ts │ ├── registry │ │ ├── hydrateInnerDefinitions.ts │ │ ├── memoryRegistry.ts │ │ ├── packageRegistry.test.ts │ │ └── packageRegistry.ts │ ├── runtime │ │ ├── apiVersionOptions.ts │ │ ├── brickYaml.test.ts │ │ ├── brickYaml.ts │ │ ├── extendModVariableContext.test.ts │ │ ├── extendModVariableContext.ts │ │ ├── getType.ts │ │ ├── mapArgs.test.ts │ │ ├── mapArgs.ts │ │ ├── pathHelpers.test.ts │ │ ├── pathHelpers.ts │ │ ├── pipelineTests │ │ │ ├── autoescape.test.ts │ │ │ ├── component.test.ts │ │ │ ├── conditional.test.ts │ │ │ ├── deferExpression.test.ts │ │ │ ├── deploymentAlert.test.ts │ │ │ ├── featureFlag.test.ts │ │ │ ├── implicitDataFlow.test.ts │ │ │ ├── integrationContext.test.ts │ │ │ ├── modVariableContext.test.ts │ │ │ ├── options.test.ts │ │ │ ├── outputKey.test.ts │ │ │ ├── pipelineExpression.test.ts │ │ │ ├── root.test.ts │ │ │ ├── templateEngine.test.ts │ │ │ ├── testHelpers.ts │ │ │ ├── trace.test.ts │ │ │ └── validateInput.test.ts │ │ ├── reducePipeline.ts │ │ ├── renderers.test.ts │ │ ├── renderers.ts │ │ ├── runtimeTypes.test.ts │ │ ├── runtimeTypes.ts │ │ ├── runtimeUtils.test.ts │ │ └── runtimeUtils.ts │ ├── sandbox │ │ ├── messenger │ │ │ ├── api.ts │ │ │ ├── executor.test.ts │ │ │ ├── executor.ts │ │ │ └── registration.ts │ │ ├── postMessage.test.ts │ │ ├── postMessage.ts │ │ ├── sandbox.html │ │ └── sandbox.ts │ ├── sidebar │ │ ├── ConnectedSidebar.module.scss │ │ ├── ConnectedSidebar.test.tsx │ │ ├── ConnectedSidebar.tsx │ │ ├── ConnectingOverlay.tsx │ │ ├── DefaultContent.test.tsx │ │ ├── DefaultPanel.module.scss │ │ ├── DefaultPanel.tsx │ │ ├── FormBody.test.tsx │ │ ├── FormBody.tsx │ │ ├── Header.test.tsx │ │ ├── Header.tsx │ │ ├── LoginPanel.stories.tsx │ │ ├── LoginPanel.tsx │ │ ├── PanelBody.module.scss │ │ ├── PanelBody.test.tsx │ │ ├── PanelBody.tsx │ │ ├── RendererComponent.test.tsx │ │ ├── RendererComponent.tsx │ │ ├── SidebarApp.tsx │ │ ├── SidebarBody.test.tsx │ │ ├── SidebarBody.tsx │ │ ├── SidebarErrorBoundary.tsx │ │ ├── Tabs.module.scss │ │ ├── Tabs.test.tsx │ │ ├── Tabs.tsx │ │ ├── TemporaryPanelTabPane.tsx │ │ ├── UnavailableOverlay.tsx │ │ ├── __snapshots__ │ │ │ ├── ConnectedSidebar.test.tsx.snap │ │ │ ├── FormBody.test.tsx.snap │ │ │ ├── Header.test.tsx.snap │ │ │ ├── PanelBody.test.tsx.snap │ │ │ └── SidebarBody.test.tsx.snap │ │ ├── activateMod │ │ │ ├── ActivateModInputs.tsx │ │ │ ├── ActivateModPanel.module.scss │ │ │ ├── ActivateModPanel.test.tsx │ │ │ ├── ActivateModPanel.tsx │ │ │ ├── ActivateMultipleModsPanel.test.tsx │ │ │ ├── ActivateMultipleModsPanel.tsx │ │ │ ├── RequireMods.test.ts │ │ │ ├── RequireMods.tsx │ │ │ └── __snapshots__ │ │ │ │ └── ActivateModPanel.test.tsx.snap │ │ ├── blurSidebarOverlay.module.scss │ │ ├── components │ │ │ ├── RootCancelledPanel.stories.tsx │ │ │ ├── RootCancelledPanel.test.tsx │ │ │ ├── RootCancelledPanel.tsx │ │ │ ├── RootErrorPanel.stories.tsx │ │ │ ├── RootErrorPanel.test.tsx │ │ │ ├── RootErrorPanel.tsx │ │ │ └── __snapshots__ │ │ │ │ ├── RootCancelledPanel.test.tsx.snap │ │ │ │ └── RootErrorPanel.test.tsx.snap │ │ ├── connectedTarget.tsx │ │ ├── hooks │ │ │ ├── useConnectedTargetUrl.tsx │ │ │ └── useHideEmptySidebarEffect.ts │ │ ├── messenger │ │ │ ├── api.ts │ │ │ └── registration.ts │ │ ├── modLauncher │ │ │ ├── ActiveSidebarModsList.module.scss │ │ │ ├── ActiveSidebarModsList.tsx │ │ │ ├── ActiveSidebarModsListItem.module.scss │ │ │ ├── ActiveSidebarModsListItem.tsx │ │ │ ├── ModLauncher.module.scss │ │ │ ├── ModLauncher.test.tsx │ │ │ └── ModLauncher.tsx │ │ ├── protocol.tsx │ │ ├── sidebar.html │ │ ├── sidebar.scss │ │ ├── sidebar.tsx │ │ ├── sidebarBootstrapOverrides.scss │ │ ├── sidebarSelectors.ts │ │ ├── staticPanelUtils.tsx │ │ ├── store.ts │ │ ├── telemetryConstants.ts │ │ └── testHelpers.ts │ ├── starterBricks │ │ ├── button │ │ │ ├── buttonStarterBrick.test.ts │ │ │ ├── buttonStarterBrick.ts │ │ │ └── buttonStarterBrickTypes.ts │ │ ├── contextMenu │ │ │ ├── contextMenuReader.ts │ │ │ ├── contextMenuStarterBrick.test.ts │ │ │ ├── contextMenuStarterBrick.ts │ │ │ └── contextMenuTypes.ts │ │ ├── dynamicQuickBar │ │ │ ├── dynamicQuickBarStarterBrick.test.ts │ │ │ ├── dynamicQuickBarStarterBrick.tsx │ │ │ ├── dynamicQuickBarTypes.ts │ │ │ └── quickBarQueryReader.ts │ │ ├── factory.ts │ │ ├── helpers.test.ts │ │ ├── helpers.ts │ │ ├── quickBar │ │ │ ├── quickBarStarterBrick.test.ts │ │ │ ├── quickBarStarterBrick.tsx │ │ │ └── quickBarTypes.ts │ │ ├── registry.ts │ │ ├── sidebar │ │ │ ├── sidebarStarterBrick.test.ts │ │ │ ├── sidebarStarterBrick.ts │ │ │ └── sidebarStarterBrickTypes.ts │ │ ├── starterBrickConstants.ts │ │ ├── starterBrickModUtils.test.ts │ │ ├── starterBrickModUtils.ts │ │ ├── starterBrickUtils.ts │ │ ├── testHelpers.ts │ │ ├── trigger │ │ │ ├── triggerEventReaders.ts │ │ │ ├── triggerStarterBrick.test.ts │ │ │ ├── triggerStarterBrick.ts │ │ │ └── triggerStarterBrickTypes.ts │ │ └── types.ts │ ├── store │ │ ├── ReduxPersistenceContext.ts │ │ ├── StorageInterface.ts │ │ ├── browserExtensionIdStorage.ts │ │ ├── checkActiveModComponentAvailability.test.ts │ │ ├── checkAvailableActivatedModComponents.test.ts │ │ ├── checkAvailableDraftModComponents.test.ts │ │ ├── commonActions.ts │ │ ├── deactivateModHelpers.ts │ │ ├── defaultMiddlewareConfig.ts │ │ ├── editorInitialState.ts │ │ ├── editorMigrations.test.ts │ │ ├── editorMigrations.ts │ │ ├── editorStorage.test.ts │ │ ├── editorStorage.ts │ │ ├── enterprise │ │ │ ├── managedStorage.test.ts │ │ │ ├── managedStorage.ts │ │ │ ├── managedStorageTypes.ts │ │ │ ├── singleSignOn.test.ts │ │ │ ├── singleSignOn.ts │ │ │ ├── useManagedStorageState.test.ts │ │ │ └── useManagedStorageState.ts │ │ ├── migratePersistedState.test.ts │ │ ├── migratePersistedState.ts │ │ ├── modComponents │ │ │ ├── modComponentMigrations.test.ts │ │ │ ├── modComponentMigrations.ts │ │ │ ├── modComponentSelectors.ts │ │ │ ├── modComponentSlice.ts │ │ │ ├── modComponentSliceInitialState.ts │ │ │ ├── modComponentStorage.test.ts │ │ │ ├── modComponentStorage.ts │ │ │ ├── modComponentTypes.ts │ │ │ ├── modComponentUtils.test.ts │ │ │ ├── modComponentUtils.ts │ │ │ ├── modInstanceSelectors.ts │ │ │ └── modInstanceUtils.ts │ │ ├── sessionChanges │ │ │ ├── sessionChangesListenerMiddleware.ts │ │ │ ├── sessionChangesSelectors.test.ts │ │ │ ├── sessionChangesSelectors.ts │ │ │ ├── sessionChangesSlice.ts │ │ │ └── sessionChangesTypes.ts │ │ ├── settings │ │ │ ├── settingsMigrations.ts │ │ │ ├── settingsSelectors.test.ts │ │ │ ├── settingsSelectors.ts │ │ │ ├── settingsSlice.test.ts │ │ │ ├── settingsSlice.ts │ │ │ ├── settingsStorage.ts │ │ │ └── settingsTypes.ts │ │ ├── sidebar │ │ │ ├── constants.ts │ │ │ ├── eventKeyUtils.test.ts │ │ │ ├── eventKeyUtils.tsx │ │ │ ├── initialState.ts │ │ │ ├── sidebarSlice.test.ts │ │ │ ├── sidebarSlice.ts │ │ │ ├── sidebarStorage.test.ts │ │ │ ├── sidebarStorage.ts │ │ │ ├── sidebarUtils.ts │ │ │ └── thunks │ │ │ │ ├── addFormPanel.ts │ │ │ │ ├── addTemporaryPanel.ts │ │ │ │ ├── removeFormPanel.ts │ │ │ │ ├── removeTemporaryPanel.ts │ │ │ │ └── resolveTemporaryPanel.ts │ │ └── workshopSlice.ts │ ├── telemetry │ │ ├── BackgroundLogger.ts │ │ ├── deployments.ts │ │ ├── dnt.ts │ │ ├── events.ts │ │ ├── initErrorReporter.ts │ │ ├── lexicon.ts │ │ ├── logging.test.ts │ │ ├── logging.ts │ │ ├── performance.test.ts │ │ ├── performance.ts │ │ ├── reportError.test.ts │ │ ├── reportError.ts │ │ ├── reportEvent.ts │ │ ├── reportToApplicationErrorTelemetry.test.ts │ │ ├── reportToApplicationErrorTelemetry.ts │ │ ├── reportUncaughtErrors.ts │ │ ├── telemetryHelpers.test.ts │ │ ├── telemetryHelpers.ts │ │ ├── telemetryTypes.ts │ │ ├── trace.ts │ │ ├── traceHelpers.test.ts │ │ └── traceHelpers.ts │ ├── testUtils │ │ ├── FixJsdomEnvironment.js │ │ ├── appApiMock.ts │ │ ├── extendedExpectations.ts │ │ ├── factories │ │ │ ├── authFactories.ts │ │ │ ├── brickFactories.ts │ │ │ ├── browserFactories.ts │ │ │ ├── databaseFactories.ts │ │ │ ├── deploymentFactories.ts │ │ │ ├── domFactories.ts │ │ │ ├── featureFlagFactories.ts │ │ │ ├── integrationFactories.ts │ │ │ ├── logFactories.ts │ │ │ ├── marketplaceFactories.ts │ │ │ ├── messengerFactories.ts │ │ │ ├── metadataFactory.ts │ │ │ ├── milestoneFactories.ts │ │ │ ├── modComponentFactories.ts │ │ │ ├── modDefinitionFactories.ts │ │ │ ├── modInstanceFactories.ts │ │ │ ├── modViewItemFactory.ts │ │ │ ├── organizationFactories.ts │ │ │ ├── pageEditorFactories.ts │ │ │ ├── registryFactories.ts │ │ │ ├── runtimeFactories.ts │ │ │ ├── selectorFactories.ts │ │ │ ├── sidebarEntryFactories.ts │ │ │ ├── stringFactories.ts │ │ │ └── traceFactories.ts │ │ ├── formHelpers.tsx │ │ ├── injectPlatform.ts │ │ ├── permissionsMock.ts │ │ ├── platformMock.ts │ │ ├── rawJestTransformer.mjs │ │ ├── readme.md │ │ ├── renderHookHelpers.ts │ │ ├── renderWithCommonStore.ts │ │ ├── rtkQueryFactories.ts │ │ ├── storyUtils.ts │ │ ├── testAfterEnv.ts │ │ ├── testEnv.js │ │ ├── testHelpers.tsx │ │ ├── testItRenders.tsx │ │ ├── testMiddleware.ts │ │ ├── userEventHelpers.ts │ │ └── userMock.ts │ ├── themes │ │ ├── colors.scss │ │ ├── light.ts │ │ ├── themeStore.test.ts │ │ ├── themeStore.ts │ │ ├── themeTypes.ts │ │ └── themeUtils.ts │ ├── tinyPages │ │ ├── RestrictedUrlPopupApp.tsx │ │ ├── devtools.html │ │ ├── devtools.ts │ │ ├── ephemeralForm.html │ │ ├── ephemeralForm.tsx │ │ ├── ephemeralModal.scss │ │ ├── ephemeralPanel.html │ │ ├── ephemeralPanel.tsx │ │ ├── frame.html │ │ ├── frame.ts │ │ ├── offscreen.html │ │ ├── offscreen.ts │ │ ├── offscreenDocumentController.ts │ │ ├── offscreenProtocol.ts │ │ ├── restrictedUrlPopup.html │ │ ├── restrictedUrlPopup.tsx │ │ ├── restrictedUrlPopupConstants.ts │ │ ├── restrictedUrlPopupUtils.ts │ │ ├── walkthroughModal.html │ │ └── walkthroughModal.tsx │ ├── types │ │ ├── annotationTypes.ts │ │ ├── availabilityTypes.ts │ │ ├── brickTypes.ts │ │ ├── bricks │ │ │ ├── effectTypes.ts │ │ │ ├── readerTypes.ts │ │ │ ├── rendererTypes.ts │ │ │ └── transformerTypes.ts │ │ ├── browserTypes.ts │ │ ├── contract.ts │ │ ├── deploymentTypes.ts │ │ ├── helpers.ts │ │ ├── iconTypes.ts │ │ ├── inputTypes.ts │ │ ├── loggerTypes.ts │ │ ├── messengerTypes.ts │ │ ├── modComponentTypes.ts │ │ ├── modDefinitionTypes.ts │ │ ├── modInstanceTypes.ts │ │ ├── modTypes.ts │ │ ├── networkTypes.ts │ │ ├── reactDragAndDropNext.d.ts │ │ ├── reactTableConfig.d.ts │ │ ├── registryTypes.ts │ │ ├── rendererTypes.ts │ │ ├── runtimeTypes.ts │ │ ├── schemaTypes.ts │ │ ├── semVerHelpers.test.ts │ │ ├── semVerHelpers.ts │ │ ├── sidebarTypes.ts │ │ ├── sliceTypes.ts │ │ ├── starterBrickTypes.ts │ │ ├── stringTypes.ts │ │ └── swagger.ts │ ├── urlConstants.ts │ ├── utils │ │ ├── ConsoleLogger.ts │ │ ├── SimpleEventTarget.test.ts │ │ ├── SimpleEventTarget.ts │ │ ├── a11yUtils.ts │ │ ├── arrayUtils.test.ts │ │ ├── arrayUtils.ts │ │ ├── asyncStateUtils.test.ts │ │ ├── asyncStateUtils.ts │ │ ├── browserUtils.ts │ │ ├── cachePromise.test.ts │ │ ├── cachePromise.ts │ │ ├── canvasUtils.test.ts │ │ ├── canvasUtils.ts │ │ ├── castError.test.ts │ │ ├── castError.ts │ │ ├── clipboardUtils.ts │ │ ├── deploymentUtils.test.ts │ │ ├── deploymentUtils.ts │ │ ├── detectRandomString.test.ts │ │ ├── detectRandomString.ts │ │ ├── domFieldUtils.test.ts │ │ ├── domFieldUtils.ts │ │ ├── domUtils.test.ts │ │ ├── domUtils.ts │ │ ├── editorUtils.ts │ │ ├── enrichAxiosErrors.ts │ │ ├── expectContext.ts │ │ ├── expressionUtils.test.ts │ │ ├── expressionUtils.ts │ │ ├── extensionUtils.test.ts │ │ ├── extensionUtils.ts │ │ ├── focusController.ts │ │ ├── focusTracker.ts │ │ ├── formUtils.test.ts │ │ ├── formUtils.ts │ │ ├── getOptionsArgForFieldValue.test.ts │ │ ├── getOptionsArgForFieldValue.ts │ │ ├── global.scss │ │ ├── idbUtils.test.ts │ │ ├── idbUtils.ts │ │ ├── iframeUtils.ts │ │ ├── imageUtils.ts │ │ ├── inference │ │ │ ├── inferSingleElementSelector.test.ts │ │ │ ├── inferSingleElementSelector.ts │ │ │ ├── markupInference.test.tsx │ │ │ ├── markupInference.ts │ │ │ ├── selectorInference.test.ts │ │ │ ├── selectorInference.ts │ │ │ ├── selectorInferenceUtils.test.ts │ │ │ ├── selectorInferenceUtils.ts │ │ │ ├── selectorTypes.ts │ │ │ └── siteSelectorHints.ts │ │ ├── injectIframe.test.tsx │ │ ├── injectIframe.tsx │ │ ├── injectScriptTag.tsx │ │ ├── injectStylesheet.tsx │ │ ├── layout.scss │ │ ├── legacyMessengerUtils.ts │ │ ├── mathUtils.test.ts │ │ ├── mathUtils.ts │ │ ├── modUtils.test.ts │ │ ├── modUtils.ts │ │ ├── notificationTypes.ts │ │ ├── notify.module.scss │ │ ├── notify.stories.tsx │ │ ├── notify.tsx │ │ ├── nullishUtils.test.ts │ │ ├── nullishUtils.ts │ │ ├── objToYaml.test.ts │ │ ├── objToYaml.ts │ │ ├── objectUtils.test.ts │ │ ├── objectUtils.ts │ │ ├── openAllLinksInPopups.ts │ │ ├── parseDataUrl.test.ts │ │ ├── parseDataUrl.ts │ │ ├── parseDefinitionList.test.ts │ │ ├── parseDefinitionList.ts │ │ ├── parseDomTable.test.ts │ │ ├── parseDomTable.ts │ │ ├── pluralize.ts │ │ ├── preventNativeFormSubmission.ts │ │ ├── promiseUtils.test.ts │ │ ├── promiseUtils.ts │ │ ├── reactUtils.tsx │ │ ├── registryUtils.test.ts │ │ ├── registryUtils.ts │ │ ├── sanitize.ts │ │ ├── schemaUtils.test.ts │ │ ├── schemaUtils.ts │ │ ├── selectionController.ts │ │ ├── shadowWrap.ts │ │ ├── sidePanelUtils.ts │ │ ├── storageUtils.ts │ │ ├── stringUtils.test.ts │ │ ├── stringUtils.ts │ │ ├── textAreaUtils.ts │ │ ├── themes.scss │ │ ├── timeUtils.ts │ │ ├── typeUtils.ts │ │ ├── urlUtils.test.ts │ │ ├── urlUtils.ts │ │ ├── variableUtils.test.ts │ │ └── variableUtils.ts │ ├── validators │ │ ├── formValidator.test.ts │ │ ├── formValidator.ts │ │ ├── schemaValidator.test.ts │ │ └── schemaValidator.ts │ └── vendors │ │ ├── Overlay.tsx │ │ ├── bootstrapWithoutRem.css │ │ ├── encodings.ts │ │ ├── hoverintent.d.ts │ │ ├── hoverintent.js │ │ ├── intro.js │ │ └── introjs.scss │ │ ├── jQueryInitialize.d.ts │ │ ├── jQueryInitialize.js │ │ ├── mixpanelBrowser.ts │ │ ├── page-metadata-parser │ │ ├── parser.d.ts │ │ ├── parser.js │ │ └── url-utils.js │ │ ├── pkce.ts │ │ ├── process.js │ │ ├── randomStringDetection │ │ ├── LICENSE │ │ └── detector.ts │ │ ├── reactPerformanceTesting │ │ ├── constants │ │ │ └── globalOption.ts │ │ ├── getDisplayName.ts │ │ ├── getPatchedComponent.ts │ │ ├── perf.ts │ │ ├── perfTypes.ts │ │ ├── readme.md │ │ ├── store.ts │ │ └── utils │ │ │ ├── isClassComponent.ts │ │ │ ├── isForwardRefComponent.ts │ │ │ ├── isFunctionComponent.ts │ │ │ ├── isMemoComponent.ts │ │ │ ├── pushTask.ts │ │ │ ├── shouldTrack.ts │ │ │ └── symbols.ts │ │ └── theme │ │ ├── app │ │ └── app.scss │ │ └── assets │ │ └── styles │ │ ├── _background.scss │ │ ├── _base-colors.scss │ │ ├── _dashboard.scss │ │ ├── _demo.scss │ │ ├── _footer.scss │ │ ├── _functions.scss │ │ ├── _layout.scss │ │ ├── _misc.scss │ │ ├── _navbar.scss │ │ ├── _reset.scss │ │ ├── _responsive.scss │ │ ├── _settings-panel.scss │ │ ├── _sidebar.scss │ │ ├── _spinner.scss │ │ ├── _typography.scss │ │ ├── _utilities.scss │ │ ├── _variables.scss │ │ ├── components │ │ ├── _accordions.scss │ │ ├── _badges.scss │ │ ├── _bootstrap-alerts.scss │ │ ├── _bootstrap-progress.scss │ │ ├── _breadcrumbs.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ ├── _chats.scss │ │ ├── _checkbox-radio.scss │ │ ├── _dropdowns.scss │ │ ├── _forms.scss │ │ ├── _icons.scss │ │ ├── _kanban.scss │ │ ├── _landing.scss │ │ ├── _lists.scss │ │ ├── _pagination.scss │ │ ├── _popovers.scss │ │ ├── _portfolio.scss │ │ ├── _preview.scss │ │ ├── _pricing-table.scss │ │ ├── _product-tile.scss │ │ ├── _project-list.scss │ │ ├── _react-table.scss │ │ ├── _spinner.scss │ │ ├── _tables.scss │ │ ├── _tabs.scss │ │ ├── _tickets.scss │ │ ├── _timeline.scss │ │ ├── _todo-list.scss │ │ ├── _tooltips.scss │ │ ├── _user-listing.scss │ │ ├── _user-profile.scss │ │ ├── _widgets.scss │ │ ├── email │ │ │ ├── _mail-list-container.scss │ │ │ ├── _mail-sidebar.scss │ │ │ └── _message-content.scss │ │ ├── landing-screens │ │ │ └── _auth.scss │ │ ├── loaders │ │ │ ├── _bar-loader.scss │ │ │ ├── _circle-loader.scss │ │ │ ├── _colored-balls.scss │ │ │ ├── _dot-opacity-loader.scss │ │ │ ├── _flip-square-loader.scss │ │ │ ├── _glowing-ball.scss │ │ │ ├── _jumping-dots-loader.scss │ │ │ ├── _loaders.scss │ │ │ ├── _moving-square-loader.scss │ │ │ ├── _pixel-loader.scss │ │ │ ├── _square-box.scss │ │ │ ├── _square-path-loader.scss │ │ │ └── _variables.scss │ │ └── plugin-overrides │ │ │ ├── _contex-menu.scss │ │ │ ├── _date-picker.scss │ │ │ ├── _full-calendar.scss │ │ │ ├── _jquery-jvectormap.scss │ │ │ ├── _no-ui-slider.scss │ │ │ ├── _rating.scss │ │ │ ├── _react-bootstrap-table.scss │ │ │ ├── _react-photo-gallery.scss │ │ │ ├── _react-table.scss │ │ │ ├── _react-tag-autocomplete.scss │ │ │ ├── _slick-carousel.scss │ │ │ ├── _sweet-alert.scss │ │ │ └── _wizard.scss │ │ └── mixins │ │ ├── _animation.scss │ │ ├── _badges.scss │ │ ├── _blockqoute.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ ├── _color-functions.scss │ │ ├── _misc.scss │ │ ├── _no-ui-slider.scss │ │ ├── _popovers.scss │ │ └── _tooltips.scss │ ├── static │ ├── audio │ │ ├── applause.mp3 │ │ ├── doorbell.mp3 │ │ ├── magic-wand.mp3 │ │ ├── sad-trombone.mp3 │ │ └── success.mp3 │ ├── background.worker.js │ ├── backgroundCanary.js │ ├── icons │ │ ├── beta │ │ │ ├── logo128.png │ │ │ ├── logo16.png │ │ │ ├── logo32.png │ │ │ └── logo48.png │ │ ├── inactive │ │ │ ├── logo128.png │ │ │ ├── logo16.png │ │ │ ├── logo32.png │ │ │ └── logo48.png │ │ ├── logo128.png │ │ ├── logo16.png │ │ ├── logo32.png │ │ └── logo48.png │ ├── img │ │ ├── fa-check-circle-solid-custom.svg │ │ ├── fa-circle-solid-loading-custom.svg │ │ ├── fa-exclamation-circle-custom.svg │ │ ├── fa-exclamation-triangle-custom.svg │ │ ├── fa-minus-circle-solid-custom.svg │ │ ├── google_sheets.svg │ │ ├── slack.svg │ │ └── zapier.svg │ ├── loadFonts.js │ ├── loadingScreen.css │ ├── loadingScreen.js │ └── managedStorageSchema.json │ ├── tsconfig.json │ ├── webpack.config.mjs │ └── webpack.sharedConfig.js ├── knip.mjs ├── libraries └── util-debug │ ├── .eslintrc.js │ ├── jest.config.js │ ├── package.json │ ├── src │ ├── index.ts │ └── lib │ │ ├── debugUtils.test.ts │ │ ├── debugUtils.ts │ │ └── globals.d.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.test.json ├── nx.json ├── package-lock.json ├── package.json ├── pixiebrix-extension.iml ├── tsconfig.base.json ├── tsconfig.json └── vercel.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://EditorConfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # These formatting commits are excluded from blame views because they contain no useful information. Documentation: 2 | # https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#ignore-commits-in-the-blame-view 3 | 9c0e8c268d9b800e8b56df7f8d70f0e894d373e2 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | # Collapse changes on GitHub just like for lockfiles 4 | *.snap linguist-generated 5 | public/mockServiceWorker.js linguist-generated 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request 3 | about: Suggest an idea for this project 4 | title: "" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | ## User Story 10 | 11 | As a [archetype], I [want to], [so that] 12 | 13 | ## Motivation 14 | 15 | Any other context on why we want this feature 16 | 17 | ## Acceptance Criteria 18 | 19 | Scenario: eat 5 out of 12 20 | 21 | - Given there are 12 cucumbers 22 | - When I eat 5 cucumbers 23 | - Then I should have 7 cucumbers 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/research_spike.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Research Spike 3 | about: A timeboxed investigation to answer a question or solve a problem 4 | title: "[Spike] " 5 | labels: ["spike"] 6 | assignees: "" 7 | --- 8 | 9 | ## Specs 10 | 11 | _Add a link to the Product Spec in Notion_ 12 | _Add a link to the Phase Spec in Notion_ 13 | 14 | ## Motivation 15 | 16 | _Any additional context on why we want this research_ 17 | 18 | ## Acceptance Criteria 19 | 20 | - [ ] Research phase spec updated in Notion 21 | - [ ] Spike approved by Tech Lead and PM 22 | - [ ] 23 | 24 | ## Timebox 25 | 26 | _x hours_ 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/specification.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Specification Slice 3 | about: Create implementation slices for a Phase Spec 4 | title: "[Spike] " 5 | labels: ["spike", "specification required"] 6 | assignees: "" 7 | --- 8 | 9 | ## Phase Spec 10 | 11 | - _Add a link to the Phase Spec in Notion_ 12 | 13 | ## Acceptance Criteria 14 | 15 | - [ ] Slices specified 16 | - [ ] Approval Matrix signed off 17 | - [ ] Slices converted to issues 18 | - [ ] Issues added to _insert epic name_ 19 | - [ ] Tech Lead and PM notified for prioritization 20 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | # Custom IDE settings 10 | /prettier.xml 11 | /watcherTasks.xml 12 | /jsLinters/ 13 | # Personal extensions 14 | codestream.xml 15 | # GitHub Copilot persisted chat sessions 16 | /copilot/chatSessions 17 | # Prettier defines code styles for the project 18 | codeStyles 19 | -------------------------------------------------------------------------------- /.idea/GitLinkConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/copyright/AGPLv3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/nx-angular-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 20.12.0 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # ignore artifacts 2 | bundles 3 | coverage 4 | 5 | # ignore libraries 6 | node_modules 7 | **/public/mockServiceWorker.js 8 | 9 | # ignore snapshots 10 | **/*-snapshots/** 11 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /applications/browser-extension/.eslintignore: -------------------------------------------------------------------------------- 1 | artifacts 2 | selenium 3 | src/vendors 4 | src/types/swagger.ts 5 | -------------------------------------------------------------------------------- /applications/browser-extension/.storybook/preview-body.html: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/ebay-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: "ebay/search" 5 | version: 1.0.0 6 | name: eBay search in new tab 7 | description: Runs a eBay search in a new tab 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | query: 13 | type: string 14 | description: The search query 15 | required: 16 | - query 17 | pipeline: 18 | - id: "@pixiebrix/browser/open-tab" 19 | config: 20 | url: https://www.ebay.com/sch/ 21 | params: 22 | _nkw: query 23 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/google-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: "google/search" 5 | version: 0.0.1 6 | name: Google Search in new tab 7 | description: Runs a Google search in a new tab 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | query: 13 | type: string 14 | description: The search query 15 | required: 16 | - query 17 | pipeline: 18 | - id: "@pixiebrix/browser/open-tab" 19 | config: 20 | url: https://www.google.com/search 21 | params: 22 | q: query 23 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/hackernews.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: "hackernews/article-table" 5 | version: 0.0.1 6 | name: Hacker News article search 7 | description: A table of the latest HN articles for a search 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | query: 13 | type: string 14 | description: The query to search on Hacker News 15 | required: 16 | - organizationName 17 | pipeline: 18 | # TODO: add a jq step to filter articles without titles 19 | - id: "@pixiebrix/get" 20 | config: 21 | url: https://hn.algolia.com/api/v1/search 22 | params: 23 | query: query 24 | - id: "@pixiebrix/table" 25 | config: 26 | columns: 27 | - property: author 28 | label: Author 29 | - property: title 30 | label: Article Title 31 | href: url 32 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/hubspot-person-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: "hubspot/contact-search" 5 | version: 0.0.1 6 | name: Hubspot Contact Search 7 | description: Search for contacts by email, name, phone number, or company 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | hubspotService: 13 | $ref: "https://app.pixiebrix.com/schemas/services/hubspot/api" 14 | query: 15 | type: string 16 | description: The search query. You can use all of a word or just parts of a word as well. 17 | required: 18 | - query 19 | pipeline: 20 | - id: "@pixiebrix/get" 21 | config: 22 | service: hubspotService 23 | url: https://api.hubapi.com/contacts/v1/search/query 24 | params: 25 | q: query 26 | - id: "@pixiebrix/jq" 27 | config: 28 | filter: ".contacts[0]" 29 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/linkedin-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: "linkedin/search" 5 | version: 1.1.0 6 | name: LinkedIn Search in new tab 7 | description: Runs a LinkedIn search in a new tab 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | query: 13 | type: string 14 | description: The search query 15 | type: 16 | type: string 17 | description: The search type 18 | default: all 19 | enum: 20 | - all 21 | - people 22 | - events 23 | - content 24 | - companies 25 | - schools 26 | - groups 27 | required: 28 | - query 29 | pipeline: 30 | - id: "@pixiebrix/browser/open-tab" 31 | config: 32 | url: https://www.linkedin.com/search/results/{{type}}{{^type}}all{{/type}}/ 33 | params: 34 | keywords: query 35 | origin: GLOBAL_SEARCH_HEADER 36 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/yelp-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: "yelp/search" 5 | version: 1.0.0 6 | name: Yelp Search in new tab 7 | description: Runs a Yelp search in a new tab 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | query: 13 | type: string 14 | description: Name or description, e.g., plumbers, delivery, takeout 15 | location: 16 | type: string 17 | description: Location, e.g., New York, NY 18 | required: 19 | - query 20 | pipeline: 21 | - id: "@pixiebrix/browser/open-tab" 22 | config: 23 | url: https://www.yelp.com/search 24 | params: 25 | ns: "1" 26 | find_desc: "{{{ query }}}" 27 | find_loc: "{{{ location }}}" 28 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/youtube-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: "youtube/search" 5 | version: 1.0.0 6 | name: YouTube search in new tab 7 | description: Runs a YouTube search in a new tab 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | query: 13 | type: string 14 | description: The search query 15 | required: 16 | - query 17 | pipeline: 18 | - id: "@pixiebrix/browser/open-tab" 19 | config: 20 | url: https://www.youtube.com/results 21 | params: 22 | search_query: query 23 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/bricks/youtube.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: component 3 | metadata: 4 | id: youtube/video 5 | version: 0.0.1 6 | name: YouTube Video 7 | description: Embedded YouTube video 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | videoId: 13 | type: string 14 | description: The YouTube video id (not the URL) 15 | width: 16 | type: integer 17 | height: 18 | type: integer 19 | required: 20 | - videoId 21 | pipeline: 22 | - id: "@pixiebrix/iframe" 23 | config: 24 | url: https://www.youtube.com/embed/{{videoId}} 25 | width: width 26 | height: height 27 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/google-bigquery-dataset.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: google/bigquery-dataset 5 | version: 0.0.1 6 | name: Google BigQuery dataset 7 | description: A Google BigQuery dataset 8 | url: https://cloud.google.com/bigquery/docs/datasets-intro 9 | inputSchema: 10 | $schema: "https://json-schema.org/draft/2019-09/schema#" 11 | type: object 12 | properties: 13 | projectId: 14 | type: string 15 | description: The project id 16 | datasetId: 17 | type: string 18 | description: The dataset id 19 | required: 20 | - projectId 21 | - datasetId 22 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/google-geocode.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: google/geocode-api 5 | version: 0.0.1 6 | name: Google Geocoding API 7 | description: Geocoding API for looking up place names 8 | url: https://developers.google.com/maps/documentation/geocoding/overview 9 | inputSchema: 10 | $schema: "https://json-schema.org/draft/2019-09/schema#" 11 | type: object 12 | properties: 13 | apiKey: 14 | $ref: "https://app.pixiebrix.com/schemas/key#" 15 | description: Your Google Geocoding API key 16 | required: 17 | - apiKey 18 | authentication: 19 | params: 20 | key: "{{apiKey}}" 21 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/google-sheet.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: google/sheet 5 | version: 0.0.2 6 | name: "[Deprecated] Google Sheet" 7 | description: A Google Sheet 8 | url: https://sheets.google.com 9 | inputSchema: 10 | $schema: "https://json-schema.org/draft/2019-09/schema#" 11 | type: object 12 | properties: 13 | spreadsheetId: 14 | $ref: "https://app.pixiebrix.com/schemas/googleSheetId#" 15 | required: 16 | - spreadsheetId 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/greenhouse.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: greenhouse/api 5 | version: 1.0.0 6 | name: Greenhouse ATS API 7 | description: The Greenhouse Harvest API 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | apiToken: 13 | $ref: "https://app.pixiebrix.com/schemas/key#" 14 | description: Your Greenhouse API token 15 | required: 16 | - apiToken 17 | authentication: 18 | baseURL: "https://harvest.greenhouse.io" 19 | basic: 20 | # https://developers.greenhouse.io/harvest.html#authentication 21 | username: "{{{ apiToken }}}" 22 | password: "" 23 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/hubspot.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: hubspot/api 5 | version: 1.0.0 6 | name: Hubspot API 7 | description: The legacy Hubspot API 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | apiKey: 13 | $ref: "https://app.pixiebrix.com/schemas/key#" 14 | description: Your Hubspot API key 15 | required: 16 | - apiKey 17 | authentication: 18 | params: 19 | hapikey: "{{apiKey}}" 20 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/hunter.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: hunter/api 5 | version: 1.0.0 6 | name: Hunter API 7 | description: Hunter lets you find email addresses in seconds and connect with the people that matter for your business. 8 | isAvailable: 9 | matchPatterns: https://api.hunter.io/* 10 | inputSchema: 11 | $schema: "https://json-schema.org/draft/2019-09/schema#" 12 | type: object 13 | properties: 14 | apiKey: 15 | $ref: "https://app.pixiebrix.com/schemas/key#" 16 | description: Your Hunter secret key 17 | required: 18 | - apiKey 19 | authentication: 20 | params: 21 | api_key: "{{&apiKey}}" 22 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/nytimes.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: nytimes/api 5 | version: 0.0.1 6 | name: New York Times API 7 | description: The New York Times API 8 | url: https://developer.nytimes.com/ 9 | inputSchema: 10 | $schema: "https://json-schema.org/draft/2019-09/schema#" 11 | type: object 12 | properties: 13 | apiKey: 14 | $ref: "https://app.pixiebrix.com/schemas/key#" 15 | description: Your NYT API key 16 | required: 17 | - apiKey 18 | authentication: 19 | params: 20 | api-key: "{{apiKey}}" 21 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/pipedrive.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: pipedrive/api 5 | version: 0.0.1 6 | name: Pipedrive 7 | description: Pipedrive CRM API 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | apiToken: 13 | $ref: "https://app.pixiebrix.com/schemas/key#" 14 | description: Your Pipedrive API Key 15 | subdomain: 16 | type: string 17 | description: "The subdomain of your Pipedrive instance URL" 18 | required: 19 | - apiToken 20 | authentication: 21 | params: 22 | api_token: "{{apiToken}}" 23 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/pixiebrix.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: "@pixiebrix/api" 5 | version: 0.0.1 6 | name: PixieBrix API 7 | description: The PixieBrix API, also used to access services with shared credentials 8 | inputSchema: 9 | $schema: "https://json-schema.org/draft/2019-09/schema#" 10 | type: object 11 | properties: 12 | apiKey: 13 | $ref: "https://app.pixiebrix.com/schemas/key#" 14 | description: Your PixieBrix API key 15 | required: 16 | - apiKey 17 | authentication: 18 | headers: 19 | Authorization: Token {{apiKey}} 20 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/rapidapi.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: rapidapi/api 5 | version: 0.0.1 6 | name: RapidAPI 7 | description: Find and Connect to Thousands of APIs 8 | url: https://rapidapi.com/ 9 | inputSchema: 10 | $schema: "https://json-schema.org/draft/2019-09/schema#" 11 | type: object 12 | properties: 13 | host: 14 | description: The host of the API you are accessing, x-rapidapi-host 15 | key: 16 | $ref: "https://app.pixiebrix.com/schemas/key#" 17 | description: Your RapidAPI key, x-rapidapi-key 18 | required: 19 | - key 20 | - host 21 | authentication: 22 | headers: 23 | x-rapidapi-key: "{{key}}" 24 | x-rapidapi-host: "{{host}}" 25 | useQueryString: "true" 26 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/salesforce.yaml: -------------------------------------------------------------------------------- 1 | # https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/quickstart_oauth.htm 2 | apiVersion: v1 3 | kind: service 4 | metadata: 5 | id: salesforce/oauth2 6 | version: 1.0.0 7 | name: Salesforce 8 | description: Salesforce OAuth2 authentication 9 | url: https://www.salesforce.com/ 10 | isAvailable: 11 | matchPatterns: https://*.salesforce.com/* 12 | inputSchema: 13 | $schema: "https://json-schema.org/draft/2019-09/schema#" 14 | type: object 15 | properties: 16 | host: 17 | type: string 18 | description: The Salesforce base URL 19 | default: https://login.salesforce.com/ 20 | consumerKey: 21 | type: string 22 | description: Consumer Key of the Connected App 23 | required: 24 | - host 25 | - consumerKey 26 | authentication: 27 | baseURL: "{{&instance_url}}" 28 | oauth2: 29 | host: "{{&host}}" 30 | client_id: "{{consumerKey}}" 31 | headers: 32 | Authorization: "{{token_type}} {{access_token}}" 33 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/integrations/serpapi.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: serpapi/api 5 | version: 0.0.1 6 | name: SerpAPI 7 | description: Access Google, Ebay, Walmart and services via API 8 | url: https://serpapi.com/ 9 | inputSchema: 10 | $schema: "https://json-schema.org/draft/2019-09/schema#" 11 | type: object 12 | properties: 13 | apiKey: 14 | $ref: "https://app.pixiebrix.com/schemas/key#" 15 | description: Your SerpAPI key 16 | required: 17 | - apiKey 18 | authentication: 19 | params: 20 | api_key: "{{apiKey}}" 21 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/raw/hunter.txt: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: service 3 | metadata: 4 | id: hunter/api 5 | version: 1.0.0 6 | name: Hunter API 7 | description: Hunter lets you find email addresses in seconds and connect with the people that matter for your business. 8 | isAvailable: 9 | matchPatterns: https://api.hunter.io/* 10 | inputSchema: 11 | $schema: "https://json-schema.org/draft/2019-09/schema#" 12 | type: object 13 | properties: 14 | apiKey: 15 | $ref: "https://app.pixiebrix.com/schemas/key#" 16 | description: Your Hunter secret key 17 | required: 18 | - apiKey 19 | authentication: 20 | params: 21 | api_key: "{{&apiKey}}" 22 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/readers/empty-jquery-reader.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: reader 3 | metadata: 4 | id: test/empty-jquery-reader 5 | version: 0.0.1 6 | name: Empty JQuery Reader 7 | description: "Empty JQuery reader for testing purposes; Page Editor used to produce reader definitions" 8 | definition: 9 | reader: 10 | type: jquery 11 | selectors: {} 12 | outputSchema: 13 | $schema: https://json-schema.org/draft-04/schema# 14 | title: Inferred Schema 15 | type: object 16 | properties: {} 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/readers/linkedin-organization-reader.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: reader 3 | metadata: 4 | id: linkedin/organization-summary 5 | version: 0.0.1 6 | name: LinkedIn Company Summary 7 | description: Read company information from a company profile page 8 | definition: 9 | reader: 10 | type: emberjs 11 | selector: ".org-top-card" 12 | attrs: organization 13 | isAvailable: 14 | matchPatterns: "https://*.linkedin.com/*" 15 | selectors: ".organization-outlet" 16 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/amazon.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: amazon/template-search 5 | version: 1.0.0 6 | name: Amazon Search Context Menu 7 | description: Amazon search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search Amazon 11 | config: 12 | title: Amazon 13 | action: 14 | id: amazon/search 15 | config: 16 | query: selectionText 17 | - id: "@pixiebrix/context-search" 18 | label: Search Books on Amazon 19 | config: 20 | title: "Amazon: Books" 21 | action: 22 | id: amazon/search 23 | config: 24 | query: selectionText 25 | department: stripbooks 26 | - id: "@pixiebrix/context-search" 27 | label: Search Amazon Video 28 | config: 29 | title: "Amazon: Video" 30 | action: 31 | id: amazon/search 32 | config: 33 | query: selectionText 34 | department: instant-video 35 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/duckduckgo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: duckduckgo/template-search 5 | version: 1.0.0 6 | name: DuckDuckGo Search Context Menu 7 | description: DuckDuckGo search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search DuckDuckGo 11 | config: 12 | title: DuckDuckGo 13 | action: 14 | id: duckduckgo/search 15 | config: 16 | query: selectionText 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/ebay.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: ebay/template-search 5 | version: 1.0.0 6 | name: eBay Search Context Menu 7 | description: eBay search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search eBay 11 | config: 12 | title: eBay 13 | action: 14 | id: ebay/search 15 | config: 16 | query: selectionText 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/google.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: google/template-search 5 | version: 1.0.0 6 | name: Google Search Context Menu 7 | description: Google search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search Google 11 | config: 12 | title: Google 13 | action: 14 | id: google/search 15 | config: 16 | query: selectionText 17 | - id: "@pixiebrix/context-search" 18 | label: Search PDFs on Google 19 | config: 20 | title: "Google: PDFs" 21 | action: 22 | id: google/search 23 | config: 24 | query: "filetype:pdf {{{ selectionText }}}" 25 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/quora.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: quora/template-search 5 | version: 1.0.0 6 | name: Quora Search Context Menu 7 | description: Quora search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search Quora 11 | config: 12 | title: Quora 13 | action: 14 | id: quora/search 15 | config: 16 | query: selectionText 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/reddit.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: reddit/template-search 5 | version: 1.0.0 6 | name: Reddit Search Context Menu 7 | description: Reddit search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search Reddit 11 | config: 12 | title: Reddit 13 | action: 14 | id: reddit/search 15 | config: 16 | query: selectionText 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/yelp.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: yelp/template-search 5 | version: 1.0.0 6 | name: Yelp Search Context Menu 7 | description: Yelp search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search Yelp 11 | config: 12 | title: Yelp 13 | action: 14 | id: yelp/search 15 | config: 16 | query: selectionText 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/contextMenus/youtube.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: youtube/template-search 5 | version: 1.0.0 6 | name: YouTube Search Context Menu 7 | description: YouTube search context menus 8 | extensionPoints: 9 | - id: "@pixiebrix/context-search" 10 | label: Search YouTube 11 | config: 12 | title: YouTube 13 | action: 14 | id: youtube/search 15 | config: 16 | query: selectionText 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/definition-example.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: test/definition-example 5 | version: 1.0.0 6 | name: Internal Context Menu Extension Pooin 7 | description: Yelp search context menus 8 | definitions: 9 | search: 10 | kind: extensionPoint 11 | definition: 12 | type: contextMenu 13 | reader: "@pixiebrix/document-context" 14 | contexts: 15 | - selection 16 | documentUrlPatterns: 17 | - "*://*/*" 18 | 19 | extensionPoints: 20 | - id: search 21 | label: Search Yelp 22 | config: 23 | title: Yelp 24 | action: 25 | id: yelp/search 26 | config: 27 | query: selectionText 28 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/linkedin-company-news.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: linkedin/company-news 5 | version: 0.0.1 6 | name: LinkedIn Company News 7 | description: Show NYTimes articles about companies 8 | extensionPoints: 9 | - id: "linkedin/person-panel" 10 | label: NYTimes Articles 11 | config: 12 | heading: NYTimes Articles for {{currentCompanyName}} 13 | collapsible: True 14 | body: 15 | id: "nytimes/organization-articles" 16 | config: 17 | organizationName: currentCompanyName 18 | - id: "linkedin/organization-panel" 19 | label: NYTimes Articles 20 | config: 21 | heading: NYTimes Articles 22 | collapsible: True 23 | body: 24 | id: "nytimes/organization-articles" 25 | config: 26 | organizationName: name 27 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/linkedin-google-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: linkedin/google-search 5 | version: 0.0.1 6 | name: LinkedIn Google Search 7 | description: Add a Google Search menu item to profile pages 8 | extensionPoints: 9 | - id: "linkedin/person-menu" 10 | label: Google Search 11 | config: 12 | caption: Google Search 13 | icon: 14 | id: google 15 | library: simple-icons 16 | size: 10 17 | action: 18 | id: google/search 19 | config: 20 | query: '"{{&firstName}} {{&lastName}}" {{¤tCompanyName}}' 21 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/linkedin-pipedrive-panel.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: linkedin/pipedrive 5 | version: 0.0.1 6 | name: LinkedIn Pipedrive Activity 7 | description: Show a panel with Pipedrive activity on profile pages 8 | extensionPoints: 9 | - id: "linkedin/person-panel" 10 | label: Pipedrive Activity 11 | config: 12 | heading: Pipedrive Activity for {{firstName}} 13 | body: 14 | id: pipedrive/person-activity 15 | config: 16 | personName: "{{&firstName}} {{&lastName}}" 17 | organizationName: currentCompanyName 18 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/linkedin-scholar.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: linkedin/google-scholar 5 | version: 0.0.1 6 | name: LinkedIn Google Scholar 7 | description: Show Google Scholar results on LinkedIn profiles 8 | extensionPoints: 9 | - id: "linkedin/person-panel" 10 | label: Google Scholar 11 | services: 12 | serpapi: serpapi/api 13 | config: 14 | heading: Google Scholar results for for {{firstName}} {{lastName}} 15 | collapsible: True 16 | body: 17 | id: google/scholar-table 18 | config: 19 | service: "@service" 20 | query: '"{{&firstName}} {{&lastName}}"' 21 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/pipedrive-workday.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: pipedrive/calendar-workday 5 | version: 0.0.1 6 | name: Pipedrive Calendar Workday 7 | description: Highlight your workday on the Pipedrive activity calendar 8 | extensionPoints: 9 | - id: "pipedrive/calendar-range" 10 | label: Pipedrive Workday 11 | config: 12 | ranges: 13 | id: "@pixiebrix/jq" 14 | config: 15 | filter: '[{color: "#F1ADFF", days: ["Mon", "Tue", "Wed", "Thu", "Fri"], startTime: "9 AM", endTime: "5 PM"}]' 16 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/recipes/trello-slack.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: recipe 3 | metadata: 4 | id: trello/share-slack 5 | version: 0.0.1 6 | name: Send Trello Cards to Slack 7 | description: Sends a Trello Card to a Slack Channel 8 | extensionPoints: 9 | - id: "trello/card-action" 10 | label: Send to Slack 11 | services: 12 | slack: slack/incoming-webhook 13 | config: 14 | caption: Send to Slack 15 | icon: 16 | id: slack 17 | library: simple-icons 18 | size: 12 19 | action: 20 | id: slack/advanced-message 21 | config: 22 | hookUrl: "@slack.hookUrl" 23 | iconEmoji: "@slack.iconEmoji" 24 | botName: "@slack.botName" 25 | attachments: 26 | - fallback: "Check out this Trello card: {{name}}" 27 | text: "Check out this Trello card <{{&url}}|{{name}}>" 28 | fields: 29 | - title: Due 30 | value: "{{due}}" 31 | short: true 32 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/apartments-property-button.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: "apartments.com/property-button" 5 | version: 0.0.1 6 | name: Apartments.com Button 7 | description: Add a Button to Apartments.com 8 | definition: 9 | type: menuItem 10 | reader: 11 | - "apartments.com/property-reader" 12 | - document: "@pixiebrix/document-context" 13 | isAvailable: 14 | matchPatterns: https://www.apartments.com/* 15 | selectors: "#propertyHeader" 16 | containerSelector: 17 | - "#propertyHeader" 18 | - ".propertyInformationColumn" 19 | template: | 20 |
21 | {{&icon}} 22 |
23 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/linkedin-contact-info-button.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: "linkedin/contact-info-button" 5 | version: 0.0.1 6 | name: LinkedIn Contact Info Button 7 | description: Add a button to the LinkedIn Contact Info dialog 8 | definition: 9 | type: menuItem 10 | reader: 11 | - linkedin/person-summary 12 | - "linkedin/contact-info" 13 | isAvailable: 14 | matchPatterns: https://*.linkedin.com/*/detail/contact-info/ 15 | selectors: "#profile-content" 16 | defaultOptions: 17 | caption: "Custom Action" 18 | containerSelector: 19 | - ".pv-contact-info" 20 | template: | 21 | 24 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/linkedin-organization-button.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: "linkedin/organization-button" 5 | version: 0.0.1 6 | name: LinkedIn Company Button 7 | description: Add a button to the LinkedIn company page 8 | definition: 9 | type: menuItem 10 | reader: "linkedin/organization-summary" 11 | isAvailable: 12 | matchPatterns: https://*.linkedin.com/company/* 13 | selectors: ".organization-outlet" 14 | defaultOptions: 15 | caption: Custom Action 16 | containerSelector: 17 | - ".org-top-card-primary-actions" 18 | template: | 19 | 22 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/linkedin-organization-panel.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: linkedin/organization-panel 5 | version: 0.0.1 6 | name: LinkedIn Company Panel 7 | description: Add a panel to the LinkedIn company profile page 8 | definition: 9 | type: panel 10 | reader: "linkedin/organization-summary" 11 | isAvailable: 12 | matchPatterns: https://*.linkedin.com/* 13 | selectors: ".organization-outlet" 14 | defaultOptions: 15 | caption: "Custom Panel for {{companyName}}" 16 | containerSelector: ".org-grid__core-rail" 17 | position: prepend 18 | template: | 19 |
20 |
21 |
22 |

{{heading}}

23 |
24 |
25 | {{&body}} 26 |
27 |
28 |
29 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/linkedin-person-panel.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: linkedin/person-panel 5 | version: 0.0.1 6 | name: LinkedIn Profile Panel 7 | description: Add a panel to the LinkedIn user profile page 8 | definition: 9 | type: panel 10 | reader: linkedin/person-summary 11 | isAvailable: 12 | matchPatterns: https://*.linkedin.com/* 13 | selectors: "#profile-content" 14 | defaultOptions: 15 | caption: "Custom Panel for {{firstName}}" 16 | containerSelector: ".profile-detail" 17 | position: prepend 18 | template: | 19 |
20 |
21 |
22 |

{{heading}}

23 | {{&body}} 24 |
25 |
26 |
27 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/pipedrive-deal-panel.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: pipedrive/deal-panel 5 | version: 0.0.1 6 | name: Pipedrive Deal Panel 7 | description: A Pipedrive deal panel 8 | definition: 9 | type: panel 10 | reader: pipedrive/deal 11 | isAvailable: 12 | matchPatterns: https://*.pipedrive.com/deal/* 13 | containerSelector: ".sidebar" 14 | template: | 15 |
16 |
{{heading}}
17 |
{{&body}}
18 |
19 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/pipedrive-organization-extension.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: pipedrive/organization-panel 5 | version: 0.0.1 6 | name: Pipedrive Organization Panel 7 | description: A Pipedrive organization panel 8 | definition: 9 | type: panel 10 | reader: pipedrive/organization 11 | isAvailable: 12 | matchPatterns: https://*.pipedrive.com/organization/* 13 | containerSelector: ".sidebar" 14 | template: | 15 |
16 |
{{heading}}
17 |
{{&body}}
18 |
19 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/pipedrive-person-extension.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: pipedrive/person-panel 5 | version: 0.0.1 6 | name: Pipedrive Person Panel 7 | description: A Pipedrive person panel 8 | definition: 9 | type: panel 10 | reader: pipedrive/person 11 | isAvailable: 12 | matchPatterns: https://*.pipedrive.com/person/* 13 | containerSelector: ".sidebar" 14 | template: | 15 |
16 |
{{heading}}
17 |
{{&body}}
18 |
19 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/redfin-button.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: redfin/property-button 5 | version: 0.0.1 6 | name: Redfin Button 7 | description: Add a Button to Redfin 8 | definition: 9 | type: menuItem 10 | reader: 11 | - redfin/property 12 | - document: "@pixiebrix/document-context" 13 | isAvailable: 14 | matchPatterns: https://www.redfin.com/* 15 | selectors: "body.HomeDetailsPage" 16 | containerSelector: 17 | - "#overview-scroll" 18 | - ".HomeControls" 19 | - ".pill-container" 20 | template: | 21 |
22 |
23 |
24 |
25 |
26 | {{&icon}} 27 |
28 |
{{caption}}
29 |
30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/selection-search.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: "@pixiebrix/context-search" 5 | version: 1.0.0 6 | name: Selection Context Menu 7 | description: Base Context Menu that provides base context menu properties 8 | definition: 9 | type: contextMenu 10 | reader: "@pixiebrix/document-context" 11 | contexts: 12 | - selection 13 | documentUrlPatterns: 14 | - "*://*/*" 15 | isAvailable: 16 | matchPatterns: [] 17 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/trello-card-action.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: trello/card-action 5 | version: 0.0.1 6 | name: Trello card action 7 | description: Add a suggestion action to Trello cards 8 | definition: 9 | type: menuItem 10 | reader: trello/card 11 | isAvailable: 12 | matchPatterns: https://trello.com/* 13 | containerSelector: 14 | - ".card-detail-window" 15 | - ".window-module.suggested-actions-module" 16 | - ".u-clearfix" 17 | template: | 18 | 19 | 20 | {{caption}} 21 | 22 | -------------------------------------------------------------------------------- /applications/browser-extension/contrib/starterBricks/zillow-button.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: extensionPoint 3 | metadata: 4 | id: zillow/property-button 5 | version: 0.0.1 6 | name: Zillow Button 7 | description: Add a Button to Zillow's Property Action Menu 8 | definition: 9 | type: menuItem 10 | reader: 11 | - zillow/property 12 | - document: "@pixiebrix/document-context" 13 | isAvailable: 14 | matchPatterns: https://www.zillow.com/homedetails/* 15 | containerSelector: 16 | - ".details-page-container" 17 | - ".ds-action-bar" 18 | - "ul" 19 | template: | 20 |
  • 21 | 29 |
  • 30 | -------------------------------------------------------------------------------- /applications/browser-extension/end-to-end-tests/pageObjects/pageEditor/dataPanel.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | import { BasePageObject } from "../basePageObject"; 19 | 20 | export class DataPanel extends BasePageObject {} 21 | -------------------------------------------------------------------------------- /applications/browser-extension/end-to-end-tests/tests/workshop/createMod.spec.ts-snapshots/can-create-a-new-mod-from-a-yaml-definition-and-update-it/no-changes.diff: -------------------------------------------------------------------------------- 1 | Index: no-changes 2 | =================================================================== 3 | --- no-changes 4 | +++ no-changes 5 | -------------------------------------------------------------------------------- /applications/browser-extension/img/aa-logo-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/aa-logo-small.png -------------------------------------------------------------------------------- /applications/browser-extension/img/blueprint-activation-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/blueprint-activation-complete.png -------------------------------------------------------------------------------- /applications/browser-extension/img/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/demo.gif -------------------------------------------------------------------------------- /applications/browser-extension/img/devtools-dock-bottom-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /applications/browser-extension/img/devtools-docking-context-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/devtools-docking-context-menu.png -------------------------------------------------------------------------------- /applications/browser-extension/img/devtools-pixiebrix-toolbar-hidden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/devtools-pixiebrix-toolbar-hidden.png -------------------------------------------------------------------------------- /applications/browser-extension/img/devtools-pixiebrix-toolbar-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/devtools-pixiebrix-toolbar-screenshot.png -------------------------------------------------------------------------------- /applications/browser-extension/img/devtools-pixiebrix-toolbar-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/devtools-pixiebrix-toolbar-tab.png -------------------------------------------------------------------------------- /applications/browser-extension/img/example-permissions-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/example-permissions-dialog.png -------------------------------------------------------------------------------- /applications/browser-extension/img/home-pane-bg-illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/home-pane-bg-illustration.png -------------------------------------------------------------------------------- /applications/browser-extension/img/home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /applications/browser-extension/img/inspect-context-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixiebrix/pixiebrix-extension/0248b8273e588c1dea46efeecc13584f8f662691/applications/browser-extension/img/inspect-context-menu.png -------------------------------------------------------------------------------- /applications/browser-extension/project.json: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "build": { 4 | "outputs": ["{workspaceRoot}/dist"], 5 | "cache": true, 6 | "dependsOn": ["^build"] 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/database.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/database#", 4 | "type": "string", 5 | "format": "uuid" 6 | } 7 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/effect.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/effect#", 4 | "type": "object", 5 | "title": "PixieBrix Effect", 6 | "description": "Placeholder for a effect component/brick.", 7 | "properties": { 8 | "apiVersion": { 9 | "type": "string", 10 | "enum": ["v1", "v2", "v3"] 11 | }, 12 | "kind": { 13 | "type": "string", 14 | "const": "component" 15 | }, 16 | "metadata": { "$ref": "https://app.pixiebrix.com/schemas/metadata#" }, 17 | "inputSchema": { "$ref": "http://json-schema.org/draft-07/schema#" } 18 | }, 19 | "additionalProperties": true, 20 | "required": ["apiVersion", "kind", "metadata", "inputSchema"] 21 | } 22 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/element.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/element#", 4 | "type": "string", 5 | "format": "uuid" 6 | } 7 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/googleSheetId.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/googleSheetId#", 4 | "type": "string", 5 | "title": "Google Sheet", 6 | "description": "Select a Google Sheet. The first row in your sheet MUST contain headings.", 7 | "minLength": 1 8 | } 9 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/icon#", 4 | "type": "object", 5 | "properties": { 6 | "id": { 7 | "type": "string" 8 | }, 9 | "library": { 10 | "type": "string", 11 | "enum": ["bootstrap", "simple-icons", "custom"] 12 | }, 13 | "color": { 14 | "type": "string", 15 | "default": "#ae87e8" 16 | }, 17 | "size": { 18 | "type": "number", 19 | "default": 14, 20 | "minimum": 1 21 | } 22 | }, 23 | "required": ["id", "library"] 24 | } 25 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/innerDefinition.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/innerDefinition#", 4 | "type": "object", 5 | "title": "PixieBrix Inner Definition", 6 | "description": "An inner definition without an explicit id/version", 7 | "properties": { 8 | "apiVersion": { 9 | "type": "string", 10 | "enum": ["v1", "v2", "v3"] 11 | }, 12 | "kind": { 13 | "type": "string", 14 | "enum": ["reader", "extensionPoint", "component"] 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/key.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/key#", 4 | "type": "string", 5 | "description": "An key/secret used for authentication with an external service", 6 | "minLength": 1 7 | } 8 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/pipeline.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/pipeline#", 4 | "title": "PixieBrix pipeline expression", 5 | "description": "A sequence of PixieBrix bricks", 6 | "type": "object", 7 | "properties": { 8 | "__type__": { 9 | "type": "string", 10 | "const": "pipeline" 11 | }, 12 | "__value__": { 13 | "type": "array", 14 | "items": { 15 | "type": "object", 16 | "properties": { 17 | "id": { 18 | "anyOf": [ 19 | { "type": "string" }, 20 | { "$ref": "https://app.pixiebrix.com/schemas/ref#/block" } 21 | ], 22 | "description": "The id of the block, or an inner definition key" 23 | }, 24 | "config": { 25 | "type": "object", 26 | "description": "The configuration for the block" 27 | } 28 | }, 29 | "required": ["id"] 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /applications/browser-extension/schemas/renderer.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "https://app.pixiebrix.com/schemas/renderer#", 4 | "type": "object", 5 | "title": "PixieBrix Renderer", 6 | "description": "Placeholder for a renderer component/brick.", 7 | "properties": { 8 | "apiVersion": { 9 | "type": "string", 10 | "enum": ["v1", "v2", "v3"] 11 | }, 12 | "kind": { 13 | "type": "string", 14 | "const": "component" 15 | }, 16 | "metadata": { "$ref": "https://app.pixiebrix.com/schemas/metadata#" }, 17 | "inputSchema": { "$ref": "http://json-schema.org/draft-07/schema#" } 18 | }, 19 | "additionalProperties": true, 20 | "required": ["apiVersion", "kind", "metadata", "inputSchema"] 21 | } 22 | -------------------------------------------------------------------------------- /applications/browser-extension/scripts/env.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export function loadEnv(): void; 19 | export function parseEnv(): void; 20 | -------------------------------------------------------------------------------- /applications/browser-extension/scripts/rainforest-qa-local.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Automatically exit on error 4 | set -e 5 | 6 | # Use local environment configuration 7 | set -a 8 | source .env.development 9 | set +a 10 | 11 | # Ensure ENVs are set https://stackoverflow.com/a/307735/288906 12 | : "${BUILD_PATH?Need to set BUILD_PATH}" 13 | : "${BUILD_FILENAME?Need to set BUILD_FILENAME}" 14 | 15 | # Although these checks are already part of the AWS command, 16 | # we'd like to notify the user about missing variables before the 17 | # build & compression (which takes about a minute or two) 18 | : "${AWS_ACCESS_KEY_ID?Need to set AWS_ACCESS_KEY_ID}" 19 | : "${AWS_SECRET_ACCESS_KEY?Need to set AWS_SECRET_ACCESS_KEY}" 20 | : "${AWS_DEFAULT_REGION?Need to set AWS_DEFAULT_REGION}" 21 | 22 | web-ext build --filename=$BUILD_FILENAME --overwrite-dest 23 | aws s3 cp "web-ext-artifacts/$BUILD_FILENAME" "s3://pixiebrix-extension-builds/$BUILD_PATH" --no-progress 24 | -------------------------------------------------------------------------------- /applications/browser-extension/scripts/upload-extension.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Automatically exit on error 4 | set -e 5 | 6 | if [ "$#" -ne 1 ]; then 7 | echo "Usage: ./upload-extension.sh " 8 | echo "example: ./upload-extension.sh builds/pixiebrix-extension-cws.zip" 9 | fi 10 | 11 | # Ensure ENVs are set https://stackoverflow.com/a/307735/288906 12 | # Extract everything after last slash https://unix.stackexchange.com/a/247636 13 | BUILD_PATH=$1 14 | BUILD_FILENAME="${BUILD_PATH##*/}" 15 | 16 | : "${AWS_ACCESS_KEY_ID?Need to set AWS_ACCESS_KEY_ID}" 17 | : "${AWS_SECRET_ACCESS_KEY?Need to set AWS_SECRET_ACCESS_KEY}" 18 | : "${AWS_DEFAULT_REGION?Need to set AWS_DEFAULT_REGION}" 19 | 20 | # Ensure we only zip up the dist dir (exclude the applications and browser-extension directories) 21 | cd applications/browser-extension 22 | zip -r "../../$BUILD_FILENAME" dist -x '*.map' 23 | cd - 24 | 25 | aws s3 cp "$BUILD_FILENAME" "s3://pixiebrix-extension-builds/$BUILD_PATH" --no-progress 26 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@/hooks/useContextInvalidated.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export default () => false; 19 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@/sandbox/messenger/api.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | // Skip the sandbox messenger during tests 19 | export * from "@/sandbox/messenger/executor"; 20 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@/telemetry/logging.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export const logValues = true; 19 | 20 | export const getLoggingConfig = () => ({ 21 | logValues, 22 | }); 23 | 24 | export const count = jest.fn().mockResolvedValue(0); 25 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@/telemetry/reportEvent.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | import { JsonObject } from "type-fest"; 19 | 20 | const reportEvent = jest.fn((event: string, data: JsonObject = {}) => { 21 | console.debug({ event, data }); 22 | }); 23 | 24 | export default reportEvent; 25 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@/utils/expectContext.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export function expectContext() {} 19 | export function forbidContext() {} 20 | 21 | export { 22 | isPageEditorTopFrame, 23 | isBrowserSidebarTopFrame, 24 | } from "../../../utils/expectContext"; 25 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@/utils/injectScriptTag.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export let injected = false; 19 | 20 | export default async function injectScriptTag() { 21 | injected = true; 22 | 23 | return { 24 | remove: jest.fn(), 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@/utils/injectStylesheet.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | async function injectStylesheet() { 19 | return document.createElement("link"); 20 | } 21 | 22 | export default injectStylesheet; 23 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/@xobotyi/scrollbar-width.js: -------------------------------------------------------------------------------- 1 | export const scrollbarWidth = () => 0; 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/browserMock.mjs: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export default { 19 | runtime: { 20 | id: "abcxyz", 21 | getManifest: () => ({ 22 | homepage_url: "https://www.pixiebrix.com/", 23 | }), 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/connected-react-router.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | * 17 | */ 18 | 19 | export const { push, connectRouter, routerMiddleware } = { 20 | ...jest.requireActual("connected-react-router"), 21 | push: jest.fn(), 22 | }; 23 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/fit-textarea.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export default { 19 | watch: jest.fn(), 20 | }; 21 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/holderjs.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export function run(...args) { 19 | console.debug("holderjs:run", args); 20 | } 21 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/react-virtualized-auto-sizer.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export default function ({ children }) { 19 | return children({ height: 600, width: 600 }); 20 | } 21 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/redux-state-sync.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | export const createStateSyncMiddleware = () => () => (next) => (action) => 19 | next(action); 20 | -------------------------------------------------------------------------------- /applications/browser-extension/src/__mocks__/stringMock.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | // This mock works for any `import` that expects a string, whether it 19 | // would be the file content, the file URL, or a "React component" 20 | module.exports = "test-file-stub"; 21 | -------------------------------------------------------------------------------- /applications/browser-extension/src/background/axiosFetch.ts: -------------------------------------------------------------------------------- 1 | // Required for axios-fetch-adapter 2 | import "regenerator-runtime/runtime"; 3 | import axios from "axios"; 4 | 5 | import fetchAdapter from "@vespaiach/axios-fetch-adapter"; 6 | 7 | axios.defaults.adapter = fetchAdapter; 8 | -------------------------------------------------------------------------------- /applications/browser-extension/src/bricks/renderers/customForm.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | .CustomForm label { 19 | font-size: 16px; 20 | } 21 | 22 | .CustomForm .form-control { 23 | font-size: 16px; 24 | } 25 | 26 | .CustomForm button { 27 | font-size: 16px; 28 | } 29 | -------------------------------------------------------------------------------- /applications/browser-extension/src/bricks/transformers/IdentityTransformerOptions.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { type BrickOptionProps } from "@/components/fields/schemaFields/genericOptionsFactory"; 3 | import { type Schema } from "@/types/schemaTypes"; 4 | import SchemaField from "@/components/fields/schemaFields/SchemaField"; 5 | import { joinName } from "@/utils/formUtils"; 6 | 7 | const ANY_SCHEMA: Schema = { 8 | title: "Value", 9 | description: "The value to return", 10 | }; 11 | 12 | /** 13 | * Page Editor fields for the @pixiebrix/identity brick. 14 | */ 15 | const IdentityTransformerOptions: React.FunctionComponent = ({ 16 | name, 17 | configKey = null, 18 | }) => ( 19 | 26 | ); 27 | 28 | export default IdentityTransformerOptions; 29 | -------------------------------------------------------------------------------- /applications/browser-extension/src/bricks/transformers/jquery/JQueryReaderOptions.module.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | .nameInput { 19 | max-width: 250px; 20 | } 21 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/IsolatedComponent.scss: -------------------------------------------------------------------------------- 1 | // Injected unminified. Don't add too much fluff 2 | 3 | body { 4 | // Don't inherit any style 5 | all: initial; 6 | } 7 | 8 | :host { 9 | // Set a good default for our custom `pixiebrix-widget` element 10 | display: block; 11 | 12 | // Avoid black scrollbars on dark websites that set `color-scheme: light dark` 13 | color-scheme: light; 14 | } 15 | 16 | // Don't inherit the selection color 17 | :host::selection { 18 | // Needs to be revert instead of initial because, per MDN, 19 | // "On inherited properties, the initial value may be unexpected" 20 | // See https://developer.mozilla.org/en-US/docs/Web/CSS/initial 21 | // See https://chromestatus.com/feature/5090853643354112 22 | // See https://developer.mozilla.org/en-US/docs/Web/CSS/revert 23 | background: revert; 24 | } 25 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/LinkButton.module.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | .root { 19 | all: inherit; 20 | display: inline; 21 | padding: 0; 22 | color: #007bff; 23 | } 24 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/UnstyledButton.module.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | .root { 19 | all: unset; 20 | } 21 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/__snapshots__/MarkdownInline.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`MarkdownInline linkifies text 1`] = ` 4 | 5 | 6 | 7 | Hello 8 | 9 | 10 | 13 | https://www.example.com 14 | 15 | 16 | 17 | `; 18 | 19 | exports[`MarkdownInline renders without p tag 1`] = ` 20 | 21 | 22 | 23 | Hello 24 | 25 | World 26 | 27 | 28 | `; 29 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/errors/ErrorDetail.module.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | .root { 19 | margin-top: 1em; 20 | display: flex; 21 | flex-wrap: wrap; 22 | } 23 | 24 | .column { 25 | max-width: 400px; 26 | min-width: 240px; 27 | padding: 0 15px; 28 | } 29 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/OptionIcon.module.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | .root { 19 | height: 1.2rem; 20 | vertical-align: text-bottom; 21 | margin-top: 2px; 22 | } 23 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/icons/exclude.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/icons/key.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/icons/number.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/icons/object.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/icons/querySelector.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/icons/text.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/optionIcon/icons/toggle.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/widgets/HeadingStyleWidget.module.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 PixieBrix, Inc. 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU Affero General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU Affero General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU Affero General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | .button:global(.btn.active):not(:focus) { 19 | z-index: unset; 20 | } 21 | -------------------------------------------------------------------------------- /applications/browser-extension/src/components/fields/schemaFields/widgets/__snapshots__/TextWidget.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`TextWidget renders empty widget 1`] = ` 4 | 5 |
    8 |