{"version":3,"file":"static/js/pyspace.js?sha=9c425a058460","sources":["webpack://ide/webpack/runtime/create_fake_namespace_object","webpack://ide/webpack/runtime/load_script","webpack://ide/webpack/runtime/on_chunk_loaded","webpack://ide/webpack/runtime/jsonp_chunk_loading","webpack://ide/./src/analysis/completions.ts","webpack://ide/./src/code_mirror/autocompletions/analysis-status.ts","webpack://ide/./src/analysis/diagnostics.ts","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/conflict_actions.tsx","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/components/sidebar/SecondaryNavSection.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/PythonAndPackagesConfig.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/modals/names/pyspace-gadget-editor-modals.ts","webpack://ide/./src/pyspace/gadget_editor/components/GadgetCrud.tsx","webpack://ide/./src/pyspace/gadget_editor/modals/EditGadgetDetailsModal.tsx","webpack://ide/./src/pyspace/gadget_editor/modals/ScheduleScriptModal.tsx","webpack://ide/./src/pyspace/gadget_editor/modals/CloneReadOnlyGadgetModal.tsx","webpack://ide/./src/pyspace/gadget_editor/modals/ShareGadgetModal.tsx","webpack://ide/./src/pyspace/gadget_editor/store/gadget-store.ts","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/utils/hooks/use-pyspace-keybindings.ts","webpack://ide/./src/pyspace/gadget_editor/controllers/gadget.ts","webpack://ide/./src/pyspace/pyspace-api.ts","webpack://ide/./src/pyspace/common/components/PySpaceToggle.tsx","webpack://ide/./src/pyspace/site/ComponentsExpo.tsx","webpack://ide/./src/pyspace/site/components/AccountSettings.tsx","webpack://ide/./src/pyspace/site/controllers/space.ts","webpack://ide/./src/pyspace/site/controllers/profile.ts","webpack://ide/./src/pyspace/site/components/GadgetList.tsx","webpack://ide/./src/pyspace/site/components/Spaces.tsx","webpack://ide/./src/pyspace/site/components/GlobalSearch.tsx","webpack://ide/./src/pyspace/site/components/UserProfileEditor.tsx","webpack://ide/./src/pyspace/pyspace.tsx","webpack://ide/./src/router/gadget-navigation.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/controllers/my-gadgets.ts","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-root-elements.ts","webpack://ide/./src/pyspace/utils/hooks/use-screenshot/index.tsx","webpack://ide/./src/router/navigation.ts","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","webpack://ide/webpack/runtime/css loading","webpack://ide/webpack/runtime/compat_get_default_export","webpack://ide/webpack/runtime/define_property_getters","webpack://ide/webpack/runtime/ensure_chunk","webpack://ide/webpack/runtime/get javascript chunk filename","webpack://ide/webpack/runtime/get mini-css chunk filename","webpack://ide/webpack/runtime/global","webpack://ide/webpack/runtime/has_own_property","webpack://ide/webpack/runtime/make_namespace_object","webpack://ide/webpack/runtime/node_module_decorator","webpack://ide/webpack/runtime/nonce","webpack://ide/webpack/runtime/public_path"],"sourcesContent":["var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n  __webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; } });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\n\nvar dataWebpackPrefix = \"ide:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function (url, done, key, chunkId) {\n\tif (inProgress[url]) {\n\t\tinProgress[url].push(done);\n\t\treturn;\n\t}\n\tvar script, needAttach;\n\tif (key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor (var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif (s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) {\n\t\t\t\tscript = s;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!script) {\n\t\tneedAttach = true;\n\t\t\n    script = document.createElement('script');\n    \n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\t\n\t\tscript.src = url;\n\t\t\n    \n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function (prev, event) {\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns &&\n\t\t\tdoneFns.forEach(function (fn) {\n\t\t\t\treturn fn(event);\n\t\t\t});\n\t\tif (prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(\n\t\tonScriptComplete.bind(null, undefined, {\n\t\t\ttype: 'timeout',\n\t\t\ttarget: script\n\t\t}),\n\t\t120000\n\t);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif (chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor (var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--)\n\t\t\tdeferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\nvar fn = deferred[i][1];\nvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif (\n\t\t\t\t(priority & (1 === 0) || notFulfilled >= priority) &&\n\t\t\t\tObject.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })\n\t\t\t) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif (priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif (fulfilled) {\n\t\t\tdeferred.splice(i--, 1);\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n      // object to store loaded and loading chunks\n      // undefined = chunk not loaded, null = chunk preloaded/prefetched\n      // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n      var installedChunks = {\"2560\": 0,};\n      \n        __webpack_require__.f.j = function (chunkId, promises) {\n          // JSONP chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId)\n\t? installedChunks[chunkId]\n\t: undefined;\nif (installedChunkData !== 0) {\n\t// 0 means \"already installed\".\n\n\t// a Promise means \"currently loading\".\n\tif (installedChunkData) {\n\t\tpromises.push(installedChunkData[2]);\n\t} else {\n\t\tif (2935 != chunkId) {\n\t\t\t// setup Promise in chunk cache\n\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\tpromises.push((installedChunkData[2] = promise));\n\n\t\t\t// start chunk loading\n\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\tvar error = new Error();\n\t\t\tvar loadingEnded = function (event) {\n\t\t\t\tif (__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\tif (installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\tif (installedChunkData) {\n\t\t\t\t\t\tvar errorType =\n\t\t\t\t\t\t\tevent && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\terror.message =\n\t\t\t\t\t\t\t'Loading chunk ' +\n\t\t\t\t\t\t\tchunkId +\n\t\t\t\t\t\t\t' failed.\\n(' +\n\t\t\t\t\t\t\terrorType +\n\t\t\t\t\t\t\t': ' +\n\t\t\t\t\t\t\trealSrc +\n\t\t\t\t\t\t\t')';\n\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t} else installedChunks[chunkId] = 0;\n\n\t}\n}\n\n        }\n        __webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\nvar moreModules = data[1];\nvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif (chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor (moduleId in moreModules) {\n\t\t\tif (__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif (runtime) var result = runtime(__webpack_require__);\n\t}\n\tif (parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor (; i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif (\n\t\t\t__webpack_require__.o(installedChunks, chunkId) &&\n\t\t\tinstalledChunks[chunkId]\n\t\t) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkide\"] = self[\"webpackChunkide\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));\n","import {\n    type Completion,\n    type CompletionContext,\n    type CompletionResult,\n    type CompletionSource,\n    pickedCompletion,\n    snippet,\n    startCompletion,\n} from \"@codemirror/autocomplete\";\nimport { isolateHistory } from \"@codemirror/commands\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { forceLinting } from \"@codemirror/lint\";\nimport { StateEffect, Transaction, type TransactionSpec } from \"@codemirror/state\";\nimport type { EditorView } from \"@codemirror/view\";\nimport type { SyntaxNode } from \"@lezer/common\";\nimport { pythonCompletionAllowed } from \"@/code_mirror/autocompletions/completion-extension\";\nimport { pythonDocumentationElement } from \"@/code_mirror/autocompletions/info\";\nimport { type LspRange, lspRangeToOffsets } from \"./positions\";\n\nexport type { LspRange } from \"./positions\";\n\nexport interface LspCompletion {\n    label: string;\n    labelDetails?: { detail?: string; description?: string };\n    kind?: number;\n    detail?: string;\n    documentation?: string | { kind: string; value: string };\n    sortText?: string;\n    filterText?: string;\n    insertText?: string;\n    insertTextFormat?: number;\n    textEdit?: { newText: string; range: LspRange } | { newText: string; insert: LspRange; replace: LspRange };\n    additionalTextEdits?: { range: LspRange; newText: string }[];\n    data?: unknown;\n}\nexport interface LspCompletionList {\n    items: LspCompletion[];\n    isIncomplete?: boolean;\n}\nexport type PythonCompletionRequest = (options: {\n    method: \"textDocument/completion\" | \"completionItem/resolve\";\n    offset: number;\n    signal: AbortSignal;\n    item?: LspCompletion;\n    autoImport?: false | \"only\";\n}) => Promise<{ result: LspCompletionList | LspCompletion | null; isCurrent(): boolean } | undefined>;\n\nconst kinds: Record<number, string> = {\n    1: \"text\",\n    2: \"method\",\n    3: \"function\",\n    4: \"function\",\n    5: \"property\",\n    6: \"variable\",\n    7: \"class\",\n    8: \"interface\",\n    9: \"namespace\",\n    10: \"property\",\n    12: \"constant\",\n    13: \"enum\",\n    14: \"keyword\",\n    15: \"text\",\n    21: \"constant\",\n    22: \"constant\",\n};\n\nfunction insertCallParentheses(context: CompletionContext, item: LspCompletion, to: number) {\n    if (![2, 3, 4, 7].includes(item.kind ?? 0) || item.insertTextFormat === 2) return false;\n    // Semantic exceptions come from the adapter; syntax decisions use the\n    // editor's existing Python tree and run only when accepting a suggestion.\n    const preference =\n        typeof item.data === \"object\" && item.data !== null && \"insertParentheses\" in item.data\n            ? item.data.insertParentheses\n            : undefined;\n    if (preference === false || /^\\s*\\(/.test(context.state.sliceDoc(to, context.state.doc.lineAt(to).to)))\n        return false;\n    let insideArguments = false;\n    for (\n        let node: SyntaxNode | null = syntaxTree(context.state).resolveInner(context.pos, -1);\n        node;\n        node = node.parent\n    ) {\n        if (node.name === \"ImportStatement\" || node.name === \"TypeDef\") return false;\n        if (node.name === \"Decorator\" && !insideArguments && preference !== true) return false;\n        if (node.name === \"ArgList\") {\n            if (node.parent?.name === \"ClassDefinition\" && item.kind === 7) return false;\n            insideArguments = true;\n        }\n        if (node.parent?.name === \"TryStatement\" && node.prevSibling?.name === \"except\") return false;\n    }\n    return true;\n}\n\n// A content-only literal edit should finish after the existing closing quotes,\n// just as the original completer did when replacing the whole string token.\nfunction completionCursor(context: CompletionContext, primary: { from: number; to: number }) {\n    const node = syntaxTree(context.state).resolveInner(primary.to, -1);\n    if (node.name !== \"String\") return primary.to;\n    const text = context.state.sliceDoc(node.from, node.to);\n    const opening = text.match(/^[rub]*(\"\"\"|'''|\"|')/i);\n    const quote = opening?.[1];\n    if (\n        !quote ||\n        text.length < opening[0].length + quote.length ||\n        !text.endsWith(quote) ||\n        primary.from < node.from + opening[0].length ||\n        primary.to !== node.to - quote.length\n    )\n        return primary.to;\n    const escapes = text.slice(0, -quote.length).match(/\\\\*$/)?.[0].length ?? 0;\n    return escapes % 2 === 0 ? node.to : primary.to;\n}\n\n/** Apply Ty's complete edits immediately; resolve documentation separately. */\nexport function pythonCompletionSource(\n    request: PythonCompletionRequest,\n    options: { onError?(error: unknown): void } = {}\n): CompletionSource {\n    return async (context) => {\n        if (!pythonCompletionAllowed(context)) return null;\n        const controller = new AbortController();\n        context.addEventListener(\"abort\", () => controller.abort(), { onDocChange: true });\n        const answer = await request({\n            method: \"textDocument/completion\",\n            offset: context.pos,\n            signal: controller.signal,\n        });\n        if (!answer || context.aborted || !answer.isCurrent() || !answer.result || !(\"items\" in answer.result))\n            return null;\n        const doc = context.state.doc;\n        const from = context.matchBefore(/[\\p{ID_Continue}]*$/u)?.from ?? context.pos;\n        const to = context.pos;\n        let inAnnotation = false;\n        for (\n            let node: SyntaxNode | null = syntaxTree(context.state).resolveInner(context.pos, -1);\n            node;\n            node = node.parent\n        ) {\n            if ([\"TypeDef\", \"TypeDefinition\"].includes(node.name)) {\n                inAnnotation = true;\n                break;\n            }\n        }\n        const showPrivate =\n            doc.sliceString(from, context.pos).startsWith(\"_\") ||\n            syntaxTree(context.state).resolveInner(context.pos, -1).name === \"String\";\n        const completions: Completion[] = [...answer.result.items]\n            .filter((item) => {\n                const requiresTypeChecking =\n                    typeof item.data === \"object\" &&\n                    item.data !== null &&\n                    \"requiresTypeChecking\" in item.data &&\n                    item.data.requiresTypeChecking === true;\n                return (\n                    (!requiresTypeChecking || inAnnotation) &&\n                    (showPrivate ||\n                        !item.label.split(\".\").at(-1)?.startsWith(\"_\") ||\n                        /^[\"']/.test(item.textEdit?.newText ?? item.insertText ?? \"\"))\n                );\n            })\n            .sort((a, b) => (a.sortText ?? a.label).localeCompare(b.sortText ?? b.label))\n            .map((item) => ({\n                label: item.label,\n                displayLabel:\n                    item.kind === 9 && item.additionalTextEdits?.length ? item.label.split(\".\").at(-1) : item.label,\n                detail: item.additionalTextEdits?.length ? \"auto import\" : item.labelDetails?.detail,\n                type: item.kind ? kinds[item.kind] : undefined,\n                apply: (view, completion) => {\n                    if (view.state.doc !== doc || !answer.isCurrent()) return;\n                    try {\n                        const edit = item.textEdit;\n                        const primary = edit\n                            ? lspRangeToOffsets(view.state, \"range\" in edit ? edit.range : edit.replace)\n                            : { from, to };\n                        let text = edit?.newText ?? item.insertText ?? item.label;\n                        const call = text === item.label && insertCallParentheses(context, item, primary.to);\n                        if (call) text += \"()\";\n                        const edits = [\n                            { ...primary, insert: text },\n                            ...(item.additionalTextEdits ?? []).map((edit) => ({\n                                ...lspRangeToOffsets(view.state, edit.range),\n                                insert: edit.newText,\n                            })),\n                        ].sort((a, b) => a.from - b.from || a.to - b.to);\n                        for (let index = 1; index < edits.length; index++) {\n                            if (edits[index - 1].to > edits[index].from)\n                                throw new Error(\"Overlapping completion edits\");\n                        }\n                        if (item.insertTextFormat === 2) {\n                            // LSP snippets use numbered placeholders and a final $0. CodeMirror\n                            // numbers all fields in order, so put the final field last.\n                            const template = text.replace(/\\$\\{0(?=[:}])|\\$(\\d+)/g, (match, number) =>\n                                number ? `\\${${number === \"0\" ? \"999\" : number}}` : \"${999\"\n                            );\n                            // Capture CodeMirror's snippet transaction before committing it.\n                            // This keeps placeholder state, indentation and auto-imports in\n                            // one view update, with no partially applied intermediate edit.\n                            let primaryTransaction: Transaction | undefined;\n                            snippet(template)(\n                                {\n                                    state: view.state,\n                                    dispatch: (spec: TransactionSpec) => {\n                                        primaryTransaction = view.state.update(spec, {\n                                            annotations: isolateHistory.of(\"before\"),\n                                        });\n                                    },\n                                } as EditorView,\n                                completion,\n                                primary.from,\n                                primary.to\n                            );\n                            if (!primaryTransaction) throw new Error(\"Missing snippet transaction\");\n                            const extraChanges = view.state\n                                .changes(\n                                    (item.additionalTextEdits ?? []).map((edit) => ({\n                                        ...lspRangeToOffsets(view.state, edit.range),\n                                        insert: edit.newText,\n                                    }))\n                                )\n                                .map(primaryTransaction.changes);\n                            view.dispatch({\n                                changes: primaryTransaction.changes.compose(extraChanges),\n                                selection: primaryTransaction.newSelection.map(extraChanges),\n                                effects: StateEffect.mapEffects(primaryTransaction.effects, extraChanges),\n                                annotations: [\n                                    Transaction.userEvent.of(\"input.complete\"),\n                                    pickedCompletion.of(completion),\n                                    isolateHistory.of(\"full\"),\n                                ],\n                                scrollIntoView: true,\n                            });\n                        } else {\n                            const changes = view.state.changes(edits);\n                            view.dispatch({\n                                changes,\n                                selection: {\n                                    anchor: changes.mapPos(completionCursor(context, primary), 1) - Number(call),\n                                },\n                                annotations: [\n                                    Transaction.userEvent.of(\"input.complete\"),\n                                    pickedCompletion.of(completion),\n                                    isolateHistory.of(\"full\"),\n                                ],\n                            });\n                        }\n                        // Recheck added imports immediately, just as Ruff's own fixes do.\n                        if (item.additionalTextEdits?.length) forceLinting(view);\n                        if (call) startCompletion(view);\n                    } catch (error) {\n                        if (options.onError) options.onError(error);\n                        else console.error(error);\n                    }\n                },\n                info: async () => {\n                    const resolved = await request({\n                        method: \"completionItem/resolve\",\n                        offset: context.pos,\n                        signal: new AbortController().signal,\n                        item,\n                    });\n                    const result = resolved?.result;\n                    if (!result || \"items\" in result || !resolved.isCurrent()) return null;\n                    const autoImport = item.additionalTextEdits?.length\n                        ? { module: item.labelDetails?.description }\n                        : undefined;\n                    return result.detail || result.documentation || autoImport\n                        ? pythonDocumentationElement({ ...result, state: context.state, autoImport })\n                        : null;\n                },\n            }));\n        return { from, to, filter: false, options: completions };\n    };\n}\n\n/** Keep ordinary suggestions independent of the slower, automatic import search. */\nexport function pythonCompletionSources(\n    request: PythonCompletionRequest,\n    options: { onError?(error: unknown): void } = {}\n): [CompletionSource, CompletionSource] {\n    const ordinary = pythonCompletionSource(\n        (query) => request({ ...query, autoImport: query.method === \"textDocument/completion\" ? false : undefined }),\n        options\n    );\n    const imports = pythonCompletionSource(\n        (query) => request({ ...query, autoImport: query.method === \"textDocument/completion\" ? \"only\" : undefined }),\n        options\n    );\n    let current:\n        | {\n              doc: CompletionContext[\"state\"][\"doc\"];\n              pos: number;\n              answer: Promise<CompletionResult | null>;\n          }\n        | undefined;\n    return [\n        (context) => {\n            const answer = Promise.resolve(ordinary(context));\n            current = { doc: context.state.doc, pos: context.pos, answer };\n            return answer;\n        },\n        async (context) => {\n            if (!context.matchBefore(/[\\p{ID_Continue}]+$/u)) return null;\n            for (\n                let node: SyntaxNode | null = syntaxTree(context.state).resolveInner(context.pos, -1);\n                node;\n                node = node.parent\n            ) {\n                if (node.name === \"ImportStatement\" || node.name === \"PropertyName\" || node.name === \"String\")\n                    return null;\n            }\n            const scoped = current;\n            if (!scoped || scoped.doc !== context.state.doc || scoped.pos !== context.pos) return null;\n            const paused = await new Promise<boolean>((resolve) => {\n                const timer = setTimeout(() => resolve(true), 100);\n                context.addEventListener(\n                    \"abort\",\n                    () => {\n                        clearTimeout(timer);\n                        resolve(false);\n                    },\n                    { onDocChange: true }\n                );\n            });\n            // Besides avoiding stale results, this ensures REPL/binding projections\n            // have been opened by the ordinary request before imports use them.\n            if (!paused || context.aborted || current !== scoped || !(await scoped.answer)) return null;\n            return imports(context);\n        },\n    ];\n}\n","import { StateEffect, StateField } from \"@codemirror/state\";\nimport type { AnalysisFailure } from \"./types\";\n\nexport const setAnalysisFailures = StateEffect.define<AnalysisFailure[]>();\nconst NO_FAILURES: AnalysisFailure[] = [];\n\nexport const analysisFailuresField = StateField.define<AnalysisFailure[]>({\n    create: () => NO_FAILURES,\n    update(value, transaction) {\n        // Keep the last completed result visible while the next request is in flight.\n        for (const effect of transaction.effects) {\n            if (effect.is(setAnalysisFailures)) value = effect.value;\n        }\n        return value;\n    },\n});\n","import { type Diagnostic, type LintSource, forEachDiagnostic } from \"@codemirror/lint\";\nimport { StateEffect } from \"@codemirror/state\";\nimport type { EditorView } from \"@codemirror/view\";\nimport { type LspRange, lspRangeToOffsets } from \"./positions\";\nimport { type PythonQuickFix, applyPythonQuickFix } from \"./quick-fixes\";\n\nexport const refreshPythonDiagnostics = StateEffect.define<null>();\n\nexport interface DiagnosticReport {\n    kind: \"full\";\n    items: { code?: string; range: LspRange; message: string; severity?: number; source?: string }[];\n}\n\nexport type DiagnosticRequest = (\n    view: EditorView,\n    signal: AbortSignal\n) => Promise<\n    | {\n          result: DiagnosticReport;\n          isCurrent(): boolean;\n          effects?: readonly StateEffect<unknown>[];\n          publishMetadata?(): void;\n          quickFixes?: { uri: string; actions: PythonQuickFix[] };\n      }\n    | undefined\n>;\n\n/** Publish only after both the Python report and accompanying metadata are current. */\nexport function pythonDiagnosticSource(\n    request: DiagnosticRequest,\n    { syntaxDiagnostics = true }: { syntaxDiagnostics?: boolean } = {}\n): LintSource {\n    let pending: AbortController | undefined;\n    return async (view) => {\n        pending?.abort();\n        const controller = (pending = new AbortController());\n        const doc = view.state.doc;\n        const discard = () => {\n            // CodeMirror only checks document identity. A superseded same-document\n            // pull must preserve diagnostics already published by the newer pull.\n            const current: Diagnostic[] = [];\n            forEachDiagnostic(view.state, (diagnostic, from, to) => current.push({ ...diagnostic, from, to }));\n            return current;\n        };\n        try {\n            const answer = await request(view, controller.signal);\n            if (!answer || controller.signal.aborted || view.state.doc !== doc || !answer.isCurrent()) return discard();\n            const diagnostics = answer.result.items\n                .filter((item) => syntaxDiagnostics || item.source !== \"ty\" || item.code !== \"invalid-syntax\")\n                .map(\n                    (item): Diagnostic => ({\n                        ...lspRangeToOffsets(view.state, item.range),\n                        message: item.message,\n                        severity:\n                            item.severity === 2\n                                ? \"warning\"\n                                : item.severity === 3 || item.severity === 4\n                                  ? \"info\"\n                                  : \"error\",\n                        source: item.source,\n                        actions: answer.quickFixes?.actions\n                            .filter((action) =>\n                                action.diagnostics.some(\n                                    (diagnostic) =>\n                                        diagnostic.code === item.code &&\n                                        JSON.stringify(diagnostic.range) === JSON.stringify(item.range)\n                                )\n                            )\n                            .map((action) => ({\n                                name: action.title,\n                                apply: (editor) => {\n                                    if (editor === view)\n                                        applyPythonQuickFix(editor, {\n                                            uri: answer.quickFixes!.uri,\n                                            action,\n                                            isCurrent: answer.isCurrent,\n                                        });\n                                },\n                            })),\n                    })\n                );\n            // Designer's handler/endpoint store must observe the same freshness\n            // decision as the editor widgets and diagnostics.\n            answer.publishMetadata?.();\n            if (answer.effects) view.dispatch({ effects: answer.effects });\n            return diagnostics;\n        } catch (error) {\n            if (controller.signal.aborted) return discard();\n            throw error;\n        }\n    };\n}\n","import { useEffect, useMemo } from \"react\";\nimport { shallowEqual, useSelector } from \"react-redux\";\nimport { Diagnostic, LintSource, linter, openLintPanel } from \"@codemirror/lint\";\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport { type DiagnosticRequest, pythonDiagnosticSource, refreshPythonDiagnostics } from \"@/analysis/diagnostics\";\nimport { getAnalysisInputs, getTyAnalysisEnabled } from \"@/analysis/ide-analysis\";\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 useEvent from \"@/util/useEventCallback\";\nimport { setAnalysisFailures } from \"./analysis-status\";\nimport type { DoAnalysisFunc, Message } from \"./types\";\nimport type { Analysis } from \"./types\";\n\nexport const metadataEffects = ({\n    references = {},\n    httpEndpoints,\n    emailEndpoints,\n    routes,\n    formClassBodyEndLine,\n}: Pick<Analysis, \"httpEndpoints\" | \"emailEndpoints\" | \"routes\" | \"formClassBodyEndLine\"> &\n    Partial<Pick<Analysis, \"references\">>) => [\n    updateReferences.of(references),\n    updateEndpoints.of({ httpEndpoints, emailEndpoints, routes }),\n    setFormClassBodyEndLine.of(formClassBodyEndLine ?? null),\n];\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(\n    view: EditorView,\n    doAnalysis: DoAnalysisFunc | undefined,\n    options?: { request: DiagnosticRequest }\n) {\n    const inputs = useSelector(getAnalysisInputs, shallowEqual);\n    const analysisEnabled = useSelector(getTyAnalysisEnabled);\n    const hasRequest = !!options?.request;\n    useEffect(() => {\n        if (hasRequest && analysisEnabled) view.dispatch({ effects: refreshPythonDiagnostics.of(null) });\n    }, [view, inputs, hasRequest, analysisEnabled]);\n    const request: DiagnosticRequest = useEvent((view: EditorView, signal: AbortSignal) =>\n        options!.request(view, signal)\n    );\n    // ModuleEditor also installs Ruff, which owns syntax diagnostics.\n    const pythonSource = useMemo(() => pythonDiagnosticSource(request, { syntaxDiagnostics: false }), []);\n    const lintSource: LintSource = useEvent(async (view) => {\n        if (options?.request && analysisEnabled) return pythonSource(view);\n        if (!doAnalysis) return [];\n        const doc = view.state.doc;\n        const metadata = await doAnalysis(false);\n        // CodeMirror discards stale diagnostics, but not the state effects below.\n        if (view.state.doc !== doc) return [];\n        view.dispatch({\n            effects: [\n                ...metadataEffects(metadata),\n                // Clean lint clears a previous warning; lint never introduces one while typing.\n                ...(metadata.analysisFailures?.length === 0 ? [setAnalysisFailures.of(metadata.analysisFailures)] : []),\n            ],\n        });\n        return messagesToDiagnostics(view, metadata.messages, true);\n    });\n    const diagnosticLinter = useMemo(\n        () =>\n            linter(lintSource, {\n                delay: 1000,\n                needsRefresh: (update) =>\n                    update.transactions.some((transaction) =>\n                        transaction.effects.some((effect) => effect.is(refreshPythonDiagnostics))\n                    ),\n            }),\n        []\n    );\n\n    return doAnalysis || options?.request\n        ? [\n              diagnosticLinter,\n              keymap.of([{ key: \"Alt-Enter\", run: (editor) => (analysisEnabled ? openLintPanel(editor) : false) }]),\n          ]\n        : [];\n}\n","import React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { type Root, createRoot } from \"react-dom/client\";\nimport Markdown from \"react-markdown\";\nimport { pythonLanguage } from \"@codemirror/lang-python\";\nimport { highlightingFor } from \"@codemirror/language\";\nimport type { EditorState } from \"@codemirror/state\";\nimport { highlightCode } from \"@lezer/highlight\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport type { CallableArg, Popup } from \"./types\";\n\nexport type PythonDocumentation = string | { kind: string; value: string };\n\nfunction pythonCode(code: string, state: EditorState) {\n    const parts: React.ReactNode[] = [];\n    highlightCode(\n        code,\n        pythonLanguage.parser.parse(code),\n        { style: (tags) => highlightingFor(state, tags) },\n        (text, classes) =>\n            parts.push(\n                <span key={parts.length} className={classes || undefined}>\n                    {text}\n                </span>\n            ),\n        () => parts.push(\"\\n\")\n    );\n    return parts;\n}\n\nexport function pythonDocumentationElement({\n    state,\n    detail,\n    documentation,\n    autoImport,\n    onFindReferences,\n    onGoToDefinition,\n    onGoToTypeDefinition,\n    onRename,\n}: {\n    state: EditorState;\n    detail?: string;\n    documentation?: PythonDocumentation;\n    autoImport?: { module?: string };\n    onFindReferences?(): void;\n    onGoToDefinition?(): void;\n    onGoToTypeDefinition?(): void;\n    onRename?(): void;\n}) {\n    const dom = document.createElement(\"div\");\n    dom.className =\n        \"cm-python-documentation flex max-h-[min(36rem,calc(100vh-4rem))] max-w-[min(52rem,calc(100vw-2rem))] flex-col overflow-hidden p-3 text-[1.2rem] leading-normal whitespace-normal text-light-fg1 select-text dark:text-dark-fg1\";\n    const content = typeof documentation === \"string\" ? documentation : documentation?.value;\n    const plain = typeof documentation !== \"string\" && documentation?.kind === \"plaintext\";\n    const preClass =\n        \"m-0! max-h-[18rem] overflow-auto rounded-none! border-0! bg-transparent! p-0! font-mono text-[1.2rem]! leading-relaxed whitespace-pre-wrap! text-inherit! break-words\";\n    const inner = (\n        <div className=\"flex min-h-0 flex-col\" onMouseDown={(event) => event.stopPropagation()}>\n            <div className=\"min-h-0 space-y-3 overflow-auto [&_h1]:text-[1.4rem] [&_h2]:text-[1.3rem] [&_h3]:text-[1.2rem] [&_hr]:border-sectionborder dark:[&_hr]:border-dark-sectionborder [&_li]:my-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_p]:m-0 [&_ul]:list-disc [&_ul]:pl-5\">\n                {detail && <pre className={preClass}>{pythonCode(detail, state)}</pre>}\n                {autoImport && (\n                    <p className=\"break-words\">\n                        Accepting this suggestion also updates this file’s imports.\n                        {autoImport.module && (\n                            <>\n                                <br />\n                                From{\" \"}\n                                <code className=\"bg-transparent! p-0! font-mono text-[1.2rem] text-inherit!\">\n                                    {autoImport.module}\n                                </code>\n                                .\n                            </>\n                        )}\n                    </p>\n                )}\n                {plain ? (\n                    <p className=\"whitespace-pre-wrap\">{content}</p>\n                ) : (\n                    <Markdown\n                        components={{\n                            pre: ({ children }) => <pre className={preClass}>{children}</pre>,\n                            code: ({ children, className }) => (\n                                <code className=\"bg-transparent! p-0! font-mono text-[1.2rem] text-inherit!\">\n                                    {/\\blanguage-(python|py|python3)\\b/.test(className ?? \"\")\n                                        ? pythonCode(String(children).replace(/\\n$/, \"\"), state)\n                                        : children}\n                                </code>\n                            ),\n                            img: ({ src, alt }) => (\n                                <a\n                                    className=\"text-primary hover:underline\"\n                                    href={src}\n                                    target=\"_blank\"\n                                    rel=\"noopener noreferrer\">\n                                    {alt || \"View image\"}\n                                </a>\n                            ),\n                            a: ({ node, children, ...props }) => (\n                                <a\n                                    {...props}\n                                    className=\"text-primary hover:underline\"\n                                    target=\"_blank\"\n                                    rel=\"noopener noreferrer\">\n                                    {children === \"Anvil Docs\" ? \"View docs…\" : children}\n                                </a>\n                            ),\n                        }}>\n                        {content}\n                    </Markdown>\n                )}\n            </div>\n            {(onFindReferences || onGoToDefinition || onGoToTypeDefinition || onRename) && (\n                <div className=\"mt-3 flex shrink-0 flex-wrap items-center gap-x-4 gap-y-2 border-t border-sectionborder pt-2 dark:border-dark-sectionborder\">\n                    {[\n                        [\"Go to definition\", \"F12\", onGoToDefinition],\n                        [\"Go to type definition\", \"Ctrl+Alt+F12\", onGoToTypeDefinition],\n                        [\"Find references\", \"Shift+F12\", onFindReferences],\n                        [\"Rename…\", \"F2\", onRename],\n                    ].map(\n                        ([label, shortcut, run]) =>\n                            typeof run === \"function\" && (\n                                <LinkInternal\n                                    key={String(label)}\n                                    title={String(shortcut)}\n                                    className=\"text-primary hover:underline\"\n                                    onClick={run}\n                                    onKeyDown={(event) => {\n                                        if (event.key === \"Enter\" || event.key === \" \") {\n                                            event.preventDefault();\n                                            run();\n                                        }\n                                    }}>\n                                    {String(label)}\n                                </LinkInternal>\n                            )\n                    )}\n                </div>\n            )}\n        </div>\n    );\n    let root: Root | undefined;\n    return {\n        get dom() {\n            // CodeMirror can discard async completion info before reading its DOM.\n            if (!root) {\n                root = createRoot(dom);\n                // Finish before CodeMirror measures the tooltip, so it appears in its final position.\n                flushSync(() => root!.render(inner));\n            }\n            return dom;\n        },\n        destroy: () => root?.unmount(),\n    };\n}\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 TExtraFileEditor } from \"./extra-file-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 ExtraFilePythonEditor = lazyComponent<typeof import(\"./extra-file-python-editor\").default>(\n    () => import(\"./extra-file-python-editor\")\n);\n\nexport const ModuleEditor = lazyComponent<typeof TModuleEditor>(() => import(\"./module_editor\"));\n\nexport const AssetEditor = lazyComponent<typeof TAssetEditor>(() => import(\"./asset_editor\"));\n\nexport const ExtraFileEditor = lazyComponent<typeof TExtraFileEditor>(() => import(\"./extra-file-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 { EditorView } from \"@codemirror/view\";\nimport { Button } from \"@/components/reusable/Button\";\nimport type { Conflicts } from \"@/types\";\nimport { ConflictChoice, resolveConflict } from \"./conflict_state\";\n\ntype TextChunk = NonNullable<Conflicts[\"text_chunks\"]>[number];\n\nconst choices: [string, ConflictChoice, string][] = [\n    [\"Keep your version\", \"yours\", \"Keep your version of this conflict and remove the other version.\"],\n    [\"Keep other version\", \"incoming\", \"Keep the version you're merging and remove your version of this conflict.\"],\n    [\"Keep both\", \"both\", \"Keep both highlighted versions in the order shown and remove this conflict marker.\"],\n    [\"Mark resolved\", \"edited\", \"Keep the code as you've edited it and remove this conflict marker.\"],\n];\n\nexport function ConflictActions({ view, textChunk }: { view: EditorView; textChunk: TextChunk }) {\n    const [yours, incoming] = textChunk.alternatives;\n    const shareLine =\n        yours.n > 0 && incoming.n > 0 && yours.l < incoming.l + incoming.n && incoming.l < yours.l + yours.n;\n    const onResolve = (choice: ConflictChoice) => {\n        view.dispatch(resolveConflict(view.state, textChunk, choice));\n        view.focus();\n    };\n\n    return choices.map(([label, choice, explanation]) => {\n        const disabled = view.state.readOnly || (shareLine && (choice === \"yours\" || choice === \"incoming\"));\n        return (\n            <Button\n                key={choice}\n                tiny\n                disabled={disabled}\n                aria-disabled={disabled || undefined}\n                tabIndex={disabled ? -1 : 0}\n                className={choice === \"edited\" ? \"cm-conflict-mark-resolved\" : undefined}\n                title={\n                    <span className=\"block w-80 whitespace-normal\">\n                        {view.state.readOnly\n                            ? \"This app is read-only.\"\n                            : disabled\n                              ? \"The alternatives share a line. Edit the code, then click Mark resolved.\"\n                              : explanation}\n                    </span>\n                }\n                titleDelay\n                titlePosition=\"bottom\"\n                onClick={() => onResolve(choice)}\n                onKeyDown={(event) => {\n                    if (event.key !== \"Enter\" && event.key !== \" \") return;\n                    event.preventDefault();\n                    event.stopPropagation();\n                    if (!disabled) onResolve(choice);\n                }}>\n                {label}\n            </Button>\n        );\n    });\n}\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 comes from the active Python analyzer about a second after the user stops\n * 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 { getTyAnalysisEnabled } from \"@/analysis/ide-analysis\";\nimport { CodeNavTarget } from \"@/router/navTypes\";\nimport { AnvilDispatch, AppId } 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    const analysisEnabled = useSelector(getTyAnalysisEnabled);\n\n    useExtension(\n        view,\n        () =>\n            appTabDetails.of({\n                appId,\n                appUrl,\n                appPackageName,\n                allCodeNames,\n                tabNavTarget,\n                codeItemId,\n                analysisEnabled,\n            }),\n        [appId, appPackageName, allCodeNames, tabNavTarget, codeItemId, analysisEnabled]\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    analysisEnabled: boolean;\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    usePythonAnalysis() {\n        const { appId, tabNavTarget, analysisEnabled } = this.view.state.facet(appTabDetails);\n        return !!appId && !tabNavTarget.codePath.startsWith(\"scripts/\") && analysisEnabled;\n    }\n    mousemove(e: MouseEvent) {\n        if (this.usePythonAnalysis()) return this.toggleHoverClass(false);\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 (this.usePythonAnalysis()) return;\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        this.dispatch(\n            navigate({\n                type: \"CODE\",\n                codePath: codeItem.codePath,\n                essentialView: { code: [`${line}`, `${col || 0}`] },\n            })\n        );\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, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { StateEffect, StateField } from \"@codemirror/state\";\nimport { EditorView, showPanel } from \"@codemirror/view\";\nimport { IconDefinition, faCircleInfo, faEnvelope, faGlobe, faRoute } from \"@fortawesome/pro-regular-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Button } from \"@/components/reusable/Button\";\nimport { CopyButton } from \"@/components/reusable/CopyButton\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/reusable/Popover\";\nimport { getAppOrigins } from \"@/controllers/app\";\nimport { getEnvironmentOrigins, getPublishInfo } from \"@/controllers/environments\";\nimport { modal } from \"@/controllers/modals\";\nimport type { AnvilDispatch } from \"@/types\";\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    icon: IconDefinition;\n    label: string;\n}\n\n// Shared buttons render spans, so these actions need explicit keyboard activation.\nfunction activateButton(event: React.KeyboardEvent<HTMLElement>) {\n    if (event.key === \"Enter\" || event.key === \" \") {\n        event.preventDefault();\n        event.currentTarget.click();\n    }\n}\n\nfunction EndpointSection({ icon, label, children }: EndpointPanelProps) {\n    return (\n        <section className=\"py-4 first:pt-0 last:pb-0\">\n            <h3 className=\"mb-3 flex items-center font-medium\">\n                <FontAwesomeIcon icon={icon} className=\"mr-3 text-light-bg6 dark:text-dark-bg7\" />\n                {label}\n            </h3>\n            {children}\n        </section>\n    );\n}\n\nfunction EndpointAddress({ copyText, children }: React.PropsWithChildren<{ copyText: string }>) {\n    return (\n        <div className=\"mt-3 flex items-center gap-3 rounded border border-light-bg3 bg-light-bg1 p-3 dark:border-dark-bg3 dark:bg-dark-bg1\">\n            <code className=\"min-w-0 flex-1 bg-transparent! p-0! break-all text-light-bg7! dark:text-white!\">\n                {children}\n            </code>\n            <CopyButton\n                copyText={copyText}\n                small\n                aria-label=\"Copy address\"\n                onKeyDown={activateButton}\n            />\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 = faRoute;\n    const body =\n        apiOrigins && apiOrigins.length > 0 ? (\n            <>\n                <p className=\"text-light-bg6 dark:text-dark-bg7\">Routes in this module are accessible at:</p>\n                <EndpointAddress copyText={apiOrigins[0]}>\n                    <span className=\"select-all\">{apiOrigins[0]}/</span>\n                    <i>{\"{path}\"}</i>\n                </EndpointAddress>\n            </>\n        ) : (\n            <>\n                <p className=\"mb-3 text-light-bg6 dark:text-dark-bg7\">Publish your app to access these routes.</p>\n                <Button small onClick={onPublishClick} onKeyDown={activateButton}>\n                    Publish your app...\n                </Button>\n            </>\n        );\n\n    return (\n        <EndpointSection icon={icon} label=\"Routes\">\n            {body}\n        </EndpointSection>\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 = faGlobe;\n    const body =\n        apiOrigins && apiOrigins.length > 0 ? (\n            <>\n                <p className=\"text-light-bg6 dark:text-dark-bg7\">HTTP endpoints in this module are accessible at:</p>\n                <EndpointAddress copyText={apiOrigins[0]}>\n                    <span className=\"select-all\">{apiOrigins[0]}/</span>\n                    <i>{\"{path}\"}</i>\n                </EndpointAddress>\n            </>\n        ) : (\n            <>\n                <p className=\"mb-3 text-light-bg6 dark:text-dark-bg7\">\n                    Publish your app to access these HTTP endpoints.\n                </p>\n                <Button small onClick={onPublishClick} onKeyDown={activateButton}>\n                    Publish your app...\n                </Button>\n            </>\n        );\n\n    return (\n        <EndpointSection icon={icon} label=\"HTTP endpoints\">\n            {body}\n        </EndpointSection>\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 } = 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            <p className=\"text-light-bg6 dark:text-dark-bg7\">This app receives emails sent to:</p>\n            <EndpointAddress copyText={emailDomain}>\n                <i>anything</i>@<span className=\"select-all\">{emailDomain}</span>\n            </EndpointAddress>\n        </>\n    ) : (\n        \"Publish your app to receive email\"\n    );\n\n    return (\n        <EndpointSection icon={icon} label=\"Email endpoints\">\n            {body}\n        </EndpointSection>\n    );\n}\n\nexport function Endpoints({ view }: { view: EditorView }) {\n    const endpoints = useViewSelector(view, () => view.state.field(endpointsState, false));\n    const hasEmail = !!endpoints?.emailEndpoints.length;\n    const hasRoutes = !!endpoints?.routes.length;\n    const hasHttp = !!endpoints?.httpEndpoints.length;\n    const count = Number(hasEmail) + Number(hasRoutes) + Number(hasHttp);\n    if (!count) return null;\n\n    const label = count > 1 ? \"Endpoints\" : hasEmail ? \"Email endpoints\" : hasRoutes ? \"Routes\" : \"HTTP endpoints\";\n    const icon = count > 1 ? faCircleInfo : hasEmail ? faEnvelope : hasRoutes ? faRoute : faGlobe;\n\n    return (\n        <div className=\"editor-endpoints h-[3.6rem] w-[3.6rem] shrink-0 rounded-md border border-light-bg3 bg-white p-1 shadow-sm dark:border-dark-bg3 dark:bg-dark-bg0\">\n            <Popover>\n                <PopoverTrigger asChild>\n                    <LinkInternal\n                        aria-label={label}\n                        preventDefaultClick={false}\n                        onKeyDown={activateButton}\n                        className=\"flex! h-full w-full cursor-pointer items-center justify-center rounded-sm text-[1.2rem] text-light-bg6 hover:bg-light-bg1 dark:text-dark-bg7 dark:hover:bg-dark-bg2\">\n                        <FontAwesomeIcon icon={icon} />\n                    </LinkInternal>\n                </PopoverTrigger>\n                <PopoverContent\n                    portal\n                    side=\"top\"\n                    align=\"end\"\n                    aria-label={label}\n                    className=\"max-h-[calc(100vh-12rem)] w-[48rem] max-w-[90vw] divide-y divide-light-bg3 overflow-y-auto text-xl dark:divide-dark-bg3\">\n                    {hasEmail && <EmailEndpointPanelContent />}\n                    {hasRoutes && <RoutesPanelContent />}\n                    {hasHttp && <HttpEndpointPanelContent />}\n                </PopoverContent>\n            </Popover>\n        </div>\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\n            className=\"editor-status-stack absolute right-6 z-10 flex max-w-[calc(100%-3rem)] items-end gap-1.5 empty:hidden\"\n            style={{ bottom: bottom + 10 }}>\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 \"anvil.tables.TableError\":\n                if (message.msg?.startsWith(\"Cannot call anvil.tables.on_transaction_end()\")) {\n                    message.errorObj = {\n                        docUrl: \"/data-tables/transactions#actions-at-the-end-of-a-transaction\",\n                        docLinkTitle:\n                            \"on_transaction_end() can only be used in the server call that opened the transaction.\\nLearn more\",\n                    };\n                } else if (message.msg?.startsWith(\"Can't abort() a nested transaction\")) {\n                    message.errorObj = {\n                        docUrl: \"/data-tables/transactions\",\n                        docLinkTitle:\n                            \"abort() can only be used in the server call that owns the outermost transaction.\\nLearn more\",\n                    };\n                } else if (message.msg?.startsWith(\"Can't open a fully-isolated transaction\")) {\n                    message.errorObj = {\n                        docUrl: \"/data-tables/transactions#nesting-transactions\",\n                        docLinkTitle:\n                            \"A nested transaction cannot be more isolated than the transaction it runs inside.\\nLearn more\",\n                    };\n                }\n                break;\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                case \"warning\":\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 React, { useLayoutEffect, useRef, useState } from \"react\";\nimport { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { faEllipsisV } from \"@fortawesome/pro-light-svg-icons/faEllipsisV\";\nimport { faExclamationTriangle } from \"@fortawesome/pro-light-svg-icons/faExclamationTriangle\";\nimport { faChevronUp } from \"@fortawesome/pro-regular-svg-icons/faChevronUp\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { EVENTS, useSubscribeToDispatchEvent } from \"@/actions\";\nimport { cx, makeStyles } from \"@/theme/styles\";\nimport { useMergeRefs } from \"@/util/hooks\";\nimport useEffectEvent from \"@/util/useEffectEvent\";\nimport DropdownMenu, { DropDownMenuItems } from \"../reusable/DropdownMenu\";\nimport { Expander } from \"../reusable/Expander\";\nimport { LinkProps, SidebarLink } from \"../reusable/Link\";\nimport { LinkInternal } from \"../reusable/LinkInternal\";\n\nexport const useStyles = makeStyles()((theme) => ({\n    sectionHeader: {\n        // width: '100%',\n        background: theme.secondaryNav.sectionHeader.background.toString(),\n        display: \"flex\",\n        marginTop: \"-0.1rem\",\n        borderTop: \"1px solid \" + theme.sectionBorderColor.toString(),\n        borderBottom: \"1px solid \" + theme.sectionBorderColor.toString(),\n        //padding: [[10,0,10,16+20]], // left padding + chevron width\n        height: \"4rem\",\n        alignItems: \"center\",\n        overflowX: \"hidden\",\n    },\n\n    headerLink: {\n        display: \"flex\",\n        flex: \"1 0\",\n\n        minWidth: \"5rem\",\n        marginRight: \"1px\",\n    },\n    sectionHeaderIconContainer: {\n        whiteSpace: \"nowrap\",\n        width: \"3.5rem\",\n        textAlign: \"center\",\n    },\n    sectionHeaderIcon: {\n        display: \"inline-block\",\n\n        whiteSpace: \"nowrap\",\n        color: theme.secondaryNav.sectionHeader.color.toString(),\n    },\n    sectionHeaderTitleContainer: {\n        display: \"flex\",\n        alignItems: \"center\",\n        flex: \"1\",\n        minWidth: \"0\",\n    },\n    sectionHeaderTitle: {\n        fontWeight: theme.secondaryNav.sectionHeader.fontWeight,\n        fontSize: theme.secondaryNav.sectionHeader.fontSize,\n        color: theme.secondaryNav.sectionHeader.color.toString(),\n        // flex: \"1 0 auto\",\n\n        whiteSpace: \"nowrap\",\n        overflow: \"hidden\",\n        textOverflow: \"ellipsis\",\n    },\n    sectionHeaderButton: {\n        // whiteSpace: 'nowrap',\n        flex: \"0 0 auto\",\n        paddingRight: \"0.5rem\",\n        display: \"flex\",\n        alignItems: \"center\",\n\n        overflow: \"hidden\",\n        // textOverflow: 'ellipsis',\n    },\n    sectionHeaderDots: {\n        whiteSpace: \"nowrap\",\n\n        flex: \"0 0 auto\",\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"center\",\n        width: \"2.5rem\",\n        height: \"100%\",\n        fontSize: \"2.4rem\",\n        color: theme.secondaryNav.sectionHeader.dotsColor.toString(),\n        borderLeft: \"1px solid \" + theme.sectionBorderColor.toString(),\n        \"&:hover\": {\n            background: theme.secondaryNav.sectionHeader.hoverBg.toString(),\n        },\n        \"&:active\": {\n            background: theme.secondaryNav.sectionHeader.hoverBg.darken(0.2).toString(),\n        },\n    },\n}));\n\ninterface SectionProps extends React.PropsWithChildren {\n    icon?: IconDefinition | null;\n    title: React.ReactNode;\n    titleClassName?: string;\n    expanded?: boolean | null;\n    menuItems?: DropDownMenuItems;\n    useExpander?: boolean;\n    expanderClassName?: string;\n    button?: React.ReactNode;\n    className?: string;\n    onToggle?: (expanded: boolean) => void;\n    ref?: React.Ref<HTMLDivElement>;\n}\n\nexport const SectionMenu = ({ items, label }: { items: DropDownMenuItems; label?: string }) => {\n    const { classes } = useStyles();\n    return (\n        <DropdownMenu\n            align=\"right\"\n            hideOnNoItems\n            items={items}\n            render={(showMenu, anchor) => (\n                <>\n                    <LinkInternal\n                        className={cx(classes.sectionHeaderDots, \"h-auto! self-stretch\")}\n                        aria-label={label}\n                        onClick={(e) => showMenu(null, e.currentTarget)}>\n                        <FontAwesomeIcon fixedWidth icon={faEllipsisV} />\n                    </LinkInternal>\n                    <div className=\"self-end\">{anchor}</div>\n                </>\n            )}\n        />\n    );\n};\n\nexport const Section = ({ ref, ...props_ }: SectionProps) => {\n    const {\n        icon = null,\n        title,\n        titleClassName,\n        expanded = null,\n        button = null,\n        menuItems = null,\n        children,\n        className,\n        onToggle,\n        useExpander,\n        expanderClassName,\n        ...props\n    } = props_;\n\n    const { classes } = useStyles();\n\n    const leftContent = (\n        <>\n            <div className={classes.sectionHeaderIconContainer}>\n                {expanded !== null ? (\n                    <FontAwesomeIcon\n                        className={classes.sectionHeaderIcon}\n                        fixedWidth={true}\n                        style={{ transition: \"all 0.1s\" }}\n                        icon={faChevronUp}\n                        rotation={expanded ? 180 : 90}\n                    />\n                ) : (\n                    icon !== null && <FontAwesomeIcon className={classes.sectionHeaderIcon} icon={icon} />\n                )}\n            </div>\n            <div className={classes.sectionHeaderTitleContainer}>\n                <div className={cx(classes.sectionHeaderTitle, titleClassName)}>{title}</div>\n            </div>\n        </>\n    );\n\n    return (\n        <>\n            <div ref={ref} className={cx(classes.sectionHeader, className)} {...props}>\n                {expanded === null ? (\n                    leftContent\n                ) : (\n                    <LinkInternal className={classes.headerLink} onClick={() => onToggle?.(!expanded)}>\n                        {leftContent}\n                    </LinkInternal>\n                )}\n\n                {/* Expect either menuItems or button */}\n                {button && <div className={classes.sectionHeaderButton}>{button}</div>}\n                {menuItems && <SectionMenu items={menuItems} label=\"Section actions\" />}\n            </div>\n            {useExpander ? (\n                <Expander className={expanderClassName} isOpen={expanded === null || expanded}>\n                    {children}\n                </Expander>\n            ) : (\n                (expanded === null || expanded) && children\n            )}\n        </>\n    );\n};\n\ntype SecondaryNavLinkClasses =\n    | \"dropdownButton\"\n    | \"hasIcon\"\n    | \"nodeSelected\"\n    | \"contextMenuOpen\"\n    | \"nodeIcon\"\n    | \"nodeChild\";\n\nexport const useSecondaryNavLinkStyles = makeStyles<void, SecondaryNavLinkClasses>()((theme, _props, classes) => ({\n    root: {\n        display: \"flex\",\n        alignItems: \"center\",\n    },\n    hasIcon: {},\n    node: {\n        width: 0,\n        position: \"relative\",\n        display: \"flex\",\n        alignItems: \"center\",\n        flex: \"1 0 0\",\n        height: \"3.2rem\",\n        borderTopLeftRadius: \"1.6rem\",\n        borderBottomLeftRadius: \"1.6rem\",\n        paddingLeft: \"1.8rem\",\n        [`&.${classes.hasIcon}`]: {\n            paddingLeft: \"3rem\",\n        },\n        [`&:hover:not(.${classes.nodeSelected}), &.${classes.contextMenuOpen}:not(.${classes.nodeSelected})`]: {\n            background: theme.secondaryNav.hoverBg.toString(),\n        },\n        [`&:hover .${classes.dropdownButton}, &.${classes.contextMenuOpen} .${classes.dropdownButton}`]: {\n            display: \"block\",\n        },\n        [`&.${classes.nodeSelected}`]: {\n            [`&:not(.${classes.contextMenuOpen}) .${classes.dropdownButton}:hover`]: {\n                background: theme.secondaryNav.selectedBgDotsHoverBg.toString(),\n                color: theme.secondaryNav.selectedBgDotsHoverColor.toString(),\n            },\n            [`&.${classes.contextMenuOpen} .${classes.dropdownButton}`]: {\n                background: theme.secondaryNav.selectedBgDotsActiveBg.toString(),\n                color: theme.secondaryNav.selectedBgDotsActiveColor.toString(),\n            },\n        },\n        [`&:not(.${classes.nodeSelected})`]: {\n            [`&:not(.${classes.contextMenuOpen}) .${classes.dropdownButton}:hover`]: {\n                background: theme.secondaryNav.dotsHoverBg.toString(),\n            },\n            [`&.${classes.contextMenuOpen} .${classes.dropdownButton}`]: {\n                background: theme.secondaryNav.dotsActiveBg.toString(),\n            },\n        },\n        [`&:not(.${classes.nodeSelected}).${classes.contextMenuOpen} .${classes.dropdownButton}:hover`]: {\n            background: theme.secondaryNav.dotsActiveBg.toString(),\n        },\n        [`&.${classes.nodeSelected}:not(.${classes.contextMenuOpen}) .${classes.dropdownButton}:hover`]: {\n            background: theme.secondaryNav.selectedBgDotsHoverBg.toString(),\n        },\n    },\n    contextMenuOpen: {},\n    nodeSelected: {\n        background: theme.secondaryNav.selectedBg.toString(),\n        [`& .${classes.nodeChild}`]: {\n            color: theme.secondaryNav.selectedColor.toString() + \" !important\", // Override default link colour\n        },\n        [`& .${classes.nodeIcon}`]: {\n            color: theme.secondaryNav.selectedColor.toString(),\n        },\n    },\n    nodeDescendentSelected: {\n        background: theme.secondaryNav.selectedBg.alpha(0.2).toString(),\n    },\n    nodeChild: {\n        whiteSpace: \"nowrap\",\n        overflow: \"hidden\",\n        textOverflow: \"ellipsis\",\n        display: \"block\",\n        padding: \"0.5rem 0\",\n        fontSize: theme.secondaryNav.fontSize,\n        fontWeight: theme.secondaryNav.fontWeight,\n        color: theme.secondaryNav.color.toString(),\n        flex: \"1 1 auto\",\n        \"&:hover\": {\n            color: theme.secondaryNav.hoverColor.toString(),\n        },\n    },\n    nodeIcon: {\n        width: theme.secondaryNav.iconSize,\n        height: theme.secondaryNav.iconSize,\n        position: \"absolute\",\n        left: `calc((3.2rem - ${theme.secondaryNav.iconSize}) / 2)`,\n        top: `calc((3.2rem - ${theme.secondaryNav.iconSize}) / 2)`,\n        borderRadius: `calc(${theme.secondaryNav.iconSize} / 2)`,\n        fontSize: \"1rem\",\n        color: theme.secondaryNav.iconColor.toString(),\n        textAlign: \"center\",\n        \"& .fa-layers\": {\n            marginLeft: \"-.25rem\", // No idea why, but otherwise it won't be centred.\n        },\n    },\n    dropdownButton: {\n        flexShrink: 0,\n        display: \"none\",\n        height: \"3.2rem\",\n        width: \"2.5rem\",\n        fontSize: \"1.8rem\",\n        textAlign: \"center\",\n        borderLeft: \"1px solid \" + theme.secondaryNav.background.toString(),\n        color: theme.secondaryNav.color.toString(),\n    },\n}));\n\ninterface SecondaryNavLinkProps extends React.PropsWithChildren, Omit<LinkProps, \"ref\"> {\n    icon?: IconDefinition | React.ReactElement<any> | null;\n    iconCircleClassName?: string | null;\n    menuItems?: DropDownMenuItems;\n    className?: string;\n    isSelected?: boolean;\n    isDescendentSelected?: boolean;\n    ref?: React.Ref<HTMLDivElement>;\n    hideOverlayOnClick?: boolean;\n}\n\nexport const SecondaryNavLink = ({ ref, ...props_ }: SecondaryNavLinkProps) => {\n    const { icon, iconCircleClassName, menuItems, children, className, isSelected, isDescendentSelected, ...props } =\n        props_;\n    const { classes } = useSecondaryNavLinkStyles();\n\n    const [dropdownVisible, setDropdownVisible] = useState(false); // N.B. This just tells us whether it's visible, doesn't set it.\n    const localRef = useRef<HTMLDivElement>(null);\n    const scrollIntoView = useEffectEvent(() => {\n        isSelected && localRef.current?.scrollIntoView({ block: \"nearest\" });\n    });\n    useLayoutEffect(scrollIntoView, [isSelected]);\n    useSubscribeToDispatchEvent(EVENTS.OPEN_OR_FOCUS_TAB, scrollIntoView);\n\n    const mergedRef = useMergeRefs(ref, localRef);\n\n    return (\n        <div className={cx(classes.root, className)} ref={mergedRef}>\n            <DropdownMenu\n                align={\"right\"}\n                render={(showMenu, anchor) => (\n                    <SidebarLink\n                        onContextMenu={(e) => showMenu(e, e.currentTarget)}\n                        {...props}\n                        className={cx(\n                            classes.node,\n                            dropdownVisible && classes.contextMenuOpen,\n                            isSelected && classes.nodeSelected,\n                            !isSelected && isDescendentSelected && classes.nodeDescendentSelected,\n                            !!icon && classes.hasIcon\n                        )}>\n                        {icon && (\n                            <div className={cx(classes.nodeIcon, iconCircleClassName)}>\n                                {React.isValidElement<any>(icon) ? icon : <FontAwesomeIcon icon={icon} />}\n                            </div>\n                        )}\n\n                        <div className={classes.nodeChild}>{children}</div>\n\n                        {/* Dropdown menu button */}\n                        {menuItems && (\n                            <LinkInternal\n                                className={classes.dropdownButton}\n                                onClick={(e) => showMenu(null, e.currentTarget)}>\n                                <FontAwesomeIcon icon={faEllipsisV} />\n                                {anchor}\n                            </LinkInternal>\n                        )}\n                    </SidebarLink>\n                )}\n                items={menuItems}\n                onShow={() => setDropdownVisible(true)}\n                onHide={() => setDropdownVisible(false)}\n            />\n        </div>\n    );\n};\n\nconst useAlertStyles = makeStyles<void, \"triangle\">()((theme, _props, classes) => ({\n    triangle: {},\n    warningAlert: {\n        margin: \"1rem\",\n        position: \"relative\",\n        borderRadius: theme.secondaryNav.alert.borderRadius,\n        border: theme.secondaryNav.alert.borderWidth + \" solid \" + theme.secondaryNav.alert.borderColor.toString(),\n        borderLeftWidth: theme.secondaryNav.alert.iconBarWidth,\n        padding: \"1.5rem\",\n        background: theme.secondaryNav.alert.background.toString(),\n        [`& .${classes.triangle}`]: {\n            position: \"absolute\",\n            top: `calc(50% - (2 * ${theme.secondaryNav.alert.iconFontSize} / 3))`,\n            left: `calc(-${theme.secondaryNav.alert.iconBarWidth} + .75rem)`,\n            fontSize: theme.secondaryNav.alert.iconFontSize,\n            color: theme.secondaryNav.alert.iconColor.toString(),\n        },\n        fontSize: theme.secondaryNav.alert.fontSize,\n    },\n    alertTitle: {\n        fontWeight: theme.secondaryNav.alert.titleWeight,\n    },\n    alertBody: {\n        fontWeight: theme.secondaryNav.alert.bodyWeight,\n    },\n}));\n\ninterface SecondaryNavAlertProps {\n    title: React.ReactNode;\n    body: React.ReactNode;\n    icon?: IconDefinition | null;\n    actions?: React.ReactNode;\n    iconClassName?: string;\n    className?: string;\n}\nexport const SecondaryNavAlert = ({\n    title,\n    body,\n    icon = null,\n    actions,\n    className,\n    iconClassName,\n}: SecondaryNavAlertProps) => {\n    const { classes } = useAlertStyles();\n\n    return (\n        // The sidebar clips the alert when narrow; keep its text from becoming a column of single words.\n        <div className={cx(classes.warningAlert, \"min-w-96\", className)}>\n            <FontAwesomeIcon\n                className={cx(classes.triangle, iconClassName)}\n                icon={icon || faExclamationTriangle}\n                fixedWidth={true}\n            />\n            <div className={classes.alertTitle}>{title}</div>\n            <div className={classes.alertBody}>{body}</div>\n\n            <div style={{ textAlign: \"right\" }}>{actions}</div>\n        </div>\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 allowAgentsSecret =\n    (name: string, encryptedSecret: string): AnvilAsyncAction<{ error?: string; encrypted: string }> =>\n    async (dispatch, getState) => {\n        try {\n            dispatch(updateGlobalLoadingIndicator(\"Sharing Secret with Agents\"));\n            return await api.allowAgentsAppSecret(getAppId(getState()), name, encryptedSecret);\n        } catch (e) {\n            return { error: String(e) || \"Unknown error\", encrypted: \"\" };\n        } finally {\n            dispatch(updateGlobalLoadingIndicator(false));\n        }\n    };\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, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faUserFriends } from \"@fortawesome/pro-light-svg-icons/faUserFriends\";\nimport { faSparkle } from \"@fortawesome/pro-light-svg-icons/faSparkle\";\nimport {\n    faEye,\n    faPencil,\n    faPlus,\n    faSync,\n    faTrash,\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 } from \"@/controllers/modals\";\nimport {\n    agentsCanReadSecret,\n    clearEnvironmentSecretValue,\n    getScopedSecretValue,\n    hasEnvironmentSecretValue,\n    setScopedSecretValue,\n} from \"@/controllers/secret-values\";\nimport { allowAgentsSecret, decryptSecret, deleteSecret, encryptSecret, saveSecretValue } from \"@/controllers/secrets\";\nimport { useUpdateTabTitle } from \"@/controllers/tabs\";\nimport { getUserAb } from \"@/controllers/user\";\nimport { cx, makeStyles, useIsPySpace } from \"@/theme/styles\";\nimport {\n    AnvilDispatch, AppEnvironment, AppId, EnvironmentPid, SecretObject,\n    SecretRestriction, SecretType, SecretValue, State, Tab, USER_AB_FLAGS\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 { CheckBox } from \"../reusable/SharedComponents\";\nimport { Heading, Text } from \"../reusable/Text\";\nimport { SectionMenu } from \"../sidebar/SecondaryNavSection\";\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    agentsCanRead?: boolean;\n}\n\nconst AgentAccessBadge = () => <div className=\"beta-label h-min text-nowrap\">Agents can read</div>;\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            {agentsCanReadSecret(encryptedSecretObj, props.appId) && <AgentAccessBadge />}\n        </div>\n    );\n};\n\nconst SecretButtons = (props: SecretItemProps) => (\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 small shrinkable icon={faPencil} variant=\"highlight3\"\n            onClick={() => props.onSetSecretValue(props.name, props.encryptedSecretObj, \"secret\")}>\n            {props.isBlank(props.encryptedSecretObj) ? \"Set value\" : \"Change value\"}\n        </Button>\n    </div>\n);\n\nconst AllowAgentsCheckbox = ({ onChange }: { onChange: (value: boolean) => void }) => {\n    const [checked, setChecked] = useState(false);\n    return (\n        <div className=\"my-4\">\n            <CheckBox\n                text=\"Allow agents to read this value\"\n                checked={checked}\n                onChange={(event) => {\n                    setChecked(event.target.checked);\n                    onChange(event.target.checked);\n                }}\n            />\n            <Text>Once shared with your agents, this value cannot be made private again.</Text>\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 items-stretch border-t border-sectionborder dark:border-dark-sectionborder\">\n                <div className=\"flex min-w-0 grow flex-col gap-3 px-4 py-3 pl-8 @min-[60rem]/secrets:flex-row @min-[60rem]/secrets:items-center\">\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                    </div>\n                </div>\n                <SectionMenu\n                    label={`More actions for ${name} in ${environmentLabel(environment)}`}\n                    items={() => [[\n                        \"Clear override\",\n                        () => onClearEnvironmentOverride(name, encryptedSecretObj, type, environment),\n                        faTrash,\n                        { className: \"text-danger\" },\n                    ]]}\n                />\n            </div>\n        ));\n};\n\nconst SecretKeysButtons = (props: SecretItemProps) => (\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 small shrinkable icon={faSync} variant=\"highlight3\"\n            onClick={() => props.onGenSecret({ name: props.name, encryptedSecretObj: props.encryptedSecretObj, type: \"key\" }, \"ide\", true)}>\n            Reset key\n        </Button>\n    </div>\n);\n\nconst PySpaceSecretItemNameBox = (props: SecretItemNameBoxProps) => {\n    const { name, isBlank, hasOtherAppValues, agentsCanRead } = 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 items-center gap-3\"}>\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            {agentsCanRead && <AgentAccessBadge />}\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    onAllowAgents: (name: string, encryptedObj: SecretValue, type: SecretType) => 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 SecretActionsMenu = (props: SecretItemProps & { type: SecretType }) => {\n    const { environments, name, encryptedSecretObj, onSetSecretValue, onGenSecret, type } = props;\n    const menuItems: DropDownMenuItems = () => {\n        const items: MenuItems = [\n            [\"View value\", () => props.onViewSecret(name, encryptedSecretObj), faEye],\n        ];\n\n        if (type === \"secret\") {\n            items.push([\"Generate value\", () => onGenSecret({ name, encryptedSecretObj, type }, true, false), faSync]);\n        }\n        if (!props.isBlank(encryptedSecretObj) && !agentsCanReadSecret(encryptedSecretObj, props.appId)) {\n            items.push([\"Allow Agents to read this secret\", () => props.onAllowAgents(name, encryptedSecretObj, type), faSparkle]);\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                        () => type === \"key\"\n                            ? onGenSecret({ name, encryptedSecretObj, type }, \"ide\", true, environment)\n                            : onSetSecretValue(name, encryptedSecretObj, type, environment),\n                        faPlus,\n                    ] as const\n            );\n        if (environmentItems.length > 0) items.push(<hr key=\"environment-overrides\" />, ...environmentItems);\n\n        items.push(<hr key=\"delete\" />, [\"Delete\", () => props.onDeleteSecretItem(name, type), faTrash, { className: \"text-danger\" }]);\n        return items;\n    };\n    return <SectionMenu items={menuItems} label={`More actions for ${name}`} />;\n};\n\nconst SecretItem = (props: SecretItemProps) => {\n    return (\n        <div className=\"overflow-hidden rounded border border-sectionborder dark:border-dark-sectionborder dark:bg-dark-bg2\">\n            <div className=\"flex items-stretch\">\n                <div className=\"flex min-w-0 grow p-4 pt-0 @max-[60rem]/secrets:flex-col @min-[60rem]/secrets:pb-0\">\n                    <SecretItemNameBox {...props} />\n                    <SecretButtons {...props} />\n                </div>\n                <SecretActionsMenu {...props} type=\"secret\" />\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    } = 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                    agentsCanRead={agentsCanReadSecret(encryptedSecretObj, props.appId)}\n                />\n            </div>\n            <IconButton\n                elevated\n                size={\"medium\"}\n                icon={faPencil}\n                onClick={() => onSetSecretValue(name, encryptedSecretObj, \"secret\")}\n            />\n            <SecretActionsMenu {...props} type=\"secret\" />\n        </div>\n    );\n};\n\nconst KeyItem = (props: SecretItemProps) => {\n    return (\n        <div className=\"overflow-hidden rounded border border-sectionborder dark:border-dark-sectionborder dark:bg-dark-bg2\">\n            <div className=\"flex items-stretch\">\n                <div className=\"flex min-w-0 grow p-4 pt-0 @max-[60rem]/secrets:flex-col @min-[60rem]/secrets:pb-0\">\n                    <SecretItemNameBox {...props} />\n                    <SecretKeysButtons {...props} />\n                </div>\n                <SecretActionsMenu {...props} type=\"key\" />\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) => !getScopedSecretValue(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 = (\n        secretName: string,\n        { environment, allowAgents = false }: { environment?: AppEnvironment; allowAgents?: boolean } = {}\n    ) => {\n        const restriction: SecretRestriction = { type: \"app_python\", secret_name: secretName};\n        if (environment) {\n            restriction.env_id = environment.env_id;\n        } else if (allowAgents) {\n            restriction.env_type = \"all\";\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        let allowAgents = false;\n        const newValue = await dispatch(\n            modal(\"prompt\", {\n                title: \"Set Secret Value\",\n                text: `Enter a new value for secret '${name}'${environmentName ? ` in ${environmentName}` : \"\"}: `,\n                afterInput: !environment && (\n                    <AllowAgentsCheckbox onChange={(value) => { allowAgents = value; }} />\n                ),\n            })\n        );\n        if (newValue && newValue.trim() !== \"\") {\n            const encrypted = await dispatch(\n                encryptSecret(newValue, environmentPid ? \"runtime\" : true, false, mkRestriction(name, { environment, allowAgents }))\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, encrypted.encrypted, { environmentPid, allowAgents }),\n                    type,\n                };\n                dispatch(saveSecretValue(name, secretObj));\n                await dispatch(modal(\"configuredSecret\", { name, secret: encrypted.plain_text }));\n            }\n        }\n    });\n\n    const onAllowAgents = useEvent(async (name: string, encryptedObj: SecretValue, type: SecretType) => {\n        const value = getScopedSecretValue(encryptedObj, appId, \"\");\n        if (!value || agentsCanReadSecret(encryptedObj, appId)) return;\n        if (!(await dispatch(confirm(\"Allow Agents to read this secret?\", \"Once shared with your agents, this value cannot be made private again.\")))) return;\n        const encrypted = await dispatch(allowAgentsSecret(name, value));\n        if (encrypted.error) {\n            await dispatch(alert(\"Unable to allow agent access\", encrypted.error));\n            return;\n        }\n        dispatch(saveSecretValue(name, {\n            type,\n            value: setScopedSecretValue(encryptedObj, appId, encrypted.encrypted, { allowAgents: true }),\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            let allowAgents = false;\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, <>\n                    {msg}\n                    {!environment && <AllowAgentsCheckbox onChange={(value) => { allowAgents = value; }} />}\n                </>)))) {\n                    return;\n                }\n            } else if (!environment && !(await dispatch(confirm(\"Generate value?\",\n                <AllowAgentsCheckbox onChange={(value) => { allowAgents = value; }} />,\n                \"Generate\"\n            )))) {\n                return;\n            }\n            const encrypted = await dispatch(\n                encryptSecret(\n                    undefined,\n                    environmentPid ? (canEncrypt ? false : \"runtime\") : extractable,\n                    canEncrypt,\n                    mkRestriction(name, { environment, allowAgents }),\n                )\n            );\n            if (encrypted.error) {\n                throw new Error(encrypted.error);\n            }\n            const secretObj = {\n                value: setScopedSecretValue(encryptedSecretObj ?? {}, appId, encrypted.encrypted, { environmentPid, allowAgents }),\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        let allowAgents = false;\n        const requestedName = await dispatch(\n            modal(\"prompt\", {\n                title: `Create new ${type === \"key\" ? \"encryption key\" : \"secret\"}`,\n                text: `Enter a name for the new ${type === \"key\" ? \"encryption key\" : \"secret\"}:`,\n                initialValue: newName,\n                ok: \"Create\",\n                afterInput: type === \"key\" && (\n                    <AllowAgentsCheckbox onChange={(value) => { allowAgents = value; }} />\n                ),\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, { allowAgents })));\n            if (encrypted.error) {\n                await dispatch(alert(\"Unable to create key\", encrypted.error));\n                return;\n            }\n            newAppSecret.value = setScopedSecretValue({}, appId, encrypted.encrypted, { allowAgents });\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        onAllowAgents,\n        onGenSecret,\n    };\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=\"mb-4 flex w-full flex-col gap-4\">\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=\"mb-4 flex w-full flex-col gap-4\">\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, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faChevronRight } from \"@fortawesome/pro-regular-svg-icons/faChevronRight\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Expander } from \"@/components/reusable/Expander\";\nimport { useSaveIndicator } from \"@/components/reusable/SaveIndicator\";\nimport { Heading } from \"@/components/reusable/Text\";\nimport { getAppId, getAppRuntimeOptions, promptIfRuntimeMissing, updateAppConfig } from \"@/controllers/app\";\nimport { reloadAppConfig } from \"@/controllers/app/autocompleter\";\nimport { confirmAndMigrateApp, hasLegacyEnvironments } from \"@/controllers/environments\";\nimport { getUser } from \"@/controllers/ide\";\nimport { confirm, modal } from \"@/controllers/modals\";\nimport { getCustomPackagesAvailable } from \"@/controllers/user\";\nimport { recordActivity } from \"@/controllers/util\";\nimport { useIsPySpace } from \"@/theme/styles\";\nimport type { AnvilDispatch, AppId, RuntimeOptions, RuntimeServerSpec } from \"@/types\";\nimport type { PythonEnvironment, ServerRuntime, User } from \"@/types/user\";\nimport { useFeatureSupported } from \"@/util/features\";\nimport { useStateWithReset } from \"@/util/hooks\";\nimport useEvent from \"@/util/useEventCallback\";\nimport PersistentServerSetting from \"./PersistentServerSetting\";\nimport InstallScriptsSettings from \"./python-environment/InstallScriptsSettings\";\nimport PythonEnvironmentSelector from \"./python-environment/PythonEnvironmentSelector\";\nimport { mergeMigrationRequirements } from \"./python-environment/migration\";\nimport OtherRuntimeSettings from \"./python-version/OtherRuntimeSettings\";\nimport PackageRequirementsEditor from \"./python-version/PackageRequirementsEditor\";\nimport RuntimeBuildStatus from \"./python-version/RuntimeBuildStatus\";\nimport useStyles from \"./styles\";\n\nconst packageCompatibilityWarning =\n    \"Your packages and install scripts will be kept. Check that they are compatible with the selected Python version.\";\n\ntype LoadedConfigProps = {\n    appId: AppId;\n    user: User;\n    runtimeOptions: RuntimeOptions;\n};\n\nconst PythonAndPackagesConfigLoaded = ({ appId, user, runtimeOptions }: LoadedConfigProps) => {\n    const dispatch = useDispatch<AnvilDispatch>();\n    const customPackagesAvailable = useSelector(getCustomPackagesAvailable);\n    const hasLegacyAppEnvironments = useSelector(hasLegacyEnvironments);\n    const enableScripts = useFeatureSupported(\"downlink-scripts\");\n    const isPySpace = useIsPySpace();\n    const { classes } = useStyles();\n\n    const [clientVersion, setClientVersion] = useState<RuntimeOptions[\"client_version\"]>(runtimeOptions.client_version);\n    const [serverSpec, setServerSpec] = useStateWithReset<RuntimeServerSpec | null | undefined>(\n        runtimeOptions.server_spec\n    );\n    const [migrating, setMigrating] = useState(false);\n    const [selectionError, setSelectionError] = useState<string>();\n\n    const [clientSaveIndicator, setClientSaved] = useSaveIndicator();\n    const [serverSaveIndicator, setServerSaved] = useSaveIndicator();\n    const [requirementsSaveIndicator, setRequirementsSaved] = useSaveIndicator();\n\n    const updateClientVersion = useEvent(async (event: React.ChangeEvent<HTMLSelectElement>) => {\n        const value = event.target.value;\n        if (\n            value === \"2\" &&\n            clientVersion !== \"2\" &&\n            !(await dispatch(\n                confirm(\n                    \"Use Python 2 for client code?\",\n                    \"Python 2 is deprecated. Use Python 3 for new apps. Switching versions may require changes to your client code.\",\n                    \"Use Python 2\",\n                    \"Cancel\"\n                )\n            ))\n        )\n            return;\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 onSavedCallbacks = useRef<Array<() => void>>([]);\n    const updateServerSpec = useEvent((update: Partial<RuntimeServerSpec>, onSaved: () => void) => {\n        setServerSpec((current) => ({ ...(current ?? {}), ...update }));\n        onSavedCallbacks.current = [...onSavedCallbacks.current, onSaved];\n    });\n\n    const updateRequirements = useEvent((requirements: string) => {\n        setRequirementsSaved(false);\n        updateServerSpec({ requirements }, () => setRequirementsSaved(true));\n    });\n\n    const updatePreInstallScript = useEvent((pre_install_script: string) => {\n        setRequirementsSaved(false);\n        updateServerSpec({ pre_install_script }, () => setRequirementsSaved(true));\n    });\n\n    const updatePostInstallScript = useEvent((post_install_script: string) => {\n        setRequirementsSaved(false);\n        updateServerSpec({ post_install_script }, () => setRequirementsSaved(true));\n    });\n\n    const serverSpecTimeout = useRef<number | undefined>(undefined);\n    const serverSpecInitialised = useRef(false);\n    useEffect(() => {\n        if (serverSpecTimeout.current) clearTimeout(serverSpecTimeout.current);\n        if (!serverSpecInitialised.current) {\n            serverSpecInitialised.current = true;\n            return;\n        }\n        if (serverSpec === runtimeOptions.server_spec) {\n            return;\n        }\n        serverSpecTimeout.current = setTimeout(async () => {\n            const callbacks = onSavedCallbacks.current;\n            onSavedCallbacks.current = [];\n            await dispatch(updateAppConfig([\"runtime_options\", \"server_spec\"], serverSpec));\n            for (const callback of callbacks) callback();\n        }, 500);\n    }, [dispatch, runtimeOptions.server_spec, serverSpec]);\n\n    const catalog = user.python_environment_catalog ?? [];\n    const environment = catalog.find((candidate) => candidate.base === serverSpec?.base);\n    const sourceImage = catalog.find(\n        (candidate) => candidate.base === (serverSpec?.base ?? runtimeOptions.server_spec_disabled?.base)\n    );\n    const editable = isPySpace || !!serverSpec?.base;\n    const managedRuntimes = user.server_runtimes.filter(\n        (runtime) => (runtime.available || runtime.id === \"python3-full\") && !runtime.id.endsWith(\"-sandbox\")\n    );\n    const usingManagedRuntime = !serverSpec?.base;\n    // App storage represents an inactive server_spec as {}, not necessarily null.\n    const previousImageSpec = serverSpec?.base ? serverSpec : runtimeOptions.server_spec_disabled;\n    const hasCustomPackagesOrScripts = [\n        previousImageSpec?.requirements,\n        previousImageSpec?.pre_install_script,\n        previousImageSpec?.post_install_script,\n    ].some((value) => value?.trim());\n    const switchManagedRuntime = useEvent(async (runtime: ServerRuntime) => {\n        setSelectionError(undefined);\n        setMigrating(true);\n        try {\n            // Full Python uses its own installed packages, not this image's requirements or scripts.\n            // Warn when leaving saved customisations, a known bundle, or an unknown bundle.\n            // migration_requirements: [] means no bundle; missing metadata does not mean empty.\n            if (\n                !usingManagedRuntime &&\n                (hasCustomPackagesOrScripts ||\n                    sourceImage?.migration_requirements?.length ||\n                    sourceImage?.migration_requirements === undefined) &&\n                !(await dispatch(\n                    confirm(\n                        `Switch to ${runtime.name}?`,\n                        \"Your image requirements and install scripts will be saved for when you switch back, but will not be used by this runtime. Its installed packages may be different. Check that your app works after switching.\",\n                        \"Switch Python version\",\n                        \"Cancel\"\n                    )\n                ))\n            )\n                return;\n            if (!(await dispatch(promptIfRuntimeMissing(runtime.id)))) return;\n            clearTimeout(serverSpecTimeout.current);\n            const callbacks = onSavedCallbacks.current;\n            onSavedCallbacks.current = [];\n            setServerSaved(false);\n            await dispatch(\n                updateAppConfig([\"runtime_options\"], {\n                    ...runtimeOptions,\n                    server_version: runtime.id,\n                    server_spec: null,\n                    server_spec_disabled: previousImageSpec,\n                })\n            );\n            await dispatch(reloadAppConfig());\n            for (const callback of callbacks) callback();\n            setServerSaved(true);\n        } catch (error) {\n            setSelectionError((error as { message?: string })?.message ?? \"Could not change the Python runtime.\");\n        } finally {\n            setMigrating(false);\n        }\n    });\n\n    const saveEnvironment = useEvent(async (nextSpec: RuntimeServerSpec) => {\n        clearTimeout(serverSpecTimeout.current);\n        const callbacks = onSavedCallbacks.current;\n        onSavedCallbacks.current = [];\n        setServerSaved(false);\n        await dispatch(updateAppConfig([\"runtime_options\", \"server_spec\"], nextSpec));\n        await dispatch(reloadAppConfig());\n        for (const callback of callbacks) callback();\n        setServerSaved(true);\n    });\n\n    const selectEnvironment = useEvent(async (target: PythonEnvironment) => {\n        setSelectionError(undefined);\n        const applyChange = async () => {\n            setMigrating(true);\n            try {\n                const previousSpec = previousImageSpec ?? {};\n                const bundledRequirements = sourceImage?.migration_requirements ?? [];\n                const unknownBundle = !!previousSpec.base && sourceImage?.migration_requirements === undefined;\n                const title = target.title;\n                const warning = bundledRequirements.length\n                    ? `The ${sourceImage!.title} image includes bundled packages. These will become explicit requirements and may install newer versions. Your explicit version pins and install scripts will be preserved. Check that your app works with the new Python version.`\n                    : unknownBundle\n                      ? \"The packages bundled in your current image are unknown and cannot be copied automatically. Your saved requirements and install scripts will be kept. Add any other packages your app needs after switching.\"\n                      : usingManagedRuntime\n                        ? \"Packages installed in your managed runtime are not copied into this image. Your saved image requirements and install scripts will be preserved. Add any other packages your app needs after switching.\"\n                        : packageCompatibilityWarning;\n\n                if (\n                    (bundledRequirements.length > 0 || unknownBundle || hasCustomPackagesOrScripts) &&\n                    !(await dispatch(confirm(`Switch to ${title}?`, warning, \"Switch Python version\", \"Cancel\")))\n                )\n                    return;\n                if (hasLegacyAppEnvironments && !(await dispatch(confirmAndMigrateApp()))) return;\n\n                const nextSpec = { ...previousSpec, base: target.base };\n                if (bundledRequirements.length) {\n                    nextSpec.requirements = mergeMigrationRequirements(previousSpec.requirements, bundledRequirements);\n                }\n                await saveEnvironment(nextSpec);\n                if (bundledRequirements.length || usingManagedRuntime) {\n                    dispatch(\n                        recordActivity(\"migratePythonEnvironment\", {\n                            oldRuntime: runtimeOptions.server_version ?? null,\n                            oldBase: previousSpec.base ?? null,\n                            targetPythonVersion: target.python_version,\n                        })\n                    );\n                }\n            } catch (error) {\n                setSelectionError(\n                    (error as { message?: string })?.message ??\n                        \"Could not change the Python environment. Please try again.\"\n                );\n            } finally {\n                setMigrating(false);\n            }\n        };\n        if (customPackagesAvailable) await applyChange();\n        else await dispatch(modal(\"upgradePrompt\", { featureId: \"custom-packages\", onStartTrial: applyChange }));\n    });\n\n    const advancedOptionsInDefaultState =\n        clientVersion == \"3\" && !serverSpec?.pre_install_script && !serverSpec?.post_install_script;\n    const [showAdvanced, setShowAdvanced] = useState(!advancedOptionsInDefaultState);\n\n    const currentEnvironment = serverSpec?.base\n        ? serverSpec.base\n        : (user.server_runtimes.find((runtime) => runtime.id === runtimeOptions.server_version)?.name ??\n          runtimeOptions.server_version ??\n          \"Python\");\n\n    return (\n        <div\n            className={\n                isPySpace\n                    ? `${classes.settingsRoot} @container/dependencies`\n                    : \"@container/dependencies min-h-full  text-light-fg1 dark:bg-dark-bg1 dark:text-dark-fg1\"\n            }>\n            <div\n                className={\n                    isPySpace ? classes.appSettings : \"w-full max-w-[76rem] px-6 py-6 @min-[640px]/dependencies:px-16\"\n                }>\n                {!isPySpace && <Heading level={1}>Python Dependencies</Heading>}\n                {!isPySpace && (\n                    <PythonEnvironmentSelector\n                        current={environment}\n                        currentLabel={currentEnvironment}\n                        currentRuntime={usingManagedRuntime ? runtimeOptions.server_version : undefined}\n                        currentRuntimeDeprecated={\n                            usingManagedRuntime &&\n                            user.server_runtimes.find((runtime) => runtime.id === runtimeOptions.server_version)\n                                ?.deprecated\n                        }\n                        changing={migrating}\n                        environments={catalog.filter((image) => image.available)}\n                        runtimes={managedRuntimes}\n                        saveIndicator={serverSaveIndicator}\n                        onChange={(selected) => void selectEnvironment(selected)}\n                        onRuntimeChange={(selected) => void switchManagedRuntime(selected)}\n                        selectClassName={\"[&>div]:border!\"}\n                    />\n                )}\n                {selectionError && (\n                    <div role=\"alert\" className=\"my-3 text-red-700 dark:text-red-300\">\n                        {selectionError}\n                    </div>\n                )}\n                <PackageRequirementsEditor\n                    enabled={editable && user.ideConfig.customPackageInstallation}\n                    isPySpace={isPySpace}\n                    serverSpec={serverSpec}\n                    saveIndicator={requirementsSaveIndicator}\n                    onRequirementsChange={updateRequirements}\n                />\n                {serverSpec && !usingManagedRuntime && !migrating && (\n                    <RuntimeBuildStatus appId={appId} runtimeSpec={serverSpec} />\n                )}\n                {!isPySpace && (\n                    <>\n                        <button\n                            type=\"button\"\n                            className=\"my-6 flex items-center gap-4 border-0 bg-transparent p-0 text-[1.4rem] text-light-grey1 dark:text-dark-bg7\"\n                            aria-expanded={showAdvanced}\n                            onClick={() => setShowAdvanced((shown) => !shown)}>\n                            Advanced settings...\n                            <FontAwesomeIcon icon={faChevronRight} rotation={showAdvanced ? 90 : undefined} />\n                        </button>\n                        <div inert={!showAdvanced}>\n                            <Expander isOpen={showAdvanced}>\n                                {!usingManagedRuntime &&\n                                    serverSpec &&\n                                    (enableScripts ||\n                                        serverSpec.pre_install_script ||\n                                        serverSpec.post_install_script) && (\n                                        <InstallScriptsSettings\n                                            serverSpec={serverSpec}\n                                            readOnly={!enableScripts}\n                                            saveIndicator={requirementsSaveIndicator}\n                                            onPostInstallScriptChange={updatePostInstallScript}\n                                            onPreInstallScriptChange={updatePreInstallScript}\n                                        />\n                                    )}\n                                <OtherRuntimeSettings\n                                    clientVersion={clientVersion}\n                                    clientSaveIndicator={clientSaveIndicator}\n                                    runtimeVersion={runtimeOptions.version ?? 0}\n                                    onClientVersionChange={updateClientVersion}\n                                />\n                            </Expander>\n                        </div>\n                    </>\n                )}\n            </div>\n        </div>\n    );\n};\n\nconst PythonAndPackagesConfig = () => {\n    const appId = useSelector(getAppId);\n    const user = useSelector(getUser);\n    const runtimeOptions = useSelector(getAppRuntimeOptions) as RuntimeOptions | undefined;\n\n    if (!appId || !user || !runtimeOptions) {\n        throw new Error(\"PythonAndPackagesConfig missing required app/user/runtime state\");\n    }\n\n    return <PythonAndPackagesConfigLoaded key={appId} appId={appId} user={user} runtimeOptions={runtimeOptions} />;\n};\n\nexport default PythonAndPackagesConfig;\n","import { cloneDeep, isEmpty, merge, set, size } from \"lodash-es\";\nimport { EVENTS, raiseEvent } from \"@/actions\";\nimport * as api from \"@/api\";\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 { 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 { getExtraFileContent } from \"./extra-files\";\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// - [\"EXTRA_FILES\", ...filePathSegments] (relative to the app root)\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                    const cachedCodeItem = itemAppPath?.[0] === \"CODE\" && getCachedCodeItem(itemAppPath[1], 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                    // Loaded code items own their conflict metadata. Include\n                    // those current values when undo restores the whole merge.\n                    const conflicts = app.conflicts && {\n                        ...app.conflicts,\n                        conflicting_items: app.conflicts.conflicting_items.map((conflict) => {\n                            const path = getAppPathForConflictItem(conflict.item, state);\n                            return path?.[0] === \"CODE\"\n                                ? (getCachedCodeItem(path[1], state)?.conflicts ?? conflict)\n                                : conflict;\n                        }),\n                    };\n                    updates.push([[\"conflicts\"], conflicts]);\n                }\n                break;\n            }\n            case \"EXTRA_FILES\": {\n                // Missing files are deletions; an empty base64 string is still a file.\n                const content = getExtraFileContent(state, appPathContent.join(\"/\")) ?? null;\n                updates.push([[\"extra_files\", ...appPathContent], content]);\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\n// Failed writes remain dirty so a later save retries the same changes.\nconst restoreSavingAppPathsUpdater = (state: State, saveId: number) => {\n    for (const [id, paths] of Object.entries(state.savingAppPaths)) {\n        if (+id <= saveId) {\n            for (const path of paths) state.unsavedAppPaths[JSON.stringify(path)] = true;\n        }\n    }\n    removeSavingAppPathsUpdater(state, saveId);\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                restoreSavingAppPathsUpdater(state, saveId);\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!.$saveError = false;\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            restoreSavingAppPathsUpdater(state, saveId);\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 { ModalComponent, ModalTypes } from \"@/components/modals\";\nimport { PipAudit } from \"@/components/modals/PipAudit\";\nimport SaveConflict from \"@/components/modals/SaveConflict\";\nimport { ConfigureOrUpgradePromptOnRuntimeFeatureRequired } from \"@/components/modals/UpgradePrompts\";\nimport UriUploader from \"@/components/modals/UriUploader\";\nimport { commonModalTypes } from \"@/components/modals/names/common-modals\";\nimport { DeleteSecretModal, SecretConfiguredModal, ViewSecretModal } from \"@/components/tabs/SecretsTab\";\nimport UploadFileModal from \"@/pyspace/common/modals/UploadFile\";\nimport { EditGadgetDetailsModal } from \"@/pyspace/gadget_editor/modals/EditGadgetDetailsModal\";\nimport { ScheduleScriptModal } from \"@/pyspace/gadget_editor/modals/ScheduleScriptModal\";\nimport { NotificationsModal } from \"@/pyspace/site/modals/Notifications\";\nimport ReportAbuseModal from \"@pyspace/common/modals/ReportAbuse\";\nimport CloneReadOnlyGadgetModal from \"../CloneReadOnlyGadgetModal\";\nimport ShareGadgetModal from \"../ShareGadgetModal\";\n\nconst createGadgetEditorModals = () =>\n    ({\n        ...commonModalTypes,\n        shareGadget: ShareGadgetModal,\n        cloneReadOnlyGadget: CloneReadOnlyGadgetModal,\n        scheduleScript: ScheduleScriptModal,\n        notifications: NotificationsModal,\n        editGadgetDetails: EditGadgetDetailsModal,\n        uploadFile: UploadFileModal,\n        saveconflict: SaveConflict,\n        deleteSecret: DeleteSecretModal,\n        viewSecret: ViewSecretModal,\n        configuredSecret: SecretConfiguredModal,\n        configureOrUpgradePromptOnRuntimeFeatureRequired: ConfigureOrUpgradePromptOnRuntimeFeatureRequired,\n        reportAbuse: ReportAbuseModal,\n        pipAudit: PipAudit,\n        uriChanger: UriUploader,\n    }) satisfies ModalTypes;\n\nlet gadgetEditorModals: PySpaceModalTypes;\n\nexport const getGadgetEditorModals = () => {\n    return (gadgetEditorModals ??= createGadgetEditorModals());\n};\n\nexport type PySpaceModalTypes = ReturnType<typeof createGadgetEditorModals>;\nexport type PySpaceModalType = keyof PySpaceModalTypes;\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 React, { useContext, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faUpload } from \"@fortawesome/pro-solid-svg-icons/faUpload\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { ModalComponent } from \"@/components/modals\";\nimport Modal from \"@/components/modals/Modal\";\nimport { InputLabel } from \"@/components/reusable/Forms\";\nimport { getApp, getAppId } from \"@/controllers/app\";\nimport PySpaceTextArea from \"@/pyspace/common/components/TextArea\";\nimport PySpaceTextInput from \"@/pyspace/common/components/TextInput\";\nimport {\n    GadgetEventsContext,\n    getForceReloadThumbnailSignal,\n    renameGadget,\n    setGadgetDescription,\n    uploadGadgetThumbnail,\n} from \"@/pyspace/gadget_editor/controllers/gadget\";\nimport { cx } from \"@/theme/styles\";\nimport { GadgetDispatch } from \"@/types\";\nimport { useStateWithReset } from \"@/util/hooks\";\n\nexport const EditGadgetDetailsModal: ModalComponent = ({ modalId }) => {\n    const dispatch = useDispatch<GadgetDispatch>();\n    const gadgetEvents = useContext(GadgetEventsContext);\n\n    const appId = useSelector(getAppId)!;\n    const app = useSelector(getApp)!;\n    const thumbnailRevision = useSelector(getForceReloadThumbnailSignal);\n\n    const [editingName, setEditingName] = useStateWithReset(app.name);\n    const [editingDescription, setEditingDescription] = useStateWithReset(app.config.metadata?.description ?? \"\");\n\n    return (\n        <Modal size={\"medium\"} autoFocus={false} title={\"Details\"} modalId={modalId}>\n            <div className={\"flex flex-col gap-[0.8rem]\"}>\n                <PySpaceTextInput\n                    title={\"Widget Name\"}\n                    value={editingName}\n                    description={\"Give your widget a name, so you can find it again.\"}\n                    onChange={setEditingName}\n                    onSave={() => dispatch(renameGadget(appId, editingName, gadgetEvents))}\n                />\n\n                <PySpaceTextArea\n                    value={editingDescription}\n                    text={\"Description\"}\n                    description={\"How would you describe this widget?\"}\n                    className={\"h-28!\"}\n                    onChange={(e) => setEditingDescription(e.target.value)}\n                    onBlur={() => dispatch(setGadgetDescription(appId, editingDescription, gadgetEvents))}\n                />\n\n                <InputLabel className={\"mb-8\"} title={\"Thumbnail\"}>\n                    <div\n                        className={\n                            \"group relative h-54 max-w-100 cursor-pointer rounded-[0.4rem] border-[.2rem] border-light-grey2 bg-cover bg-center\"\n                        }\n                        style={{ backgroundImage: `url(/ide/gadgets/${appId}/thumbnail?r=${thumbnailRevision})` }}\n                        onClick={() => dispatch(uploadGadgetThumbnail(appId, gadgetEvents))}>\n                        <div\n                            className={\n                                \"pointer-events-none absolute inset-0 flex flex-col justify-center p-8 text-center text-[1.6rem] text-transparent group-hover:bg-[#00000088] group-hover:text-white\"\n                            }>\n                            <FontAwesomeIcon icon={faUpload} />\n                            Upload\n                        </div>\n                    </div>\n                </InputLabel>\n            </div>\n        </Modal>\n    );\n};\n","import React, { useCallback, useReducer, useState } from \"react\";\nimport { faCheck } from \"@fortawesome/pro-solid-svg-icons/faCheck\";\nimport { faPlus } from \"@fortawesome/pro-solid-svg-icons/faPlus\";\nimport { ModalComponent } from \"@/components/modals\";\nimport Modal from \"@/components/modals/Modal\";\nimport { EditTimeSpec } from \"@/components/modals/ScheduledTaskModal\";\nimport { modalReturn } from \"@/controllers/modals\";\nimport { TaskUpdate, taskReducer } from \"@/controllers/scheduledtasks\";\nimport useEvent from \"@/util/useEventCallback\";\n\nexport const ScheduleScriptModal: ModalComponent = ({ modalId, spec: { scriptName } }) => {\n    const [task, updateTask] = useReducer(taskReducer, {\n        task_name: scriptName ? `script:${scriptName}` : \"\",\n        time_spec: { n: 1, every: \"day\", at: { hour: 3 } },\n    });\n    const returnResult = useEvent(() => modalReturn(task));\n\n    return (\n        <Modal\n            modalId={modalId}\n            title={`Schedule ${scriptName}`}\n            buttons={[\n                {\n                    text: \"Schedule Script\",\n                    icon: faCheck,\n                    defaultButton: true,\n                    clickActionCreator: returnResult,\n                },\n                {\n                    text: \"Cancel\",\n                },\n            ]}>\n            <div className={\"my-8 text-[2rem]\"}>\n                Run&nbsp;\n                <EditTimeSpec task={task} updateTask={updateTask} inline />\n            </div>\n        </Modal>\n    );\n};\n","import React, { useCallback, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { faCodeBranch } from \"@fortawesome/free-solid-svg-icons/faCodeBranch\";\nimport { Button } from \"@/components/reusable/Button\";\nimport { getAppId } from \"@/controllers/app\";\nimport { ModalComponent } from \"../../../components/modals\";\nimport Modal from \"../../../components/modals/Modal\";\n\nconst CloneReadOnlyGadgetModal: ModalComponent = ({ modalId }) => {\n    const [forked, setForked] = useState(false);\n    const appId = useSelector(getAppId);\n\n    const doFork = useCallback(() => {\n        window.open(window.location.origin + \"/ide/gadgets/fork/\" + appId);\n        setForked(true);\n    }, [appId]);\n\n    return (\n        <Modal modalId={modalId} title={\"Fork this code\"} buttons={[{ text: \"Close\" }]}>\n            Fork this gadget to edit it yourself:\n            <div className={\"my-1 py-1\"}>\n                <Button onClick={doFork} disabled={forked} icon={faCodeBranch} variants={[\"primary\", \"large\"]}>\n                    Fork\n                </Button>\n            </div>\n        </Modal>\n    );\n};\n\nexport default CloneReadOnlyGadgetModal;\n","import React, { useContext, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faCodeBranch } from \"@fortawesome/pro-solid-svg-icons\";\nimport { ModalComponent } from \"@/components/modals\";\nimport Modal from \"@/components/modals/Modal\";\nimport { DropDown } from \"@/components/reusable/Forms\";\nimport { getAppId, getAppIsEditable } from \"@/controllers/app\";\nimport { getEnvironmentOrigins } from \"@/controllers/environments\";\nimport { Button, CopyButton } from \"@/pyspace/common/components/Button\";\nimport {\n    GadgetEventsContext,\n    getIsPySpace,\n    getShareState,\n    setShareState,\n} from \"@/pyspace/gadget_editor/controllers/gadget\";\nimport { cx } from \"@/theme/styles\";\nimport { GadgetDispatch } from \"@/types\";\nimport useEvent from \"@/util/useEventCallback\";\n\nconst CopyableEmbed = ({ itemTitle, content }: { itemTitle: string; content: string }) => {\n    const isPySpace = useSelector(getIsPySpace);\n    return (\n        <div className={\"my-4 flex w-full items-center gap-[1.6rem]\"}>\n            <div className={\"flex-none font-semibold\"}>{itemTitle}</div>\n            <div\n                className={\n                    \"max-w-fit shrink-1 grow-1 overflow-x-auto rounded-[0.4rem] border border-light-grey2 bg-light-bg3 px-[0.8rem] py-[0.2rem] font-mono text-[1.2rem] whitespace-nowrap select-all\"\n                }>\n                {content}\n            </div>\n            {isPySpace && (\n                <div className={\"flex-none\"}>\n                    <CopyButton elevated size=\"small\" copyText={content} />\n                </div>\n            )}\n        </div>\n    );\n};\n\nconst ShareGadgetModal: ModalComponent = ({ modalId }) => {\n    const dispatch = useDispatch<GadgetDispatch>();\n    const environmentOrigins = useSelector(getEnvironmentOrigins);\n    const appId = useSelector(getAppId);\n    const sharing = useSelector(getShareState);\n    const editable = useSelector(getAppIsEditable);\n    const isPySpace = useSelector(getIsPySpace);\n\n    const appUrl = window.location.origin + \"/g/\" + appId;\n\n    const [forked, setForked] = useState(false);\n\n    const onFork = useEvent(() => {\n        window.open(window.location.origin + \"/ide/gadgets/fork/\" + appId);\n        setForked(true);\n    });\n\n    const origin = window.location.origin;\n    const embeddingHtml = `<script src=\"${origin}/embed/g/${appId}.js\"></script>`;\n    const embeddingMarkdown = `[<img src=\"${origin}/embed/thumbnail/${appId}\"](${origin}/g/${appId})`;\n\n    const gadgetEvents = useContext(GadgetEventsContext);\n\n    return (\n        <Modal\n            title={\"Sharing\"}\n            modalId={modalId}\n            size={\"small\"}\n            leftButtons={\n                <Button round elevated onClick={onFork} disabled={forked} icon={faCodeBranch} variant={\"primary\"}>\n                    Fork\n                </Button>\n            }>\n            {/*environmentOrigins.length ? <div className={\"py-2 my-2\"}>\n            This gadget_editor's URL:{\" \"}\n            <a className={\"font-bold\"} href={environmentOrigins[0]} target={\"_blank\"}>{environmentOrigins[0]}</a>\n        </div> : <div className={\"bg-light-bg2 p-2 m-2\"}>\n            <Button onClick={() => dispatch(createPublicOrigin())}>Create URL for gadget_editor</Button>\n        </div>*/}\n            <div className={cx(\"grid auto-cols-fr grid-rows-3 gap-[1.4rem]\", editable && \"grid-rows-4\")}>\n                {editable && (\n                    <div className={\"flex w-full items-center gap-[1.6rem]\"}>\n                        <div className={\"flex-none font-semibold\"}>Visibility:</div>\n                        <DropDown\n                            containerClassName={\"flex-auto\"}\n                            variant={\"small\"}\n                            value={sharing}\n                            onChange={(e: any) => dispatch(setShareState(e.target.value, gadgetEvents))}\n                            disabled={!editable}>\n                            <option value={\"private\"}>Private</option>\n                            <option value={\"unlisted\"}>Unlisted</option>\n                            <option value={\"public\"}>Public</option>\n                        </DropDown>\n                    </div>\n                )}\n                <div className={\"my-4 flex w-full items-center gap-[1.6rem]\"}>\n                    <div className={\"flex-none font-semibold\"}>Sharing URL:</div>\n                    <div className={\"max-w-fit shrink-1 grow-1 truncate\"}>\n                        <a\n                            className={\"trunacte text-[1.6rem] font-normal text-light-bg6!\"}\n                            href={appUrl}\n                            rel=\"noreferrer\"\n                            target={\"_blank\"}>\n                            {appUrl}\n                        </a>\n                    </div>\n                    {isPySpace && (\n                        <div className={\"flex-none\"}>\n                            <CopyButton elevated size=\"small\" copyText={appUrl} />\n                        </div>\n                    )}\n                </div>\n                <CopyableEmbed itemTitle={\"Embed in HTML\"} content={embeddingHtml} />\n                <CopyableEmbed itemTitle={\"Embed in GitHub\"} content={embeddingMarkdown} />\n            </div>\n        </Modal>\n    );\n};\n\nexport default ShareGadgetModal;\n","import { produce } from \"immer\";\nimport { EditPath } from \"@designer/edit-state\";\nimport { Notification, UserDetails, UserProfile } from \"@/pyspace/common/types\";\nimport { AppSpec } from \"@/pyspace/gadget_editor/components/GadgetEditor\";\nimport { getNewBaseState } from \"@/store/editor-store\";\nimport { baseProducer, initStore } from \"@/store/index\";\nimport { AppState, BaseState, CodePath, GadgetDispatch, State, Tab } from \"@/types\";\n\nexport type { UserDetails } from \"@/pyspace/common/types\";\n\nexport type GadgetShareState = \"public\" | \"unlisted\" | \"private\";\n\ninterface GadgetApp extends AppState {\n    name: string;\n}\n\ninterface SessionStartEvent {\n    event: \"SESSION_START\";\n    app: string;\n    env_id: number;\n    session_id: string;\n    data: {\n        func?: string; // If it's a BG task\n        scheduled_task?: string; // If it's a scheduled BG task\n    };\n    timestamp: number;\n    type: \"background_task\"; // | \"something_else\"\n}\n\nexport interface Gadget {\n    sharing: GadgetShareState;\n    unmodifiedAppSpec: AppSpec;\n    forceReload: number; // TODO extremely crude\n    forceReloadThumbnail: number;\n    owner: UserProfile;\n    liked: boolean;\n    nLikes: number;\n    nForks: number;\n    isEmbedded?: boolean;\n    isPySpace?: boolean;\n    isPopout?: boolean;\n}\n\nexport interface GadgetState extends BaseState {\n    output: any[];\n    sessions: { [sessionId: string]: SessionStartEvent };\n    tabs: Tab[];\n    currentTabId: Tab[\"id\"] | null;\n    app: GadgetApp;\n    user?: State[\"user\"];\n    notifications?: Notification[];\n    gadget: Gadget;\n    rightPanelWidth: number;\n    rightPanelContent: \"packages\" | \"secrets\" | null;\n    navOverrides: {\n        form?: {\n            codePath: CodePath;\n            editingPath: EditPath | undefined;\n            topLevelFormClassName: string | undefined;\n        };\n        cursor?: { script?: [string, string]; server?: [string, string]; client?: [string, string] };\n    };\n    hiddenDescription: boolean;\n}\n\nlet nextStoreId = 1;\nconst getRootReducer = (\n    appSpec: AppSpec,\n    ownerProfile: UserProfile,\n    userDetails?: UserDetails,\n    notifications?: Notification[],\n    isEmbedded?: boolean,\n    isPySpace?: boolean,\n    isPopout?: boolean\n) =>\n    produce(baseProducer, {\n        ...getNewBaseState(),\n        editorType: \"pyspace\",\n        tabs: [],\n        storeId: nextStoreId++,\n        app: {\n            id: appSpec.id,\n            name: appSpec.name,\n            editSession: appSpec.edit_session,\n            editState: appSpec.edit_state,\n            environments: appSpec.environments,\n            origins: appSpec.origins,\n            commitHistory: { refs: {}, versions: [], published_version: null },\n            malleableCommits: {},\n            config: { services: [] },\n        },\n        user: userDetails && { ...userDetails, $loaded: true },\n        notifications: notifications || [],\n        output: [],\n        sessions: {},\n        gadget: {\n            sharing: appSpec.sharing,\n            unmodifiedAppSpec: appSpec,\n            forceReload: 0,\n            forceReloadThumbnail: 0,\n            owner: ownerProfile ?? userDetails?.profile,\n            liked: appSpec.liked,\n            nLikes: appSpec.n_likes,\n            nForks: appSpec.n_forks,\n            isEmbedded,\n            isPySpace,\n            isPopout,\n        },\n        rightPanelWidth: 500,\n        rightPanelContent: null,\n        debug: {\n            runMode: null,\n            output: [],\n            sessionToken: null,\n        },\n        hiddenDescription: false,\n    } satisfies GadgetState);\n\nexport const createGadgetStore = (\n    appSpec: AppSpec,\n    ownerProfile: UserProfile,\n    loggedInUser?: UserDetails,\n    notifications?: Notification[],\n    isEmbedded?: boolean,\n    isPySpace?: boolean,\n    isPopout?: boolean\n) =>\n    initStore<GadgetDispatch>(\n        getRootReducer(appSpec, ownerProfile, loggedInUser, notifications, isEmbedded, isPySpace, isPopout)\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 PythonAndPackagesConfig from \"@/components/tabs/settings/PythonAndPackagesConfig\";\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                <PythonAndPackagesConfig />\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 { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { getAppId } from \"@/controllers/app\";\nimport { saveApp } from \"@/controllers/app/saving\";\nimport { GadgetDispatch } from \"@/types\";\nimport { blockEvent, cancelOnIdle, checkMeta } from \"@/util\";\nimport useEvent from \"@/util/useEventCallback\";\n\nexport function usePySpaceKeyBindings(appId: string) {\n    const dispatch = useDispatch<GadgetDispatch>();\n\n    const keydown = useEvent((e: KeyboardEvent) => {\n        // log.warn(e.keyCode);\n        switch (e.code) {\n            case \"KeyS\":\n                if (checkMeta(e)) {\n                    dispatch(cancelOnIdle(\"SAVE\"));\n                    dispatch(saveApp());\n                    blockEvent(e);\n                }\n                break;\n            case \"KeyG\":\n                if (checkMeta(e)) {\n                    blockEvent(e);\n                    if (e.shiftKey) {\n                        log.warn(\"Find previous\");\n                    } else {\n                        log.warn(\"Find next\");\n                    }\n                }\n                break;\n            case \"KeyH\":\n                if (checkMeta(e)) {\n                    blockEvent(e);\n                    if (e.shiftKey) {\n                        log.warn(\"Replace all\");\n                    } else {\n                        log.warn(\"Replace\");\n                    }\n                }\n                break;\n            case \"KeyJ\":\n                // Definitely not - this is a useful Chrome shortcut!\n                // if ((e.ctrlKey || e.metaKey)) {\n                //     e.stopPropagation();\n                //     e.preventDefault();\n                //     dispatch(toggleBottomPanel());\n                // }\n                break;\n\n            default:\n                break;\n        }\n    });\n\n    // Ew. We'd like to add this using React, but when there's nothing focused the events go to the <body>. So we have to catch them there.\n    useEffect(() => {\n        if (!appId) return;\n        document.body.addEventListener(\"keydown\", keydown);\n        return () => {\n            document.body.removeEventListener(\"keydown\", keydown);\n        };\n    }, [appId, keydown]);\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, { useMemo } from \"react\";\nimport { faCircle } from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { cx } from \"@/theme/styles\";\n\nexport const PySpaceToggle = ({\n    className,\n    onClick,\n    label,\n    state,\n}: {\n    className?: string;\n    onClick: () => void;\n    label?: string;\n    state: false | null | true;\n}) => {\n    const _state = useMemo(() => {\n        switch (state) {\n            case false:\n                return \"left\";\n            case true:\n                return \"right\";\n            default:\n                return \"middle\";\n        }\n    }, [state]);\n\n    return (\n        <LinkInternal className={cx(\"flex cursor-pointer items-center p-1 text-[4.8rem]\", className)} onClick={onClick}>\n            {label && <div className={\"mx-2 flex-none p-2 text-[1.4rem]\"}>{label}</div>}\n            <div\n                className={cx(\n                    \"relative mt-[-2px] h-10 w-20 rounded-full border-2 border-grey-2 shadow-pselevated1\",\n                    {\n                        left: \"bg-grey-0 text-grey-2\",\n                        right: \"bg-primary text-white\",\n                        middle: \"bg-secondary-600 text-white\",\n                    }[_state]\n                )}>\n                <FontAwesomeIcon\n                    fixedWidth\n                    className={cx(\n                        \"absolute top-[0.4rem] text-[1.3rem] transition-[left] ease-out\",\n                        {\n                            left: \"left-[0.3rem]\",\n                            right: \"left-[2.6rem]\",\n                            middle: \"left-[1.45rem]\",\n                        }[_state]\n                    )}\n                    icon={faCircle}\n                />\n            </div>\n        </LinkInternal>\n    );\n};\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { faCheck, faChevronLeft, faEye, faIdCard, faPlus, faRectangleWide } from \"@fortawesome/pro-solid-svg-icons\";\nimport { Button as IdeButton } from \"@/components/reusable/Button\";\nimport { ButtonGroup } from \"@/components/reusable/ButtonGroup\";\nimport { CheckBox, DropDown } from \"@/components/reusable/Forms\";\nimport { Button, IconButton } from \"@/pyspace/common/components/Button\";\nimport PySpaceTextArea from \"@/pyspace/common/components/TextArea\";\nimport PySpaceTextInput from \"@/pyspace/common/components/TextInput\";\nimport { createSiteStore } from \"@/pyspace/site/store/pyspace-site-store\";\nimport { ThemeContext, cx } from \"@/theme/styles\";\nimport { PySpaceLightTheme } from \"@/theme/theme\";\nimport { PySpaceToggle } from \"@pyspace/common/components/PySpaceToggle\";\nimport { setShareState } from \"@pyspace/gadget_editor/controllers/gadget\";\n\nexport default ({}) => {\n    const store = useMemo(() => createSiteStore({}), []);\n    const [textValue, setTextValue] = useState(\"initial value\");\n\n    const [buttonGroup1, setButtonGroup1] = useState(1);\n    const buttonGroup1Options = [\n        { value: 1, title: \"Option 1\" },\n        { value: 2, title: \"Option 2\" },\n    ];\n\n    const [buttonGroup2, setButtonGroup2] = useState(1);\n    const buttonGroup2Options = [\n        { value: 1, title: \"Option 1\" },\n        { value: 2, title: \"Option 2\" },\n        { value: 3, title: \"Option 3\" },\n    ];\n\n    const [toggle, setToggle] = useState(null);\n\n    return (\n        <Provider store={store}>\n            <ThemeContext.Provider value={PySpaceLightTheme}>\n                <div className={\"text-4xl\"}>Dropdown Selects</div>\n                <div className={\"mt-4 flex w-240 flex-col gap-4\"}>\n                    <DropDown>\n                        <option value={1}>flat large</option>\n                        <option value={2}>option 2</option>\n                        <option value={3}>option 3</option>\n                    </DropDown>\n\n                    <DropDown elevated>\n                        <option value={1}>elevated large</option>\n                        <option value={2}>option 2</option>\n                        <option value={3}>option 3</option>\n                    </DropDown>\n\n                    <DropDown variant={\"small\"}>\n                        <option value={1}>flat small</option>\n                        <option value={2}>option 2</option>\n                        <option value={3}>option 3</option>\n                    </DropDown>\n\n                    <DropDown variant={\"small\"} elevated>\n                        <option value={1}>elevated small</option>\n                        <option value={2}>option 2</option>\n                        <option value={3}>option 3</option>\n                    </DropDown>\n                </div>\n                <div className={\"text-4xl\"}>Toggles</div>\n                <div className={\"mt-4 flex w-240 flex-col gap-4\"}>\n                    <div className={\"flex items-center gap-4\"}>\n                        <PySpaceToggle\n                            className={cx(\"mx-[0.8rem] flex-none\")}\n                            onClick={() => setToggle(!toggle)}\n                            label={\"toggle\"}\n                            state={toggle}\n                        />\n                        <Button round onClick={() => setToggle(null)}>\n                            Set to null\n                        </Button>\n                    </div>\n                </div>\n                <div className={\"text-4xl\"}>Button Groups</div>\n\n                <div className={\"mt-4 flex w-240 flex-col gap-4\"}>\n                    <ButtonGroup\n                        className={cx(buttonGroup1 !== 0 && \"mb-8\")}\n                        options={buttonGroup1Options}\n                        selectedVariant={\"primary\"}\n                        selectedOption={buttonGroup1}\n                        onClick={(e) => setButtonGroup1(e)}\n                    />\n                    <ButtonGroup\n                        elevated={false}\n                        className={cx(buttonGroup1 !== 0 && \"mb-8\")}\n                        options={buttonGroup1Options}\n                        selectedVariant={\"primary\"}\n                        selectedOption={buttonGroup1}\n                        onClick={(e) => setButtonGroup1(e)}\n                    />\n\n                    <ButtonGroup\n                        className={cx(buttonGroup2 !== 0 && \"mb-8\")}\n                        options={buttonGroup2Options}\n                        selectedVariant={\"primary\"}\n                        selectedOption={buttonGroup2}\n                        onClick={(e) => setButtonGroup2(e)}\n                    />\n                    <ButtonGroup\n                        elevated={false}\n                        className={cx(buttonGroup2 !== 0 && \"mb-8\")}\n                        options={buttonGroup2Options}\n                        selectedVariant={\"primary\"}\n                        selectedOption={buttonGroup2}\n                        onClick={(e) => setButtonGroup2(e)}\n                    />\n                </div>\n\n                <div className={\"text-4xl\"}>Check Boxes</div>\n\n                <CheckBox>Check box</CheckBox>\n                <div className={\"text-4xl\"}>IDE Buttons in PySpace</div>\n                <div className={\"mt-4 flex gap-4\"}>\n                    <IdeButton elevated={false}>Flat</IdeButton>\n                    <IdeButton>Elevated</IdeButton>\n                    <IdeButton elevated={false} disabled>\n                        Disabled/Flat\n                    </IdeButton>\n                </div>\n                <div className={\"mt-4 flex gap-4\"}>\n                    <IdeButton>Default</IdeButton>\n                    <IdeButton variants={[\"primary\"]}>Primary</IdeButton>\n                    <IdeButton variants={[\"secondary\"]}>Secondary</IdeButton>\n                    <IdeButton variants={[\"tertiary\"]}>Tertiary</IdeButton>\n                    <IdeButton variants={[\"danger\"]}>Disabled</IdeButton>\n                    <IdeButton variants={[\"hidden\"]}>Hidden</IdeButton>\n                    <IdeButton disabled>Disabled</IdeButton>\n                </div>\n                <div className={\"mt-4 flex gap-4\"}>\n                    <IdeButton variants={[\"highlight1\"]}>Highlight 1</IdeButton>\n                    <IdeButton variants={[\"highlight2\"]}>Highlight 2</IdeButton>\n                    <IdeButton variants={[\"highlight3\"]}>Highlight 3</IdeButton>\n                </div>\n                <div className={\"mt-4 flex gap-4\"}>\n                    <IdeButton size={\"tiny\"} variant={\"highlight3\"}>\n                        Tiny\n                    </IdeButton>\n                    <IdeButton size={\"small\"}>Small</IdeButton>\n                    <IdeButton size={\"large\"}>Large</IdeButton>\n                    <IdeButton variants={[\"no-border\"]}>No Border</IdeButton>\n                </div>\n\n                <div className={\"mt-4 flex gap-4\"}>\n                    <IdeButton round size={\"tiny\"}>\n                        Tiny\n                    </IdeButton>\n                    <IdeButton round size={\"small\"}>\n                        Small\n                    </IdeButton>\n                    <IdeButton round>Default</IdeButton>\n                    <IdeButton round size={\"large\"}>\n                        Large\n                    </IdeButton>\n                    <IdeButton round icon={faCheck}>\n                        Default\n                    </IdeButton>\n                    <IdeButton round icon={faCheck} iconRight>\n                        Default\n                    </IdeButton>\n                </div>\n\n                <div className={\"mt-4 flex gap-4\"}>\n                    <IdeButton icon={faCheck}>Default</IdeButton>\n                    <IdeButton icon={faCheck} iconRight>\n                        Default\n                    </IdeButton>\n                </div>\n                <div className={\"text-4xl\"}>TextArea</div>\n                <div className={\"mx-8 my-4 flex flex-col gap-4\"}>\n                    <PySpaceTextArea text={\"flat TextArea\"} />\n                    <PySpaceTextArea elevated text={\"elevated TextArea\"} />\n                </div>\n\n                <div className={\"mx-8 my-4 flex flex-col gap-4\"}>\n                    <PySpaceTextArea\n                        description={\"subtitle/description here\"}\n                        text={\"textarea with a title and description\"}\n                    />\n                </div>\n\n                <div className={\"text-4xl\"}>TextInput</div>\n\n                <div className={\"mx-8 my-4 flex items-center gap-4\"}>\n                    <PySpaceTextInput value={textValue} onChange={(v) => setTextValue(v)} placeholder={\"Tester\"} />\n                    <div>{textValue}</div>\n                </div>\n\n                <div className={\"mx-8 my-4 flex gap-4\"}>\n                    <PySpaceTextInput size={\"tiny\"} placeholder={\"Tiny!!\"} />\n                    <PySpaceTextInput elevated size={\"tiny\"} placeholder={\"Tiny!\"} />\n                </div>\n                <div className={\"mx-8 my-4 flex gap-4\"}>\n                    <PySpaceTextInput size={\"small\"} placeholder={\"Small!\"} />\n                    <PySpaceTextInput elevated size={\"small\"} placeholder={\"Small!\"} />\n                </div>\n                <div className={\"mx-8 my-4 flex gap-4\"}>\n                    <PySpaceTextInput placeholder={\"Medium!\"} />\n                    <PySpaceTextInput elevated placeholder={\"Medium!\"} />\n                </div>\n                <div className={\"mx-8 my-4 flex gap-4\"}>\n                    <PySpaceTextInput size={\"large\"} placeholder={\"Large!\"} />\n                    <PySpaceTextInput elevated size={\"large\"} placeholder={\"Large\"} />\n                </div>\n                <div className={\"mx-8 my-4 flex gap-4\"}>\n                    <PySpaceTextInput disabled placeholder={\"Disabled\"} />\n                    <PySpaceTextInput invalid placeholder={\"Invalid\"} />\n                </div>\n\n                <div className={\"mx-8 my-4\"}>\n                    <PySpaceTextInput icon={faEye} placeholder={\"With Icon\"} />\n                </div>\n\n                <div className={\"mx-8 my-4\"}>\n                    <PySpaceTextInput title={\"Label\"} placeholder={\"Label\"} />\n                </div>\n\n                <div className={\"mx-8 my-4\"}>\n                    <PySpaceTextInput\n                        title={\"Label\"}\n                        description={\"Some subtitle text here\"}\n                        placeholder={\"Label and Description\"}\n                    />\n                </div>\n\n                <div className={\"text-4xl\"}>Buttons</div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <Button>Button</Button>\n                    <Button variant={\"primary\"}>Button</Button>\n                    <Button variant={\"danger\"}>Button</Button>\n                    <Button variant={\"light\"}>Button</Button>\n                    <Button disabled>Button</Button>\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <Button elevated>Button</Button>\n                    <Button elevated variant={\"primary\"}>\n                        Button\n                    </Button>\n                    <Button elevated variant={\"danger\"}>\n                        Button\n                    </Button>\n                    <Button elevated variant={\"light\"}>\n                        Button\n                    </Button>\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <Button round>Button</Button>\n                    <Button round variant={\"primary\"}>\n                        Button\n                    </Button>\n                    <Button round variant={\"danger\"}>\n                        Button\n                    </Button>\n                    <Button round variant={\"light\"}>\n                        Button\n                    </Button>\n                    <Button round disabled>\n                        Button\n                    </Button>\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <Button round elevated>\n                        Button\n                    </Button>\n                    <Button round elevated variant={\"primary\"}>\n                        Button\n                    </Button>\n                    <Button round elevated variant={\"danger\"}>\n                        Button\n                    </Button>\n                    <Button round elevated variant={\"light\"}>\n                        Button\n                    </Button>\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <Button icon={faPlus}>Button</Button>\n                    <Button iconRight icon={faPlus}>\n                        Button\n                    </Button>\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <Button round icon={faPlus}>\n                        Button\n                    </Button>\n                    <Button iconRight round icon={faPlus}>\n                        Button\n                    </Button>\n                </div>\n                <div className={\"text-4xl\"}>IconButtons</div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <IconButton icon={faPlus} />\n                    <IconButton variant={\"primary\"} icon={faPlus} />\n                    <IconButton variant={\"danger\"} icon={faPlus} />\n                    <IconButton variant={\"light\"} icon={faPlus} />\n                    <IconButton disabled icon={faPlus} />\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <IconButton elevated icon={faPlus} />\n                    <IconButton elevated variant={\"primary\"} icon={faPlus} />\n                    <IconButton elevated variant={\"danger\"} icon={faPlus} />\n                    <IconButton elevated variant={\"light\"} icon={faPlus} />\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <IconButton round icon={faPlus} />\n                    <IconButton round variant={\"primary\"} icon={faPlus} />\n                    <IconButton round variant={\"danger\"} icon={faPlus} />\n                    <IconButton round variant={\"light\"} icon={faPlus} />\n                    <IconButton round disabled icon={faPlus} />\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <IconButton round elevated icon={faPlus} />\n                    <IconButton round elevated variant={\"primary\"} icon={faPlus} />\n                    <IconButton round elevated variant={\"danger\"} icon={faPlus} />\n                    <IconButton round elevated variant={\"light\"} icon={faPlus} />\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <IconButton size={\"medium\"} icon={faPlus} />\n                    <IconButton size={\"small\"} icon={faPlus} />\n                    <IconButton size={\"tiny\"} icon={faPlus} />\n                </div>\n                <div className={\"m-8 flex items-center gap-4\"}>\n                    <IconButton round size={\"medium\"} icon={faPlus} />\n                    <IconButton round size={\"small\"} icon={faPlus} />\n                    <IconButton round size={\"tiny\"} icon={faPlus} />\n                </div>\n            </ThemeContext.Provider>\n        </Provider>\n    );\n};\n","import React, { ReactElement, useMemo, useRef, useState } from \"react\";\nimport {\n    faArrowLeft,\n    faAt,\n    faChevronRight,\n    faCircleExclamation,\n    faCreditCard,\n    faGear,\n    faPalette,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Button } from \"@/pyspace/common/components/Button\";\nimport PySpaceTextInput from \"@/pyspace/common/components/TextInput\";\nimport { UserDetails, UserProfile } from \"@/pyspace/common/types\";\nimport * as pyspaceApi from \"@/pyspace/pyspace-api\";\nimport { cx } from \"@/theme/styles\";\nimport { PySpaceToggle } from \"@pyspace/common/components/PySpaceToggle\";\n\nconst SettingsMenu = ({ page, setPage }) => {\n    return (\n        <div className={cx(page === null ? \"block\" : \"hidden lg:flex lg:flex-col\", \"lg:items-center\")}>\n            <div className={cx(\"px-[.5rem] py-6 text-[3.6rem] font-semibold\", \"lg:hidden\")}>Settings</div>\n            {/*todo: I need the breakpoint of when it goes to hamburger in order to make this change correctly*/}\n            <div\n                className={cx(\n                    \"divide-y divide-light-grey2 overflow-hidden border-y border-light-grey2 text-light-grey2 lg:rounded-[0.4rem] lg:border\",\n                    \"absolute w-full lg:relative lg:w-full lg:max-w-[31.9rem]\"\n                )}>\n                {/**/}\n                <div\n                    onClick={() => setPage(\"account\")}\n                    className={cx(\n                        \"flex w-full cursor-pointer items-center gap-6 px-10 py-8 hover:bg-[#d6e9ef80] active:bg-[#C2DEE7] lg:bg-white\",\n                        page === \"account\" && \"bg-light-bg4 lg:bg-light-bg4\"\n                    )}>\n                    <div className={\"flex-none text-[2rem] font-black\"}>\n                        <FontAwesomeIcon icon={faGear} />\n                    </div>\n                    <div className={\"flex-1 text-[2rem] font-semibold\"}>Account</div>\n                    <div className={\"flex-none text-[2rem] font-black\"}>\n                        <FontAwesomeIcon icon={faChevronRight} />\n                    </div>\n                </div>\n\n                {/**/}\n                <div\n                    onClick={() => setPage(\"billing\")}\n                    className={cx(\n                        \"flex w-full cursor-pointer items-center gap-6 px-10 py-8 hover:bg-[#d6e9ef80] active:bg-[#C2DEE7] lg:bg-white\",\n                        page === \"billing\" && \"bg-light-bg4 lg:bg-light-bg4\"\n                    )}>\n                    <div className={\"flex-none text-[2rem] font-black\"}>\n                        <FontAwesomeIcon icon={faCreditCard} />\n                    </div>\n                    <div className={\"flex-1 text-[2rem] font-semibold\"}>Billing</div>\n                    <div className={\"flex-none text-[2rem] font-black\"}>\n                        <FontAwesomeIcon icon={faChevronRight} />\n                    </div>\n                </div>\n\n                {/**/}\n                <div\n                    onClick={() => setPage(\"ide\")}\n                    className={cx(\n                        \"flex w-full cursor-pointer items-center gap-6 px-10 py-8 hover:bg-[#d6e9ef80] active:bg-[#C2DEE7] lg:bg-white\",\n                        page === \"ide\" && \"bg-light-bg4 lg:bg-light-bg4\"\n                    )}>\n                    <div className={\"flex-none text-[2rem] font-black\"}>\n                        <FontAwesomeIcon icon={faPalette} />\n                    </div>\n                    <div className={\"flex-1 text-[2rem] font-semibold\"}>IDE</div>\n                    <div className={\"flex-none text-[2rem] font-black\"}>\n                        <FontAwesomeIcon icon={faChevronRight} />\n                    </div>\n                </div>\n            </div>\n        </div>\n    );\n};\n\ntype Page = \"account\" | \"billing\" | \"ide\" | null;\n\nconst AccountSettings = ({ prefs: initialPrefs, user, setPage }: { prefs: AccountPrefs; user: UserDetails }) => {\n    const [username, setUsername] = useState(user.profile.username);\n    const [prefs, setPrefs] = useState(initialPrefs);\n    const [saving, setSaving] = useState(false);\n    const [draftUsername, setDraftUsername] = useState<string | null>(null);\n    const [usernameError, setUsernameError] = useState<string | null>(null);\n\n    console.log(\"Prefs =\", prefs);\n\n    const changePrefs = async (changes: Partial<AccountPrefs>) => {\n        setSaving(true);\n        try {\n            setPrefs(await pyspaceApi.setAccountSettings(changes));\n        } finally {\n            setSaving(false);\n        }\n    };\n\n    const changeUsername = async (newUsername: string) => {\n        setSaving(true);\n\n        try {\n            const r = await pyspaceApi.changeUsername(newUsername);\n            setUsername(r.username);\n            setUsernameError(r.error ?? null);\n            if (!r.error) {\n                setDraftUsername(null);\n            }\n        } finally {\n            setSaving(false);\n        }\n    };\n\n    return (\n        <>\n            {true ? ( //todo: when there are more pages then just the account page this second part can be used\n                <div className={\"flex items-center gap-8 text-[3.6rem] font-semibold text-light-grey2\"}>\n                    Account Settings\n                </div>\n            ) : (\n                <>\n                    <div\n                        className={\n                            \"flex cursor-pointer items-center gap-8 text-[3.6rem] font-semibold text-light-grey2 lg:hidden\"\n                        }\n                        onClick={() => setPage(null)}>\n                        <FontAwesomeIcon className={\"text-[2rem] font-black\"} icon={faArrowLeft} />\n                        Account\n                    </div>\n                    <div\n                        className={\n                            \"flex hidden items-center gap-8 text-[3.6rem] font-semibold text-light-grey2 lg:block\"\n                        }>\n                        Account\n                    </div>\n                </>\n            )}\n            <div className={\"flex flex-col gap-8\"}>\n                <div className={\"text-[2.8rem] font-semibold text-light-grey2\"}>Email Settings</div>\n                <div>\n                    Your email address is <b>{user.email}</b>\n                </div>\n                <div>\n                    <div className={\"text-[2rem] font-semibold text-light-grey2\"}>Subscriptions</div>\n\n                    <div className={\"my-[.6rem] flex flex-col gap-4\"}>\n                        <div className={\"flex gap-4\"}>\n                            <div className={\"grow\"}>Receive updates about py.space from us</div>\n                            <PySpaceToggle\n                                onClick={() => changePrefs({ newsletter: !prefs.newsletter })}\n                                state={prefs.newsletter ?? true}\n                            />\n                        </div>\n                    </div>\n                </div>\n                <div>\n                    <div className={\"text-[2rem] font-semibold text-light-grey2\"}>Social</div>\n                    <div className={\"my-[.6rem] flex flex-col gap-4\"}>\n                        <div className={\"flex gap-4\"}>\n                            <div className={\"grow\"}>Get emails when people follow you or like your widgets</div>\n                            <PySpaceToggle\n                                onClick={() => changePrefs({ notifications: !prefs.notifications })}\n                                state={!!prefs.notifications ?? true}\n                            />\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n            <div>\n                <div className={\"text-[2.8rem] font-semibold text-light-grey2\"}>Username</div>\n                <div\n                    className={\n                        \"mt-[1.3rem] flex w-full items-center gap-[1.3rem] rounded-[.4rem] border border-light-grey2 bg-light-bg4 px-[1.9rem] py-[1.1rem]\"\n                    }>\n                    <FontAwesomeIcon className={\"text-[2rem]\"} icon={faCircleExclamation} />\n                    <div>\n                        Your username is <b>{username}</b>. Changing your username breaks links to your profile, and\n                        mentions of your name in the forum!\n                    </div>\n                </div>\n                <div>\n                    {draftUsername == null ? (\n                        <Button\n                            elevated\n                            variant={\"danger\"}\n                            className={\"my-4 w-full\"}\n                            onClick={() => setDraftUsername(username)}>\n                            I understand - Change my username\n                        </Button>\n                    ) : (\n                        <>\n                            <div className={\"my-4 flex flex-col gap-4 lg:gap-6\"}>\n                                <div className={\"flex items-center gap-4 lg:gap-8\"}>\n                                    <div className=\"relative flex flex-1 items-center\">\n                                        <FontAwesomeIcon\n                                            icon={faAt}\n                                            className=\"absolute left-[1.4rem] text-[2.2rem] font-black text-light-grey2\"\n                                        />\n                                        {/*TODO: We want to use the nice py.space widget here but it uses Anvil's, which uses useDispatch(), so we can't yet*/}\n                                        {/*<PySpaceTextInput className={\"ml-2\"} value={draftUsername} onChange={e => setDraftUsername(e.target.value)}/>*/}\n                                        <input\n                                            value={draftUsername}\n                                            className={\n                                                \"flex h-full flex-1 items-center rounded-[.4rem] border-2 border-light-grey2 bg-white py-[0.7rem] pr-[1.4rem] pl-20 text-[1.4rem] font-semibold shadow-pselevated1 outline-none placeholder:font-normal placeholder:text-light-grey1 md:h-[5.4rem]\"\n                                            }\n                                            type={\"text\"}\n                                            onChange={(e) => setDraftUsername(e.target.value)}\n                                        />\n                                    </div>\n\n                                    <Button elevated variant={\"danger\"} onClick={() => changeUsername(draftUsername!)}>\n                                        Change Username\n                                    </Button>\n                                </div>\n                                {usernameError && <div className={\"text-[#d00]\"}>{usernameError}</div>}\n\n                                <Button elevated className={\"w-full\"} onClick={() => setDraftUsername(null!)}>\n                                    Cancel\n                                </Button>\n                            </div>\n                        </>\n                    )}\n                    <div className={\"text-[1.6rem] font-semibold text-light-grey2\"}>\n                        Profile URL:\n                        <a className={\"ml-[.9rem] font-normal text-light-bg6 underline\"} href={`/u/${username}`}>\n                            py.space/u/{username}\n                        </a>\n                    </div>\n                </div>\n            </div>\n\n            <div className={\"flex flex-col gap-8\"}>\n                <div className={\"text-[2.8rem] font-semibold text-light-grey2\"}>Account deletion</div>\n                <div>\n                    To delete your account, email us at{\" \"}\n                    <a href=\"mailto:contact@py.space\" className={\"font-normal text-light-bg6 underline\"}>\n                        contact@py.space\n                    </a>\n                    .\n                </div>\n            </div>\n        </>\n    );\n};\nexport interface AccountPrefs {\n    newsletter: boolean;\n    notifications: boolean;\n}\n\nexport default ({ prefs: initialPrefs, user }: { prefs: AccountPrefs; user: UserDetails }) => {\n    //re. displaying things\n    const [page, setPage] = useState<Page>(\"account\");\n\n    const content = useMemo(() => {\n        switch (page) {\n            case \"account\":\n                return <AccountSettings prefs={initialPrefs} user={user} setPage={setPage} />;\n            case \"billing\":\n                return <div onClick={() => setPage(null)}>Billing Content</div>;\n            case \"ide\":\n                return <div onClick={() => setPage(null)}>Ide Content</div>;\n        }\n    }, [page, initialPrefs, user]);\n\n    return (\n        <div\n            className={cx(\n                \"relative w-screen gap-x-12 lg:grid lg:w-full lg:grid-cols-[1fr_auto_1fr]\"\n                // \"lg:mt-44\" //todo: uncomment this when there are more setting pages\n            )}>\n            {/*todo: use the settings menut when there are more pages*/}\n            {true ? <div className={\"hidden lg:block\"} /> : <SettingsMenu page={page} setPage={setPage} />}\n            <div\n                className={cx(\n                    page === null ? \"hidden lg:block\" : \"block\",\n                    \"m-8 flex flex-col gap-12 text-[1.6rem] lg:m-0 lg:w-200 lg:gap-14\",\n                    \"mx-auto max-w-200 px-8\" //todo: remove this line when there are more setting pages\n                )}>\n                {content}\n            </div>\n            <div className={\"hidden lg:block\"} />\n        </div>\n    );\n};\n","import { GadgetEditorEvents } from \"@/pyspace/common/types\";\nimport { GadgetEntry, SiteAction, SiteDispatch, SiteState, Space } from \"@/pyspace/site/store/pyspace-site-store\";\n\nconst updateSpace =\n    (f: (space: Space) => void): SiteAction =>\n    (_, __, updateState) =>\n        updateState(({ space }) => f(space!));\n\nconst updateGadget = (gadgetId: string, f: (gadget: GadgetEntry) => void): SiteAction =>\n    updateSpace((space) => {\n        const g = space.gadgets.find((g) => g.id === gadgetId);\n        if (g) {\n            f(g);\n        }\n    });\n\nexport const removeGadget = (gadgetId: string) =>\n    updateSpace((space) => {\n        space.gadgets = space!.gadgets.filter(({ id }) => id != gadgetId);\n    });\n\nexport const getSpaceGadgetUpdateCallbacks = (dispatch: SiteDispatch, closeEditor: () => void): GadgetEditorEvents => ({\n    onClosed: closeEditor,\n    onDeleted(gadgetId) {\n        dispatch(removeGadget(gadgetId));\n        closeEditor();\n    },\n    onRenamed: (gadgetId, newName) =>\n        dispatch(\n            updateGadget(gadgetId, (g) => {\n                g.title = newName;\n            })\n        ),\n    onShared(gadgetId, newShareState) {\n        if (newShareState !== \"public\") {\n            dispatch(removeGadget(gadgetId));\n            closeEditor();\n        }\n    },\n    onChangedDescription: (gadgetId, newDescription) =>\n        dispatch(\n            updateGadget(gadgetId, (g) => {\n                g.description = newDescription;\n            })\n        ),\n    onChangedThumbnail: (gadgetId) =>\n        dispatch(\n            updateGadget(gadgetId, (g) => {\n                g.thumbnail_url_revision = (g.thumbnail_url_revision ?? 0) + 1;\n            })\n        ),\n    onSaved: (gadgetId) =>\n        dispatch(\n            updateGadget(gadgetId, (g) => {\n                g.last_updated = new Date().toString();\n            })\n        ),\n});\n\nexport const getSpace = (state: SiteState) => state.space;\n","import { alert, modal } from \"@/controllers/modals\";\nimport { UserProfile } from \"@/pyspace/common/types\";\nimport { forceImageToSizeAndType } from \"@/pyspace/common/util/image-resize\";\nimport * as pySpaceApi from \"@/pyspace/pyspace-api\";\nimport { SiteAsyncAction, SiteState } from \"@/pyspace/site/store/pyspace-site-store\";\nimport { GadgetAsyncAction } from \"@/types\";\nimport { postJson } from \"@/util/fetch\";\nimport * as pyspaceApi from \"@pyspace/pyspace-api\";\n\nexport const changePhoto =\n    (header: boolean): SiteAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const file = await dispatch(\n            modal(\"uploadFile\", {\n                title: \"Choose image\",\n                prompt: `This image will become your profile ${header ? \"header\" : \"picture\"}`,\n            })\n        );\n        if (file) {\n            const resizedFile = await forceImageToSizeAndType(file, \"image/jpeg\", 200000);\n            await (header ? pySpaceApi.setHeaderPicture(resizedFile) : pySpaceApi.setProfilePicture(resizedFile));\n            updateState((state) => {\n                state.profileUrlRevision ??= 0;\n                state.profileUrlRevision++;\n            });\n        }\n    };\n\n// TODO move this to pyspaceApi\nconst saveProfile = async (newProfile: UserProfile) => await postJson(`/ide/me/profile`, newProfile);\n\nexport const updateProfile =\n    (newProfile: UserProfile): SiteAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        await saveProfile(newProfile);\n\n        updateState((state) => {\n            state.profile = { ...state.profile, ...newProfile };\n        });\n    };\n\nexport const setFollowing =\n    (username: string, follow: boolean): SiteAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        const profileUpdate = await pySpaceApi.setFollowing(username, follow);\n        updateState((state) => {\n            state.profile = { ...state.profile, ...profileUpdate };\n        });\n    };\n\nexport const reportProfileAbuse =\n    (username: string): GadgetAsyncAction =>\n    async (dispatch, getState) => {\n        const state = getState();\n        const reportMessage = await dispatch(modal(\"reportAbuse\", { type: \"user\", username }));\n        if (reportMessage != null) {\n            await pyspaceApi.reportProfileAbuse(username, reportMessage);\n            await dispatch(alert(\"Report submitted\", \"Thank-you for helping to make py.space a more welcoming place.\"));\n        }\n    };\n\nexport const getProfile = (state: SiteState) => state.profile;\nexport const getProfileUrlRevision = (state: SiteState) => state.profileUrlRevision;\n","import React, { ReactEventHandler, useCallback, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { faArrowsMaximize } from \"@fortawesome/pro-regular-svg-icons/faArrowsMaximize\";\nimport { faChevronDown } from \"@fortawesome/pro-regular-svg-icons/faChevronDown\";\nimport { faChevronUp } from \"@fortawesome/pro-regular-svg-icons/faChevronUp\";\nimport { faHeart as faRegularHeart } from \"@fortawesome/pro-regular-svg-icons/faHeart\";\nimport { faArrowUpRightFromSquare, faCodeFork, faEllipsis, faEye, faTrashCan } from \"@fortawesome/pro-solid-svg-icons\";\nimport { faHeart as faSolidHeart } from \"@fortawesome/pro-solid-svg-icons/faHeart\";\nimport { faMaximize } from \"@fortawesome/pro-solid-svg-icons/faMaximize\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Button } from \"@/components/reusable/Button\";\nimport DropdownMenu, { DropDownMenuItems } from \"@/components/reusable/DropdownMenu\";\nimport { modal } from \"@/controllers/modals\";\nimport { faAnvilLogoSolid } from \"@/data/customIcons\";\nimport {\n    deleteGadget,\n    getUserDetails,\n    removeGadgetEntry,\n    setShareGadget,\n    updateGadgetEntrySharing,\n} from \"@/pyspace/site/controllers/my-gadgets\";\nimport { GadgetEntry, SiteDispatch } from \"@/pyspace/site/store/pyspace-site-store\";\nimport { cx } from \"@/theme/styles\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { timeAgo, useNowWithRefresh } from \"@/util/time\";\nimport { openInAnvil } from \"@pyspace/gadget_editor/controllers/gadget\";\nimport { removeGadget } from \"@pyspace/site/controllers/space\";\n\ntype GadgetClickHandler = (gadget: GadgetEntry) => void;\n\nfunction useGadgetDropDownItems(inSpace) {\n    const dispatch = useDispatch<SiteDispatch>();\n\n    const requestDelete = useEvent(async (gadget) => {\n        if (await dispatch(modal(\"deleteGadget\", { appName: gadget.title }))) {\n            await dispatch(deleteGadget(gadget.id));\n            if (inSpace) {\n                dispatch(removeGadget(gadget.id));\n            } else {\n                dispatch(removeGadgetEntry(gadget.id));\n            }\n        }\n    });\n    const toggleSharing = useEvent(async (gadget) => {\n        const s = gadget.sharing === \"private\" ? \"public\" : \"private\";\n        await dispatch(setShareGadget(gadget.id, s));\n        if (inSpace) {\n            //this is only for changing in the profile from public to private.\n            dispatch(removeGadget(gadget.id));\n        } else {\n            dispatch(updateGadgetEntrySharing(gadget.id, s));\n        }\n    });\n    const dropdownItems = useCallback(\n        (gadget: GadgetEntry) => () => [\n            [`Make ${gadget.sharing === \"private\" ? \"public\" : \"private\"}`, () => toggleSharing(gadget), faEye],\n            [<span>Open in Anvil</span>, () => dispatch(openInAnvil(gadget.id)), faAnvilLogoSolid],\n            [\n                \"Edit Full Screen\",\n                () => {\n                    window.open(`/g/${gadget.id}`);\n                },\n                faArrowUpRightFromSquare,\n            ],\n            [\"Delete\", () => requestDelete(gadget), faTrashCan, { className: \"text-danger\" }],\n        ],\n        []\n    );\n    return dropdownItems;\n}\n\nconst GadgetThumbnailDropdown = ({\n    gadget,\n    items,\n    setDdIsOpen,\n}: {\n    gadget: GadgetEntry;\n    items: DropDownMenuItems;\n    setDdIsOpen: (b: boolean) => void;\n}) => (\n    <DropdownMenu\n        align={\"right\"}\n        render={(showMenu, anchor) => (\n            <Button\n                isIconButton\n                variant={\"hidden\"}\n                size={\"small\"}\n                onClick={(e) => showMenu(null, e.currentTarget)}\n                className={\"group\"}>\n                <FontAwesomeIcon className={\"text-light-bg0 group-hover:text-light-bg6\"} icon={faEllipsis} />\n                {anchor}\n            </Button>\n        )}\n        items={items}\n        onShow={() => setDdIsOpen(true)}\n        onHide={() => setDdIsOpen(false)}\n    />\n);\n\nexport const GadgetThumbnail = ({\n    gadget,\n    onClick,\n    dropdownItems,\n    className,\n    style,\n    now,\n}: {\n    gadget: GadgetEntry;\n    onClick?: GadgetClickHandler;\n    dropdownItems?: DropDownMenuItems;\n    className?: string;\n    style?: object | string;\n    now?: Date;\n}) => {\n    const userDetails = useSelector(getUserDetails);\n\n    const doClick: ReactEventHandler = useEvent((e) => {\n        if (onClick) {\n            e.preventDefault();\n            onClick(gadget);\n        }\n    });\n    const doLike = useCallback(() => {}, []);\n\n    const [ddIsOpen, setDdIsOpen] = useState<boolean>(false);\n    return (\n        <a\n            style={style}\n            className={cx(className, \"flex w-fit flex-col\", ddIsOpen && \"pointer-events-none\")}\n            href={`/g/${gadget.id}`}\n            target={\"_blank\"}\n            onClick={doClick}\n            rel=\"noreferrer\">\n            <div\n                className={cx(\n                    \"ps-hover-raise-2 flex h-108 w-120 flex-col rounded-[0.4rem] border-2 border-light-grey2 bg-light-bg6 text-light-bg0\",\n                    \"overflow-hidden\"\n                )}>\n                <div\n                    className={\n                        \"flex h-68 flex-none justify-end bg-linear-to-t from-gray-100 to-gray-400 bg-cover bg-center pt-4 pr-6\"\n                    }\n                    style={{\n                        backgroundImage: `url(/ide/gadgets/${gadget.id}/thumbnail${\n                            gadget.thumbnail_url_revision ? \"?r=\" + gadget.thumbnail_url_revision : \"\"\n                        })`,\n                    }}>\n                    {gadget.sharing &&\n                        gadget.sharing !== \"private\" && ( //todo: consider making this not show up if embedded thumbnail or on a profile page\n                            <span\n                                className={\n                                    \"inline-flex h-fit rounded-full border-2 border-light-grey2 bg-light-bg3 px-4 py-[0.4rem] text-[1.2rem] leading-6 leading-[1.2rem] font-semibold text-light-grey2 capitalize shadow-pselevated0_5\"\n                                }>\n                                {gadget.sharing}\n                            </span>\n                        )}\n                </div>\n\n                <div className={\"flex h-full w-full flex-col justify-between gap-[.4rem] px-[1.2rem] pt-[0.8rem]\"}>\n                    <div className={\"flex flex-none items-center justify-between\"}>\n                        <div className={\"truncate text-[1.6rem] font-semibold\"}>{gadget.title}</div>\n                        {dropdownItems ? (\n                            <GadgetThumbnailDropdown setDdIsOpen={setDdIsOpen} gadget={gadget} items={dropdownItems} />\n                        ) : (\n                            <FontAwesomeIcon className={\"text-[1.4rem]\"} icon={faArrowsMaximize} />\n                        )}\n                    </div>\n                    <div className={\"truncate text-[1.2rem]\"}>{gadget.description}</div>\n                    <div className={\"flex flex-none items-center justify-end\"}>\n                        {gadget.last_updated && now && (\n                            <div className={\"grow text-[1.2rem]\"}>{timeAgo(now, new Date(gadget.last_updated))}</div>\n                        )}\n                        <div className={\"flex flex-none justify-end gap-[1.6rem] text-[1.4rem] leading-12\"}>\n                            <div className={\"\"}>\n                                <FontAwesomeIcon\n                                    className={\"mr-[0.4rem]\"}\n                                    icon={gadget.liked ? faSolidHeart : faRegularHeart}\n                                />{\" \"}\n                                {gadget.n_likes}\n                            </div>\n                            <div className={\"\"}>\n                                <FontAwesomeIcon className={\"mr-[0.4rem]\"} icon={faCodeFork} /> {gadget.n_forks} fork\n                                {gadget.n_forks !== 1 ? \"s\" : \"\"}\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </a>\n    );\n};\n\nexport const GadgetList = ({\n    gadgets,\n    onClick,\n    inSpace = false,\n}: {\n    gadgets: GadgetEntry[];\n    onClick?: GadgetClickHandler;\n    inSpace?: boolean;\n}) => {\n    const dropdownItems = useGadgetDropDownItems(inSpace);\n    const now = useNowWithRefresh();\n\n    const [expanded, setExpanded] = useState(false);\n\n    // TODO: Right now, this still renders all gadgets, even when not expanded. This is so we can do everything\n    //  in CSS without knowing the width in JS\n\n    return (\n        <div className={\"@container\"}>\n            <div\n                className={cx(\n                    \"grid gap-[1.6rem]\",\n                    \"grid-cols-[repeat(1,30rem)] justify-center\",\n                    \"@[62rem]:grid-cols-[repeat(2,30rem)] @[62rem]:justify-center @[62rem]:gap-x-16\",\n                    \"@[94rem]:grid-cols-[repeat(3,30rem)] @[94rem]:justify-around @[94rem]:gap-x-[1.6rem]\",\n                    \"@[125rem]:grid-cols-[repeat(4,30rem)] @[125rem]:justify-start\"\n                )}>\n                {!inSpace && (\n                    <div\n                        className={cx(\n                            \"hidden\",\n                            gadgets.length > 3 && \"@[94rem]:block @[125rem]:hidden\",\n                            gadgets.length > 4 && \"@[125rem]:block\",\n                            \"@[94rem]:order-25 @[94rem]:col-span-3 @[125rem]:order-35 @[125rem]:col-span-4\"\n                        )}>\n                        <Button\n                            className={\"my-6 h-[3.6rem]! select-none\"}\n                            icon={expanded ? faChevronUp : faChevronDown}\n                            elevated\n                            round\n                            variant={\"highlight3\"}\n                            onClick={() => setExpanded((e) => !e)}>\n                            {expanded ? \"Show fewer\" : \"Show more\"}\n                        </Button>\n                    </div>\n                )}\n                {gadgets.map((g, idx) => (\n                    <GadgetThumbnail\n                        key={g?.id}\n                        style={{ order: idx * 10 }}\n                        className={cx(\n                            !inSpace && !expanded && idx > 2 && \"@[94rem]:hidden @[125rem]:block\",\n                            !inSpace && !expanded && idx > 3 && \"@[125rem]:hidden\"\n                        )}\n                        gadget={g}\n                        onClick={onClick}\n                        dropdownItems={g.mine ? dropdownItems?.(g) : undefined}\n                        now={now}\n                    />\n                ))}\n            </div>\n        </div>\n    );\n};\n","import React, { useMemo, useReducer, useRef, useState } from \"react\";\nimport { Provider, useDispatch, useSelector } from \"react-redux\";\nimport { faTimes } from \"@fortawesome/pro-light-svg-icons\";\nimport { faSearch } from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport Modals from \"@/components/modals\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { GadgetEditorEvents, UserDetails, UserProfile } from \"@/pyspace/common/types\";\nimport { PopoutEditor } from \"@/pyspace/site/components/PopoutEditor\";\nimport { getGadgets, getMyGadgetsEditorCallbacks, useMyGadgetsCallbacks } from \"@/pyspace/site/controllers/my-gadgets\";\nimport { getSpace, getSpaceGadgetUpdateCallbacks } from \"@/pyspace/site/controllers/space\";\nimport { getPyspaceSiteModals } from \"@/pyspace/site/modals/names/pyspace-site-modals\";\nimport { GadgetEntry, SiteDispatch, Space, createSiteStore } from \"@/pyspace/site/store/pyspace-site-store\";\nimport { ThemeContext } from \"@/theme/styles\";\nimport { PySpaceDarkTheme, PySpaceLightTheme } from \"@/theme/theme\";\nimport { useUpdateEffect } from \"@/util/hooks\";\nimport useEvent from \"@/util/useEventCallback\";\nimport PySpaceTextInput from \"@pyspace/common/components/TextInput\";\nimport { SiteProvider } from \"@pyspace/site/components/SiteProvider\";\nimport { getProfile } from \"../controllers/profile\";\nimport { GadgetList, GadgetThumbnail } from \"./GadgetList\";\n\nfunction useFilteredGadgets(allGadgets: GadgetEntry[]) {\n    const [search, setSearch] = useState(\"\");\n    const [searchTerm, setSearchTerm] = useReducer((_prev: string, next: string) => next.toLowerCase(), search);\n\n    const filteredGadgets = useMemo(() => {\n        if (!searchTerm) return allGadgets;\n        return allGadgets.filter(\n            (g) => g.title.toLowerCase().includes(searchTerm) || g.id.toLowerCase() === searchTerm\n        );\n    }, [searchTerm, allGadgets]);\n\n    const searchTimeout = useRef<number | undefined>();\n\n    const onFilterApps = useEvent((filterOverride?: null | string) => {\n        clearTimeout(searchTimeout.current);\n        searchTimeout.current = setTimeout(() => setSearchTerm(search), 200);\n    });\n\n    useUpdateEffect(() => {\n        onFilterApps(search);\n    }, [search]);\n\n    return { search, setSearch, filteredGadgets, onFilterApps };\n}\n\ntype AppListSearchProps = Omit<ReturnType<typeof useFilteredGadgets>, \"filteredGadgets\">;\n\nconst AppListSearch = ({ search, setSearch, onFilterApps }: AppListSearchProps) => {\n    return (\n        <div className={\"relative flex items-center\"}>\n            <div className={\"w-full\"}>\n                <PySpaceTextInput\n                    elevated\n                    icon={faSearch}\n                    value={search}\n                    onChange={(e) => setSearch(e)}\n                    onEnter={() => {\n                        onFilterApps();\n                    }}\n                    placeholder={\"Search your widgets\"}\n                />\n            </div>\n            {search && (\n                <LinkInternal\n                    className=\"absolute right-4 text-[2rem] text-light-bg5 hover:text-light-grey2 dark:text-dark-bg3 dark:hover:text-dark-fg3\"\n                    onClick={() => {\n                        setSearch(\"\");\n                        onFilterApps(\"\");\n                    }}>\n                    <FontAwesomeIcon icon={faTimes} />\n                </LinkInternal>\n            )}\n        </div>\n    );\n};\n\nconst MyGadgetsContent = () => {\n    const [poppingOutGadget, setPoppingOutGadget] = useState<GadgetEntry | null>(null);\n    useMyGadgetsCallbacks(setPoppingOutGadget);\n    const myGadgets = useSelector(getGadgets)!;\n    const profile = useSelector(getProfile)!;\n    const dispatch = useDispatch<SiteDispatch>();\n    const popoutCallbacks: GadgetEditorEvents = useMemo(() => {\n        return getMyGadgetsEditorCallbacks(dispatch, () => setPoppingOutGadget(null));\n    }, []);\n\n    const containerRef = useRef<HTMLDivElement>(null);\n    const { filteredGadgets, ...searchProps } = useFilteredGadgets(myGadgets);\n\n    return (\n        <>\n            <div ref={containerRef} className={\"@container/listContainer w-full\"}>\n                {myGadgets.length > 0 && (\n                    <div\n                        className={\n                            \"@62rem/listContainer:gap-[3rem] mb-8 flex w-full items-center gap-6 text-[2.4rem] font-semibold @[62rem]/listContainer:mb-12 @[62rem]/listContainer:text-[3.6rem]\"\n                        }>\n                        <div className={\"flex-initial\"}>Your Widgets</div>\n                        <div className={\"flex-1\"}>\n                            <div className={\"max-w-124 flex-1\"}>\n                                <AppListSearch {...searchProps} />\n                            </div>\n                        </div>\n                    </div>\n                )}\n            </div>\n            <GadgetList gadgets={filteredGadgets.map((g) => ({ ...g, mine: true }))} onClick={setPoppingOutGadget} />\n            {poppingOutGadget && (\n                <PopoutEditor gadgetId={poppingOutGadget.id} ownerProfile={profile} events={popoutCallbacks} />\n            )}\n        </>\n    );\n};\n\nexport const MyGadgets = ({ myGadgets, userDetails }: { myGadgets: GadgetEntry[]; userDetails: UserDetails }) => {\n    const store = useMemo(() => createSiteStore({ gadgets: myGadgets, userDetails, profile: userDetails.profile }), []);\n    const isDark = false;\n    return (\n        <Provider store={store}>\n            <ThemeContext.Provider value={isDark ? PySpaceDarkTheme : PySpaceLightTheme}>\n                <MyGadgetsContent />\n                <Modals modalTypes={getPyspaceSiteModals()} />\n            </ThemeContext.Provider>\n        </Provider>\n    );\n};\n\nconst SpaceContent = () => {\n    const space = useSelector(getSpace)!;\n    const profile = useSelector(getProfile)!;\n    const [poppingOutGadget, setPoppingOutGadget] = useState<GadgetEntry | null>(null);\n    const dispatch = useDispatch<SiteDispatch>();\n\n    const popoutEditorEvents: GadgetEditorEvents = useMemo(() => {\n        return getSpaceGadgetUpdateCallbacks(dispatch, () => setPoppingOutGadget(null));\n    }, []);\n\n    return (\n        <>\n            {space.title && <h1>{space.title}</h1>}\n            <GadgetList inSpace gadgets={space.gadgets} onClick={(g) => setPoppingOutGadget(g)} />\n            {poppingOutGadget && (\n                <PopoutEditor gadgetId={poppingOutGadget.id} ownerProfile={profile} events={popoutEditorEvents!} />\n            )}\n        </>\n    );\n};\n\nexport const DisplaySpace = ({\n    space,\n    userDetails,\n    profile,\n}: {\n    space: Space;\n    userDetails?: UserDetails;\n    profile: UserProfile;\n}) => {\n    const store = useMemo(() => createSiteStore({ userDetails, space, profile }), []);\n    const isDark = false;\n    return (\n        <Provider store={store}>\n            <ThemeContext.Provider value={isDark ? PySpaceDarkTheme : PySpaceLightTheme}>\n                <SpaceContent />\n                <Modals modalTypes={getPyspaceSiteModals()} />\n            </ThemeContext.Provider>\n        </Provider>\n    );\n};\n\nexport const OneThumbnail = ({\n    gadget,\n    ownerProfile,\n    loggedInUser,\n}: {\n    gadget: GadgetEntry;\n    ownerProfile: UserProfile;\n    loggedInUser?: UserDetails;\n}) => {\n    const [poppedOut, setPoppedOut] = useState(false);\n    const [_, forceRender] = useState(0);\n\n    const callbacks: GadgetEditorEvents = useMemo(\n        () => ({\n            onClosed() {\n                setPoppedOut(false);\n            },\n            onLiked(_, liked) {\n                gadget.liked = liked;\n\n                // This is a hack, just so it looks like it's changing correctly. Who knows what the correct number is by now?\n                if (liked) {\n                    gadget.n_likes++;\n                } else {\n                    gadget.n_likes--;\n                }\n                forceRender((s) => s + 1);\n            },\n        }),\n        [gadget]\n    );\n\n    return (\n        <SiteProvider initialStoreState={{ userDetails: loggedInUser }}>\n            <GadgetThumbnail gadget={gadget} onClick={() => setPoppedOut(true)} className={\"h-1/4 w-1/2\"} />\n            {poppedOut && <PopoutEditor gadgetId={gadget.id} ownerProfile={ownerProfile} events={callbacks} />}\n        </SiteProvider>\n    );\n};\n\nexport const MissingGadgetThumbnail = () => (\n    <div className={\"flex flex-col\"}>\n        <div\n            className={\n                \"flex h-108 w-120 flex-col justify-center overflow-hidden rounded-[0.4rem] border-2 border-light-grey2 bg-light-bg6 p-8 text-center text-[2rem] text-light-bg0\"\n            }>\n            This widget has been deleted or made private.\n        </div>\n    </div>\n);\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { faArrowLeft } from \"@fortawesome/free-solid-svg-icons\";\nimport { faTimes } from \"@fortawesome/pro-solid-svg-icons\";\nimport { faArrowRight } from \"@fortawesome/pro-solid-svg-icons/faArrowRight\";\nimport { faSearch } from \"@fortawesome/pro-solid-svg-icons/faSearch\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport Link from \"@/components/reusable/Link\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport useEvent from \"@/util/useEventCallback\";\nimport * as pySpaceApi from \"@pyspace/pyspace-api\";\nimport { SearchResults } from \"@pyspace/pyspace-api\";\nimport { withSiteProvider } from \"@pyspace/site/components/SiteProvider\";\n\nexport const GlobalSearch = withSiteProvider((props: any) => {\n    const [results, setResults] = useState<SearchResults | null>(null);\n    const [popupOpen, setPopupOpen] = useState(false);\n    const hasResults = !!results?.users?.length || !!results?.gadgets?.length;\n    const isUserOnlySearch = results && !results.gadgets;\n\n    const searchTimeoutRef = useRef<number | undefined>();\n\n    const doSearch = useCallback(async (query: string) => {\n        clearTimeout(searchTimeoutRef.current);\n        if (query && query.length > 2) {\n            const results = await pySpaceApi.globalSearch(query.trim());\n            setResults(results);\n            console.log(\"Search results:\", query, results);\n            const hasResults = !!results?.users?.length || !!results?.gadgets?.length;\n            if (hasResults) {\n                setPopupOpen(true);\n            }\n        } else {\n            setPopupOpen(false);\n            setResults(null);\n        }\n    }, []);\n\n    const [val, _setVal] = useState(\"\");\n    const setVal = useEvent((newVal: string) => {\n        _setVal(newVal);\n        clearTimeout(searchTimeoutRef.current);\n        searchTimeoutRef.current = setTimeout(() => doSearch(newVal), 250);\n    });\n\n    const firstTwoGadgets = useMemo(() => results?.gadgets?.slice(0, 2) || [], [results]);\n    const firstTwoUsers = useMemo(() => results?.users.slice(0, 2) || [], [results]);\n\n    const [showAll, setShowAll] = useState<null | \"gadgets\" | \"users\">(null);\n    const popupRef = useRef<HTMLDivElement>(null);\n    const inputRef = useRef<HTMLInputElement>(null);\n\n    const onBlur = useEvent<React.FocusEventHandler>((e) => {\n        if (e.relatedTarget !== inputRef.current && !popupRef.current?.contains(e.relatedTarget)) {\n            setPopupOpen(false);\n        }\n    });\n\n    const onFocus = useEvent<React.FocusEventHandler>((e) => {\n        if (!popupOpen && hasResults) {\n            setPopupOpen(true);\n        }\n    });\n\n    const clearSearch = useCallback(() => {\n        setPopupOpen(false);\n        setResults(null);\n        setVal(\"\");\n        // Wait for the above to take effect before setting focus again\n        setTimeout(() => inputRef.current!.focus());\n    }, []);\n\n    const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = useEvent((e) => {\n        switch (e.key) {\n            case \"Escape\":\n                e.stopPropagation();\n                e.preventDefault();\n                setPopupOpen(false);\n                break;\n            case \"Enter\":\n                e.stopPropagation();\n                e.preventDefault();\n                doSearch(inputRef.current!.value);\n                break;\n        }\n    });\n\n    return (\n        <div className=\"relative mx-[0.8rem] flex w-full max-w-94 min-w-40 items-center\">\n            <input\n                ref={inputRef}\n                value={val}\n                onChange={(e) => setVal(e.target.value)}\n                onKeyDown={onKeyDown}\n                onFocus={onFocus}\n                onBlur={onBlur}\n                placeholder=\"Search py.space\"\n                className=\"h-12 w-full rounded-[0.4rem] border-2 border-grey-2 pr-[0.8rem] pl-[3.4rem] text-[1.3rem] leading-12 outline-none\"\n            />\n            <FontAwesomeIcon className=\"absolute left-[0.8rem] text-[1.6rem]\" icon={faSearch} />\n            {val.length > 0 && (\n                <LinkInternal\n                    className=\"absolute top-[0.4rem] right-[0.8rem] text-[1.6rem] text-grey-3 hover:text-grey-2\"\n                    icon={faTimes}\n                    onClick={clearSearch}></LinkInternal>\n            )}\n            {popupOpen && (\n                <div\n                    tabIndex={0}\n                    ref={popupRef}\n                    onKeyDown={onKeyDown}\n                    onBlur={onBlur}\n                    className={\n                        \"absolute top-full left-0 z-1000 mt-[2px] w-3xl rounded-[0.4rem] border-2 border-grey-2 bg-light-bg2 p-4 px-[2.4rem] py-[1.2rem] text-[1.6rem] shadow-pselevated2\"\n                    }>\n                    {showAll !== \"users\" && !isUserOnlySearch && (\n                        <>\n                            <div className={\"text-[2.4rem] font-semibold\"}>Widgets</div>\n                            <div className={\"mb-[0.8rem] pb-2\"}>\n                                {(showAll === \"gadgets\" ? results?.gadgets || [] : firstTwoGadgets).map((w) => (\n                                    <div key={w.id} className={\"px-8 py-2 leading-12 hover:bg-light-bg4\"}>\n                                        <Link to={`/g/${w.id}`} target={\"_blank\"} className={\"font-semibold\"}>\n                                            {w.name}\n                                        </Link>{\" \"}\n                                        {w.mine ? (\n                                            <span>(mine)</span>\n                                        ) : (\n                                            <span>\n                                                by{\" \"}\n                                                <Link to={`/u/${w.username}`} target={\"_self\"}>\n                                                    @{w.username}\n                                                </Link>\n                                            </span>\n                                        )}\n                                    </div>\n                                ))}\n                                {!results?.gadgets?.length && (\n                                    <span className={\"text-[1.4rem] text-light-bg6\"}>No Results</span>\n                                )}\n                            </div>\n                            {(results?.gadgets?.length || 0) > 2 && !showAll && (\n                                <LinkInternal\n                                    className={\"text-[1.4rem] text-light-bg6\"}\n                                    icon={faArrowRight}\n                                    iconRight\n                                    onClick={() => setShowAll(\"gadgets\")}>\n                                    Show more Widget results\n                                </LinkInternal>\n                            )}\n                            {showAll === \"gadgets\" && (\n                                <LinkInternal\n                                    className={\"text-[1.4rem] text-light-bg6\"}\n                                    icon={faArrowLeft}\n                                    onClick={() => setShowAll(null)}>\n                                    Back to all results\n                                </LinkInternal>\n                            )}\n                        </>\n                    )}\n                    {!showAll && !isUserOnlySearch && <hr className={\"mx-[-2.4rem] my-[1.2rem]\"} />}\n                    {showAll !== \"gadgets\" && (\n                        <>\n                            <div className={\"text-[2.4rem] font-semibold\"}>Users</div>\n                            <div className={\"mb-[0.8rem] pb-2\"}>\n                                {(showAll === \"users\" ? results?.users || [] : firstTwoUsers).map((u) => (\n                                    <div key={u.username} className={\"px-8 py-2 leading-12 hover:bg-light-bg4\"}>\n                                        <Link\n                                            to={`/u/${u.username}`}\n                                            target={\"_self\"}\n                                            className={\"flex items-center gap-4\"}>\n                                            <img\n                                                alt=\"profile\"\n                                                src={`/ide/users/${u.username}/profile-picture`}\n                                                className={\"h-[3.2rem] w-[3.2rem] rounded-full border-2 border-grey-2\"}\n                                            />\n                                            <div>\n                                                @<span className={\"font-semibold\"}>{u.username}</span>\n                                            </div>\n                                        </Link>\n                                    </div>\n                                ))}\n                                {!results?.users?.length && (\n                                    <span className={\"text-[1.4rem] text-light-bg6\"}>No Results</span>\n                                )}\n                            </div>\n                            {(results?.users?.length || 0) > 2 && !showAll && (\n                                <LinkInternal\n                                    className={\"text-[1.4rem] text-light-bg6\"}\n                                    icon={faArrowRight}\n                                    iconRight\n                                    onClick={() => setShowAll(\"users\")}>\n                                    Show more User results\n                                </LinkInternal>\n                            )}\n                            {showAll === \"users\" && (\n                                <LinkInternal\n                                    className={\"text-[1.4rem] text-light-bg6\"}\n                                    icon={faArrowLeft}\n                                    onClick={() => setShowAll(null)}>\n                                    Back to all results\n                                </LinkInternal>\n                            )}\n                        </>\n                    )}\n                </div>\n            )}\n        </div>\n    );\n});\n","import React, { useCallback, useMemo } from \"react\";\nimport { Provider, useDispatch, useSelector } from \"react-redux\";\nimport { faBluesky, faGithub, faLinkedin, faMastodon, faXTwitter } from \"@fortawesome/free-brands-svg-icons\";\nimport { faCalendar } from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n    faCamera,\n    faLink,\n    faLocationDot,\n    faMessageDots,\n    faMinus,\n    faPencil,\n    faPlus,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport Modals from \"@/components/modals\";\nimport { LinkInternal } from \"@/components/reusable/LinkInternal\";\nimport { modal } from \"@/controllers/modals\";\nimport { ManagerInstanceGlobalsContext } from \"@/instance-globals\";\nimport { Button, IconButton } from \"@/pyspace/common/components/Button\";\nimport { UserDetails, UserProfile } from \"@/pyspace/common/types\";\nimport {\n    changePhoto,\n    getProfile,\n    getProfileUrlRevision,\n    reportProfileAbuse,\n    setFollowing,\n    updateProfile,\n} from \"@/pyspace/site/controllers/profile\";\nimport { getPyspaceSiteModals } from \"@/pyspace/site/modals/names/pyspace-site-modals\";\nimport { SiteDispatch, createSiteStore } from \"@/pyspace/site/store/pyspace-site-store\";\nimport { ThemeContext } from \"@/theme/styles\";\nimport { cx } from \"@/theme/styles\";\nimport { PySpaceLightTheme } from \"@/theme/theme\";\nimport useEvent from \"@/util/useEventCallback\";\nimport { getUserDetails } from \"@pyspace/site/controllers/my-gadgets\";\nimport { useRootElements } from \"@pyspace/utils/hooks/use-root-elements\";\n\nconst ProfileEditor = ({ editable }: { editable: boolean }) => {\n    const profile = useSelector(getProfile)!;\n    const dispatch = useDispatch<SiteDispatch>();\n    const loggedInUser = useSelector(getUserDetails);\n\n    console.log(\"Logged in to pyspace as\", loggedInUser);\n\n    const save = async (newProfile: UserProfile) => {\n        await dispatch(updateProfile(newProfile));\n    };\n\n    const editProfile = useEvent(async () => {\n        const { name, social, bio } = profile;\n        const newProfile = await dispatch(modal(\"editUserProfile\", { profile: { name, social, bio } }));\n        if (newProfile) {\n            await save(newProfile);\n        }\n    });\n\n    const revision = useSelector(getProfileUrlRevision);\n\n    return (\n        <div className={\"@container flex flex-col\"}>\n            <div\n                className={cx(\n                    \"mt-10 mb-10 flex flex-col self-center\",\n                    \"@[62rem]:mt-20 @[62rem]:mb-12 @[62rem]:flex-row\",\n                    \"@[94rem]:mt-32 @[94rem]:self-start\"\n                )}>\n                <div\n                    className={cx(\n                        \"w-120\",\n                        \"@[62rem]:w-[61.6rem]\",\n                        \"flex flex-col overflow-hidden rounded-[0.8rem] border-2 border-light-grey2 bg-white shadow-pselevated2\"\n                    )}>\n                    <div\n                        className={\n                            \"relative flex h-[13.3rem] flex-auto bg-linear-to-t from-gray-100 to-gray-200 bg-cover bg-center @[62rem]:h-[14.4rem]\"\n                        }\n                        style={{\n                            backgroundImage: `url(\"/ide/users/${profile.username}/header-picture?r=${revision}\")`,\n                        }}>\n                        <img\n                            src={`/ide/users/${profile.username}/profile-picture?r=${revision}`}\n                            className=\"absolute -bottom-18 left-8 mr-4 h-[12.8rem] w-[12.8rem] rounded-full border-2 border-light-grey2 bg-gray-200 object-cover object-center @[62rem]:left-10 @[62rem]:h-[14.4rem] @[62rem]:w-[14.4rem]\"\n                            alt={\"Profile\"}\n                        />\n                        {editable && (\n                            <IconButton\n                                size={\"medium\"}\n                                round\n                                icon={faCamera}\n                                className={\"absolute -bottom-18 left-44 @[62rem]:left-[13.2rem]\"}\n                                onClick={() => dispatch(changePhoto(false))}\n                            />\n                        )}\n                        {/*TODO: upload profile pictures by PUTing a JPEG under 100kb in size (convert if necessary with Canvas) to /ide/me/profile-picture */}\n\n                        {editable && (\n                            <IconButton\n                                size={\"medium\"}\n                                round\n                                icon={faCamera}\n                                className={\"absolute top-[1.3rem] right-6\"}\n                                onClick={() => dispatch(changePhoto(true))}\n                            />\n                        )}\n\n                        {editable ? (\n                            <Button\n                                className={\"absolute right-[4.8rem] -bottom-6 @[62rem]:right-32\"}\n                                elevated\n                                icon={faPencil}\n                                onClick={editProfile}>\n                                Edit\n                            </Button>\n                        ) : (\n                            <Button\n                                className={\"absolute right-[4.4rem] -bottom-6 @[62rem]:right-32\"}\n                                elevated\n                                icon={profile.following ? faMinus : faPlus}\n                                onClick={() => dispatch(setFollowing(profile.username, !profile.following))}>\n                                {profile.following ? \"Unfollow\" : \"Follow\"}\n                            </Button>\n                        )}\n                    </div>\n                    <div className={\"\"}>\n                        <div className=\"mx-[1.2rem] mt-[4.6rem] mb-8 grid grid-cols-1 gap-x-[1.6rem] gap-y-[1.9rem] text-light-grey2 @[62rem]:mx-[2.4rem] @[62rem]:mt-24 @[62rem]:grid-cols-2\">\n                            <div className={\"flex flex-col\"}>\n                                <div className={\"text-[3rem] font-semibold @[62rem]:text-[3.6rem]\"}>\n                                    {profile.name ?? profile.username}\n                                </div>\n                                <div className={\"flex items-center gap-[1.6rem]\"}>\n                                    <div className=\"text-[1.8rem] @[62rem]:text-[2rem]\">@{profile.username}</div>\n                                    {profile.followed_by && (\n                                        <div\n                                            className={\n                                                \"rounded-full border border-light-grey2 bg-light-bg3 px-4 text-[1.2rem]\"\n                                            }>\n                                            follows you\n                                        </div>\n                                    )}\n                                </div>\n\n                                <div\n                                    className={\n                                        \"mt-[.8rem] text-[1.4rem] font-light @[62rem]:mt-0 @[62rem]:text-[1.6rem]\"\n                                    }>\n                                    {profile.bio}\n                                </div>\n                                <div\n                                    className={\n                                        \"@[62rem]:text-[1.6rem flex gap-[1.8rem] text-[1.4rem] font-semibold @[62rem]:mt-[.8rem]\"\n                                    }>\n                                    <LinkInternal\n                                        onClick={() =>\n                                            dispatch(\n                                                modal(\"following\", {\n                                                    usersWho: \"follow_this_user\",\n                                                    username: profile.username,\n                                                })\n                                            )\n                                        }\n                                        className={\"hover:underline\"}>\n                                        {profile.n_followers} {profile.n_followers === 1 ? \"follower\" : \"followers\"}\n                                    </LinkInternal>\n                                    <LinkInternal\n                                        onClick={() =>\n                                            dispatch(\n                                                modal(\"following\", {\n                                                    usersWho: \"this_user_follows\",\n                                                    username: profile.username,\n                                                })\n                                            )\n                                        }\n                                        className={\"hover:underline\"}>\n                                        {profile.n_following} following\n                                    </LinkInternal>\n                                    {loggedInUser && loggedInUser.profile.username !== profile.username && (\n                                        <LinkInternal\n                                            className={\"hover:underline\"}\n                                            onClick={() => dispatch(reportProfileAbuse(profile.username))}>\n                                            report abuse\n                                        </LinkInternal>\n                                    )}\n                                </div>\n                            </div>\n                            {/*<img*/}\n                            {/*    src={profile.profile_pic}*/}\n                            {/*    className=\"flex-0 mr-4 h-48 w-48 rounded-full border-0 bg-gray-200\"*/}\n                            {/*    alt={\"Profile picture\"}*/}\n                            {/*/>*/}\n                            <div\n                                className={\n                                    \"grid h-fit flex-1 grid-cols-[auto_1fr] items-center gap-x-3 gap-y-1 text-[1.4rem] font-normal @[62rem]:text-[1.6rem]\"\n                                }>\n                                {/*todo: uncomment and hook this up once we figure out what a join date actually is\n                            <FontAwesomeIcon icon={faCalendar} className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"} />\n                                <div>Joined Jan 3, 2045</div>*/}\n                                {profile.forum_url && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faMessageDots}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <a\n                                            className={\"truncate text-light-bg6 underline\"}\n                                            href={profile.forum_url}\n                                            target={\"_blank\"}>\n                                            {`${profile.n_forum_posts || 0} forum post${\n                                                profile.n_forum_posts !== 1 ? \"s\" : \"\"\n                                            }`}\n                                        </a>\n                                    </>\n                                )}\n                                {profile.social?.location && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faLocationDot}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <div className={\"truncate\"}>{profile.social.location}</div>\n                                    </>\n                                )}\n                                {profile.social?.website && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faLink}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <a\n                                            className={\"truncate text-light-bg6 underline\"}\n                                            href={profile.social.website}\n                                            target={\"_blank\"}>\n                                            {profile.social.website}\n                                        </a>\n                                    </>\n                                )}\n                                {profile.social?.twitter && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faXTwitter}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <a\n                                            className={\"truncate text-light-bg6\"}\n                                            href={`https://twitter.com/${profile.social.twitter}`}\n                                            target={\"_blank\"}>\n                                            @{profile.social.twitter}\n                                        </a>\n                                    </>\n                                )}\n                                {profile.social?.github && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faGithub}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <a\n                                            className={\"truncate text-light-bg6\"}\n                                            href={`https://github.com/${profile.social.github}`}\n                                            target={\"_blank\"}>\n                                            {profile.social.github}\n                                        </a>\n                                    </>\n                                )}\n                                {profile.social?.linkedin && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faLinkedin}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <a\n                                            className={\"truncate text-light-bg6\"}\n                                            href={`https://www.linkedin.com/in/${profile.social.linkedin}`}>\n                                            {profile.social.linkedin}\n                                        </a>\n                                    </>\n                                )}\n                                {profile.social?.mastodon && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faMastodon}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <a\n                                            className={\"truncate text-light-bg6 underline\"}\n                                            href={profile.social.mastodon}\n                                            target={\"_blank\"}>\n                                            {profile.social.mastodon}\n                                        </a>\n                                    </>\n                                )}\n                                {profile.social?.bluesky && (\n                                    <>\n                                        <FontAwesomeIcon\n                                            icon={faBluesky}\n                                            className={\"justify-self-center text-[1.2rem] @[62rem]:text-[1.4rem]\"}\n                                        />\n                                        <a\n                                            className={\"truncate text-light-bg6\"}\n                                            href={`https://bsky.app/profile/${profile.social.bluesky}.bsky.social`}\n                                            target={\"_blank\"}>\n                                            {profile.social.bluesky}\n                                        </a>\n                                    </>\n                                )}\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                {/*<div>Featured App</div>*/}\n            </div>\n        </div>\n    );\n};\n\nexport default ({\n    currentUser,\n    profile,\n    editable,\n}: {\n    currentUser?: UserDetails;\n    profile: UserProfile;\n    editable: boolean;\n}) => {\n    const store = useMemo(() => createSiteStore({ userDetails: currentUser, profile }), []);\n\n    const [rootElements, rootRefCallback, ddRootRefCallback] = useRootElements(\"profile\");\n\n    console.log(\"editable\", editable, \"current user\", currentUser);\n    return (\n        <Provider store={store}>\n            <ManagerInstanceGlobalsContext.Provider value={rootElements}>\n                <ThemeContext.Provider value={PySpaceLightTheme}>\n                    <ProfileEditor editable={editable} />\n                    <Modals modalTypes={getPyspaceSiteModals()} />\n                    <div className={\"fixed top-0 left-0 z-200 w-full\"} ref={ddRootRefCallback} />\n                </ThemeContext.Provider>\n            </ManagerInstanceGlobalsContext.Provider>\n        </Provider>\n    );\n};\n","// We need this, but right now it's got a bunch of IDE assumptions all mixed up in it including full-height and no scrolling:\n// require(\"./common.scss\");\nimport React, { ReactElement } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot } from \"react-dom/client\";\nimport log from \"loglevel\";\nimport Link from \"@/components/reusable/Link\";\nimport { setOnEditedReadOnlyApp } from \"@/controllers/app/saving\";\nimport { alert, modal } from \"@/controllers/modals\";\nimport { Button as PySpaceButton } from \"@/pyspace/common/components/Button\";\nimport { Notification } from \"@/pyspace/common/types\";\nimport { UserDetails, UserProfile } from \"@/pyspace/common/types\";\nimport ComponentsExpo from \"@/pyspace/site/ComponentsExpo\";\nimport AccountSettings, { AccountPrefs } from \"@/pyspace/site/components/AccountSettings\";\nimport { SiteProvider } from \"@/pyspace/site/components/SiteProvider\";\nimport { DisplaySpace, MissingGadgetThumbnail, MyGadgets, OneThumbnail } from \"@/pyspace/site/components/Spaces\";\nimport { GadgetEntry, Space } from \"@/pyspace/site/store/pyspace-site-store\";\nimport { initialiseGadgetNavigation } from \"@/router/gadget-navigation\";\nimport { GadgetAsyncAction } from \"@/types\";\nimport \"../anvil.tw.css\";\n// export * as theme from \"./theme\";\n//import { provideAccountInfo } from \"./components/pyspace/header\";\nimport {\n    AppSpec,\n    GadgetEditor,\n    InternalPySpaceEmbeddedGadgetEditor,\n    MissingEmbeddedGadgetEditor,\n} from \"./gadget_editor/components/GadgetEditor\";\nimport { resetAppToInitialContent } from \"./gadget_editor/controllers/gadget\";\nimport \"./global-styles.scss\";\nimport { GlobalSearch } from \"./site/components/GlobalSearch\";\nimport { UserMenu } from \"./site/components/UserMenu\";\nimport UserProfileEditor from \"./site/components/UserProfileEditor\";\nimport { createGadgetCallback } from \"./site/controllers/my-gadgets\";\n\nwindow.log = log;\n\ninitialiseGadgetNavigation();\n\nsetOnEditedReadOnlyApp(\n    (): GadgetAsyncAction => async (dispatch) => {\n        await dispatch(modal(\"cloneReadOnlyGadget\", {}));\n        await dispatch(resetAppToInitialContent());\n    }\n);\n\n/*\nwindow.addEventListener(\"resize\", () => window.dispatch(onIdle(redrawTabs(), \"redraw-tabs\", 500)));\n\nconst container = document.getElementById(\"react-root\");\nconst root = createRoot(container!);\nconsole.log(\"pyspace.tsx\")\nroot.render(<Pylet />);\n\nif (\"serviceWorker\" in navigator) {\n    navigator.serviceWorker\n        .register(`/pylet/sw.js`, { scope: \"/pylet/\" })\n        .then((sw) => {\n            window.sw = sw;\n        })\n        .catch((error) => {\n            console.error(\"Service worker registration failed:\", error);\n        });\n}\n\nwindow.api = api;\n\nwindow.original = original;\nwindow.current = current;\n*/\n\nconst renderInto = (elementId: string, reactElement: ReactElement) => {\n    const elt = document.getElementById(elementId)!;\n    const existingChildren = [...elt.children];\n    const root = createRoot(elt);\n    flushSync(() => {\n        root.render(reactElement);\n    });\n    for (const c of existingChildren) {\n        if (c.parentElement === elt) {\n            elt.removeChild(c);\n        }\n    }\n};\n\nconst pySpaceCalls = {\n    renderUserMenu: (id: string, userDetails: UserDetails, notifications: Notification[]) =>\n        userDetails\n            ? renderInto(id, <UserMenu userDetails={userDetails} notifications={notifications} />)\n            : renderInto(\n                  id,\n                  <SiteProvider>\n                      <PySpaceButton\n                          round\n                          variant={\"primary\"}\n                          elevated\n                          to=\"/do-login\"\n                          linkClassName={\"whitespace-nowrap\"}\n                          LinkComponent={Link}>\n                          Log in\n                      </PySpaceButton>\n                  </SiteProvider>\n              ),\n    renderGlobalSearch: (id: string) => renderInto(id, <GlobalSearch />),\n    editOneGadget: (\n        id: string,\n        gadget?: AppSpec,\n        ownerProfile?: UserProfile,\n        loggedInUser?: UserDetails,\n        isEmbedded?: boolean,\n        notifications?: Notification[]\n    ) =>\n        gadget &&\n        renderInto(\n            id,\n            <GadgetEditor\n                loggedInUser={loggedInUser}\n                ownerProfile={ownerProfile ?? loggedInUser!.profile}\n                notifications={notifications}\n                isEmbedded={isEmbedded}\n                gadget={gadget}\n            />\n        ),\n    editMyGadgets: (id: string, myGadgets?: AppSpec[], userDetails?: UserDetails) =>\n        userDetails && myGadgets && renderInto(id, <MyGadgets myGadgets={myGadgets} userDetails={userDetails} />),\n    renderSpace: (id: string, space: Space, userDetails: UserDetails | undefined, profile: UserProfile) =>\n        renderInto(id, <DisplaySpace space={space} userDetails={userDetails} profile={profile} />),\n    userProfile: (id: string, profile: UserProfile, userDetails: UserDetails, editable: boolean = false) =>\n        renderInto(id, <UserProfileEditor profile={profile} currentUser={userDetails} editable={editable} />),\n    internalPySpaceEmbeddedGadgetThumbnail: (\n        id: string,\n        { app_entry, owner_profile }: { app_entry: GadgetEntry; owner_profile: UserProfile },\n        loggedInUser?: UserDetails\n    ) =>\n        renderInto(\n            id,\n            app_entry && owner_profile ? (\n                <OneThumbnail gadget={app_entry} ownerProfile={owner_profile} loggedInUser={loggedInUser} />\n            ) : (\n                <MissingGadgetThumbnail />\n            )\n        ),\n    internalPySpaceEmbeddedGadgetEditor: (\n        id: string,\n        { app_spec, owner_profile }: { app_spec: AppSpec; owner_profile: UserProfile },\n        loggedInUser?: UserDetails\n    ) =>\n        renderInto(\n            id,\n            app_spec && owner_profile ? (\n                <InternalPySpaceEmbeddedGadgetEditor\n                    gadget={app_spec}\n                    ownerProfile={owner_profile}\n                    loggedInUser={loggedInUser}\n                />\n            ) : (\n                <MissingEmbeddedGadgetEditor />\n            )\n        ),\n    createGadget: createGadgetCallback,\n    accountSettings: (id: string, prefs: AccountPrefs, user: UserDetails) =>\n        renderInto(id, <AccountSettings prefs={prefs} user={user} />),\n\n    // Debugging\n    reactComponents: (id: string) => {\n        console.log(\"id\", id);\n        renderInto(id, <ComponentsExpo />);\n    },\n};\n\ninterface PySpaceApi {\n    _pendingCalls: any[][];\n    call: (func: string, ...args: any[]) => void;\n}\n\nwindow.pySpace.call = (func: string, ...args: any[]) => {\n    (pySpaceCalls[func as keyof typeof pySpaceCalls] as Function).apply(null, args);\n};\n\nfor (const [func, args] of window.pySpace._pendingCalls || []) {\n    window.pySpace.call(func, ...args);\n}\n\ninterface PageData {\n    // This code doesn't use pageData directly, but it's good to have the types\n    // somewhere for reference\n    userDetails?: UserDetails;\n    editOneGadget?: AppSpec;\n}\n\ndeclare global {\n    interface Window {\n        pageData: PageData;\n        featureEnabled: any;\n        hiddenFeatures: any;\n        generatingScreenshots: any;\n        disableTutorials: any;\n        log: typeof log;\n        pySpace: PySpaceApi;\n    }\n}\n","import { getAppId } from \"@/controllers/app\";\nimport { getNavOverrides, setNavOverrides } from \"@/pyspace/gadget_editor/controllers/gadget\";\nimport { GadgetState } from \"@/pyspace/gadget_editor/store/gadget-store\";\nimport { CodeNavTarget, FullNavTarget } from \"@/router/navTypes\";\nimport { DoGetUrlForNavTarget, DoNavigate, DoPushHistoryState, setNavigateImpl } from \"@/router/navigation\";\nimport { GadgetDispatch } from \"@/types\";\n\nexport const initialiseGadgetNavigation = () => {\n    setNavigateImpl(doNavigate, getUrl, doPushHistoryState);\n};\n\nconst doNavigate: DoNavigate<GadgetDispatch, GadgetState> = (target, dispatch, getState) => {\n    console.log(\"%cNavigate\", \"color:cyan; font-weight:bold;\", target);\n\n    const state = getState();\n    const appId = state.app.id;\n    switch (target.type) {\n        case \"START_PAGE\":\n            break;\n        case \"ACCOUNT\":\n            break;\n        case \"ACCEPT_INVITE\":\n            break;\n        default:\n            if (!target.appId) {\n                target.appId = appId;\n            }\n            switch (target.type) {\n                case \"CODE\": {\n                    const codeTarget = target as CodeNavTarget;\n                    const navOverrides = getNavOverrides(state);\n                    const code = target.essentialView?.code ?? target.view?.code;\n                    const override: GadgetState[\"navOverrides\"] = {};\n                    const cursorOverrides = { ...(navOverrides?.cursor ?? {}) };\n\n                    if (Array.isArray(code) && code.length >= 2) {\n                        const [line, column] = code;\n                        if (line == null || column == null) {\n                            break;\n                        }\n                        const cursorPosition: [string, string] = [line.toString(), column.toString()];\n                        if (codeTarget.codePath.startsWith(\"scripts/\")) {\n                            cursorOverrides.script = cursorPosition;\n                        }\n                        if (codeTarget.codePath.startsWith(\"server_modules/\")) {\n                            cursorOverrides.server = cursorPosition;\n                        }\n                        if (codeTarget.codePath.startsWith(\"forms/\")) {\n                            cursorOverrides.client = cursorPosition;\n                        }\n                        override.cursor = cursorOverrides;\n                    }\n\n                    if (codeTarget.codePath.startsWith(\"forms/\")) {\n                        override.form = {\n                            codePath: codeTarget.codePath,\n                            editingPath: codeTarget.editingPath,\n                            topLevelFormClassName: codeTarget.topLevelFormClassName,\n                        };\n                    }\n                    if (override.form || override.cursor) {\n                        dispatch(setNavOverrides(override));\n                    }\n                    break;\n                }\n                case \"SERVICE\":\n                    switch (target.service) {\n                        case \"SECRETS\":\n                            break;\n                    }\n                    break;\n                case \"SETTINGS\":\n                    switch (target.section) {\n                        case \"RUNTIME\":\n                            break;\n                    }\n                    break;\n                case \"APP_ROOT\":\n                    break;\n                case \"DB_TABLE\":\n                    break;\n                case \"APP_SCHEMA\":\n                    break;\n                case \"HELP\":\n                    break;\n                case \"BACKGROUND_TASKS\":\n                    break;\n                case \"CPU_USAGE\":\n                    break;\n                case \"MEMORY_USAGE\":\n                    break;\n                case \"SESSIONS\":\n                    break;\n                case \"SESSION\":\n                    break;\n                case \"NATIVE_LIBRARIES\":\n                    break;\n                case \"SCHEDULED_TASKS\":\n                    break;\n                case \"THEME\":\n                    break;\n            }\n    }\n\n    return target as FullNavTarget;\n};\n\nconst getUrl: DoGetUrlForNavTarget = (target) => {\n    // TODO this is deprecated in REACT and will stop working in a future version\n    return \"\";\n};\n\nconst doPushHistoryState: DoPushHistoryState = (target) => {\n    // No history in pyspace gadgets for now.\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 { useDispatch } from \"react-redux\";\nimport { AppSpec } from \"@/pyspace/gadget_editor/components/GadgetEditor\";\nimport { GadgetShareState } from \"@/pyspace/gadget_editor/store/gadget-store\";\nimport {\n    GadgetEntry,\n    SiteAction,\n    SiteAsyncAction,\n    SiteDispatch,\n    SiteState,\n} from \"@/pyspace/site/store/pyspace-site-store\";\nimport * as api from \"@/api\";\nimport { GadgetEditorEvents } from \"@pyspace/common/types\";\nimport * as pyspaceApi from \"../../pyspace-api\";\n\n// Callback\nlet doCreateGadget = async (templateOrCloneKey: string) => alert(\"py.space editor not loaded\"); // TODO perhaps navigate to the main page and do the creation there\nexport const createGadgetCallback = (templateOrCloneKey: string) => doCreateGadget(templateOrCloneKey);\n\nexport const useMyGadgetsCallbacks = (setPoppingOutGadget: (g: GadgetEntry) => void) => {\n    const dispatch = useDispatch<SiteDispatch>();\n    doCreateGadget = async (templateOrCloneKey) => {\n        const g = await dispatch(createGadget(templateOrCloneKey));\n        setPoppingOutGadget(g);\n    };\n};\n\nconst createGadget =\n    (templateOrCloneKey: string): SiteAsyncAction<GadgetEntry> =>\n    async (dispatch, getState, updateState) => {\n        const app: AppSpec = await pyspaceApi.createGadget(templateOrCloneKey);\n        const entry: GadgetEntry = {\n            id: app.id,\n            title: app.name,\n            n_likes: 0,\n            n_forks: 0,\n            liked: false,\n            sharing: \"private\",\n        };\n        updateState((s) => {\n            s.gadgets!.unshift(entry);\n        });\n        return entry;\n    };\n\nexport const removeGadgetEntry =\n    (id: string): SiteAction =>\n    (_, __, updateState) =>\n        updateState((state) => {\n            state.gadgets = state.gadgets!.filter((g) => g.id !== id);\n        });\n\nconst updatedGadget =\n    (gadgetId: string, f: (gadget: GadgetEntry) => void): SiteAction =>\n    (_, __, updateState) =>\n        updateState(({ gadgets }) => {\n            const g = gadgets!.find((g) => g.id === gadgetId);\n            if (g) {\n                f(g);\n            }\n        });\n\nexport const deleteGadget =\n    (id: string): SiteAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        await api.deleteApp(id);\n    };\n\nexport const setShareGadget =\n    (id: string, sharing: GadgetShareState): SiteAsyncAction =>\n    async (dispatch, getState, updateState) => {\n        await pyspaceApi.setSharing(id, sharing);\n    };\n\nexport const updateGadgetEntrySharing =\n    (id: string, sharing: GadgetShareState): SiteAction =>\n    (_, __, updateState) =>\n        updateState(({ gadgets }) => {\n            const g = gadgets!.find((g) => g.id === id);\n            if (g) {\n                g.sharing = sharing;\n            }\n        });\n\nconst gadgetSavedMoveToFront =\n    (id: string): SiteAction =>\n    (_, __, updateState) =>\n        updateState(({ gadgets }) => {\n            const idx = gadgets!.findIndex((g) => g.id === id);\n            if (idx > -1) {\n                gadgets![idx].last_updated = new Date().toString();\n            }\n            if (idx > 0) {\n                const g = gadgets![idx];\n                gadgets!.splice(idx, 1);\n                gadgets!.unshift(g);\n            }\n        });\n\nexport const getMyGadgetsEditorCallbacks = (dispatch: SiteDispatch, closeEditor: () => void): GadgetEditorEvents => ({\n    onClosed: closeEditor,\n    onDeleted(gadgetId) {\n        dispatch(removeGadgetEntry(gadgetId));\n        closeEditor();\n    },\n    onRenamed: (gadgetId, newName) =>\n        dispatch(\n            updatedGadget(gadgetId, (g) => {\n                g.title = newName;\n            })\n        ),\n    onShared: (gadgetId, newShareState) =>\n        dispatch(\n            updatedGadget(gadgetId, (g) => {\n                g.sharing = newShareState;\n            })\n        ),\n    onChangedDescription: (gadgetId, newDescription) =>\n        dispatch(\n            updatedGadget(gadgetId, (g) => {\n                g.description = newDescription;\n            })\n        ),\n    onChangedThumbnail: (gadgetId) =>\n        dispatch(\n            updatedGadget(gadgetId, (g) => {\n                g.thumbnail_url_revision = (g.thumbnail_url_revision ?? 0) + 1;\n            })\n        ),\n    onSaved: (gadgetId) => dispatch(gadgetSavedMoveToFront(gadgetId)),\n});\n\nexport const getGadgets = (state: SiteState) => state.gadgets;\nexport const getUserDetails = (state: SiteState) => state.userDetails;\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 { useCallback, useMemo } from \"react\";\nimport { AppSpec } from \"@pyspace/gadget_editor/components/GadgetEditor\";\n\nexport const useRootElements = (gadget: AppSpec | string) => {\n    const rootElements = useMemo(() => {\n        // Question: Am I optimising too hard here? Could I just have React render these things for me, thereby\n        // getting teardown for free, in exchange for requiring two renders (once to render the first divs, then to\n        // render the Providers and the rest of the editor?)>\n\n        const [dd, tt, op] = [\n            document.createElement(\"div\"),\n            document.createElement(\"div\"),\n            document.createElement(\"div\"),\n        ];\n        dd.setAttribute(`pyspace-dropdown-${gadget.id || gadget}`, \"\");\n        tt.setAttribute(`pyspace-tooltip-${gadget.id || gadget}`, \"\");\n        op.setAttribute(`pyspace-palette-${gadget.id || gadget}`, \"\");\n        tt.style.position = \"absolute\";\n        op.className = \"absolute overflow-visible top-0 left-0\";\n        return { dropdownMenuRoot: dd, tooltipRoot: tt, objectPaletteRoot: op };\n    }, []);\n\n    const rootRefCallback = useCallback(\n        (node: HTMLDivElement | null) => {\n            if (!node) return;\n            node.append(rootElements.objectPaletteRoot);\n        },\n        [rootElements]\n    );\n\n    const ddRootRefCallback = useCallback(\n        (node: HTMLDivElement | null) => {\n            if (!node) return;\n            node.append(rootElements.dropdownMenuRoot, rootElements.tooltipRoot);\n        },\n        [rootElements]\n    );\n\n    return [rootElements, rootRefCallback, ddRootRefCallback];\n};\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 { isEmpty } from \"lodash-es\";\nimport { clearUnsaved, getAppId } from \"@/controllers/app\";\nimport { getIsAllSaved, getNavBlocks } from \"@/controllers/ide\";\nimport { getInTutorialMode, getTutorialAppId } from \"@/controllers/ideTutorial\";\nimport { confirm } from \"@/controllers/modals\";\nimport { abort } from \"@/controllers/util\";\nimport { FullNavTarget, NavTarget } from \"@/router/navTypes\";\nimport { getStoreId } from \"@/store/editor-store\";\nimport { store } from \"@/store/one-global-store\";\nimport { AnvilAction, AnvilDispatch, GadgetDispatch, State } from \"@/types\";\nimport { GadgetState } from \"@pyspace/gadget_editor/store/gadget-store\";\n\nexport const confirmDiscard = async () => {\n    const r = await store.dispatch(\n        confirm(\n            \"Discard changes?\",\n            \"If you leave this page, your unsaved changes will be lost. Are you sure you want to leave?\"\n        )\n    );\n    if (r) {\n        store.dispatch(clearUnsaved());\n    }\n    return r;\n};\n\nlet insertStateTarget: null | FullNavTarget = null;\n\nexport const getInsertStateTarget = () => insertStateTarget;\nexport const clearInsertStateTarget = () => {\n    insertStateTarget = null;\n};\n\nexport const setHistoryStateBeforeNextNavigation = async (url: string) => {\n    //insertStateUrl = url;\n};\n\nexport const insertHistoryStateBeforeNextNavigation = (target: FullNavTarget | null) => {\n    insertStateTarget = target;\n};\n\nexport type DoNavigate<D, S> = (target: NavTarget, dispatch: D, getState: () => S) => FullNavTarget;\nexport type DoGetUrlForNavTarget = (target: FullNavTarget) => string;\nexport type DoPushHistoryState = (target: FullNavTarget, replace?: boolean) => void;\n\nlet doNavigate: DoNavigate<AnvilDispatch, State> | DoNavigate<GadgetDispatch, GadgetState>;\nlet doGetUrlForNavTarget: DoGetUrlForNavTarget;\nlet doPushHistoryState: DoPushHistoryState;\n\nexport const setNavigateImpl = (\n    dn: typeof doNavigate,\n    dgu: typeof doGetUrlForNavTarget,\n    dphs: typeof doPushHistoryState\n) => {\n    doNavigate = dn;\n    doGetUrlForNavTarget = dgu;\n    doPushHistoryState = dphs;\n};\n\nexport const getUrlForNavTarget = (target: FullNavTarget) => doGetUrlForNavTarget(target);\n\nexport type StoreID = number;\n\n// TODO this should only require the State has the attribute currentNavTarget\nexport const updateCurrentNavTarget =\n    (target: FullNavTarget): AnvilAction =>\n    (dispatch, getState, updateState) => {\n        updateState((state) => {\n            state.currentNavTarget = target;\n        });\n    };\n\nexport const getCurrentNavTarget = (state: State) => state.currentNavTarget;\n\nexport const navigate =\n    (\n        target: NavTarget,\n        replace = false,\n        waitForSave = false,\n        { preserveFocus = false }: { preserveFocus?: boolean } = {}\n    ): AnvilAction =>\n    async (dispatch, getState, updateState) => {\n        // TODO: How do we check if we're already there, now that target is a rich object?\n        // if (routingConfig.baseUrl + url === document.location.pathname + (document.location.hash || '')) {\n        //     return; // Tried to navigate to the current location. Don't bother.\n        // }\n\n        const state = getState();\n        const storeId = getStoreId(state);\n        const navBlocks = getNavBlocks(state);\n        const hasNavBlocks = !isEmpty(navBlocks);\n        const inTutorialMode = getInTutorialMode(state);\n        const tutorialAppId = getTutorialAppId(state);\n        const currentAppId = getAppId(state);\n\n        const navigateAnyway = () => {\n            for (const nb of Object.values(navBlocks) as any) {\n                nb.onNavigateAnyway?.();\n            }\n        };\n\n        if (waitForSave) {\n            // TODO: await something that resolves when saving is complete.\n            if (!getIsAllSaved(state) || hasNavBlocks) {\n                if (await confirmDiscard()) {\n                    navigateAnyway();\n                } else {\n                    return false;\n                }\n            }\n        } else if (hasNavBlocks) {\n            // TODO: Also block if this is an external nav and waitForSave is false. This is not essential - it will be caught by beforeUnload anyway.\n            if (await confirmDiscard()) {\n                navigateAnyway();\n            } else {\n                return false;\n            }\n        }\n\n        if (\n            inTutorialMode &&\n            currentAppId &&\n            ((\"appId\" in target && target.appId !== tutorialAppId) ||\n                target.type === \"START_PAGE\" ||\n                target.type === \"SETTINGS\")\n        ) {\n            // We're trying to navigate away from the tutorial app. Not allowed!\n            return false;\n        }\n\n        if (insertStateTarget && !replace) {\n            doPushHistoryState(insertStateTarget);\n            insertStateTarget = null;\n        }\n\n        // A preview's focus policy must not follow its target into a later tab click.\n        if ((target.type === \"CODE\" || target.type === \"EXTRA_FILE\") && target.preserveFocus !== undefined) {\n            const { preserveFocus: _preserveFocus, ...destination } = target;\n            target = destination;\n        }\n        const fullNavTarget = doNavigate(target, dispatch as any, getState as any);\n        dispatch(\n            updateCurrentNavTarget(\n                (fullNavTarget.type === \"CODE\" || fullNavTarget.type === \"EXTRA_FILE\") && preserveFocus\n                    ? { ...fullNavTarget, preserveFocus }\n                    : fullNavTarget\n            )\n        );\n        doPushHistoryState(fullNavTarget, replace);\n\n        return true;\n    };\n\ntype PathMatcher = {\n    [nextSegment: string]: (segment: string | undefined, next: string | undefined) => NavTarget | null;\n};\n\nconst getNextPathSegment = (\n    path: string | undefined\n): [string, string] | [string, undefined] | [undefined, undefined] => {\n    const [_, next, rest] = path?.match(/^(\\/[^/]+)(\\/.*)?$/) ?? [];\n    return [next, rest];\n};\n\nexport const match = (url: string | undefined, matcher: PathMatcher): NavTarget | null => {\n    const [next, rest] = getNextPathSegment(url);\n    const handler = matcher[next ?? \"/\"] ?? matcher[\"/*\"];\n    if (handler) {\n        return handler(next?.substring(1), rest);\n    } else {\n        return { type: \"START_PAGE\" }; // 404\n    }\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            \"bottomPanelServerTestListWidth\",\n        ],\n        $persistWalk: [\"designer\"],\n        tabs: [],\n        tabStack: [],\n        recentlyOpened: {},\n        dataTables: null,\n        splitRunnerWidth: \"400px\",\n        agentChatsLocation: \"side\",\n        bottomPanelCurrentTab: null,\n        bottomPanelTabStack: [],\n        bottomPanelHeight: 200,\n        bottomPanelCommitListDiffWidth: 300,\n        bottomPanelServerTestListWidth: 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            isCaseSensitive: false,\n            isRegex: false,\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: \"25%\",\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        serverTestPanelStateByApp: {},\n    },\n    sidebar: {\n        $persist: [\n            \"navMode\",\n            \"showSecondaryNav\",\n            \"inlineNavMode\",\n            \"inlineShowSecondaryNav\",\n            \"showAssetsInCodeNav\",\n            \"showDependenciesInCodeNav\",\n        ],\n        primarySection: \"code\",\n        isSidebarVisible: true,\n        secondaryNavWidth: \"calc(25vw - 70px)\",\n        advancedCodeView: true,\n        showAssetsInCodeNav: false,\n        showDependenciesInCodeNav: 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    serverTestRuns: {},\n    serverTestRunRequest: null,\n    serverTestRunIds: [],\n    serverTestSessionLogs: {},\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","if (typeof document === \"undefined\") return;\nvar createStylesheet = function (\n\tchunkId, fullhref, oldTag, resolve, reject\n) {\n\tvar linkTag = document.createElement(\"link\");\n\t\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type=\"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function (event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\t\n\tif (oldTag) {\n  oldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n} else {\n  document.head.appendChild(linkTag);\n}\n\treturn linkTag;\n}\nvar findStylesheet = function (href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor (var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif (tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor (var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif (dataHref === href || dataHref === fullhref) return tag;\n\t}\n}\n\nvar loadStylesheet = function (chunkId) {\n\treturn new Promise(function (resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif (findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t})\n}\n\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t\"2560\": 0,\n\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\n\"2935\": 1,\n\n};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId])\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId])\n\t\tpromises.push(\n\t\t\tinstalledCssChunks[chunkId] = loadStylesheet(chunkId).then(\n\t\t\t\tfunction() {\n\t\t\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t\t\t},\n\t\t\t\tfunction(e) {\n\t\t\t\t\tdelete installedCssChunks[chunkId];\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t)\n\t\t)\n}\n\n// no hmr\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n        if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n            Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n        }\n    }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = function(chunkId) {\n  // return url for filenames not based on template\n  \n  // return url for filenames based on template\n  return \"static/js/async/\" + chunkId + \".js?sha=\" + {\"1401\": \"8557c0a996ae\",\"1411\": \"7a2501d8ee27\",\"1541\": \"4d8eecca00aa\",\"1838\": \"df32147ab1ac\",\"190\": \"6076db0df0c7\",\"193\": \"de5d2c3a7ae3\",\"2843\": \"e5bdf35f1b91\",\"2915\": \"f0dfc62124b0\",\"3163\": \"7bf9f9f5423b\",\"3481\": \"0ba5cceba816\",\"3491\": \"aea3f1516667\",\"4113\": \"ced4ea73e59b\",\"4878\": \"8332c993ee4a\",\"5036\": \"aa7ee80c065c\",\"5343\": \"01f58b0dc9c9\",\"539\": \"e22b4d7f41e2\",\"5402\": \"999d86c817fd\",\"5462\": \"ecea606da070\",\"5989\": \"f44fe5041809\",\"6244\": \"53c003bfe2b1\",\"6250\": \"6f42616e3206\",\"6694\": \"95efee7cca04\",\"7447\": \"56542381363d\",\"7783\": \"02b84f673e18\",\"8024\": \"0e6bcd857f7b\",\"8143\": \"6b2c9d380846\",\"8339\": \"be59c0533608\",\"8350\": \"b0ffa5b951fd\",\"8878\": \"46897d11dfc6\",\"9003\": \"d67019ac5b81\",\"9082\": \"0c2d0b2fd7a3\",\"9094\": \"1784e918887c\",\"9211\": \"9525775545e3\",\"9327\": \"881626234b16\",\"9351\": \"b79f19973709\",\"9558\": \"831f49496bd3\",\"9568\": \"7e6b726f5dc1\",\"9768\": \"5b8b02f152b0\",\"9999\": \"7016dae70e32\",}[chunkId] + \"\"\n}","// This function allow to reference chunks\n__webpack_require__.miniCssF = function(chunkId) {\n  // return url for filenames not based on template\n  \n  // return url for filenames based on template\n  return \"static/css/async/\" + chunkId + \".css?sha=\" + \"15678839dbc5\" + \"\"\n}","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n  module.paths = [];\n  if (!module.children) module.children = [];\n  return module;\n};","__webpack_require__.nc = undefined;","__webpack_require__.p = \"/ide/dist/\";"],"names":["i","kinds","pythonCompletionSource","request","options","context","pythonCompletionAllowed","controller","AbortController","answer","doc","from","to","inAnnotation","node","syntaxTree","showPrivate","completions","item","a","b","undefined","view","completion","edit","primary","lspRangeToOffsets","text","call","insertCallParentheses","preference","insideArguments","edits","index","Error","primaryTransaction","template","match","number","snippet","spec","isolateHistory","extraChanges","StateEffect","Transaction","pickedCompletion","changes","completionCursor","opening","quote","escapes","Number","forceLinting","startCompletion","error","console","resolved","result","autoImport","pythonDocumentationElement","pythonCompletionSources","current","ordinary","query","imports","Promise","scoped","resolve","timer","setTimeout","clearTimeout","setAnalysisFailures","NO_FAILURES","analysisFailuresField","StateField","value","transaction","effect","refreshPythonDiagnostics","metadataEffects","references","httpEndpoints","emailEndpoints","routes","formClassBodyEndLine","updateReferences","updateEndpoints","setFormClassBodyEndLine","useDiagnostics","doAnalysis","inputs","useSelector","getAnalysisInputs","shallowEqual","analysisEnabled","getTyAnalysisEnabled","hasRequest","useEffect","useEvent","signal","pythonSource","useMemo","pythonDiagnosticSource","syntaxDiagnostics","pending","discard","forEachDiagnostic","diagnostic","diagnostics","action","JSON","editor","applyPythonQuickFix","lintSource","metadata","messagesToDiagnostics","messages","all","state","selection","docLen","maxLine","cursorPos","cursorLine","otherDiagnostics","allDiagnostics","message","line","severity","between","lineno","offset","linenoEnd","offsetEnd","Math","diagnosticLinter","linter","update","keymap","openLintPanel","pythonCode","code","parts","highlightCode","pythonLanguage","tags","highlightingFor","classes","detail","documentation","onFindReferences","onGoToDefinition","onGoToTypeDefinition","onRename","root","dom","document","content","plain","preClass","inner","event","Markdown","children","className","String","src","alt","props","label","shortcut","run","LinkInternal","createRoot","flushSync","infoRoot","codeFont","CompletionInfoElement","popup","InfoInner","name","callable","type","helpText","helpLink","tableCols","callSig","returns","args","k","optional","defaultVal","annotation","s","e","setParamaterHelper","parameterHelper","pos","clearParamaterHelper","setParamaterTooltip","create","_view","ParamTooltipElement","paramaterTooltipField","tooltips","tr","tooltip","tooltipFrom","tooltipTo","isValid","range","f","showTooltip","paramHelper","paramTooltipInner","currentParam","fn","params","sig","container","lazyComponent","ModuleEditor","AssetEditor","ExtraFileEditor","DataBindingEditor","HtmlFormTemplateEditor","HtmlPropertyEditor","ImportMapEditor","LazyAssetEditor","NativeLibrariesEditor","StylePropertyEditor","HtmlBodyEditor","choices","ConflictActions","textChunk","yours","incoming","shareLine","onResolve","choice","resolveConflict","explanation","disabled","Button","classBodyAnchorField","CreateEventHandlerWidget","WidgetType","host","other","widgetTheme","EditorView","useCreateEventHandlerWidget","enabled","useConstant","el","useExtension","anchor","Decoration","at","hoverThemeCompartment","Compartment","useJumpToDefinition","tabNavTarget","codeItemId","appId","getAppId","appUrl","useAppUrl","appPackageName","getAppPackageName","allCodeNames","getCodeNames","dispatch","useDispatch","appTabDetails","HoverMarkerField","ViewPlugin","JumpToDefinition","Facet","getCodeItemFromRequest","def","codeItem","wrapWithDelay","timeout","resetTimeout","called","toggle","hoverPointerTheme","defs","col","navigate","hoverRange","DefRanges","ranges","pkgPrefix","codeRef","parseInt","codeRefDef","defInFile","L","val","useServerPanels","isServer","endpointsState","activateButton","EndpointSection","icon","FontAwesomeIcon","EndpointAddress","copyText","CopyButton","RoutesPanelContent","environmentOrigins","getEnvironmentOrigins","apiOrigins","origin","onPublishClick","modal","faRoute","body","HttpEndpointPanelContent","faGlobe","EmailEndpointPanelContent","publishInfo","getPublishInfo","origins","getAppOrigins","emailDomain","privateEnvs","publicEnvs","customEnvs","faEnvelope","Endpoints","endpoints","useViewSelector","hasEmail","hasRoutes","hasHttp","count","faCircleInfo","Popover","PopoverTrigger","PopoverContent","ServerPanels","hasBottomPanels","showPanel","bottom","setBottomOffset","useState","runningReplCommands","outstandingDebuggerRequestCallbacks","lastRequestId","newTabWindowAtom","ExternalState","getRunnerUrl","runnerOrigin","runPath","useRunnerSrc","getRunnerOrigin","environments","getCategorisedEnvironments","tableauService","getTableauService","tableauDashboard","userUiPrefs","getUserUiPrefs","useCommunicateWithRunner","runningAppWindow","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","extraArgs","requestId","onReplInterrupt","onDebuggerRequest","callback","onMsg","onEvent","EVENTS","window","offEvent","runMode","getRunMode","heartbeatRef","useRef","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","containerRect","offsets","newLeft","newTop","useResizeObserverTimeout","dragItemRect","newPosition","isPaused","getIsRunnerPaused","cx","faCompressArrowsAlt","faExpandArrowsAlt","RunAppButton","NumErrorWarningBtn","ImportBanner","repl","persistentAvailable","showBanner","importBannerToolTip","importBannerAnchorRef","useTooltip","recordActivity","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","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","timeSpec","atSpec","hourStr","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","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","cssify","UploadButton","checkValidity","maxSize","FileInput","onFileChange","valid","addNew","codeStructure","uploadAsset","faUpload","modalProps","onModalReturn","freeText","uploadInfo","onSave","rv","modalTypes","modals","getModals","modalPropsCache","ModalComponent","commonModalTypes","Alert","Confirm","ConfirmWithCheckBox","Prompt","DeleteGadgetModal","SimpleModal","groupTheme","ignoreSsrWarning","ButtonGroupItem","option","selectedVariant","variant","elevated","onClick","onDoubleClick","buttonProps","longPressHandlers","useLongPress","ButtonGroup","selectedOption","allowReselect","selectedValues","initialState","ErrorBoundary","React","prevProps","lastDeps","newDeps","faSync","ErrorSuspenseBoundary","fallback","Suspense","zenMode","getZenMode","runApp","tooltipAnchor","tooltipRef","faStop","faPlay","getRunnerOutput","numErrors","r","numErrorsWarningMsg","errorsAnchor","errorsRef","onToggleZenMode","toggleZenMod","faTriangleExclamation","SectionMenu","items","DropdownMenu","showMenu","faEllipsisV","Section","ref","props_","titleClassName","expanded","button","menuItems","onToggle","useExpander","expanderClassName","leftContent","faChevronUp","Expander","useSecondaryNavLinkStyles","_props","SecondaryNavLink","iconCircleClassName","isDescendentSelected","dropdownVisible","setDropdownVisible","localRef","scrollIntoView","useLayoutEffect","useSubscribeToDispatchEvent","mergedRef","useMergeRefs","SidebarLink","useAlertStyles","SecondaryNavAlert","actions","iconClassName","faExclamationTriangle","encryptSecret","newValue","extractable","canEncrypt","restrict","updateState","updateGlobalLoadingIndicator","saveSecretValue","secretObj","set","reloadAppConfig","markAppPathUnsaved","DeleteSecretModal","secretType","ViewSecretModal","secret","SecretConfiguredModal","AgentAccessBadge","SecretItemNameBox","encryptedSecretObj","otherAppValues","blank","hasOtherAppValues","isBlank","tt","anchorRef","faUserFriends","agentsCanReadSecret","SecretButtons","faPencil","AllowAgentsCheckbox","onChange","checked","setChecked","environmentLabel","environment","EnvironmentOverrideRows","onClearEnvironmentOverride","onGenSecret","onSetSecretValue","hasEnvironmentSecretValue","SecretKeysButtons","PySpaceSecretItemNameBox","agentsCanRead","SecretActionsMenu","faEye","faSparkle","environmentItems","faPlus","SecretItem","PySpaceSecretItem","IconButton","KeyItem","tab","appConfig","getAppConfig","getEnvironmentName","environmentPid","candidate","useUpdateTabTitle","appSecrets","secrets","secretName","appKeys","keys","onDeleteSecretItem","mkRestriction","allowAgents","restriction","hasValue","getScopedSecretValue","environmentName","encrypted","setScopedSecretValue","onAllowAgents","encryptedObj","onViewSecret","decrypted","clearEnvironmentSecretValue","onNewSecret","newAppSecret","nameBase","newName","requestedName","itemProps","itm","TabToolbar","leftSide","allowScroll","restProps","formatDateTime","dt","simpleOnly","jobId","scheduledTaskInfo","useQuery","getScheduledTaskInfo","info","lastRun","timeAgoString","infoUi","Fragment","PythonAndPackagesConfigLoaded","customPackagesAvailable","getCustomPackagesAvailable","hasLegacyAppEnvironments","hasLegacyEnvironments","enableScripts","clientVersion","setClientVersion","serverSpec","setServerSpec","useStateWithReset","migrating","setMigrating","selectionError","setSelectionError","clientSaveIndicator","setClientSaved","useSaveIndicator","serverSaveIndicator","setServerSaved","requirementsSaveIndicator","setRequirementsSaved","updateClientVersion","updateAppConfig","onSavedCallbacks","updateServerSpec","onSaved","updateRequirements","requirements","updatePreInstallScript","pre_install_script","updatePostInstallScript","post_install_script","serverSpecTimeout","serverSpecInitialised","callbacks","catalog","sourceImage","editable","managedRuntimes","runtime","usingManagedRuntime","previousImageSpec","hasCustomPackagesOrScripts","switchManagedRuntime","saveEnvironment","nextSpec","selectEnvironment","target","applyChange","previousSpec","bundledRequirements","unknownBundle","warning","confirmAndMigrateApp","mergeMigrationRequirements","advancedOptionsInDefaultState","showAdvanced","setShowAdvanced","currentEnvironment","PythonEnvironmentSelector","image","PackageRequirementsEditor","RuntimeBuildStatus","shown","InstallScriptsSettings","OtherRuntimeSettings","onEditedReadOnlyApp","setOnEditedReadOnlyApp","checkAppExists","removeSavingAppPathsUpdater","savingAppPaths","saveId","sid","restoreSavingAppPathsUpdater","paths","path","unsavedCallbacks","Set","notifyUnsavedCallback","cb","flushUnsavedCallbacks","saveAppOnIdle","getAppIsEditable","onIdle","saveApp","queuedBackgroundSave","finaliseCommit","commitMessage","immediate","yamlUpdates","cancelOnIdle","branch","userBranch","isEmpty","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","cachedCodeItem","findConflictsInCentralState","t","conflict","getExtraFileContent","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","ManagerInstanceGlobalsContext","createContext","EditorInstanceGlobalsContext","round","iconRight","titlePosition","preventDefaultClick","linkStyle","linkClassName","LinkComponent","buttonRef","size","copiedTimeout","copied","setCopied","doCopy","copyTextToClipboard","onBlur","faClone","textStyle","classStyles","InputLabel","ContentTextAreaInput","textInputVariants","cva","labelVariants","small","notSmall","gadgetId","gadgetName","username","setMessage","inputRef","PySpaceTextArea","prompt","onUploadFile","file","gadgetEditorModals","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","EditableGadgetTitleBar","isScript","renamingTo","setRenamingTo","saveIndicator","setSaved","setSaveError","gadgetEvents","GadgetEventsContext","historyStore","useHistoryStore","prevRenamingTo","saveName","renameGadget","requestDelete","deleteGadget","isSavingShareState","setSavingShareState","toggleShared","setShareState","isPopoutEditor","PopoutContext","userDetails","getNotifications","faGear","faChevronDown","faHome","openInAnvil","faAnvilLogoSolid","faArrowUpRightFromSquare","faShareNodesRegular","faTrashCan","faUndo","faPen","faShareNodes","Link","faCircleQuestion","ProfileMenu","ReadOnlyGadgetTitleBar","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","GadgetTitleBar","EditGadgetDetailsModal","thumbnailRevision","getForceReloadThumbnailSignal","editingName","setEditingName","editingDescription","setEditingDescription","PySpaceTextInput","setGadgetDescription","uploadGadgetThumbnail","ScheduleScriptModal","scriptName","returnResult","forked","setForked","doFork","CopyableEmbed","itemTitle","embeddingHtml","embeddingMarkdown","DropDown","nextStoreId","BLANK_SESSION","OutputScroller","output","outputScroller","sessions","getSessions","dropNextNewline","lastSessionId","evt","compressEvent","isNewSession","newSession","LogEvent","OutputFromWebSocket","clearOutput","Footer","connectFooter","getForms","getScheduledTasks","forms","scheduledTasks","isEditable","navTarget","getCurrentNavTarget","currentScriptName","masterEnvOrigin","useMasterEnvironmentOrigin","doPublish","createDefaultEnvironment","getNewEnvironmentURL","scriptSessions","setScriptSessions","scriptState","setScriptState","currentRun","setCurrentRun","wsSessions","currentWsSession","announceAppRunning","doRunScript","runScript","doStopScript","killBackgroundTask","killScript","doRunApp","runAppInNewTab","useStoreSelector","acStateStore","scheduledTask","createScheduledTask","removeScheduledTask","deleteScheduledTask","rightContent","PySpaceButton","faTrashCanClock","faHourglass","url","showUnknownPathSuffix","faRedoAlt","refreshNewTab","faSquare","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","faMinus","LazyCodeTabContent","useSelectedView","rightPanelContent","getRightPanelContent","showMainContent","useIsSmallScreen","makeNavTarget","key","formOverrides","structuredItem","getNavTargets","navOverrides","codeTabPrefs","useNavTargets","getCodeStructure","getNavOverrides","NavLink","onClickOverrideNav","GadgetNavBar","isServerCode","isClientCode","isDesign","script","serverModule","clientCode","design","isSmallScreen","c","TabContent","hasEverBeenSelected","setHasEverBeenSelected","LoadingSpinner","EditorContent","scriptTab","serverModuleTab","clientCodeTab","designTab","secretsTab","useGadgetTabs","navTargets","rightPanelWidth","getRightPanelWidth","hiddenDescription","getHiddenDescription","onFinishResizeRightPanel","newWidth","setRightPanelWidth","designerScreenShot","useTakeScreenshot","rightPanelChildren","PythonAndPackagesConfig","SecretsTab","hideDescription","faTimes","GadgetEditorContent","isCompatible","getIsPySpaceCompatible","useRunner","useOutputCapture","keydown","log","useReloadWhenGadgetUpdated","moveAppToAnvil","Modals","ShareGadgetModal","CloneReadOnlyGadgetModal","NotificationsModal","UploadFileModal","SaveConflict","ReportAbuseModal","UriUploader","GadgetEditor","loggedInUser","ownerProfile","notifications","events","store","initStore","produce","baseProducer","getNewBaseState","appSpec","finishLoadingGadget","rootElements","rootRefCallback","ddRootRefCallback","useRootElements","Provider","QueryClientProvider","queryClient","ThemeContext","PySpaceLightTheme","EMPTY_OBJECT","InternalPySpaceEmbeddedGadgetEditor","shouldPopout","SiteProvider","PopoutEditor","MissingEmbeddedGadgetEditor","useGadgetEvents","createContextHook","resetAppState","resetAppToInitialContent","appName","getAppName","oldDefaultPackageName","defaultPackageName","updatePackageName","newDescription","truncatedDescr","pyspaceApi","createGadgetThumbnailFromBlob","isScreenShot","resizedThumbnail","forceImageToSizeAndType","URL","useWebsocketEventListener","like","getIsLoggedIn","liked","nextTabId","createSelector","tabs","walkStructure","itemTypeFromCodePath","createRepl","runnerReplStateUpdate","debugStateUpdate","reportMessage","getClientCodeStructure","walk","serverCode","scripts","services","hasExtraServices","source","hasAServerModule","hasNoServerCode","hasAScript","hasNoScripts","hasAForm","hasNoClientCode","EMPTY_ARRAY","setNavOverrides","overrides","width","updater","createGadget","cloneKeyOrTemplateId","postJson","loadGadget","markNotificationsRead","timestamp","getAllNotifications","get","globalSearch","limit","uploadPicture","picture","setProfilePicture","setHeaderPicture","put","setGadgetThumbnail","changeUsername","setAccountSettings","prefs","markAsNotAGadget","setSharing","setLiked","setFollowing","follow","reportProfileAbuse","getFollowers","getFollowing","PySpaceToggle","_state","faCircle","createSiteStore","textValue","setTextValue","buttonGroup1","setButtonGroup1","buttonGroup1Options","buttonGroup2","setButtonGroup2","buttonGroup2Options","setToggle","IdeButton","v","AccountSettings","initialPrefs","setPage","setUsername","setPrefs","saving","setSaving","draftUsername","setDraftUsername","usernameError","setUsernameError","changePrefs","newUsername","faCircleExclamation","faAt","page","updateSpace","__","space","updateGadget","g","removeGadget","getSpace","changePhoto","header","resizedFile","pySpaceApi","saveProfile","newProfile","getProfile","getProfileUrlRevision","GadgetThumbnailDropdown","setDdIsOpen","faEllipsis","GadgetThumbnail","dropdownItems","now","getUserDetails","doClick","ddIsOpen","faArrowsMaximize","timeAgo","faRegularHeart","faCodeFork","GadgetList","gadgets","inSpace","useGadgetDropDownItems","removeGadgetEntry","toggleSharing","setShareGadget","updateGadgetEntrySharing","useNowWithRefresh","setExpanded","AppListSearch","search","setSearch","onFilterApps","faSearch","MyGadgetsContent","poppingOutGadget","setPoppingOutGadget","useMyGadgetsCallbacks","myGadgets","getGadgets","profile","popoutCallbacks","getMyGadgetsEditorCallbacks","filteredGadgets","searchProps","useFilteredGadgets","allGadgets","searchTerm","setSearchTerm","_prev","searchTimeout","filterOverride","useUpdateEffect","MyGadgets","getPyspaceSiteModals","SpaceContent","popoutEditorEvents","closeEditor","newShareState","DisplaySpace","OneThumbnail","poppedOut","setPoppedOut","forceRender","MissingGadgetThumbnail","GlobalSearch","withSiteProvider","results","setResults","popupOpen","setPopupOpen","hasResults","isUserOnlySearch","searchTimeoutRef","doSearch","_setVal","setVal","newVal","firstTwoGadgets","firstTwoUsers","showAll","setShowAll","popupRef","onFocus","clearSearch","w","faArrowRight","faArrowLeft","u","ProfileEditor","editProfile","social","bio","revision","faCamera","profileUpdate","faMessageDots","faLocationDot","faLink","faXTwitter","faGithub","faLinkedin","faMastodon","faBluesky","currentUser","setNavigateImpl","override","cursorOverrides","column","cursorPosition","codeTarget","renderInto","elementId","reactElement","elt","existingChildren","pySpaceCalls","UserMenu","UserProfileEditor","app_entry","owner_profile","app_spec","createGadgetCallback","ComponentsExpo","func","setApp","createPortal","initialStoreState","Component","selectItem","hideMenu","faUser","faBell","faSignOut","NotificationsButton","doCreateGadget","templateOrCloneKey","entry","updatedGadget","OneNotification","notification","gadgetLink","d","date","newNotifications","showingAll","setShowingAll","allNotifications","setAllNotifications","loadAllNotifications","changeNotificationGroup","siteModals","SocialInputs","socialType","updateSocial","profileErrors","ttRef","originalProfile","setProfile","socials","setProfileErrors","validateAndMaybeSubmit","err","regexRestriction","handleChange","propName","TestSiteSmallModal","usersWho","SetView","followers","usersFollowed","setUsersFollowed","usersWhoFollow","setUsersWhoFollow","users","TestSiteMediumModal","EditUserProfileModal","FollowingModal","dd","op","codePath","useGenerateThumbnailFromScreenshot","LazyDesignerScreenShot","isGUI","designTabId","shouldUpdateScreenshot","useShouldUpdateScreenshot","appLogo","prevLogo","setPrevLogo","force","setForce","appSaved","setAppSaved","seqNum","useEditSequenceNumbersChanged","rerender","useRerender","rerenderRef","timeTillNextScreenshot","SCREENSHOT_DELAY","ready","useScreenshotRef","generateThumbnail","wait","mod","cmEditor","doNavigate","doGetUrlForNavTarget","doPushHistoryState","confirmDiscard","clearUnsaved","insertStateTarget","insertHistoryStateBeforeNextNavigation","dn","dgu","dphs","getUrlForNavTarget","updateCurrentNavTarget","replace","waitForSave","preserveFocus","getStoreId","navBlocks","getNavBlocks","hasNavBlocks","inTutorialMode","getInTutorialMode","tutorialAppId","getTutorialAppId","currentAppId","navigateAnyway","nb","getIsAllSaved","_preserveFocus","destination","fullNavTarget","createAnvilStore","remToPixelMultiplier","rem","uiScale","useRemToPixels","getUserUiScale","useMinPixelsToSplit","LightTheme","useTheme","useIsDark","cache","createCache","css","tssCx","createCssAndCx","twMerge","withStyles","createMakeAndWithStyles","tabPanelRef","useTabPanelRef","deps","execute","Symbol","useEffectAsyncWhen","flag","useMemoAsync","initialValue","setX","setState","prevValue","setPrevValue","useActionOnStateChange","createObserverHook","createObserver","onRemove","notifyRemove","observer","useResizeObserverImpl","ResizeObserver","useResizeObserver","onResize","useMutationObserver","MutationObserver","delay","useRenderOnResize","init","refs","refsToAssign","Boolean","useRefreshValue","ctx","useActionOnTimeout","timeoutRef","createUpdateEffect","effectHook","isMounted","useUpdateLayoutEffect","createEffectWhen","updateEffect","prevDepsRef","runEffect","prevDeps","useEffectWhen","useLayoutEffectWhen","useUpdateEffectWhen","useStateWithCustomUpdate","initVal","setState_","valOrUpdater","getAppUrl","useMemoiseObject","obj","mergeReducer","usePartialReducer","initialArg","useMediaQuery","watcher","subscriber","useSyncExternalStore","globalThis","Function","self"],"mappings":"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"}