{"version":3,"file":"static/js/9190.js?sha=c3620aa4f3b9","sources":["webpack://ide/./src/code_mirror/autocompletions/diagnostics.ts","webpack://ide/./src/code_mirror/autocompletions/info.tsx","webpack://ide/./src/code_mirror/autocompletions/paramater_tooltip.tsx","webpack://ide/./src/code_mirror/editors/index.ts","webpack://ide/./src/code_mirror/utils/create_event_handler_widget.ts","webpack://ide/./src/code_mirror/utils/jump_to_definition.ts","webpack://ide/./src/code_mirror/utils/server_panels.tsx","webpack://ide/./src/components/Runner.tsx","webpack://ide/./src/components/bottom_panel/REPL.tsx","webpack://ide/./src/components/modals/PipAudit.tsx","webpack://ide/./src/components/modals/SaveConflict.tsx","webpack://ide/./src/components/modals/ScheduledTaskModal.tsx","webpack://ide/./src/components/modals/UpgradePrompts.tsx","webpack://ide/./src/components/modals/UriUploader.tsx","webpack://ide/./src/components/modals/index.tsx","webpack://ide/./src/components/modals/names/common-modals.ts","webpack://ide/./src/components/reusable/ButtonGroup.tsx","webpack://ide/./src/components/reusable/ErrorBoundary.tsx","webpack://ide/./src/components/reusable/ZenModeButtons.tsx","webpack://ide/./src/controllers/secrets.ts","webpack://ide/./src/components/tabs/SecretsTab.tsx","webpack://ide/./src/components/tabs/TabToolbar.tsx","webpack://ide/./src/components/tabs/scheduled_tasks/ScheduledTaskLastRunInfo.tsx","webpack://ide/./src/components/tabs/settings/PythonVersionConfig.tsx","webpack://ide/./src/controllers/app/saving.ts","webpack://ide/./src/instance-globals.ts","webpack://ide/./src/pyspace/common/components/Button.tsx","webpack://ide/./src/pyspace/common/components/TextArea.tsx","webpack://ide/./src/pyspace/common/components/TextInput.tsx","webpack://ide/./src/pyspace/common/modals/ReportAbuse.tsx","webpack://ide/./src/pyspace/common/modals/UploadFile.tsx","webpack://ide/./src/pyspace/gadget_editor/components/GadgetCrud.tsx","webpack://ide/./src/pyspace/utils/hooks/use-runner.ts","webpack://ide/./src/pyspace/gadget_editor/components/Footer.tsx","webpack://ide/./src/pyspace/gadget_editor/components/GadgetEditor.tsx","webpack://ide/./src/pyspace/gadget_editor/controllers/gadget.ts","webpack://ide/./src/pyspace/pyspace-api.ts","webpack://ide/./src/pyspace/site/components/PopoutEditor.tsx","webpack://ide/./src/pyspace/site/components/SiteProvider.tsx","webpack://ide/./src/pyspace/site/components/UserMenu.tsx","webpack://ide/./src/pyspace/site/modals/Notifications.tsx","webpack://ide/./src/pyspace/site/modals/names/pyspace-site-modals.ts","webpack://ide/./src/pyspace/site/modals/EditUserProfileModal.tsx","webpack://ide/./src/pyspace/site/modals/TestSiteMediumModal.tsx","webpack://ide/./src/pyspace/site/modals/Following.tsx","webpack://ide/./src/pyspace/site/store/pyspace-site-store.ts","webpack://ide/./src/pyspace/utils/hooks/use-screenshot/index.tsx","webpack://ide/./src/store/editor-store.ts","webpack://ide/./src/theme/ThemeProvider.tsx","webpack://ide/./src/theme/styles.ts","webpack://ide/./src/util/TabPanelRefContext.tsx","webpack://ide/./src/util/hooks/index.ts","webpack://ide/./src/util/hooks/use-media-query.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Diagnostic, LintSource, linter } from \"@codemirror/lint\";\nimport { EditorView } from \"@codemirror/view\";\nimport { setFormClassBodyEndLine } from \"@/code_mirror/utils/create_event_handler_widget\";\nimport { updateReferences } from \"@/code_mirror/utils/jump_to_definition\";\nimport { updateEndpoints } from \"@/code_mirror/utils/server_panels\";\nimport type { DoAnalysisFunc, Message } from \"./types\";\n\nexport function messagesToDiagnostics(view: EditorView, messages: Message[] | undefined, all = false) {\n    messages ??= [];\n    const state = view.state;\n    const { doc, selection } = state;\n    const { length: docLen, lines: maxLine } = state.doc;\n    const cursorPos = selection.main.head;\n    const cursorLine = doc.lineAt(cursorPos).number;\n    const otherDiagnostics: Diagnostic[] = [];\n    const allDiagnostics: Diagnostic[] = [];\n    for (const { message, line, severity = \"error\", between } of messages) {\n        let from: number, to: number;\n        if (between) {\n            const [[lineno, offset], [linenoEnd, offsetEnd]] = between;\n            from = state.doc.line(lineno).from + offset;\n            to = state.doc.line(linenoEnd).from + offsetEnd;\n        } else {\n            ({ from, to } = state.doc.line(Math.min(line, maxLine)));\n        }\n        if (to > docLen) {\n            continue;\n        }\n\n        const diagnostic = { message, from, to, severity };\n        if (line !== cursorLine) {\n            otherDiagnostics.push(diagnostic);\n        }\n        allDiagnostics.push(diagnostic);\n    }\n    return all ? allDiagnostics : otherDiagnostics;\n}\n\nexport function useDiagnostics(view: EditorView, doAnalysis: DoAnalysisFunc) {\n    const diagnosticLinter = useMemo(() => {\n        const lintSource: LintSource = async (view) => {\n            const doc = view.state.doc;\n            const { messages, references, httpEndpoints, emailEndpoints, routes, formClassBodyEndLine } =\n                await doAnalysis(false);\n            // CodeMirror discards stale diagnostics, but not the state effects dispatched below.\n            if (view.state.doc !== doc) return [];\n            view.dispatch({\n                effects: [\n                    updateReferences.of(references),\n                    updateEndpoints.of({ httpEndpoints, emailEndpoints, routes }),\n                    // Only forms report this; for everything else it's undefined and the widget stays away.\n                    setFormClassBodyEndLine.of(formClassBodyEndLine ?? null),\n                ],\n            });\n            return messagesToDiagnostics(view, messages, true);\n        };\n        return linter(lintSource, { delay: 1000 });\n    }, [view]);\n\n    return diagnosticLinter;\n}\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { CallableArg, Popup } from \"./types\";\n\nconst infoRoot = document.createElement(\"div\");\nconst codeFont = \"Source Code Pro, monospace\";\nconst root = createRoot(infoRoot);\n\nexport const CompletionInfoElement = (popup: Popup) => {\n    // N.B. The style of the actual tooltip itself is defined in common.scss, because we can't target it here.\n    const inner = InfoInner(popup);\n    root.render(inner);\n    return infoRoot;\n};\n\nconst CallSig = (args: CallableArg[]) => (\n    <span style={{ fontFamily: codeFont }}>\n        (\n        {args.map(({ name, type, optional, defaultVal, annotation }, i) => (\n            <div key={i} style={{ display: \"inline\" }}>\n                {i !== 0 && \", \"}\n                <span style={{ whiteSpace: \"nowrap\" }}>\n                    {optional && \"[\"}\n                    <i style={{ display: \"inline-block\" }}>\n                        {type === \"kwargs\" ? \"**\" : type === \"varargs\" ? \"*\" : \"\"}\n                        {name ?? \"\"}\n                        {annotation && `:${annotation}`}\n                        {type === \"keyword\" ? \"=\" + (defaultVal ?? \"\") : \"\"}\n                    </i>\n                    {optional && \"]\"}\n                </span>\n            </div>\n        ))}\n        )\n    </span>\n);\n\nconst InfoInner = ({ name, callable, type, helpText, helpLink, tableCols }: Popup) => {\n    let callSig: null | React.ReactNode = null;\n    let returns: null | string = null;\n    let options: null | string = null;\n    if (callable) {\n        const args = [...(callable.args || [])];\n        if (callable.kwargsFromTableCols) {\n            for (const k in tableCols) {\n                args.push({ name: tableCols[k].name, type: \"keyword\" });\n            }\n        }\n        callSig = CallSig(args);\n        if (callable.returns?.name && callable.returns.name !== \"None\") {\n            returns = \" → \" + callable.returns.name;\n        }\n    } else if (type && type.name) {\n        returns = \" - \" + type.name;\n        if (type.name === \"enum\" && type.options) {\n            options = type.options.map((s) => '\"' + s + '\"').join(\", \");\n        }\n    }\n\n    helpLink ??= type?.helpLink;\n\n    return (\n        // because codemirror closes the info tooltip on mousedown and we probably don't want that\n        <div onMouseDown={(e) => e.preventDefault()}>\n            <span style={{ fontWeight: 700, display: \"inline-block\", fontFamily: codeFont }}>{name}</span>\n            {callSig}\n            <span>{returns}</span>\n            {options && <small className=\"font-mono\"> [{options}]</small>}\n            <br />\n            {helpText && <small className=\"inline-block whitespace-pre-line\">{helpText}</small>}\n            {helpLink && (\n                <>\n                    <br />\n                    <a\n                        className={\"pull-right\"}\n                        target={\"_blank\"}\n                        href={/^\\/|^https:/.test(helpLink) ? helpLink : \"/doc#\" + helpLink}\n                        rel=\"noreferrer\">\n                        View docs...\n                    </a>\n                </>\n            )}\n        </div>\n    );\n};\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { StateEffect, StateField } from \"@codemirror/state\";\nimport { EditorView, Tooltip, showTooltip } from \"@codemirror/view\";\nimport type { ParameterHelper } from \"./types\";\n\nexport function setParamaterHelper(\n    view: EditorView,\n    parameterHelper: ParameterHelper | undefined,\n    { pos, from, to }: { pos: number; from: number; to: number }\n) {\n    if (!parameterHelper) {\n        clearParamaterHelper(view);\n        return;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const create = (_view: EditorView) => ({ dom: ParamTooltipElement(parameterHelper!) });\n    view.dispatch({\n        effects: [setParamaterTooltip.of([{ pos, create, above: true, from, to }])],\n    });\n}\n\nexport function clearParamaterHelper(view: EditorView) {\n    view.dispatch({\n        effects: [setParamaterTooltip.of(null)],\n    });\n}\n\nexport interface ParamTooltip extends Tooltip {\n    from: number;\n    to: number;\n}\n\n// this code is mostly taken from the CodeMirror tooltip example\nexport const paramaterTooltipField = StateField.define<readonly ParamTooltip[]>({\n    create: () => [],\n    update(tooltips, tr) {\n        for (const effect of tr.effects) {\n            if (effect.is(setParamaterTooltip)) {\n                return effect.value ?? [];\n            }\n        }\n\n        const tooltip = tooltips[0];\n        if (!tooltip) {\n            return [];\n        }\n        const { pos, from: tooltipFrom, to: tooltipTo } = tooltip;\n        const from = tr.changes.mapPos(tooltipFrom),\n            to = tr.changes.mapPos(tooltipTo, 1);\n        // did the changes take us outside of the tooltip pos?\n        // e.g. deleting the entire word.\n        if (pos < from || pos > to) {\n            return [];\n        }\n        /**\n         * This is taken from how codemirror autocomplete decides whether to recall the autocomplete\n         * based on the .span argument\n         */\n        if (!(from === to || /['\"]?\\w*['\"]?$/.test(tr.state.sliceDoc(from, to)))) {\n            return [];\n        }\n        // Is our cursor actually in the right place?\n        const isValid = tr.state.selection.ranges.filter(\n            (range) => range.empty && range.head >= from && range.head <= to\n        );\n        if (!isValid.length) {\n            return [];\n        }\n        return [{ ...tooltip, from, to }];\n    },\n\n    provide: (f) => showTooltip.computeN([f], (state) => state.field(f)),\n});\n\nconst setParamaterTooltip = StateEffect.define<ParamTooltip[] | null>();\n\nconst paramTooltipInner = ({ currentParam, fn, params }: ParameterHelper) => {\n    return (\n        <>\n            {fn}(\n            {params.map(({ name, type, optional, defaultVal }, i) => {\n                const sig = (\n                    <>\n                        {optional && \"[\"}\n                        {type === \"kwargs\" ? \"**\" : type === \"varargs\" ? \"*\" : \"\"}\n                        <i>{name}</i>\n                        {defaultVal ? \"=\" + defaultVal : type == \"keyword\" ? \"=\" : \"\"}\n                        {optional && \"]\"}\n                    </>\n                );\n                return (\n                    <div key={i} style={{ display: \"inline\" }}>\n                        {i !== 0 && \", \"}\n                        {currentParam === i ? <b>{sig}</b> : sig}\n                    </div>\n                );\n            })}\n            )<div className=\"font-mono text-lg italic\">{params[currentParam]?.docString}</div>\n        </>\n    );\n};\n\nconst ParamTooltipElement = (paramHelper: ParameterHelper) => {\n    // using the same root doesn't seem to work\n    const inner = paramTooltipInner(paramHelper);\n    const container = document.createElement(\"div\");\n    container.className = \"cm-tooltip-cursor cm-tooltip-parameterhelper\";\n    const root = createRoot(container);\n    root.render(inner);\n    return container;\n};\n","import { lazyComponent } from \"@/util/lazy\";\nimport type { default as TAssetEditor } from \"./asset_editor\";\nimport type { default as TDataBindingEditor } from \"./data_binding_editor\";\nimport type { default as THtmlFormTemplateEditor } from \"./html_form_template_editor\";\nimport type { default as THtmlPropertyEditor } from \"./html_property_editor\";\nimport type { default as TImportMapEditor } from \"./import-map-editor\";\nimport type { default as TLazyAssetEditor } from \"./lazy-asset-editor\";\nimport type { default as TModuleEditor } from \"./module_editor\";\nimport type { default as TNativeLibrariesEditor } from \"./native_libraries\";\nimport type { default as TStylePropertyEditor } from \"./style_property_editor\";\nimport type { default as THtmlBodyEditor } from \"./user-email-editor\";\n\nexport const ModuleEditor = lazyComponent<typeof TModuleEditor>(() => import(\"./module_editor\"));\n\nexport const AssetEditor = lazyComponent<typeof TAssetEditor>(() => import(\"./asset_editor\"));\n\nexport const DataBindingEditor = lazyComponent<typeof TDataBindingEditor>(() => import(\"./data_binding_editor\"));\n\nexport const HtmlFormTemplateEditor = lazyComponent<typeof THtmlFormTemplateEditor>(\n    () => import(\"./html_form_template_editor\")\n);\n\nexport const HtmlPropertyEditor = lazyComponent<typeof THtmlPropertyEditor>(() => import(\"./html_property_editor\"));\n\nexport const ImportMapEditor = lazyComponent<typeof TImportMapEditor>(() => import(\"./import-map-editor\"));\n\nexport const LazyAssetEditor = lazyComponent<typeof TLazyAssetEditor>(() => import(\"./lazy-asset-editor\"));\n\nexport const NativeLibrariesEditor = lazyComponent<typeof TNativeLibrariesEditor>(() => import(\"./native_libraries\"));\n\nexport const StylePropertyEditor = lazyComponent<typeof TStylePropertyEditor>(() => import(\"./style_property_editor\"));\n\nexport const HtmlBodyEditor = lazyComponent<typeof THtmlBodyEditor>(() => import(\"./user-email-editor\"));\n","import { StateEffect, StateField } from \"@codemirror/state\";\nimport { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\nimport { useConstant } from \"@/util/hooks\";\nimport { useExtension } from \"./hooks\";\n\n/**\n * Places the \"Create Event Handler\" widget at the end of the form class body.\n *\n * The anchor line is computed in the autocompleter worker (see `class_body_scan`), which already\n * re-parses this code about a second after the user stops typing, and arrives here as a StateEffect\n * on that same tick. We hold it as a *document position* rather than a line number so it can be\n * mapped through subsequent edits — otherwise the widget would sit in the wrong place for the second\n * or so between an edit and the next analysis.\n */\n\n/** 1-based line reported by the worker, or null when there's no form class to anchor to. */\nexport const setFormClassBodyEndLine = StateEffect.define<number | null>();\n\n/** Document position to hang the widget off: the end of the last line of the form class body. */\nexport const classBodyAnchorField = StateField.define<number | null>({\n    create: () => null,\n    update(value, tr) {\n        for (const effect of tr.effects) {\n            if (!effect.is(setFormClassBodyEndLine)) continue;\n            const line = effect.value;\n            // The worker analysed a snapshot of the document; it may since have shrunk past that line.\n            if (line === null || line < 1 || line > tr.state.doc.lines) return null;\n            return tr.state.doc.line(line).to;\n        }\n        if (value !== null && tr.docChanged) {\n            // assoc=1: text typed at the anchor pushes it along, so the widget stays below the user's code.\n            return tr.changes.mapPos(value, 1);\n        }\n        return value;\n    },\n});\n\n/**\n * CodeMirror owns *where* this sits; React owns what's inside it. The host element is created once per\n * editor and simply re-parented as the decoration comes and goes, so the React tree portalled into it\n * survives scrolling and re-anchoring.\n */\nclass CreateEventHandlerWidget extends WidgetType {\n    constructor(readonly host: HTMLElement) {\n        super();\n    }\n    eq(other: CreateEventHandlerWidget) {\n        return other.host === this.host;\n    }\n    toDOM() {\n        return this.host;\n    }\n    // We deliberately keep WidgetType's default `ignoreEvent` (true), which keeps CodeMirror's own\n    // handlers off the panel's controls. Overriding it to false would route them into the editor:\n    // the keymap is a `domEventHandlers.keydown` on `contentDOM`, which sits below React's root\n    // listener, so it would see Enter before the panel's own handler could stop it — and insert a\n    // newline into the document on the way to creating the handler.\n}\n\nconst widgetDecorations = (host: HTMLElement) =>\n    EditorView.decorations.compute([classBodyAnchorField], (state) => {\n        const anchor = state.field(classBodyAnchorField);\n        if (anchor === null) return Decoration.none;\n        // Block widgets must sit on a line boundary; after mapping, the anchor may be mid-line.\n        const at = state.doc.lineAt(Math.max(0, Math.min(anchor, state.doc.length))).to;\n        return Decoration.set([\n            Decoration.widget({ widget: new CreateEventHandlerWidget(host), block: true, side: 1 }).range(at),\n        ]);\n    });\n\nconst widgetTheme = EditorView.baseTheme({\n    \".cm-create-event-handler\": {\n        paddingTop: \"1lh\",\n        paddingBottom: \"0.6rem\",\n        userSelect: \"none\",\n    },\n    \".cm-create-event-handler:empty\": {\n        display: \"none\",\n    },\n    \".cm-create-event-handler-body\": {\n        fontFamily: \"var(--anvil-ui-font)\",\n        whiteSpace: \"normal\",\n        wordWrap: \"break-word\",\n        overflowWrap: \"anywhere\",\n    },\n    \".cm-create-event-handler input, .cm-create-event-handler textarea\": {\n        userSelect: \"text\",\n    },\n});\n\n/**\n * Registers the widget's CodeMirror extensions and returns the host element to portal the panel into.\n */\nexport function useCreateEventHandlerWidget(view: EditorView, enabled: boolean): HTMLElement | null {\n    const host = useConstant(() => {\n        const el = document.createElement(\"div\");\n        el.className = \"cm-create-event-handler\";\n        return el;\n    });\n\n    useExtension(view, () => (enabled ? [classBodyAnchorField, widgetDecorations(host), widgetTheme] : []), [enabled]);\n\n    return enabled ? host : null;\n}\n","import { useDispatch, useSelector } from \"react-redux\";\nimport { ChangeDesc, Compartment, EditorState, Facet, StateEffect, StateField } from \"@codemirror/state\";\nimport { Decoration, DecorationSet, EditorView, ViewPlugin } from \"@codemirror/view\";\nimport { CodeNavTarget } from \"@/router/navTypes\";\nimport { AnvilDispatch, AppId, View } from \"@/types\";\nimport { useAppUrl } from \"@/util/hooks\";\nimport { getAppId, getAppPackageName } from \"../../controllers/app\";\nimport { getCodeNames } from \"../../controllers/app/code\";\nimport { navigate } from \"../../router/navigation\";\nimport { CodeRef, References } from \"../autocompletions/types\";\nimport { useExtension } from \"./hooks\";\n\nconst hoverThemeCompartment = new Compartment();\n\nexport function useJumpToDefinition(view: EditorView, tabNavTarget: CodeNavTarget, codeItemId: string) {\n    const appId = useSelector(getAppId);\n    const appUrl = useAppUrl();\n    const appPackageName = useSelector(getAppPackageName);\n    const allCodeNames = useSelector(getCodeNames);\n    const dispatch = useDispatch<AnvilDispatch>();\n\n    useExtension(\n        view,\n        () =>\n            appTabDetails.of({\n                appId,\n                appUrl,\n                appPackageName,\n                allCodeNames,\n                tabNavTarget,\n                codeItemId,\n            }),\n        [appId, appPackageName, allCodeNames, tabNavTarget, codeItemId]\n    );\n    useExtension(\n        view,\n        () => [\n            hoverThemeCompartment.of([]),\n            HoverMarkerField,\n            ViewPlugin.define((view) => new JumpToDefinition(view, dispatch)),\n        ],\n        []\n    );\n}\n\nexport const updateReferences = StateEffect.define<References>();\n\ninterface AppDetails {\n    appId: AppId | undefined;\n    appUrl: string;\n    appPackageName: string | undefined;\n    allCodeNames: any;\n    tabNavTarget: CodeNavTarget;\n    codeItemId: string;\n}\n\n/** a facet to hold state from react */\nconst appTabDetails = Facet.define<AppDetails, AppDetails>({\n    combine: (value) => value[0],\n});\n\nfunction getCodeItemFromRequest(state: EditorState, { def }: { from?: number; to?: number; def: Def }) {\n    if (!def.item) {\n        return;\n    }\n    const { allCodeNames } = state.facet(appTabDetails);\n    const codeItem = allCodeNames[def.item];\n    if (codeItem) {\n        return codeItem;\n    } else {\n        console.log(\"Could not find target item for requestJumpToCode:\", def.item);\n    }\n}\n\nfunction codeItemInFile(state: EditorState, codeItem: any) {\n    if (!codeItem) {\n        return false;\n    }\n    const { codeItemId } = state.facet(appTabDetails);\n    return codeItemId === codeItem.id;\n}\n\nfunction defInFile(state: EditorState, def: Def) {\n    if (!def.item) {\n        return false;\n    }\n    const codeItem = getCodeItemFromRequest(state, { def });\n    return codeItemInFile(state, codeItem);\n}\n\nfunction wrapWithDelay<T>(fn: (...args: T[]) => void) {\n    let called = false;\n    let timeout: number | undefined = undefined;\n    let resetTimeout: number | undefined = undefined;\n\n    function wrapped(...args: T[]) {\n        clearTimeout(resetTimeout);\n        resetTimeout = setTimeout(() => {\n            clearTimeout(timeout);\n            timeout = undefined;\n            called = false;\n        }, 50);\n\n        if (called) {\n            return fn(...args);\n        }\n\n        timeout ??= setTimeout(() => {\n            called = true;\n            fn(...args);\n        }, 200);\n    }\n\n    return wrapped;\n}\n\nclass JumpToDefinition {\n    hoverRef: null | CodeRef = null;\n    classHover = false;\n    wrapMouseMove: () => void;\n    dispatch: AnvilDispatch;\n\n    constructor(\n        readonly view: EditorView,\n        dispatch: AnvilDispatch\n    ) {\n        // use capture event to prevent race condition with codemirror's builtin mousedown event\n        // https://anvil.works/forum/t/new-beta-ide-reinstate-control-click-on-functions-to-navigate-to-them/13938\n        view.dom.addEventListener(\"mousedown\", this.mousedown.bind(this), true);\n        // Safari fires the mouse move on very Cmd keydown so use this delay wrapper\n        // otherwise safari feels very slow with Cmd keyboard shortcuts\n        this.wrapMouseMove = wrapWithDelay(this.mousemove.bind(this));\n        view.dom.addEventListener(\"mousemove\", this.wrapMouseMove);\n        this.dispatch = dispatch;\n    }\n    update() {}\n    destroy() {\n        this.view.dom.removeEventListener(\"mousedown\", this.mousedown, true);\n        this.view.dom.removeEventListener(\"mousemove\", this.wrapMouseMove);\n    }\n    toggleHoverClass(toggle: boolean) {\n        if (toggle === this.classHover) {\n            return;\n        }\n        this.classHover = toggle;\n        this.view.dispatch({ effects: hoverThemeCompartment.reconfigure(toggle ? hoverPointerTheme : []) });\n    }\n    mousemove(e: MouseEvent) {\n        if (!((e.ctrlKey || e.metaKey) && !e.altKey)) {\n            return this.toggleHoverClass(false);\n        }\n        const defs = this.view.state.field(HoverMarkerField);\n        if (!defs) {\n            return this.toggleHoverClass(false);\n        }\n        this.toggleHoverClass(true);\n    }\n    mousedown(e: MouseEvent) {\n        if (!((e.ctrlKey || e.metaKey) && !e.altKey)) {\n            return;\n        }\n        const defs = this.view.state.field(HoverMarkerField);\n        if (!defs) {\n            return;\n        }\n        const pos = this.view.posAtCoords({ x: e.x, y: e.y });\n        const range = this.refUnderPos(pos, defs);\n        if (range) {\n            // jump to code - i.e. navigate\n            e.preventDefault();\n            e.stopPropagation();\n            this.requestJumpToCode(range);\n        }\n    }\n    refUnderPos(pos: number | null, defs: DefRanges) {\n        if (!pos) return;\n        return defs.getRange(pos);\n    }\n    requestJumpToCode(range: { from: number; to: number; def: Def }) {\n        const state = this.view.state;\n        const codeItem = getCodeItemFromRequest(state, range);\n        if (!codeItem) {\n            return;\n        }\n        const { line, col } = range.def;\n\n        const view: View =\n            codeItem.type === \"form\"\n                ? { code: [`${line}`, `${col || 0}`] } // TODO: Generate Form view more intelligently. Really just \"add code, subject to default split view restrictions\"\n                : { code: [`${line}`, `${col || 0}`] };\n\n        this.dispatch(navigate({ type: \"CODE\", codePath: codeItem.codePath, view }));\n    }\n}\n\nconst hoverPointerTheme = EditorView.theme({\n    \".cm-code-ref-hover > *:hover\": {\n        // because code highlighting is the next div\n        cursor: \"pointer\",\n        textDecoration: \"underline\",\n    },\n    \".cm-code-ref-hover:hover\": {\n        cursor: \"pointer\",\n        textDecoration: \"underline\",\n    },\n});\n\nconst hoverRange = Decoration.mark({ class: \"cm-code-ref-hover\" });\n\ntype Def = { line: number; col: number; item: string; pos?: number };\nclass DefRanges {\n    decos: DecorationSet;\n    constructor(readonly ranges: { from: number; to: number; def: Def }[]) {\n        this.decos = this.makeDecorations();\n    }\n    static create(state: EditorState, references: References) {\n        return new DefRanges(this.makeRanges(state, references));\n    }\n    static makeRanges(state: EditorState, references: References) {\n        const ranges = [];\n        const doc = state.doc;\n        const { appPackageName, allCodeNames } = state.facet(appTabDetails);\n        const pkgPrefix = (appPackageName || \"main_app_package\") + \".\";\n        for (const lineno in references) {\n            const codeRefs = references[lineno].filter(\n                (codeRef) => codeRef.def && codeRef.def.line\n            ) as Required<CodeRef>[]; // line starts at 1\n            for (const codeRef of codeRefs) {\n                try {\n                    const line = doc.line(parseInt(lineno));\n                    const from = line.from + codeRef.startCol;\n                    const to = line.from + codeRef.endCol;\n                    const codeRefDef = codeRef.def;\n                    const item = codeRefDef.moduleName?.startsWith(pkgPrefix)\n                        ? codeRefDef.moduleName.slice(pkgPrefix.length)\n                        : codeRefDef.moduleName;\n                    const def: Def = { line: codeRefDef.line, item, col: codeRefDef.col ?? 0 };\n                    if (defInFile(state, def)) {\n                        def.pos = doc.line(def.line).from + (def.col ?? 0);\n                    }\n                    ranges.push({ from, to, def });\n                } catch (e) {\n                    // We hit errors here when a \"correcting\" parse to address syntax errors changes the line count\n                    // (eg dummy functions for @decorators without functions). The righteous fix is probably to apply\n                    // systematic warping to correct for the line number changes introduced during correction, but this\n                    // at least stops things breaking.\n                    console.error(\"Range creation failed\", e);\n                }\n            }\n        }\n        return ranges;\n    }\n    makeDecorations() {\n        return Decoration.set(\n            this.ranges.map(({ from, to }) => hoverRange.range(from, to)),\n            true\n        );\n    }\n    getRange(pos: number) {\n        return this.ranges.find(({ from, to }) => from <= pos && pos <= to);\n    }\n    /** remove any ranges which has been changed - if we don't then we risk throwing errors from decorations that can't exist */\n    map(state: EditorState, changes: ChangeDesc) {\n        const newRanges = this.ranges\n            .filter(({ from, to, def: { pos } }) => {\n                if (changes.touchesRange(from, to)) return false; // the reference has changed\n                if (pos != null && changes.touchesRange(pos)) return false; // we're in the same file and the defintion has changed\n                return true;\n            })\n            .map(({ from, to, def }) => {\n                from = changes.mapPos(from, 1);\n                to = changes.mapPos(to);\n                if (def.pos === undefined) return { from, to, def };\n                const pos = changes.mapPos(def.pos);\n                if (pos === def.pos) return { from, to, def };\n                const L = state.doc.lineAt(pos);\n                return { from, to, def: { line: L.number, item: def.item, col: pos - L.from, pos } };\n            });\n        return new DefRanges(newRanges);\n    }\n}\n\n/** updates whenever the doc changes or the annotation hook gives us a new reference */\nconst HoverMarkerField = StateField.define<DefRanges | null>({\n    create() {\n        return null;\n    },\n    update(value, tr) {\n        for (const effect of tr.effects) {\n            if (effect.is(updateReferences)) {\n                return DefRanges.create(tr.state, effect.value);\n            }\n        }\n        if (value == null) return value;\n        if (tr.docChanged) {\n            try {\n                value = value.map(tr.state, tr.changes);\n            } catch (e) {\n                console.warn(e);\n                value = null;\n            }\n        }\n        return value;\n    },\n    provide: (f) => EditorView.decorations.from(f, (val) => (val ? val.decos : Decoration.none)),\n});\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { StateEffect, StateField } from \"@codemirror/state\";\nimport { EditorView, showPanel } from \"@codemirror/view\";\nimport { IconDefinition, faEnvelope, faInfoCircle, faWifi } from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Button } from \"@/components/reusable/Button\";\nimport { CopyButton } from \"@/components/reusable/CopyButton\";\nimport { getAppOrigins } from \"@/controllers/app\";\nimport { getEnvironmentOrigins, getPublishInfo } from \"@/controllers/environments\";\nimport { modal } from \"@/controllers/modals\";\nimport { cx } from \"@/theme/styles\";\nimport type { AnvilDispatch } from \"@/types\";\nimport { useStateWithCustomUpdate } from \"@/util/hooks\";\nimport useEvent from \"@/util/useEventCallback\";\nimport type { EmailEndpoint, HttpEndpoint, Route } from \"../autocompletions/types\";\nimport { useExtension, useViewSelector } from \"./hooks\";\n\nexport function useServerPanels(view: EditorView, isServer: boolean) {\n    useExtension(view, () => (isServer ? [endpointsState] : []), [isServer]);\n}\n\ninterface InfoPanelDetails {\n    httpEndpoints: HttpEndpoint[];\n    routes: Route[];\n    emailEndpoints: EmailEndpoint[];\n}\n\ninterface InfoPanels {\n    httpContainer: HTMLDivElement;\n    emailContainer: HTMLDivElement;\n    routeContainer: HTMLDivElement;\n}\n\n// create an effect to update the endpoints used by autocompletions\nexport const updateEndpoints = StateEffect.define<InfoPanelDetails>();\n\nexport const makeServerPanel = () => {\n    const panel = document.createElement(\"div\");\n    panel.className = \"cm-server-panel\";\n    return panel;\n};\n\nconst initEndpoint = (): InfoPanelDetails => ({\n    httpEndpoints: [],\n    routes: [],\n    emailEndpoints: [],\n});\n\n// hold the state of emailEndpoints and httpEndpoints in codeMirror\n// when we have emailEndpoints or httpEndpoints the codeMirror bottom panels are rendered by codemirror\nconst endpointsState = StateField.define<InfoPanelDetails>({\n    create: initEndpoint,\n    update(value, tr) {\n        for (const e of tr.effects) {\n            if (e.is(updateEndpoints)) {\n                value = { ...value, ...e.value };\n                break;\n            }\n        }\n        return value;\n    },\n});\n\ninterface EndpointPanelProps extends React.PropsWithChildren {\n    portal?: HTMLDivElement;\n    icon: IconDefinition;\n    copyText?: string | null;\n    localStorageKey: string;\n}\n// React Components live in the React Heirarchy\n// They are rendered within the ModuleEditor, this way they can access Providers like ThemeProvider\n// The actual dom element is attached to the CodeMirror Panel dom element using ReactDOM.createPortal\n\nexport function ServerPanelBody({ icon, children, copyText, localStorageKey }: EndpointPanelProps) {\n    const [isExpanded, setIsExpanded] = useStateWithCustomUpdate(false, (v) => {\n        localStorage[localStorageKey] = \"true\";\n        return v;\n    });\n    const timeoutRef = useRef<number | undefined>(undefined);\n    const onEnter = useEvent(() => {\n        clearTimeout(timeoutRef.current);\n        timeoutRef.current = setTimeout(() => setIsExpanded(true), 150);\n    });\n    const onLeave = useEvent(() => {\n        clearTimeout(timeoutRef.current);\n        timeoutRef.current = setTimeout(() => setIsExpanded(false), 300);\n    });\n    const seen = localStorage[localStorageKey];\n    // const seen = false; // for dev\n    return (\n        <div\n            className=\"whitespace-no-wrap my-1 flex h-20 w-fit max-w-full items-center gap-4 overflow-hidden rounded-r-md border-t border-r border-b border-[#ccc] bg-[#ffc] pl-2 whitespace-nowrap text-grey-2 dark:bg-[#330] dark:text-white\"\n            onMouseEnter={onEnter}\n            onMouseLeave={onLeave}>\n            <div className=\"shrink-0 overflow-hidden text-2xl text-grey-2 dark:text-white\">\n                <FontAwesomeIcon beat={!seen} icon={icon} fixedWidth />\n            </div>\n            <div\n                className={cx(\n                    \"h-full transition-opacity duration-150 ease-in\",\n                    isExpanded ? \"overflow-auto pr-2\" : \"w-0 overflow-clip opacity-0\"\n                )}>\n                <div className=\"inline-flex h-full items-center gap-4\">\n                    {children}\n                    {copyText && <CopyButton copyText={copyText} small />}\n                </div>\n            </div>\n        </div>\n    );\n}\n\nfunction RoutesPanelContent() {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const environmentOrigins = useSelector(getEnvironmentOrigins);\n    const apiOrigins = useMemo(() => environmentOrigins?.map((origin: string) => `${origin}`), [environmentOrigins]);\n\n    const onPublishClick = useEvent(() => {\n        dispatch(modal(\"environments\", {}));\n    });\n\n    const icon = faWifi;\n    const body =\n        apiOrigins && apiOrigins.length > 0 ? (\n            <>\n                {\"Routes in this module are accessible at \"}\n                <code>\n                    <span className=\"select-all\">{apiOrigins[0]}/</span>\n                    <i>{\"{path}\"}</i>\n                </code>\n            </>\n        ) : (\n            <>\n                {\"To access the routes in this module: \"}\n                <Button small onClick={onPublishClick}>\n                    Publish your app...\n                </Button>\n            </>\n        );\n\n    return (\n        <ServerPanelBody icon={icon} copyText={apiOrigins[0]} localStorageKey=\"discoveredHttpEndpoint\">\n            {body}\n        </ServerPanelBody>\n    );\n}\n\nexport function HttpEndpointPanelContent() {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const environmentOrigins = useSelector(getEnvironmentOrigins);\n    const apiOrigins = useMemo(\n        () => environmentOrigins?.map((origin: string) => `${origin}/_/api`),\n        [environmentOrigins]\n    );\n\n    const onPublishClick = useEvent(() => {\n        dispatch(modal(\"environments\", {}));\n    });\n\n    const icon = faInfoCircle;\n    const body =\n        apiOrigins && apiOrigins.length > 0 ? (\n            <>\n                {\"HTTP endpoints in this module are accessible at \"}\n                <code>\n                    <span className=\"select-all\">{apiOrigins[0]}/</span>\n                    <i>{\"{path}\"}</i>\n                </code>\n            </>\n        ) : (\n            <>\n                {\"To access the HTTP endpoints in this module: \"}\n                <Button small onClick={onPublishClick}>\n                    Publish your app...\n                </Button>\n            </>\n        );\n\n    return (\n        <ServerPanelBody icon={icon} copyText={apiOrigins[0]} localStorageKey=\"discoveredHttpEndpoint\">\n            {body}\n        </ServerPanelBody>\n    );\n}\n\nexport function EmailEndpointPanelContent() {\n    const publishInfo = useSelector(getPublishInfo);\n    const origins = useSelector(getAppOrigins);\n\n    const emailDomain: string | null = useMemo(() => {\n        const { privateEnvs, publicEnvs, customEnvs, isPublished } = publishInfo;\n        return (\n            customEnvs[0]?.email_domain ||\n            publicEnvs[0]?.email_domain ||\n            privateEnvs[0]?.email_domain ||\n            origins?.defaultHostname ||\n            null\n        );\n    }, [publishInfo, origins?.defaultHostname]);\n\n    const icon = faEnvelope;\n    const body = emailDomain ? (\n        <>\n            This app will receive emails sent to:\n            <code>\n                <i>anything</i>@<span className=\"select-all\">{emailDomain}</span>\n            </code>\n        </>\n    ) : (\n        \"Publish your app to receive email\"\n    );\n\n    return (\n        <ServerPanelBody icon={icon} copyText={emailDomain} localStorageKey=\"discoveredEmailDomain\">\n            {body}\n        </ServerPanelBody>\n    );\n}\n\nfunction useHasEndpoints(view: EditorView, key: keyof InfoPanelDetails) {\n    return useViewSelector(view, () => !!view.state.field(endpointsState, false)?.[key]?.length);\n}\n\nexport function EmailEndpointPanel({ view }: { view: EditorView }) {\n    const hasEndpoints = useHasEndpoints(view, \"emailEndpoints\");\n    if (!hasEndpoints) return null;\n    return <EmailEndpointPanelContent />;\n}\n\nexport function HttpEndpointPanel({ view }: { view: EditorView }) {\n    const hasEndpoints = useHasEndpoints(view, \"httpEndpoints\");\n    if (!hasEndpoints) return null;\n    return <HttpEndpointPanelContent />;\n}\n\nexport function RoutesPanel({ view }: { view: EditorView }) {\n    const hasEndpoints = useHasEndpoints(view, \"routes\");\n    if (!hasEndpoints) return null;\n    return <RoutesPanelContent />;\n}\n\nexport function Endpoints({ view }: { view: EditorView }) {\n    return (\n        <>\n            <EmailEndpointPanel view={view} />\n            <HttpEndpointPanel view={view} />\n            <RoutesPanel view={view} />\n        </>\n    );\n}\n\nexport function ServerPanels({ view, children }: React.PropsWithChildren<{ view: EditorView }>) {\n    const hasBottomPanels = useViewSelector(view, () => view.state.facet(showPanel));\n\n    const [bottom, setBottomOffset] = useState(0);\n\n    useEffect(() => {\n        const height = view.dom.querySelector(\".cm-panels-bottom\")?.clientHeight ?? 0;\n        setBottomOffset(height);\n    }, [hasBottomPanels]);\n\n    return (\n        <div className=\"absolute bottom-0 left-0 pl-[3px]\" style={{ bottom }}>\n            {children}\n        </div>\n    );\n}\n","import React, { useEffect, useReducer, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faCompressArrowsAlt } from \"@fortawesome/free-solid-svg-icons/faCompressArrowsAlt\";\nimport { faExpandArrowsAlt } from \"@fortawesome/free-solid-svg-icons/faExpandArrowsAlt\";\nimport { faExternalLinkSquare } from \"@fortawesome/pro-light-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { EVENTS, offEvent, onEvent } from \"@/actions\";\nimport {\n    getApp,\n    getAppId,\n    getAppOrigins,\n    getAppRuntimeOptions,\n    getRunnerOrigin,\n    promptIfRuntimeMissing,\n} from \"@/controllers/app\";\nimport { getServerModules } from \"@/controllers/app/code\";\nimport {\n    DebuggerEventArg,\n    getDebugEnvBreakpointsForRunner,\n    getIsRunnerPaused,\n    onDebuggerUpdate,\n} from \"@/controllers/debugger\";\nimport { getCategorisedEnvironments } from \"@/controllers/environments\";\nimport { getRunCommitId, getRunRefresh, restartApp, stopApp } from \"@/controllers/ide\";\nimport { confirm } from \"@/controllers/modals\";\nimport { clearRepl, incrementImportTimeTracking, replReturn } from \"@/controllers/repl\";\nimport {\n    getRunMode,\n    getRunnerViewMaximised,\n    maximiseRunner,\n    maybeConfigureOrUpgradeOnImportFailure,\n    newDebugSession,\n    restoreRunner,\n    runnerOutput,\n} from \"@/controllers/runner\";\nimport { handleRunnerBgTaskEvent, runnerConnectionStateChanged } from \"@/controllers/runner-bg-tasks\";\nimport { getTableauService } from \"@/controllers/tableau\";\nimport { claimAchievement, getUserUiPrefs } from \"@/controllers/user\";\nimport { navigate } from \"@/router/navigation\";\nimport { cx } from \"@/theme/styles\";\nimport type { AnvilDispatch } from \"@/types\";\nimport { ExternalState, useExternalState } from \"@/util/external-state\";\nimport { useFeatureSupported } from \"@/util/features\";\nimport { useResizeObserverTimeout } from \"@/util/hooks\";\nimport useEffectEvent from \"@/util/useEffectEvent\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { Button } from \"./reusable/Button\";\nimport { NumErrorWarningBtn, RunAppButton } from \"./reusable/ZenModeButtons\";\n\nconst runningReplCommands: { [id: number]: any } = {}; // requestId --> cmdId\nconst outstandingDebuggerRequestCallbacks: { [id: number]: any } = {}; // requestId --> callback\n\nconst useHandleImportError = () => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const runtimeOptions = useSelector(getAppRuntimeOptions);\n    const serverModules = useSelector(getServerModules);\n    const supportsCustomPackages = useFeatureSupported(\"custom-packages\");\n    const supportsFullPythonRuntime = useFeatureSupported(\"full-python-runtime\");\n\n    return useEvent(async (message: any) => {\n        const msg = message.msg || \"\";\n        const n = msg.match(/\\s'?([^\\s]+?)'?$/);\n        const modname = n ? n[1] : null;\n\n        if (modname === null) {\n            // just report it\n            return;\n        }\n\n        const appIsCustom = runtimeOptions?.server_spec?.base?.startsWith(\"python310-\");\n\n        if (!(message.fromServer || (message.traceback && message.traceback[0] && message.traceback[0].fromServer))) {\n            // Client error\n            message.errorObj = {\n                docUrl: \"/client/client-code/using-python-packages-in-client-code\",\n                docLinkTitle: \"Not all modules are available in client code.\\nClick for more info\",\n            };\n\n            // Special case: requests\n            if (modname === \"requests\") {\n                message.errorObj = {\n                    docUrl: \"/external-resources/http-apis/making-http-requests\",\n                    docLinkTitle: \"To make HTTP requests from client code, use the anvil.http module.\",\n                };\n            } else if (modname === \"anvil.users\") {\n                message.errorObj = {\n                    docUrl: \"/users\",\n                    docLinkTitle: \"Did you forget to add the Users Service?\",\n                };\n            }\n\n            if (!(supportsCustomPackages || supportsFullPythonRuntime)) {\n                // Even though they've tried to import this on the client, prompt to upgrade so they can do it on the server\n                dispatch(maybeConfigureOrUpgradeOnImportFailure(modname, false, appIsCustom));\n            }\n\n            // ...or did they just try to import a server module?\n            for (const sm of serverModules || []) {\n                if (sm.name === modname || modname.endsWith(sm.name)) {\n                    message.errorObj = {\n                        docUrl: \"/server/server-modules#calling-server-functions-from-client-code\",\n                        docLinkTitle:\n                            \"Client-side modules can't import Server Modules. Use anvil.server.call() to call server functions.\",\n                    };\n                }\n            }\n        } else if (msg.includes(\"anvil.js\")) {\n            // we'er trying to import anvil.js on the server\n            // the custom error message should speak for itself\n            // no need for an upgrade prompt\n            // TODO maybe put this in the docs and link to it\n        } else if (supportsFullPythonRuntime || supportsCustomPackages) {\n            // Server import failure for a subscribed user. Probably a typo, perhaps\n            // they have a request.\n            if (appIsCustom) {\n                message.errorObj = {\n                    docUrl: \"/server/custom-packages#adding-packages\",\n                    docLinkTitle: \"Need an extra library installed?\\nClick for more info\",\n                };\n            } else {\n                message.errorObj = {\n                    docUrl: \"/server/custom-packages#available-python-versions\",\n                    docLinkTitle: \"Try selecting a different Python version.\",\n                };\n            }\n            if (message.type === \"ModuleNotFoundError\") {\n                // don't show this for import error's\n                // e.g. `from typing import foo` is an ImportError (alert misleading)\n                // e.g. `import foobarbaz` is a ModuleNotFoundError (alert beneficial)\n                dispatch(maybeConfigureOrUpgradeOnImportFailure(modname, true, appIsCustom));\n            }\n        } else if (modname === \"requests\") {\n            // Special case\n            message.errorObj = {\n                docUrl: \"/external-resources/http-apis/making-http-requests\",\n                docLinkTitle: \"Free Plan users can use the anvil.http module instead of requests.\",\n            };\n        } else if (modname === \"anvil.users\") {\n            message.errorObj = {\n                docUrl: \"/users\",\n                docLinkTitle: \"Did you forget to add the Users Service?\",\n            };\n        } else {\n            // Server import failure for a non-Pro user. Upsell time!\n            message.errorObj = {\n                docUrl: \"/server/custom-packages\",\n                docLinkTitle: \"Some libraries are only available for paid users.\\nClick for details\",\n            };\n\n            dispatch(maybeConfigureOrUpgradeOnImportFailure(modname, false, appIsCustom));\n        }\n    });\n};\n\nconst useHandlePythonError = () => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const handleImportError = useHandleImportError();\n\n    return useEvent(async (message: any) => {\n        switch (message.type) {\n            case \"anvil.server.ServiceNotAdded\":\n                message.errorObj = {\n                    docUrl: \"/editor/common-errors#service-not-added\",\n                    docLinkTitle: \"Learn how to add services to your app\",\n                };\n                break;\n            case \"anvil.server.RuntimeUnavailableError\":\n                if (message.msg.indexOf(\"Basic Python 2\") === -1) {\n                    let m = message.msg.match(/Server resources not available for '([^']+)'./);\n                    if (m) {\n                        dispatch(promptIfRuntimeMissing(m?.[1], false));\n                    } else {\n                        m = message.msg.match(/Could not launch server runtime - image build failed./);\n                        if (m) {\n                            if (\n                                await dispatch(\n                                    confirm(\n                                        \"Server runtime failed to start\",\n                                        \"The server runtime for your app could not be built. Would you like to see the build output?\"\n                                    )\n                                )\n                            ) {\n                                dispatch((_, getState) => {\n                                    const appId = getAppId(getState());\n                                    dispatch(navigate({ type: \"SETTINGS\", section: \"RUNTIME\" }));\n                                });\n                            }\n                        }\n                    }\n                }\n                break;\n\n            case \"HttpError\":\n                if (message.msg === \"0\") {\n                    message.errorObj = {\n                        docUrl: \"/external-resources/http-apis/making-http-requests#browser-restrictions\",\n                        docLinkTitle: \"This URL may be restricted by your web browser.\\nLearn more\",\n                    };\n                }\n                break;\n            case \"ImportError\":\n            case \"NotImplementedError\":\n            case \"NotImplementedImportError\":\n            case \"ModuleNotFoundError\":\n                await handleImportError(message);\n                break;\n        }\n    });\n};\n\nconst useOnMessage = (runningAppWindow: WindowProxy | null) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const runnerOrigin = useSelector(getRunnerOrigin);\n\n    const handlePythonError = useHandlePythonError();\n\n    return useEvent(async (message: any) => {\n        // log.debug(\"Runner msg:\", message);\n        const maybeReplReturnOrDebuggerCallback = () => {\n            if (runningReplCommands[message.requestId]) {\n                dispatch(replReturn(runningReplCommands[message.requestId]));\n                delete runningReplCommands[message.requestId];\n            } else if (message.requestId in outstandingDebuggerRequestCallbacks) {\n                outstandingDebuggerRequestCallbacks[message.requestId]?.(message.result);\n                delete outstandingDebuggerRequestCallbacks[message.requestId];\n            }\n        };\n\n        if (message.error) {\n            dispatch(runnerOutput(message));\n            maybeReplReturnOrDebuggerCallback();\n        } else if (\"result\" in message) {\n            if (message.result?.clearRepl) {\n                dispatch(clearRepl(null, runningReplCommands[message.requestId]));\n                dispatch(runnerOutput({ fn: \"clear\" }));\n            }\n            maybeReplReturnOrDebuggerCallback();\n        } else if (message.fn)\n            switch (message.fn) {\n                case \"getBreakpoints\":\n                    if (!runnerOrigin) break;\n                    runningAppWindow?.postMessage(\n                        {\n                            id: message.id,\n                            response: await dispatch(getDebugEnvBreakpointsForRunner()),\n                        },\n                        runnerOrigin\n                    );\n                    break;\n                case \"restartApp\":\n                    dispatch(restartApp());\n                    break;\n                case \"newAppSession\":\n                    dispatch(newDebugSession(message.sessionToken));\n                    break;\n                case \"stdout\":\n                    // TODO: We should probably batch output here, then dispatch everything after ~10 ms.\n                    dispatch(runnerOutput(message));\n                    break;\n                case \"replStateUpdate\":\n                    if (message.replStateUpdate?.importTime) {\n                        dispatch(incrementImportTimeTracking(message.replStateUpdate?.importTime));\n                    }\n                    break;\n                case \"pythonError\":\n                    // log.info(\"python error\", message);\n                    await handlePythonError(message);\n                    dispatch(runnerOutput(message));\n                    maybeReplReturnOrDebuggerCallback();\n                    break;\n                case \"debuggerUpdate\":\n                    dispatch(onDebuggerUpdate(message.update));\n                    break;\n                case \"bgTaskEvent\":\n                    dispatch(handleRunnerBgTaskEvent(message.event));\n                    break;\n                case \"runnerConnectionState\":\n                    dispatch(runnerConnectionStateChanged(message.state));\n                    break;\n                case \"claimAchievement\":\n                    dispatch(claimAchievement(message.achievementId));\n                    break;\n            }\n    });\n};\n\nlet lastRequestId = 0;\n\nfunction useMessages(runningAppWindow: WindowProxy | null) {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const runnerOrigin = useSelector(getRunnerOrigin);\n    const appOrigins = useSelector(getAppOrigins)!;\n    const onMessage = useOnMessage(runningAppWindow);\n\n    const onReplCmd = useEvent(({ cmdId, code, extraArgs }: any) => {\n        if (!runnerOrigin) return;\n        const requestId = ++lastRequestId;\n        runningReplCommands[requestId] = cmdId;\n        runningAppWindow?.postMessage(\n            {\n                requestId,\n                fn: \"replCommand\",\n                args: [code, extraArgs],\n            },\n            runnerOrigin\n        );\n    });\n\n    const onReplInterrupt = useEvent(() => {\n        if (!runnerOrigin) return;\n        const requestId = ++lastRequestId;\n        runningAppWindow?.postMessage(\n            {\n                requestId,\n                fn: \"replInterrupt\",\n                args: [],\n            },\n            runnerOrigin\n        );\n    });\n\n    const onDebuggerRequest = useEvent(({ request, callback }: DebuggerEventArg) => {\n        const requestId = ++lastRequestId;\n        outstandingDebuggerRequestCallbacks[requestId] = callback;\n        runningAppWindow?.postMessage(\n            {\n                requestId,\n                fn: \"debuggerRequest\",\n                args: [request],\n            },\n            appOrigins.debugOrigin\n        );\n    });\n\n    const onMsg = useEvent((e: MessageEvent) => {\n        if (e.source !== runningAppWindow) return;\n        onMessage(e.data);\n    });\n\n    useEffect(() => {\n        if (!runningAppWindow) return;\n        dispatch(onEvent(EVENTS.RUNNER_REPL_COMMAND, onReplCmd));\n        dispatch(onEvent(EVENTS.RUNNER_REPL_INTERRUPT, onReplInterrupt));\n        dispatch(onEvent(EVENTS.RUNNER_DEBUGGER_REQUEST, onDebuggerRequest));\n\n        window.addEventListener(\"message\", onMsg);\n        return () => {\n            window.removeEventListener(\"message\", onMsg);\n            dispatch(offEvent(EVENTS.RUNNER_REPL_COMMAND, onReplCmd));\n            dispatch(offEvent(EVENTS.RUNNER_REPL_INTERRUPT, onReplInterrupt));\n            dispatch(offEvent(EVENTS.RUNNER_DEBUGGER_REQUEST, onDebuggerRequest));\n        };\n    }, [runningAppWindow]);\n}\n\n/** checks whether the NEWTAB was closed by the user */\nfunction useNewTabHeartbeat(runningAppWindow: WindowProxy | null) {\n    const runMode = useSelector(getRunMode);\n    const heartbeatRef = useRef<number | undefined>(undefined);\n    const dispatch = useDispatch<AnvilDispatch>();\n\n    useEffect(() => {\n        if (runMode === \"NEWTAB\" && runningAppWindow) {\n            heartbeatRef.current = setInterval(() => {\n                if (runningAppWindow.closed) {\n                    dispatch(stopApp());\n                    clearInterval(heartbeatRef.current);\n                }\n            }, 1000);\n        }\n        return () => {\n            clearInterval(heartbeatRef.current);\n        };\n    }, [runningAppWindow, runMode]);\n}\n\nfunction useRefreshNewTab(runningAppWindow: WindowProxy | null, src: string) {\n    const setBannerUsed = useBanner(runningAppWindow);\n    const runnerOrigin = useSelector(getRunnerOrigin);\n    const refresh = useSelector(getRunRefresh);\n    const onLocationRefresh = useEvent(() => {\n        if (!runnerOrigin) return;\n        runningAppWindow?.postMessage(\n            {\n                requestId: ++lastRequestId,\n                fn: \"locationReload\",\n                args: [src],\n            },\n            runnerOrigin\n        );\n        runningAppWindow?.focus();\n    });\n\n    useEffect(() => {\n        if (refresh == null) return;\n        onLocationRefresh();\n        setBannerUsed(false);\n    }, [refresh]);\n}\n\nfunction useBanner(runningAppWindow: WindowProxy | null) {\n    const runnerOrigin = useSelector(getRunnerOrigin);\n    const app = useSelector(getApp);\n    const commitId = useSelector(getRunCommitId);\n    const [bannerUsed, setBannerUsed] = useState(false);\n    if (!runningAppWindow && bannerUsed) {\n        setBannerUsed(false);\n    }\n\n    const onPostBannerMessage = useEvent(() => {\n        if (!runnerOrigin) return;\n        if (!runningAppWindow || bannerUsed) return;\n\n        runningAppWindow.postMessage(\n            {\n                requestId: ++lastRequestId,\n                fn: \"appChanged\",\n            },\n            runnerOrigin\n        );\n\n        setBannerUsed(true);\n    });\n\n    useEffect(() => {\n        if (app?.commitSha !== commitId) {\n            onPostBannerMessage();\n        }\n    }, [app?.commitSha, commitId]);\n\n    return setBannerUsed;\n}\n\nconst newTabWindowAtom = new ExternalState<WindowProxy | null>(null);\n\nconst getRunnerUrl = (runnerOrigin: string | undefined, runPath = \"\") => {\n    if (!runnerOrigin) return \"\";\n\n    const origin = runnerOrigin.endsWith(\"/\") ? runnerOrigin.slice(0, -1) : runnerOrigin;\n    if (!runPath) return `${origin}/`;\n    if (runPath.startsWith(\"?\") || runPath.startsWith(\"#\")) return `${origin}/${runPath}`;\n    return `${origin}/${runPath.replace(/^\\/+/, \"\")}`;\n};\n\nconst useRunnerSrc = () => {\n    const runnerOrigin = useSelector(getRunnerOrigin);\n    const environments = useSelector(getCategorisedEnvironments);\n    const tableauService = useSelector(getTableauService);\n    const tableauDashboard = environments?.debug?.url?.tableau_dashboard;\n    const userUiPrefs = useSelector(getUserUiPrefs);\n    const appId = useSelector(getAppId)!;\n    const runPath = userUiPrefs?.appRunPaths?.[appId] || \"\";\n    if (tableauService && tableauDashboard) {\n        return getRunnerUrl(runnerOrigin, \"/_/tableau\");\n    }\n    return getRunnerUrl(runnerOrigin, runPath);\n};\n\nexport const useCommunicateWithRunner = (runningAppWindow: WindowProxy | null, src: string) => {\n    useMessages(runningAppWindow);\n    useNewTabHeartbeat(runningAppWindow);\n    useRefreshNewTab(runningAppWindow, src);\n};\n\nexport const useNewTabRunner = () => {\n    const src = useRunnerSrc();\n    const runMode = useSelector(getRunMode);\n    const [newTabWindow, setNewTabWindow] = useExternalState(newTabWindowAtom);\n    useCommunicateWithRunner(newTabWindow, src);\n\n    const onRunModeChange = useEffectEvent(() => {\n        if (runMode === \"NEWTAB\") {\n            setNewTabWindow(window.open(src, \"\"));\n        } else {\n            newTabWindow?.close();\n            setNewTabWindow(null);\n        }\n    });\n\n    useEffect(() => {\n        onRunModeChange();\n    }, [runMode]);\n\n    useEffect(() => () => newTabWindow?.close(), []);\n\n    return newTabWindow;\n};\n\nexport const RunnerNewTabFocusButton = () => {\n    const [runningAppWindow] = useExternalState(newTabWindowAtom);\n    const runMode = useSelector(getRunMode);\n    if (runMode !== \"NEWTAB\") return null;\n    return (\n        <Button\n            className=\"mx-2.5 my-0\"\n            variant=\"primary\"\n            icon={faExternalLinkSquare}\n            onClick={() => runningAppWindow?.focus()}>\n            Focus running app\n        </Button>\n    );\n};\n\ntype Position = { left: number; top: number };\n// maybe persist this position\nconst initPosition = { left: 0, top: 0 };\n\nconst useDraggableMaximizeButton = () => {\n    const [position, setPosition] = useReducer((prev: Position, next: Position) => {\n        if (prev.left === next.left && prev.top === next.top) return prev;\n        return next;\n    }, initPosition);\n\n    const [isDragging, setIsDragging] = useState(false);\n    const dragItemRef = useRef<HTMLDivElement>(null);\n    const containerRef = useRef<HTMLDivElement>(null);\n\n    const onPointerDown = useEvent((e: React.MouseEvent) => {\n        setIsDragging(true);\n        const onPointerUp = () => {\n            setIsDragging(false);\n            document.removeEventListener(\"pointerup\", onPointerUp, true);\n        };\n        document.addEventListener(\"pointerup\", onPointerUp, { capture: true, passive: true });\n    });\n\n    const onDragStart = useEvent((e: React.DragEvent<HTMLDivElement>) => {\n        const rect = dragItemRef.current?.getBoundingClientRect();\n        if (!rect) return;\n        setIsDragging(true);\n        e.dataTransfer.setData(\n            \"text/plain\",\n            JSON.stringify({ offsetX: e.clientX - rect.left, offsetY: e.clientY - rect.top })\n        );\n        e.dataTransfer.effectAllowed = \"move\";\n    });\n\n    const onDragOver = useEvent((e: React.DragEvent<HTMLDivElement>) => {\n        if (!isDragging) return;\n        e.preventDefault();\n        e.dataTransfer.dropEffect = \"move\";\n    });\n\n    const onDragEnd = useEvent((e: React.DragEvent<HTMLDivElement>) => {\n        e.preventDefault();\n        setIsDragging(false);\n    });\n\n    const onDrop = useEvent((e: React.DragEvent<HTMLDivElement>) => {\n        if (!isDragging) return;\n        e.preventDefault();\n        setIsDragging(false);\n        const containerRect = containerRef.current?.getBoundingClientRect();\n        if (!containerRect) return;\n        const offsets = JSON.parse(e.dataTransfer.getData(\"text/plain\"));\n        let newLeft = e.clientX - containerRect.left - offsets.offsetX;\n        let newTop = e.clientY - containerRect.top - offsets.offsetY;\n        newLeft = Math.max(0, Math.min(containerRect.width - (dragItemRef.current?.offsetWidth ?? 0), newLeft));\n        newTop = Math.max(0, Math.min(containerRect.height - (dragItemRef.current?.offsetHeight ?? 0), newTop));\n        setPosition({ left: newLeft, top: newTop });\n    });\n\n    useResizeObserverTimeout(containerRef, () => {\n        if (!containerRef.current || !dragItemRef.current) return;\n\n        const containerRect = containerRef.current.getBoundingClientRect();\n        const dragItemRect = dragItemRef.current.getBoundingClientRect();\n        const newPosition = { ...position };\n        if (newPosition.left + dragItemRect.width > containerRect.width) {\n            newPosition.left = containerRect.width - dragItemRect.width;\n        }\n        if (newPosition.top + dragItemRect.height > containerRect.height) {\n            newPosition.top = containerRect.height - dragItemRect.height;\n        }\n        setPosition(newPosition);\n    });\n\n    return {\n        onDrop,\n        onDragEnd,\n        onDragOver,\n        onDragStart,\n        isDragging,\n        style: position,\n        onPointerDown,\n        dragItemRef,\n        containerRef,\n    };\n};\n\nexport const RunnerIframe = () => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const src = useRunnerSrc();\n    const runMode = useSelector(getRunMode);\n    const isMaximized = useSelector(getRunnerViewMaximised);\n    const [runningAppWindow, setRunningAppWindow] = useState<WindowProxy | null>(null);\n    useCommunicateWithRunner(runningAppWindow, src);\n    const iframeRef = useRef<HTMLIFrameElement>(null);\n\n    useEffect(() => {\n        if (runMode === \"INLINE\" && iframeRef.current) {\n            iframeRef.current.src = src;\n            setRunningAppWindow(iframeRef.current.contentWindow);\n        }\n    }, [src, runMode]);\n\n    const runnerMaximised = useSelector(getRunnerViewMaximised);\n    const onExpandRunnerClick = useEvent(() => dispatch(runnerMaximised ? restoreRunner() : maximiseRunner()));\n\n    const { onDrop, onDragEnd, onDragOver, onDragStart, isDragging, style, onPointerDown, dragItemRef, containerRef } =\n        useDraggableMaximizeButton();\n\n    const isPaused = useSelector(getIsRunnerPaused);\n\n    if (runMode !== \"INLINE\") return null;\n    return (\n        <div ref={containerRef} className=\"h-full\" onDragOver={onDragOver} onDrop={onDrop}>\n            <iframe\n                title=\"runner-iframe\"\n                className={cx(\"h-full w-full\", { \"pointer-events-none\": isDragging })}\n                ref={iframeRef}\n                name=\"runner-iframe\"\n                allow=\"camera;microphone;geolocation;usb;autoplay\"\n            />\n            {isPaused && <div className=\"absolute top-0 left-0 h-full w-full bg-black opacity-50\" />}\n            <div\n                className=\"absolute top-0 left-0 flex items-center justify-center gap-2\"\n                ref={dragItemRef}\n                draggable=\"true\"\n                onDragStart={onDragStart}\n                onDragEnd={onDragEnd}\n                onPointerDown={onPointerDown}\n                style={style}>\n                <Button style={{ opacity: 0.5 }} small onClick={onExpandRunnerClick}>\n                    <FontAwesomeIcon fixedWidth icon={runnerMaximised ? faCompressArrowsAlt : faExpandArrowsAlt} />\n                </Button>\n                {isMaximized && <RunAppButton small style={{ opacity: 0.5 }} />}\n            </div>\n            <NumErrorWarningBtn />\n        </div>\n    );\n};\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faLevelDownAlt } from \"@fortawesome/free-solid-svg-icons/faLevelDownAlt\";\nimport { faTrash } from \"@fortawesome/free-solid-svg-icons/faTrash\";\nimport { faRefresh } from \"@fortawesome/pro-solid-svg-icons\";\nimport { faMagnifyingGlass, faPause } from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { ReplEditor } from \"@/code_mirror/repl\";\nimport { getApp } from \"@/controllers/app\";\nimport { openOrFocusBottomTab } from \"@/controllers/bottom-tabs\";\nimport { getIsRunnerPaused, getPausedServerReplHyperstackId } from \"@/controllers/debugger\";\nimport { restartApp } from \"@/controllers/ide\";\nimport { modal } from \"@/controllers/modals\";\nimport {\n    clearRepl,\n    dismissReplBanner,\n    getPreserveReplLogs,\n    replCommand,\n    replInterrupt,\n    restartRepl,\n    setPreserveReplLogs,\n} from \"@/controllers/repl\";\nimport { getDebugSessionToken, getRunMode } from \"@/controllers/runner\";\nimport { recordActivity } from \"@/controllers/util\";\nimport { cx } from \"@/theme/styles\";\nimport { AnvilDispatch, Repl, State } from \"@/types\";\nimport { checkMeta } from \"@/util\";\nimport { useFeatureSupported } from \"@/util/features\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { navigate } from \"../../router/navigation\";\nimport { Button } from \"../reusable/Button\";\nimport { LinkInternal } from \"../reusable/LinkInternal\";\nimport LiveOutput, { liveOutputSearchStore } from \"../reusable/LiveOutput\";\nimport { CheckBox } from \"../reusable/SharedComponents\";\nimport { useTooltip } from \"../reusable/Tooltip\";\nimport UpgradeBadge from \"../reusable/UpgradeBadge\";\nimport { StackFrameContext, StackFrameContextType } from \"./DebugInspector\";\n\ninterface ImportBannerProps {\n    repl: Repl;\n}\n\ninterface ReplProps {\n    id: string;\n    repl: Repl;\n    noninteractive?: boolean;\n    debug?: boolean;\n}\n\nconst ImportBanner: React.FC<ImportBannerProps> = ({ repl }) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const app = useSelector(getApp);\n\n    const persistentAvailable = useFeatureSupported(\"persistent-server\");\n    const showBanner = repl.importTimeTracking?.showImportBanner && !app?.config.runtime_options.server_persist;\n    const [importBannerToolTip, importBannerAnchorRef] = useTooltip(\n        \"Every server call requires set up including all module imports.\",\n        \"top\"\n    );\n\n    useEffect(() => {\n        if (showBanner) {\n            dispatch(recordActivity(\"showImportBanner\", { importTime: repl.importTimeTracking?.totalImportTime }));\n        }\n    }, [showBanner]);\n\n    return showBanner ? (\n        <div className=\"flex items-end gap-4\">\n            <LinkInternal ref={importBannerAnchorRef}>\n                {importBannerToolTip}\n                Total import time: {repl.importTimeTracking?.totalImportTime} ms (\n                {repl.importTimeTracking?.requestCount} server calls).\n            </LinkInternal>\n            <Button\n                small={true}\n                onClick={() =>\n                    persistentAvailable\n                        ? dispatch(navigate({ type: \"SETTINGS\", section: \"RUNTIME\" }))\n                        : dispatch(modal(\"upgradePrompt\", { featureId: \"persistent-server\" }))\n                }>\n                Turn on persistent server to speed up your app.\n                <UpgradeBadge feature={\"persistent-server\"} />\n            </Button>\n        </div>\n    ) : null;\n};\n\n/**\n * isRunning tells the replEditor whether we can/can't execute a command\n * if the last executing command is from the client, but our current context is on the server, then we can execute the command\n */\nexport function useIsRunning(repl: Repl | undefined, dbg: StackFrameContextType[\"dbg\"]) {\n    const runningCmdIdx = repl?.runningCmdIdx;\n    const isServer = repl?.type === \"server\" || (repl?.type === \"runner\" && dbg?.location);\n    return runningCmdIdx != null && !!repl?.output.at(runningCmdIdx)?.onServer === !!isServer;\n}\n\ninterface ReplToolbarProps {\n    id: string;\n    repl: Repl;\n    autoScroll: boolean;\n    setAutoScroll: (autoScroll: boolean) => void;\n}\n\nconst ReplToolbar = ({ repl, id, autoScroll, setAutoScroll }: ReplToolbarProps) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n\n    const preserveReplLogs = useSelector(getPreserveReplLogs);\n    const [preserveLogs, setPreserveLogs] = useState(preserveReplLogs || false);\n\n    const [autoScrollToolTip, autoScrollAnchorRef] = useTooltip(\"Toggle output auto-scroll\", \"top-right\");\n    const [refreshToolTip, refreshAnchorRef] = useTooltip(\n        repl.type === \"server\" ? \"Restart Server Repl\" : \"Restart App\",\n        \"top-right\"\n    );\n\n    const onUpdatePreserveLogs = useEvent(async () => {\n        setPreserveLogs((p) => !p);\n        await dispatch(setPreserveReplLogs(repl.id, !preserveLogs));\n    });\n\n    return (\n        <div className=\"flex items-center justify-between border-b border-sectionborder px-4 py-2 dark:border-dark-sectionborder\">\n            <div className=\"flex items-center gap-4 self-start\">\n                <LinkInternal\n                    className=\"inline-flex w-8 justify-center hover:text-light-fg1/80 dark:hover:text-dark-fg1/80\"\n                    onClick={() => liveOutputSearchStore.toggle()}>\n                    <FontAwesomeIcon icon={faMagnifyingGlass} />\n                </LinkInternal>\n                <LinkInternal\n                    className=\"inline-flex w-8 justify-center hover:text-light-fg1/80 dark:hover:text-dark-fg1/80\"\n                    onClick={() => {\n                        dispatch(clearRepl(id));\n                    }}>\n                    <FontAwesomeIcon icon={faTrash} />\n                </LinkInternal>\n                <LinkInternal\n                    className=\"inline-flex w-8 justify-center hover:text-light-fg1/80 dark:hover:text-dark-fg1/80\"\n                    ref={refreshAnchorRef}\n                    onClick={() => {\n                        switch (repl.type) {\n                            case \"server\":\n                                dispatch(restartRepl(id));\n                                break;\n                            case \"runner\":\n                                dispatch(restartApp());\n                                break;\n                        }\n                    }}>\n                    {refreshToolTip}\n                    <FontAwesomeIcon icon={faRefresh} />\n                </LinkInternal>\n                <LinkInternal\n                    ref={autoScrollAnchorRef}\n                    className={cx(\n                        \"inline-flex w-8 justify-center hover:text-light-fg1/80 dark:hover:text-dark-fg1/80\",\n                        autoScroll && \"text-primary\"\n                    )}\n                    onClick={() => setAutoScroll(!autoScroll)}>\n                    {autoScrollToolTip}\n                    <FontAwesomeIcon icon={faLevelDownAlt} />\n                </LinkInternal>\n                <CheckBox\n                    checked={preserveLogs}\n                    onChange={onUpdatePreserveLogs}\n                    text={\"Preserve output between sessions\"}\n                />\n            </div>\n            <ImportBanner repl={repl} />\n        </div>\n    );\n};\n\nconst REPL: React.FC<ReplProps> = ({ id, repl, noninteractive = false }) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const app = useSelector(getApp);\n    const runMode = useSelector(getRunMode);\n    const sessionToken = useSelector(getDebugSessionToken);\n\n    const [autoScroll, setAutoScroll] = useState(true);\n\n    const isRunner = repl.type === \"runner\";\n\n    const frameContext = useContext(StackFrameContext);\n    const { hyperstackId, dbg } = frameContext;\n\n    const onCloseBanner = useEvent(() => dispatch(dismissReplBanner(id)));\n    const onExec = useEvent(async (code: string) => await dispatch(replCommand(id, code, frameContext)));\n    const onInterrupt = useEvent(() => dispatch(replInterrupt(id, frameContext)));\n\n    let appHasChanged = repl.commitId !== app?.commitSha;\n    if (repl.type === \"runner\") {\n        // if repl for the client console make sure the app is running\n        appHasChanged &&= !!runMode;\n    }\n    const isRunnerPaused = useSelector(getIsRunnerPaused);\n    const pausedServerReplHyperstackId = useSelector((state: State) =>\n        repl.type === \"server\" ? getPausedServerReplHyperstackId(state, id) : undefined\n    );\n    const isServer = repl.type === \"server\" || (isRunner && dbg?.location);\n    const readOnly = repl.readOnly || (!isServer && sessionToken == null);\n\n    const runningCmdIdx = repl.runningCmdIdx;\n\n    const isRunning = useIsRunning(repl, dbg);\n\n    const pausedHyperstackId = isRunner ? (isRunnerPaused ? \"runner\" : undefined) : pausedServerReplHyperstackId;\n    const overlay = !hyperstackId && !!pausedHyperstackId;\n\n    const onKeyDown = useEvent((e: React.KeyboardEvent<HTMLDivElement>) => {\n        if (e.key === \"f\" && checkMeta(e)) {\n            liveOutputSearchStore.open();\n        }\n    });\n\n    return (\n        <div className=\"tab-[4rem] relative flex h-full flex-col\" onKeyDown={onKeyDown}>\n            {!hyperstackId && <ReplToolbar repl={repl} id={id} autoScroll={autoScroll} setAutoScroll={setAutoScroll} />}\n            <div className=\"relative flex-[1_0_auto]\">\n                <div className=\"absolute inset-0\">\n                    <LiveOutput messages={repl.output} autoScroll={autoScroll} setAutoScroll={setAutoScroll} />\n                </div>\n            </div>\n            {!readOnly && !repl.bannerDismissed && appHasChanged && (\n                <div className=\"inline-flex h-12 items-center justify-between border-t border-b border-t-gray-100 border-b-gray-100 bg-[#FFFFDD] text-2xl\">\n                    <div className=\"pl-8 text-2xl text-black\">\n                        {isRunner ? (\n                            <>\n                                The app has changed since you ran it.{\" \"}\n                                <button\n                                    className=\"border-none bg-none p-0 text-2xl text-primary\"\n                                    onClick={() => dispatch(restartApp())}>\n                                    Click here to restart\n                                </button>\n                                .\n                            </>\n                        ) : (\n                            <>\n                                The app has changed since you opened this Server Console.{\" \"}\n                                <button\n                                    className=\"border-none bg-none p-0 text-2xl text-primary\"\n                                    onClick={() => dispatch(restartRepl(id))}>\n                                    Click here to reload\n                                </button>\n                            </>\n                        )}\n                    </div>\n                    <button\n                        className=\"absolute right-1.5 h-[inherit] w-4 cursor-pointer border-none bg-none\"\n                        onClick={onCloseBanner}>\n                        <span className=\"absolute h-0.5 w-5 rotate-45 transform bg-[#333]\"></span>\n                        <span className=\"absolute h-0.5 w-5 -rotate-45 transform bg-[#333]\"></span>\n                    </button>\n                </div>\n            )}\n            {isServer && readOnly && (\n                <div className=\"flex px-4 py-2\">\n                    <Button small onClick={() => dispatch(restartRepl(id))} icon={faRefresh}>\n                        Restart\n                    </Button>\n                </div>\n            )}\n\n            {!noninteractive && (\n                <div className={cx({ hidden: readOnly })}>\n                    <ReplEditor\n                        onExec={onExec}\n                        onInterrupt={onInterrupt}\n                        isRunning={isRunning}\n                        replId={id}\n                        codeMirrorState={repl.codeMirrorState}\n                        historyState={repl.historyState}\n                        isReadOnly={readOnly || overlay}\n                        isServer={isServer}\n                        autoFocus={!overlay}\n                    />\n                </div>\n            )}\n            {overlay && (\n                <div className=\"absolute inset-0 flex h-full w-full items-center justify-center bg-black/50 dark:bg-white/50\">\n                    <Button\n                        variant={\"highlight2\"}\n                        icon={faPause}\n                        onClick={() => {\n                            dispatch(openOrFocusBottomTab({ type: \"debugger\", hyperstackId: pausedHyperstackId! }));\n                        }}>\n                        App Paused - Visit Debug Tab\n                    </Button>\n                </div>\n            )}\n        </div>\n    );\n};\n\nexport default REPL;\n","import React from \"react\";\nimport { join } from \"lodash-es\";\nimport moment from \"moment\";\nimport { modalReturn } from \"@/controllers/modals\";\nimport { ModalComponent } from \".\";\nimport { Heading, Text } from \"../reusable/Text\";\nimport Modal from \"./Modal\";\n\nconst VulnerablePackage = ({ pkg }: { pkg: any }) => {\n    return (\n        <div>\n            <hr />\n            <Heading level={1} className=\"font-mono\">\n                Package: {pkg.name} {pkg.version}\n            </Heading>\n            {pkg.dep_path.length > 0 && (\n                <Heading level={3} style={{ marginTop: 0 }}>\n                    Required by:{\" \"}\n                    <span className=\"font-mono\">\n                        {pkg.dep_path.map((x: string) => (\n                            <span key={x}>{x} → </span>\n                        ))}{\" \"}\n                        {pkg.name}\n                    </span>\n                </Heading>\n            )}\n            <ul>\n                {pkg.vulns.map(({ id, description, fix_versions }: any) => (\n                    <li key={id}>\n                        <Text level={1}>\n                            <span className={`font-semibold`}>{id}: </span> {description}\n                        </Text>\n                        {fix_versions.length === 0 && <Text level={2}>Not yet fixed</Text>}\n                        {fix_versions.length === 1 && (\n                            <Text level={2}>\n                                Fixed in version <span className={`font-mono`}>{fix_versions[0]}</span>\n                            </Text>\n                        )}\n                        {fix_versions.length > 1 && (\n                            <Text level={2}>\n                                Fixed in versions <span className={`font-mono`}>{join(fix_versions)}</span>\n                            </Text>\n                        )}\n                    </li>\n                ))}\n            </ul>\n        </div>\n    );\n};\n\nexport const PipAudit: ModalComponent<{ checkDate: string | null; pipAudit: unknown[] }> = ({\n    modalId,\n    spec: { checkDate, pipAudit },\n}) => {\n    const reportDate = moment.utc(checkDate);\n    return (\n        <Modal\n            modalId={modalId}\n            allowDismiss={true}\n            title={`Vulnerability Report - ${reportDate.format(\"LL\")}`}\n            className={\"select-text\"}\n            buttons={[{ text: \"Close\", clickActionCreator: () => modalReturn(true) }]}>\n            The following vulnerabilities were reported in your installed packages:\n            {pipAudit.map((p, i) => (\n                <VulnerablePackage key={i} pkg={p} />\n            ))}\n        </Modal>\n    );\n};\n","import React, { useRef } from \"react\";\nimport { connect } from \"react-redux\";\nimport { faCodeBranch } from \"@fortawesome/free-solid-svg-icons/faCodeBranch\";\nimport { faRedo } from \"@fortawesome/free-solid-svg-icons/faRedo\";\nimport { getAppEditState } from \"@/controllers/app\";\nimport type { AnvilConnectedProps, State } from \"@/types\";\nimport { ModalComponent } from \".\";\nimport { ModalButton } from \"../reusable/SharedComponents\";\nimport Modal, { ModalRef } from \"./Modal\";\n\ninterface SaveConflictSpec {\n    otherUser?: string | null;\n    canBranch?: boolean;\n}\n\nconst connector = connect((state: State) => ({\n    editState: getAppEditState(state),\n}));\n\ntype SaveConflictProps = AnvilConnectedProps<typeof connector>;\n\nconst SaveConflict: ModalComponent<SaveConflictSpec, boolean | null, SaveConflictProps> = ({\n    modalId,\n    spec: { otherUser, canBranch },\n    editState,\n}) => {\n    const modalRef = useRef<ModalRef>(null);\n\n    return (\n        <Modal modalId={modalId} allowDismiss={false} title=\"Save Failed\" buttons={[]} ref={modalRef}>\n            {canBranch && otherUser ? `${otherUser} has` : \"You have\"}&nbsp;made a change to the '{editState!.branch}'\n            branch of this app elsewhere.\n            <p>\n                <strong>Your current changes will be lost.</strong>\n            </p>\n            <br />\n            {canBranch && (\n                <p>\n                    You can either reset this app to latest version, or you can switch to your development branch and\n                    continue working on that branch.\n                </p>\n            )}\n            <br />\n            <ModalButton\n                className={\"mr-4\"}\n                onClick={() => modalRef.current?.returnValue(false)}\n                variant={\"primary\"}\n                icon={faRedo}>\n                Reset app to latest version{\" \"}\n            </ModalButton>\n            {canBranch && (\n                <ModalButton\n                    onClick={() => modalRef.current?.returnValue(true)}\n                    variant={\"primary\"}\n                    icon={faCodeBranch}>\n                    Switch to my development branch{\" \"}\n                </ModalButton>\n            )}\n        </Modal>\n    );\n};\n\nexport default connector(SaveConflict) as typeof SaveConflict;\n","import React, { useEffect, useMemo, useReducer, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faClock } from \"@fortawesome/pro-light-svg-icons/faClock\";\nimport ComboBox from \"@/components/reusable/ComboBox\";\nimport { useStyles as useInputStyles } from \"@/components/reusable/Forms\";\nimport { ContentDropdownMenuItem, ContentTextInput } from \"@/components/reusable/SharedComponents\";\nimport { Heading } from \"@/components/reusable/Text\";\nimport ScheduledTaskLastRunInfo from \"@/components/tabs/scheduled_tasks/ScheduledTaskLastRunInfo\";\nimport { getAppPackageName, markSaved, markUnsaved } from \"@/controllers/app\";\nimport { getDefinedBackgroundTasks } from \"@/controllers/app/autocompleter\";\nimport {\n    DAY,\n    DAYS,\n    HOUR,\n    MINUTE,\n    MONTH,\n    PERIODS,\n    TaskUpdate,\n    WEEK,\n    addScheduledTask,\n    getOrdinalSuffix,\n    namePeriod,\n    taskReducer,\n    updateScheduledTask,\n} from \"@/controllers/scheduledtasks\";\nimport { cx } from \"@/theme/styles\";\nimport { AnvilDispatch, ScheduledTask } from \"@/types\";\nimport { blockEvent, checkMeta } from \"@/util\";\nimport { useEffectAsync } from \"@/util/hooks\";\nimport useEvent from \"@/util/useEventCallback\";\nimport type { ModalComponent } from \".\";\nimport Modal from \"./Modal\";\n\ninterface NewTask extends Omit<ScheduledTask, \"job_id\"> {\n    job_id?: ScheduledTask[\"job_id\"];\n}\n\nconst DAY_OPTIONS = DAYS.map((day, idx) => (\n    <option key={idx} value={idx + 1}>\n        {day}\n    </option>\n));\n\n// we use uncontrolled components - i.e. set the defaultValue not the value\nconst ScheduledTaskInput = (props: React.ComponentProps<typeof ContentTextInput>) => (\n    <ContentTextInput type=\"number\" small className=\"w-24!\" nativeInvalid {...props} />\n);\n\ninterface BgTask {\n    name: string;\n    moduleName: string;\n}\n\nconst BgTaskFnItem = ({ name, moduleName }: BgTask) => (\n    <div title={`${moduleName}.${name}`} className=\"flex w-full items-center gap-2\">\n        <span className=\"min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">{name}</span>\n        <i className=\"min-w-0 flex-1 overflow-hidden text-base text-ellipsis whitespace-nowrap\">({moduleName})</i>\n    </div>\n);\n\nconst BackgroundTaskPicker: React.FC<EditScheduledTaskItemProps> = ({ task: { task_name }, updateTask }) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const packageName = useSelector(getAppPackageName);\n    const [backgroundTasksFromAutoCompleter, setBackgroundTasksFromAutoCompleter] = useState<BgTask[]>([]);\n\n    useEffectAsync(async function* () {\n        const bgTasks = await dispatch(getDefinedBackgroundTasks());\n        yield;\n        setBackgroundTasksFromAutoCompleter(bgTasks);\n    }, []);\n\n    const [backgroundItems, backgroundRenderMap] = useMemo(() => {\n        const packagePrefix = new RegExp(\"^\" + packageName + \"\\\\.\");\n        const bgRender: Map<string, React.ReactNode> = new Map();\n        for (const { name, moduleName } of backgroundTasksFromAutoCompleter) {\n            if (bgRender.has(name)) continue;\n            const simplifiedModuleName = moduleName.replace(packagePrefix, \"\");\n            bgRender.set(name, <BgTaskFnItem name={name} moduleName={simplifiedModuleName} />);\n        }\n        return [Array.from(bgRender.keys()), bgRender] as const;\n    }, [backgroundTasksFromAutoCompleter, packageName]);\n\n    return (\n        <ComboBox\n            value={task_name ?? \"\"}\n            className=\"w-96\"\n            inputClassName=\"w-full\"\n            autoFocus\n            onChange={(task_name) => updateTask({ task_name })}\n            items={backgroundItems}\n            renderItem={(i) => backgroundRenderMap.get(i)}\n            onEnter={(e) => !checkMeta(e) && blockEvent(e)} // otherwise the modal closes on enter\n        />\n    );\n};\n\ninterface EditScheduledTaskItemProps {\n    task: NewTask;\n    updateTask: React.Dispatch<TaskUpdate>;\n    className?: string;\n    inline?: boolean;\n}\n\nconst useUpdateTaskOnChange = <K extends keyof TaskUpdate>(k: K, updateTask: React.Dispatch<TaskUpdate>) => {\n    return useEvent((e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n        updateTask({ [k]: e.target.value as TaskUpdate[K] });\n    });\n};\n\nexport const EditTimeSpec = ({ task, updateTask, inline, className }: EditScheduledTaskItemProps) => {\n    const timeSpec = task.time_spec || { at: {} };\n    const atSpec = timeSpec.at ?? {};\n    const hourStr = String(atSpec.hour ?? 3).padStart(2, \"0\");\n    const minuteStr = String(atSpec.minute ?? 0).padStart(2, \"0\");\n    const { every } = timeSpec;\n\n    const onChangeEvery = useUpdateTaskOnChange(\"every\", updateTask);\n    const onChangeN = useUpdateTaskOnChange(\"n\", updateTask);\n    const onChangeDay = useUpdateTaskOnChange(\"day\", updateTask);\n    const onChangeHour = useUpdateTaskOnChange(\"hour\", updateTask);\n    const onChangeMin = useUpdateTaskOnChange(\"minute\", updateTask);\n\n    return (\n        <div className={cx(\"w-fit min-w-100 items-center gap-2\", inline ? \"inline-flex flex-wrap\" : \"flex\", className)}>\n            <div className={\"flex items-center gap-2\"}>\n                &nbsp;{inline ? \"e\" : \"E\"}very&nbsp;\n                <ScheduledTaskInput min={1} step={1} key=\"n\" defaultValue={timeSpec.n} onChange={onChangeN} />\n                <ContentDropdownMenuItem small className={\"h-[2.2rem]! pt-0!\"} value={every} onChange={onChangeEvery}>\n                    {PERIODS.map((period, idx) => (\n                        <option key={idx} value={period}>\n                            {namePeriod(period, timeSpec.n)}\n                        </option>\n                    ))}\n                </ContentDropdownMenuItem>\n            </div>\n            {every === WEEK && (\n                <div className={\"flex items-center gap-2\"}>\n                    &nbsp;on&nbsp;\n                    <ContentDropdownMenuItem\n                        small\n                        className={\"h-[2.2rem]! pt-0!\"}\n                        value={atSpec.day ?? 1}\n                        onChange={onChangeDay}>\n                        {DAY_OPTIONS}\n                    </ContentDropdownMenuItem>\n                </div>\n            )}\n            {every === MONTH && (\n                <div className={\"flex items-center gap-2\"}>\n                    &nbsp;on&nbsp;\n                    <ScheduledTaskInput\n                        key=\"dom\"\n                        min={1}\n                        max={31}\n                        step={1}\n                        defaultValue={atSpec.day ?? 1}\n                        onChange={onChangeDay}\n                    />\n                    {getOrdinalSuffix(atSpec.day ?? 1)}\n                </div>\n            )}\n            {every !== MINUTE && (\n                <div className={\"flex items-center gap-2\"}>\n                    &nbsp;at&nbsp;\n                    {every !== HOUR && (\n                        <ScheduledTaskInput\n                            min={0}\n                            max={23}\n                            step={1}\n                            key=\"hour\"\n                            defaultValue={hourStr}\n                            onChange={onChangeHour}\n                        />\n                    )}\n                    {every === HOUR && <>&nbsp;∗</>}:\n                    <ScheduledTaskInput\n                        min={0}\n                        max={59}\n                        step={1}\n                        key=\"min\"\n                        defaultValue={minuteStr}\n                        onChange={onChangeMin}\n                    />\n                </div>\n            )}\n            {(every === MONTH || every === WEEK || every === DAY) && <>&nbsp;UTC</>}\n            &nbsp;\n        </div>\n    );\n};\n\nconst checkIsExistingTask = (task: NewTask): task is ScheduledTask => !!task.job_id;\n\nconst EDIT_TEXT = [\"Edit Scheduled Task\", \"Update\", \"Cancel\"] as const;\nconst ADD_TEXT = [\"Create Scheduled Task\", \"Add\", \"Discard\"] as const;\n\nconst ScheduledTaskModal: ModalComponent<{ task: NewTask }> = ({ modalId, spec: { task: originalTask } }) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const saveKey = `scheduled-task-${originalTask.job_id}`;\n\n    const [task, updateTask] = useReducer(taskReducer, originalTask);\n    const isExistingTask = checkIsExistingTask(task);\n\n    const enabled = task !== originalTask && !!task.task_name;\n    useEffect(() => {\n        if (!enabled) return;\n        dispatch(markUnsaved(saveKey));\n        return () => {\n            dispatch(markSaved(saveKey));\n        };\n    }, [enabled, saveKey, dispatch]);\n\n    const onUpdateOrAdd = useEvent(async () => {\n        if (!task.task_name) {\n            return;\n        }\n        if (isExistingTask) {\n            await dispatch(updateScheduledTask(task));\n        } else {\n            await dispatch(addScheduledTask(task));\n        }\n    });\n\n    const [title, save, cancel] = isExistingTask ? EDIT_TEXT : ADD_TEXT;\n\n    const { classes: inputClasses } = useInputStyles();\n\n    return (\n        <Modal\n            modalId={modalId}\n            size={\"large\"}\n            icon={faClock}\n            title={title}\n            autoFocus={isExistingTask}\n            allowDismiss={false}\n            buttons={[\n                { text: save, clickActionCreator: onUpdateOrAdd, defaultButton: true, enabled },\n                { text: cancel },\n            ]}>\n            <div className=\"grid grid-cols-[repeat(2,max-content)] gap-x-8 px-4\">\n                <Heading level={3}>Task to Run</Heading>\n                <Heading level={3}>Run Task</Heading>\n                <BackgroundTaskPicker task={task} updateTask={updateTask} />\n                <EditTimeSpec task={task} updateTask={updateTask} className={inputClasses.inputShared} />\n            </div>\n            {isExistingTask && (\n                <div className=\"px-4 pt-4\">\n                    <ScheduledTaskLastRunInfo task={task} />\n                </div>\n            )}\n        </Modal>\n    );\n};\n\nexport default ScheduledTaskModal;\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faAngleDoubleUp } from \"@fortawesome/pro-light-svg-icons/faAngleDoubleUp\";\nimport { faChevronRight } from \"@fortawesome/pro-light-svg-icons/faChevronRight\";\nimport { faCheck } from \"@fortawesome/pro-solid-svg-icons/faCheck\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { every } from \"lodash-es\";\nimport * as api from \"@/api\";\nimport { getAppId } from \"@/controllers/app\";\nimport { getFeatures, getIsIDE, getSubscription, getUser, reloadUser } from \"@/controllers/ide\";\nimport { alert } from \"@/controllers/modals\";\nimport { startUpgrade } from \"@/controllers/payment\";\nimport { restoreRunnerView } from \"@/controllers/runner\";\nimport { startTrial } from \"@/controllers/user\";\nimport { navigate } from \"@/router/navigation\";\nimport { makeStyles, useIsPySpace } from \"@/theme/styles\";\nimport type { AnvilDispatch, GadgetDispatch } from \"@/types\";\nimport { getPlanName } from \"@/util/features\";\nimport { useEffectAsync } from \"@/util/hooks\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { setRightPanelContent } from \"@pyspace/gadget_editor/controllers/gadget\";\nimport type { ModalComponent } from \".\";\nimport { Button } from \"../reusable/Button\";\nimport { HelpLink } from \"../reusable/HelpLink\";\nimport { ModalButton } from \"../reusable/SharedComponents\";\nimport { Heading, Text } from \"../reusable/Text\";\nimport Modal from \"./Modal\";\nimport type { ModalRef } from \"./Modal\";\n\n// There are three Upgrade Prompt modals to choose from:\n//\n// - Open app with feature you don't have access to. For runtime, offer 7 day trial, or show trial requested (or expired? Somehow?). For everything else, door slam.\n//      - UpgradePromptOnOpenApp\n// - Runtime uses feature not supported on your plan. Basically always going to be a module import (or an email send?)\n//      - UpgradePromptOnRuntimeFeatureRequired\n// - Click a feature explicitly labelled \"BUSINESS PLAN\" etc. Show plan-specific modal. Optionally, specialise this modal depending on which feature was clicked.\n//      - UpgradePrompt\nlet useStyles = makeStyles()((theme) => ({\n    lowerButtons: {\n        marginTop: \"2rem\",\n        display: \"flex\",\n        justifyContent: \"flex-end\",\n        gap: \"1rem\",\n    },\n}));\n\ninterface FullRuntimeStatusProps {\n    onStartTrial?: () => Promise<void> | void;\n    onConfirmTrialRequested: () => void;\n}\n\nconst FullRuntimeStatus = ({ onStartTrial, onConfirmTrialRequested }: FullRuntimeStatusProps) => {\n    // This gets triggered when you choose a runtime that you don't have access to on your subscription\n    //\n    // Cases:\n    // - You haven't had a trial --> Option to activate one\n    // - You have already had your trial --> Upgrade\n\n    const dispatch = useDispatch<AnvilDispatch>();\n    const user = useSelector(getUser);\n    const onStartRuntimeTrial = useEvent(() => {\n        dispatch(startTrial(\"python3-full\"));\n    });\n\n    if (user.trial) {\n        // User has already started a trial. If we've got here, it must have expired.\n        if (user.trial.expired) {\n            return (\n                <div>\n                    Your trial of the Full Python server has expired. To continue using the Full Python server, upgrade\n                    now!\n                </div>\n            );\n        } else {\n            return (\n                <div>\n                    <Text>\n                        You have requested a trial of the Full Python server. It will be activated in the next 24 hours.\n                    </Text>\n                    <Button variant={\"secondary\"} icon={faChevronRight} iconRight onClick={onConfirmTrialRequested}>\n                        Continue\n                    </Button>\n                </div>\n            );\n        }\n    } else {\n        // User has never had a trial. Give them the option to start one.\n        return (\n            <div>\n                <Text>To try a Full Python server before upgrading, you can activate a 7-day trial.</Text>\n                <Button variant={\"primary\"} onClick={onStartRuntimeTrial} icon={faChevronRight} iconRight>\n                    Start 7-day trial now\n                </Button>\n                <Text>\n                    <i>Trial will activate within 24 hours</i>\n                </Text>\n            </div>\n        );\n    }\n};\n\ninterface CustomPackagesStatusProps {\n    onStartTrial?: () => Promise<void> | void;\n    onInstallPackagesNow: () => void;\n    modalRef: React.RefObject<ModalRef | null>;\n}\n\nconst CustomPackagesStatus = ({ onStartTrial, onInstallPackagesNow, modalRef }: CustomPackagesStatusProps) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const user = useSelector(getUser);\n    const onStartRuntimeTrial = useEvent(async () => {\n        await onStartTrial?.();\n        await dispatch(startTrial(\"custom-packages\"));\n        modalRef.current!.returnValue(true);\n    });\n\n    if (user.trial) {\n        // User has already started a trial. If we've got here, it must have expired.\n        if (user.trial.expired) {\n            return (\n                <div>\n                    Your trial of custom package installations has expired. To continue using the Full Python server,\n                    upgrade now!\n                </div>\n            );\n        } else {\n            return (\n                <div>\n                    <Text>\n                        Trial activated! <FontAwesomeIcon icon={faCheck} />\n                    </Text>\n                    <Button variant={\"secondary\"} icon={faChevronRight} iconRight onClick={onInstallPackagesNow}>\n                        Install custom packages now\n                    </Button>\n                </div>\n            );\n        }\n    } else {\n        // User has never had a trial. Give them the option to start one.\n        return (\n            <div>\n                <Text>To try installing custom packages before upgrading, you can activate a 7-day trial.</Text>\n                <Button variant={\"primary\"} onClick={onStartRuntimeTrial} icon={faChevronRight} iconRight>\n                    Start 7-day trial now\n                </Button>\n            </div>\n        );\n    }\n};\n\ninterface UpgradePromptOnOpenAppSpec {\n    featureIds: string[];\n}\n\nexport const UpgradePromptOnOpenApp: ModalComponent<UpgradePromptOnOpenAppSpec, boolean | undefined> = ({\n    modalId,\n    spec: { featureIds },\n}) => {\n    // The provided features are guaranteed not to be available on the current subscription.\n    // console.log(user.features, featureIds);\n    const dispatch = useDispatch<AnvilDispatch>();\n    const user = useSelector(getUser);\n    const appId = useSelector(getAppId);\n    const subscription = useSelector(getSubscription);\n    const features = featureIds.map((id) => user.features[id]);\n\n    const modalRef = useRef<ModalRef>(null);\n\n    const [requiredPlan, setRequiredPlan] = useState(\"paid\");\n\n    useEffectAsync(async () => {\n        setRequiredPlan((await api.getPlanSupportingAllFeatures(featureIds)) || \"paid\");\n    }, []);\n\n    if (!every(features)) {\n        console.error(`No feature found for one of [${features}].`);\n        return <Modal modalId={modalId}>No feature found found for one of [{`${features}`}].</Modal>;\n    }\n\n    // Steps:\n    // 1. Map which plan is required to suit all these features\n    // 2. Work out whether all the features required are \"can run without\" features\n    // 3. Work out whether \"full Python runtime\" is on the list, because that gets special UI\n    // 4. - Show the list of features\n    //    - If appropriate, show the \"Full Python trial\" UI\n    //    - Display more or less apocalyptic copy depending on the answer to #2\n\n    const canRunWithout = every(featureIds, (fid) => user.features[fid].canRunWithout);\n    const fullPythonRequired = featureIds.indexOf(\"full-python-runtime\") > -1;\n    const customPackagesRequired = featureIds.indexOf(\"custom-packages\") > -1;\n    const isDedicatedPlan = requiredPlan === \"dedicated\";\n    const rpName = isDedicatedPlan ? \"Business Plan with Extra Server Resources\" : getPlanName(requiredPlan) + \" Plan\";\n\n    const renderFeature = (featureId: string) => {\n        const feature = user.features[featureId];\n        return (\n            <>\n                {feature.helpLink ? (\n                    <HelpLink inline iconRight url={`https://anvil.works${feature.helpLink}`}>\n                        {feature.name}\n                    </HelpLink>\n                ) : (\n                    <b>{feature.name}</b>\n                )}\n            </>\n        );\n    };\n\n    return (\n        <Modal\n            modalId={modalId}\n            ref={modalRef}\n            title={`Upgrade to run this app`}\n            buttons={[\n                isDedicatedPlan\n                    ? {\n                          text: \"Contact us to upgrade\",\n                          defaultButton: true,\n                          close: true,\n                          variant: \"primary\",\n                          clickActionCreator: () => {\n                              window.location.href = \"mailto:support@anvil.works\";\n                          },\n                      }\n                    : {\n                          text: \"Upgrade now\",\n                          defaultButton: true,\n                          close: true,\n                          variant: \"primary\",\n                          clickActionCreator: () =>\n                              startUpgrade(!subscription?.plan, !!subscription?.trial, false, {\n                                  initialPlan: requiredPlan,\n                              }),\n                      },\n                { text: \"Not yet\", close: true },\n            ]}>\n            <p>\n                {featureIds.length === 1 ? (\n                    <>\n                        This app uses {renderFeature(featureIds[0])}, available on the {rpName}.\n                        {isDedicatedPlan && (\n                            <>\n                                {\" \"}\n                                Please contact <a href=\"mailto:support@anvil.works\">support@anvil.works</a> to upgrade.\n                            </>\n                        )}\n                    </>\n                ) : (\n                    <>\n                        This app uses:\n                        <ul>\n                            {featureIds.map((fid, idx) => (\n                                <li key={idx}>{renderFeature(fid)}</li>\n                            ))}\n                        </ul>\n                        <br />\n                        These features are available on the {rpName}.\n                        {isDedicatedPlan && (\n                            <>\n                                {\" \"}\n                                Please contact <a href=\"mailto:support@anvil.works\">support@anvil.works</a> to upgrade.\n                            </>\n                        )}\n                    </>\n                )}\n            </p>\n\n            <p>\n                {canRunWithout\n                    ? `You can run this app, but ${\n                          featureIds.length === 1 ? \"this feature\" : \"these features\"\n                      } will not be available.`\n                    : \"You can look around and edit this app, but it probably won't run correctly.\"}\n            </p>\n\n            {fullPythonRequired ? (\n                <FullRuntimeStatus onConfirmTrialRequested={() => modalRef.current!.returnValue(true)} />\n            ) : customPackagesRequired ? (\n                <CustomPackagesStatus\n                    modalRef={modalRef}\n                    onInstallPackagesNow={() => {\n                        dispatch(navigate({ type: \"SETTINGS\", section: \"RUNTIME\" }));\n                        modalRef.current!.returnValue(true);\n                    }}\n                />\n            ) : null}\n        </Modal>\n    );\n};\n\ninterface ConfigureOrUpgradePromptOnRuntimeFeatureRequiredSpec {\n    module: string;\n    hasRuntime: boolean;\n    configured: boolean;\n    trialRequested?: boolean;\n}\n\nexport const ConfigureOrUpgradePromptOnRuntimeFeatureRequired: ModalComponent<\n    ConfigureOrUpgradePromptOnRuntimeFeatureRequiredSpec,\n    boolean | undefined\n> = ({ modalId, spec: { module, hasRuntime, configured, trialRequested = false } }) => {\n    const dispatch = useDispatch<AnvilDispatch & GadgetDispatch>();\n    const user = useSelector(getUser);\n    const appId = useSelector(getAppId);\n    const subscription = useSelector(getSubscription);\n    const { classes } = useStyles();\n    const featureId = \"custom-packages\";\n    const features = useSelector(getFeatures);\n    const feature = features[featureId];\n    const plan = getPlanName(feature?.upgradePlan || feature.plan);\n\n    const isPySpace = useIsPySpace();\n\n    let modalRef = useRef<ModalRef>(null);\n    const subStateRef = useRef(subscription);\n    subStateRef.current = subscription;\n\n    const goToSettings = useCallback(() => {\n        dispatch(restoreRunnerView());\n        dispatch(navigate({ type: \"SETTINGS\", section: \"RUNTIME\" }));\n        modalRef.current!.returnValue(true);\n    }, [modalRef, appId, subscription]);\n\n    const startRuntimeTrial = useCallback(async () => {\n        const started = await api.startRuntimeTrial(featureId);\n        if (started) {\n            await dispatch(reloadUser());\n            dispatch(alert(\"Trial activated\", \"Your trial has been successfully activated!\"));\n            goToSettings();\n        } else {\n            dispatch(\n                alert(\n                    \"Something's gone wrong!\",\n                    \"Sorry, we were unable to begin your trial. Please contact support@anvil.works\"\n                )\n            );\n        }\n        modalRef.current!.returnValue(true);\n    }, []);\n\n    const goToUpgrade = async () => {\n        await (startUpgrade(!subscription?.plan, !!subscription?.trial, false, {\n            initialPlan: feature?.upgradePlan || feature.plan,\n        }) as ReturnType<typeof startUpgrade> & Promise<void>);\n        if (Object.keys(subStateRef.current!).length !== 0) {\n            goToSettings();\n        }\n    };\n\n    const goToPySpacePackages = () => {\n        dispatch(setRightPanelContent(() => \"packages\"));\n        modalRef.current!.returnValue(true);\n    };\n\n    const buttons = useMemo(() => {\n        if (hasRuntime) {\n            return (\n                <>\n                    {isPySpace ? (\n                        <ModalButton variant={\"primary\"} onClick={goToPySpacePackages}>\n                            Go to Packages\n                        </ModalButton>\n                    ) : (\n                        <ModalButton variant={\"primary\"} onClick={goToSettings}>\n                            Go to settings\n                        </ModalButton>\n                    )}\n                    <ModalButton onClick={() => modalRef.current!.returnValue(false)}>Cancel</ModalButton>\n                </>\n            );\n        } else {\n            return (\n                <>\n                    <ModalButton variant={\"primary\"} onClick={goToUpgrade}>\n                        Upgrade\n                    </ModalButton>\n                    <ModalButton onClick={() => modalRef.current!.returnValue(false)}>Not yet</ModalButton>\n                </>\n            );\n        }\n    }, [hasRuntime, appId]);\n\n    const title = useMemo(() => {\n        return hasRuntime\n            ? \"Configure your app\"\n            : user?.trial\n              ? \"Upgrade to configure your app\"\n              : \"Upgrade or Start your 7-day trial\";\n    }, [hasRuntime, user?.trial]);\n\n    return (\n        <Modal modalId={modalId} title={title} ref={modalRef}>\n            <Text>\n                The <code>{module}</code> module is not currently installed in the server environment of this app.\n            </Text>\n            {hasRuntime ? (\n                configured ? (\n                    <Text>\n                        Install custom packages in the app settings.{\" \"}\n                        <HelpLink\n                            iconRight\n                            inline\n                            url={isPySpace ? \"/docs/reference/packages\" : \"/beta-docs/server/custom-packages\"}>\n                            Learn more about custom Python packages\n                        </HelpLink>\n                    </Text>\n                ) : (\n                    <Text>\n                        Enable custom packages by switching to Python 3.10 and installing custom packages in the app\n                        settings.{\" \"}\n                        <HelpLink iconRight inline url={\"/beta-docs/server/custom-packages\"}>\n                            Learn more about custom Python packages\n                        </HelpLink>\n                    </Text>\n                )\n            ) : (\n                <>\n                    {\" \"}\n                    {configured ? (\n                        <Text>\n                            To import any third-party python package into your app, upgrade your subscription to the{\" \"}\n                            {plan} plan and install custom packages in your app.{\" \"}\n                            <HelpLink iconRight inline url={\"/beta-docs/server/custom-packages\"}>\n                                Learn more about custom Python packages\n                            </HelpLink>\n                        </Text>\n                    ) : (\n                        <Text>\n                            Import third-party python packages directly into your app by upgrading to a paid\n                            subscription. You'll be able to switch the app's python version to Python 3.10 and{\" \"}\n                            <HelpLink iconRight inline url={\"/beta-docs/server/custom-packages\"}>\n                                install custom packages\n                            </HelpLink>\n                        </Text>\n                    )}\n                    {!user?.trial && (\n                        <div className={\"mt-8\"}>\n                            <ModalButton\n                                variant={\"primary\"}\n                                icon={faChevronRight}\n                                iconRight\n                                onClick={startRuntimeTrial}>\n                                Start a 7-day free trial today\n                            </ModalButton>\n                        </div>\n                    )}\n                </>\n            )}\n\n            <div className={classes.lowerButtons}>{buttons}</div>\n        </Modal>\n    );\n};\n\nexport const planInfo = {\n    hobby: [\n        <>Publish your app on a custom domain</>,\n        <>Scheduled Tasks</>,\n        <>Data File</>,\n        <>No Anvil banners on your app</>,\n    ],\n    business: [\n        <>Collaborate on private repos</>,\n        <>Handle heavy traffic </>,\n        <>Add custom domain names to your apps</>,\n        <>Persistent server code for high performance</>,\n        <>Unlimited Custom Domains</>,\n        <>90 days of App Logs</>,\n    ],\n    dedicated: [\n        <>SQL access to your Data Tables</>,\n        <>Separate server code and database hosting</>,\n        <>Private IP address for firewall access</>,\n        <>Ultra-heavy-duty traffic and storage (pay only for the AWS resources you use)</>,\n        <>SQL access to your Data Tables</>,\n        <>Indexes on your Data Tables</>,\n        <>90 days of App Logs</>,\n    ],\n    production: [\n        <>Priority email support</>,\n        <>High-performance server</>,\n        <>Direct SQL access</>,\n    ],\n    enterprise: [\n        <>On-site or private cloud installation</>,\n        <>Integrate with Enterprise authentication systems</>,\n        <>Audit capabilities</>,\n    ],\n};\n\ninterface UpgradePromptSpec {\n    featureId: string;\n    onStartTrial?: () => Promise<void> | void;\n    additionalIntroText?: React.ReactNode;\n}\n\nexport const UpgradePrompt: ModalComponent<UpgradePromptSpec, boolean | undefined> = ({\n    modalId,\n    spec: { featureId, onStartTrial, additionalIntroText },\n}) => {\n    const inIde = useSelector(getIsIDE);\n    const subscription = useSelector(getSubscription);\n    const features = useSelector(getFeatures);\n    const feature = features[featureId];\n    const requiredPlan = feature?.upgradePlan || feature.plan;\n    const isDedicatedPlan = requiredPlan === \"dedicated\";\n    const planName = isDedicatedPlan\n        ? \"Business Plan with Extra Server Resources\"\n        : getPlanName(requiredPlan) + \" Plan\";\n\n    const modalRef = useRef<ModalRef>(null);\n\n    if (!feature) {\n        console.error(`No feature found with ID '${featureId}'.`);\n        return <Modal modalId={modalId}>No feature found with ID '{featureId}'.</Modal>;\n    }\n\n    return (\n        <Modal\n            modalId={modalId}\n            ref={modalRef}\n            title={\"Time to upgrade!\"}\n            icon={faAngleDoubleUp}\n            buttons={[\n                isDedicatedPlan\n                    ? {\n                          text: \"Contact us to upgrade\",\n                          defaultButton: true,\n                          close: true,\n                          variant: \"primary\",\n                          clickActionCreator: () => {\n                              window.location.href = \"mailto:support@anvil.works\";\n                          },\n                      }\n                    : {\n                          text: \"Upgrade now\",\n                          defaultButton: true,\n                          close: true,\n                          variant: \"primary\",\n                          clickActionCreator: () =>\n                              startUpgrade(!subscription?.plan, !!subscription?.trial, false, {\n                                  initialPlan: requiredPlan,\n                              }),\n                      },\n                { text: \"Not yet\", close: true },\n            ]}>\n            {additionalIntroText}\n            <Text level={1}>\n                The {feature.name} feature requires an Anvil {planName}.\n                {isDedicatedPlan && (\n                    <>\n                        {\" \"}\n                        Please contact <a href=\"mailto:support@anvil.works\">support@anvil.works</a> to upgrade.\n                    </>\n                )}\n            </Text>\n            {featureId === \"full-python-runtime\" ? (\n                <FullRuntimeStatus onConfirmTrialRequested={() => modalRef.current!.returnValue(true)} />\n            ) : featureId === \"custom-packages\" ? (\n                <CustomPackagesStatus\n                    modalRef={modalRef}\n                    onStartTrial={onStartTrial}\n                    onInstallPackagesNow={() => modalRef.current!.returnValue(true)}\n                />\n            ) : (\n                feature.helpLink && (\n                    <HelpLink inline iconRight url={`https://anvil.works${feature.helpLink}`}>\n                        Learn more about {feature.name}\n                    </HelpLink>\n                )\n            )}\n\n            <hr />\n\n            <Heading level={2}>An Anvil {planName} gives you:</Heading>\n\n            <ul style={{ marginLeft: \"3rem\" }}>\n                {(planInfo[feature.upgradePlan as keyof typeof planInfo] ||\n                    planInfo[feature.plan as keyof typeof planInfo])!.map((pi, idx) => (\n                    <li className={\"list-disc\"} key={idx}>\n                        {pi}\n                    </li>\n                ))}\n            </ul>\n        </Modal>\n    );\n};\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { faUpload } from \"@fortawesome/free-solid-svg-icons/faUpload\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { ContentTextInput, ModalButton } from \"@/components/reusable/SharedComponents\";\nimport { addNew, uploadAsset } from \"@/controllers/app/code\";\nimport { alert } from \"@/controllers/modals\";\nimport { cx } from \"@/theme/styles\";\nimport { AnvilDispatch } from \"@/types\";\nimport { Asset, cssify, getThumbnail, useAssets, useThumbnails } from \"@/util/hooks/assets\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { ModalComponent } from \".\";\nimport { Heading, Text } from \"../reusable/Text\";\nimport Modal, { ModalRef } from \"./Modal\";\n\nconst THEME_PREFIX = \"_/theme/\";\nconst MAX_SIZE = 1024 * 1024 * 1.5;\n\ninterface AssetProps {\n    display: string;\n    value: string | null;\n    thumbnail: React.ReactNode;\n    isSelected: boolean;\n}\n\nconst SelectableUri = (props: AssetProps & UriProps) => {\n    const { display, value, isSelected, modalRef, setSelected, thumbnail, closeOnDoubleClick } = props;\n    const linkRef = useRef<HTMLSpanElement>(null!);\n    useEffect(() => {\n        if (!isSelected) return;\n        let cancelled = false;\n        setTimeout(() => {\n            if (cancelled) return;\n            linkRef.current.scrollIntoView({ block: \"nearest\" });\n        }, 150);\n        return () => {\n            cancelled = true;\n        };\n    }, [isSelected]);\n\n    return (\n        <LinkInternal\n            ref={linkRef}\n            className={cx(\"flex gap-4 p-2\", {\n                \"hover:bg-light-bg1 hover:dark:bg-dark-bg2\": !isSelected,\n                \"bg-light-bg3 dark:bg-dark-bg3\": isSelected,\n            })}\n            onDoubleClick={() => {\n                if (!closeOnDoubleClick) return;\n                modalRef.current?.returnValue(value);\n            }}\n            onClick={() => setSelected(value)}>\n            <div className=\"flex h-12 w-12 items-center justify-center self-center rounded-sm border border-sectionborder dark:border-dark-sectionborder\">\n                {thumbnail}\n            </div>\n            {display}\n        </LinkInternal>\n    );\n};\n\nconst DefaultUri = ({ value, ...props }: UriProps) => {\n    const { selected, defaultValue } = props;\n\n    return (\n        <SelectableUri\n            thumbnail={getThumbnail(defaultValue)}\n            display=\"Default\"\n            value={null}\n            isSelected={selected == null}\n            {...props}\n        />\n    );\n};\ninterface ShowAllAssetsLinkProps {\n    viewAllAssets: boolean;\n    setViewAllAssets: React.Dispatch<React.SetStateAction<boolean>>;\n}\nconst ShowAllAssetsLink = ({ viewAllAssets, setViewAllAssets }: ShowAllAssetsLinkProps) => {\n    return (\n        <LinkInternal className={\"text-primary hover:underline\"} onClick={() => setViewAllAssets((s) => !s)}>\n            {viewAllAssets ? \"Hide\" : \"Include\"} assets from dependencies\n        </LinkInternal>\n    );\n};\n\nconst SelectableAssets = ({ value, ...props }: UriProps) => {\n    const [viewAllAssets, setViewAllAssets] = useState<boolean>(false);\n    const { accept, selected, isSelectedAsset, includeDependencies, assetPrefix } = props;\n    const { appAssets, depAssets, allAssets } = useAssets(accept, includeDependencies);\n\n    const assets = viewAllAssets ? allAssets : appAssets;\n    const thumbnails = useThumbnails(assets);\n\n    if (!allAssets.length) return null;\n    return (\n        <>\n            <div className={\"flex items-center justify-between\"}>\n                <Heading level={3}>Available assets:</Heading>\n                {depAssets.length > 0 && (\n                    <ShowAllAssetsLink viewAllAssets={viewAllAssets} setViewAllAssets={setViewAllAssets} />\n                )}\n            </div>\n            <ul className={\"offset-vscrollbar flex max-h-[30vh] flex-col gap-4 overflow-auto\"}>\n                {assets.length ? (\n                    assets.map((asset, i) => (\n                        <li key={asset.fullName}>\n                            <SelectableUri\n                                display={asset.fullName}\n                                thumbnail={thumbnails[i]}\n                                value={assetPrefix + asset.fullName}\n                                isSelected={isSelectedAsset(asset, selected)}\n                                {...props}\n                            />\n                        </li>\n                    ))\n                ) : (\n                    <div className=\"px-4 text-light-grey1\">No assets have been uploaded to this app.</div>\n                )}\n            </ul>\n        </>\n    );\n};\n\nconst UrlInput = ({ selected, setSelected, isURL }: UriProps) => {\n    const TextInput = useRef<HTMLInputElement>(null!);\n\n    const [urlText, setUrlText] = useState(() => (isURL(selected) && selected) || \"https://\");\n\n    const onUrlChange = useEvent((e: React.ChangeEvent<HTMLInputElement>) => {\n        const text = e.target.value;\n        setSelected(text);\n        setUrlText(text);\n    });\n\n    return (\n        <div>\n            <Heading level={3}>Enter a URL</Heading>\n            <div className=\"flex\">\n                <LinkInternal\n                    className={cx(\"flex flex-auto py-1 pr-8 pl-2\", {\n                        \"hover:bg-light-bg1 hover:dark:bg-dark-bg2\": !isURL(selected),\n                        \"bg-light-bg3 dark:bg-dark-bg3\": isURL(selected),\n                    })}\n                    onClick={() => setSelected(TextInput.current.value)}>\n                    <div\n                        className=\"m-1 mr-3 inline-block h-12 w-12 self-center rounded-sm bg-light-bg5 bg-cover bg-center p-2 align-middle dark:bg-dark-bg7\"\n                        style={{ backgroundImage: cssify(urlText) }}\n                    />\n                    <ContentTextInput\n                        ref={TextInput}\n                        onFocus={(e) => setSelected(e.target.value)}\n                        className={\"flex-auto\"}\n                        value={urlText}\n                        onChange={onUrlChange}\n                    />\n                </LinkInternal>\n            </div>\n        </div>\n    );\n};\n\nconst UploadButton = ({ setSelected, checkValidity, maxSize, accept, assetPrefix, pkgPrefix }: UriProps) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const FileInput = useRef<null | HTMLInputElement>(null);\n\n    const onFileChange: React.ChangeEventHandler<HTMLInputElement> = useEvent(async (e) => {\n        let asset = e.target.files?.[0];\n        if (!asset) return;\n        if (maxSize && asset.size > MAX_SIZE) {\n            return dispatch(alert(\"File Too Large\", \"The file is too large for your assets, try reducing the size\"));\n        }\n        if (checkValidity) {\n            const valid = await checkValidity(asset);\n            if (valid === false) {\n                return;\n            } else if (valid === true) {\n                // pass\n            } else {\n                asset = valid;\n            }\n        }\n        if (pkgPrefix) {\n            try {\n                // Because just uploading a file into a folder that doesn't exist will fail\n                // and it's safe to try to add a folder that already exists\n                await dispatch(addNew(\"asset_folder\", true, \"\", pkgPrefix));\n            } catch (e) {\n                // the folder exists\n            }\n        }\n        const codeStructure = await dispatch(uploadAsset(asset, pkgPrefix, false));\n        if (codeStructure) {\n            setSelected(assetPrefix + codeStructure.fullName);\n        }\n    });\n\n    return (\n        <div className=\"text-center\">\n            <ModalButton variant={\"primary\"} onClick={() => FileInput.current?.click()}>\n                <div className=\"flex gap-4\">\n                    <FontAwesomeIcon icon={faUpload} />\n                    Upload\n                </div>\n                <input\n                    ref={FileInput}\n                    className=\"hidden\"\n                    onClick={(e) => e.stopPropagation()}\n                    onChange={onFileChange}\n                    type=\"file\"\n                    accept={accept}\n                />\n            </ModalButton>\n        </div>\n    );\n};\n\nexport interface UriSpec {\n    title: string;\n    text?: string;\n    defaultValue?: string;\n    value: string | null | undefined;\n    accept?: string;\n    maxSize?: number;\n    freeText?: boolean;\n    assetPrefix?: string;\n    uploadInfo?: string;\n    pkgPrefix?: string;\n}\n\ninterface UriProps extends UriSpec {\n    selected: string | null;\n    setSelected(v: string | null): void;\n    modalRef: React.RefObject<ModalRef | null>;\n    closeOnDoubleClick?: boolean;\n    includeDependencies?: boolean;\n    checkValidity?: (asset: File) => Promise<boolean | File>;\n    isSelectedAsset: (asset: Asset, selected: string | null) => boolean;\n    isURL: (selected: string | null) => boolean;\n}\n\ninterface UriModalProps {\n    onModalReturn?: (v: string | null) => Promise<string | null>;\n    closeOnDoubleClick?: boolean;\n    includeDependencies?: boolean;\n    checkValidity?: (asset: File) => Promise<boolean | File>;\n}\n\nconst UriUploader: ModalComponent<UriSpec, string | null, UriModalProps> = (modalProps) => {\n    const {\n        modalId,\n        spec,\n        onModalReturn,\n        closeOnDoubleClick = true,\n        includeDependencies = true,\n        checkValidity,\n    } = modalProps;\n    const {\n        maxSize = MAX_SIZE,\n        value,\n        title,\n        text,\n        defaultValue,\n        freeText,\n        assetPrefix = THEME_PREFIX,\n        uploadInfo,\n    } = spec;\n    const [selected, setSelected] = useState(value ?? null);\n    const modalRef = useRef<ModalRef>(null);\n    const isSelectedAsset = (asset: Asset, selected: string | null) => selected === assetPrefix + asset.fullName;\n    const isURL = (selected: string | null) => !!selected && !selected.startsWith(assetPrefix);\n    const props = {\n        ...spec,\n        assetPrefix,\n        maxSize,\n        selected,\n        setSelected,\n        modalRef,\n        isSelectedAsset,\n        isURL,\n        closeOnDoubleClick,\n        includeDependencies,\n        checkValidity,\n    };\n\n    const onSave = useEvent(async () => {\n        let rv = selected;\n        if (onModalReturn) {\n            rv = await onModalReturn(selected);\n        }\n        modalRef.current?.returnValue(rv);\n    });\n\n    return (\n        <Modal\n            title={title}\n            modalId={modalId}\n            ref={modalRef}\n            buttons={[\n                {\n                    text: \"Save\",\n                    clickActionCreator: () => {\n                        onSave();\n                    },\n                    defaultButton: true,\n                    close: false,\n                },\n                { text: \"Cancel\" },\n            ]}>\n            <div className=\"flex flex-col gap-4\">\n                {text && <Text className=\"italic\">{text}</Text>}\n                {defaultValue && <DefaultUri {...props} />}\n                <SelectableAssets {...props} />\n                {freeText && <UrlInput {...props} />}\n                <hr />\n                <UploadButton {...props} />\n                {uploadInfo && (\n                    <Text level={3} className=\"self-center\">\n                        {uploadInfo}\n                    </Text>\n                )}\n            </div>\n        </Modal>\n    );\n};\n\nexport default UriUploader;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { getModals, modalPropsCache } from \"@/controllers/modals\";\nimport Modal from \"./Modal\";\n\nexport type ModalId = number;\n\nexport interface ModalComponent<S = never, R = any, P = unknown> {\n    (props: ModalProps<S> & P): React.ReactNode;\n    returnType?: R;\n}\n\n// Prefer ModalComponent over ModalProps\nexport interface ModalProps<S = any, T extends string = string> {\n    modalId: ModalId;\n    spec: S;\n    type: T;\n}\n\nexport type ModalTypes = { [modalType: string]: ModalComponent<never, any, any> };\n\nconst Modals = ({ modalTypes }: { modalTypes: ModalTypes }) => {\n    const modals = useSelector(getModals);\n    return (\n        <>\n            {modals.map((modalId) => {\n                const modalProps = modalPropsCache.get(modalId);\n                const ModalComponent = modalProps ? modalTypes[modalProps.type] : null;\n                if (ModalComponent && modalProps) {\n                    return <ModalComponent key={modalProps.modalId} {...modalProps} />;\n                } else {\n                    return (\n                        <Modal key={modalId} modalId={modalId}>\n                            Unknown modal type: <code>{modalProps?.type}</code>.\n                        </Modal>\n                    );\n                }\n            })}\n        </>\n    );\n};\n\nexport default Modals;\n","import Alert from \"@/components/modals/Alert\";\nimport Confirm from \"@/components/modals/Confirm\";\nimport ConfirmWithCheckBox from \"@/components/modals/ConfirmWithCheckBox\";\nimport Prompt from \"@/components/modals/Prompt\";\nimport DeleteGadgetModal from \"@/pyspace/common/modals/DeleteGadget\";\nimport { ModalTypes } from \"..\";\nimport SimpleModal from \"../SimpleModal\";\n\nexport const commonModalTypes = {\n    alert: Alert,\n    confirm: Confirm,\n    confirmWithCheckBox: ConfirmWithCheckBox,\n    prompt: Prompt,\n    deleteGadget: DeleteGadgetModal,\n    simpleModal: SimpleModal,\n} as const satisfies ModalTypes;\n\nexport type CommonModalTypes = typeof commonModalTypes;\nexport type CommonModalType = keyof CommonModalTypes;\n","import * as React from \"react\";\nimport { cx, makeStyles, useIsPySpace } from \"../../theme/styles\";\nimport { ignoreSsrWarning } from \"../../theme/utils\";\nimport { useLongPress } from \"../../util/useLongPress\";\nimport { Button, ButtonProps, ButtonVariant } from \"./Button\";\n\nconst useStyles = makeStyles()((theme) => {\n    const groupTheme = (theme.buttonGroup ?? {}) as any;\n    return {\n        root: {\n            display: groupTheme.display ?? \"block\",\n            \"& > * > *\": {\n                borderRadius: \"0 !important\",\n            },\n            [`& > *:first-child${ignoreSsrWarning} > *`]: {\n                borderLeft: groupTheme.firstBorder,\n                borderRadius: groupTheme.firstBorderRadius ?? \"5px 0 0 5px !important\",\n            },\n            \"& > *:last-child > *\": {\n                borderRadius: groupTheme.lastBorderRadius ?? \"0 5px 5px 0 !important\",\n            },\n            \"& > *:not(:first-child)\": {\n                marginLeft: groupTheme.marginLeft ?? \"0\",\n            },\n            \"& > *:not(:first-child) > *\": {\n                borderLeft: \"0 !important\",\n            },\n        },\n    };\n});\n\ninterface ButtonGroupOption {\n    value: any;\n    title: React.ReactNode;\n    disabled?: boolean;\n}\ntype ButtonGroupOptions = ButtonGroupOption[] | readonly ButtonGroupOption[];\n\ninterface ButtonGroupProps<T extends ButtonGroupOptions> extends Omit<ButtonProps, \"onClick\"> {\n    options: T;\n    selectedVariant?: ButtonVariant;\n    selectedOption: T[number][\"value\"] | readonly T[number][\"value\"][];\n    onClick?: (value: T[number][\"value\"]) => void;\n    onDoubleClick?: (value: T[number][\"value\"]) => void;\n    allowReselect?: boolean;\n}\n\ninterface ButtonGroupItemProps<T extends ButtonGroupOptions> {\n    option: T[number];\n    isSelected: boolean;\n    selectedVariant?: ButtonVariant;\n    variant?: ButtonVariant;\n    isPySpace: boolean;\n    elevated: boolean;\n    disabled?: boolean;\n    onClick?: () => void;\n    onDoubleClick?: () => void;\n    buttonProps: Omit<ButtonProps, \"onClick\" | \"onDoubleClick\" | \"onTouchStart\" | \"onTouchEnd\" | \"onTouchMove\">;\n}\n\nconst ButtonGroupItem = <T extends ButtonGroupOptions>({\n    option,\n    isSelected,\n    selectedVariant,\n    variant,\n    isPySpace,\n    elevated,\n    disabled,\n    onClick,\n    onDoubleClick,\n    buttonProps,\n}: ButtonGroupItemProps<T>) => {\n    let longPressHandlers = useLongPress(() => onDoubleClick?.(), { threshold: 400 });\n    if (!onDoubleClick || option.disabled) {\n        longPressHandlers = {} as any;\n    }\n\n    return (\n        <Button\n            variant={isSelected ? selectedVariant : isPySpace ? \"highlight3\" : variant}\n            onClick={onClick}\n            onDoubleClick={onDoubleClick}\n            style={{ flex: \"1 1 100%\", height: isPySpace ? \"4rem\" : \"\" }}\n            linkClassName={cx(\n                isPySpace && \"text-[1.6rem] leading-8 font-semibold\",\n                isPySpace && \"hover:translate-x-0!\",\n                isPySpace &&\n                    (elevated\n                        ? \"hover:shadow-pselevated2_v! active:shadow-pselevated1!\"\n                        : \"hover:shadow-pselevated1_v! active:shadow-none!\")\n            )}\n            elevated={elevated}\n            disabled={option.disabled || disabled}\n            {...buttonProps}\n            {...longPressHandlers}>\n            {option.title}\n        </Button>\n    );\n};\n\nexport const ButtonGroup = <T extends ButtonGroupOptions>({\n    options,\n    selectedVariant,\n    selectedOption,\n    onClick,\n    onDoubleClick,\n    allowReselect = false,\n    className,\n    style,\n    variant,\n    elevated = true,\n    ...props\n}: ButtonGroupProps<T>) => {\n    const isPySpace = useIsPySpace();\n\n    const { classes } = useStyles();\n    const { disabled, ...buttonProps } = props;\n\n    return (\n        <div style={style} className={cx(classes.root, className)}>\n            {options.map((option) => {\n                const selectedValues = Array.isArray(selectedOption)\n                    ? (selectedOption as readonly T[number][\"value\"][])\n                    : undefined;\n                const isSelected = selectedValues\n                    ? selectedValues.includes(option.value)\n                    : selectedOption === option.value;\n\n                return (\n                    <ButtonGroupItem\n                        key={option.value}\n                        option={option}\n                        isSelected={isSelected}\n                        selectedVariant={selectedVariant}\n                        variant={(variant as ButtonVariant | undefined) ?? undefined}\n                        isPySpace={isPySpace}\n                        elevated={elevated}\n                        disabled={disabled}\n                        onClick={() => {\n                            if (!allowReselect && isSelected && !selectedValues) return;\n                            onClick?.(option.value);\n                        }}\n                        onDoubleClick={() => !option.disabled && onDoubleClick?.(option.value)}\n                        buttonProps={buttonProps}\n                    />\n                );\n            })}\n        </div>\n    );\n};\n","import React, { Suspense } from \"react\";\nimport { faSync } from \"@fortawesome/free-solid-svg-icons/faSync\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { LinkInternal } from \"./LinkInternal\";\n\ninterface ErrorBoundaryProps {\n    children?: React.ReactNode;\n    deps?: unknown[];\n}\n\ninterface ErrorBoundaryState {\n    error: Error | null;\n}\n\nconst initialState: ErrorBoundaryState = { error: null };\n\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n    constructor(props: ErrorBoundaryProps) {\n        super(props);\n        this.state = initialState;\n    }\n\n    static getDerivedStateFromError(error: Error) {\n        // ignore aborted errors\n        console.error(error);\n        if (error?.message === \"Aborted\") return initialState;\n        return { error };\n    }\n\n    reset() {\n        this.setState(initialState);\n    }\n\n    componentDidUpdate(prevProps: ErrorBoundaryProps) {\n        let lastDeps = prevProps.deps || [];\n        let newDeps = this.props.deps || [];\n\n        if (lastDeps.length !== newDeps.length) {\n            this.reset();\n        } else {\n            for (let i = 0; i < newDeps.length; i++) {\n                if (newDeps[i] !== lastDeps[i]) {\n                    this.reset();\n                    return;\n                }\n            }\n        }\n    }\n    render() {\n        /** @todo show some more information about the error */\n        if (this.state.error) {\n            return (\n                <div\n                    style={{\n                        display: \"flex\",\n                        justifyContent: \"space-around\",\n                        alignItems: \"center\",\n                        textAlign: \"center\",\n                        height: \"100%\",\n                        background: \"#ccc\",\n                        color: \"#555\",\n                        fontSize: \"1.4rem\",\n                    }}>\n                    <div style={{ padding: 15 }}>\n                        <div style={{ marginBottom: 10 }}>\n                            Something went wrong rendering this part of the Anvil Editor.\n                        </div>\n                        <div>\n                            <LinkInternal\n                                style={{ color: \"#555\", border: \"1px solid #555\", padding: \"5px 10px\" }}\n                                onClick={() => {\n                                    this.reset();\n                                }}>\n                                <FontAwesomeIcon icon={faSync} /> Retry\n                            </LinkInternal>\n                        </div>\n                    </div>\n                </div>\n            );\n        }\n\n        return this.props.children;\n    }\n}\n\n// eslint-disable-next-line react/display-name\nexport const withErrorBoundary =\n    <P extends object>(Component: React.ComponentType<P>) =>\n    (props: P) => (\n        <ErrorBoundary>\n            <Component {...props} />\n        </ErrorBoundary>\n    );\n\ninterface ErrorSuspenseBoundaryProps {\n    fallback?: React.ReactNode;\n    children?: React.ReactNode;\n}\n\nexport const ErrorSuspenseBoundary = ({ fallback, children }: ErrorSuspenseBoundaryProps) => (\n    <ErrorBoundary>\n        <Suspense fallback={fallback}>{children}</Suspense>\n    </ErrorBoundary>\n);\n","import React, { useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faPlay, faStop, faTriangleExclamation } from \"@fortawesome/pro-light-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Button, ButtonProps } from \"@/components/reusable/Button\";\nimport { useTooltip } from \"@/components/reusable/Tooltip\";\nimport { getZenMode, runApp, stopApp, toggleZenMod } from \"@/controllers/ide\";\nimport { getRunMode, getRunnerOutput, getRunnerViewMaximised } from \"@/controllers/runner\";\nimport type { AnvilDispatch } from \"@/types\";\nimport useEvent from \"@/util/useEventCallback\";\n\nexport const RunAppButton = ({ ...props }: ButtonProps) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const zenMode = useSelector(getZenMode);\n    const runMode = useSelector(getRunMode);\n    const isRunning = runMode !== null;\n    const isMaximized = useSelector(getRunnerViewMaximised);\n\n    const onClick = useEvent(() => {\n        if (isRunning) {\n            dispatch(stopApp());\n        } else {\n            dispatch(runApp());\n        }\n    });\n    const [tooltipAnchor, tooltipRef] = useTooltip(\n        isRunning ? \"Stop App\" : \"Run App\",\n        isRunning && isMaximized ? \"bottom\" : \"bottom-left\",\n        { delay: true }\n    );\n\n    if (!zenMode) return null;\n    return (\n        <Button\n            key=\"run-btn\"\n            onClick={onClick}\n            variant={isRunning ? \"tertiary\" : \"highlight1\"}\n            ref={tooltipRef}\n            {...props}>\n            <FontAwesomeIcon fixedWidth icon={isRunning ? faStop : faPlay} />\n            {tooltipAnchor}\n        </Button>\n    );\n};\n\nexport const NumErrorWarningBtn = (props: ButtonProps) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const zenMode = useSelector(getZenMode);\n    const runMode = useSelector(getRunMode);\n    const isRunning = runMode !== null;\n    const runnerOutput = useSelector(getRunnerOutput);\n    const numErrors = useMemo(() => {\n        if (!zenMode) return null;\n        if (!isRunning) return null;\n        return runnerOutput.filter((r) => r.fn === \"pythonError\").length;\n    }, [runnerOutput, zenMode, isRunning]);\n\n    const numErrorsWarningMsg = numErrors ? `${numErrors} Error${numErrors > 1 ? \"s\" : \"\"}` : \"\";\n\n    const [errorsAnchor, errorsRef] = useTooltip(numErrorsWarningMsg, \"top-left\");\n\n    const onToggleZenMode = useEvent(() => {\n        dispatch(toggleZenMod());\n    });\n\n    if (!zenMode) return null;\n\n    return (\n        numErrorsWarningMsg && (\n            <div className=\"absolute right-4 bottom-4\">\n                <Button\n                    key=\"error-warning\"\n                    linkClassName=\"px-4!\"\n                    variant=\"danger\"\n                    ref={errorsRef}\n                    onClick={onToggleZenMode}\n                    {...props}>\n                    <span className=\"fa-layers fa-fw\">\n                        <FontAwesomeIcon fixedWidth icon={faTriangleExclamation} />\n                        <span\n                            className=\"fa-layers-counter\"\n                            style={\n                                {\n                                    \"--fa-counter-scale\": \"0.5\",\n                                    \"--fa-counter-background-color\": \"transparent\",\n                                    \"--fa-right\": \"-0.5rem\",\n                                    \"--fa-top\": \"-0.5rem\",\n                                    border: \"1px solid white\",\n                                } as any\n                            }>\n                            {numErrors}\n                        </span>\n                    </span>\n                    {errorsAnchor}\n                </Button>\n            </div>\n        )\n    );\n};\n","import { set } from \"lodash-es\";\nimport { AnvilAction, AnvilAsyncAction, AppConfig, SecretObject, SecretValue } from \"@/types\";\nimport * as api from \"@/api\";\nimport { getAppId, markAppPathUnsaved, updateGlobalLoadingIndicator } from \"./app\";\nimport { reloadAppConfig } from \"./app/autocompleter\";\n\nexport const saveSecrets =\n    (secrets: AppConfig[\"secrets\"]): AnvilAction<void> =>\n    (dispatch, getState, updateState) => {\n        updateState(({ app }) => {\n            if (!app) return;\n            app.config.secrets = secrets;\n        });\n\n        dispatch(reloadAppConfig());\n\n        dispatch(markAppPathUnsaved([\"SETTINGS\", \"secrets\"]));\n    };\n\nexport const deleteSecret =\n    (secretName: string): AnvilAction<void> =>\n    (dispatch, getState, updateState) => {\n        updateState(`Remove ${secretName} from secrets service`, ({ app }) => {\n            if (!app) return;\n            if (!app.config.secrets) return;\n            delete app.config.secrets[secretName];\n        });\n        dispatch(reloadAppConfig());\n        dispatch(markAppPathUnsaved([\"SETTINGS\", \"secrets\"]));\n    };\n\ntype ValueOf<T> = T[keyof T];\n\ntype DecryptReturn = { error?: string; value: string };\nexport const decryptSecret =\n    (encryptedSecret: ValueOf<SecretValue>): AnvilAsyncAction<DecryptReturn> =>\n    async (dispatch, getState, updateState) => {\n        try {\n            dispatch(updateGlobalLoadingIndicator(\"Extracting Secret\"));\n            const appId = getAppId(getState());\n            if (typeof encryptedSecret !== \"string\") {\n                return { error: \"Secret value is not extractable\", value: \"\" };\n            }\n            return await api.extractAppSecret(appId, encryptedSecret);\n        } catch (e: any) {\n            return { error: e.toString() || \"Unknown error\", value: \"\" };\n        } finally {\n            dispatch(updateGlobalLoadingIndicator(false));\n        }\n    };\n\ntype EncryptReturn = { error?: string; encrypted: string; plain_text: string };\n\nexport const encryptSecret =\n    (\n        newValue: string | undefined,\n        extractable: string | boolean,\n        canEncrypt?: boolean,\n        restrict?: null | unknown\n    ): AnvilAsyncAction<EncryptReturn> =>\n    async (dispatch, getState, updateState) => {\n        try {\n            dispatch(updateGlobalLoadingIndicator(\"Encrypting and Saving Secret\"));\n            const appId = getAppId(getState());\n            return await api.encryptAppSecret(appId, extractable, canEncrypt ?? false, restrict, newValue);\n        } catch (e) {\n            return { error: String(e) || \"Unknown error\", encrypted: \"\", plain_text: \"\" };\n        } finally {\n            dispatch(updateGlobalLoadingIndicator(false));\n        }\n    };\n\nexport const saveSecretValue =\n    (name: string, secretObj: SecretObject): AnvilAction<void> =>\n    (dispatch, getState, updateState) => {\n        updateState(`Set secret value`, set, [\"app\", \"config\", \"secrets\", name], secretObj);\n        dispatch(reloadAppConfig());\n        dispatch(markAppPathUnsaved([\"SETTINGS\", \"secrets\"]));\n    };\n","import React, { useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faUserFriends } from \"@fortawesome/pro-light-svg-icons/faUserFriends\";\nimport {\n    faEye,\n    faPencil,\n    faPlus,\n    faSync,\n    faTrash,\n    faTrashCan,\n    faTriangleExclamation,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { useTooltip } from \"@/components/reusable/Tooltip\";\nimport { getAppConfig, getAppId } from \"@/controllers/app\";\nimport { getCategorisedEnvironments } from \"@/controllers/environments\";\nimport { alert, confirm, modal, modalReturn, prompt } from \"@/controllers/modals\";\nimport {\n    clearEnvironmentSecretValue,\n    getScopedSecretValue,\n    hasEnvironmentSecretValue,\n    setScopedSecretValue,\n} from \"@/controllers/secret-values\";\nimport { decryptSecret, deleteSecret, encryptSecret, saveSecretValue } from \"@/controllers/secrets\";\nimport { useUpdateTabTitle } from \"@/controllers/tabs\";\nimport { cx, makeStyles, useIsPySpace } from \"@/theme/styles\";\nimport {\n    AnvilDispatch, AppEnvironment, AppId, EnvironmentPid, SecretObject,\n    SecretRestriction, SecretType, SecretValue, Tab\n} from \"@/types\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { IconButton } from \"@pyspace/common/components/Button\";\nimport { ModalComponent } from \"../modals\";\nimport Modal from \"../modals/Modal\";\nimport { Button } from \"../reusable/Button\";\nimport { DropDownMenuItems, MenuItems } from \"../reusable/DropdownMenu\";\nimport { HelpLink } from \"../reusable/HelpLink\";\nimport { Heading, Text } from \"../reusable/Text\";\nimport TabToolbar from \"./TabToolbar\";\n\nconst useStyles = makeStyles<void>()((theme, _props, classes) => ({\n    container: {\n        background: theme.settings.rightBarBackground.toString(),\n        display: \"flex\",\n        flexDirection: \"column\",\n        overflowY: \"scroll\",\n        height: \"calc(100% - 5rem)\",\n    },\n    pagePanel: {\n        padding: \"1rem 4rem\",\n        // width: '85%',\n        borderRight: \"1px solid \" + theme.settings.separator.toString(),\n        background: theme.settings.background.toString(),\n        flexGrow: 1,\n        flexShrink: 0,\n    },\n}));\n\ninterface DeleteSecretSpec {\n    name: string;\n    secretType: string;\n}\n\nexport const DeleteSecretModal: ModalComponent<DeleteSecretSpec> = ({ modalId, spec: { name, secretType } }) => {\n    return (\n        <Modal\n            modalId={modalId}\n            allowDismiss={true}\n            title={`Delete ${name}`}\n            buttons={[\n                { text: \"Delete\", clickActionCreator: () => modalReturn(true), variant: \"danger\" },\n                { text: \"Cancel\", clickActionCreator: () => modalReturn(false) },\n            ]}>\n            <Text>\n                Are you sure you want to remove this {secretType === \"key\" ? \"secret key\" : \"app secret\"}? You will no\n                longer be able to access any data encrypted with it.\n            </Text>\n        </Modal>\n    );\n};\n\ninterface ViewSecretSpec {\n    name: string;\n    secret: string;\n}\n\nexport const ViewSecretModal: ModalComponent<ViewSecretSpec> = ({ modalId, spec: { name, secret } }) => {\n    const isPySpace = useIsPySpace();\n    return (\n        <Modal\n            modalId={modalId}\n            allowDismiss={true}\n            title={`View ${name}`}\n            buttons={[{ text: \"OK\", clickActionCreator: () => modalReturn(true) }]}>\n            <Text>\n                The value of <strong>{name}</strong> is{\" \"}\n                {isPySpace ? (\n                    <span\n                        className={\n                            \"rounded-[0.4rem] border border-light-grey2 bg-light-bg3 px-[0.8rem] py-[0.2rem] font-mono text-[1.2rem] select-all\"\n                        }>\n                        {secret}\n                    </span>\n                ) : (\n                    <code className={\"select-all\"}>{secret}</code>\n                )}\n            </Text>\n            {/*todo: some useful message like \"keep this safe, your app can be acceessed or whatever from this something\"*/}\n            {/*<Text>Keep this safe - some message about access and whatnot.</Text>*/}\n        </Modal>\n    );\n};\n\ninterface ConfiguredSecretSpec {\n    name: string;\n    secret: string;\n}\n\nexport const SecretConfiguredModal: ModalComponent<ConfiguredSecretSpec> = ({ modalId, spec: { name, secret } }) => {\n    const isPySpace = useIsPySpace();\n    return (\n        <Modal\n            modalId={modalId}\n            allowDismiss={true}\n            title={\"Secret configured\"}\n            buttons={[{ text: \"OK\", clickActionCreator: () => modalReturn(true) }]}>\n            <Text>\n                The value of <strong>{name}</strong> is{\" \"}\n                {isPySpace ? (\n                    <span\n                        className={\n                            \"rounded-[0.4rem] border border-light-grey2 bg-light-bg3 px-[0.8rem] py-[0.2rem] font-mono text-[1.2rem] select-all\"\n                        }>\n                        {secret}\n                    </span>\n                ) : (\n                    <code className={\"select-all\"}>{secret}</code>\n                )}\n            </Text>\n        </Modal>\n    );\n};\n\ninterface SecretItemNameBoxProps {\n    name: string;\n    isBlank?: boolean;\n    hasOtherAppValues?: boolean;\n}\n\nconst SecretItemNameBox = (props: SecretItemProps) => {\n    const {\n        name,\n        encryptedSecretObj,\n        hasOtherAppValues: otherAppValues,\n        isBlank: blank,\n    } = props;\n    const hasOtherAppValues = otherAppValues(encryptedSecretObj);\n    const isBlank = blank(encryptedSecretObj);\n\n    const [tt, anchorRef] = useTooltip(\"Other clones of this app have their own values for this secret\", \"top\");\n\n    return (\n        <div title={name} className={cx(\"flex h-20 w-full min-w-0 items-center justify-start gap-4\")}>\n            <div className={cx(\"max-w-full min-w-0 shrink @min-[60rem]/secrets:grow\")}>\n                <div\n                    className={cx(\n                        \"w-max max-w-full truncate rounded bg-grey-0 px-4 font-mono text-light-fg1\",\n                        \"dark:text-dark-fg2\"\n                    )}>\n                    {name}\n                </div>\n            </div>\n            {hasOtherAppValues && (\n                <span ref={anchorRef}>\n                    {tt}\n                    <FontAwesomeIcon className={\"text-gray-400\"} icon={faUserFriends} />\n                </span>\n            )}\n            {isBlank && <div className={cx(\"h-min text-nowrap\", \"beta-label\")}>Not Set</div>}\n        </div>\n    );\n};\n\nconst SecretButtons = (props: SecretItemProps) => {\n    const { name, onDeleteSecretItem, encryptedSecretObj, onViewSecret } = props;\n\n    return (\n        <div className=\"flex w-full justify-end gap-4 @min-[60rem]/secrets:w-max @min-[60rem]/secrets:items-center @min-[60rem]/secrets:pl-4\">\n            <SetSecretValueButton {...props} />\n\n            <Button shrinkable small icon={faEye} onClick={() => onViewSecret(name, encryptedSecretObj)}>\n                View value\n            </Button>\n\n            <Button\n                small\n                shrinkable\n                variant={\"danger\"}\n                icon={faTrash}\n                onClick={() => onDeleteSecretItem(name, \"secret\")}>\n                Delete\n            </Button>\n        </div>\n    );\n};\n\nconst environmentLabel = (environment: AppEnvironment) =>\n    environment.description || environment.name || environment.origin || `Environment ${environment.env_id}`;\n\nconst EnvironmentOverrideRows = (props: SecretItemProps & { type: SecretType }) => {\n    const {\n        environments,\n        encryptedSecretObj,\n        name,\n        onClearEnvironmentOverride,\n        onGenSecret,\n        onSetSecretValue,\n        type,\n    } = props;\n\n    return environments\n        .filter(\n            (environment): environment is AppEnvironment & { env_pid: EnvironmentPid } =>\n                !!environment.env_pid && hasEnvironmentSecretValue(encryptedSecretObj, props.appId, environment.env_pid)\n        )\n        .map((environment) => (\n            <div\n                key={environment.env_pid}\n                className=\"flex flex-col gap-3 border-t border-sectionborder px-4 py-3 pl-8 @min-[60rem]/secrets:flex-row @min-[60rem]/secrets:items-center dark:border-dark-sectionborder\">\n                <div className=\"flex min-w-0 grow items-center gap-3\">\n                    <div className={cx(\"h-min text-nowrap\", \"beta-label\")}>Override</div>\n                    <Text className=\"p-unset truncate\" level={1}>\n                        {environmentLabel(environment)}\n                    </Text>\n                </div>\n                <div className=\"flex flex-wrap justify-end gap-3\">\n                    {type === \"secret\" ? (\n                        <Button\n                            shrinkable\n                            small\n                            icon={faPencil}\n                            onClick={() => onSetSecretValue(name, encryptedSecretObj, type, environment)}>\n                            Change value\n                        </Button>\n                    ) : (\n                        <Button\n                            shrinkable\n                            small\n                            icon={faSync}\n                            onClick={() =>\n                                onGenSecret({ name, encryptedSecretObj, type }, \"ide\", true, environment)\n                            }>\n                            Reset key\n                        </Button>\n                    )}\n                    <Button\n                        shrinkable\n                        small\n                        icon={faTrash}\n                        onClick={() => onClearEnvironmentOverride(name, encryptedSecretObj, type, environment)}>\n                        Clear override\n                    </Button>\n                </div>\n            </div>\n        ));\n};\n\nconst SecretKeysButtons = (props: SecretItemProps) => {\n    const { environments, name, onDeleteSecretItem, encryptedSecretObj, onGenSecret, onViewSecret } = props;\n    const resetKeyMenuItems: DropDownMenuItems = () => {\n        const items: MenuItems = [];\n        const environmentItems = environments\n            .filter(\n                (environment): environment is AppEnvironment & { env_pid: EnvironmentPid } =>\n                    !!environment.env_pid &&\n                    !hasEnvironmentSecretValue(encryptedSecretObj, props.appId, environment.env_pid)\n            )\n            .map(\n                (environment) =>\n                    [\n                        `Override in environment “${environmentLabel(environment)}”`,\n                        () => onGenSecret({ name, encryptedSecretObj, type: \"key\" }, \"ide\", true, environment),\n                        faPlus,\n                    ] as const\n            );\n        if (environmentItems.length > 0) items.push(...environmentItems);\n        return items;\n    };\n\n    return (\n        <div className=\"flex w-full justify-end gap-4 @min-[60rem]/secrets:w-max @min-[60rem]/secrets:items-center @min-[60rem]/secrets:pl-4\">\n            <Button\n                shrinkable\n                small\n                icon={faSync}\n                menuItems={environments.length > 0 ? resetKeyMenuItems : undefined}\n                variant=\"highlight3\"\n                onClick={() => onGenSecret({ name, encryptedSecretObj, type: \"key\" }, \"ide\", true)}>\n                Reset key\n            </Button>\n\n            <Button shrinkable small icon={faEye} onClick={() => onViewSecret(name, encryptedSecretObj)}>\n                View value\n            </Button>\n\n            <Button small shrinkable variant={\"danger\"} icon={faTrash} onClick={() => onDeleteSecretItem(name, \"key\")}>\n                Delete\n            </Button>\n        </div>\n    );\n};\n\nconst PySpaceSecretItemNameBox = (props: SecretItemNameBoxProps) => {\n    const { name, isBlank, hasOtherAppValues } = props;\n\n    const [tt, anchorRef] = useTooltip(\"Other clones of this app have their own values for this secret\", \"top\");\n\n    return (\n        <div className={\"flex w-full\"}>\n            <div className={\"shrink-0 grow font-mono text-[1.4rem] @[50rem]:text-[1.6rem]\"}>{name}</div>\n            {hasOtherAppValues && (\n                <span ref={anchorRef}>\n                    {tt}\n                    <FontAwesomeIcon className={\"text-light-bg5\"} icon={faUserFriends} />\n                </span>\n            )}\n            {isBlank && <FontAwesomeIcon className={\"mt-[0.3rem] text-light-bg5\"} icon={faTriangleExclamation} />}\n        </div>\n    );\n};\n\ninterface SecretItemProps {\n    name: string;\n    encryptedSecretObj: SecretValue;\n    isBlank: (secretObj: SecretValue) => boolean;\n    hasOtherAppValues: (secretObj: SecretValue) => boolean;\n    appSecrets: Record<string, SecretObject>[];\n    appKeys: Record<string, SecretObject>[];\n    classes: Record<string, string>;\n    appId: AppId;\n    environments: AppEnvironment[];\n    onSetSecretValue: (\n        name: string,\n        encryptedSecretObj: SecretValue,\n        type: SecretType,\n        environment?: AppEnvironment & { env_pid: EnvironmentPid }\n    ) => Promise<void>;\n    onDeleteSecretItem: (name: string, secretType: string) => Promise<void>;\n    onClearEnvironmentOverride: (\n        name: string,\n        encryptedSecretObj: SecretValue,\n        type: SecretType,\n        environment: AppEnvironment & { env_pid: EnvironmentPid }\n    ) => Promise<void>;\n    onViewSecret: (name: string, encryptedObj: SecretValue) => Promise<void>;\n    onGenSecret: (\n        {\n            name,\n            encryptedSecretObj,\n            type,\n        }: {\n            name: string;\n            encryptedSecretObj: SecretValue;\n            type: SecretType;\n        },\n        extractable: string | boolean,\n        canEncrypt?: boolean,\n        environment?: AppEnvironment & { env_pid: EnvironmentPid }\n    ) => Promise<void>;\n}\n\nconst SetSecretValueButton = (props: SecretItemProps) => {\n    const { environments, name, encryptedSecretObj, onSetSecretValue, onGenSecret } = props;\n    const setSecretMenuItems: DropDownMenuItems = () => {\n        const items: MenuItems = [\n            [\"Set value\", () => onSetSecretValue(name, encryptedSecretObj, \"secret\"), faPencil],\n            [\"Generate value\", () => onGenSecret({ name, encryptedSecretObj, type: \"secret\" }, true, false), faSync],\n        ];\n\n        const environmentItems = environments\n            .filter(\n                (environment): environment is AppEnvironment & { env_pid: EnvironmentPid } =>\n                    !!environment.env_pid &&\n                    !hasEnvironmentSecretValue(encryptedSecretObj, props.appId, environment.env_pid)\n            )\n            .map(\n                (environment) =>\n                    [\n                        `Override in environment “${environmentLabel(environment)}”`,\n                        () => onSetSecretValue(name, encryptedSecretObj, \"secret\", environment),\n                        faPlus,\n                    ] as const\n            );\n        if (environmentItems.length > 0) items.push(<hr key=\"environment-overrides\" />, ...environmentItems);\n\n        return items;\n    };\n    return (\n        <Button\n            shrinkable\n            size={\"small\"}\n            menuItems={setSecretMenuItems}\n            variant={\"highlight3\"}\n            icon={faPencil}\n            onClick={() => onSetSecretValue(name, encryptedSecretObj, \"secret\")}>\n            Set value\n        </Button>\n    );\n};\n\nconst SecretItem = (props: SecretItemProps) => {\n    return (\n        <div className=\"border-b border-sectionborder last:border-b-0 even:bg-light-bg2 dark:border-dark-sectionborder dark:bg-dark-bg2\">\n            <div className=\"flex p-4 pt-0 @max-[60rem]/secrets:flex-col @min-[60rem]/secrets:pb-0\">\n                <SecretItemNameBox {...props} />\n                <SecretButtons {...props} />\n            </div>\n            <EnvironmentOverrideRows {...props} type=\"secret\" />\n        </div>\n    );\n};\n\nconst PySpaceSecretItem = (props: SecretItemProps) => {\n    const {\n        name,\n        isBlank,\n        hasOtherAppValues,\n        encryptedSecretObj,\n        onSetSecretValue,\n        onDeleteSecretItem,\n    } = props;\n\n    return (\n        <div className={\"flex w-full items-center gap-4 border-b border-light-grey1 pb-[1.8rem]\"}>\n            <div className={\"flex flex-1 items-center\"}>\n                <PySpaceSecretItemNameBox\n                    name={name}\n                    isBlank={isBlank(encryptedSecretObj)}\n                    hasOtherAppValues={hasOtherAppValues(encryptedSecretObj)}\n                />\n            </div>\n            <IconButton\n                elevated\n                size={\"medium\"}\n                icon={faPencil}\n                onClick={() => onSetSecretValue(name, encryptedSecretObj, \"secret\")}\n            />\n            <IconButton elevated size={\"medium\"} icon={faTrashCan} onClick={() => onDeleteSecretItem(name, \"secret\")} />\n        </div>\n    );\n};\n\nconst KeyItem = (props: SecretItemProps) => {\n    return (\n        <div className=\"border-b border-sectionborder last:border-b-0 even:bg-light-bg2 dark:border-dark-sectionborder dark:bg-dark-bg2\">\n            <div className=\"flex p-4 pt-0 @max-[60rem]/secrets:flex-col @min-[60rem]/secrets:pb-0\">\n                <SecretItemNameBox {...props} />\n                <SecretKeysButtons {...props} />\n            </div>\n            <EnvironmentOverrideRows {...props} type=\"key\" />\n        </div>\n    );\n};\n\nconst SecretsTab = ({ tab, selected, isPySpace }: { tab: Tab; selected: boolean; isPySpace?: boolean }) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const appConfig = useSelector(getAppConfig);\n    const appId = useSelector(getAppId)!;\n    const environments = useSelector(getCategorisedEnvironments);\n    const { classes } = useStyles();\n\n    const isBlank = (secretObj: SecretValue) => !secretObj[\"\"] && !secretObj[appId];\n    const hasOtherAppValues = (secretObj: SecretValue) =>\n        (Object.keys(secretObj) as AppId[]).filter((k) => k !== \"\" && k !== appId).some((k) => secretObj[k]);\n    const getEnvironmentName = (environmentPid: EnvironmentPid | undefined) => {\n        if (!environmentPid) return null;\n        const environment = environments.real.find((candidate) => candidate.env_pid === environmentPid);\n        return environment ? environmentLabel(environment) : environmentPid;\n    };\n\n    useUpdateTabTitle(tab, \"Secrets\");\n\n    const appSecrets = useMemo(() => {\n        const secrets: Record<string, SecretObject>[] = [];\n        Object.keys(appConfig?.secrets || {}).forEach((secretName) => {\n            if (appConfig?.secrets?.[secretName]?.type === \"secret\") {\n                secrets.push({ [secretName]: appConfig?.secrets?.[secretName] });\n            }\n        });\n        secrets.sort((a, b) => Object.keys(a)[0].localeCompare(Object.keys(b)[0]));\n        return secrets;\n    }, [appConfig?.secrets]);\n\n    const appKeys = useMemo(() => {\n        const keys: Record<string, SecretObject>[] = [];\n        Object.keys(appConfig?.secrets || {}).forEach((secretName) => {\n            if (appConfig?.secrets?.[secretName]?.type === \"key\") {\n                keys.push({ [secretName]: appConfig?.secrets?.[secretName] });\n            }\n        });\n        keys.sort((a, b) => Object.keys(a)[0].localeCompare(Object.keys(b)[0]));\n        return keys;\n    }, [appConfig?.secrets]);\n\n    const onDeleteSecretItem = useEvent(async (name: string, secretType: string) => {\n        if (await dispatch(modal(\"deleteSecret\", { name, secretType }))) {\n            dispatch(deleteSecret(name));\n        }\n    });\n\n    const mkRestriction = (secretName: string, environment?: AppEnvironment) => {\n        const restriction: SecretRestriction = { type: \"app_python\", secret_name: secretName};\n        if (environment) {\n            restriction.env_id = environment.env_id;\n        }\n        return restriction;\n    };\n\n    const onSetSecretValue = useEvent(async (\n        name: string,\n        encryptedSecretObj: SecretValue,\n        type: SecretType,\n        environment?: AppEnvironment & { env_pid: EnvironmentPid }\n    ) => {\n        const environmentPid = environment?.env_pid;\n        const hasValue = environmentPid\n            ? hasEnvironmentSecretValue(encryptedSecretObj, appId, environmentPid)\n            : !!getScopedSecretValue(encryptedSecretObj, appId, \"\");\n        const environmentName = getEnvironmentName(environmentPid);\n        if (hasValue) {\n            if (\n                !(await dispatch(\n                    confirm(\n                        `Update value of ${name}${environmentName ? ` in ${environmentName}` : \"\"}?`,\n                        `The current ${environmentName ? \"environment override\" : \"app default\"} will be overwritten.`\n                    )\n                ))\n            ) {\n                return;\n            }\n        }\n        const newValue = await dispatch(\n            prompt(\n                \"Set Secret Value\",\n                `Enter a new value for secret '${name}'${environmentName ? ` in ${environmentName}` : \"\"}: `\n            )\n        );\n        if (newValue && newValue.trim() !== \"\") {\n            const encrypted = await dispatch(\n                encryptSecret(newValue, environmentPid ? \"runtime\" : true, false, mkRestriction(name, environment))\n            );\n            if (encrypted.error) {\n                dispatch(alert(\"Unable to set secret\", \"Please contact support@anvil.works\"));\n            } else {\n                const secretObj = {\n                    value: setScopedSecretValue(encryptedSecretObj ?? {}, appId, environmentPid, encrypted.encrypted),\n                    type,\n                };\n                dispatch(saveSecretValue(name, secretObj));\n                await dispatch(modal(\"configuredSecret\", { name, secret: encrypted.plain_text }));\n            }\n        }\n    });\n\n    const onViewSecret = useEvent(async (name: string, encryptedObj: SecretValue) => {\n        const encrypted = getScopedSecretValue(encryptedObj, appId, \"\");\n        if (!encrypted) {\n            await dispatch(alert(\"Blank Secret\", \"This secret is currently blank\"));\n        } else {\n            if (\n                await dispatch(\n                    confirm(\n                        \"View secret value?\",\n                        `Are you sure you wish to view the value of '${name}' ? This action will be recorded.`\n                    )\n                )\n            ) {\n                const decrypted = await dispatch(decryptSecret(encrypted));\n                if (decrypted.error) {\n                    dispatch(alert(\"Unable to view secret\", decrypted.error));\n                } else {\n                    await dispatch(modal(\"viewSecret\", { name, secret: decrypted.value }));\n                }\n            }\n        }\n    });\n\n    const onClearEnvironmentOverride = useEvent(\n        async (\n            name: string,\n            encryptedSecretObj: SecretValue,\n            type: SecretType,\n            environment: AppEnvironment & { env_pid: EnvironmentPid }\n        ) => {\n            if (\n                await dispatch(\n                    confirm(\n                        `Clear ${name} override?`,\n                        `${environmentLabel(environment)} will use the app default value instead.`\n                    )\n                )\n            ) {\n                dispatch(\n                    saveSecretValue(name, {\n                        type,\n                        value: clearEnvironmentSecretValue(encryptedSecretObj, appId, environment.env_pid),\n                    })\n                );\n            }\n        }\n    );\n\n    const onGenSecret = useEvent(\n        async (\n            { name, encryptedSecretObj, type }: { name: string; encryptedSecretObj: SecretValue; type: SecretType },\n            extractable: string | boolean,\n            canEncrypt?: boolean,\n            environment?: AppEnvironment & { env_pid: EnvironmentPid }\n        ) => {\n            const environmentPid = environment?.env_pid;\n            const hasValue = environmentPid\n                ? hasEnvironmentSecretValue(encryptedSecretObj, appId, environmentPid)\n                : !!getScopedSecretValue(encryptedSecretObj, appId, \"\");\n            const environmentName = getEnvironmentName(environmentPid || undefined);\n            if (hasValue) {\n                const title = `Generate new value for ${name}${environmentName ? ` in ${environmentName}` : \"\"}?`;\n                const msg = `The current ${environmentName ? \"environment override\" : \"app default\"} will be overwritten${\n                    canEncrypt ? \" and any data encrypted with the current value will be lost\" : \"\"\n                }.`;\n                if (!(await dispatch(confirm(title, msg)))) {\n                    return;\n                }\n            }\n            const encrypted = await dispatch(\n                encryptSecret(\n                    undefined,\n                    environmentPid ? (canEncrypt ? false : \"runtime\") : extractable,\n                    canEncrypt,\n                    mkRestriction(name, environment),\n                )\n            );\n            if (encrypted.error) {\n                throw new Error(encrypted.error);\n            }\n            const secretObj = {\n                value: setScopedSecretValue(encryptedSecretObj ?? {}, appId, environmentPid, encrypted.encrypted),\n                type,\n            };\n            dispatch(saveSecretValue(name, secretObj));\n            await dispatch(modal(\"configuredSecret\", { name, secret: encrypted.plain_text }));\n        }\n    );\n\n    const onNewSecret = useEvent(async (type: SecretType) => {\n        const newAppSecret: SecretObject = { type } as SecretObject;\n\n        const nameBase = \"new_\" + type;\n        let i = 2;\n        let newName = nameBase;\n        while (newName in (appConfig?.secrets || {})) {\n            newName = `${nameBase}_${i++} `;\n        }\n\n        const requestedName = await dispatch(\n            prompt(\n                `Create new ${type === \"key\" ? \"encryption key\" : \"secret\"}`,\n                `Enter a name for the new ${type === \"key\" ? \"encryption key\" : \"secret\"}:`,\n                newName,\n                \"Create\"\n            )\n        );\n        if (requestedName == null) return;\n        newName = requestedName.trim();\n        if (!newName) {\n            await dispatch(alert(\"Cannot Create Secret\", \"Secret and encryption key names cannot be blank.\"));\n            return;\n        }\n        if (newName in (appConfig?.secrets || {})) {\n            await dispatch(\n                alert(\n                    \"Cannot Create Secret\",\n                    `A secret or encryption key named ${newName} already exists. Please choose a different name.`\n                )\n            );\n            return;\n        }\n\n        if (type === \"key\") {\n            const encrypted = await dispatch(encryptSecret(undefined, \"ide\", true, mkRestriction(newName)));\n            newAppSecret.value = { [appId]: encrypted.encrypted };\n        } else {\n            newAppSecret.value = { [appId]: \"\" };\n        }\n        dispatch(saveSecretValue(newName, newAppSecret));\n    });\n\n    const itemProps = {\n        appId,\n        environments: environments.real,\n        isBlank,\n        hasOtherAppValues,\n        appSecrets,\n        appKeys,\n        classes,\n        onSetSecretValue,\n        onDeleteSecretItem,\n        onClearEnvironmentOverride,\n        onViewSecret,\n        onGenSecret,\n    };\n\n    const hasSecrets = appSecrets.map((s) => Object.keys(s)[0]).length > 0;\n    const hasKeys = appKeys.map((s) => Object.keys(s)[0]).length > 0;\n\n    return isPySpace ? (\n        <div className={\"@container\"}>\n            <div className={\"flex w-full justify-center\"}>\n                <Button\n                    className={\"my-20 @[50rem]:my-26\"}\n                    variant={\"primary\"}\n                    icon={faPlus}\n                    onClick={() => onNewSecret(\"secret\")}>\n                    Create new secret\n                </Button>\n            </div>\n            <div className={\"m-8 flex flex-col items-center gap-[1.8rem] px-8 @[50rem]:px-16\"}>\n                {/*<div className={\"grid grid-cols-[1fr_repeat(4,min-content)]\"}>*/}\n                {/*<div>*/}\n                {appSecrets?.map((itm, idx) => {\n                    const name = Object.keys(itm)[0];\n                    const encryptedSecretObj = itm[name].value;\n\n                    return (\n                        <PySpaceSecretItem\n                            key={`${name} -${idx} `}\n                            name={name}\n                            encryptedSecretObj={encryptedSecretObj}\n                            {...itemProps}\n                        />\n                    );\n                })}\n                {/*</div>*/}\n            </div>\n        </div>\n    ) : (\n        <div className={cx(\"flex h-full flex-col\")}>\n            <TabToolbar>\n                <Text className={\"p-unset\"} level={1}>\n                    Store secrets and encryption keys with your app.&nbsp;\n                    <HelpLink iconRight inline url={\"/docs/security/encrypting-secret-data\"}>\n                        Learn More\n                    </HelpLink>\n                </Text>\n            </TabToolbar>\n            <div className={classes.container}>\n                <div className={cx(classes.pagePanel)}>\n                    <Heading level={1}>App Secrets</Heading>\n                    <Text level={1}>\n                        The Secrets service lets you store secrets and encryption keys with your app without them being\n                        visible in the source code. They can only be accessed from code running in Server Modules.\n                    </Text>\n                    <div className=\"@container/secrets flex w-full flex-col\">\n                        <div className={\"m-8 flex w-full max-w-[82rem] flex-col items-center self-center\"}>\n                            {/*todo: unique 'key' for child elements in maps*/}\n                            <Heading level={3}>Secrets</Heading>\n                            <div\n                                className={cx(\"mb-4 flex w-full flex-col rounded border-sectionborder\", {\n                                    border: hasSecrets,\n                                })}>\n                                {appSecrets?.map((itm, idx) => {\n                                    const name = Object.keys(itm)[0];\n                                    const encryptedSecretObj = itm[name].value;\n                                    return (\n                                        <SecretItem\n                                            key={`${name} -${idx} `}\n                                            name={name}\n                                            encryptedSecretObj={encryptedSecretObj}\n                                            {...itemProps}\n                                        />\n                                    );\n                                })}\n                            </div>\n\n                            <Button variant={\"primary\"} icon={faPlus} onClick={() => onNewSecret(\"secret\")}>\n                                Create new secret\n                            </Button>\n                            <hr />\n                            <Heading level={3}>Encryption Keys</Heading>\n\n                            <div\n                                className={cx(\"mb-4 flex w-full flex-col rounded border-sectionborder\", {\n                                    border: hasKeys,\n                                })}>\n                                {appKeys?.map((itm, idx) => {\n                                    const name = Object.keys(itm)[0];\n                                    const encryptedSecretObj = itm[name].value;\n                                    return (\n                                        <KeyItem\n                                            key={`${name} -${idx} `}\n                                            name={name}\n                                            encryptedSecretObj={encryptedSecretObj}\n                                            {...itemProps}\n                                        />\n                                    );\n                                })}\n                            </div>\n                            <Button variant={\"primary\"} icon={faPlus} onClick={() => onNewSecret(\"key\")}>\n                                Create new key\n                            </Button>\n                        </div>\n                    </div>\n                    <div className={\"mb-8\"}>\n                        <Heading level={2}>Code Samples</Heading>\n                        <Heading level={3}>Access secrets from server modules</Heading>\n                        <pre className=\"select-all\">\n                            {`import anvil.secrets\n\nkey = anvil.secrets.get_secret(\"my_secret\")`}\n                        </pre>\n\n                        <Heading level={3}>Encrypt and decrypt data using an encryption key</Heading>\n                        <pre className=\"select-all\">\n                            {`plain_text = \"Some important data\"\nencrypted_data = anvil.secrets.encrypt_with_key(\"my_key\", plain_text)\n\ndecrypted_data = anvil.secrets.decrypt_with_key(\"my_key\", encrypted_data)`}\n                        </pre>\n                    </div>\n                    <HelpLink iconRight inline url={\"/docs/security/encrypting-secret-data\"}>\n                        Click here for more code samples\n                    </HelpLink>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nexport default SecretsTab;\n","import React from \"react\";\nimport { cx } from \"@/theme/styles\";\n\ninterface ToolBarProps extends React.PropsWithChildren<React.HTMLAttributes<HTMLDivElement>> {\n    leftSide?: null | React.ReactNode;\n    allowScroll?: boolean;\n    ref?: React.Ref<HTMLDivElement>;\n}\n\nconst TabToolbar = ({ ref, className, children, leftSide = null, allowScroll = false, ...restProps }: ToolBarProps) => {\n    return (\n        <div\n            ref={ref}\n            className={cx(\n                \"flex h-20 w-full flex-none items-center overflow-hidden border-b border-sectionborder bg-white px-5 py-0 dark:border-dark-sectionborder dark:bg-dark-bg1 dark:text-dark-fg1\",\n                allowScroll ? \"overflow-x-auto\" : \"overflow-x-hidden\",\n                className\n            )}\n            {...restProps}>\n            {children}\n            {leftSide && (\n                <>\n                    <div className=\"grow\" />\n                    {leftSide}\n                </>\n            )}\n        </div>\n    );\n};\n\nexport default TabToolbar;\n","import React, { Fragment } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport moment from \"moment\";\nimport { Text } from \"@/components/reusable/Text\";\nimport { getAppId } from \"@/controllers/app\";\nimport { getCategorisedEnvironments } from \"@/controllers/environments\";\nimport { cx } from \"@/theme/styles\";\nimport { ScheduledTask } from \"@/types\";\nimport { getScheduledTaskInfo } from \"@/api\";\nimport { timeAgoString } from \"@/util/time\";\n\nconst formatDateTime = (dt: string) => moment.tz(dt, moment.tz.guess()).format(\"ddd Do MMM YYYY[, at] HH:mm z\");\n\ninterface ScheduledTaskLastRunInfoProps {\n    task: ScheduledTask;\n    simpleOnly?: boolean;\n    className?: string;\n}\n\n/** simpleOnly: Only display info for a single environment, otherwise don't display anything */\nconst ScheduledTaskLastRunInfo = ({ task, simpleOnly, className }: ScheduledTaskLastRunInfoProps) => {\n    const appId = useSelector(getAppId);\n    const environments = useSelector(getCategorisedEnvironments);\n    const jobId = task.job_id;\n\n    const { data: scheduledTaskInfo } = useQuery({\n        queryKey: [\"task-info\", appId, jobId],\n        queryFn: () => getScheduledTaskInfo(appId, jobId),\n        refetchOnMount: \"always\",\n        enabled: !!appId,\n    });\n\n    if (scheduledTaskInfo?.some((info) => info.suspended_at)) {\n        const lastRun = scheduledTaskInfo.find((info) => info.start_time)?.start_time;\n        return (\n            <div className={cx(\"self-center text-xs!\", className)}>\n                <Text level={3} className=\"text-danger\">\n                    Suspended{lastRun ? ` — last ran ${timeAgoString(lastRun)}` : \"\"}\n                </Text>\n            </div>\n        );\n    }\n\n    let infoUi = null;\n    if (!scheduledTaskInfo?.length || (scheduledTaskInfo.length === 1 && !scheduledTaskInfo[0].start_time)) {\n        // No info or never run\n        infoUi = <Text level={3}>This task has never run</Text>;\n    } else if (scheduledTaskInfo.length === 1) {\n        // We know it has a start time, or we'd be in the clause above\n        infoUi = (\n            <Text level={3}>\n                Last ran {timeAgoString(scheduledTaskInfo[0].start_time)}. Next scheduled for{\" \"}\n                {formatDateTime(scheduledTaskInfo[0].next_run)}\n            </Text>\n        );\n    } else if (!simpleOnly) {\n        // We know we have multiple sets of info for different environments. Display them all.\n        infoUi = scheduledTaskInfo.map((info) => (\n            <Fragment key={info.env_id}>\n                <Text level={3}>\n                    Last ran {timeAgoString(info.start_time)} in '\n                    {environments?.all.find((e) => e.env_id === info.env_id)?.description}' environment.\n                </Text>\n                <Text level={3}>\n                    Next scheduled for {formatDateTime(scheduledTaskInfo[0].next_run)} in '\n                    {environments?.all.find((e) => e.env_id === info.env_id)?.description}' environment.\n                </Text>\n            </Fragment>\n        ));\n    }\n\n    return infoUi && <div className={cx(\"self-center text-xs!\", className)}>{infoUi}</div>;\n};\n\nexport default ScheduledTaskLastRunInfo;\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useSaveIndicator } from \"@/components/reusable/SaveIndicator\";\nimport { getApp, getAppId, getAppRuntimeOptions, promptIfRuntimeMissing, updateAppConfig } from \"@/controllers/app\";\nimport { confirmAndMigrateApp, hasLegacyEnvironments } from \"@/controllers/environments\";\nimport { getUser } from \"@/controllers/ide\";\nimport { modal } from \"@/controllers/modals\";\nimport { getCustomPackagesAvailable } from \"@/controllers/user\";\nimport { useIsPySpace } from \"@/theme/styles\";\nimport type { AnvilDispatch, RuntimeOptions, RuntimeServerSpec } from \"@/types\";\nimport type { AppState } from \"@/types/app\";\nimport type { PythonVersionOption, User } from \"@/types/user\";\nimport { useFeatureSupported } from \"@/util/features\";\nimport { useStateWithReset } from \"@/util/hooks\";\nimport useEvent from \"@/util/useEventCallback\";\nimport OtherRuntimeSettings from \"./python-version/OtherRuntimeSettings\";\nimport PackageRequirementsEditor from \"./python-version/PackageRequirementsEditor\";\nimport PythonVersionSettings from \"./python-version/PythonVersionSettings\";\nimport RuntimeBuildStatus from \"./python-version/RuntimeBuildStatus\";\nimport useStyles from \"./styles\";\n\nconst useCheckLegacyEnvironmentsForDynamicDownlinks = () => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const hasLegacy = useSelector(hasLegacyEnvironments);\n    return useEvent(async () => {\n        if (hasLegacy) {\n            return Boolean(await dispatch(confirmAndMigrateApp()));\n        }\n        return true;\n    });\n};\n\ntype LoadedConfigProps = {\n    appId: string;\n    app: AppState;\n    user: User;\n    runtimeOptions: RuntimeOptions;\n};\n\nconst PythonVersionConfigLoaded = ({ appId, app, user, runtimeOptions }: LoadedConfigProps) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const customPackagesAvailable = useSelector(getCustomPackagesAvailable);\n    const enableScripts = useFeatureSupported(\"downlink-scripts\");\n    const supportsPersistentServer = useFeatureSupported(\"persistent-server\");\n    const { classes } = useStyles();\n\n    const [clientVersion, setClientVersion] = useState<RuntimeOptions[\"client_version\"]>(runtimeOptions.client_version);\n    const [serverPersist, setServerPersist] = useState(runtimeOptions.server_persist);\n    const [serverSpec, setServerSpec] = useStateWithReset<RuntimeServerSpec | null | undefined>(\n        runtimeOptions.server_spec\n    );\n    const serverSpecSaveTimeout = useRef(500);\n\n    const [clientSaveIndicator, setClientSaved] = useSaveIndicator();\n    const [serverSaveIndicator, setServerSaved] = useSaveIndicator();\n    const [serverBaseSaveIndicator, setServerBaseSaved] = useSaveIndicator();\n    const [requirementsSaveIndicator, setRequirementsSaved] = useSaveIndicator();\n\n    const updateClientVersion = useEvent(async (event: React.ChangeEvent<HTMLSelectElement>) => {\n        const value = event.target.value;\n        setClientVersion(value as RuntimeOptions[\"client_version\"]);\n        setClientSaved(false);\n        await dispatch(updateAppConfig([\"runtime_options\", \"client_version\"], value));\n        setClientSaved(true);\n    });\n\n    const updateServerPersist = useEvent(async (event: React.ChangeEvent<HTMLInputElement>) => {\n        if (!event.target.checked || supportsPersistentServer) {\n            const value = event.target.checked;\n            setServerPersist(value);\n            setServerSaved(false);\n            await dispatch(updateAppConfig([\"runtime_options\", \"server_persist\"], value));\n            setServerSaved(true);\n        } else {\n            await dispatch(modal(\"upgradePrompt\", { featureId: \"persistent-server\" }));\n        }\n    });\n\n    const onSavedCallbacks = useRef<Array<() => void>>([]);\n\n    const updatePreInstallScript = useEvent((pre_install_script: string) => {\n        setServerSpec((current) => ({ ...(current ?? {}), pre_install_script }));\n        setRequirementsSaved(false);\n        onSavedCallbacks.current = [...onSavedCallbacks.current, () => setRequirementsSaved(true)];\n    });\n\n    const updatePostInstallScript = useEvent((post_install_script: string) => {\n        setServerSpec((current) => ({ ...(current ?? {}), post_install_script }));\n        setRequirementsSaved(false);\n        onSavedCallbacks.current = [...onSavedCallbacks.current, () => setRequirementsSaved(true)];\n    });\n\n    const updateRequirements = useEvent((requirements: string) => {\n        setServerSpec((current) => ({ ...(current ?? {}), requirements }));\n        setRequirementsSaved(false);\n        onSavedCallbacks.current = [...onSavedCallbacks.current, () => setRequirementsSaved(true)];\n    });\n\n    const updateServerBaseImage = useEvent((base: string) => {\n        setServerSpec((current) => ({ ...(current ?? {}), base }));\n        setServerBaseSaved(false);\n        onSavedCallbacks.current = [...onSavedCallbacks.current, () => setServerBaseSaved(true)];\n    });\n\n    const serverSpecTimeout = useRef<number | undefined>(undefined);\n    const serverSpecInitialised = useRef(false);\n    useEffect(() => {\n        if (serverSpecInitialised.current) {\n            if (serverSpecTimeout.current) {\n                clearTimeout(serverSpecTimeout.current);\n            }\n            serverSpecTimeout.current = setTimeout(async () => {\n                await dispatch(updateAppConfig([\"runtime_options\", \"server_spec\"], serverSpec));\n                console.log(\"SAVED\");\n                for (const callback of onSavedCallbacks.current) {\n                    callback();\n                }\n                onSavedCallbacks.current = [];\n            }, serverSpecSaveTimeout.current);\n        } else {\n            serverSpecInitialised.current = true;\n        }\n    }, [dispatch, serverSpec]);\n\n    const advancedOptionsInDefaultState =\n        clientVersion == \"3\" && !serverSpec?.pre_install_script && !serverSpec?.post_install_script;\n    const [showAdvanced, setShowAdvanced] = useState(!advancedOptionsInDefaultState);\n    const isPySpace = useIsPySpace();\n\n    const pythonVersions = useMemo<PythonVersionOption[]>(() => {\n        const versions: PythonVersionOption[] = [];\n        if (user.ideConfig.dynamicDownlinks || isPySpace) {\n            versions.push(\n                ...(user.ideConfig.dynamicDownlinks || [\n                    {\n                        id: \"310\",\n                        name: \"Python 3.10\",\n                        description: \"Python 3.10\",\n                        _dynamic: true,\n                    },\n                ])\n            );\n        }\n        versions.push(...(user.server_runtimes || []));\n        return versions;\n    }, [isPySpace, user]);\n\n    const [pythonVersion, setPythonVersion] = useState<PythonVersionOption>(\n        () =>\n            (app.config.runtime_options.server_spec?.base && pythonVersions.find((version) => version._dynamic)) ||\n            pythonVersions.find((version) => version.id === app.config.runtime_options.server_version) || {\n                id: \"invalid\",\n                name: \"<Invalid>\",\n                description: \"Selected Python version does not exist.\",\n            }\n    );\n\n    const checkLegacyEnvironmentsForDynamicDownlinks = useCheckLegacyEnvironmentsForDynamicDownlinks();\n\n    const choosePythonVersion = useEvent(async (id: string) => {\n        const version = pythonVersions.find((candidate) => candidate.id === id) || pythonVersions[0];\n        if (!version) {\n            return;\n        }\n\n        if (version._dynamic) {\n            if (!(await checkLegacyEnvironmentsForDynamicDownlinks())) return;\n\n            const selectVersion = () => {\n                setPythonVersion(version);\n                const newServerSpec = {\n                    requirements: \"\",\n                    ...(runtimeOptions.server_spec_disabled || {}),\n                    ...(serverSpec || {}),\n                };\n                if (\n                    !newServerSpec.base ||\n                    !user.downlink_base_images.some((image) => image.name === newServerSpec.base)\n                ) {\n                    newServerSpec.base = user.downlink_base_images[0]?.name;\n                }\n                setServerSpec(newServerSpec);\n            };\n\n            if (customPackagesAvailable) {\n                selectVersion();\n            } else {\n                await dispatch(modal(\"upgradePrompt\", { featureId: \"custom-packages\", onStartTrial: selectVersion }));\n            }\n        } else if (await dispatch(promptIfRuntimeMissing(version.id))) {\n            if (serverSpec) {\n                dispatch(updateAppConfig([\"runtime_options\", \"server_spec_disabled\"], serverSpec));\n                setServerSpec(null);\n            }\n            setPythonVersion(version);\n            setServerSaved(false);\n            await dispatch(updateAppConfig([\"runtime_options\", \"server_version\"], version.id));\n            setServerSaved(true);\n        }\n    });\n\n    return (\n        <div className={classes.settingsRoot}>\n            <div className={classes.appSettings}>\n                <PythonVersionSettings\n                    isPySpace={isPySpace}\n                    pythonVersion={pythonVersion}\n                    pythonVersions={pythonVersions}\n                    serverSpec={serverSpec}\n                    user={user}\n                    serverSaveIndicator={serverSaveIndicator}\n                    serverBaseSaveIndicator={serverBaseSaveIndicator}\n                    onChoosePythonVersion={(id) => void choosePythonVersion(id)}\n                    onChooseBaseImage={updateServerBaseImage}\n                />\n                <PackageRequirementsEditor\n                    enabled={!!pythonVersion._dynamic && user.ideConfig.customPackageInstallation}\n                    isPySpace={isPySpace}\n                    serverSpec={serverSpec}\n                    saveIndicator={requirementsSaveIndicator}\n                    onRequirementsChange={updateRequirements}\n                />\n                {pythonVersion._dynamic && serverSpec && (\n                    <RuntimeBuildStatus appId={appId} runtimeSpec={serverSpec} />\n                )}\n                {!isPySpace && (\n                    <OtherRuntimeSettings\n                        clientVersion={clientVersion}\n                        clientSaveIndicator={clientSaveIndicator}\n                        enableScripts={enableScripts}\n                        runtimeVersion={runtimeOptions.version ?? 0}\n                        serverPersist={!!serverPersist}\n                        serverSpec={serverSpec}\n                        showAdvanced={showAdvanced}\n                        onClientVersionChange={updateClientVersion}\n                        onPersistentServerChange={updateServerPersist}\n                        onPostInstallScriptChange={updatePostInstallScript}\n                        onPreInstallScriptChange={updatePreInstallScript}\n                        onToggleAdvanced={() => setShowAdvanced((shown) => !shown)}\n                    />\n                )}\n            </div>\n        </div>\n    );\n};\n\nconst PythonVersionConfig = () => {\n    const appId = useSelector(getAppId);\n    const app = useSelector(getApp) as AppState | null | undefined;\n    const user = useSelector(getUser);\n    const runtimeOptions = useSelector(getAppRuntimeOptions) as RuntimeOptions | undefined;\n\n    if (!appId || !app || !user || !runtimeOptions) {\n        throw new Error(\"PythonVersionConfig missing required app/user/runtime state\");\n    }\n\n    return <PythonVersionConfigLoaded appId={appId} app={app} user={user} runtimeOptions={runtimeOptions} />;\n};\n\nexport default PythonVersionConfig;\n","import { cloneDeep, isEmpty, merge, set, size } from \"lodash-es\";\nimport { EVENTS, raiseEvent } from \"@/actions\";\nimport { navigate } from \"@/router/navigation\";\nimport type {\n    AnvilAction,\n    AnvilAsyncAction,\n    AppConfig,\n    AppItem,\n    AppPath,\n    AppState,\n    CodePath,\n    FormItemYaml,\n    State,\n    ThemeConfig,\n} from \"@/types\";\nimport { cancelOnIdle, onIdle } from \"@/util\";\nimport * as api from \"@/api\";\nimport { get } from \"@/util/fetch\";\nimport {\n    invalidateIdeAppListQueries,\n    restoreIdeAppListQueries,\n    snapshotIdeAppListQueries,\n    updateIdeAppListQueries,\n} from \"../app-list-query\";\nimport { getUser } from \"../ide\";\nimport { alert, deleteAppModal, modal } from \"../modals\";\nimport { recordActivity } from \"../util\";\nimport { HIDDEN_CODE_PATH, deflateHtmlFormYamlForPersistence, getCachedCodeItem } from \"./code\";\nimport { getAppPathForConflictItem, handleVersionUpdate, loadVersion } from \"./history\";\nimport {\n    getApp,\n    getAppId,\n    getAppIsEditable,\n    nullApp,\n    resetAppOriginsExpiry,\n    resetBranch,\n    updateGlobalLoadingIndicator,\n} from \"./index\";\n\ndeclare global {\n    interface Window {\n        lastSaveId: number;\n    }\n}\n\nwindow.lastSaveId ??= 0; // Make this global so it doesn't get blatted by hot reload\n\nlet onEditedReadOnlyApp = (): AnvilAsyncAction => async (dispatch) => {\n    await dispatch(\n        alert(\n            \"Edit failed\",\n            \"You're viewing an old version of the app - you shouldn't be able to edit it!\\nThis page will now refresh.\"\n        )\n    );\n    document.location.reload();\n};\nexport const setOnEditedReadOnlyApp = (action: () => AnvilAsyncAction) => {\n    onEditedReadOnlyApp = action;\n};\n\n// changedPaths are either:\n// - [\"CODE\", codeItemPath] (Because code items are slightly magic)\n// - [\"CONFLICTS\", ...]\n// - [\"SETTINGS\", configKey]\n\nconst calculateYamlUpdates = (changedAppPaths: AppPath[], state: State) => {\n    const updates = [];\n    const app = getApp(state);\n    if (!app) {\n        throw new Error(\"App does not exist\"); // will be caught by the caller\n    }\n\n    for (const appPath of changedAppPaths || []) {\n        const [appPathType, ...appPathContent] = appPath;\n        switch (appPathType) {\n            case \"CODE\": {\n                const { itemType, item, conflicts, resolvedConflictItem, deleted } = getCachedCodeItem(\n                    appPathContent[0] as CodePath,\n                    state\n                );\n                if (!item) {\n                    throw new Error(\"Save failed: No item found for path \" + appPathContent[0]);\n                }\n                // don't shave this - we shouldn't have this here - but if we do skip it!\n                if (appPathContent[0] === HIDDEN_CODE_PATH) continue;\n                const idKey = item.id && { id: item.id };\n                switch (itemType) {\n                    case \"form\": {\n                        const formItem = item as FormItemYaml;\n                        let formToSave: FormItemYaml | null = null;\n\n                        if (!deleted) {\n                            // Use save_as_html and edit_as_html flags to determine behavior\n                            if (formItem.save_as_html) {\n                                formToSave = deflateHtmlFormYamlForPersistence(formItem, state, {\n                                    debugContext: { codePath: appPathContent[0] as CodePath },\n                                    suppressDebug: true,\n                                });\n                                // we should never have both save_as_html and edit_as_html set\n                            } else if (formItem.edit_as_html) {\n                                // we want to ensure that the form is saved as yaml, the formItem is the source of truth\n                                formToSave = cloneDeep(formItem);\n                                delete formToSave.edit_as_html;\n                                delete formToSave.serialized_html;\n                            } else {\n                                formToSave = formItem;\n                            }\n                        }\n\n                        updates.push([[\"forms\", idKey || { class_name: formItem.class_name }], formToSave]);\n                        break;\n                    }\n                    case \"module\":\n                        updates.push([[\"modules\", idKey || { name: item.name }], deleted ? null : item]);\n                        break;\n                    case \"server_module\":\n                        updates.push([[\"server_modules\", idKey || { name: item.name }], deleted ? null : item]);\n                        break;\n                    case \"script\":\n                        updates.push([[\"scripts\", idKey || { name: item.name }], deleted ? null : item]);\n                        break;\n                    case \"asset\":\n                        updates.push([[\"theme\", \"assets\", idKey || { name: item.name }], deleted ? null : item]);\n                        break;\n                    default:\n                        console.log(item);\n                        throw new Error(`Could not calculate update for item of type ${itemType}`);\n                }\n\n                if (conflicts) {\n                    updates.push([[\"conflicts\", \"conflicting_items\", { item: conflicts.item }], conflicts]);\n                } else if (app.conflicts && resolvedConflictItem) {\n                    // Delete it (idempotent)\n                    // TODO: ...of course, at this point, we need a getConflictItemForPath(), ie the inverse of getPathForConflictItem().\n                    // Or we could just stash the conflict path in the cache. (Ew)\n                    updates.push([[\"conflicts\", \"conflicting_items\", { item: resolvedConflictItem }]]);\n                }\n                break;\n            }\n            case \"CONFLICTS\": {\n                // const app = getApp(state);\n                if (appPathContent[0]) {\n                    const conflictItem = appPathContent[0] as [string, string],\n                        [type, id] = conflictItem;\n                    const itemAppPath = getAppPathForConflictItem(conflictItem, state);\n                    if (!itemAppPath) break;\n                    const [itemAppPathType, ...itemAppPathContent] = itemAppPath;\n                    const cachedCodeItem =\n                        itemAppPathType === \"CODE\" && getCachedCodeItem(itemAppPathContent[0] as CodePath, state);\n                    const findConflictsInCentralState = () =>\n                        state.app!.conflicts?.conflicting_items.find(({ item: [t, i] }) => t === type && i === id);\n                    updates.push([\n                        [\"conflicts\", \"conflicting_items\", { item: conflictItem }],\n                        cachedCodeItem ? cachedCodeItem.conflicts : findConflictsInCentralState(),\n                    ]);\n                } else {\n                    updates.push([[\"conflicts\"], app.conflicts]);\n                }\n                break;\n            }\n            case \"SETTINGS\": {\n                // const app = getApp(state);\n                const configKey = appPathContent[0] as keyof AppConfig;\n                updates.push([[configKey], app.config[configKey]]);\n                break;\n            }\n            case \"THEME\": {\n                // const app = getApp(state);\n                updates.push([[\"theme\", appPathContent[0]], app.themeConfig[appPathContent[0] as keyof ThemeConfig]]);\n                break;\n            }\n            default:\n                throw new Error(\"Don't know how to calculate updates for app path: \" + JSON.stringify(appPath));\n        }\n    }\n\n    // TODO: Collapse updates a bit here. E.g. Don't send an update for the same path twice, just send the last.\n    return updates;\n};\n\nconst checkAppExists = (app?: AppState | null): app is AppState => {\n    if (!app) {\n        const e = new Error(\"You may have closed the app before save completed\") as any;\n        e.title = \"Saving App Failed\";\n        throw e;\n    }\n    return true;\n};\n\nconst removeSavingAppPathsUpdater = ({ savingAppPaths }: State, saveId: number) => {\n    for (const sid of Object.keys(savingAppPaths)) {\n        // Not using \"id in savingAppPaths\" here, because we're modifying the collection inside the loop.\n        const id = +sid;\n        if (id <= saveId) {\n            delete savingAppPaths[id];\n        }\n    }\n};\n\nconst unsavedCallbacks = new Set<() => void>();\nexport function notifyUnsavedCallback(cb: () => void) {\n    unsavedCallbacks.add(cb);\n    return () => unsavedCallbacks.delete(cb);\n}\nexport function flushUnsavedCallbacks() {\n    unsavedCallbacks.forEach((cb) => cb());\n}\n\nexport const saveAppOnIdle =\n    (timeout = 1000): AnvilAction =>\n    (dispatch, getState) => {\n        const state = getState();\n        checkAppExists(state.app);\n        if (!getAppIsEditable(state)) {\n            dispatch(onEditedReadOnlyApp());\n            return;\n        }\n        dispatch(onIdle(saveApp(false, null, false), \"SAVE_APP\", timeout));\n    };\n\nlet queuedBackgroundSave = false;\n\nexport const saveApp =\n    (finaliseCommit = false, commitMessage: string | null = null, immediate = true): AnvilAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        flushUnsavedCallbacks();\n        dispatch(cancelOnIdle(\"SAVE_APP\")); // Just in case saveApp has been called explicitly and there's an onIdle timeout in progress.\n        let state = getState();\n        checkAppExists(state.app);\n        if (!getAppIsEditable(state)) {\n            dispatch(onEditedReadOnlyApp());\n            return;\n        }\n\n        const branch = getApp(state)?.editState.branch ?? \"\";\n        const userBranch = state.user?.email ? `users/${state.user.email}` : \"\";\n        if (branch && !/^[a-zA-Z0-9_-]*$/.test(branch) && branch !== userBranch) {\n            dispatch(\n                alert(\n                    \"Save failed\",\n                    \"The app could not be saved because the branch name is invalid.\\n\" +\n                        \"Branch names can only contain letters, numbers, underscores and hyphens.\"\n                )\n            );\n            return;\n        }\n\n        if (!immediate && !isEmpty(state.savingAppPaths)) {\n            // We've asked for a non-immediate save and there's already a save in progress. Wait for it to finish\n            // TODO: ... or timeout.\n            if (queuedBackgroundSave) {\n                console.log(\"Background save already queued. No action required.\");\n            } else {\n                console.log(\"Enqueuing background save\");\n            }\n            queuedBackgroundSave = true;\n            return;\n        }\n\n        queuedBackgroundSave = false;\n\n        const saveId = ++window.lastSaveId;\n\n        updateState(\n            `Moving all changed app paths to pending save ${saveId}`,\n            ({ editor, unsavedAppPaths, savingAppPaths }) => {\n                const appPaths: AppPath[] = Object.keys(unsavedAppPaths || {}).map((k) => JSON.parse(k));\n                if (appPaths.length > 0) {\n                    for (const p of appPaths || []) {\n                        delete unsavedAppPaths[JSON.stringify(p)];\n                    }\n                    savingAppPaths[saveId] = appPaths;\n                    console.log(\"Saving:\", appPaths);\n                } else {\n                    console.log(\"Nothing to save\");\n                }\n            }\n        );\n        if (!(saveId in getState().savingAppPaths) && !finaliseCommit) {\n            return;\n        }\n\n        state = getState();\n        const userState = getUser(state);\n        const appState = getApp(state)!;\n        checkAppExists(appState);\n\n        // TODO: Really, anywhere that updates the app should set $saved to false, or $dirty: true, or something.\n        updateState(merge, { app: { $saved: false, $saving: false } });\n\n        state = getState();\n        const currentsavingAppPaths = state.savingAppPaths;\n        let allChangedAppPaths: AppPath[] = [];\n        for (const sid in currentsavingAppPaths) {\n            allChangedAppPaths = allChangedAppPaths.concat(currentsavingAppPaths[sid] || []);\n        }\n        console.log(\"Previous saves in flight:\", Object.keys(currentsavingAppPaths));\n\n        let yamlUpdates;\n        try {\n            yamlUpdates = calculateYamlUpdates(allChangedAppPaths, state);\n        } catch (e) {\n            dispatch(\n                alert(\n                    \"Save failed\",\n                    \"The app could not be saved. Subsequent saves are also likely to fail - please refresh.\"\n                )\n            );\n            queuedBackgroundSave = false;\n\n            updateState((state) => {\n                state.app!.$saving = false;\n                state.app!.$saveError = true;\n                state.savingAppPaths = {};\n            });\n            return;\n        }\n\n        const saveBody: any = {\n            updates: yamlUpdates,\n            version: appState.commitSha,\n            edit_session: appState.editSession,\n            save_sequence: saveId,\n            name: appState.name,\n        };\n\n        if (commitMessage) {\n            saveBody.version_message = commitMessage;\n        }\n\n        const maybeTriggerQueuedSave = () => {\n            if (queuedBackgroundSave) {\n                dispatch(saveApp(false, null, true));\n            }\n        };\n\n        for (let saveAttempt = 0; saveAttempt < 3; saveAttempt++) {\n            console.log(\"Save attempt #\", saveAttempt + 1);\n            try {\n                const saveUrl =\n                    appState.editState.state === \"resolving\"\n                        ? `/ide/apps/${getAppId(getState())}?resolving_merge=${appState.editState.merge}`\n                        : `/ide/apps/${getAppId(\n                              getState()\n                          )}?make_fresh_version=${finaliseCommit}&branch=${encodeURIComponent(\n                              appState.editState.branch! // we can only be editing a branch\n                          )}`;\n                const saved = await fetch(saveUrl, {\n                    method: \"PUT\",\n                    body: JSON.stringify(saveBody),\n                    headers: { \"Content-Type\": \"application/json\" },\n                });\n                const resp = await saved.json();\n\n                if (saved.status === 200) {\n                    // Success\n                    // We have now saved all dirty app paths up to and including saveId.\n                    updateState(`Finished save ${saveId}`, (state) => {\n                        removeSavingAppPathsUpdater(state, saveId);\n                    });\n                    const newCommitId = resp.version;\n\n                    await dispatch(handleVersionUpdate(resp, true));\n\n                    updateState(\"App saved\", ({ app }) => {\n                        app!.$saved = true;\n                        app!.commitSha = newCommitId;\n                        app!.origins.debugOrigin = resp.new_debug_origin;\n                    });\n                    dispatch(resetAppOriginsExpiry());\n                    dispatch(recordActivity(\"saveApp\", { explicitCommit: !!commitMessage }));\n                    dispatch(raiseEvent(EVENTS.SAVED_APP));\n\n                    maybeTriggerQueuedSave();\n                    return;\n                } else if (saved.status === 409) {\n                    // Conflict!\n                    if (resp.overtaken) {\n                        // Of no consequence\n                        maybeTriggerQueuedSave();\n                        return;\n                    }\n\n                    // We provide an easy branching flow when we've just conflicted on master\n                    // TODO also check that the changes we're conflicting with weren't made by us\n                    // (because in that case we shouldn't be able to branch either)\n                    console.log(\"Conflict, asking the user what to do\");\n\n                    const branchOff = await dispatch(\n                        modal(\"saveconflict\", { canBranch: appState.editState.branch === \"master\" })\n                    );\n\n                    // we couldn't save the app\n                    updateState(`Unable to save ${saveId}`, (state) => {\n                        removeSavingAppPathsUpdater(state, saveId);\n                    });\n\n                    if (branchOff) {\n                        // We might one day do something fancy here, where we set our personal branch to our last seen\n                        // commit, then apply the same changes. Wouldn't that be nice?\n\n                        // TODO make sure we do something sensible if there are other requests in flight by the time this\n                        // code path triggers. (We might want to wait until we're quiescent before switching branches,\n                        // or at very least make sure nothing retries and delayed successes don't drag us back the the old\n                        // branch. There are dragons here.)\n\n                        console.log(\"Resetting branch..?\");\n                        await dispatch(resetBranch(\"users/\" + userState.email, resp.latest_version));\n                        console.log(\"Branch reset complete\");\n                    }\n                    await dispatch(loadVersion(appState.editState));\n                    queuedBackgroundSave = false;\n                    return;\n                } else {\n                    // Error. Continue to error handler.\n                }\n            } catch (e) {\n                // Error. Continue to error handler.\n                console.error(e);\n            } finally {\n                updateState(set, [\"app\", \"$saving\"], false);\n            }\n\n            // If we reached this point, the save failed. Only try again if another save hasn't started in the meantime.\n            if (saveId < window.lastSaveId) return; // Another save has started. Silently exit here.\n        }\n\n        dispatch(\n            alert(\n                \"Save failed\",\n                \"The app could not be saved after multiple attempts. Subsequent saves are also likely to fail - please refresh.\"\n            )\n        );\n        queuedBackgroundSave = false;\n\n        updateState((state) => {\n            state.app!.$saving = false;\n            state.app!.$saveError = true;\n            state.savingAppPaths = {};\n        });\n    };\n\nexport const deleteAppWithConfirm =\n    (appObj: null | AppItem = null): AnvilAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const app = appObj || getApp(getState());\n        if (!app) return;\n        const confirmed = await dispatch(deleteAppModal(app.name));\n\n        if (confirmed) {\n            const snapshot = snapshotIdeAppListQueries();\n            updateIdeAppListQueries((listedApp) => (listedApp.id === app.id ? null : listedApp));\n            try {\n                dispatch(updateGlobalLoadingIndicator(true));\n                await api.deleteApp(app.id);\n                await invalidateIdeAppListQueries();\n                dispatch(nullApp());\n            } catch (e) {\n                restoreIdeAppListQueries(snapshot);\n                console.error(\"Could not delete app:\", e);\n            } finally {\n                dispatch(updateGlobalLoadingIndicator(false));\n                dispatch(navigate({ type: \"START_PAGE\" }));\n            }\n        }\n    };\n\nexport const appSaveIsFinished: AnvilAction<boolean> = (dispatch, getState, updateState) => {\n    const state = getState();\n    return size(state.unsavedAppPaths) === 0 && size(state.savingAppPaths) === 0;\n};\n\n/**\n * Wait for all in-flight saves to complete.\n * Returns true if saves completed, false if timed out.\n */\nexport const waitForSavingComplete =\n    (timeout = 10000): AnvilAsyncAction<boolean> =>\n    async (dispatch, getState) => {\n        const start = Date.now();\n        while (!isEmpty(getState().savingAppPaths)) {\n            if (Date.now() - start > timeout) {\n                return false; // Timed out\n            }\n            await new Promise((resolve) => setTimeout(resolve, 100));\n        }\n        return true;\n    };\n","import { createContext } from \"react\";\n\ninterface ManagerInstanceGlobals {\n    tooltipRoot: HTMLElement;\n    dropdownMenuRoot: HTMLElement;\n}\n\ninterface EditorInstanceGlobals {\n    objectPaletteRoot: HTMLElement;\n}\n\nexport const ManagerInstanceGlobalsContext = createContext<ManagerInstanceGlobals>({\n    dropdownMenuRoot: document.getElementById(\"dropdown-menu-root\")!,\n    tooltipRoot: document.getElementById(\"tooltip-root\")!,\n});\n\nexport const EditorInstanceGlobalsContext = createContext<EditorInstanceGlobals | null>({\n    objectPaletteRoot: document.getElementById(\"object-palette-root\")!,\n});\n","import React, { useRef, useState } from \"react\";\nimport type { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { faCheck, faClone } from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { copyTextToClipboard } from \"@/components/reusable/CopyButton\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { TooltipPosition, useTooltip } from \"@/components/reusable/Tooltip\";\nimport { cx } from \"@/theme/styles\";\nimport { useMergeRefs } from \"@/util/hooks\";\nimport useEvent from \"@/util/useEventCallback\";\n\nexport type ButtonVariant = \"primary\" | \"danger\" | \"light\" | null;\n\nexport interface PyspaceButtonProps extends React.HTMLAttributes<HTMLSpanElement> {\n    onClick?: React.MouseEventHandler<HTMLElement>;\n    linkStyle?: React.CSSProperties;\n    icon?: IconProp;\n    iconRight?: boolean;\n    round?: boolean;\n    variant?: ButtonVariant;\n    elevated?: boolean;\n    disabled?: boolean;\n    /** parents of the button might check for defaultPrevented (e.g. Popover implementation requires we don't call preventDefault()) */\n    preventDefaultClick?: boolean;\n    titlePosition?: TooltipPosition;\n    className?: string;\n    style?: React.CSSProperties;\n    LinkComponent?: React.ElementType;\n    linkClassName?: string;\n    ref?: React.Ref<HTMLDivElement>;\n}\n\nexport const Button = ({ ref, ...props }: React.PropsWithChildren<PyspaceButtonProps>) => {\n    /*eslint prefer-const: [\"error\", {\"destructuring\": \"all\"}]*/\n    const {\n        children,\n        variant = null,\n        elevated,\n        round,\n        icon = undefined,\n        iconRight = false,\n        disabled = false,\n        title,\n        titlePosition = \"right\",\n        onClick,\n        preventDefaultClick = true,\n        linkStyle,\n        className,\n        style,\n        linkClassName,\n        LinkComponent = LinkInternal,\n        ...restProps\n    } = props;\n\n    const [tooltip, anchorRef] = useTooltip(title, titlePosition);\n    const buttonRef = useMergeRefs(anchorRef, ref);\n\n    return (\n        <div className={cx(\"h-fit w-fit\", className)} style={style} ref={buttonRef}>\n            {title && tooltip}\n            <div className={\"relative border-0 bg-transparent p-0\"}>\n                {/*<span*/}\n                {/*    className={cx(*/}\n                {/*        \"absolute left-0 top-0 h-full w-full bg-light-grey2\",*/}\n                {/*        round ? \"rounded-full \" : \"rounded \"*/}\n                {/*    )}*/}\n                {/*/>*/}\n                <LinkComponent\n                    onClick={(e: React.MouseEvent<HTMLElement>) => disabled || onClick?.(e)}\n                    className={cx(\n                        `flex items-center justify-center gap-4 border-2 border-light-grey2 bg-light-bg6 text-light-bg0 select-none md:gap-[1.2rem]`,\n                        !disabled && (elevated ? `ps-hover-raise-2` : `ps-hover-raise-1`),\n                        { \"bg-primary\": variant == \"primary\" },\n                        { \"bg-danger\": variant == \"danger\" },\n                        { \"bg-light-bg3 text-light-grey2\": variant == \"light\" },\n\n                        round\n                            ? \"rounded-full px-[1.4rem] py-[.4rem] text-[1.6rem]\"\n                            : \"rounded-[.4rem] px-[1.2rem] py-[.4rem] text-[1.8rem] md:px-[1.4rem] md:py-[10px] md:text-[2rem]\",\n                        disabled && \"cursor-not-allowed border-light-grey1 bg-grey-3 text-light-bg1\",\n                        linkClassName\n                    )}\n                    icon={icon}\n                    iconRight={iconRight}\n                    style={linkStyle}\n                    preventDefaultClick={preventDefaultClick}\n                    {...restProps}>\n                    {children}\n                </LinkComponent>\n            </div>\n        </div>\n    );\n};\n\nexport interface IconButtonProps extends PyspaceButtonProps {\n    size?: \"tiny\" | \"small\" | \"medium\" | null;\n}\n\nexport const IconButton = ({ ref, ...props }: IconButtonProps) => {\n    /*eslint prefer-const: [\"error\", {\"destructuring\": \"all\"}]*/\n    const {\n        variant,\n        elevated,\n        disabled = false,\n        title,\n        titlePosition = \"right\",\n        onClick,\n        round,\n        icon,\n        preventDefaultClick = true,\n        size = \"large\",\n        className,\n        style,\n        children,\n        linkClassName,\n        ...restProps\n    } = props;\n\n    const [tooltip, anchorRef] = useTooltip(title, titlePosition);\n    const buttonRef = useMergeRefs(anchorRef, ref);\n\n    return (\n        <div\n            className={cx(\"h-fit w-fit\", className)}\n            style={style}\n            ref={buttonRef}\n            onClick={(e) => disabled || onClick?.(e)}>\n            {title && tooltip}\n            <div\n                className={cx(\n                    \"relative border-0 bg-transparent p-0\",\n                    { \"h-[4.8rem] w-[4.8rem] text-[2.4rem]\": size === \"large\" },\n                    { \"h-[3.6rem] w-[3.6rem] text-[1.8rem]\": size === \"medium\" },\n                    { \"h-[2.4rem] w-[2.4rem] text-[1.2rem]\": size === \"small\" },\n                    { \"h-[2.0rem] w-[2.0rem] text-[1rem]\": size === \"tiny\" }\n                )}>\n                {/*<span*/}\n                {/*    className={cx(*/}\n                {/*        \"absolute left-0 top-0 h-full w-full bg-light-grey2\",*/}\n                {/*        round ? \"rounded-full \" : \"rounded \"*/}\n                {/*    )}*/}\n                {/*/>*/}\n                <LinkInternal\n                    className={cx(\n                        `flex h-full w-full items-center justify-center border-2 border-light-grey2 bg-light-bg6 text-light-bg0 select-none`,\n                        !disabled && (elevated ? `ps-hover-raise-2` : `ps-hover-raise-1`),\n                        { \"bg-primary\": variant === \"primary\" },\n                        { \"bg-danger\": variant === \"danger\" },\n                        { \"bg-light-bg3 text-light-grey2\": variant === \"light\" },\n                        round ? \"rounded-full\" : \"rounded-[0.4rem]\",\n                        disabled && \"cursor-not-allowed border-light-grey1 bg-grey-3 text-light-bg1\",\n                        linkClassName\n                    )}\n                    preventDefaultClick={preventDefaultClick}\n                    {...restProps}>\n                    {icon && <FontAwesomeIcon icon={icon} />}\n                    {children}\n                </LinkInternal>\n            </div>\n        </div>\n    );\n};\n\ninterface CopyButtonProps extends IconButtonProps {\n    copyText: string;\n}\n\nexport const CopyButton = ({ copyText, ...props }: CopyButtonProps) => {\n    const copiedTimeout = useRef<number | undefined>(undefined);\n    const [copied, setCopied] = useState(false);\n\n    const doCopy = useEvent(async () => {\n        clearTimeout(copiedTimeout.current);\n        await copyTextToClipboard(copyText);\n        setCopied(true);\n        copiedTimeout.current = setTimeout(() => {\n            setCopied(false);\n        }, 3000);\n    });\n\n    const onBlur = useEvent(() => {\n        clearTimeout(copiedTimeout.current);\n        setCopied(false);\n    });\n\n    return <IconButton onBlur={onBlur} icon={copied ? faCheck : faClone} onClick={doCopy} {...props} />;\n};\n","import React from \"react\";\nimport { InputLabel } from \"@/components/reusable/Forms\";\nimport { ContentTextAreaInput } from \"@/components/reusable/SharedComponents\";\nimport { cx } from \"@/theme/styles\";\n\nexport type inputSize = \"tiny\" | \"small\" | \"medium\" | \"large\" | null;\n\ninterface TextAreatProps {\n    elevated?: boolean;\n    className?: string;\n    description?: string;\n    text?: string;\n    ref?: React.Ref<HTMLTextAreaElement>;\n}\n\n/**\n *\n * @type {any}\n */\nconst PySpaceTextArea = ({ ref, className, elevated = false, text, description, ...restProps }: TextAreatProps) => {\n    let textStyle = \"text-[1.2rem]! md:text-[1.4rem]! \";\n    let classStyles = \"px-[.8rem]! md:px-[1.4]! py-[.2rem]! md:py-[.7rem]!\";\n\n    if (elevated) classStyles += \" shadow-pselevated1!\";\n\n    return (\n        <InputLabel\n            titleClasses={cx(textStyle, \"md:mb-[0.8rem]!\")}\n            subtitleClasses={cx(textStyle, \"font-normal!\")}\n            title={text}\n            subtitle={description}>\n            <ContentTextAreaInput className={cx(className, classStyles, textStyle, \"outline-none\")} {...restProps} />\n        </InputLabel>\n    );\n};\n\nexport default PySpaceTextArea;\n","import React from \"react\";\nimport { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { cva } from \"class-variance-authority\";\nimport TextInput from \"@/components/reusable/TextInput\";\nimport { cx } from \"@/theme/styles\";\n\nexport type inputSize = \"tiny\" | \"small\" | \"medium\" | \"large\" | null;\n\nconst textInputVariants = cva(\"h-[3.2rem]! px-[0.8rem]! text-[1.2rem]! leading-[250%]! outline-0 md:leading-[250%]!\", {\n    variants: {\n        icon: {\n            true: \"\",\n            false: \"\",\n        },\n        elevated: {\n            true: \"shadow-pselevated1!\",\n            false: \"\",\n        },\n        size: {\n            tiny: \"md:h-[3.4rem]!\",\n            small: \"md:h-16!\",\n            medium: \"h-[3.4rem]! md:h-[4.4rem]! md:px-[1.4rem]! md:text-[1.4rem]!\",\n            large: \"h-[3.8rem]! px-[1.4rem]! md:h-20! md:px-[1.4rem]! md:text-[1.4rem]!\",\n        },\n    },\n    compoundVariants: [\n        {\n            icon: true,\n            size: [\"tiny\", \"small\"],\n            class: \"pl-[3.2rem]!\",\n        },\n        {\n            icon: true,\n            size: \"medium\",\n            class: \"pl-[3.2rem]! md:pl-16!\",\n        },\n        {\n            icon: true,\n            size: \"large\",\n            class: \"pl-16! md:pl-16!\",\n        },\n    ],\n    defaultVariants: {\n        icon: false,\n        elevated: false,\n        size: \"medium\",\n    },\n});\n\nconst labelVariants = cva(\"text-[1.2rem]!\", {\n    variants: {\n        variant: { title: \"md:mb-[0.8rem]!\", subtitle: \"font-normal!\" },\n        size: {\n            tiny: \"\",\n            small: \"\",\n            medium: \"md:text-[1.4rem]!\",\n            large: \"md:text-[1.4rem]!\",\n        },\n    },\n    defaultVariants: { size: \"medium\" },\n});\n\ntype PySpaceTextInputProps = Omit<React.ComponentProps<typeof TextInput>, \"ref\" | \"textarea\"> & {\n    elevated?: boolean;\n    size?: inputSize;\n    icon?: IconDefinition;\n    ref?: React.Ref<HTMLInputElement>;\n};\n\nconst PySpaceTextInput = ({ ref, ...props }: PySpaceTextInputProps) => {\n    const { elevated = false, size = \"medium\", icon = null, small = null, ...restProps } = props;\n    const notSmall = size !== \"medium\" && size !== \"large\";\n    return (\n        <div className={\"relative\"}>\n            {icon && (\n                <div\n                    className={cx(\"absolute top-0 bottom-0 m-auto ml-[.2rem] flex h-fit w-[3.2rem] justify-center\", {\n                        \"md:w-16\": notSmall,\n                        \"w-16\": size === \"large\",\n                    })}>\n                    <FontAwesomeIcon className={cx(\"text-[1.8rem]!\", { \"md:text-[2rem]!\": notSmall })} icon={icon} />\n                </div>\n            )}\n\n            <TextInput\n                ref={ref}\n                titleClasses={cx(labelVariants({ size, variant: \"title\" }))}\n                subtitleClasses={cx(labelVariants({ size, variant: \"subtitle\" }))}\n                textBoxClassName={cx(textInputVariants({ icon: !!icon, elevated: !!elevated, size }))}\n                className={\"mb-0!\"}\n                {...restProps}\n            />\n        </div>\n    );\n};\n\nexport default PySpaceTextInput;\n","import React, { useCallback, useRef, useState } from \"react\";\nimport { ModalComponent, ModalProps } from \"@/components/modals\";\nimport Modal from \"@/components/modals/Modal\";\nimport { modalReturn } from \"@/controllers/modals\";\nimport PySpaceTextArea from \"@pyspace/common/components/TextArea\";\n\ntype AbuseReportSpec = { type: \"user\"; username: string } | { type: \"gadget\"; gadgetId: string; gadgetName: string };\n\nconst ReportAbuseModal: ModalComponent<AbuseReportSpec> = ({\n    modalId,\n    spec: { type, gadgetId, gadgetName, username },\n}: ModalProps<AbuseReportSpec>) => {\n    const modalRef = useRef();\n    const [message, setMessage] = useState(\"\");\n\n    const inputRef = useCallback((node) => {\n        node?.focus();\n    }, []);\n\n    return (\n        <Modal\n            size={\"medium\"}\n            autoFocus={false}\n            title={`Report Abuse`}\n            modalId={modalId}\n            ref={modalRef}\n            buttons={[\n                {\n                    text: \"Submit Report\",\n                    clickActionCreator: () => modalReturn(message),\n                    round: true,\n                },\n            ]}>\n            <div className={\"flex flex-col gap-[1.6rem] text-[1.4rem]\"}>\n                <div>\n                    In order to report{\" \"}\n                    {type === \"gadget\" ? (\n                        <>\n                            the widget <span className={\"font-mono font-semibold text-primary\"}>{gadgetName}</span>\n                        </>\n                    ) : (\n                        <>\n                            <span className={\"font-mono font-semibold text-primary\"}>{username}</span>'s profile\n                        </>\n                    )}{\" \"}\n                    as inappropriate, please describe in a sentence or two why you think it should be removed or hidden:\n                </div>\n\n                <PySpaceTextArea\n                    ref={inputRef}\n                    value={message}\n                    // text={\"Description\"}\n                    // subtitle={\"How would you describe this widget?\"}\n                    className={\"h-28!\"}\n                    onChange={(e) => setMessage(e.target.value)}\n                />\n            </div>\n        </Modal>\n    );\n};\n\nexport default ReportAbuseModal;\n","import React, { useRef } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { faUpload } from \"@fortawesome/free-solid-svg-icons/faUpload\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { ModalComponent } from \"@/components/modals\";\nimport Modal, { ModalRef } from \"@/components/modals/Modal\";\nimport { modalReturn } from \"@/controllers/modals\";\nimport { SiteDispatch } from \"@/pyspace/site/store/pyspace-site-store\";\nimport useEvent from \"@/util/useEventCallback\";\n\ninterface FileModalSpec {\n    title?: string;\n    prompt?: string;\n}\n\nconst UploadFileModal: ModalComponent<FileModalSpec> = ({ modalId, spec }) => {\n    const { title, prompt } = spec;\n    const dispatch = useDispatch<SiteDispatch>();\n    const modalRef = useRef<ModalRef>(null);\n\n    const onUploadFile: React.ChangeEventHandler<HTMLInputElement> = useEvent((e) => {\n        const file = e.target.files?.[0];\n        if (file) {\n            console.log(\"Returning\", file);\n            modalRef.current!.returnValue(file);\n        }\n    });\n\n    return (\n        <Modal\n            ref={modalRef}\n            size={\"small\"}\n            autoFocus={false}\n            title={title ?? \"Upload file\"}\n            modalId={modalId}\n            buttons={[{ text: \"Cancel\", clickActionCreator: () => modalReturn(null) }]}>\n            <div className={\"flex flex-col gap-[1.6rem]\"}>\n                <div>{prompt}</div>\n                <label htmlFor=\"file-upload\" className={\"cursor-pointer font-bold\"}>\n                    <div className=\"ps-hover-raise-2 mr-8 inline-flex items-center justify-center gap-[1.6rem] rounded-[4px] border-2 border-grey-2 bg-light-bg3 px-[1.6rem] py-[0.8rem] text-[1.6rem] text-grey-2 shadow-pselevated1\">\n                        <FontAwesomeIcon icon={faUpload} />\n                        Choose File\n                    </div>\n                    No File Chosen\n                </label>\n                <input id=\"file-upload\" type=\"file\" className={\"hidden\"} accept={\"image/*\"} onChange={onUploadFile} />\n            </div>\n        </Modal>\n    );\n};\n\nexport default UploadFileModal;\n","import React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { connect, useSelector } from \"react-redux\";\nimport { faChevronDown } from \"@fortawesome/free-solid-svg-icons/faChevronDown\";\nimport { faExclamationCircle } from \"@fortawesome/pro-light-svg-icons\";\nimport { faArrowDownLeftAndArrowUpRightToCenter } from \"@fortawesome/pro-light-svg-icons/faArrowDownLeftAndArrowUpRightToCenter\";\nimport { faArrowUpRightAndArrowDownLeftFromCenter } from \"@fortawesome/pro-light-svg-icons/faArrowUpRightAndArrowDownLeftFromCenter\";\nimport { faCircleQuestion } from \"@fortawesome/pro-light-svg-icons/faCircleQuestion\";\nimport { faCodeBranch } from \"@fortawesome/pro-light-svg-icons/faCodeBranch\";\nimport { faHeart as faLightHeart } from \"@fortawesome/pro-light-svg-icons/faHeart\";\nimport { faShareNodes } from \"@fortawesome/pro-light-svg-icons/faShareNodes\";\nimport { faShareNodes as faShareNodesRegular } from \"@fortawesome/pro-regular-svg-icons/faShareNodes\";\nimport {\n    faArrowUpRightFromSquare,\n    faBars,\n    faEllipsis,\n    faPen,\n    faShareAlt,\n    faTrashCan,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { faGear } from \"@fortawesome/pro-solid-svg-icons/faGear\";\nimport { faHeart as faSolidHeart } from \"@fortawesome/pro-solid-svg-icons/faHeart\";\nimport { faHome } from \"@fortawesome/pro-solid-svg-icons/faHome\";\nimport { faMaximize } from \"@fortawesome/pro-solid-svg-icons/faMaximize\";\nimport { faRedo } from \"@fortawesome/pro-solid-svg-icons/faRedo\";\nimport { faUndo } from \"@fortawesome/pro-solid-svg-icons/faUndo\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Button } from \"@/components/reusable/Button\";\nimport { ButtonGroup } from \"@/components/reusable/ButtonGroup\";\nimport DropdownMenu from \"@/components/reusable/DropdownMenu\";\nimport Link from \"@/components/reusable/Link\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { useSaveIndicator } from \"@/components/reusable/SaveIndicator\";\nimport { useTooltip } from \"@/components/reusable/Tooltip\";\nimport { useHistoryStore } from \"@/components/tabs/code/History\";\nimport { getApp, getAppIsEditable } from \"@/controllers/app\";\nimport { modal } from \"@/controllers/modals\";\nimport { faAnvilLogoSolid } from \"@/data/customIcons\";\nimport { IconButton } from \"@/pyspace/common/components/Button\";\nimport {\n    GadgetEventsContext,\n    deleteGadget,\n    getGadgetDetails,\n    getGadgetOwner,\n    getIsEmbedded,\n    getIsPopout,\n    getIsPySpace,\n    getIsScript,\n    getNotifications,\n    getShareState,\n    getUser,\n    openInAnvil,\n    renameGadget,\n    reportGadgetAbuse,\n    setLikedGadget,\n    setShareState,\n} from \"@/pyspace/gadget_editor/controllers/gadget\";\nimport { Gadget, GadgetState } from \"@/pyspace/gadget_editor/store/gadget-store\";\nimport { PopoutContext } from \"@/pyspace/site/components/PopoutEditor\";\nimport { ProfileMenu } from \"@/pyspace/site/components/UserMenu\";\nimport { navigate } from \"@/router/navigation\";\nimport { cx } from \"@/theme/styles\";\nimport { GadgetConnectedProps } from \"@/types\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { Button as PyspaceButton } from \"@pyspace/common/components/Button\";\nimport { PySpaceToggle } from \"@pyspace/common/components/PySpaceToggle\";\nimport { InternalEmbeddedContext } from \"@pyspace/gadget_editor/components/GadgetEditor\";\n\nfunction useTitleBarToolTips(gadget: Gadget | null = null) {\n    const [renameTT, renameTTAnchor] = useTooltip(\"Rename Widget\", \"bottom\");\n    const [changeVisibilityTT, changeVisibilityTTAnchor] = useTooltip(\"Change Visibility\", \"bottom\");\n    const [sharingTT, sharingTTAnchor] = useTooltip(\"Sharing Settings\", \"bottom\");\n    const [docsTT, docsTTAnchor] = useTooltip(\"View Docs\", \"bottom\");\n    const [openAnvilTT, openAnvilTTAnchor] = useTooltip(\"Open in Anvil\", \"bottom\");\n    const [likeTT, likeTTAnchor] = useTooltip(`${gadget?.liked ? \"Unlike\" : \"Like\"} Widget`, \"bottom\");\n    const [cloneTT, cloneTTAnchor] = useTooltip(\"Clone Widget\", \"bottom\");\n    const [reportTT, reportTTAnchor] = useTooltip(\"Report Abuse\", \"bottom\");\n    const [expandTT, expandTTAnchor] = useTooltip(\"Expand Editor\", \"bottom\");\n\n    return {\n        renameTT,\n        renameTTAnchor,\n        changeVisibilityTT,\n        changeVisibilityTTAnchor,\n        sharingTT,\n        sharingTTAnchor,\n        docsTT,\n        docsTTAnchor,\n        openAnvilTT,\n        openAnvilTTAnchor,\n        likeTT,\n        likeTTAnchor,\n        cloneTT,\n        cloneTTAnchor,\n        reportTT,\n        reportTTAnchor,\n        expandTT,\n        expandTTAnchor,\n    };\n}\n\nconst GadgetTitleBarWrapper = ({ children }: React.PropsWithChildren) => {\n    return (\n        <div className={\"flex h-[6.7rem] items-center border-b-2 border-grey-2 bg-light-bg2 text-grey-2\"}>\n            {children}\n        </div>\n    );\n};\n\nconst connectEditableGadgetTitleBar = connect((state: GadgetState) => ({\n    app: getApp(state),\n    sharing: getShareState(state),\n    isScript: getIsScript(state),\n}));\n\nconst VisibilityButtons = ({ sharing, onClick }) => {\n    const opt = [\n        { value: \"private\", title: \"Private\" },\n        { value: \"public\", title: \"Public\" },\n    ];\n    switch (sharing) {\n        case \"unlisted\":\n            return (\n                <PyspaceButton round elevated onClick={onClick}>\n                    Unlisted\n                </PyspaceButton>\n            );\n        default:\n            return (\n                <ButtonGroup\n                    elevated\n                    options={opt}\n                    selectedVariant={\"primary\"}\n                    selectedOption={sharing}\n                    onClick={onClick}\n                />\n            );\n    }\n};\n\nexport const EditableGadgetTitleBar = connectEditableGadgetTitleBar(\n    ({ app, sharing, isScript, dispatch }: GadgetConnectedProps<typeof connectEditableGadgetTitleBar>) => {\n        const [renamingTo, setRenamingTo] = useState<string | null>(null);\n        const [saveIndicator, setSaved, setSaveError] = useSaveIndicator();\n        const inputRef = useRef<HTMLInputElement>(null);\n        const gadgetEvents = useContext(GadgetEventsContext);\n\n        const historyStore = useHistoryStore();\n\n        const {\n            renameTT,\n            renameTTAnchor,\n            changeVisibilityTT,\n            changeVisibilityTTAnchor,\n            sharingTT,\n            sharingTTAnchor,\n            docsTT,\n            docsTTAnchor,\n            openAnvilTT,\n            openAnvilTTAnchor,\n        } = useTitleBarToolTips();\n\n        const prevRenamingTo = useRef<string | null>(null);\n        useEffect(() => {\n            if (prevRenamingTo.current === null && renamingTo !== null) {\n                inputRef.current?.focus();\n                inputRef.current?.select();\n            }\n            prevRenamingTo.current = renamingTo;\n        }, [renamingTo]);\n\n        const saveName = useEvent(async () => {\n            setRenamingTo(null);\n            if (renamingTo && renamingTo !== app.name) {\n                setSaved(false);\n                try {\n                    dispatch(renameGadget(app.id, renamingTo, gadgetEvents));\n                    setSaved(true);\n                } catch (e: any) {\n                    setSaveError(e.message || \"Unknown Error\");\n                    throw e;\n                }\n            }\n        });\n\n        const requestDelete = useCallback(async () => {\n            if (await dispatch(modal(\"deleteGadget\", {}))) {\n                dispatch(deleteGadget(app.id, gadgetEvents));\n                //todo: this needs to close the gadget if its open and/or return you to the homepage\n            }\n        }, [app.id, app.name]);\n\n        const openShareModal = useCallback(() => {\n            dispatch(modal(\"shareGadget\", {}));\n        }, []);\n\n        const [isSavingShareState, setSavingShareState] = useState(false);\n\n        const toggleShared = useCallback(async () => {\n            setSavingShareState(true);\n            try {\n                await dispatch(setShareState(sharing === \"public\" ? \"private\" : \"public\", gadgetEvents));\n            } finally {\n                setSavingShareState(false);\n            }\n        }, [sharing]);\n\n        const isPopoutEditor = useContext(PopoutContext);\n        const userDetails = useSelector(getUser);\n        const notifications = useSelector(getNotifications);\n\n        return (\n            <GadgetTitleBarWrapper>\n                <DropdownMenu\n                    render={(showMenu, anchor) => (\n                        <LinkInternal\n                            onClick={(e) => showMenu(null, e.currentTarget)}\n                            className={cx(\n                                \"relative mr-2 flex shrink-0 items-center self-stretch pr-4 pl-[1.8rem] text-[2.4rem] hover:bg-light-bg4\",\n                                isPopoutEditor ? \"text-grey-2\" : \"text-black\"\n                            )}>\n                            {isPopoutEditor ? (\n                                <FontAwesomeIcon icon={faGear} fixedWidth />\n                            ) : (\n                                <img\n                                    src={\"/images/py.space-logo.svg\"}\n                                    className={\"mr-[0.4rem] h-16\"}\n                                    alt={\"py.space logo\"}\n                                />\n                            )}\n                            <FontAwesomeIcon icon={faChevronDown} fixedWidth className={\"ml-[0.4rem] text-[1.6rem]\"} />\n                            <div className={\"absolute bottom-0 left-0\"}>{anchor}</div>\n                        </LinkInternal>\n                    )}\n                    items={() => [\n                        isPopoutEditor\n                            ? null\n                            : [\n                                  \"Home\",\n                                  () => {\n                                      document.location.href = \"/\";\n                                  },\n                                  faHome,\n                              ],\n                        isScript\n                            ? null\n                            : [\n                                  <span>Open in Anvil</span>,\n                                  () => dispatch(openInAnvil(app.id)),\n                                  faAnvilLogoSolid,\n                                  { className: \"text-primary\" },\n                              ],\n                        isPopoutEditor\n                            ? [\n                                  \"Edit Full Screen\",\n                                  () => {\n                                      window.open(`/g/${app.id}`);\n                                  },\n                                  faArrowUpRightFromSquare,\n                              ]\n                            : null,\n                        [\n                            \"Widget Settings\",\n                            () => {\n                                dispatch(modal(\"editGadgetDetails\", {}));\n                            },\n                            faGear,\n                        ],\n                        [\n                            \"Sharing\",\n                            () => {\n                                dispatch(modal(\"shareGadget\", {}));\n                            },\n                            faShareNodesRegular,\n                        ],\n                        [\"Delete Widget\", requestDelete, faTrashCan, { className: \"text-danger\" }],\n                        <hr />,\n                        [\"Undo\", () => historyStore.undo(), faUndo, { disabled: !historyStore.canUndo() }],\n                        [\"Redo\", () => historyStore.redo(), faRedo, { disabled: !historyStore.canRedo() }],\n                    ]}\n                />\n                {renamingTo === null ? (\n                    <>\n                        <LinkInternal\n                            ref={renameTTAnchor}\n                            className={\"flex w-[20px] flex-1 items-center text-[2rem] font-semibold text-grey-2\"}\n                            onClick={() => setRenamingTo(app.name)}>\n                            <div title={app.name} alt={app.name} className={\"truncate\"}>\n                                {app.name}\n                            </div>\n                            <FontAwesomeIcon className={\"ml-4 text-[1.4rem]\"} icon={faPen} /> {saveIndicator} {renameTT}\n                        </LinkInternal>\n                    </>\n                ) : (\n                    <input\n                        ref={inputRef}\n                        className={\n                            \"-ml-2 w-[20px] flex-1 rounded-[0.4rem] border-2 border-grey-2 p-2 text-[2rem] font-semibold text-grey-2 outline-none\"\n                        }\n                        value={renamingTo}\n                        onChange={(e) => setRenamingTo(e.target.value)}\n                        onKeyPress={(e) => e.key === \"Enter\" && saveName()}\n                        onBlur={saveName}\n                    />\n                )}\n\n                <div className={\"hidden md:contents\"}>\n                    <div ref={changeVisibilityTTAnchor}>\n                        <VisibilityButtons sharing={sharing} onClick={toggleShared} />\n                        {changeVisibilityTT}\n                    </div>\n\n                    <LinkInternal\n                        ref={sharingTTAnchor}\n                        className={\"flex items-center px-[0.8rem] text-[2.4rem] leading-none\"}\n                        icon={faShareNodes}\n                        onClick={() => dispatch(modal(\"shareGadget\", {}))}>\n                        {sharingTT}\n                    </LinkInternal>\n                </div>\n                <Link\n                    ref={docsTTAnchor}\n                    to={\"/docs\"}\n                    target={\"_blank\"}\n                    className={cx(\n                        \"flex items-center px-[0.8rem] text-[2.4rem] leading-none\",\n                        isScript && isPopoutEditor && \"pr-6\"\n                    )}>\n                    <FontAwesomeIcon icon={faCircleQuestion} />\n                    {docsTT}\n                </Link>\n\n                <div className={\"hidden md:contents\"}>\n                    {!isScript && (\n                        <LinkInternal\n                            ref={openAnvilTTAnchor}\n                            className={cx(\n                                \"flex items-center px-[0.8rem] text-[2.4rem] leading-none\",\n                                isPopoutEditor && \"pr-6\"\n                            )}\n                            onClick={() => dispatch(openInAnvil(app.id))}>\n                            <div\n                                className={cx(\n                                    \"ps-hover-raise-1 relative justify-center overflow-hidden rounded-full border-grey-2\",\n                                    isPopoutEditor\n                                        ? \"h-[4.8rem] w-[4.8rem] border-2\"\n                                        : \"h-[2.8rem] w-[2.8rem] border-[1.5px]\"\n                                )}>\n                                <img\n                                    className={cx(\n                                        \"absolute max-w-[unset]\",\n                                        isPopoutEditor\n                                            ? \"top-[-3px] left-[-3px] h-20 w-20\"\n                                            : \"top-[-1.75px] left-[-1.75px] h-12 w-12\"\n                                    )}\n                                    src={\"/images/ANVIL-Logo-no-tagline-no-name.svg\"}\n                                    alt=\"Anvil logo\"\n                                    title={\"Open in Anvil\"}\n                                />\n                            </div>\n                            {openAnvilTT}\n                        </LinkInternal>\n                    )}\n                </div>\n                {!isPopoutEditor && <ProfileMenu userDetails={userDetails!} className={\"mt-px pr-[1.8rem]\"} />}\n            </GadgetTitleBarWrapper>\n        );\n    }\n);\n\nconst connectReadOnlyGadgetTitleBar = connect((state: GadgetState) => ({\n    app: getApp(state) as GadgetState[\"app\"],\n    owner: getGadgetOwner(state),\n    gadget: getGadgetDetails(state),\n    isEmbedded: getIsEmbedded(state),\n    isPySpace: getIsPySpace(state),\n    isPopout: getIsPopout(state),\n}));\n\nconst ReadOnlyGadgetTitleBar = connectReadOnlyGadgetTitleBar(\n    ({\n        app,\n        owner,\n        gadget,\n        isEmbedded,\n        isPySpace,\n        isPopout,\n        dispatch,\n    }: GadgetConnectedProps<typeof connectReadOnlyGadgetTitleBar>) => {\n        const openShareModal = useCallback(() => {\n            dispatch(modal(\"shareGadget\", {}));\n        }, []);\n\n        const onFork = useEvent(() => {\n            window.open(window.location.origin + \"/ide/gadgets/fork/\" + app.id);\n        });\n\n        const { setShouldPopout } = useContext(InternalEmbeddedContext);\n\n        const openInPySpace = useEvent((e: React.MouseEvent) => {\n            if (isPySpace) {\n                setShouldPopout(true);\n                e.stopPropagation();\n                e.preventDefault();\n            }\n        });\n\n        const {\n            likeTT,\n            likeTTAnchor,\n            cloneTT,\n            cloneTTAnchor,\n            sharingTT,\n            sharingTTAnchor,\n            reportTT,\n            reportTTAnchor,\n            expandTT,\n            expandTTAnchor,\n        } = useTitleBarToolTips(gadget);\n\n        const { onClosed, onLiked } = useContext(GadgetEventsContext);\n\n        const doLike = useEvent(async () => {\n            const newState = !gadget.liked;\n            if (await dispatch(setLikedGadget(newState))) {\n                onLiked?.(app.id, newState);\n            }\n        });\n\n        return (\n            <GadgetTitleBarWrapper>\n                <IconButton\n                    // elevated\n                    round\n                    className={cx(\"mx-6 mt-[-4px] px-2\")}\n                    linkClassName=\"rounded-full overflow-clip\"\n                    onClick={() => {\n                        window.open(`/u/${owner.username}`);\n                    }}>\n                    <img src={`/ide/users/${owner.username}/profile-picture`} alt={`Profile for ${owner.username}`} />\n                </IconButton>\n                <div className={\"flex w-[20px] flex-1 items-center text-[2rem] font-semibold text-grey-2\"}>\n                    <div className={\"truncate\"}>\n                        <span className={\"hidden md:inline\"}>{owner.username} / </span>\n                        {app.name}\n                    </div>\n                </div>\n\n                <div className={\"flex md:hidden\"}>\n                    <DropdownMenu\n                        render={(showMenu, anchor) => (\n                            <Button\n                                isIconButton\n                                variant={\"hidden\"}\n                                size={\"small\"}\n                                onClick={(e) => showMenu(null, e.currentTarget)}\n                                className={\"mr-10\"}>\n                                <FontAwesomeIcon className={\"text-[2.4rem]\"} icon={faBars} />\n                                {anchor}\n                            </Button>\n                        )}\n                        items={() => [\n                            [\n                                `${gadget.liked ? \"Unl\" : \"L\"}ike Widget`,\n                                doLike,\n                                gadget.liked ? faSolidHeart : faLightHeart,\n                            ],\n                            [\"Clone Widget\", onFork, faCodeBranch],\n                            [\"Sharing Settings\", openShareModal, faShareNodes],\n                            [\n                                \"Report Abuse\",\n                                () => dispatch(reportGadgetAbuse()),\n                                faExclamationCircle,\n                                { className: \"text-danger\" },\n                            ],\n                            isEmbedded && [\n                                isPySpace ? \"Expand Editor\" : \"Open in PySpace\",\n                                () => {\n                                    if (isPySpace) {\n                                        setShouldPopout(true);\n                                    } else {\n                                        window.open(window.location.origin + \"/g/\" + app.id);\n                                    }\n                                },\n                                isPySpace && faArrowUpRightAndArrowDownLeftFromCenter, //todo: make pyspace fontawesome icon for if not in pyspace\n                            ],\n                            isPopout &&\n                                isPySpace && [\n                                    \"Minimize Editor\",\n                                    () => onClosed?.(),\n                                    faArrowDownLeftAndArrowUpRightToCenter,\n                                ],\n                        ]}\n                    />\n                </div>\n\n                <div className={\"hidden md:flex\"}>\n                    <LinkInternal\n                        ref={likeTTAnchor}\n                        className={\"flex items-center px-4 text-[2.4rem] leading-none hover:text-primary-600\"}\n                        onClick={doLike}>\n                        <FontAwesomeIcon\n                            className={cx(gadget.liked && \"text-danger\")}\n                            icon={gadget.liked ? faSolidHeart : faLightHeart}\n                        />\n                        {likeTT}\n                        <div className={\"ml-2 font-mono text-[2rem]\"}>{!!gadget.nLikes && gadget.nLikes}</div>\n                    </LinkInternal>\n\n                    <LinkInternal\n                        ref={cloneTTAnchor}\n                        className={\"flex items-center px-4 text-[2.4rem] leading-none hover:text-primary-600\"}\n                        onClick={onFork}>\n                        <FontAwesomeIcon icon={faCodeBranch} /> {cloneTT}\n                        <div className={\"ml-2 font-mono text-[2rem]\"}>{!!gadget.nForks && gadget.nForks}</div>\n                    </LinkInternal>\n\n                    <LinkInternal\n                        ref={sharingTTAnchor}\n                        className={\"flex items-center px-4 text-[2.4rem] leading-none hover:text-primary-600\"}\n                        onClick={openShareModal}>\n                        <FontAwesomeIcon icon={faShareNodes} />\n                        {sharingTT}\n                    </LinkInternal>\n\n                    {/*TODO: This should probably be in a dropdown somewhere*/}\n                    <LinkInternal\n                        ref={reportTTAnchor}\n                        className={cx(\n                            \"flex items-center px-4 text-[2.4rem] leading-none hover:text-primary-600\",\n                            !isEmbedded && (!isPopout || !isPySpace) && \"mr-2\"\n                        )}\n                        onClick={() => dispatch(reportGadgetAbuse())}>\n                        <FontAwesomeIcon icon={faExclamationCircle} />\n                        {reportTT}\n                    </LinkInternal>\n\n                    {isEmbedded && (\n                        <Link\n                            ref={expandTTAnchor}\n                            to={`/g/${app.id}`}\n                            onClick={openInPySpace}\n                            target={\"_blank\"}\n                            className={\"flex items-center px-4 text-[2.4rem] leading-none hover:text-primary-600\"}>\n                            {isPySpace ? (\n                                <>\n                                    <FontAwesomeIcon\n                                        className={\"mr-2\"}\n                                        icon={faArrowUpRightAndArrowDownLeftFromCenter}\n                                    />\n                                </>\n                            ) : (\n                                <>\n                                    <img\n                                        src={\"/images/py.space-logo.svg\"}\n                                        className={\"mr-2 h-16\"}\n                                        alt=\"py.space logo\"\n                                    />\n                                    <div className={\"font-mono text-[1.8rem]\"}>\n                                        open in\n                                        <br />\n                                        py.space\n                                    </div>\n                                </>\n                            )}\n                            {expandTT}\n                        </Link>\n                    )}\n\n                    {isPopout && isPySpace && (\n                        <LinkInternal\n                            onClick={() => onClosed?.()}\n                            className={\"flex items-center px-4 text-[2.4rem] leading-none hover:text-primary-600\"}>\n                            <FontAwesomeIcon className={\"mr-2\"} icon={faArrowDownLeftAndArrowUpRightToCenter} />\n                        </LinkInternal>\n                    )}\n                </div>\n            </GadgetTitleBarWrapper>\n        );\n    }\n);\n\nexport const GadgetTitleBar = ({ className }: { className?: string }) => {\n    const editable = useSelector(getAppIsEditable);\n    return editable ? <EditableGadgetTitleBar /> : <ReadOnlyGadgetTitleBar />;\n};\n","import { useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useCommunicateWithRunner } from \"@/components/Runner\";\nimport { getAppId } from \"@/controllers/app\";\nimport { getRunMode } from \"@/controllers/runner\";\nimport { ExternalState, useExternalState } from \"@/util/external-state\";\nimport useEffectEvent from \"@/util/useEffectEvent\";\n\nexport const newTabWindowAtom = new ExternalState<WindowProxy | null>(null);\n\nexport const useRunner = () => {\n    const appId = useSelector(getAppId);\n    const src = `${document.location.origin}/ide/gadgets/${appId}/run-gui`;\n    //const src = useMasterEnvironmentOrigin();\n    const runMode = useSelector(getRunMode);\n    const [newTabWindow, setNewTabWindow] = useExternalState(newTabWindowAtom);\n    useCommunicateWithRunner(newTabWindow, src!);\n\n    const onRunModeChange = useEffectEvent(() => {\n        if (runMode === \"NEWTAB\") {\n            setNewTabWindow(window.open(src, \"\"));\n        } else {\n            newTabWindow?.close();\n            setNewTabWindow(null);\n        }\n    });\n\n    useEffect(() => {\n        onRunModeChange();\n    }, [runMode]);\n\n    useEffect(() => () => newTabWindow?.close(), []);\n\n    return newTabWindow;\n};\n","import React, { Fragment, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { connect, useDispatch, useSelector } from \"react-redux\";\nimport { faExternalLinkSquare } from \"@fortawesome/pro-light-svg-icons\";\nimport { faPlus } from \"@fortawesome/pro-regular-svg-icons/faPlus\";\nimport { faRedoAlt } from \"@fortawesome/pro-regular-svg-icons/faRedoAlt\";\nimport { faStop } from \"@fortawesome/pro-regular-svg-icons/faStop\";\nimport { faMinus, faSquare } from \"@fortawesome/pro-solid-svg-icons\";\nimport { faCircleInfo } from \"@fortawesome/pro-solid-svg-icons/faCircleInfo\";\nimport { faClock } from \"@fortawesome/pro-solid-svg-icons/faClock\";\nimport { faGlobe } from \"@fortawesome/pro-solid-svg-icons/faGlobe\";\nimport { faHourglass } from \"@fortawesome/pro-solid-svg-icons/faHourglass\";\nimport { faPlay } from \"@fortawesome/pro-solid-svg-icons/faPlay\";\nimport { faTrash } from \"@fortawesome/pro-solid-svg-icons/faTrash\";\nimport { faTrashCanClock } from \"@fortawesome/pro-solid-svg-icons/faTrashCanClock\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { EVENTS, raiseEvent } from \"@/actions\";\nimport REPL from \"@/components/bottom_panel/REPL\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport ResizePanel from \"@/components/sidebar/ResizePanel\";\nimport { LogEvent } from \"@/components/tabs/sessions/SessionLogs\";\nimport { getAppId, getAppIsEditable } from \"@/controllers/app\";\nimport { acStateStore } from \"@/controllers/app/autocompleter\";\nimport { getForms, getServerModules } from \"@/controllers/app/code\";\nimport { saveApp } from \"@/controllers/app/saving\";\nimport { createDefaultEnvironment, getNewEnvironmentURL } from \"@/controllers/environments\";\nimport { refreshNewTab, stopApp } from \"@/controllers/ide\";\nimport { alert, modal } from \"@/controllers/modals\";\nimport { getRunnerRepl } from \"@/controllers/repl\";\nimport {\n    addScheduledTask,\n    deleteScheduledTask,\n    getScheduledTasks,\n    useFormatTimeSpec,\n} from \"@/controllers/scheduledtasks\";\nimport { RunScriptResult, killScript, runScript } from \"@/controllers/websocket\";\nimport { CopyButton, Button as PySpaceButton } from \"@/pyspace/common/components/Button\";\nimport {\n    clearOutput,\n    getIsPySpace,\n    getOutput,\n    getRunMode,\n    getSessions,\n    runAppInNewTab,\n} from \"@/pyspace/gadget_editor/controllers/gadget\";\nimport { GadgetState } from \"@/pyspace/gadget_editor/store/gadget-store\";\nimport { getCurrentNavTarget } from \"@/router/navigation\";\nimport { cx } from \"@/theme/styles\";\nimport { GadgetConnectedProps, GadgetDispatch, Repl, State } from \"@/types\";\nimport { killBackgroundTask } from \"@/api\";\nimport { useExternalState } from \"@/util/external-state\";\nimport { useStoreSelector } from \"@/util/external-store\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { useMasterEnvironmentOrigin } from \"@pyspace/utils/hooks/use-master-env\";\nimport { newTabWindowAtom } from \"@pyspace/utils/hooks/use-runner\";\n\nconst BLANK_SESSION = {};\n\nimport { compressEvent } from \"@/components/tabs/sessions/SessionLogs\";\n\nfunction OutputScroller({ output }: { output: any[] }) {\n    const outputScroller = useRef<HTMLDivElement>(null);\n    const sessions = useSelector(getSessions);\n\n    useLayoutEffect(() => {\n        if (outputScroller.current) {\n            outputScroller.current.scrollTop = outputScroller.current.scrollHeight;\n        }\n    }, [output]);\n\n    let dropNextNewline = false; // Ick.\n    let lastSessionId: string | null = null;\n\n    return (\n        <div ref={outputScroller} className={cx(\"h-full overflow-auto border-t-2 border-grey-2\")}>\n            <div className={\"p-2 font-mono text-[16px] whitespace-pre\"}>\n                {output.map((event, idx) => {\n                    const evt = compressEvent(event);\n                    if (dropNextNewline && event.log_text === \"\\n\") {\n                        dropNextNewline = false;\n                        return null;\n                    }\n                    if (event.log_text !== \"\\n\") {\n                        dropNextNewline = true;\n                    }\n                    let isNewSession = false;\n                    let newSession = null;\n                    if (event.session_id !== lastSessionId) {\n                        isNewSession = true;\n                        newSession = sessions[event.session_id];\n                    }\n                    lastSessionId = event.session_id;\n                    return (\n                        <React.Fragment key={idx}>\n                            {idx !== 0 && isNewSession && <hr className={\"my-[2px]\"} />}\n                            {newSession && (\n                                <LogEvent\n                                    event={{ tp: \"session_started\", tm: newSession.timestamp }}\n                                    session={newSession}\n                                />\n                            )}\n                            <LogEvent\n                                event={evt}\n                                key={event.timestamp}\n                                session={\n                                    sessions[event.session_id] ||\n                                    BLANK_SESSION /*knownSessions[event.session_id] || {data:{func:''}}*/\n                                }\n                            />\n                        </React.Fragment>\n                    );\n                })}\n            </div>\n        </div>\n    );\n}\n\nfunction OutputFromWebSocket({ output }: { output: any[] }) {\n    const dispatch = useDispatch<GadgetDispatch>();\n    if (!output.length) return null;\n    return (\n        <>\n            <div className=\"absolute top-[0.2rem] left-2 p-[0.8rem] text-[1.6rem]\">\n                <LinkInternal icon={faTrash} onClick={() => dispatch(clearOutput())} />\n            </div>\n            <OutputScroller output={output} />\n        </>\n    );\n}\n\nconst useOutput = (currentScriptOutputOnly: boolean, scriptSessions: RunScriptResult[], setScriptSessions: unknown) => {\n    const wsOutput = useSelector(getOutput);\n    const runnerRepl = useSelector<State, Repl | undefined>(getRunnerRepl);\n\n    const [hasWsOutput, renderedWsOutput] = useMemo(() => {\n        const relevantOutput = currentScriptOutputOnly\n            ? wsOutput.filter((event) => scriptSessions.find(({ session_id }) => session_id === event.session_id))\n            : wsOutput;\n        const hasWsOutput = !!relevantOutput.length;\n        const renderedWsOutput = <OutputFromWebSocket output={relevantOutput} />;\n        return [hasWsOutput, renderedWsOutput] as const;\n    }, [currentScriptOutputOnly, scriptSessions, wsOutput]);\n\n    const renderedGuiOutput = runnerRepl ? <REPL id={runnerRepl.id} repl={runnerRepl} noninteractive /> : null;\n\n    return [hasWsOutput || !!runnerRepl, runnerRepl ? renderedGuiOutput : renderedWsOutput] as const;\n};\n\nconst connectFooter = connect((state: GadgetState) => ({\n    appId: getAppId(state)!,\n    forms: getForms(state),\n    serverModules: getServerModules(state),\n    scheduledTasks: getScheduledTasks(state),\n    isEditable: getAppIsEditable(state),\n    isPySpace: getIsPySpace(state),\n}));\n\nconst Footer = connectFooter((props: GadgetConnectedProps<typeof connectFooter> & { className?: string }) => {\n    const { appId, forms, serverModules, scheduledTasks, isEditable, isPySpace, dispatch, className } = props;\n\n    const navTarget = useSelector(getCurrentNavTarget);\n    const currentScriptName = useMemo(\n        () =>\n            navTarget?.type === \"CODE\" && navTarget.codePath.startsWith(\"scripts/\")\n                ? navTarget.codePath.substring(8)\n                : null,\n        [navTarget]\n    );\n    const masterEnvOrigin = useMasterEnvironmentOrigin();\n    const runMode = useSelector(getRunMode);\n\n    const doPublish = useCallback(async () => {\n        dispatch(\n            createDefaultEnvironment({\n                name: \"Published\",\n                url: await dispatch(getNewEnvironmentURL(\"public\")),\n                version: { ref: \"refs/heads/master\" },\n                tags: [\"pyspace\", \"default_published\"],\n            })\n        );\n    }, [masterEnvOrigin]);\n\n    const [scriptSessions, setScriptSessions] = useState<RunScriptResult[]>([]);\n    const [scriptState, setScriptState] = useState<\"idle\" | \"launching\" | \"running\" | \"stopping\">(\"idle\");\n    const [currentRun, setCurrentRun] = useState<RunScriptResult | null>(null);\n\n    const wsSessions = useSelector(getSessions);\n    const currentWsSession = useMemo(() => wsSessions[currentRun?.session_id], [wsSessions, currentRun]);\n\n    useEffect(() => {\n        if (currentWsSession?.ended) {\n            setScriptState(\"idle\");\n            setCurrentRun(null);\n        }\n    }, [currentWsSession]);\n\n    const announceAppRunning = () => {\n        dispatch(raiseEvent(EVENTS.RUN_APP));\n    };\n\n    const doRunScript = async (scriptName: string) => {\n        if (scriptState !== \"idle\") return;\n        try {\n            setScriptState(\"launching\");\n            if (isEditable) {\n                await dispatch(saveApp());\n            }\n            announceAppRunning();\n            try {\n                const r = await runScript(appId, scriptName);\n                setCurrentRun(r);\n                setScriptSessions((s) => [...s, r]);\n                setScriptState(\"running\");\n            } catch (e: any) {\n                setScriptState(\"idle\");\n                if (e.message) {\n                    await dispatch(alert(\"Cannot run script\", e.message));\n                }\n            }\n        } catch {\n            setScriptState(\"idle\");\n        }\n    };\n\n    const doStopScript = async () => {\n        if (!currentRun) return;\n        setScriptState(\"stopping\");\n        if (isEditable) {\n            // we can do this the reliable way, via the IDE API\n            await killBackgroundTask(appId, currentRun.task_id);\n        } else {\n            // gotta hope the websocket is good for it\n            await killScript(appId, currentRun.task_id);\n        }\n        setScriptState(\"idle\");\n    };\n\n    const doRunApp = useEvent(async () => {\n        if (isEditable) {\n            await dispatch(saveApp());\n        }\n        announceAppRunning();\n        await dispatch(runAppInNewTab());\n    });\n    const [runningAppWindow] = useExternalState(newTabWindowAtom);\n\n    const httpEndpoints = useStoreSelector(acStateStore, (s) => s.httpEndpoints);\n    const routes = useStoreSelector(acStateStore, (s) => s.routes);\n\n    const scheduledTask = useMemo(\n        () => scheduledTasks?.find((s) => s.task_name === `script:${currentScriptName}`),\n        [scheduledTasks, currentScriptName]\n    );\n\n    const createScheduledTask = useEvent(async () => {\n        const task = await dispatch(modal(\"scheduleScript\", { scriptName: currentScriptName }));\n        if (task) {\n            dispatch(addScheduledTask(task));\n        }\n    });\n\n    const removeScheduledTask = useEvent(() => {\n        if (scheduledTask) {\n            dispatch(deleteScheduledTask(scheduledTask));\n        }\n    });\n\n    const rightContent = useMemo(() => {\n        const content = [];\n        if (currentScriptName) {\n            if (isEditable) {\n                if (scheduledTask) {\n                    content.push(\n                        <PySpaceButton\n                            icon={faTrashCanClock}\n                            key=\"rst\"\n                            variant={\"primary\"}\n                            round\n                            elevated\n                            onClick={removeScheduledTask}>\n                            Remove Schedule\n                        </PySpaceButton>\n                    );\n                } else {\n                    content.push(\n                        <PySpaceButton\n                            key=\"cst\"\n                            icon={faClock}\n                            variant={\"primary\"}\n                            round\n                            elevated\n                            onClick={createScheduledTask}>\n                            Schedule\n                        </PySpaceButton>\n                    );\n                }\n            }\n            switch (scriptState) {\n                case \"idle\":\n                case \"launching\":\n                    content.push(\n                        <PySpaceButton\n                            key={currentScriptName}\n                            icon={scriptState === \"idle\" ? faPlay : faHourglass}\n                            disabled={scriptState !== \"idle\"}\n                            variant={\"primary\"}\n                            round\n                            elevated\n                            onClick={() => doRunScript(currentScriptName)}>\n                            {\n                                {\n                                    idle: \"Run\",\n                                    launching: \"Launching...\",\n                                }[scriptState]\n                            }\n                        </PySpaceButton>\n                    );\n                    break;\n                case \"running\":\n                case \"stopping\":\n                    content.push(\n                        <PySpaceButton\n                            key={`${currentScriptName}-stop`}\n                            icon={scriptState === \"running\" ? faStop : faHourglass}\n                            disabled={scriptState !== \"running\"}\n                            variant={\"danger\"}\n                            round\n                            elevated\n                            onClick={() => doStopScript()}>\n                            {\n                                {\n                                    running: \"Stop\",\n                                    stopping: \"Stopping...\",\n                                }[scriptState]\n                            }\n                        </PySpaceButton>\n                    );\n            }\n        } else if ((forms?.length || serverModules?.length) && (masterEnvOrigin || isEditable)) {\n            if (masterEnvOrigin) {\n                let url = masterEnvOrigin;\n                let showUnknownPathSuffix = false;\n                if (!forms?.length && serverModules?.length) {\n                    // HTTP Endpoint(s)\n                    if (httpEndpoints.length + routes.length === 1) {\n                        if (httpEndpoints.length === 1) {\n                            url += `/_/api${httpEndpoints[0].path}`;\n                            showUnknownPathSuffix = !httpEndpoints[0].path;\n                        } else if (routes.length === 1) {\n                            url += routes[0].path;\n                            showUnknownPathSuffix = !routes[0].path;\n                        }\n                    } else if (httpEndpoints.length > 0) {\n                        url += \"/_/api\";\n                        showUnknownPathSuffix = true;\n                    } else {\n                        showUnknownPathSuffix = true;\n                    }\n                }\n                content.push(\n                    <Fragment key=\"url-parts\">\n                        <div className={\"font-semibold\"}>URL:</div>\n                        <div\n                            className={\n                                \"truncate rounded-[0.4rem] border border-light-bg3 bg-white px-2 font-semibold text-primary\"\n                            }>\n                            <span className={\"select-all\"}>{url}</span>\n                            {showUnknownPathSuffix && <span className={\"select-none\"}>/{\"{path}\"}</span>}\n                        </div>\n                        {isPySpace && <CopyButton elevated size=\"small\" copyText={url} />}\n                    </Fragment>\n                );\n\n                if (forms?.length) {\n                    if (!runMode) {\n                        content.push(\n                            <PySpaceButton\n                                key=\"run\"\n                                icon={faPlay}\n                                variant={\"primary\"}\n                                round\n                                elevated\n                                onClick={() => doRunApp()}>\n                                Run\n                            </PySpaceButton>\n                        );\n                    } else {\n                        content.push(\n                            <PySpaceButton\n                                key=\"focus\"\n                                icon={faExternalLinkSquare}\n                                variant={\"light\"}\n                                round\n                                elevated\n                                onClick={() => runningAppWindow?.focus()}>\n                                Focus\n                            </PySpaceButton>\n                        );\n                        content.push(\n                            <PySpaceButton\n                                key=\"refresh\"\n                                icon={faRedoAlt}\n                                variant={\"primary\"}\n                                round\n                                elevated\n                                onClick={() => dispatch(refreshNewTab())}>\n                                Restart\n                            </PySpaceButton>\n                        );\n                        content.push(\n                            <PySpaceButton\n                                key=\"stop\"\n                                icon={faSquare}\n                                variant={\"danger\"}\n                                round\n                                elevated\n                                onClick={() => dispatch(stopApp())}>\n                                Stop\n                            </PySpaceButton>\n                        );\n                    }\n                }\n            } else {\n                content.push(\n                    <Fragment key=\"get-url\">\n                        <div className={\"font-semibold\"}>Get a URL:</div>\n                        <PySpaceButton icon={faGlobe} variant={\"primary\"} round elevated onClick={doPublish}>\n                            Publish\n                        </PySpaceButton>\n                    </Fragment>\n                );\n            }\n        }\n        return content;\n    }, [\n        currentScriptName,\n        forms,\n        serverModules,\n        masterEnvOrigin,\n        httpEndpoints,\n        routes,\n        scheduledTask,\n        runMode,\n        runningAppWindow,\n        scriptState,\n    ]);\n\n    const CLOSED_HEIGHT = 54;\n    // This silly dance is to make the footer open to the height it was last time you opened it.\n    const [openHeight, setOpenHeight] = useState<number>(200);\n    const [footerHeight, _setFooterHeight] = useState<number>(CLOSED_HEIGHT);\n    const setFooterHeight = useEvent((h: number) => {\n        _setFooterHeight(h);\n        if (h > CLOSED_HEIGHT) {\n            setOpenHeight(h);\n        }\n    });\n    const footerIsOpen = footerHeight > CLOSED_HEIGHT;\n    const toggleFooter = useEvent(() => {\n        setFooterHeight(footerIsOpen ? CLOSED_HEIGHT : openHeight);\n    });\n\n    const [hasOutput, renderedOutput] = useOutput(!!currentScriptName, scriptSessions, setScriptSessions);\n    useEffect(() => {\n        if (hasOutput) {\n            setFooterHeight(openHeight);\n        } else {\n            setFooterHeight(CLOSED_HEIGHT);\n        }\n    }, [hasOutput]);\n\n    const formattedTimeSpec = useFormatTimeSpec(scheduledTask?.time_spec);\n\n    return (\n        <ResizePanel\n            enabled={hasOutput}\n            className={\"flex flex-col\"}\n            panelSize={footerHeight}\n            onFinishDrag={setFooterHeight}\n            handleAtStart\n            handleSize={2}\n            minSize={CLOSED_HEIGHT}\n            snapToMinAtSize={90}>\n            {scheduledTask && (\n                <div\n                    className={cx(\n                        \"absolute right-[2.2rem] bottom-[calc(100%+2.2rem)]\",\n                        \"border-2 border-grey-2 bg-light-bg3 text-grey-2 shadow-pselevated2\",\n                        \"px-[2.2rem] py-[0.9rem] text-[1.6rem] font-semibold\",\n                        \"flex items-center gap-2\"\n                    )}>\n                    <FontAwesomeIcon icon={faCircleInfo} fixedWidth />\n                    <div className={\"pt-px\"}>This script will run {formattedTimeSpec}</div>\n                </div>\n            )}\n            <LinkInternal\n                className={cx(\n                    \"flex h-[54px] flex-none items-center bg-light-bg2\",\n                    !hasOutput && \"cursor-default border-t-2 border-grey-2\"\n                )}\n                onClick={hasOutput ? toggleFooter : undefined}>\n                {hasOutput && (\n                    <>\n                        <FontAwesomeIcon\n                            className={\"mx-[3px] ml-[18px]\"}\n                            fixedWidth\n                            icon={footerIsOpen ? faMinus : faPlus}\n                        />\n                        <div className={\"mx-[3px] font-semibold\"}>Output</div>\n                    </>\n                )}\n                <div className={\"flex w-full items-center justify-end gap-[18px] px-[18px]\"}>{rightContent}</div>\n            </LinkInternal>\n            <div className={\"relative h-0 flex-1\"}>{renderedOutput}</div>\n        </ResizePanel>\n    );\n});\n\nexport default Footer;\n","import React, { ReactNode, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport { Provider, useDispatch, useSelector } from \"react-redux\";\nimport { faTimes } from \"@fortawesome/pro-regular-svg-icons/faTimes\";\nimport { faCircleInfo } from \"@fortawesome/pro-solid-svg-icons/faCircleInfo\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { EVENTS, useSubscribeToDispatchEvent } from \"@/actions\";\nimport Modals from \"@/components/modals\";\nimport { ErrorBoundary, ErrorSuspenseBoundary } from \"@/components/reusable/ErrorBoundary\";\nimport Link from \"@/components/reusable/Link\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { LoadingSpinner } from \"@/components/reusable/LoadingSpinner\";\nimport ResizePanel from \"@/components/sidebar/ResizePanel\";\nimport CodeTabContent from \"@/components/tabs/CodeTab\";\nimport SecretsTab from \"@/components/tabs/SecretsTab\";\nimport PythonVersionConfig from \"@/components/tabs/settings/PythonVersionConfig\";\nimport { getAppConfig, getAppId, getAppIsEditable } from \"@/controllers/app\";\nimport { getCodeStructure } from \"@/controllers/app/code\";\nimport { recordActivity } from \"@/controllers/util\";\nimport { EditorInstanceGlobalsContext, ManagerInstanceGlobalsContext } from \"@/instance-globals\";\nimport type { CodeNavTarget, FullNavTarget, NavTarget } from \"@/router/navTypes\";\nimport { getCurrentNavTarget } from \"@/router/navigation\";\nimport { ThemeContext, cx } from \"@/theme/styles\";\nimport { PySpaceDarkTheme, PySpaceLightTheme } from \"@/theme/theme\";\nimport type {\n    AppCodeStructure,\n    AppId,\n    CodeTab,\n    CodeTabPrefs,\n    GadgetDispatch,\n    IDEAppContentWithDeps,\n    ServiceTab,\n} from \"@/types\";\nimport { EMPTY_OBJECT } from \"@/util\";\nimport { useConstant, useIsSmallScreen } from \"@/util/hooks\";\nimport { lazyComponent } from \"@/util/lazy\";\nimport { queryClient } from \"@/util/queryClient\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { Button } from \"@pyspace/common/components/Button\";\nimport { GadgetEditorEvents, Notification, UserDetails, UserProfile } from \"@pyspace/common/types\";\nimport { GadgetTitleBar } from \"@pyspace/gadget_editor/components/GadgetCrud\";\nimport {\n    GadgetEventsContext,\n    finishLoadingGadget,\n    getHiddenDescription,\n    getIsPySpaceCompatible,\n    getNavOverrides,\n    getRightPanelContent,\n    getRightPanelWidth,\n    hideDescription,\n    moveAppToAnvil,\n    setRightPanelContent,\n    setRightPanelWidth,\n    useOutputCapture,\n    useReloadWhenGadgetUpdated,\n} from \"@pyspace/gadget_editor/controllers/gadget\";\nimport { getGadgetEditorModals } from \"@pyspace/gadget_editor/modals/names/pyspace-gadget-editor-modals\";\nimport { GadgetShareState, GadgetState, createGadgetStore } from \"@pyspace/gadget_editor/store/gadget-store\";\nimport { PopoutEditor } from \"@pyspace/site/components/PopoutEditor\";\nimport { SiteProvider } from \"@pyspace/site/components/SiteProvider\";\nimport { useTakeScreenshot } from \"@pyspace/utils/hooks\";\nimport { usePySpaceKeyBindings } from \"@pyspace/utils/hooks/use-pyspace-keybindings\";\nimport { useRootElements } from \"@pyspace/utils/hooks/use-root-elements\";\nimport { useRunner } from \"@pyspace/utils/hooks/use-runner\";\nimport Footer from \"./Footer\";\n\nconst LazyCodeTabContent = lazyComponent<typeof CodeTabContent>(() => import(\"@/components/tabs/CodeTab\"), \"default\");\n\n/*\nUseful snippets:\nconst Editor = editorConnector(({app}: AnvilConnectedProps<typeof editorConnector>) => {\n    useOutputCapture(app?.id);\n\n    const ref = useRef<HTMLDivElement>(null);\n    const heightContextValue = useModalHeightsContextValue(ref);\n\n    return <ModalHeightContext.Provider value={heightContextValue}>\n\n */\n\n// returns [leftView, rightView]\nconst useSelectedView = () => {\n    const navTarget = useSelector(getCurrentNavTarget);\n    const rightPanelContent = useSelector(getRightPanelContent);\n    const isSmallScreen = useIsSmallScreen();\n    const showMainContent = !isSmallScreen || !rightPanelContent;\n    return useMemo<{ isServerCode: boolean; isClientCode: boolean; isScript: boolean; isDesign: boolean }>(\n        () => ({\n            isServerCode:\n                showMainContent && navTarget?.type === \"CODE\" && navTarget.codePath.startsWith(\"server_modules/\"),\n            isClientCode:\n                showMainContent &&\n                navTarget?.type === \"CODE\" &&\n                navTarget.codePath.startsWith(\"forms/\") &&\n                !navTarget.view?.design,\n            isScript: showMainContent && navTarget?.type === \"CODE\" && navTarget.codePath.startsWith(\"scripts/\"),\n            isDesign:\n                showMainContent &&\n                navTarget?.type === \"CODE\" &&\n                navTarget.codePath.startsWith(\"forms/\") &&\n                (navTarget.view?.design as boolean),\n        }),\n        [navTarget, showMainContent]\n    );\n};\n\ntype FullCodeNavTarget = CodeNavTarget & FullNavTarget;\n\nfunction makeNavTarget(\n    codeStructure: AppCodeStructure,\n    key: keyof AppCodeStructure,\n    options: { appId: AppId } & Partial<CodeNavTarget>,\n    formOverrides: GadgetState[\"navOverrides\"][\"form\"]\n) {\n    const structuredItem = codeStructure[key].children.at(0);\n    if (structuredItem) {\n        formOverrides ??= {\n            codePath: structuredItem.codePath,\n            editingPath: undefined,\n            topLevelFormClassName: undefined,\n        };\n        return {\n            type: \"CODE\",\n            ...formOverrides,\n            ...options,\n        } satisfies FullCodeNavTarget;\n    }\n}\n\nexport const getNavTargets = (\n    appId: AppId,\n    codeStructure: AppCodeStructure,\n    navOverrides?: GadgetState[\"navOverrides\"]\n) => {\n    const codeTabPrefs: CodeTabPrefs = { showCodeSnippets: false, showDesignerToolbox: true };\n    const options = { appId, codeTabPrefs };\n\n    return {\n        script: makeNavTarget(\n            codeStructure,\n            \"scripts\",\n            { ...options, view: { design: false, code: navOverrides?.cursor?.script ?? true } },\n            undefined\n        ),\n        serverModule: makeNavTarget(\n            codeStructure,\n            \"serverCode\",\n            { ...options, view: { design: false, code: navOverrides?.cursor?.server ?? true } },\n            undefined\n        ),\n        clientCode: makeNavTarget(\n            codeStructure,\n            \"clientCode\",\n            { ...options, view: { design: false, code: navOverrides?.cursor?.client ?? true } },\n            navOverrides?.form\n        ),\n        design: makeNavTarget(\n            codeStructure,\n            \"clientCode\",\n            { ...options, view: { design: true, code: false } },\n            navOverrides?.form\n        ),\n    };\n};\n\nconst useNavTargets = () => {\n    const codeStructure = useSelector(getCodeStructure);\n    const appId = useSelector(getAppId);\n    const navOverrides = useSelector(getNavOverrides);\n    return useMemo(() => getNavTargets(appId!, codeStructure, navOverrides), [appId, codeStructure, navOverrides]);\n};\n\nconst NavLink = ({\n    to,\n    selected,\n    className,\n    children,\n    onClick,\n    onClickOverrideNav,\n}: {\n    to?: NavTarget;\n    selected: boolean;\n    className?: string;\n    children?: React.ReactNode;\n    onClick?: () => void;\n    onClickOverrideNav?: () => any;\n}) =>\n    (to ?? onClickOverrideNav) ? (\n        <Link\n            className={cx(\n                \"shrink grow-0 cursor-pointer truncate border-r border-r-grey-1 px-[20px] py-[8px] first:ml-0 first:border-l-0 last:border-r-0\",\n                selected &&\n                    \"-mx-px mb-[-2px] flex-none border-r-2 border-grey-2! bg-light-bg0 pl-[19px] not-first:border-l-2! first:pl-[20px] last:mr-[0px]\",\n                className\n            )}\n            onClick={onClick}\n            onClickOverrideNav={onClickOverrideNav}\n            to={to}>\n            {children}\n        </Link>\n    ) : (\n        <></>\n    );\n\nconst GadgetNavBar = ({ className }: { className: string }) => {\n    const { isScript, isServerCode, isClientCode, isDesign } = useSelectedView();\n    const { script, serverModule, clientCode, design } = useNavTargets();\n\n    const rightPanelContent = useSelector(getRightPanelContent);\n    const dispatch = useDispatch<GadgetDispatch>();\n    const isSmallScreen = useIsSmallScreen();\n    const onClick = useEvent(() => {\n        if (isSmallScreen) {\n            dispatch(setRightPanelContent(() => null));\n        }\n    });\n    return (\n        <div className={cx(className, \"flex flex-row border-b-2 border-b-grey-2 bg-light-bg3\")}>\n            <NavLink to={script} selected={isScript} onClick={onClick}>\n                Script\n            </NavLink>\n            <NavLink to={serverModule} selected={isServerCode} onClick={onClick}>\n                Server\n            </NavLink>\n            <NavLink to={clientCode} selected={isClientCode} onClick={onClick}>\n                Client\n            </NavLink>\n            <NavLink to={design} selected={isDesign} onClick={onClick}>\n                Design\n            </NavLink>\n            <div className={\"grow\"} />\n            <NavLink\n                className={\"border-l border-l-grey-1\"}\n                onClickOverrideNav={() => dispatch(setRightPanelContent((c) => (c === \"packages\" ? null : \"packages\")))}\n                selected={rightPanelContent === \"packages\"}>\n                Packages\n            </NavLink>\n            <NavLink\n                onClickOverrideNav={() => dispatch(setRightPanelContent((c) => (c === \"secrets\" ? null : \"secrets\")))}\n                selected={rightPanelContent === \"secrets\"}>\n                Secrets\n            </NavLink>\n        </div>\n    );\n};\n\nconst TabContent = ({ selected, children }: { selected: boolean; children?: ReactNode }) => {\n    const [hasEverBeenSelected, setHasEverBeenSelected] = useState(selected);\n    if (selected && !hasEverBeenSelected) {\n        setHasEverBeenSelected(true);\n    }\n    if (!(selected || hasEverBeenSelected)) return null;\n    return (\n        <div\n            className={cx(\"offset-vscrollbar absolute h-full w-full\", {\n                \"pointer-events-none invisible\": !selected,\n            })}>\n            <ErrorSuspenseBoundary fallback={<LoadingSpinner />}>{children}</ErrorSuspenseBoundary>\n        </div>\n    );\n};\n\nconst useGadgetTabs = () => {\n    const navTargets = useNavTargets();\n\n    return useMemo(() => {\n        const { script, serverModule, clientCode, design } = navTargets;\n        const codeTabPrefs = design?.codeTabPrefs;\n        return {\n            scriptTab: script && ({ id: 0, navTarget: script, codeTabPrefs, itemType: \"script\" } satisfies CodeTab),\n            serverModuleTab:\n                serverModule &&\n                ({\n                    id: 1,\n                    navTarget: serverModule,\n                    codeTabPrefs,\n                    itemType: \"server_module\",\n                } satisfies CodeTab),\n            clientCodeTab:\n                clientCode &&\n                ({\n                    id: 2,\n                    navTarget: clientCode,\n                    codeTabPrefs,\n                    itemType: \"form\",\n                } satisfies CodeTab),\n            designTab: design && ({ id: 3, navTarget: design, codeTabPrefs, itemType: \"form\" } satisfies CodeTab),\n            secretsTab: {\n                id: 5,\n                navTarget: { type: \"SERVICE\", service: \"SECRETS\" },\n            } satisfies ServiceTab,\n        } as const;\n    }, [navTargets]);\n};\n\nconst EditorContent = ({ className }: { className?: string }) => {\n    const isSmallScreen = useIsSmallScreen();\n    const { isScript, isServerCode, isClientCode, isDesign } = useSelectedView();\n    const { scriptTab, serverModuleTab, clientCodeTab, designTab, secretsTab } = useGadgetTabs();\n    const rightPanelWidth = useSelector(getRightPanelWidth);\n    const rightPanelContent = useSelector(getRightPanelContent);\n    const hiddenDescription = useSelector(getHiddenDescription);\n    const isEditable = useSelector(getAppIsEditable);\n    const appConfig = useSelector(getAppConfig);\n    const dispatch = useDispatch<GadgetDispatch>();\n    const onFinishResizeRightPanel = useEvent((newWidth: number) => {\n        if (newWidth === 0) {\n            dispatch(setRightPanelContent(() => null));\n        } else {\n            dispatch(setRightPanelWidth(newWidth));\n        }\n    });\n\n    const [ref, designerScreenShot] = useTakeScreenshot({\n        isGUI: !!designTab,\n        designTabId: designTab?.id,\n        enabled: !!isEditable,\n    });\n    const rightPanelChildren = rightPanelContent && (\n        <>\n            <TabContent key=\"packages\" selected={rightPanelContent === \"packages\"}>\n                <PythonVersionConfig />\n            </TabContent>\n            <TabContent key=\"secrets\" selected={rightPanelContent === \"secrets\"}>\n                <SecretsTab tab={secretsTab} selected={rightPanelContent === \"secrets\"} isPySpace />\n            </TabContent>\n        </>\n    );\n\n    return (\n        <div ref={ref} className={cx(\"relative flex\", className)}>\n            <div className={\"relative flex-1\"}>\n                {scriptTab && (\n                    <TabContent key={\"script\"} selected={isScript}>\n                        <LazyCodeTabContent tab={scriptTab} selected={isScript} isPySpace />\n                    </TabContent>\n                )}\n                {serverModuleTab && (\n                    <TabContent key=\"server\" selected={isServerCode}>\n                        <LazyCodeTabContent tab={serverModuleTab} selected={isServerCode} isPySpace />\n                    </TabContent>\n                )}\n                {clientCodeTab && (\n                    <TabContent key=\"client\" selected={isClientCode}>\n                        <LazyCodeTabContent tab={clientCodeTab} selected={isClientCode} isPySpace />\n                    </TabContent>\n                )}\n                {designTab && (\n                    <TabContent key=\"design\" selected={isDesign}>\n                        <LazyCodeTabContent tab={designTab} selected={isDesign} isPySpace />\n                        {designerScreenShot}\n                    </TabContent>\n                )}\n                {!hiddenDescription && appConfig?.metadata?.description && !isEditable && (\n                    <div\n                        className={cx(\n                            \"absolute top-[2.2rem] right-[2.2rem] max-w-[50%]\",\n                            \"border-2 border-grey-2 bg-light-bg3 text-grey-2 shadow-pselevated2\",\n                            \"p-[1.2rem] text-[1.6rem] font-semibold\",\n                            \"z-50 flex items-start gap-2\"\n                        )}>\n                        <FontAwesomeIcon className={\"pt-[0.4rem]\"} icon={faCircleInfo} fixedWidth />\n                        <div>{appConfig.metadata.description}</div>\n                        <LinkInternal className={\"pt-[0.3rem]\"} onClick={() => dispatch(hideDescription())}>\n                            <FontAwesomeIcon icon={faTimes} fixedWidth />\n                        </LinkInternal>\n                    </div>\n                )}\n            </div>\n            {rightPanelContent &&\n                (isSmallScreen ? (\n                    rightPanelChildren\n                ) : (\n                    <ResizePanel\n                        className={\"min-w-0!\"}\n                        horizontal\n                        handleAtStart\n                        panelSize={rightPanelWidth}\n                        onFinishDrag={onFinishResizeRightPanel}\n                        minSize={0}>\n                        {rightPanelChildren}\n                    </ResizePanel>\n                ))}\n        </div>\n    );\n};\n\nconst GadgetEditorContent = () => {\n    const dispatch = useDispatch<GadgetDispatch>();\n    const isCompatible = useSelector(getIsPySpaceCompatible);\n    const appId = useSelector(getAppId)!;\n    const isEditable = useSelector(getAppIsEditable);\n\n    useRunner();\n    useOutputCapture(appId);\n    usePySpaceKeyBindings(appId);\n    useReloadWhenGadgetUpdated();\n    const { onSaved } = useContext(GadgetEventsContext);\n    useSubscribeToDispatchEvent(EVENTS.SAVED_APP, () => onSaved?.(appId));\n\n    return (\n        <>\n            <div\n                className={\"absolute inset-x-0 inset-y-0 flex flex-col overflow-hidden bg-light-bg0 text-[1.6rem]\"}\n                style={{ fontFamily: '\"Source Sans 3\", Verdana, Geneva, Tahoma, sans-serif' }}>\n                {isCompatible ? (\n                    <>\n                        <GadgetTitleBar className={\"flex-none border-b-2 border-b-black p-3 text-[2.4rem]\"} />\n                        <GadgetNavBar className={\"flex-none border-b-2\"} />\n                        <EditorContent className={\"grow\"} />\n                        <Footer className={\"flex-none border-t-2\"} />\n                    </>\n                ) : (\n                    <div className={\"p-[6.4rem] text-center\"}>\n                        This app has been edited in Anvil, and is now more complex than what we can display here.\n                        {isEditable && (\n                            <Button onClick={() => dispatch(moveAppToAnvil())}>\n                                Move this app to Anvil and open it there\n                            </Button>\n                        )}\n                    </div>\n                )}\n            </div>\n            <Modals modalTypes={getGadgetEditorModals()} />\n        </>\n    );\n};\n\nexport interface AppSpec {\n    id: AppId;\n    name: string;\n    edit_session: string;\n    origins: any;\n    content: IDEAppContentWithDeps;\n    edit_state: any;\n    version: string;\n    environments: any[];\n    sharing: GadgetShareState;\n    liked: boolean;\n    n_likes: number;\n    n_forks: number;\n}\n\nexport const GadgetEditor = ({\n    gadget,\n    loggedInUser,\n    ownerProfile,\n    notifications,\n    events,\n    isEmbedded,\n    isPySpace, // Is this gadget editor on py.space?\n    isPopout,\n}: {\n    gadget: AppSpec;\n    loggedInUser?: UserDetails;\n    ownerProfile: UserProfile;\n    notifications?: Notification[];\n    events?: GadgetEditorEvents;\n    isEmbedded?: boolean;\n    isPySpace?: boolean;\n    isPopout?: boolean;\n}) => {\n    const store = useConstant(() => {\n        const store = createGadgetStore(\n            gadget,\n            ownerProfile,\n            loggedInUser,\n            notifications,\n            isEmbedded,\n            isPySpace,\n            isPopout\n        );\n        store.dispatch(finishLoadingGadget(gadget));\n        window.store = store;\n        return store;\n    });\n\n    useEffect(() => {\n        store.dispatch(recordActivity(\"openApp\", { pySpace: true, popout: isPopout }));\n    }, [gadget.id]);\n\n    const [rootElements, rootRefCallback, ddRootRefCallback] = useRootElements(gadget);\n\n    const isDark = false;\n\n    return (\n        <Provider store={store}>\n            <QueryClientProvider client={queryClient}>\n                <ManagerInstanceGlobalsContext.Provider value={rootElements}>\n                    <EditorInstanceGlobalsContext.Provider value={rootElements}>\n                        <ThemeContext.Provider value={isDark ? PySpaceDarkTheme : PySpaceLightTheme}>\n                            <GadgetEventsContext.Provider value={events ?? (EMPTY_OBJECT as GadgetEditorEvents)}>\n                                <ErrorBoundary>\n                                    <GadgetEditorContent />\n                                    {/*Yes, the below is gross, but works everywhere we want it for now:*/}\n                                    <div className={\"absolute top-0 left-0 w-full\"} ref={rootRefCallback} />\n                                    <div className={\"fixed top-0 left-0 w-full\"} ref={ddRootRefCallback} />\n                                    {/* <ReactQueryDevtools /> */}\n                                </ErrorBoundary>\n                            </GadgetEventsContext.Provider>\n                        </ThemeContext.Provider>\n                    </EditorInstanceGlobalsContext.Provider>\n                </ManagerInstanceGlobalsContext.Provider>\n            </QueryClientProvider>\n        </Provider>\n    );\n};\n\nexport const InternalEmbeddedContext = React.createContext<{\n    setShouldPopout: React.Dispatch<React.SetStateAction<boolean>>;\n}>({ setShouldPopout: () => {} });\n\nexport const InternalPySpaceEmbeddedGadgetEditor = ({\n    gadget,\n    loggedInUser,\n    ownerProfile,\n}: {\n    gadget: AppSpec;\n    loggedInUser: UserDetails;\n    ownerProfile: UserProfile;\n}) => {\n    const [shouldPopout, setShouldPopout] = useState(false);\n    const events = useMemo(\n        () => ({\n            onClosed: () => setShouldPopout(false),\n        }),\n        []\n    );\n    return (\n        <InternalEmbeddedContext.Provider value={{ setShouldPopout }}>\n            <div className={\"relative h-full\"}>\n                ]\n                {shouldPopout ? (\n                    <SiteProvider initialStoreState={{ userDetails: loggedInUser }}>\n                        <PopoutEditor gadget={gadget} ownerProfile={ownerProfile} events={events} />\n                    </SiteProvider>\n                ) : (\n                    <GadgetEditor\n                        gadget={gadget}\n                        ownerProfile={ownerProfile}\n                        loggedInUser={loggedInUser}\n                        isEmbedded={true}\n                        isPySpace={true}\n                    />\n                )}\n            </div>\n        </InternalEmbeddedContext.Provider>\n    );\n};\n\nexport const MissingEmbeddedGadgetEditor = () => (\n    <div className={\"flex h-full flex-col justify-center bg-white p-4 text-center text-[2rem]\"}>\n        This widget has been deleted or made private.\n    </div>\n);\n","import { createContext } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { createSelector } from \"reselect\";\nimport { getClientCodeStructure, getCodeStructure, itemTypeFromCodePath } from \"@/controllers/app/code\";\nimport { updatePackageName } from \"@/controllers/dependencies\";\nimport { createEnvironment, getNewEnvironmentURL } from \"@/controllers/environments\";\nimport { debugStateUpdate, runnerReplStateUpdate } from \"@/controllers/ide\";\nimport { alert, confirm, modal } from \"@/controllers/modals\";\nimport { createRepl, getRunnerRepl } from \"@/controllers/repl\";\nimport { WebsocketEvent, useWebsocketEventListener } from \"@/controllers/websocket\";\nimport { GadgetEditorEvents } from \"@/pyspace/common/types\";\nimport { forceImageToSizeAndType } from \"@/pyspace/common/util/image-resize\";\nimport * as pyspaceApi from \"@/pyspace/pyspace-api\";\nimport { FullNavTarget } from \"@/router/navTypes\";\nimport {\n    AnvilAction,\n    AppId,\n    CodeTab,\n    GadgetAction,\n    GadgetAsyncAction,\n    GadgetDispatch,\n    State,\n    StructureItem,\n    Tab,\n} from \"@/types\";\nimport { EMPTY_ARRAY } from \"@/util\";\nimport * as api from \"@/api\";\nimport { createContextHook } from \"@/util/hooks\";\nimport {\n    getApp,\n    getAppConfig,\n    getAppId,\n    getAppIsEditable,\n    getAppName,\n    getAppPackageName,\n    resetAppState,\n    updateAppConfig,\n} from \"../../../controllers/app\";\nimport { AppSpec, getNavTargets } from \"../components/GadgetEditor\";\nimport { GadgetShareState, GadgetState } from \"../store/gadget-store\";\n\nexport const GadgetEventsContext = createContext<GadgetEditorEvents>({});\nexport const useGadgetEvents = createContextHook(GadgetEventsContext, \"gadgetEvents\");\n\nexport const finishLoadingGadget =\n    (appSpec: AppSpec): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        console.log(\"Loading gadget with edit state\", appSpec.edit_state);\n        await dispatch(resetAppState(appSpec.id, appSpec.content, appSpec.edit_state, appSpec.version));\n        const { clientCode, serverModule, script, design } = getNavTargets(appSpec.id, getCodeStructure(getState()));\n        updateState((state) => {\n            state.app!.$loaded = true;\n            state.currentNavTarget = design || script || serverModule || clientCode;\n        });\n    };\n\nexport const resetAppToInitialContent = (): GadgetAsyncAction => async (dispatch, getState, updateState) => {\n    const state = getState();\n    const appSpec = state.gadget.unmodifiedAppSpec;\n    await dispatch(resetAppState(appSpec.id, appSpec.content, appSpec.edit_state, appSpec.version));\n    updateState((s) => {\n        s.gadget.forceReload++;\n    });\n};\n\nexport const setCurrentTab =\n    (target: FullNavTarget): GadgetAction =>\n    (dispatch, getState, updateState) => {\n        updateState((state) => {\n            // TODO: Make this work on other tab types when required.\n            const targetType = target.type;\n            const targetTab = state.tabs.find(({ navTarget }) =>\n                navTarget.type === \"CODE\" && targetType === \"CODE\"\n                    ? navTarget.codePath === target.codePath\n                    : navTarget.type === \"SERVICE\" && targetType === \"SERVICE\"\n                      ? navTarget.service === target.service\n                      : navTarget.type === \"SETTINGS\" && targetType === \"SETTINGS\"\n                        ? navTarget.section === target.section\n                        : false\n            );\n            if (targetTab) {\n                state.currentTabId = targetTab.id;\n                targetTab.navTarget = target as any;\n            } else {\n                state.currentTabId = null;\n            }\n        });\n    };\n\nexport const renameGadget =\n    (id: string, newName: string, gadgetEvents: GadgetEditorEvents): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const state = getState();\n        const appName = getAppName(state);\n        const appPackageName = getAppPackageName(state);\n        const oldDefaultPackageName = appName && appName.replace(/[^A-z0-9]/g, \"_\").replace(/^[0-9]/, \"_$&\");\n        const defaultPackageName = newName.replace(/[^A-z0-9]/g, \"_\").replace(/^[0-9]/, \"_$&\");\n        if (\n            appPackageName === appName ||\n            appPackageName === defaultPackageName ||\n            appPackageName === oldDefaultPackageName ||\n            !appPackageName\n        ) {\n            dispatch(updatePackageName(defaultPackageName));\n        }\n\n        const n = (await api.setAppName(id, newName))?.name;\n        updateState((s) => {\n            s.app.name = n;\n        });\n        gadgetEvents.onRenamed?.(id, n);\n    };\n\nexport const deleteGadget =\n    (id: string, gadgetEvents: GadgetEditorEvents): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        await api.deleteApp(id);\n        gadgetEvents.onDeleted?.(id);\n    };\n\nexport const setGadgetDescription =\n    (id: string, newDescription: string, gadgetEvents: GadgetEditorEvents): GadgetAsyncAction =>\n    async (dispatch) => {\n        await dispatch(updateAppConfig([\"metadata\", \"description\"], newDescription));\n        const truncatedDescr =\n            newDescription.length > 2000 ? newDescription.substring(0, 1997) + \"...\" : newDescription;\n        await pyspaceApi.setGadgetDescription(id, truncatedDescr);\n        gadgetEvents.onChangedDescription?.(id, truncatedDescr);\n    };\n\nexport const createGadgetThumbnailFromBlob =\n    (id: string, gadgetEvents: GadgetEditorEvents, thumbnail: Blob, isScreenShot?: boolean): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const resizedThumbnail = await forceImageToSizeAndType(thumbnail, \"image/png\", 200000);\n        await pyspaceApi.setGadgetThumbnail(id, resizedThumbnail);\n        updateState(({ gadget }) => {\n            gadget.forceReloadThumbnail++;\n        });\n        gadgetEvents.onChangedThumbnail?.(id);\n        const url = new URL(\"embed/thumbnail/\" + id, window.location.origin);\n        if (isScreenShot) {\n            url.searchParams.set(\"s\", \"1\");\n            url.searchParams.set(\"t\", String(Date.now()));\n        }\n        // console.log(\"%cNEW IMAGE\", \"color:hotpink;\", url.toString());\n        // don't force a save - do this as part of the normal save queue\n        await dispatch(updateAppConfig([\"metadata\", \"logo_img\"], url.toString(), { force: false }));\n    };\n\nexport const uploadGadgetThumbnail =\n    (id: string, gadgetEvents: GadgetEditorEvents): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const thumbnail = await dispatch(\n            modal(\"uploadFile\", {\n                title: \"Choose thumbnail\",\n                prompt: \"This image will be used as the thumbnail for your widget.\\n\\n\",\n            })\n        );\n        if (!thumbnail) {\n            return;\n        }\n        dispatch(createGadgetThumbnailFromBlob(id, gadgetEvents, thumbnail));\n    };\n\nconst handleRepoUpdateEvent =\n    (e: WebsocketEvent): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        console.log(\"WS event:\", e);\n        const state = getState() as State; // typing hack\n        if (\n            e.event === \"REPO_INVALIDATE\" ||\n            (e.event === \"REPO_UPDATE\" &&\n                e.ref_update?.ref === \"refs/heads/master\" &&\n                e.ref_update[\"save-seq\"]?.session !== getApp(state).editSession)\n        ) {\n            console.log(\"Websocket signal: Time to update the repo\", e);\n            const appSpec = await pyspaceApi.loadGadget(getAppId(state));\n            await dispatch(finishLoadingGadget(appSpec));\n        }\n    };\n\nexport const useReloadWhenGadgetUpdated = () => {\n    const dispatch = useDispatch<GadgetDispatch>();\n    const appId = useSelector(getAppId);\n    useWebsocketEventListener(appId, (e) => dispatch(handleRepoUpdateEvent(e)), undefined, { only_branch: \"master\" });\n};\n\nconst handleSessionEvents =\n    (e: WebsocketEvent): AnvilAction =>\n    (dispatch, getState, updateState) => {\n        // console.log(\"Event:\", e);\n        if (e.event === \"LOG_EVENT\") {\n            updateState(({ output }) => {\n                output.push(e);\n            });\n            if (e.type === \"background_task_ended\") {\n                updateState(({ sessions }) => {\n                    sessions[e.session_id].ended = true;\n                });\n            }\n        } else if (e.event === \"SESSION_START\") {\n            updateState(({ sessions }) => {\n                sessions[e.session_id] = e;\n            });\n        }\n    };\n\nexport const useOutputCapture = (appId: AppId) => {\n    const dispatch = useDispatch<GadgetDispatch>();\n    const editable = useSelector(getAppIsEditable);\n    useWebsocketEventListener(appId, (e) => dispatch(handleSessionEvents(e)), undefined, {\n        log_events: editable,\n        only_branch: \"master\",\n    });\n};\n\nexport const clearOutput = (): GadgetAsyncAction => async (dispatch, getState, updateState) => {\n    updateState(({ output }) => {\n        output.length = 0;\n    });\n};\n\nexport const createPublicOrigin = (): GadgetAsyncAction => async (dispatch, getState) => {\n    const state = getState();\n    const appId = getAppId(state);\n    await dispatch(\n        createEnvironment({\n            app_id: appId,\n            version: { ref: \"refs/heads/master\" },\n            url: await dispatch(getNewEnvironmentURL(\"public\")),\n            run_scheduled_tasks: true,\n        })\n    );\n};\n\nexport const setShareState =\n    (sharing: GadgetShareState, events: GadgetEditorEvents): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const state = getState();\n        const appId = getAppId(state)!;\n        await pyspaceApi.setSharing(appId, sharing);\n        updateState(({ gadget }) => {\n            gadget.sharing = sharing;\n        });\n        events.onShared?.(appId, sharing);\n    };\n\nexport const setLikedGadget =\n    (like: boolean): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const state = getState();\n        const appId = getAppId(state)!;\n        if (getIsLoggedIn(state)) {\n            const { liked } = await pyspaceApi.setLiked(appId, like);\n            updateState(({ gadget }) => {\n                gadget.liked = liked;\n                gadget.nLikes += like ? 1 : -1;\n            });\n            return true;\n        } else if (state.gadget.isEmbedded) {\n            window.open(`${window.location.origin}/login?then=/g/${appId}`);\n        } else {\n            console.log(\"Embedded: NOP\", state.gadget);\n            window.location.href = `/login?then=/g/${appId}`;\n        }\n    };\n\nlet nextTabId = 1;\n\nexport const getAllTabs = createSelector(\n    [(s) => getAppId(s)!, (s) => getAppConfig(s), (s) => getCodeStructure(s)],\n    (appId, appConfig, codeStructure) => {\n        const tabs: Tab[] = [];\n        function walkStructure(items: StructureItem[]) {\n            for (const item of items) {\n                const tab: CodeTab = {\n                    id: nextTabId++,\n                    navTarget: {\n                        appId,\n                        type: \"CODE\",\n                        codePath: item.codePath,\n                        editingPath: [],\n                    },\n                    itemType: itemTypeFromCodePath(item.codePath),\n                    codeTabPrefs: {\n                        showCodeSnippets: false,\n                        showDesignerToolbox: true,\n                    },\n                    title: item.name,\n                };\n                tabs.push(tab);\n                if (item.children) {\n                    walkStructure(item.children);\n                }\n            }\n        }\n        walkStructure(codeStructure.serverCode.children);\n        walkStructure(codeStructure.clientCode.children);\n        walkStructure(codeStructure.scripts.children);\n\n        if (appConfig.services.find((s) => s.source === \"/runtime/services/anvil/secrets.yml\")) {\n            tabs.push({\n                id: nextTabId++,\n                title: \"Secrets\",\n                navTarget: {\n                    appId,\n                    type: \"SERVICE\",\n                    service: \"SECRETS\",\n                },\n            });\n        }\n\n        console.log(\"Runtime options:\", appConfig?.runtime_options);\n        if (appConfig.runtime_options?.server_spec?.requirements != null) {\n            tabs.push({\n                id: nextTabId++,\n                section: \"RUNTIME\",\n                title: \"Packages\",\n                navTarget: {\n                    appId,\n                    type: \"SETTINGS\",\n                    section: \"RUNTIME\",\n                },\n            });\n        }\n\n        return tabs;\n    }\n);\n\nexport const openInAnvil =\n    (id): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        //modal that says you're laving py.space. bye bye\n        if (\n            await dispatch(\n                confirm(\n                    \"Leaving py.space\",\n                    \"You’re about to open your py.space widget as an Anvil app. If you add any Anvil-only features to your widget, you will no longer be able to open it in py.space.\",\n                    \"Confirm\"\n                )\n            )\n        ) {\n            window.open(`/ide/gadgets/${id}/open-in-anvil`);\n        }\n    };\n\nexport const moveAppToAnvil = (): GadgetAsyncAction => async (dispatch, getState, updateState) => {\n    const state = getState();\n    console.log(state);\n    const appId = getAppId(state as State)!;\n    console.log(\"App ID = \", appId);\n    window.open(`https://anvil.works/build/apps/${appId}`);\n    //This is an Anvil app. You can <a href={} target={\"_blank\"}>open it in Anvil.</a>\n    await pyspaceApi.markAsNotAGadget(appId);\n};\n\nexport const runAppInNewTab = (): GadgetAsyncAction => async (dispatch, getState, updateState) => {\n    const runnerRepl = getRunnerRepl(getState());\n    if (!runnerRepl) {\n        // creating a new repl opens and focuses it\n        await dispatch(createRepl(\"runner\"));\n    }\n    updateState((state) => {\n        runnerReplStateUpdate(state);\n        debugStateUpdate(state, \"NEWTAB\");\n    });\n};\n\nexport const reportGadgetAbuse = (): GadgetAsyncAction => async (dispatch, getState) => {\n    const state = getState();\n    const gadgetId = getAppId(state),\n        gadgetName = getAppName(state);\n    const reportMessage = await dispatch(modal(\"reportAbuse\", { type: \"gadget\", gadgetId, gadgetName }));\n    if (reportMessage != null) {\n        await pyspaceApi.reportGadgetAbuse(gadgetId, reportMessage);\n        await dispatch(alert(\"Report submitted\", \"Thank-you for helping to make py.space a more welcoming place.\"));\n    }\n};\n\nexport const getHasForms = createSelector([(s) => getClientCodeStructure(s)], (codeStructure) => {\n    function walk(items: StructureItem[]) {\n        for (const item of items) {\n            if (item.type === \"form\" || (item.children && walk(item.children))) {\n                return true;\n            }\n        }\n        return false;\n    }\n    return walk(codeStructure.children);\n});\n\nexport const getIsPySpaceCompatible = createSelector(\n    [(s) => getCodeStructure(s), (s) => getAppConfig(s)],\n    ({ serverCode, clientCode, scripts }, { services }) => {\n        const hasExtraServices = services?.find(\n            ({ source }) =>\n                source !== \"/runtime/services/anvil/secrets.yml\" &&\n                source !== \"/runtime/services/tables.yml\" &&\n                source !== \"/runtime/services/anvil/email.yml\"\n        );\n        const hasAServerModule = serverCode?.children.length === 1 && serverCode.children[0].type === \"server_module\";\n        const hasNoServerCode = !serverCode?.children.length;\n        const hasAScript = scripts?.children.length === 1;\n        const hasNoScripts = !scripts?.children.length;\n        const hasAForm = clientCode.children.length === 1 && clientCode.children[0].type === \"form\";\n        const hasNoClientCode = !clientCode.children.length;\n\n        return (\n            !hasExtraServices &&\n            /* SCRIPT */ ((hasAScript && hasNoClientCode && hasNoServerCode) ||\n                /* GUI APP */ (hasAForm && hasNoScripts && (hasAServerModule || hasNoServerCode)) ||\n                /* HTTP ENDPOINT */ (hasAServerModule && hasNoClientCode && hasNoScripts))\n        );\n    }\n);\n\nexport const getIsScript = createSelector(\n    [(s) => getCodeStructure(s)],\n    ({ serverCode, clientCode, scripts }) =>\n        !!(scripts?.children.length && !serverCode?.children.length && !clientCode?.children.length)\n);\n\nexport const getOutput = (state: GadgetState) => state.output;\nexport const getSessions = (state: GadgetState) => state.sessions;\n\nexport const getTabs = (state: GadgetState) => state.tabs;\nexport const getCurrentTabId = (state: GadgetState) => state.currentTabId;\nexport const getCurrentTab = (state: GadgetState) => state.tabs.find((t) => t.id === state.currentTabId) || null;\nexport const getGadgetDetails = (state: GadgetState) => state.gadget;\nexport const getShareState = (state: GadgetState) => state.gadget.sharing;\nexport const getGadgetOwner = (state: GadgetState) => state.gadget.owner;\nexport const getGadgetLiked = (state: GadgetState) => state.gadget.liked;\nexport const getIsLoggedIn = (state: GadgetState) => !!state.user?.email;\nexport const getUser = (state: GadgetState) => state.user;\nexport const getNotifications = (state: GadgetState) =>\n    state.notifications || (EMPTY_ARRAY as NonNullable<GadgetState[\"notifications\"]>);\n\nexport const getForceReloadSignal = (state: GadgetState) => state.gadget.forceReload; // TODO extremely crude\nexport const getForceReloadThumbnailSignal = (state: GadgetState) => state.gadget.forceReloadThumbnail;\nexport const getIsEmbedded = (state: GadgetState) => state.gadget.isEmbedded;\nexport const getIsPySpace = (state: GadgetState) => state.gadget.isPySpace;\nexport const getIsPopout = (state: GadgetState) => state.gadget.isPopout;\n\nexport const setNavOverrides =\n    (overrides: GadgetState[\"navOverrides\"]): GadgetAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        updateState((state) => {\n            state.navOverrides = overrides;\n        });\n    };\n\nexport const getNavOverrides = (state: GadgetState) => state.navOverrides;\n\nexport const setRightPanelWidth =\n    (width: number): GadgetAction =>\n    (dispatch, getState, updateState) =>\n        updateState((s) => {\n            s.rightPanelWidth = width;\n        });\n\nexport const getRightPanelWidth = (state: GadgetState) => state.rightPanelWidth;\n\nexport const setRightPanelContent =\n    (updater: (s: GadgetState[\"rightPanelContent\"]) => GadgetState[\"rightPanelContent\"]): GadgetAction =>\n    (dispatch, getState, updateState) =>\n        updateState((s) => {\n            s.rightPanelContent = updater(s.rightPanelContent);\n        });\n\nexport const getRightPanelContent = (state: GadgetState) => state.rightPanelContent;\nexport const getRunMode = (state: GadgetState) => state.debug.runMode;\n\nexport const hideDescription = (): GadgetAction => (dispatch, getState, updateState) => {\n    updateState((state) => {\n        state.hiddenDescription = true;\n    });\n};\n\nexport const getHiddenDescription = (state: GadgetState) => state.hiddenDescription;\n","import { AppSpec } from \"@/pyspace/gadget_editor/components/GadgetEditor\";\nimport { GadgetShareState } from \"@/pyspace/gadget_editor/store/gadget-store\";\nimport type { AccountPrefs } from \"@/pyspace/site/components/AccountSettings\";\nimport { AppId } from \"@/types\";\nimport { get, postJson, put } from \"@/util/fetch\";\nimport { UserProfile } from \"@pyspace/common/types\";\n\nconst e = encodeURIComponent;\n\nexport const createGadget = async (cloneKeyOrTemplateId: string): Promise<AppSpec> =>\n    postJson(`/ide/gadgets/create/${e(cloneKeyOrTemplateId)}`);\n\nexport const loadGadget = async (id: string): Promise<AppSpec> =>\n    await (await fetch(`/ide/gadgets/${e(id)}/load`)).json();\n\nexport const markNotificationsRead = (timestamp: string) => postJson(`/ide/me/mark-notifications-read`, { timestamp });\n\nexport const getAllNotifications = () => get(`/ide/me/notifications`);\n\nexport interface SearchResults {\n    users: { username: string; name?: string; n_followers: number; followed_by_me: boolean }[];\n    gadgets?: {\n        id: AppId;\n        name: string;\n        description: string;\n        n_likes: number;\n        username: string;\n        mine: boolean;\n        liked_by_me: boolean;\n    }[];\n}\n\nexport const globalSearch = (query: string, limit = 10): Promise<SearchResults> =>\n    get(`/ide/search-pyspace?query=${e(query)}&limit=${limit}`);\n\n// \"picture\" must be a <200kb JPEG image\nconst uploadPicture = async (url: string, picture: Blob) =>\n    await fetch(url, { method: \"PUT\", headers: { \"content-type\": \"image/jpeg\" }, body: picture });\n\nexport const setProfilePicture = async (picture: Blob) => uploadPicture(\"/ide/me/profile-picture\", picture);\n\nexport const setHeaderPicture = async (picture: Blob) => uploadPicture(\"/ide/me/header-picture\", picture);\n\nexport const setGadgetDescription = (gadgetId: string, description: string) =>\n    put(`/ide/gadgets/${gadgetId}/metadata`, { description });\n\n// \"picture\" must be a <200kb PNG image\nexport const setGadgetThumbnail = async (gadgetId: string, picture: Blob) =>\n    await fetch(`/ide/gadgets/${gadgetId}/thumbnail`, {\n        method: \"PUT\",\n        headers: { \"content-type\": \"image/png\" },\n        body: picture,\n    });\n\nexport const changeUsername = async (username: string): Promise<{ username: string; error?: string }> =>\n    postJson(\"/ide/me/change-username\", { username });\n\nexport const setAccountSettings = async (prefs: Partial<AccountPrefs>) => postJson(\"/ide/me/account-settings\", prefs);\n\nexport const markAsNotAGadget = async (appId: string) => postJson(`/ide/gadgets/${appId}/not-a-gadget`, {});\n\nexport const setSharing = (gadgetId: string, sharing: GadgetShareState) => {\n    return postJson(`/ide/gadgets/${gadgetId}/sharing`, { sharing });\n};\n\nexport const setLiked = (gadgetId: string, liked: boolean) => {\n    return postJson(`/ide/gadgets/${gadgetId}/liked`, { liked });\n};\n\nexport const setFollowing = async (username: string, follow: boolean) =>\n    await postJson(`/ide/users/${encodeURIComponent(username)}/follow`, { follow });\n\nexport const reportGadgetAbuse = async (gadgetId: string, message: string) =>\n    await postJson(`/ide/gadgets/${e(gadgetId)}/report-abuse`, { message });\n\nexport const reportProfileAbuse = async (username: string, message: string) =>\n    await postJson(`/ide/users/${e(username)}/report-abuse`, { message });\n\nexport const getFollowers = (username: string): Promise<UserProfile[]> => get(`/ide/users/${e(username)}/followers`);\n\nexport const getFollowing = (username: string): Promise<UserProfile[]> => get(`/ide/users/${e(username)}/following`);\n\nexport const recordSiteActivity = (type: string, data: any = {}, appId?: string) => {\n    // data might be a frozen object here, best not to mutate it\n    data = { ...data, pySpace: true };\n    void fetch(\n        `/ide/log?${appId ? \"appId=\" + encodeURIComponent(appId) + \"&\" : \"\"}eventType=${encodeURIComponent(type)}&event=${encodeURIComponent(JSON.stringify(data))}`,\n        {\n            method: \"POST\",\n        }\n    );\n};\n","import React, { createContext, useLayoutEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useSelector } from \"react-redux\";\nimport { LoadingSpinner } from \"@/components/reusable/LoadingSpinner\";\nimport { GadgetEditorEvents, UserProfile } from \"@/pyspace/common/types\";\nimport { AppSpec, GadgetEditor } from \"@/pyspace/gadget_editor/components/GadgetEditor\";\nimport { loadGadget, recordSiteActivity } from \"@/pyspace/pyspace-api\";\nimport { getUserDetails } from \"@/pyspace/site/controllers/my-gadgets\";\nimport { useEffectAsync } from \"@/util/hooks\";\n\nexport const PopoutContext = createContext(false);\n\nexport const PopoutEditor = ({\n    gadget,\n    gadgetId,\n    ownerProfile,\n    events,\n}: { ownerProfile: UserProfile; events?: GadgetEditorEvents; isPySpace?: boolean } & (\n    | { gadget: AppSpec; gadgetId?: undefined }\n    | { gadgetId: string; gadget?: undefined }\n)) => {\n    const loggedInUser = useSelector(getUserDetails);\n    const [app, setApp] = useState<AppSpec | null>(gadget || null);\n\n    useEffectAsync(async () => {\n        if (!gadget && app?.id !== gadgetId) {\n            setApp(await loadGadget(gadgetId));\n        }\n    }, [gadgetId]);\n\n    useLayoutEffect(() => {\n        document.body.classList.add(\"h-full\", \"overflow-hidden\");\n        return () => document.body.classList.remove(\"h-full\", \"overflow-hidden\");\n    }, []);\n\n    return createPortal(\n        <PopoutContext.Provider value={true}>\n            <div className={\"fixed inset-x-0 inset-y-0 z-1 bg-[#00000088]\"} onClick={events?.onClosed} />\n            <div\n                className={\n                    \"fixed inset-x-4 inset-y-4 z-1 overflow-hidden sm:inset-x-8 sm:inset-y-8 md:inset-x-32 md:inset-y-32\"\n                }>\n                {app ? (\n                    <GadgetEditor\n                        gadget={app}\n                        ownerProfile={ownerProfile}\n                        loggedInUser={loggedInUser}\n                        events={events}\n                        isPySpace={true}\n                        isPopout\n                    />\n                ) : (\n                    <LoadingSpinner />\n                )}\n            </div>\n        </PopoutContext.Provider>,\n        document.body\n    );\n};\n","import React, { useMemo } from \"react\";\nimport { Provider } from \"react-redux\";\nimport Modals from \"@/components/modals\";\nimport { getPyspaceSiteModals } from \"@/pyspace/site/modals/names/pyspace-site-modals\";\nimport { SiteState, createSiteStore } from \"@/pyspace/site/store/pyspace-site-store\";\nimport { ThemeContext } from \"@/theme/styles\";\nimport { PySpaceDarkTheme, PySpaceLightTheme } from \"@/theme/theme\";\n\ninterface SiteProviderProps {\n    initialStoreState?: Omit<SiteState, \"modals\">;\n    children: any;\n}\n\nexport const SiteProvider = ({ initialStoreState, children }: SiteProviderProps) => {\n    const store = useMemo(() => createSiteStore(initialStoreState ?? {}), []);\n    const isDark = false;\n    return (\n        <Provider store={store}>\n            <ThemeContext.Provider value={isDark ? PySpaceDarkTheme : PySpaceLightTheme}>\n                {children}\n                <Modals modalTypes={getPyspaceSiteModals()} />\n            </ThemeContext.Provider>\n        </Provider>\n    );\n};\n\nexport const withSiteProvider = (Component: any, initialStoreState?: Omit<SiteState, \"modals\">) => (props: any) => {\n    return (\n        <SiteProvider initialStoreState={initialStoreState}>\n            <Component {...props} />\n        </SiteProvider>\n    );\n};\n","import React, { useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { faBell } from \"@fortawesome/pro-solid-svg-icons\";\nimport { faGear } from \"@fortawesome/pro-solid-svg-icons/faGear\";\nimport { faSignOut } from \"@fortawesome/pro-solid-svg-icons/faSignOut\";\nimport { faUser } from \"@fortawesome/pro-solid-svg-icons/faUser\";\nimport DropdownMenu, { MenuItems } from \"@/components/reusable/DropdownMenu\";\nimport { modal } from \"@/controllers/modals\";\nimport { IconButton } from \"@/pyspace/common/components/Button\";\nimport { NotificationsButton } from \"@/pyspace/common/components/NotificationsButton\";\nimport { Notification, UserDetails } from \"@/pyspace/common/types\";\nimport { withSiteProvider } from \"@/pyspace/site/components/SiteProvider\";\nimport { cx } from \"@/theme/styles\";\nimport { GadgetDispatch } from \"@/types\";\nimport { SiteDispatch } from \"../store/pyspace-site-store\";\n\nexport const ProfileMenu = ({ className, userDetails }: { className?: string; userDetails: UserDetails }) => {\n    const dispatch = useDispatch<GadgetDispatch>();\n    const { username } = userDetails.profile;\n    return (\n        <DropdownMenu\n            align=\"right\"\n            render={(showMenu, anchor) => (\n                <IconButton\n                    elevated\n                    round\n                    className={cx(\"relative mt-[-4px] px-2\", className)}\n                    linkClassName=\"rounded-full overflow-clip\"\n                    onClick={(e) => showMenu(null, e.currentTarget)}>\n                    <img\n                        src={\n                            username\n                                ? `/ide/users/${username}/profile-picture`\n                                : \"https://gravatar.com/avatar/1234?f=y&d=robohash\"\n                        }\n                        alt={`Profile for ${username}`}\n                    />\n                    <div className=\"absolute right-0 bottom-[-10px]\">{anchor}</div>\n                </IconButton>\n            )}\n            items={(selectItem, hideMenu) => [\n                // <div className={\"text-gray-400\"}>{userDetails.profile.username}</div>,\n                [\n                    \"Profile\",\n                    () => {\n                        window.location.href = `/u/${userDetails.profile.username}`;\n                    },\n                    faUser,\n                ],\n                [\"Notifications\", () => dispatch(modal(\"notifications\", { newNotifications: [] })), faBell],\n                [\n                    \"Account Settings\",\n                    () => {\n                        window.location.href = \"/account-settings\";\n                    },\n                    faGear,\n                ],\n                <hr />,\n                [\n                    \"Log out\",\n                    () => {\n                        window.location.href = \"/logout\";\n                    },\n                    faSignOut,\n                ],\n            ]}\n        />\n    );\n};\n\nexport const UserMenu = withSiteProvider(\n    ({ userDetails, notifications }: { userDetails: UserDetails; notifications: Notification[] }) => {\n        return (\n            <>\n                {notifications && <NotificationsButton newNotifications={notifications} />}\n                <ProfileMenu userDetails={userDetails} />\n            </>\n        );\n    }\n);\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { ModalComponent } from \"@/components/modals\";\nimport Modal from \"@/components/modals/Modal\";\nimport { ButtonGroup } from \"@/components/reusable/ButtonGroup\";\nimport Link from \"@/components/reusable/Link\";\nimport { LoadingSpinner } from \"@/components/reusable/LoadingSpinner\";\nimport { Notification } from \"@/pyspace/common/types\";\nimport * as pySpaceApi from \"@/pyspace/pyspace-api\";\nimport { AppId } from \"@/types\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { timeAgo, useNowWithRefresh } from \"@/util/time\";\n\nconst OneNotification = ({ notification, now }: { notification: Notification; now: Date; showingAll: boolean }) => {\n    const gadgetLink = (d: { gadget_id: AppId; gadget_name: string }) => (\n        <Link to={`/g/${d.gadget_id}`} target=\"_blank\" className={\"font-semibold no-underline! hover:underline!\"}>\n            {d.gadget_name}\n        </Link>\n    );\n\n    const date = new Date(notification.time);\n\n    return (\n        <div className={\"mt-[1.4rem] flex flex-row items-center gap-[1.4rem] text-[1.4rem]\"}>\n            <img\n                className={\"h-20 w-20 rounded-full border-2 border-black\"}\n                src={`/ide/users/${notification.username}/profile-picture`}\n                alt={\"Profile\"}\n            />\n            <div className={\"w-full grow-1\"}>\n                <p className={\"mb-[.4rem] leading-[115%]\"}>\n                    <Link\n                        to={`/u/${notification.username}`}\n                        target=\"_blank\"\n                        className={\"font-semibold no-underline! hover:underline!\"}>\n                        @{notification.username}\n                    </Link>{\" \"}\n                    {notification.type === \"liked_gadget\" ? (\n                        <>has liked your widget: {gadgetLink(notification.details)}</>\n                    ) : notification.type === \"forked_gadget\" ? (\n                        <>forked your widget: {gadgetLink(notification.details)}</>\n                    ) : notification.type === \"published_gadget\" ? (\n                        <>published a new widget: {gadgetLink(notification.details)}</>\n                    ) : notification.type === \"follows_you\" ? (\n                        <>started following you</>\n                    ) : (\n                        <>{notification.type}</>\n                    )}\n                </p>\n                <p title={date.toString()} className={\"text-[1.2rem] md:text-[1.4rem]\"}>\n                    {timeAgo(now, date)}\n                </p>\n            </div>\n            {/*todo: for cleaning individual notifications*/}\n            {/*{showingAll && (*/}\n            {/*    <LinkInternal onClick={clearNotification}>*/}\n            {/*        <FontAwesomeIcon icon={faTimes} />*/}\n            {/*    </LinkInternal>*/}\n            {/*)}*/}\n        </div>\n    );\n};\n\nexport const NotificationsModal: ModalComponent<{ newNotifications: Notification[] }> = ({\n    modalId,\n    spec: { newNotifications },\n}) => {\n    const [showingAll, setShowingAll] = useState(!newNotifications.length);\n    const [allNotifications, setAllNotifications] = useState<Notification[] | null>(null);\n    const modalRef = useRef();\n    const now = useNowWithRefresh();\n\n    const loadAllNotifications = async () => {\n        if (!allNotifications) {\n            setAllNotifications(await pySpaceApi.getAllNotifications());\n        }\n    };\n\n    useEffect(() => {\n        if (!newNotifications.length) {\n            loadAllNotifications();\n        }\n    });\n    const notifications = showingAll ? allNotifications : newNotifications;\n\n    const notification_options = [\n        { title: \"Unread\", value: \"unread\" },\n        { title: \"All\", value: \"all\" },\n    ];\n\n    const changeNotificationGroup = useEvent((e) => {\n        if (e === \"all\") {\n            setShowingAll(true);\n            loadAllNotifications();\n        } else {\n            setShowingAll(false);\n        }\n    });\n\n    /*todo: for cleaning all notifications*/\n    // const clearNotifications = useEvent((e) => {\n    //     //delete all notifications\n    //     // pySpaceApi.markNotificationsRead(newNotifications[0].time);\n    //     modalRef.current.returnValue();\n    // });\n\n    return (\n        <Modal modalId={modalId} title={\"Notifications\"} size={\"small\"} ref={modalRef}>\n            <ButtonGroup\n                options={notification_options}\n                selectedOption={showingAll ? \"all\" : \"unread\"}\n                selectedVariant={\"primary\"}\n                onClick={changeNotificationGroup}\n                elevated={false}\n            />\n\n            <div className={\"mt-4 h-[20vh] overflow-y-auto\"} style={{ scrollbarColor: \"#7C7E7F transparent\" }}>\n                {!notifications ? (\n                    <LoadingSpinner />\n                ) : notifications.length ? (\n                    <>\n                        {/*todo: for cleaning all notifications*/}\n                        {/*{showingAll && (*/}\n                        {/*    <LinkInternal onClick={clearNotifications} className={\"text-[1.6rem] text-primary\"}>*/}\n                        {/*        Clear all notifications*/}\n                        {/*    </LinkInternal>*/}\n                        {/*)}*/}\n                        {notifications.map((n) => (\n                            <OneNotification notification={n} now={now} showingAll={showingAll} />\n                        ))}\n                    </>\n                ) : (\n                    <div className={\"m-12 text-center\"}>No new notifications</div>\n                )}\n            </div>\n        </Modal>\n    );\n};\n","import { ModalTypes } from \"@/components/modals\";\nimport { commonModalTypes } from \"@/components/modals/names/common-modals\";\nimport UploadFileModal from \"@/pyspace/common/modals/UploadFile\";\nimport EditUserProfileModal from \"@/pyspace/site/modals/EditUserProfileModal\";\nimport { NotificationsModal } from \"@/pyspace/site/modals/Notifications\";\nimport TestSiteMediumModal, { TestSiteSmallModal } from \"@/pyspace/site/modals/TestSiteMediumModal\";\nimport ReportAbuseModal from \"@pyspace/common/modals/ReportAbuse\";\nimport FollowingModal from \"@pyspace/site/modals/Following\";\n\nconst createSiteModals = () =>\n    ({\n        ...commonModalTypes,\n        testSiteMediumModal: TestSiteMediumModal,\n        testSiteSmallModal: TestSiteSmallModal,\n        notifications: NotificationsModal,\n        uploadFile: UploadFileModal,\n        editUserProfile: EditUserProfileModal,\n        reportAbuse: ReportAbuseModal,\n        following: FollowingModal,\n    }) satisfies ModalTypes;\n\nlet siteModals: SiteModalTypes;\n\nexport const getPyspaceSiteModals = () => {\n    return (siteModals ??= createSiteModals());\n};\n\nexport type SiteModalTypes = ReturnType<typeof createSiteModals>;\nexport type SiteModalType = keyof SiteModalTypes;\n","import React, { useRef, useState } from \"react\";\nimport { faBluesky, faGithub, faLinkedin, faMastodon, faXTwitter } from \"@fortawesome/free-brands-svg-icons\";\nimport { faCheck, faEllipsis, faLink } from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { ModalComponent } from \"@/components/modals\";\nimport Modal, { ModalRef } from \"@/components/modals/Modal\";\nimport { useTooltip } from \"@/components/reusable/Tooltip\";\nimport { Button } from \"@/pyspace/common/components/Button\";\nimport PySpaceTextArea from \"@/pyspace/common/components/TextArea\";\nimport PySpaceTextInput from \"@/pyspace/common/components/TextInput\";\nimport { UserProfile } from \"@/pyspace/common/types\";\nimport { cx } from \"@/theme/styles\";\nimport useEvent from \"@/util/useEventCallback\";\n\ninterface EditUserProfileSpec {\n    profile: UserProfile;\n}\n\nconst SocialInputs = ({ socialType, profile, updateSocial, profileErrors }) => {\n    const [tt, ttRef] = useTooltip(socialType.display, \"bottom\");\n    return (\n        <>\n            <div ref={ttRef}>\n                <FontAwesomeIcon icon={socialType.icon} />\n                {tt}\n            </div>\n            <PySpaceTextInput\n                value={profile.social?.[socialType.name] || \"\"}\n                onChange={(e) => updateSocial(socialType.name, e)}\n                placeholder={socialType.text}\n                maxLength={socialType.restrictions?.charLimit ?? 50}\n                invalid={profileErrors[socialType.name]}\n            />\n            <div />\n            <div className={cx(\"text-[1.2rem] text-danger\", \"mb-4\")}>{profileErrors[socialType.name]}</div>\n        </>\n    );\n};\n\nconst EditUserProfileModal: ModalComponent<EditUserProfileSpec> = ({ modalId, spec }) => {\n    const modalRef = useRef<ModalRef>(null!);\n\n    const originalProfile = spec.profile;\n    const [profile, setProfile] = useState(originalProfile)!;\n\n    const socials = [\n        {\n            name: \"website\",\n            icon: faLink,\n            text: \"website url\",\n            restrictions: { charLimit: 200, pattern: /^https?:\\/\\/\\S{4,}/ },\n            display: \"Website\",\n        },\n        { name: \"twitter\", icon: faXTwitter, text: \"handle\", display: \"Twitter\" },\n        { name: \"github\", icon: faGithub, text: \"username\", display: \"GitHub\" },\n        { name: \"linkedin\", icon: faLinkedin, text: \"url\", display: \"LinkedIn\" },\n        {\n            name: \"mastodon\",\n            icon: faMastodon,\n            text: \"url\",\n            restrictions: { charLimit: 200, pattern: /^https?:\\/\\/\\S{4,}/ },\n            display: \"Mastodon\",\n        },\n        { name: \"bluesky\", icon: faBluesky, text: \"username\", display: \"Bluesky\" },\n    ];\n\n    // need to check the restirctions for these. no need to check character limit - that should be limited by the textInput already\n    const [profileErrors, setProfileErrors] = useState({\n        website: false,\n        mastodon: false,\n    });\n\n    const updateSocial = useEvent((key, v) => {\n        setProfile({\n            ...profile,\n            social: profile.social ? { ...profile.social, [key]: v } : { [key]: v },\n        });\n        if (Object.keys(profileErrors).includes(key)) {\n            setProfileErrors({ ...profileErrors, [key]: false });\n        }\n    });\n\n    const validateAndMaybeSubmit = useEvent(() => {\n        const err = {};\n\n        Object.entries(profile.social || {}).map(([key, value]) => {\n            if (value === \"\") {\n                delete profile.social[key];\n            } else if (Object.keys(profileErrors).includes(key)) {\n                const regexRestriction = socials.find((s) => s.name === key).restrictions.pattern;\n                if (!regexRestriction.test(value)) {\n                    err[key] = \"Link must begin with 'https://' and be followed by at least 4 characters\";\n                }\n            }\n        });\n        if (Object.keys(err).length > 0) {\n            setProfileErrors({ ...profileErrors, ...err });\n        } else {\n            modalRef.current.returnValue(profile);\n        }\n    });\n\n    const handleChange = useEvent((propName, value) => {\n        setProfile({ ...profile, [propName]: value });\n        setProfileErrors({ ...profileErrors, [propName]: false });\n    });\n\n    return (\n        <Modal ref={modalRef} size={\"medium\"} autoFocus={false} title={\"Edit profile\"} modalId={modalId}>\n            <div className={\"flex flex-col gap-[0.8rem]\"}>\n                <PySpaceTextInput\n                    title={\"Name\"}\n                    value={profile.name || \"\"}\n                    onChange={(e) => handleChange(\"name\", e)}\n                    maxLength=\"50\"\n                    invalid={profileErrors[\"name\"]}\n                />\n\n                <PySpaceTextArea\n                    value={profile.bio || \"\"}\n                    text={\"Bio\"}\n                    className={\"h-28!\"}\n                    onChange={(e) => handleChange(\"bio\", e.target.value)}\n                    plaeholder={\"bio\"}\n                    maxLength=\"2000\"\n                />\n\n                <PySpaceTextInput\n                    title={\"Location\"}\n                    value={profile.social?.location || \"\"}\n                    onChange={(e) => updateSocial(\"location\", e)}\n                    maxLength=\"50\"\n                />\n            </div>\n\n            <div className={\"my-[2.4rem] flex flex-col gap-[0.8rem]\"}>\n                <div className={\"text-[2rem] font-semibold text-dark-bg6\"}>Social Media Links</div>\n                <div className={\"grid grid-cols-[2rem_1fr] items-center gap-x-4 text-[1.4rem]\"}>\n                    {socials.map((social) => (\n                        <div className={\"contents\"} key={social.name}>\n                            <SocialInputs\n                                socialType={social}\n                                profile={profile}\n                                updateSocial={updateSocial}\n                                profileErrors={profileErrors}\n                            />\n                        </div>\n                    ))}\n                </div>\n                {/*todo: we haven't implemented the featured widget yet */}\n                {/*<div className={\"mt-8 text-[1.6rem] font-normal\"}>*/}\n                {/*    You can change your featured widget from the{\" \"}*/}\n                {/*    <FontAwesomeIcon className={\"px-[.4rem]\"} icon={faEllipsis} /> menu of the widget you want to*/}\n                {/*    feature.*/}\n                {/*</div>*/}\n            </div>\n            <div className={\"grid grid-cols-2 gap-[2.1rem]\"}>\n                <Button className={\"w-full\"} elevated onClick={() => modalRef.current.returnValue(false)}>\n                    Cancel\n                </Button>\n                <Button\n                    className={\"w-full\"}\n                    elevated\n                    variant={\"primary\"}\n                    icon={faCheck}\n                    iconRight\n                    onClick={validateAndMaybeSubmit}>\n                    Confirm\n                </Button>\n            </div>\n        </Modal>\n    );\n};\n\nexport default EditUserProfileModal;\n","import React from \"react\";\nimport { faCheck } from \"@fortawesome/pro-solid-svg-icons\";\nimport { ModalComponent } from \"@/components/modals\";\nimport Modal from \"@/components/modals/Modal\";\nimport { modalReturn } from \"@/controllers/modals\";\nimport { Button } from \"@/pyspace/common/components/Button\";\n\n// A simple modal to demonstrate modals in pyspace site objects\n\nconst TestSiteMediumModal: ModalComponent = ({ modalId }) => {\n    return (\n        <Modal modalId={modalId} title={\"Med Test Site Modal\"}>\n            This is a modal running in the site, not the gadget editor\n            <br />\n            The size is Medium\n            <div className={\"flex justify-end\"}>\n                <Button elevated variant={\"primary\"} icon={faCheck} iconRight>\n                    Blah\n                </Button>\n            </div>\n        </Modal>\n    );\n};\n\nexport default TestSiteMediumModal;\n\nexport const TestSiteSmallModal: ModalComponent = ({ modalId }) => {\n    return (\n        <Modal modalId={modalId} size={\"small\"} title={\"Small Test Site Modal\"}>\n            This is a modal running in the site, not the gadget editor\n            <br />\n            The size is Small\n        </Modal>\n    );\n};\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { ModalComponent, ModalProps } from \"@/components/modals\";\nimport Modal from \"@/components/modals/Modal\";\nimport { ButtonGroup } from \"@/components/reusable/ButtonGroup\";\nimport Link from \"@/components/reusable/Link\";\nimport { LoadingSpinner } from \"@/components/reusable/LoadingSpinner\";\nimport * as pySpaceApi from \"@/pyspace/pyspace-api\";\nimport { useEffectAsync } from \"@/util/hooks\";\nimport { UserProfile } from \"@pyspace/common/types\";\n\ninterface FollowingSpec {\n    username: string;\n    usersWho: \"follow_this_user\" | \"this_user_follows\";\n}\n\nconst FollowingModal: ModalComponent<FollowingSpec> = ({\n    modalId,\n    spec: { username, usersWho },\n}: ModalProps<FollowingSpec>) => {\n    const [view, SetView] = useState(usersWho);\n    const viewOptions = [\n        { value: \"this_user_follows\", title: \"Following\" },\n        { value: \"follow_this_user\", title: \"Followers\" },\n    ];\n\n    const followers = view === \"follow_this_user\";\n\n    const [usersFollowed, setUsersFollowed] = useState<UserProfile[] | null>(null); //the ones I follow\n    const [usersWhoFollow, setUsersWhoFollow] = useState<UserProfile[] | null>(null); //those who follow me\n\n    useEffectAsync(async () => {\n        if (!usersFollowed) {\n            setUsersFollowed(await pySpaceApi.getFollowing(username));\n        }\n        if (!usersWhoFollow) {\n            setUsersWhoFollow(await pySpaceApi.getFollowers(username));\n        }\n    }, [username]);\n\n    const users = useMemo(() => (followers ? usersWhoFollow : usersFollowed), [view, usersWhoFollow, usersFollowed]);\n\n    return (\n        <Modal size={\"medium\"} modalId={modalId}>\n            <div className={\"relative mb-16 flex h-160 w-full flex-col items-center\"}>\n                {!users ? (\n                    <LoadingSpinner />\n                ) : users.length ? (\n                    <div\n                        className={\n                            \"relative top-8 flex w-full flex-col gap-4 overflow-y-auto rounded-[.4rem] border-2 border-light-grey2 bg-light-bg0 py-6\"\n                        }>\n                        {users.map((profile) => {\n                            return (\n                                <Link\n                                    to={`/u/${profile.username}`}\n                                    key={profile.username}\n                                    target={\"_blank\"}\n                                    className={\n                                        \"flex items-center gap-[1.2rem] px-6 py-4 no-underline! hover:bg-light-bg4 md:gap-6\"\n                                    }>\n                                    <img\n                                        className={\"h-20 w-20 rounded-full border-2 border-black\"}\n                                        src={`/ide/users/${profile.username}/profile-picture`}\n                                        alt={\"Profile\"}\n                                    />\n                                    <div className={\"flex w-full grow-1 items-center gap-[1.2rem] md:gap-6\"}>\n                                        <div className={\"text-[1.8rem] font-semibold md:text-[2rem]\"}>\n                                            {profile.name}\n                                        </div>\n                                        <div className={\"text-[1.8rem] md:text-[2rem]\"}>@{profile.username}</div>\n                                    </div>\n                                </Link>\n                            );\n                        })}\n                    </div>\n                ) : (\n                    <div\n                        className={\n                            \"relative top-8 flex min-h-28 w-full items-center justify-center border-2 border-light-grey2 bg-light-bg0\"\n                        }>\n                        <div className={\"mx-12 mt-16 mb-8 text-center text-[1.4rem] text-light-grey2\"}>\n                            {followers ? `Nobody follows ${username} yet.` : `${username} doesn't follow anybody yet.`}\n                        </div>\n                    </div>\n                )}\n                <div className={\"absolute top-0 w-full max-w-124\"}>\n                    <ButtonGroup\n                        selectedVariant={\"primary\"}\n                        options={viewOptions}\n                        elevated={false}\n                        selectedOption={view}\n                        onClick={(e) => SetView(e)}\n                    />\n                </div>\n            </div>\n        </Modal>\n    );\n};\n\nexport default FollowingModal;\n","// Redux for the py.space \"My Gadgets\" editor\nimport { ConnectedProps } from \"react-redux\";\nimport { produce } from \"immer\";\nimport { Action } from \"redux\";\nimport { ThunkAction, ThunkDispatch } from \"redux-thunk\";\nimport { UserDetails, UserProfile } from \"@/pyspace/common/types\";\nimport { GadgetShareState } from \"@/pyspace/gadget_editor/store/gadget-store\";\nimport { baseProducer, initStore } from \"@/store\";\nimport { ModalState } from \"@/store/modal-store\";\n\nexport interface GadgetEntry {\n    id: string;\n    title: string;\n    description?: string;\n    n_likes: number;\n    n_forks: number;\n    liked: boolean;\n    mine?: boolean;\n    sharing?: GadgetShareState;\n    thumbnail_url_revision?: number;\n    last_updated?: string;\n}\n\nexport interface Space {\n    // This is a very basic schema that will want to change\n    title: string;\n    description: string;\n    gadgets: GadgetEntry[];\n}\n\n// This state covers many site pages\nexport interface SiteState extends ModalState {\n    userDetails?: UserDetails;\n\n    // For the homepage:\n    gadgets?: GadgetEntry[];\n\n    // When viewing a profile:\n    profile?: UserProfile;\n    profileUrlRevision?: number;\n\n    // When viewing a space:\n    space?: Space;\n}\n\nexport const createSiteStore = (state: Omit<SiteState, \"modals\">) =>\n    initStore(\n        produce(baseProducer, {\n            ...state,\n            modals: [],\n        } as SiteState)\n    );\n\n// Type definitions - we could possibly genericise these\ninterface UpdateState<A = any> {\n    (description: string, updater: (state: SiteState, ...args: A[]) => void, ...args: A[]): void;\n    (updater: (state: SiteState, ...args: A[]) => void, ...args: A[]): void;\n    (description: string, ...args: A[]): void;\n}\n\n/** If you need the return value you have to type it, it can't be inferred. unknown rather then any for stricter usage */\nexport type SiteAction<R = unknown> = ThunkAction<R, SiteState, UpdateState, Action<string>>;\nexport type SiteAsyncAction<R = unknown> = SiteAction<Promise<R>>;\n\nexport type SiteDispatch = ThunkDispatch<SiteState, UpdateState, Action<string>>;\n\nexport type SiteConnectedProps<T> = ConnectedProps<T> & { dispatch: SiteDispatch };\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { EVENTS, useSubscribeToDispatchEvent } from \"@/actions\";\nimport { getAppId } from \"@/controllers/app\";\nimport type { GadgetDispatch, Tab } from \"@/types\";\nimport { wait } from \"@/util\";\nimport { useEditSequenceNumbersChanged, useEffectAsync, useRerender, useUpdateEffect } from \"@/util/hooks\";\nimport { lazyComponent } from \"@/util/lazy\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { createGadgetThumbnailFromBlob, useGadgetEvents } from \"@pyspace/gadget_editor/controllers/gadget\";\nimport { GadgetState } from \"@pyspace/gadget_editor/store/gadget-store\";\nimport type DesignerScreenshot from \"./DesignerScreenshot\";\n\nconst SCREENSHOT_DELAY = 10 * 60 * 1000;\nconst MAX_SAVES = 10;\nconst MAX_CHANGES = 25;\n// const SCREENSHOT_DELAY = 1000;\nconst codePath = [[\"CODE\"]];\n\n/** checks if we should update and schedules a re-render if we took a screenshot recently */\nexport const useShouldUpdateScreenshot = (enabled: boolean) => {\n    const appLogo = useSelector((s: GadgetState) => s.app.config.metadata?.logo_img);\n    const [prevLogo, setPrevLogo] = useState(appLogo);\n    const [force, setForce] = useState(false);\n    const [appSaved, setAppSaved] = useState(1);\n    const seqNum = useEditSequenceNumbersChanged(codePath);\n\n    // console.log(\"%cRENDERING SCREENSHOT\", \"color: hotpink;\", appSaved, force, seqNum);\n\n    useUpdateEffect(() => {\n        if (force) return;\n        if (appSaved % MAX_CHANGES === 0) {\n            setForce(true);\n            setAppSaved(1);\n        } else {\n            setAppSaved((s) => ++s);\n        }\n    }, [seqNum]);\n\n    if (appLogo !== prevLogo) {\n        // reset the state\n        setAppSaved(1);\n        setForce(false);\n        setPrevLogo(appLogo);\n    }\n\n    // useSubscribeToDispatchEvent(EVENTS.SAVED_APP, () => {\n    //     if (force) return;\n    //     if (appSaved % MAX_SAVES === 0) {\n    //         setForce(true);\n    //         setAppSaved(1);\n    //     } else {\n    //         setAppSaved((s) => ++s);\n    //     }\n    // });\n\n    useSubscribeToDispatchEvent(EVENTS.RUN_APP, () => {\n        if (appSaved > 1) {\n            setForce(true);\n        }\n    });\n\n    const rerender = useRerender();\n    const rerenderRef = useRef<number | undefined>();\n\n    useEffect(() => {\n        window.addEventListener(\"focus\", rerender);\n        return () => {\n            window.removeEventListener(\"focus\", rerender);\n        };\n    }, []);\n\n    clearTimeout(rerenderRef.current);\n    if (!enabled) return false;\n    if (!document.hasFocus()) return false;\n    if (!appLogo) return true;\n    try {\n        const url = new URL(appLogo);\n        // are we a screenshot ?s=1\n        if (!url.searchParams.get(\"s\")) return false;\n        // when did we last take a screenshot ?t=...\n        const t = Number(url.searchParams.get(\"t\") ?? \"\");\n        const timeTillNextScreenshot = SCREENSHOT_DELAY - (Date.now() - t);\n        const ready = force || timeTillNextScreenshot < 0;\n        if (!ready) {\n            // try again later\n            rerenderRef.current = setTimeout(rerender, timeTillNextScreenshot);\n        }\n        return ready;\n    } catch {\n        return false;\n    }\n};\n\nexport function useGenerateThumbnailFromScreenshot() {\n    const dispatch = useDispatch<GadgetDispatch>();\n    const gadgetEvents = useGadgetEvents();\n    const appId = useSelector(getAppId);\n    return useEvent((b?: Blob | null) => {\n        if (!appId) return;\n        if (!b) return;\n        dispatch(createGadgetThumbnailFromBlob(appId, gadgetEvents, b, true));\n    });\n}\n\nfunction useScreenshotRef(shouldUpdateScreenshot: boolean) {\n    const generateThumbnail = useGenerateThumbnailFromScreenshot();\n    const ref = useRef<HTMLDivElement>(null);\n    useEffectAsync(\n        async function* () {\n            await wait(1000);\n            yield;\n            if (!ref.current) return;\n            const mod = await import(\"html2canvas\");\n            const cmEditor = ref.current.querySelector<HTMLElement>(\".cm-scroller\");\n            if (!cmEditor) return;\n            const rv = await mod.default(cmEditor, {\n                ignoreElements(el) {\n                    if (\n                        el.classList.contains(\"cm-gutters\") ||\n                        el.classList.contains(\"cm-cursorLayer\") ||\n                        el.classList.contains(\"cm-selectionLayer\")\n                    ) {\n                        return true;\n                    }\n                    return false;\n                },\n                x: -10,\n                y: -10,\n                width: 450,\n                height: 280,\n                windowWidth: cmEditor.scrollWidth,\n                windowHeight: cmEditor.scrollHeight,\n            });\n            const c = await rv;\n            c.toBlob(generateThumbnail);\n        },\n        [ref.current, shouldUpdateScreenshot]\n    );\n    return ref;\n}\n\ninterface UseThumbnailProps {\n    enabled: boolean;\n    isGUI: boolean;\n    designTabId?: Tab[\"id\"];\n}\n\n// avoid us importing the designer rpc mechanism until we load the designer tab\nexport const LazyDesignerScreenShot = lazyComponent<typeof DesignerScreenshot>(\n    () => import(\"./DesignerScreenshot\"),\n    \"default\",\n    { fallback: null }\n);\n\nexport function useTakeScreenshot({ isGUI, designTabId, enabled }: UseThumbnailProps) {\n    const shouldUpdateScreenshot = useShouldUpdateScreenshot(enabled);\n    const ref = useScreenshotRef(shouldUpdateScreenshot);\n    if (!enabled) return [null, null];\n    if (!shouldUpdateScreenshot) return [null, null] as const;\n    if (!isGUI) return [ref, null] as const;\n    return [null, <LazyDesignerScreenShot key=\"d-screenshot\" designTabId={designTabId} />] as const;\n}\n","import { produce } from \"immer\";\nimport { AnvilAction, State } from \"@/types\";\nimport { getRandomString } from \"@/util\";\nimport { baseProducer, initStore } from \"./index\";\n\nlet nextStoreId = 1;\n\nexport const getNewBaseState = () => ({\n    editorType: \"ide\",\n    user: undefined,\n    subscription: undefined,\n    invoices: null,\n    githubConnection: null,\n    app: null,\n    ideMode: \"full\",\n    docs: null,\n    $persist: [\n        \"viewCache\",\n        \"sidebar\",\n        \"bottomPanel\",\n        \"codeNavState\",\n        \"hideBetaBanner\",\n        \"hideBetaModal\",\n        \"recentCodeItemCodePaths\",\n        \"recentApps\",\n    ],\n    $persistWalk: [\"editor\", \"debug\", \"sidebar\"], // Only walk into these things to find state to persist\n    modals: [],\n    serviceSpecs: {},\n    availableServices: {},\n    editor: {\n        $persist: [\n            \"isFirstRun\",\n            \"splitRunnerWidth\",\n            \"bottomPanelCurrentTab\",\n            \"bottomPanelHeight\",\n            \"selectedEnvironmentId\",\n            \"bottomPanelCommitListDiffWidth\",\n            \"splitCodeEditorRatio\",\n            \"codeTabPrefs\",\n            \"expandedTableMappings\",\n            \"recentlyOpened\",\n            \"agentChatsLocation\",\n            \"lastTouchedConversationId\",\n        ],\n        $persistWalk: [\"designer\"],\n        tabs: [],\n        tabStack: [],\n        recentlyOpened: {},\n        dataTables: null,\n        splitRunnerWidth: \"400px\",\n        agentChatsLocation: null,\n        bottomPanelCurrentTab: null,\n        bottomPanelTabStack: [],\n        bottomPanelHeight: 200,\n        bottomPanelCommitListDiffWidth: 300,\n        bottomPanelConversationPids: [],\n        talkToUsOfferExpired: false,\n        talkToUsOfferAutoOpened: false,\n        splitCodeEditorRatio: 0.5,\n        codeSnippetPanelWidth: \"calc(20vw)\",\n        isDiffVisible: false,\n        sequenceNumbers: {}, // app path -> sequence number\n        search: {\n            searchTerm: \"\",\n            expanded: {},\n            results: [],\n            isCaseSensitive: false,\n            isRegex: false,\n            regexErrorMsg: null,\n            focusInput: 0,\n        },\n        isFirstRun: null,\n        designer: {\n            $persist: [\n                \"panelDocked\",\n                \"panelWidth\",\n                \"toolboxExpanded\",\n                \"propertiesPanelExpanded\",\n                \"propertiesPanelHeight\",\n                \"expandedToolboxSections\",\n                \"expandedPropertyGroups\",\n            ],\n            selection: [],\n            breadcrumb: [],\n            creatingComponent: null,\n            output: null, // or a list\n            jsLayouts: [],\n            panelDocked: null, // Means decide based on width. See getDesignerPanelDocked\n            panelWidth: \"33rem\", // this width is 3 component icons + a bit of horizontal spacing\n            panelSections: {},\n            toolboxExpanded: true,\n            expandedToolboxSections: {},\n            expandedPropertyGroups: { Events: true },\n            showClassicDesigner: false,\n        },\n        codeTabPrefs: {\n            showCodeSnippets: window.innerWidth >= 1500,\n            showDesignerToolbox: window.innerWidth >= 1000,\n        },\n        expandedTableMappings: {},\n        versionControl: {\n            ignoreDesyncs: {},\n        },\n        overrideView: null,\n        panelWidth: 0,\n        disableInlineRunnerSplitView: false,\n        lastTouchedConversationId: null,\n        isCreatingConversation: false,\n    },\n    sidebar: {\n        $persist: [\"navMode\", \"showSecondaryNav\", \"inlineNavMode\", \"inlineShowSecondaryNav\", \"showAssetsInCodeNav\"],\n        primarySection: \"code\",\n        isSidebarVisible: true,\n        secondaryNavWidth: \"calc(25vw - 70px)\",\n        advancedCodeView: true,\n        showAssetsInCodeNav: false,\n\n        navMode: \"docked\", // or 'overlay'\n        showSecondaryNav: true,\n\n        inlineNavMode: \"overlay\", // or 'docked'\n        inlineShowSecondaryNav: false,\n    },\n    debug: {\n        $persist: [\"runnerMaximised\"],\n        sessionId: null,\n        runMode: null,\n        runnerMaximised: window.innerWidth / window.devicePixelRatio <= 2500,\n        output: [],\n        alreadyPromptedForUpgrade: false,\n        debuggerId: null,\n    },\n    debuggerHyperStacks: {},\n    repl: {\n        repls: {},\n        preserveLogs: false,\n    },\n    scriptRuns: {},\n    runnerBgTasks: {},\n\n    showLoadingIndicator: false,\n\n    // The \"Saving\" indicator combines all three of these:\n    unsaved: {}, // {key: description} - For things that are not app content\n    unsavedAppPaths: {}, // {path: item description} - For app content that has been changed, but hasn't started saving yet.\n    savingAppPaths: {}, // {saveId : dirtyPaths} - For in-flight saves\n\n    itemCache: {},\n    navBlocks: {},\n\n    viewCache: {}, // Stores views from previous URL hashes, to use as defaults when opening an item.\n    editHistory: {}, // appId -> path -> historyObject\n    codeNavState: {}, // Stores expanded state of code nav nodes.\n    hideBetaBanner: false,\n    newFeatureReleased: null,\n    hideBetaModal: false,\n    dynamicDownlinkStates: {},\n    recentCodeItemCodePaths: [],\n    recentApps: [],\n    ide: true,\n    manager: false,\n    ideTasks: {},\n    storeId: nextStoreId++,\n    suppressReloadingOnBranchMove: 0,\n    websocketConnection: {\n        phase: \"idle\",\n        retryAttempt: 0,\n        pausedByVisibility: false,\n        nextRetryAt: undefined,\n        restoredUntil: undefined,\n    },\n});\n\nconst getRootReducer = () =>\n    produce(baseProducer, {\n        ...getNewBaseState(),\n        storeId: nextStoreId++,\n    });\n\nexport const createAnvilStore = () => initStore(getRootReducer());\n\nexport const getStoreId = (state: State) => state.storeId;\n\n// A noop function that allows an AnvilAction to be implicitly typed\nexport function action<T extends AnvilAction>(f: T) {\n    return f;\n}\n","import React, { useEffect, useLayoutEffect, useSyncExternalStore } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { CacheProvider } from \"@emotion/react\";\nimport { getUserTheme, getUserUiScale } from \"../controllers/user\";\nimport { ThemeContext, cache, useIsPySpace } from \"./styles\";\nimport { DarkTheme, LightTheme } from \"./theme\";\n\ntype Scale = \"tiny\" | \"small\" | \"medium\" | \"large\" | \"huge\";\ntype Theme = \"light\" | \"dark\" | \"system\";\n\ndeclare global {\n    interface Window {\n        lightTheme: boolean;\n        darkTheme: boolean;\n    }\n}\n\nconst uiScales = [\"tiny\", \"small\", \"medium\", \"large\", \"huge\"].map((x) => `root-scale-${x}`);\n\nconst systemDarkWatcher = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\nconst subscribeSystemDarkWatcher = (cb: () => void) => {\n    systemDarkWatcher.addEventListener(\"change\", cb);\n    return () => {\n        systemDarkWatcher.removeEventListener(\"change\", cb);\n    };\n};\n\nconst getSystemDarkSnapShot = () => systemDarkWatcher.matches;\n\nconst useWatchSystemDarkMode = () => useSyncExternalStore(subscribeSystemDarkWatcher, getSystemDarkSnapShot);\n\nconst ThemeProvider = ({ children }: React.PropsWithChildren) => {\n    const theme = useSelector(getUserTheme) ?? localStorage.ideTheme ?? \"system\";\n    const scale = useSelector(getUserUiScale) ?? localStorage.ideScale ?? \"medium\";\n    const isSystemDark = useWatchSystemDarkMode();\n    const isDark = theme === \"dark\" || (theme === \"system\" && isSystemDark);\n\n    useEffect(() => {\n        localStorage.ideTheme = theme;\n    }, [theme]);\n\n    useLayoutEffect(() => {\n        // todo - we could be cleverer about this - see nightwind for transition effect\n        document.documentElement.classList.toggle(\"dark\", isDark);\n        // for the oldIDE\n        window.lightTheme = !isDark;\n        window.darkTheme = isDark;\n    }, [isDark]);\n\n    useLayoutEffect(() => {\n        const html = document.documentElement;\n        html.classList.remove(...uiScales);\n        html.classList.add(`root-scale-${scale}`);\n        localStorage.ideScale = scale;\n    }, [scale]);\n\n    return (\n        <CacheProvider value={cache}>\n            <ThemeContext.Provider value={isDark ? DarkTheme : LightTheme}>{children}</ThemeContext.Provider>\n        </CacheProvider>\n    );\n};\n\nexport default ThemeProvider;\n\nexport const remToPixelMultiplier = (rem = 1, uiScale = \"medium\") => {\n    switch (uiScale) {\n        case \"tiny\":\n            return 6 * rem;\n        case \"small\":\n            return 8 * rem;\n        case \"large\":\n            return 12 * rem;\n        case \"huge\":\n            return 14 * rem;\n        case \"medium\":\n        default:\n            return 10 * rem;\n    }\n};\n\nexport const useRemToPixels = (rem = 1) => {\n    const uiScale = useSelector(getUserUiScale);\n    return remToPixelMultiplier(rem, uiScale);\n};\n\nexport const breakPoints = {\n    tabPanelMinForSplit: 125,\n} as const;\n\nexport const useMinPixelsToSplit = () => {\n    const uiScale = useSelector(getUserUiScale);\n    const isPySpace = useIsPySpace();\n    if (isPySpace) {\n        // we never want to split in pyspace\n        return Number.POSITIVE_INFINITY;\n    }\n    return remToPixelMultiplier(breakPoints[\"tabPanelMinForSplit\"], uiScale);\n};\n","import React from \"react\";\nimport createCache from \"@emotion/cache\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CxArg, createMakeAndWithStyles } from \"tss-react\";\nimport { createCssAndCx } from \"tss-react/cssAndCx\";\nimport { DarkTheme, IDETheme, LightTheme } from \"./theme\";\n\nexport { LightTheme, DarkTheme };\nexport type { IDETheme };\n\nexport const ThemeContext = React.createContext<IDETheme>(LightTheme);\n\nexport const useTheme = () => React.useContext(ThemeContext);\n\nexport const useIsDark = () => !!React.useContext(ThemeContext).isDark;\nexport const useIsPySpace = () => !!React.useContext(ThemeContext).isPySpace;\n\nexport const cache = createCache({\n    key: \"av\",\n    // we might want to experiment with insertionPoint\n    // depending on priority with tailwind styles\n    // https://newreleases.io/project/github/emotion-js/emotion/release/@emotion%2Fcache@11.6.0\n});\nconst { css, cx: tssCx } = createCssAndCx({ cache });\nfunction cx(...inputs: CxArg[]) {\n    return twMerge(tssCx(inputs));\n}\nexport const { makeStyles, withStyles, useStyles } = createMakeAndWithStyles({ useTheme, cache });\nexport { css, cx };\n","import { ExternalState, useExternalState } from \"./external-state\";\n\nexport const tabPanelRef = new ExternalState<React.MutableRefObject<HTMLDivElement | null>>({ current: null });\n\nexport function useTabPanelRef() {\n    const [ref] = useExternalState(tabPanelRef);\n    return ref;\n}\n","import React, {\n    Context,\n    DependencyList,\n    EffectCallback,\n    useCallback,\n    useContext,\n    useEffect,\n    useLayoutEffect,\n    useMemo,\n    useReducer,\n    useRef,\n    useState,\n} from \"react\";\nimport { useSelector } from \"react-redux\";\nimport useDeepCompareEffect from \"react-use/lib/useDeepCompareEffect\";\nimport { getAppUrl } from \"@/controllers/app\";\nimport useEffectEvent from \"../useEffectEvent\";\nimport useEvent from \"../useEventCallback\";\n\nexport * from \"./temporal\";\nexport * from \"./edit-sequence-number\";\nexport * from \"./use-media-query\";\nexport * from \"./use-delayed-flag\";\nexport * from \"./use-debounce-fn\";\nexport * from \"./use-throttle-fn\";\nexport * from \"./use-intersection-observer\";\nexport * from \"./use-interval\";\nexport * from \"./use-timeout\";\nexport * from \"./use-apps-infinite-query\";\n\n/**\n * useful repos for inspiration\n * https://github.com/dwarvesf/react-toolkit/tree/master/packages/hooks/src\n * https://github.com/streamich/react-use/tree/master/src\n * https://github.com/chakra-ui/chakra-ui/tree/main/packages/hooks\n * https://ahooks.js.org/\n */\n\nfunction isAsyncGenerator(val: any): val is AsyncGenerator<void, void, void> {\n    return typeof val?.[Symbol.asyncIterator] === \"function\";\n}\n\ntype AsyncEffect = () => AsyncGenerator<void, void, void> | Promise<void>;\n\n/**\n * See https://ahooks.js.org/hooks/use-async-effect\n * \n * @example\n * ```javascript\n  // basic\n  useEffectAsync(async () => {\n    setPass(await mockCheck());\n  }, []);\n\n  // with a yield\n  useEffectAsync(\n    async function* () {\n      setPass(undefined);\n      const result = await mockCheck(value);\n      yield; // Check whether the effect is still valid, if it is has been cleaned up, stop at here.\n      setPass(result);\n    },\n    [value],\n  );\n  ```\n * \n */\nexport function useEffectAsync(effect: AsyncEffect, deps?: DependencyList) {\n    useEffect(() => {\n        const e = effect();\n        let cancelled = false;\n        async function execute() {\n            if (isAsyncGenerator(e)) {\n                // eslint-disable-next-line no-constant-condition\n                while (true) {\n                    const result = await e.next();\n                    if (result.done || cancelled) {\n                        break;\n                    }\n                }\n            } else {\n                await e;\n            }\n        }\n        execute();\n        return () => {\n            cancelled = true;\n        };\n    }, deps);\n}\n\nexport function useEffectAsyncWhen(flag: boolean, effect: AsyncEffect, deps: DependencyList = []) {\n    useEffectAsync(() => (flag ? effect() : Promise.resolve()), [flag, ...deps]);\n}\n\nexport function useMemoAsync<T>(initialValue: T | (() => T), func: () => Promise<T>, deps: any[]) {\n    const [x, setX] = useState<T>(initialValue);\n    useEffectAsync(async function* () {\n        const x = await func();\n        yield;\n        // support functions stored as state, otherwise they're treated as updaters\n        setX(() => x);\n    }, deps);\n    return x;\n}\n\n/** Often we useState, but need to reset the value when new props come in. This does that. */\nexport const useStateWithReset = <S>(value: S | (() => S)) => {\n    const [state, setState] = useState<S>(value);\n    const [prevValue, setPrevValue] = useState(() => value);\n    if (prevValue !== value) {\n        setState(value);\n        setPrevValue(() => value);\n    }\n    return [state, setState] as const;\n};\n\n/**\n * This is an alternative to performing an action on a useEffect\n * In a useEffect the react updates the dom before running the effect\n * In this version react does not update the dom\n */\nexport const useActionOnStateChange = (value: any, action: () => void) => {\n    const [prevValue, setPrevValue] = useState(() => value);\n    if (prevValue !== value) {\n        setPrevValue(value);\n        action();\n    }\n};\n\n/** @deprecated - generally avoid useEffect like this */\nexport const useWatch = <T>(f: (newValue: T, prevValue: T | undefined) => void, value: T) => {\n    const prevValueRef = useRef<T | undefined>(undefined);\n    const effectEvent = useEffectEvent(f);\n    useEffect(() => {\n        const prevValue = prevValueRef.current;\n        prevValueRef.current = value;\n        effectEvent(value, prevValue);\n    }, [value]);\n};\n\nfunction createObserverHook<Target extends Node, Callback extends CallableFunction, Options>(\n    createObserver: (callback: Callback) => {\n        observe(target: Target, options: Options): void;\n        disconnect(): void;\n    }\n) {\n    return (\n        ref: React.RefObject<Target | null>,\n        onChange: Callback,\n        options: Options,\n        onRemove?: () => unknown\n    ): void => {\n        const callback = useEvent(onChange);\n        const notifyRemove = useEvent(() => onRemove?.());\n        const observer = useConstant(() => createObserver(callback));\n\n        useLayoutEffect(() => {\n            const target = ref.current;\n            if (!target) return;\n            observer.observe(target, options);\n            return () => {\n                observer.disconnect();\n                notifyRemove();\n            };\n        }, [ref.current, options]);\n    };\n}\n\nconst useResizeObserverImpl = createObserverHook<Element, ResizeObserverCallback, ResizeObserverOptions | undefined>(\n    (callback) => new ResizeObserver(callback)\n);\n\nexport function useResizeObserver(\n    ref: React.RefObject<Element | null>,\n    onResize: ResizeObserverCallback,\n    onRemove?: () => unknown\n): void {\n    useResizeObserverImpl(ref, onResize, undefined, onRemove);\n}\n\nexport const useMutationObserver = createObserverHook<Node, MutationCallback, MutationObserverInit>(\n    (callback) => new MutationObserver(callback)\n);\n\nexport function useResizeObserverTimeout(\n    ref: React.RefObject<Element | null>,\n    onResize: ResizeObserverCallback,\n    delay = 10\n) {\n    const timeout = useRef<undefined | number>(undefined);\n    useResizeObserver(ref, () => {\n        clearTimeout(timeout.current);\n        timeout.current = setTimeout(onResize, delay);\n    });\n    return timeout;\n}\n\nexport function useRenderOnResize(ref: React.RefObject<Element | null>): void {\n    const rerender = useRerender();\n    useResizeObserver(ref, () => {\n        rerender();\n    });\n}\n\nexport function useDeepCompareEffectAsync(fn: () => void, deps: any[]) {\n    useDeepCompareEffect(() => {\n        fn();\n    }, deps);\n}\n\n/**\n * https://github.com/dwarvesf/react-toolkit\n * Creates a constant value over the lifecycle of a component.\n *\n * Even if `useMemo` is provided an empty array as its final argument, it doesn't offer\n * a guarantee that it won't re-run for performance reasons later on. By using `useConstant`\n * you can ensure that initialisers don't execute twice or more.\n */\nexport function useConstant<T>(init: T | (() => T)) {\n    const ref = useRef<T | null>(null);\n\n    if (ref.current === null) {\n        ref.current = typeof init === \"function\" ? (init as () => T)() : init;\n    }\n\n    return ref.current as T;\n}\n\n/** @returns a function when called forces a component to rerender */\nexport const useRerender = () => {\n    return useReducer(() => ({}), {})[1];\n};\n\ntype ReactRef<T> = React.RefCallback<T> | React.RefObject<T>;\n\n/**\n *\n * @example\n * ```js\n * const Component = ({ref, ...props}) => {\n *   const internalRef = React.useRef();\n *   return <div {...props} ref={useMergeRefs(internalRef, ref)} />;\n * ```\n */\nexport function useMergeRefs<T>(...refs: (ReactRef<T> | undefined | null)[]): React.RefCallback<T> | undefined {\n    return useMemo(() => {\n        const refsToAssign = refs.filter(Boolean);\n        if (!refsToAssign.length) return undefined;\n        return (node: T) => {\n            refsToAssign.forEach((ref) => {\n                if (typeof ref === \"function\") {\n                    ref(node);\n                } else {\n                    ref.current = node;\n                }\n            });\n        };\n    }, refs);\n}\n\nexport function useRefreshValue() {\n    const [val, setVal] = useState(0);\n    return [val, () => setVal((s) => s + 1)] as const;\n}\n\nexport function createContextHook<T>(context: Context<T>, name: string) {\n    return function useThisContext() {\n        const ctx = useContext(context);\n        if (!ctx) {\n            throw new Error(`Must use Provider for ${name ?? \"Unknown\"} Context`);\n        }\n        return ctx as NonNullable<T>;\n    };\n}\n\nexport function useActionOnTimeout(action: () => void, delay = 50) {\n    const timeoutRef = useRef<number | undefined>(undefined);\n    const delayAction = useEvent(() => {\n        clearTimeout(timeoutRef.current);\n        setTimeout(action, delay);\n    });\n    const runActionImmediately = useEvent(() => {\n        clearTimeout(timeoutRef.current);\n        action();\n    });\n    return [delayAction, runActionImmediately];\n}\n\ntype EffectHook = typeof useEffect | typeof useLayoutEffect;\n\nfunction createUpdateEffect(effectHook: EffectHook) {\n    return (effect: EffectCallback, deps: DependencyList) => {\n        const isMounted = useRef(false);\n        // for react-refresh\n        effectHook(() => {\n            return () => {\n                isMounted.current = false;\n            };\n        }, []);\n\n        effectHook(() => {\n            if (!isMounted.current) {\n                isMounted.current = true;\n            } else {\n                return effect();\n            }\n        }, deps);\n    };\n}\n\n/** A hook alike useEffect but skips running the effect for the first time */\nexport const useUpdateEffect = createUpdateEffect(useEffect);\n/** A hook alike useLayoutEffect but skips running the effect for the first time */\nexport const useUpdateLayoutEffect = createUpdateEffect(useLayoutEffect);\n\nfunction createEffectWhen(effectHook: EffectHook, updateEffect = false) {\n    return (flag: boolean, effect: EffectCallback | (() => void), deps: DependencyList = []) => {\n        const prevDepsRef = useRef<DependencyList | null>(null);\n        effectHook(() => {\n            let runEffect;\n            const prevDeps = prevDepsRef.current;\n            if (prevDeps === null) {\n                runEffect = !updateEffect;\n                prevDepsRef.current = deps;\n            }\n            if (!flag) return;\n            if (prevDeps !== null && (prevDeps.length === 0 || prevDeps.some((val, i) => val !== deps[i]))) {\n                runEffect = true;\n                prevDepsRef.current = deps;\n            }\n            if (!runEffect) return;\n            const rv = effect();\n            if (typeof rv === \"function\") return rv;\n        }, [flag, ...deps]);\n    };\n}\n\nexport const useEffectWhen = createEffectWhen(useEffect, false);\nexport const useLayoutEffectWhen = createEffectWhen(useLayoutEffect, false);\n/** A hook alike useEffectWhen but skips running the effect for the first time */\nexport const useUpdateEffectWhen = createEffectWhen(useEffect, true);\n/** A hook alike useLayoutEffectWhen but skips running the effect for the first time */\nexport const useUpdateLayoutEffectWhen = createEffectWhen(useLayoutEffect, true);\n\n/** The updater will be wrapped in a useCallback() with no dependencies */\nexport function useStateWithCustomUpdate<T>(initVal: T | (() => T), updater: (v: T) => T) {\n    const [state, setState_] = useState(initVal);\n    const setState = useCallback((valOrUpdater: T | ((current: T) => T)) => {\n        setState_((current) => {\n            const next =\n                typeof valOrUpdater === \"function\"\n                    ? (valOrUpdater as (current: T) => T)(current)\n                    : valOrUpdater;\n            return updater(next);\n        });\n    }, []);\n    return [state, setState] as const;\n}\n\nexport const useAppUrl = () => useSelector(getAppUrl);\n\n/** the object must be the same shame on each render */\nexport const useMemoiseObject = <T extends object>(obj: T): T => {\n    return useMemo(() => obj, Object.values(obj));\n};\n\ntype PartialReducerState<S> = [S, React.Dispatch<Partial<S>>];\n\nconst mergeReducer = <S>(prev: S, next: Partial<S>): S => ({ ...prev, ...next });\n\nexport function usePartialReducer<S>(initialState: S): PartialReducerState<S>;\nexport function usePartialReducer<S, I>(initialArg: I, init: (arg: I) => S): PartialReducerState<S>;\nexport function usePartialReducer<S, I>(initialArg: S | I, init?: (arg: I) => S): PartialReducerState<S> {\n    if (init) {\n        return useReducer(mergeReducer, initialArg as I, init);\n    }\n    return useReducer(mergeReducer, initialArg as S);\n}\n","import { useCallback, useMemo, useSyncExternalStore } from \"react\";\n\nexport function useMediaQuery(query: string) {\n    const watcher = useMemo(() => window.matchMedia(query), [query]);\n    const subscriber = useCallback(\n        (cb: () => void) => {\n            watcher.addEventListener(\"change\", cb);\n            return () => {\n                watcher.removeEventListener(\"change\", cb);\n            };\n        },\n        [watcher]\n    );\n    return useSyncExternalStore(subscriber, () => watcher.matches);\n}\n\nexport const useIsMaxWidth = (maxWidth: number | string) =>\n    useMediaQuery(`(max-width: ${typeof maxWidth === \"number\" ? maxWidth + \"px\" : maxWidth}`);\n\nexport const useIsMinWidth = (minWidth: number | string) =>\n    useMediaQuery(`(min-width: ${typeof minWidth === \"number\" ? minWidth + \"px\" : minWidth}`);\n\nexport const useIsSmallScreen = () => useIsMaxWidth(767);\n"],"names":["useDiagnostics","view","doAnalysis","useMemo","lintSource","doc","messages","references","httpEndpoints","emailEndpoints","routes","formClassBodyEndLine","updateReferences","updateEndpoints","setFormClassBodyEndLine","messagesToDiagnostics","all","state","selection","docLen","maxLine","cursorPos","cursorLine","otherDiagnostics","allDiagnostics","message","line","severity","between","from","to","lineno","offset","linenoEnd","offsetEnd","Math","diagnostic","linter","infoRoot","document","codeFont","root","createRoot","CompletionInfoElement","popup","inner","InfoInner","name","callable","type","helpText","helpLink","tableCols","callSig","returns","options","args","k","optional","defaultVal","annotation","i","s","e","setParamaterHelper","parameterHelper","pos","clearParamaterHelper","setParamaterTooltip","create","_view","ParamTooltipElement","paramaterTooltipField","StateField","tooltips","tr","effect","tooltip","tooltipFrom","tooltipTo","isValid","range","f","showTooltip","StateEffect","paramHelper","paramTooltipInner","currentParam","fn","params","sig","container","ModuleEditor","lazyComponent","AssetEditor","DataBindingEditor","HtmlFormTemplateEditor","HtmlPropertyEditor","ImportMapEditor","LazyAssetEditor","NativeLibrariesEditor","StylePropertyEditor","HtmlBodyEditor","classBodyAnchorField","value","CreateEventHandlerWidget","WidgetType","host","other","widgetTheme","EditorView","useCreateEventHandlerWidget","enabled","useConstant","el","useExtension","anchor","Decoration","at","hoverThemeCompartment","Compartment","useJumpToDefinition","tabNavTarget","codeItemId","appId","useSelector","getAppId","appUrl","useAppUrl","appPackageName","getAppPackageName","allCodeNames","getCodeNames","dispatch","useDispatch","appTabDetails","HoverMarkerField","ViewPlugin","JumpToDefinition","Facet","getCodeItemFromRequest","def","codeItem","console","wrapWithDelay","timeout","resetTimeout","called","clearTimeout","setTimeout","undefined","toggle","hoverPointerTheme","defs","col","navigate","hoverRange","DefRanges","ranges","pkgPrefix","codeRef","parseInt","codeRefDef","item","defInFile","changes","L","val","useServerPanels","isServer","endpointsState","ServerPanelBody","icon","children","copyText","localStorageKey","isExpanded","setIsExpanded","useStateWithCustomUpdate","v","localStorage","timeoutRef","useRef","onEnter","useEvent","onLeave","seen","FontAwesomeIcon","cx","CopyButton","RoutesPanelContent","environmentOrigins","getEnvironmentOrigins","apiOrigins","origin","onPublishClick","modal","faWifi","body","Button","HttpEndpointPanelContent","faInfoCircle","EmailEndpointPanelContent","publishInfo","getPublishInfo","origins","getAppOrigins","emailDomain","privateEnvs","publicEnvs","customEnvs","isPublished","faEnvelope","useHasEndpoints","key","useViewSelector","EmailEndpointPanel","HttpEndpointPanel","RoutesPanel","Endpoints","ServerPanels","hasBottomPanels","showPanel","bottom","setBottomOffset","useState","useEffect","runningReplCommands","outstandingDebuggerRequestCallbacks","lastRequestId","newTabWindowAtom","ExternalState","getRunnerUrl","runnerOrigin","runPath","useRunnerSrc","getRunnerOrigin","environments","getCategorisedEnvironments","tableauService","getTableauService","tableauDashboard","userUiPrefs","getUserUiPrefs","useCommunicateWithRunner","runningAppWindow","src","useMessages","appOrigins","onMessage","useOnMessage","handlePythonError","useHandlePythonError","handleImportError","useHandleImportError","runtimeOptions","getAppRuntimeOptions","serverModules","getServerModules","supportsCustomPackages","useFeatureSupported","supportsFullPythonRuntime","msg","n","modname","appIsCustom","maybeConfigureOrUpgradeOnImportFailure","sm","m","promptIfRuntimeMissing","confirm","_","getState","maybeReplReturnOrDebuggerCallback","replReturn","runnerOutput","clearRepl","getDebugEnvBreakpointsForRunner","restartApp","newDebugSession","incrementImportTimeTracking","onDebuggerUpdate","handleRunnerBgTaskEvent","runnerConnectionStateChanged","claimAchievement","onReplCmd","cmdId","code","extraArgs","requestId","onReplInterrupt","onDebuggerRequest","request","callback","onMsg","onEvent","EVENTS","window","offEvent","runMode","getRunMode","heartbeatRef","setInterval","stopApp","clearInterval","setBannerUsed","useBanner","app","getApp","commitId","getRunCommitId","bannerUsed","onPostBannerMessage","refresh","getRunRefresh","onLocationRefresh","useNewTabRunner","newTabWindow","setNewTabWindow","useExternalState","onRunModeChange","useEffectEvent","RunnerNewTabFocusButton","faExternalLinkSquare","initPosition","RunnerIframe","isMaximized","getRunnerViewMaximised","setRunningAppWindow","iframeRef","runnerMaximised","onExpandRunnerClick","restoreRunner","maximiseRunner","onDrop","onDragEnd","onDragOver","onDragStart","isDragging","style","onPointerDown","dragItemRef","containerRef","useDraggableMaximizeButton","position","setPosition","useReducer","prev","next","setIsDragging","onPointerUp","rect","JSON","containerRect","offsets","newLeft","newTop","useResizeObserverTimeout","dragItemRect","newPosition","isPaused","getIsRunnerPaused","faCompressArrowsAlt","faExpandArrowsAlt","RunAppButton","NumErrorWarningBtn","ImportBanner","repl","persistentAvailable","showBanner","importBannerToolTip","importBannerAnchorRef","useTooltip","recordActivity","LinkInternal","UpgradeBadge","useIsRunning","dbg","runningCmdIdx","ReplToolbar","id","autoScroll","setAutoScroll","preserveReplLogs","getPreserveReplLogs","preserveLogs","setPreserveLogs","autoScrollToolTip","autoScrollAnchorRef","refreshToolTip","refreshAnchorRef","onUpdatePreserveLogs","p","setPreserveReplLogs","liveOutputSearchStore","faMagnifyingGlass","faTrash","restartRepl","faRefresh","faLevelDownAlt","CheckBox","noninteractive","sessionToken","getDebugSessionToken","isRunner","frameContext","useContext","StackFrameContext","hyperstackId","onCloseBanner","dismissReplBanner","onExec","replCommand","onInterrupt","replInterrupt","appHasChanged","isRunnerPaused","pausedServerReplHyperstackId","getPausedServerReplHyperstackId","readOnly","isRunning","pausedHyperstackId","overlay","onKeyDown","checkMeta","LiveOutput","ReplEditor","faPause","openOrFocusBottomTab","VulnerablePackage","pkg","Heading","x","description","fix_versions","Text","join","PipAudit","modalId","checkDate","pipAudit","reportDate","moment","Modal","modalReturn","connector","connect","getAppEditState","otherUser","canBranch","editState","modalRef","ModalButton","faRedo","faCodeBranch","DAY_OPTIONS","DAYS","day","idx","ScheduledTaskInput","props","ContentTextInput","BgTaskFnItem","moduleName","BackgroundTaskPicker","task_name","updateTask","packageName","backgroundTasksFromAutoCompleter","setBackgroundTasksFromAutoCompleter","useEffectAsync","bgTasks","getDefinedBackgroundTasks","backgroundItems","backgroundRenderMap","packagePrefix","RegExp","bgRender","Map","simplifiedModuleName","Array","ComboBox","blockEvent","useUpdateTaskOnChange","EditTimeSpec","task","inline","className","timeSpec","atSpec","hourStr","String","minuteStr","every","onChangeEvery","onChangeN","onChangeDay","onChangeHour","onChangeMin","ContentDropdownMenuItem","PERIODS","period","namePeriod","WEEK","MONTH","getOrdinalSuffix","MINUTE","HOUR","DAY","EDIT_TEXT","ADD_TEXT","originalTask","saveKey","taskReducer","isExistingTask","markUnsaved","markSaved","onUpdateOrAdd","updateScheduledTask","addScheduledTask","title","save","cancel","inputClasses","useInputStyles","faClock","ScheduledTaskLastRunInfo","useStyles","makeStyles","theme","FullRuntimeStatus","onStartTrial","onConfirmTrialRequested","user","getUser","onStartRuntimeTrial","startTrial","faChevronRight","CustomPackagesStatus","onInstallPackagesNow","faCheck","UpgradePromptOnOpenApp","featureIds","subscription","getSubscription","features","requiredPlan","setRequiredPlan","api","canRunWithout","fid","fullPythonRequired","customPackagesRequired","isDedicatedPlan","rpName","getPlanName","renderFeature","featureId","feature","HelpLink","startUpgrade","ConfigureOrUpgradePromptOnRuntimeFeatureRequired","module","hasRuntime","configured","trialRequested","classes","getFeatures","plan","isPySpace","useIsPySpace","subStateRef","goToSettings","useCallback","restoreRunnerView","startRuntimeTrial","reloadUser","alert","goToUpgrade","Object","goToPySpacePackages","setRightPanelContent","buttons","planInfo","UpgradePrompt","additionalIntroText","getIsIDE","planName","faAngleDoubleUp","pi","SelectableUri","display","isSelected","setSelected","thumbnail","closeOnDoubleClick","linkRef","cancelled","DefaultUri","selected","defaultValue","getThumbnail","ShowAllAssetsLink","viewAllAssets","setViewAllAssets","SelectableAssets","accept","isSelectedAsset","includeDependencies","assetPrefix","appAssets","depAssets","allAssets","useAssets","assets","thumbnails","useThumbnails","asset","UrlInput","isURL","TextInput","urlText","setUrlText","onUrlChange","text","cssify","UploadButton","checkValidity","maxSize","FileInput","onFileChange","valid","addNew","codeStructure","uploadAsset","faUpload","modalProps","spec","onModalReturn","freeText","uploadInfo","onSave","rv","modalTypes","modals","getModals","modalPropsCache","ModalComponent","commonModalTypes","Alert","Confirm","ConfirmWithCheckBox","Prompt","DeleteGadgetModal","SimpleModal","groupTheme","ignoreSsrWarning","ButtonGroupItem","option","selectedVariant","variant","elevated","disabled","onClick","onDoubleClick","buttonProps","longPressHandlers","useLongPress","ButtonGroup","selectedOption","allowReselect","selectedValues","initialState","ErrorBoundary","React","error","prevProps","lastDeps","newDeps","faSync","ErrorSuspenseBoundary","fallback","Suspense","zenMode","getZenMode","runApp","tooltipAnchor","tooltipRef","faStop","faPlay","getRunnerOutput","numErrors","r","numErrorsWarningMsg","errorsAnchor","errorsRef","onToggleZenMode","toggleZenMod","faTriangleExclamation","encryptSecret","newValue","extractable","canEncrypt","restrict","updateState","updateGlobalLoadingIndicator","saveSecretValue","secretObj","set","reloadAppConfig","markAppPathUnsaved","_props","DeleteSecretModal","secretType","ViewSecretModal","secret","SecretConfiguredModal","SecretItemNameBox","encryptedSecretObj","otherAppValues","blank","hasOtherAppValues","isBlank","tt","anchorRef","faUserFriends","SecretButtons","onDeleteSecretItem","onViewSecret","SetSecretValueButton","faEye","environmentLabel","environment","EnvironmentOverrideRows","onClearEnvironmentOverride","onGenSecret","onSetSecretValue","hasEnvironmentSecretValue","faPencil","SecretKeysButtons","items","environmentItems","faPlus","PySpaceSecretItemNameBox","SecretItem","PySpaceSecretItem","IconButton","faTrashCan","KeyItem","tab","appConfig","getAppConfig","getEnvironmentName","environmentPid","candidate","useUpdateTabTitle","appSecrets","secrets","secretName","a","b","appKeys","keys","mkRestriction","restriction","hasValue","getScopedSecretValue","environmentName","prompt","encrypted","setScopedSecretValue","encryptedObj","decrypted","clearEnvironmentSecretValue","Error","onNewSecret","newAppSecret","nameBase","newName","requestedName","itemProps","hasSecrets","hasKeys","itm","TabToolbar","ref","leftSide","allowScroll","restProps","formatDateTime","dt","simpleOnly","jobId","scheduledTaskInfo","useQuery","getScheduledTaskInfo","info","lastRun","timeAgoString","infoUi","Fragment","PythonVersionConfigLoaded","customPackagesAvailable","getCustomPackagesAvailable","enableScripts","supportsPersistentServer","clientVersion","setClientVersion","serverPersist","setServerPersist","serverSpec","setServerSpec","useStateWithReset","serverSpecSaveTimeout","clientSaveIndicator","setClientSaved","useSaveIndicator","serverSaveIndicator","setServerSaved","serverBaseSaveIndicator","setServerBaseSaved","requirementsSaveIndicator","setRequirementsSaved","updateClientVersion","event","updateAppConfig","updateServerPersist","onSavedCallbacks","updatePreInstallScript","pre_install_script","current","updatePostInstallScript","post_install_script","updateRequirements","requirements","updateServerBaseImage","base","serverSpecTimeout","serverSpecInitialised","advancedOptionsInDefaultState","showAdvanced","setShowAdvanced","pythonVersions","versions","pythonVersion","setPythonVersion","version","checkLegacyEnvironmentsForDynamicDownlinks","useCheckLegacyEnvironmentsForDynamicDownlinks","hasLegacy","hasLegacyEnvironments","Boolean","confirmAndMigrateApp","choosePythonVersion","selectVersion","newServerSpec","image","PythonVersionSettings","PackageRequirementsEditor","RuntimeBuildStatus","OtherRuntimeSettings","shown","onEditedReadOnlyApp","checkAppExists","removeSavingAppPathsUpdater","savingAppPaths","saveId","sid","unsavedCallbacks","Set","notifyUnsavedCallback","cb","saveAppOnIdle","getAppIsEditable","onIdle","saveApp","queuedBackgroundSave","finaliseCommit","commitMessage","immediate","yamlUpdates","cancelOnIdle","branch","userBranch","isEmpty","editor","unsavedAppPaths","appPaths","userState","appState","merge","currentsavingAppPaths","allChangedAppPaths","calculateYamlUpdates","changedAppPaths","updates","appPath","appPathType","appPathContent","itemType","conflicts","resolvedConflictItem","deleted","getCachedCodeItem","HIDDEN_CODE_PATH","idKey","formToSave","formItem","deflateHtmlFormYamlForPersistence","cloneDeep","conflictItem","itemAppPath","getAppPathForConflictItem","itemAppPathType","itemAppPathContent","cachedCodeItem","findConflictsInCentralState","t","configKey","saveBody","maybeTriggerQueuedSave","saveAttempt","saveUrl","encodeURIComponent","saved","fetch","resp","newCommitId","handleVersionUpdate","resetAppOriginsExpiry","raiseEvent","branchOff","resetBranch","loadVersion","deleteAppWithConfirm","appObj","deleteAppModal","snapshot","snapshotIdeAppListQueries","updateIdeAppListQueries","listedApp","invalidateIdeAppListQueries","nullApp","restoreIdeAppListQueries","waitForSavingComplete","start","Date","Promise","resolve","ManagerInstanceGlobalsContext","createContext","EditorInstanceGlobalsContext","round","iconRight","titlePosition","preventDefaultClick","linkStyle","linkClassName","LinkComponent","buttonRef","useMergeRefs","size","copiedTimeout","copied","setCopied","doCopy","copyTextToClipboard","onBlur","faClone","textStyle","classStyles","InputLabel","ContentTextAreaInput","textInputVariants","cva","labelVariants","small","notSmall","gadgetId","gadgetName","username","setMessage","inputRef","node","PySpaceTextArea","onUploadFile","file","useTitleBarToolTips","gadget","renameTT","renameTTAnchor","changeVisibilityTT","changeVisibilityTTAnchor","sharingTT","sharingTTAnchor","docsTT","docsTTAnchor","openAnvilTT","openAnvilTTAnchor","likeTT","likeTTAnchor","cloneTT","cloneTTAnchor","reportTT","reportTTAnchor","expandTT","expandTTAnchor","GadgetTitleBarWrapper","connectEditableGadgetTitleBar","getShareState","getIsScript","VisibilityButtons","sharing","PyspaceButton","isScript","renamingTo","setRenamingTo","saveIndicator","setSaved","setSaveError","gadgetEvents","GadgetEventsContext","historyStore","useHistoryStore","prevRenamingTo","saveName","renameGadget","requestDelete","deleteGadget","isSavingShareState","setSavingShareState","toggleShared","setShareState","isPopoutEditor","PopoutContext","userDetails","getNotifications","DropdownMenu","showMenu","faGear","faChevronDown","faHome","openInAnvil","faAnvilLogoSolid","faArrowUpRightFromSquare","faShareNodesRegular","faUndo","faPen","faShareNodes","Link","faCircleQuestion","ProfileMenu","connectReadOnlyGadgetTitleBar","getGadgetOwner","getGadgetDetails","getIsEmbedded","getIsPySpace","getIsPopout","owner","isEmbedded","isPopout","openShareModal","onFork","setShouldPopout","InternalEmbeddedContext","openInPySpace","onClosed","onLiked","doLike","newState","setLikedGadget","faBars","faSolidHeart","faLightHeart","reportGadgetAbuse","faExclamationCircle","faArrowUpRightAndArrowDownLeftFromCenter","faArrowDownLeftAndArrowUpRightToCenter","BLANK_SESSION","OutputScroller","output","outputScroller","sessions","getSessions","useLayoutEffect","dropNextNewline","lastSessionId","evt","compressEvent","isNewSession","newSession","LogEvent","OutputFromWebSocket","clearOutput","connectFooter","getForms","getScheduledTasks","forms","scheduledTasks","isEditable","navTarget","getCurrentNavTarget","currentScriptName","masterEnvOrigin","useMasterEnvironmentOrigin","doPublish","createDefaultEnvironment","getNewEnvironmentURL","scriptSessions","setScriptSessions","scriptState","setScriptState","currentRun","setCurrentRun","wsSessions","currentWsSession","announceAppRunning","doRunScript","scriptName","runScript","doStopScript","killBackgroundTask","killScript","doRunApp","runAppInNewTab","useStoreSelector","acStateStore","scheduledTask","createScheduledTask","removeScheduledTask","deleteScheduledTask","rightContent","content","PySpaceButton","faTrashCanClock","faHourglass","url","showUnknownPathSuffix","faRedoAlt","refreshNewTab","faSquare","faGlobe","openHeight","setOpenHeight","footerHeight","_setFooterHeight","setFooterHeight","h","footerIsOpen","toggleFooter","hasOutput","renderedOutput","useOutput","currentScriptOutputOnly","wsOutput","getOutput","runnerRepl","getRunnerRepl","hasWsOutput","renderedWsOutput","relevantOutput","session_id","renderedGuiOutput","REPL","formattedTimeSpec","useFormatTimeSpec","ResizePanel","faCircleInfo","faMinus","useGadgetEvents","createContextHook","appName","getAppName","oldDefaultPackageName","defaultPackageName","updatePackageName","createGadgetThumbnailFromBlob","isScreenShot","resizedThumbnail","forceImageToSizeAndType","pyspaceApi","URL","events","like","getIsLoggedIn","liked","nextTabId","createSelector","getCodeStructure","tabs","walkStructure","itemTypeFromCodePath","createRepl","runnerReplStateUpdate","debugStateUpdate","reportMessage","getClientCodeStructure","walk","serverCode","clientCode","scripts","services","hasExtraServices","source","hasAServerModule","hasNoServerCode","hasAScript","hasNoScripts","hasAForm","hasNoClientCode","EMPTY_ARRAY","updater","markNotificationsRead","timestamp","postJson","getAllNotifications","get","setGadgetThumbnail","picture","setSharing","setLiked","getFollowers","getFollowing","SiteProvider","initialStoreState","store","createSiteStore","Provider","ThemeContext","PySpaceLightTheme","Modals","getPyspaceSiteModals","withSiteProvider","Component","selectItem","hideMenu","faUser","faBell","faSignOut","notifications","NotificationsButton","OneNotification","notification","now","gadgetLink","d","date","timeAgo","NotificationsModal","newNotifications","showingAll","setShowingAll","allNotifications","setAllNotifications","useNowWithRefresh","loadAllNotifications","pySpaceApi","changeNotificationGroup","LoadingSpinner","siteModals","SocialInputs","socialType","profile","updateSocial","profileErrors","ttRef","PySpaceTextInput","originalProfile","setProfile","socials","faLink","faXTwitter","faGithub","faLinkedin","faMastodon","faBluesky","setProfileErrors","validateAndMaybeSubmit","err","regexRestriction","handleChange","propName","social","TestSiteSmallModal","usersWho","SetView","followers","usersFollowed","setUsersFollowed","usersWhoFollow","setUsersWhoFollow","users","TestSiteMediumModal","UploadFileModal","EditUserProfileModal","ReportAbuseModal","FollowingModal","initStore","produce","baseProducer","useGenerateThumbnailFromScreenshot","nextStoreId","createAnvilStore","getStoreId","action","uiScales","systemDarkWatcher","subscribeSystemDarkWatcher","getSystemDarkSnapShot","getUserTheme","scale","getUserUiScale","isSystemDark","useSyncExternalStore","isDark","html","CacheProvider","cache","DarkTheme","LightTheme","remToPixelMultiplier","rem","uiScale","useRemToPixels","useMinPixelsToSplit","Number","useTheme","useIsDark","createCache","css","tssCx","createCssAndCx","inputs","twMerge","withStyles","createMakeAndWithStyles","tabPanelRef","useTabPanelRef","deps","execute","Symbol","result","useEffectAsyncWhen","flag","useMemoAsync","initialValue","func","setX","setState","prevValue","setPrevValue","useActionOnStateChange","createObserverHook","createObserver","onChange","onRemove","notifyRemove","observer","target","useResizeObserverImpl","ResizeObserver","useResizeObserver","onResize","useMutationObserver","MutationObserver","delay","useRenderOnResize","rerender","useRerender","init","refs","refsToAssign","useRefreshValue","setVal","context","ctx","useActionOnTimeout","createUpdateEffect","effectHook","isMounted","useUpdateEffect","useUpdateLayoutEffect","createEffectWhen","updateEffect","prevDepsRef","runEffect","prevDeps","useEffectWhen","useLayoutEffectWhen","useUpdateEffectWhen","initVal","setState_","valOrUpdater","getAppUrl","useMemoiseObject","obj","mergeReducer","usePartialReducer","initialArg","useIsSmallScreen","useMediaQuery","query","watcher","subscriber"],"mappings":"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"}