@epic-web/workshop-app 6.50.2 → 6.50.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/_layout-COy4UuFj.js +2 -0
- package/build/client/assets/_layout-COy4UuFj.js.map +1 -0
- package/build/client/assets/{app-Wqtaq0if.js → app-B-WYurXM.js} +2 -2
- package/build/client/assets/{app-Wqtaq0if.js.map → app-B-WYurXM.js.map} +1 -1
- package/build/client/assets/{index-auYYjXx0.js → index-CDG5ZZjr.js} +2 -2
- package/build/client/assets/{index-auYYjXx0.js.map → index-CDG5ZZjr.js.map} +1 -1
- package/build/client/assets/{manifest-2ee52cac.js → manifest-940d9817.js} +1 -1
- package/build/client/assets/{preview-CuS2jg4z.js → preview-CqV1y1NY.js} +2 -2
- package/build/client/assets/{preview-CuS2jg4z.js.map → preview-CqV1y1NY.js.map} +1 -1
- package/build/client/export-app.css +558 -0
- package/build/server/index.js +391 -16
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_layout-Bm8WMscw.js +0 -2
- package/build/client/assets/_layout-Bm8WMscw.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-auYYjXx0.js","sources":["../../../../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../../../../node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../app/components/status-indicator.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/discord.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/playground.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index.tsx"],"sourcesContent":["\"use client\";\n\n// src/roving-focus-group.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar ENTRY_FOCUS = \"rovingFocusGroup.onEntryFocus\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar GROUP_NAME = \"RovingFocusGroup\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(GROUP_NAME);\nvar [createRovingFocusGroupContext, createRovingFocusGroupScope] = createContextScope(\n GROUP_NAME,\n [createCollectionScope]\n);\nvar [RovingFocusProvider, useRovingFocusContext] = createRovingFocusGroupContext(GROUP_NAME);\nvar RovingFocusGroup = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(RovingFocusGroupImpl, { ...props, ref: forwardedRef }) }) });\n }\n);\nRovingFocusGroup.displayName = GROUP_NAME;\nvar RovingFocusGroupImpl = React.forwardRef((props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n orientation,\n loop = false,\n dir,\n currentTabStopId: currentTabStopIdProp,\n defaultCurrentTabStopId,\n onCurrentTabStopIdChange,\n onEntryFocus,\n preventScrollOnEntryFocus = false,\n ...groupProps\n } = props;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const direction = useDirection(dir);\n const [currentTabStopId, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId ?? null,\n onChange: onCurrentTabStopIdChange,\n caller: GROUP_NAME\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const handleEntryFocus = useCallbackRef(onEntryFocus);\n const getItems = useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = React.useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n node.addEventListener(ENTRY_FOCUS, handleEntryFocus);\n return () => node.removeEventListener(ENTRY_FOCUS, handleEntryFocus);\n }\n }, [handleEntryFocus]);\n return /* @__PURE__ */ jsx(\n RovingFocusProvider,\n {\n scope: __scopeRovingFocusGroup,\n orientation,\n dir: direction,\n loop,\n currentTabStopId,\n onItemFocus: React.useCallback(\n (tabStopId) => setCurrentTabStopId(tabStopId),\n [setCurrentTabStopId]\n ),\n onItemShiftTab: React.useCallback(() => setIsTabbingBackOut(true), []),\n onFocusableItemAdd: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount + 1),\n []\n ),\n onFocusableItemRemove: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount - 1),\n []\n ),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation,\n ...groupProps,\n ref: composedRefs,\n style: { outline: \"none\", ...props.style },\n onMouseDown: composeEventHandlers(props.onMouseDown, () => {\n isClickFocusRef.current = true;\n }),\n onFocus: composeEventHandlers(props.onFocus, (event) => {\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item) => item.focusable);\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === currentTabStopId);\n const candidateItems = [activeItem, currentItem, ...items].filter(\n Boolean\n );\n const candidateNodes = candidateItems.map((item) => item.ref.current);\n focusFirst(candidateNodes, preventScrollOnEntryFocus);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false))\n }\n )\n }\n );\n});\nvar ITEM_NAME = \"RovingFocusGroupItem\";\nvar RovingFocusGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n focusable = true,\n active = false,\n tabStopId,\n children,\n ...itemProps\n } = props;\n const autoId = useId();\n const id = tabStopId || autoId;\n const context = useRovingFocusContext(ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd, onFocusableItemRemove, currentTabStopId } = context;\n React.useEffect(() => {\n if (focusable) {\n onFocusableItemAdd();\n return () => onFocusableItemRemove();\n }\n }, [focusable, onFocusableItemAdd, onFocusableItemRemove]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeRovingFocusGroup,\n id,\n focusable,\n active,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation,\n ...itemProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!focusable) event.preventDefault();\n else context.onItemFocus(id);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => context.onItemFocus(id)),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Tab\" && event.shiftKey) {\n context.onItemShiftTab();\n return;\n }\n if (event.target !== event.currentTarget) return;\n const focusIntent = getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== void 0) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n event.preventDefault();\n const items = getItems().filter((item) => item.focusable);\n let candidateNodes = items.map((item) => item.ref.current);\n if (focusIntent === \"last\") candidateNodes.reverse();\n else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = context.loop ? wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n }\n }),\n children: typeof children === \"function\" ? children({ isCurrentTabStop, hasTabStop: currentTabStopId != null }) : children\n }\n )\n }\n );\n }\n);\nRovingFocusGroupItem.displayName = ITEM_NAME;\nvar MAP_KEY_TO_FOCUS_INTENT = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\"\n};\nfunction getDirectionAwareKey(key, dir) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\" ? \"ArrowRight\" : key === \"ArrowRight\" ? \"ArrowLeft\" : key;\n}\nfunction getFocusIntent(event, orientation, dir) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key)) return void 0;\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key)) return void 0;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction focusFirst(candidates, preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root = RovingFocusGroup;\nvar Item = RovingFocusGroupItem;\nexport {\n Item,\n Root,\n RovingFocusGroup,\n RovingFocusGroupItem,\n createRovingFocusGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue ?? \"\",\n caller: TABS_NAME\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if ([\" \", \"Enter\"].includes(event.key)) context.onValueChange(value);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","export function StatusIndicator({\n\tstatus,\n}: {\n\tstatus: 'running' | 'passed' | 'failed' | 'stopped'\n}) {\n\tconst colors = {\n\t\trunning: {\n\t\t\tpinger: 'bg-green-400',\n\t\t\tcircle: 'bg-green-500',\n\t\t},\n\t\tpassed: {\n\t\t\tcircle: 'bg-green-500',\n\t\t},\n\t\tfailed: {\n\t\t\tcircle: 'bg-red-500',\n\t\t},\n\t\tstopped: {\n\t\t\tcircle: 'bg-gray-500',\n\t\t},\n\t}[status]\n\treturn (\n\t\t<span className=\"relative flex h-3 w-3\">\n\t\t\t{colors.pinger ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={`absolute inline-flex h-full w-full animate-ping rounded-full ${colors.pinger} opacity-75`}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tclassName={`relative inline-flex h-3 w-3 rounded-full ${colors.circle}`}\n\t\t\t/>\n\t\t</span>\n\t)\n}\n","import * as React from 'react'\nimport { Await, Link, useLoaderData } from 'react-router'\nimport { Icon } from '#app/components/icons.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { DiscordCTA, useDiscordCTALink } from '#app/routes/_app+/discord.tsx'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport { type Route } from '../+types/index.tsx'\n\nexport function DiscordChat() {\n\treturn (\n\t\t<div className=\"flex h-full w-full flex-col gap-4 pt-4\">\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<DiscordCTA />\n\t\t\t</div>\n\t\t\t<div className=\"bg-accent scrollbar-thin scrollbar-thumb-scrollbar flex-1 overflow-y-scroll pb-4\">\n\t\t\t\t<DiscordPosts />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPosts() {\n\tconst data = useLoaderData<Route.ComponentProps['loaderData']>()\n\tconst ctaLink = useDiscordCTALink()\n\tconst altDown = useAltDown()\n\tconst isOnline = useIsOnline()\n\tif (!isOnline) {\n\t\treturn (\n\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t<div className=\"text-foreground-destructive flex h-full w-full flex-col items-center justify-center\">\n\t\t\t\t\t<Icon name=\"WifiNoConnection\" size=\"xl\">\n\t\t\t\t\t\tUnable to load discord messages when offline\n\t\t\t\t\t</Icon>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\treturn (\n\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t<React.Suspense\n\t\t\t\tfallback={\n\t\t\t\t\t<div className=\"flex h-full w-full flex-col items-center justify-center\">\n\t\t\t\t\t\t<Loading>Loading Discord Posts</Loading>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Await\n\t\t\t\t\tresolve={data.discordPostsPromise}\n\t\t\t\t\terrorElement={\n\t\t\t\t\t\t<div className=\"text-red-500\">\n\t\t\t\t\t\t\tThere was a problem loading the discord posts\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{(posts) => (\n\t\t\t\t\t\t<ul className=\"flex w-full flex-col gap-4 p-3 xl:p-12\">\n\t\t\t\t\t\t\t{posts.map((post) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={post.id}\n\t\t\t\t\t\t\t\t\tclassName=\"bg-background rounded-xl border transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<DiscordPost thread={post} />\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</Await>\n\t\t\t</React.Suspense>\n\t\t\t<div>\n\t\t\t\t<Link\n\t\t\t\t\tto={\n\t\t\t\t\t\taltDown && !ctaLink.includes('oauth')\n\t\t\t\t\t\t\t? ctaLink.replace(/^https/, 'discord')\n\t\t\t\t\t\t\t: ctaLink\n\t\t\t\t\t}\n\t\t\t\t\ttarget={ctaLink.includes('oauth') ? undefined : '_blank'}\n\t\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t\t\tonClick={\n\t\t\t\t\t\taltDown\n\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\twindow.open(\n\t\t\t\t\t\t\t\t\t\te.currentTarget.href,\n\t\t\t\t\t\t\t\t\t\t'_blank',\n\t\t\t\t\t\t\t\t\t\t'noreferrer noopener',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclassName=\"flex items-center gap-2 p-2 text-xl hover:underline\"\n\t\t\t\t>\n\t\t\t\t\tCreate Post <Icon name=\"ExternalLink\" />\n\t\t\t\t</Link>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPost({\n\tthread,\n}: {\n\tthread: Awaited<\n\t\tRoute.ComponentProps['loaderData']['discordPostsPromise']\n\t>[number]\n}) {\n\tconst reactionsWithCounts = thread.reactions.filter((r) => r.count)\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t{thread.tags.length ? (\n\t\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t{thread.tags.map((t) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={t.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"bg-accent flex items-center justify-center gap-1 rounded-full px-2 py-1 text-sm\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t<Emoji name={t.emojiName} url={t.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>{t.name}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<strong className=\"text-xl font-bold\">{thread.name}</strong>\n\t\t\t\t\t\t<div className=\"flex items-start gap-1\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t{thread.authorAvatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={thread.authorAvatarUrl}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-bold\"\n\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\tthread.authorHexAccentColor\n\t\t\t\t\t\t\t\t\t\t\t\t? { color: thread.authorHexAccentColor }\n\t\t\t\t\t\t\t\t\t\t\t\t: {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{thread.authorDisplayName}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t:{' '}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground flex-1 overflow-ellipsis\">\n\t\t\t\t\t\t\t\t{thread.messagePreview}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{thread.previewImageUrl ? (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={thread.previewImageUrl}\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tclassName=\"h-28 w-28 rounded-lg object-cover\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{reactionsWithCounts.length ? (\n\t\t\t\t\t\t\t\t<ul className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{reactionsWithCounts.map((r, i) => (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Emoji name={r.emojiName} url={r.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{r.count}</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1\">\n\t\t\t\t\t\t\t\t<Icon name=\"Chat\" /> {thread.messageCount}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{` · ${thread.lastUpdatedDisplay}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"flex items-center gap-4\">\n\t\t\t\t\t\t<a href={thread.link.replace(/^https/, 'discord')}>\n\t\t\t\t\t\t\t<Icon name=\"Discord\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href={thread.link} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Emoji({ name, url }: { name?: string; url?: string }) {\n\treturn url ? (\n\t\t<img src={url} alt={name} className=\"h-full w-full\" />\n\t) : name ? (\n\t\tname\n\t) : null\n}\n","import { toast as showToast } from 'sonner'\nimport { Icon } from '#app/components/icons.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser'\nimport { SimpleTooltip } from '#app/components/ui/tooltip'\nimport { SetAppToPlayground } from '#app/routes/set-playground'\nimport { PlaygroundWindow } from './playground-window'\nimport { Preview } from './preview'\n\nexport function Playground({\n\tappInfo: playgroundAppInfo,\n\tinBrowserBrowserRef,\n\tproblemAppName,\n\tallApps,\n\tisUpToDate,\n}: {\n\tappInfo: Parameters<typeof Preview>['0']['appInfo'] | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n\tproblemAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n\tisUpToDate: boolean\n}) {\n\treturn (\n\t\t<PlaygroundWindow\n\t\t\tplaygroundAppName={playgroundAppInfo?.appName}\n\t\t\tproblemAppName={problemAppName}\n\t\t\tallApps={allApps}\n\t\t\tisUpToDate={isUpToDate}\n\t\t>\n\t\t\t{playgroundAppInfo?.dev.type === 'none' ? (\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-center gap-4\">\n\t\t\t\t\t<div className=\"text-secondary-foreground text-2xl\">\n\t\t\t\t\t\tNon-UI exercise\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-secondary-foreground max-w-md text-center text-balance\">\n\t\t\t\t\t\tThis exercise has no application or other UI associated with it.{' '}\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\tNavigate to{' '}\n\t\t\t\t\t\t<SimpleTooltip content={playgroundAppInfo.fullPath}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"inline-flex cursor-pointer items-center gap-1.5 underline\"\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(playgroundAppInfo.fullPath)\n\t\t\t\t\t\t\t\t\tshowToast.success('Copied playground path to clipboard')\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tthe playground directory\n\t\t\t\t\t\t\t\t<Icon name=\"Copy\" size=\"sm\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</SimpleTooltip>{' '}\n\t\t\t\t\t\tin your editor and follow the exercise instructions to complete it.\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : playgroundAppInfo ? (\n\t\t\t\t<Preview\n\t\t\t\t\tid={playgroundAppInfo.appName}\n\t\t\t\t\tappInfo={playgroundAppInfo}\n\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col justify-center gap-2\">\n\t\t\t\t\t<p>Please set the playground first</p>\n\t\t\t\t\t{problemAppName ? (\n\t\t\t\t\t\t<SetAppToPlayground appName={problemAppName} />\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PlaygroundWindow>\n\t)\n}\n","import {\n\tgetAppByName,\n\tgetAppDisplayName,\n\tgetApps,\n\tgetExerciseApp,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getDiffCode } from '@epic-web/workshop-utils/diff.server'\nimport { userHasAccessToExerciseStep } from '@epic-web/workshop-utils/epic-api.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport * as Tabs from '@radix-ui/react-tabs'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport {\n\tLink,\n\tuseNavigate,\n\tuseSearchParams,\n\tdata,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\tuseOutletContext,\n} from 'react-router'\nimport { Diff } from '#app/components/diff.tsx'\nimport { GeneralErrorBoundary } from '#app/components/error-boundary.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { StatusIndicator } from '#app/components/status-indicator.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.tsx'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { type Route } from './+types/index.ts'\nimport { fetchDiscordPosts } from './__shared/discord.server.ts'\nimport { DiscordChat } from './__shared/discord.tsx'\nimport { Playground } from './__shared/playground.tsx'\nimport { Preview } from './__shared/preview.tsx'\nimport { Tests } from './__shared/tests.tsx'\nimport { getAppRunningState, getTestState } from './__shared/utils.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseStepTypeIndexLoader')\n\tconst searchParams = new URL(request.url).searchParams\n\tconst cacheOptions = { request, timings }\n\n\tconst [exerciseStepApp, allAppsFull, problemApp, solutionApp] =\n\t\tawait Promise.all([\n\t\t\trequireExerciseApp(params, cacheOptions),\n\t\t\tgetApps(cacheOptions),\n\t\t\tgetExerciseApp({ ...params, type: 'problem' }, cacheOptions),\n\t\t\tgetExerciseApp({ ...params, type: 'solution' }, cacheOptions),\n\t\t])\n\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\n\tconst reqUrl = new URL(request.url)\n\n\tconst pathnameParam = reqUrl.searchParams.get('pathname')\n\tif (pathnameParam === '' || pathnameParam === '/') {\n\t\treqUrl.searchParams.delete('pathname')\n\t\tthrow redirect(reqUrl.toString())\n\t}\n\n\tconst app1Name = reqUrl.searchParams.get('app1')\n\tconst app2Name = reqUrl.searchParams.get('app2')\n\tconst app1 = app1Name\n\t\t? await getAppByName(app1Name)\n\t\t: playgroundApp || problemApp\n\tconst app2 = app2Name ? await getAppByName(app2Name) : solutionApp\n\n\tfunction getStepId(a: ExerciseStepApp) {\n\t\treturn (\n\t\t\ta.exerciseNumber * 1000 +\n\t\t\ta.stepNumber * 10 +\n\t\t\t(a.type === 'problem' ? 0 : 1)\n\t\t)\n\t}\n\n\tfunction getStepNameAndId(a: App) {\n\t\tif (isExerciseStepApp(a)) {\n\t\t\tconst exerciseNumberStr = String(a.exerciseNumber).padStart(2, '0')\n\t\t\tconst stepNumberStr = String(a.stepNumber).padStart(2, '0')\n\n\t\t\treturn {\n\t\t\t\tstepName: `${exerciseNumberStr}/${stepNumberStr}.${a.type}`,\n\t\t\t\tstepId: getStepId(a),\n\t\t\t}\n\t\t}\n\t\treturn { stepName: '', stepId: -1 }\n\t}\n\n\tconst allApps = allAppsFull\n\t\t.filter((a, i, ar) => ar.findIndex((b) => a.name === b.name) === i)\n\t\t.map((a) => ({\n\t\t\tdisplayName: getAppDisplayName(a, allAppsFull),\n\t\t\tname: a.name,\n\t\t\ttitle: a.title,\n\t\t\ttype: a.type,\n\t\t\t...getStepNameAndId(a),\n\t\t}))\n\n\tallApps.sort((a, b) => {\n\t\t// order them by their stepId\n\t\tif (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId\n\n\t\t// non-step apps should come after step apps\n\t\tif (a.stepId > 0) return -1\n\t\tif (b.stepId > 0) return 1\n\n\t\treturn 0\n\t})\n\n\tasync function getDiffProp() {\n\t\tif (!app1 || !app2) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: null,\n\t\t\t}\n\t\t}\n\t\tconst diffCode = await getDiffCode(app1, app2, {\n\t\t\t...cacheOptions,\n\t\t\tforceFresh: searchParams.get('forceFresh') === 'diff',\n\t\t}).catch((e) => {\n\t\t\tconsole.error(e)\n\t\t\treturn null\n\t\t})\n\t\treturn {\n\t\t\tapp1: app1.name,\n\t\t\tapp2: app2.name,\n\t\t\tdiffCode,\n\t\t}\n\t}\n\n\treturn data(\n\t\t{\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\tallApps,\n\t\t\t// defer this promise so that we don't block the response from being sent\n\t\t\tdiscordPostsPromise: fetchDiscordPosts({ request }),\n\t\t\tuserHasAccessPromise: userHasAccessToExerciseStep({\n\t\t\t\texerciseNumber: Number(params.exerciseNumber),\n\t\t\t\tstepNumber: Number(params.stepNumber),\n\t\t\t\trequest,\n\t\t\t\ttimings,\n\t\t\t}),\n\t\t\tplayground: playgroundApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'playground',\n\t\t\t\t\t\tfullPath: playgroundApp.fullPath,\n\t\t\t\t\t\tdev: playgroundApp.dev,\n\t\t\t\t\t\ttest: playgroundApp.test,\n\t\t\t\t\t\ttitle: playgroundApp.title,\n\t\t\t\t\t\tname: playgroundApp.name,\n\t\t\t\t\t\tappName: playgroundApp.appName,\n\t\t\t\t\t\tisUpToDate: playgroundApp.isUpToDate,\n\t\t\t\t\t\tstackBlitzUrl: playgroundApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(playgroundApp)),\n\t\t\t\t\t\t...getTestState(playgroundApp),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tproblem: problemApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'problem',\n\t\t\t\t\t\tfullPath: problemApp.fullPath,\n\t\t\t\t\t\tdev: problemApp.dev,\n\t\t\t\t\t\ttest: problemApp.test,\n\t\t\t\t\t\ttitle: problemApp.title,\n\t\t\t\t\t\tname: problemApp.name,\n\t\t\t\t\t\tstackBlitzUrl: problemApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(problemApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tsolution: solutionApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'solution',\n\t\t\t\t\t\tfullPath: solutionApp.fullPath,\n\t\t\t\t\t\tdev: solutionApp.dev,\n\t\t\t\t\t\ttest: solutionApp.test,\n\t\t\t\t\t\ttitle: solutionApp.title,\n\t\t\t\t\t\tname: solutionApp.name,\n\t\t\t\t\t\tstackBlitzUrl: solutionApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(solutionApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tdiff: getDiffProp(),\n\t\t} as const,\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst tabs = [\n\t'playground',\n\t'problem',\n\t'solution',\n\t'tests',\n\t'diff',\n\t'chat',\n] as const\nconst isValidPreview = (s: string | null): s is (typeof tabs)[number] =>\n\tBoolean(s && tabs.includes(s as (typeof tabs)[number]))\n\nfunction withParam(\n\tsearchParams: URLSearchParams,\n\tkey: string,\n\tvalue: string | null,\n) {\n\tconst newSearchParams = new URLSearchParams(searchParams)\n\tif (value === null) {\n\t\tnewSearchParams.delete(key)\n\t} else {\n\t\tnewSearchParams.set(key, value)\n\t}\n\treturn newSearchParams\n}\n\nexport default function ExercisePartRoute({\n\tloaderData,\n}: Route.ComponentProps) {\n\tconst { inBrowserBrowserRef } = useOutletContext<{\n\t\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n\t}>()\n\tconst workshopConfig = useWorkshopConfig()\n\tconst [searchParams] = useSearchParams()\n\n\tconst preview = searchParams.get('preview')\n\n\tconst altDown = useAltDown()\n\tconst navigate = useNavigate()\n\n\tfunction shouldHideTab(tab: (typeof tabs)[number]) {\n\t\tif (tab === 'tests') {\n\t\t\treturn (\n\t\t\t\tENV.EPICSHOP_DEPLOYED ||\n\t\t\t\t!loaderData.playground ||\n\t\t\t\tloaderData.playground.test.type === 'none'\n\t\t\t)\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution') {\n\t\t\tif (loaderData[tab]?.dev.type === 'none') return true\n\t\t\tif (ENV.EPICSHOP_DEPLOYED) {\n\t\t\t\treturn (\n\t\t\t\t\tloaderData[tab]?.dev.type !== 'browser' &&\n\t\t\t\t\t!loaderData[tab]?.stackBlitzUrl\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (tab === 'playground' && ENV.EPICSHOP_DEPLOYED) return true\n\n\t\tif (tab === 'chat') {\n\t\t\treturn !workshopConfig.product.discordChannelId\n\t\t}\n\t\treturn false\n\t}\n\n\tfunction getTabStatus(\n\t\ttab: (typeof tabs)[number],\n\t): 'running' | 'passed' | 'failed' | null {\n\t\tif (tab === 'tests') {\n\t\t\tif (!loaderData.playground) return null\n\t\t\tconst { isTestRunning, testExitCode } = loaderData.playground\n\t\t\tif (isTestRunning) return 'running'\n\t\t\tif (testExitCode === 0) return 'passed'\n\t\t\tif (testExitCode !== null && testExitCode !== 0) return 'failed'\n\t\t\treturn null\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution' || tab === 'playground') {\n\t\t\tconst appData =\n\t\t\t\ttab === 'playground' ? loaderData.playground : loaderData[tab]\n\t\t\tif (appData?.isRunning) return 'running'\n\t\t}\n\t\treturn null\n\t}\n\n\tconst activeTab = isValidPreview(preview)\n\t\t? preview\n\t\t: tabs.find((t) => !shouldHideTab(t))\n\n\t// when alt is held down, the diff tab should open to the full-page diff view\n\t// between the problem and solution (this is more for the instructor than the student)\n\tconst altDiffUrl = `/diff?${new URLSearchParams({\n\t\tapp1: loaderData.problem?.name ?? '',\n\t\tapp2: loaderData.solution?.name ?? '',\n\t})}`\n\n\tfunction handleDiffTabClick(event: React.MouseEvent<HTMLAnchorElement>) {\n\t\tif (event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {\n\t\t\tevent.preventDefault()\n\t\t\tvoid navigate(altDiffUrl)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Tabs.Root\n\t\t\tclassName=\"relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden sm:col-span-1 sm:row-span-1\"\n\t\t\tvalue={activeTab}\n\t\t\t// intentionally no onValueChange here because the Link will trigger the\n\t\t\t// change.\n\t\t>\n\t\t\t<Tabs.List className=\"scrollbar-thin scrollbar-thumb-scrollbar h-14 min-h-14 overflow-x-auto border-b whitespace-nowrap\">\n\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\tconst hidden = shouldHideTab(tab)\n\t\t\t\t\tconst status = getTabStatus(tab)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Tabs.Trigger key={tab} value={tab} hidden={hidden} asChild>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tid={`${tab}-tab`}\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'clip-path-button radix-state-active:z-10 radix-state-active:bg-foreground radix-state-active:text-background radix-state-active:hover:bg-foreground/80 radix-state-active:hover:text-background/80 radix-state-inactive:hover:bg-foreground/20 radix-state-inactive:hover:text-foreground/80 focus:bg-foreground/80 focus:text-background/80 relative h-full px-6 py-4 font-mono text-sm uppercase outline-none',\n\t\t\t\t\t\t\t\t\thidden ? 'hidden' : 'inline-block',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tpreventScrollReset\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tonClick={handleDiffTabClick}\n\t\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\t\ttab === 'diff' && altDown\n\t\t\t\t\t\t\t\t\t\t? altDiffUrl\n\t\t\t\t\t\t\t\t\t\t: `?${withParam(\n\t\t\t\t\t\t\t\t\t\t\t\tsearchParams,\n\t\t\t\t\t\t\t\t\t\t\t\t'preview',\n\t\t\t\t\t\t\t\t\t\t\t\ttab === 'playground' ? null : tab,\n\t\t\t\t\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{status && <StatusIndicator status={status} />}\n\t\t\t\t\t\t\t\t\t<span>{tab}</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</Tabs.List>\n\t\t\t<div className=\"relative z-10 flex min-h-0 flex-1 flex-col overflow-hidden\">\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"playground\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t\tforceMount\n\t\t\t\t>\n\t\t\t\t\t<Playground\n\t\t\t\t\t\tappInfo={loaderData.playground}\n\t\t\t\t\t\tproblemAppName={loaderData.problem?.name}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\tallApps={loaderData.allApps}\n\t\t\t\t\t\tisUpToDate={loaderData.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"problem\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t\tforceMount\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={loaderData.problem}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"solution\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t\tforceMount\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={loaderData.solution}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"tests\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start overflow-hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Tests\n\t\t\t\t\t\tappInfo={loaderData.playground}\n\t\t\t\t\t\tproblemAppName={loaderData.problem?.name}\n\t\t\t\t\t\tallApps={loaderData.allApps}\n\t\t\t\t\t\tisUpToDate={loaderData.playground?.isUpToDate ?? false}\n\t\t\t\t\t\tuserHasAccessPromise={loaderData.userHasAccessPromise}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"diff\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex h-full min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t>\n\t\t\t\t\t<Diff\n\t\t\t\t\t\tdiff={loaderData.diff}\n\t\t\t\t\t\tallApps={loaderData.allApps}\n\t\t\t\t\t\tuserHasAccessPromise={loaderData.userHasAccessPromise}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"chat\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex h-full min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t>\n\t\t\t\t\t<DiscordChat />\n\t\t\t\t</Tabs.Content>\n\t\t\t</div>\n\t\t</Tabs.Root>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<GeneralErrorBoundary\n\t\t\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["ENTRY_FOCUS","EVENT_OPTIONS","GROUP_NAME","Collection","useCollection","createCollectionScope","createCollection","createRovingFocusGroupContext","createRovingFocusGroupScope","createContextScope","RovingFocusProvider","useRovingFocusContext","RovingFocusGroup","React.forwardRef","props","forwardedRef","jsx","RovingFocusGroupImpl","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","preventScrollOnEntryFocus","groupProps","ref","React.useRef","composedRefs","useComposedRefs","direction","useDirection","currentTabStopId","setCurrentTabStopId","useControllableState","isTabbingBackOut","setIsTabbingBackOut","React.useState","handleEntryFocus","useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","React.useEffect","node","React.useCallback","tabStopId","prevCount","Primitive","composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","focusFirst","ITEM_NAME","RovingFocusGroupItem","focusable","active","children","itemProps","autoId","useId","id","context","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","getFocusIntent","currentIndex","wrapArray","MAP_KEY_TO_FOCUS_INTENT","getDirectionAwareKey","key","candidates","preventScroll","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","index","Root","Item","TABS_NAME","createTabsContext","useRovingFocusGroupScope","TabsProvider","useTabsContext","Tabs","__scopeTabs","valueProp","onValueChange","defaultValue","activationMode","tabsProps","value","setValue","TAB_LIST_NAME","TabsList","listProps","rovingFocusGroupScope","RovingFocusGroup.Root","TRIGGER_NAME","TabsTrigger","disabled","triggerProps","triggerId","makeTriggerId","contentId","makeContentId","isSelected","RovingFocusGroup.Item","isAutomaticActivation","CONTENT_NAME","TabsContent","forceMount","contentProps","isMountAnimationPreventedRef","rAF","Presence","present","baseId","Root2","List","Trigger","Content","StatusIndicator","status","colors","jsxs","DiscordChat","DiscordCTA","DiscordPosts","data","useLoaderData","ctaLink","useDiscordCTALink","altDown","useAltDown","useIsOnline","React.Suspense","Loading","Await","posts","post","DiscordPost","Link","e","Icon","thread","reactionsWithCounts","t","Emoji","i","name","url","Playground","playgroundAppInfo","inBrowserBrowserRef","problemAppName","allApps","isUpToDate","PlaygroundWindow","SimpleTooltip","showToast","Preview","SetAppToPlayground","tabs","isValidPreview","s","Boolean","includes","withParam","searchParams","newSearchParams","URLSearchParams","delete","set","_UNSAFE_withComponentProps","loaderData","useOutletContext","workshopConfig","useWorkshopConfig","useSearchParams","preview","get","navigate","useNavigate","shouldHideTab","tab","ENV","EPICSHOP_DEPLOYED","playground","test","type","dev","stackBlitzUrl","product","discordChannelId","getTabStatus","isTestRunning","testExitCode","isRunning","activeTab","find","altDiffUrl","app1","problem","app2","solution","handleDiffTabClick","altKey","ctrlKey","shiftKey","metaKey","preventDefault","className","map","hidden","asChild","clsx","preventScrollReset","prefetch","onClick","to","appInfo","Tests","userHasAccessPromise","Diff","diff","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary","statusHandlers"],"mappings":"w0CAcA,IAAIA,EAAc,gCACdC,GAAgB,CAAE,QAAS,GAAO,WAAY,EAAI,EAClDC,EAAa,mBACb,CAACC,EAAYC,EAAeC,EAAqB,EAAIC,GAAiBJ,CAAU,EAChF,CAACK,GAA+BC,CAA2B,EAAIC,EACjEP,EACA,CAACG,EAAqB,CACxB,EACI,CAACK,GAAqBC,EAAqB,EAAIJ,GAA8BL,CAAU,EACvFU,EAAmBC,EAAAA,WACrB,CAACC,EAAOC,IACiBC,MAAIb,EAAW,SAAU,CAAE,MAAOW,EAAM,wBAAyB,SAA0BE,MAAIb,EAAW,KAAM,CAAE,MAAOW,EAAM,wBAAyB,SAA0BE,EAAAA,IAAIC,GAAsB,CAAE,GAAGH,EAAO,IAAKC,EAAc,CAAC,CAAE,CAAC,CAAE,CAE5Q,EACAH,EAAiB,YAAcV,EAC/B,IAAIe,GAAuBJ,EAAAA,WAAiB,CAACC,EAAOC,IAAiB,CACnE,KAAM,CACJ,wBAAAG,EACA,YAAAC,EACA,KAAAC,EAAO,GACP,IAAAC,EACA,iBAAkBC,EAClB,wBAAAC,EACA,yBAAAC,EACA,aAAAC,EACA,0BAAAC,EAA4B,GAC5B,GAAGC,CACP,EAAMb,EACEc,EAAMC,EAAAA,OAAa,IAAI,EACvBC,EAAeC,GAAgBhB,EAAca,CAAG,EAChDI,EAAYC,EAAaZ,CAAG,EAC5B,CAACa,EAAkBC,CAAmB,EAAIC,EAAqB,CACnE,KAAMd,EACN,YAAaC,GAA2B,KACxC,SAAUC,EACV,OAAQtB,CACZ,CAAG,EACK,CAACmC,EAAkBC,CAAmB,EAAIC,EAAAA,SAAe,EAAK,EAC9DC,EAAmBC,GAAehB,CAAY,EAC9CiB,EAAWtC,EAAcc,CAAuB,EAChDyB,EAAkBd,EAAAA,OAAa,EAAK,EACpC,CAACe,GAAqBC,CAAsB,EAAIN,EAAAA,SAAe,CAAC,EACtEO,OAAAA,EAAAA,UAAgB,IAAM,CACpB,MAAMC,EAAOnB,EAAI,QACjB,GAAImB,EACF,OAAAA,EAAK,iBAAiB/C,EAAawC,CAAgB,EAC5C,IAAMO,EAAK,oBAAoB/C,EAAawC,CAAgB,CAEvE,EAAG,CAACA,CAAgB,CAAC,EACExB,EAAAA,IACrBN,GACA,CACE,MAAOQ,EACP,YAAAC,EACA,IAAKa,EACL,KAAAZ,EACA,iBAAAc,EACA,YAAac,EAAAA,YACVC,GAAcd,EAAoBc,CAAS,EAC5C,CAACd,CAAmB,CAC5B,EACM,eAAgBa,EAAAA,YAAkB,IAAMV,EAAoB,EAAI,EAAG,CAAA,CAAE,EACrE,mBAAoBU,EAAAA,YAClB,IAAMH,EAAwBK,GAAcA,EAAY,CAAC,EACzD,CAAA,CACR,EACM,sBAAuBF,EAAAA,YACrB,IAAMH,EAAwBK,GAAcA,EAAY,CAAC,EACzD,CAAA,CACR,EACM,SAA0BlC,EAAAA,IACxBmC,EAAU,IACV,CACE,SAAUd,GAAoBO,KAAwB,EAAI,GAAK,EAC/D,mBAAoBzB,EACpB,GAAGQ,EACH,IAAKG,EACL,MAAO,CAAE,QAAS,OAAQ,GAAGhB,EAAM,KAAK,EACxC,YAAasC,EAAqBtC,EAAM,YAAa,IAAM,CACzD6B,EAAgB,QAAU,EAC5B,CAAC,EACD,QAASS,EAAqBtC,EAAM,QAAUuC,GAAU,CACtD,MAAMC,GAAkB,CAACX,EAAgB,QACzC,GAAIU,EAAM,SAAWA,EAAM,eAAiBC,IAAmB,CAACjB,EAAkB,CAChF,MAAMkB,EAAkB,IAAI,YAAYvD,EAAaC,EAAa,EAElE,GADAoD,EAAM,cAAc,cAAcE,CAAe,EAC7C,CAACA,EAAgB,iBAAkB,CACrC,MAAMC,EAAQd,IAAW,OAAQe,GAASA,EAAK,SAAS,EAClDC,GAAaF,EAAM,KAAMC,GAASA,EAAK,MAAM,EAC7CE,GAAcH,EAAM,KAAMC,GAASA,EAAK,KAAOvB,CAAgB,EAI/D0B,GAHiB,CAACF,GAAYC,GAAa,GAAGH,CAAK,EAAE,OACzD,OAClB,EACsD,IAAKC,GAASA,EAAK,IAAI,OAAO,EACpEI,EAAWD,GAAgBlC,CAAyB,CACtD,CACF,CACAiB,EAAgB,QAAU,EAC5B,CAAC,EACD,OAAQS,EAAqBtC,EAAM,OAAQ,IAAMwB,EAAoB,EAAK,CAAC,CACrF,CACA,CACA,CACA,CACA,CAAC,EACGwB,EAAY,uBACZC,EAAuBlD,EAAAA,WACzB,CAACC,EAAOC,IAAiB,CACvB,KAAM,CACJ,wBAAAG,EACA,UAAA8C,EAAY,GACZ,OAAAC,EAAS,GACT,UAAAhB,EACA,SAAAiB,EACA,GAAGC,CACT,EAAQrD,EACEsD,EAASC,EAAK,EACdC,EAAKrB,GAAamB,EAClBG,EAAU5D,GAAsBmD,EAAW5C,CAAuB,EAClEsD,EAAmBD,EAAQ,mBAAqBD,EAChD5B,EAAWtC,EAAcc,CAAuB,EAChD,CAAE,mBAAAuD,EAAoB,sBAAAC,EAAuB,iBAAAxC,CAAgB,EAAKqC,EACxEzB,OAAAA,EAAAA,UAAgB,IAAM,CACpB,GAAIkB,EACF,OAAAS,EAAkB,EACX,IAAMC,EAAqB,CAEtC,EAAG,CAACV,EAAWS,EAAoBC,CAAqB,CAAC,EAClC1D,EAAAA,IACrBb,EAAW,SACX,CACE,MAAOe,EACP,GAAAoD,EACA,UAAAN,EACA,OAAAC,EACA,SAA0BjD,EAAAA,IACxBmC,EAAU,KACV,CACE,SAAUqB,EAAmB,EAAI,GACjC,mBAAoBD,EAAQ,YAC5B,GAAGJ,EACH,IAAKpD,EACL,YAAaqC,EAAqBtC,EAAM,YAAcuC,GAAU,CACzDW,EACAO,EAAQ,YAAYD,CAAE,EADXjB,EAAM,eAAc,CAEtC,CAAC,EACD,QAASD,EAAqBtC,EAAM,QAAS,IAAMyD,EAAQ,YAAYD,CAAE,CAAC,EAC1E,UAAWlB,EAAqBtC,EAAM,UAAYuC,GAAU,CAC1D,GAAIA,EAAM,MAAQ,OAASA,EAAM,SAAU,CACzCkB,EAAQ,eAAc,EACtB,MACF,CACA,GAAIlB,EAAM,SAAWA,EAAM,cAAe,OAC1C,MAAMsB,EAAcC,GAAevB,EAAOkB,EAAQ,YAAaA,EAAQ,GAAG,EAC1E,GAAII,IAAgB,OAAQ,CAC1B,GAAItB,EAAM,SAAWA,EAAM,SAAWA,EAAM,QAAUA,EAAM,SAAU,OACtEA,EAAM,eAAc,EAEpB,IAAIO,EADUlB,IAAW,OAAQe,GAASA,EAAK,SAAS,EAC7B,IAAKA,GAASA,EAAK,IAAI,OAAO,EACzD,GAAIkB,IAAgB,OAAQf,EAAe,QAAO,UACzCe,IAAgB,QAAUA,IAAgB,OAAQ,CACrDA,IAAgB,QAAQf,EAAe,QAAO,EAClD,MAAMiB,EAAejB,EAAe,QAAQP,EAAM,aAAa,EAC/DO,EAAiBW,EAAQ,KAAOO,GAAUlB,EAAgBiB,EAAe,CAAC,EAAIjB,EAAe,MAAMiB,EAAe,CAAC,CACrH,CACA,WAAW,IAAMhB,EAAWD,CAAc,CAAC,CAC7C,CACF,CAAC,EACD,SAAU,OAAOM,GAAa,WAAaA,EAAS,CAAE,iBAAAM,EAAkB,WAAYtC,GAAoB,IAAI,CAAE,EAAIgC,CAC9H,CACA,CACA,CACA,CACE,CACF,EACAH,EAAqB,YAAcD,EACnC,IAAIiB,GAA0B,CAC5B,UAAW,OACX,QAAS,OACT,WAAY,OACZ,UAAW,OACX,OAAQ,QACR,KAAM,QACN,SAAU,OACV,IAAK,MACP,EACA,SAASC,GAAqBC,EAAK5D,EAAK,CACtC,OAAIA,IAAQ,MAAc4D,EACnBA,IAAQ,YAAc,aAAeA,IAAQ,aAAe,YAAcA,CACnF,CACA,SAASL,GAAevB,EAAOlC,EAAaE,EAAK,CAC/C,MAAM4D,EAAMD,GAAqB3B,EAAM,IAAKhC,CAAG,EAC/C,GAAI,EAAAF,IAAgB,YAAc,CAAC,YAAa,YAAY,EAAE,SAAS8D,CAAG,IACtE,EAAA9D,IAAgB,cAAgB,CAAC,UAAW,WAAW,EAAE,SAAS8D,CAAG,GACzE,OAAOF,GAAwBE,CAAG,CACpC,CACA,SAASpB,EAAWqB,EAAYC,EAAgB,GAAO,CACrD,MAAMC,EAA6B,SAAS,cAC5C,UAAWC,KAAaH,EAGtB,GAFIG,IAAcD,IAClBC,EAAU,MAAM,CAAE,cAAAF,EAAe,EAC7B,SAAS,gBAAkBC,GAA4B,MAE/D,CACA,SAASN,GAAUQ,EAAOC,EAAY,CACpC,OAAOD,EAAM,IAAI,CAACE,EAAGC,IAAUH,GAAOC,EAAaE,GAASH,EAAM,MAAM,CAAC,CAC3E,CACA,IAAII,GAAO9E,EACP+E,GAAO5B,EChNP6B,EAAY,OACZ,CAACC,EAAkC,EAAIpF,EAAmBmF,EAAW,CACvEpF,CACF,CAAC,EACGsF,EAA2BtF,EAA2B,EACtD,CAACuF,GAAcC,CAAc,EAAIH,GAAkBD,CAAS,EAC5DK,GAAOpF,EAAAA,WACT,CAACC,EAAOC,IAAiB,CACvB,KAAM,CACJ,YAAAmF,EACA,MAAOC,EACP,cAAAC,EACA,aAAAC,EACA,YAAAlF,EAAc,aACd,IAAAE,EACA,eAAAiF,EAAiB,YACjB,GAAGC,CACT,EAAQzF,EACEkB,EAAYC,EAAaZ,CAAG,EAC5B,CAACmF,EAAOC,CAAQ,EAAIrE,EAAqB,CAC7C,KAAM+D,EACN,SAAUC,EACV,YAAaC,GAAgB,GAC7B,OAAQT,CACd,CAAK,EACD,OAAuB5E,EAAAA,IACrB+E,GACA,CACE,MAAOG,EACP,OAAQ7B,EAAK,EACb,MAAAmC,EACA,cAAeC,EACf,YAAAtF,EACA,IAAKa,EACL,eAAAsE,EACA,SAA0BtF,EAAAA,IACxBmC,EAAU,IACV,CACE,IAAKnB,EACL,mBAAoBb,EACpB,GAAGoF,EACH,IAAKxF,CACjB,CACA,CACA,CACA,CACE,CACF,EACAkF,GAAK,YAAcL,EACnB,IAAIc,GAAgB,WAChBC,GAAW9F,EAAAA,WACb,CAACC,EAAOC,IAAiB,CACvB,KAAM,CAAE,YAAAmF,EAAa,KAAA9E,EAAO,GAAM,GAAGwF,CAAS,EAAK9F,EAC7CyD,EAAUyB,EAAeU,GAAeR,CAAW,EACnDW,EAAwBf,EAAyBI,CAAW,EAClE,OAAuBlF,EAAAA,IACrB8F,GACA,CACE,QAAS,GACT,GAAGD,EACH,YAAatC,EAAQ,YACrB,IAAKA,EAAQ,IACb,KAAAnD,EACA,SAA0BJ,EAAAA,IACxBmC,EAAU,IACV,CACE,KAAM,UACN,mBAAoBoB,EAAQ,YAC5B,GAAGqC,EACH,IAAK7F,CACjB,CACA,CACA,CACA,CACE,CACF,EACA4F,GAAS,YAAcD,GACvB,IAAIK,GAAe,cACfC,GAAcnG,EAAAA,WAChB,CAACC,EAAOC,IAAiB,CACvB,KAAM,CAAE,YAAAmF,EAAa,MAAAM,EAAO,SAAAS,EAAW,GAAO,GAAGC,CAAY,EAAKpG,EAC5DyD,EAAUyB,EAAee,GAAcb,CAAW,EAClDW,EAAwBf,EAAyBI,CAAW,EAC5DiB,EAAYC,GAAc7C,EAAQ,OAAQiC,CAAK,EAC/Ca,EAAYC,GAAc/C,EAAQ,OAAQiC,CAAK,EAC/Ce,EAAaf,IAAUjC,EAAQ,MACrC,OAAuBvD,EAAAA,IACrBwG,GACA,CACE,QAAS,GACT,GAAGX,EACH,UAAW,CAACI,EACZ,OAAQM,EACR,SAA0BvG,EAAAA,IACxBmC,EAAU,OACV,CACE,KAAM,SACN,KAAM,MACN,gBAAiBoE,EACjB,gBAAiBF,EACjB,aAAcE,EAAa,SAAW,WACtC,gBAAiBN,EAAW,GAAK,OACjC,SAAAA,EACA,GAAIE,EACJ,GAAGD,EACH,IAAKnG,EACL,YAAaqC,EAAqBtC,EAAM,YAAcuC,GAAU,CAC1D,CAAC4D,GAAY5D,EAAM,SAAW,GAAKA,EAAM,UAAY,GACvDkB,EAAQ,cAAciC,CAAK,EAE3BnD,EAAM,eAAc,CAExB,CAAC,EACD,UAAWD,EAAqBtC,EAAM,UAAYuC,GAAU,CACtD,CAAC,IAAK,OAAO,EAAE,SAASA,EAAM,GAAG,GAAGkB,EAAQ,cAAciC,CAAK,CACrE,CAAC,EACD,QAASpD,EAAqBtC,EAAM,QAAS,IAAM,CACjD,MAAM2G,EAAwBlD,EAAQ,iBAAmB,SACrD,CAACgD,GAAc,CAACN,GAAYQ,GAC9BlD,EAAQ,cAAciC,CAAK,CAE/B,CAAC,CACb,CACA,CACA,CACA,CACE,CACF,EACAQ,GAAY,YAAcD,GAC1B,IAAIW,GAAe,cACfC,GAAc9G,EAAAA,WAChB,CAACC,EAAOC,IAAiB,CACvB,KAAM,CAAE,YAAAmF,EAAa,MAAAM,EAAO,WAAAoB,EAAY,SAAA1D,EAAU,GAAG2D,CAAY,EAAK/G,EAChEyD,EAAUyB,EAAe0B,GAAcxB,CAAW,EAClDiB,EAAYC,GAAc7C,EAAQ,OAAQiC,CAAK,EAC/Ca,EAAYC,GAAc/C,EAAQ,OAAQiC,CAAK,EAC/Ce,EAAaf,IAAUjC,EAAQ,MAC/BuD,EAA+BjG,EAAAA,OAAa0F,CAAU,EAC5DzE,OAAAA,EAAAA,UAAgB,IAAM,CACpB,MAAMiF,EAAM,sBAAsB,IAAMD,EAA6B,QAAU,EAAK,EACpF,MAAO,IAAM,qBAAqBC,CAAG,CACvC,EAAG,CAAA,CAAE,EACkB/G,EAAAA,IAAIgH,GAAU,CAAE,QAASJ,GAAcL,EAAY,SAAU,CAAC,CAAE,QAAAU,CAAO,IAAuBjH,EAAAA,IACnHmC,EAAU,IACV,CACE,aAAcoE,EAAa,SAAW,WACtC,mBAAoBhD,EAAQ,YAC5B,KAAM,WACN,kBAAmB4C,EACnB,OAAQ,CAACc,EACT,GAAIZ,EACJ,SAAU,EACV,GAAGQ,EACH,IAAK9G,EACL,MAAO,CACL,GAAGD,EAAM,MACT,kBAAmBgH,EAA6B,QAAU,KAAO,MAC3E,EACQ,SAAUG,GAAW/D,CAC7B,CACA,EAAO,CACL,CACF,EACAyD,GAAY,YAAcD,GAC1B,SAASN,GAAcc,EAAQ1B,EAAO,CACpC,MAAO,GAAG0B,CAAM,YAAY1B,CAAK,EACnC,CACA,SAASc,GAAcY,EAAQ1B,EAAO,CACpC,MAAO,GAAG0B,CAAM,YAAY1B,CAAK,EACnC,CACA,IAAI2B,GAAQlC,GACRmC,GAAOzB,GACP0B,GAAUrB,GACVsB,EAAUX,GC3LP,SAASY,GAAgB,CAC/B,OAAAC,CACD,EAEG,CACF,MAAMC,EAAS,CACd,QAAS,CACR,OAAQ,eACR,OAAQ,cAAA,EAET,OAAQ,CACP,OAAQ,cAAA,EAET,OAAQ,CACP,OAAQ,YAAA,EAET,QAAS,CACR,OAAQ,aAAA,CACT,EACCD,CAAM,EACR,OACCE,EAAAA,KAAC,OAAA,CAAK,UAAU,wBACd,SAAA,CAAAD,EAAO,OACPzH,EAAAA,IAAC,OAAA,CACA,UAAW,gEAAgEyH,EAAO,MAAM,aAAA,CAAA,EAEtF,KACJzH,EAAAA,IAAC,OAAA,CACA,UAAW,6CAA6CyH,EAAO,MAAM,EAAA,CAAA,CACtE,EACD,CAEF,CCvBO,SAASE,IAAc,CAC7B,OACCD,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACd,SAAA,CAAA1H,MAAC,MAAA,CAAI,UAAU,cACd,SAAAA,MAAC4H,KAAW,EACb,QACC,MAAA,CAAI,UAAU,mFACd,SAAA5H,EAAAA,IAAC6H,KAAa,CAAA,CACf,CAAA,EACD,CAEF,CAEA,SAASA,IAAe,CACvB,MAAMC,EAAOC,GAAA,EACPC,EAAUC,GAAA,EACVC,EAAUC,EAAA,EAEhB,OADiBC,GAAA,EAahBV,EAAAA,KAAC,MAAA,CAAI,UAAU,oDACd,SAAA,CAAA1H,EAAAA,IAACqI,EAAAA,SAAA,CACA,eACE,MAAA,CAAI,UAAU,0DACd,SAAArI,EAAAA,IAACsI,GAAA,CAAQ,iCAAqB,CAAA,CAC/B,EAGD,SAAAtI,EAAAA,IAACuI,GAAA,CACA,QAAST,EAAK,oBACd,aACC9H,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAe,SAAA,gDAE9B,EAGA,SAACwI,GACDxI,EAAAA,IAAC,KAAA,CAAG,UAAU,yCACZ,SAAAwI,EAAM,IAAKC,GACXzI,EAAAA,IAAC,KAAA,CAEA,UAAU,sJAEV,SAAAA,EAAAA,IAAC0I,GAAA,CAAY,OAAQD,CAAA,CAAM,CAAA,EAHtBA,EAAK,EAAA,CAKX,CAAA,CACF,CAAA,CAAA,CAEF,CAAA,QAEA,MAAA,CACA,SAAAf,EAAAA,KAACiB,EAAA,CACA,GACCT,GAAW,CAACF,EAAQ,SAAS,OAAO,EACjCA,EAAQ,QAAQ,SAAU,SAAS,EACnCA,EAEJ,OAAQA,EAAQ,SAAS,OAAO,EAAI,OAAY,SAChD,IAAI,sBACJ,QACCE,EACIU,GAAM,CACPA,EAAE,eAAA,EACF,OAAO,KACNA,EAAE,cAAc,KAChB,SACA,qBAAA,CAEF,EACC,OAEJ,UAAU,sDACV,SAAA,CAAA,eACY5I,EAAAA,IAAC6I,EAAA,CAAK,KAAK,cAAA,CAAe,CAAA,CAAA,CAAA,CACvC,CACD,CAAA,EACD,QAlEE,MAAA,CAAI,UAAU,oDACd,SAAA7I,EAAAA,IAAC,OAAI,UAAU,sFACd,SAAAA,EAAAA,IAAC6I,EAAA,CAAK,KAAK,mBAAmB,KAAK,KAAK,SAAA,8CAAA,CAExC,EACD,EACD,CA8DH,CAEA,SAASH,GAAY,CACpB,OAAAI,CACD,EAIG,CACF,MAAMC,EAAsBD,EAAO,UAAU,OAAQ,GAAM,EAAE,KAAK,EAElE,OACC9I,EAAAA,IAAC,MAAA,CACA,SAAA0H,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAoB,EAAO,KAAK,OACZ9I,EAAAA,IAAC,MAAA,CAAI,UAAU,aACb,SAAA8I,EAAO,KAAK,IAAKE,GACjBtB,EAAAA,KAAC,MAAA,CAEA,UAAU,kFAEV,SAAA,CAAA1H,EAAAA,IAAC,OAAA,CAAK,UAAU,oBACf,SAAAA,EAAAA,IAACiJ,EAAA,CAAM,KAAMD,EAAE,UAAW,IAAKA,EAAE,QAAA,CAAU,EAC5C,EACAhJ,EAAAA,IAAC,OAAA,CAAM,SAAAgJ,EAAE,IAAA,CAAK,CAAA,CAAA,EANTA,EAAE,IAAA,CAQR,EACF,EACG,KACJhJ,EAAAA,IAAC,SAAA,CAAO,UAAU,oBAAqB,WAAO,KAAK,EACnD0H,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAoB,EAAO,gBACP9I,EAAAA,IAAC,MAAA,CACA,IAAK8I,EAAO,gBACZ,IAAI,GACJ,UAAU,sBAAA,CAAA,EAER,YACH,OAAA,CACA,SAAA,CAAA9I,EAAAA,IAAC,OAAA,CACA,UAAU,YACV,MACC8I,EAAO,qBACJ,CAAE,MAAOA,EAAO,oBAAA,EAChB,CAAA,EAGH,SAAAA,EAAO,iBAAA,CAAA,EACF,IACL,GAAA,CAAA,CACH,CAAA,EACD,EACA9I,EAAAA,IAAC,OAAA,CAAK,UAAU,iDACd,WAAO,cAAA,CACT,CAAA,CAAA,CACD,CAAA,EACD,EACC8I,EAAO,gBACP9I,EAAAA,IAAC,MAAA,CACA,IAAK8I,EAAO,gBACZ,IAAI,GACJ,UAAU,mCAAA,CAAA,EAER,IAAA,EACL,EAEApB,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAA1H,EAAAA,IAAC,OAAA,CACC,SAAA+I,EAAoB,OACpB/I,EAAAA,IAAC,KAAA,CAAG,UAAU,0BACZ,SAAA+I,EAAoB,IAAI,CAAC,EAAGG,IAC5BxB,EAAAA,KAAC,KAAA,CAEA,UAAU,uGAEV,SAAA,CAAA1H,EAAAA,IAAC,OAAA,CAAK,UAAU,oBACf,SAAAA,EAAAA,IAACiJ,EAAA,CAAM,KAAM,EAAE,UAAW,IAAK,EAAE,QAAA,CAAU,EAC5C,EACAjJ,EAAAA,IAAC,OAAA,CAAM,SAAA,EAAE,KAAA,CAAM,CAAA,CAAA,EANVkJ,CAAA,CAQN,CAAA,CACF,EACG,KACL,EACAxB,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACf,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACf,SAAA,CAAA1H,EAAAA,IAAC6I,EAAA,CAAK,KAAK,MAAA,CAAO,EAAE,IAAEC,EAAO,YAAA,EAC9B,EACC,MAAMA,EAAO,kBAAkB,EAAA,CAAA,CACjC,CAAA,EACD,EACApB,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACf,SAAA,CAAA1H,EAAAA,IAAC,IAAA,CAAE,KAAM8I,EAAO,KAAK,QAAQ,SAAU,SAAS,EAC/C,SAAA9I,EAAAA,IAAC6I,EAAA,CAAK,KAAK,SAAA,CAAU,EACtB,EACA7I,EAAAA,IAAC,IAAA,CAAE,KAAM8I,EAAO,KAAM,OAAO,SAAS,IAAI,sBACzC,SAAA9I,MAAC6I,EAAA,CAAK,KAAK,eAAe,CAAA,CAC3B,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,CAEF,CAEA,SAASI,EAAM,CAAE,KAAAE,EAAM,IAAAC,GAAwC,CAC9D,OAAOA,EACNpJ,EAAAA,IAAC,MAAA,CAAI,IAAKoJ,EAAK,IAAKD,EAAM,UAAU,eAAA,CAAgB,EACjDA,GAEA,IACL,CC5MO,SAASE,GAAW,CAC1B,QAASC,EACT,oBAAAC,EACA,eAAAC,EACA,QAAAC,EACA,WAAAC,CACD,EAMG,CACF,OACC1J,EAAAA,IAAC2J,GAAA,CACA,kBAAmBL,GAAmB,QACtC,eAAAE,EACA,QAAAC,EACA,WAAAC,EAEC,YAAmB,IAAI,OAAS,OAChChC,OAAC,MAAA,CAAI,UAAU,yDACd,SAAA,CAAA1H,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAqC,SAAA,kBAEpD,EACA0H,EAAAA,KAAC,MAAA,CAAI,UAAU,8DAA8D,SAAA,CAAA,mEACX,UAChE,KAAA,EAAG,EAAE,cACM,IACZ1H,EAAAA,IAAC4J,GAAA,CAAc,QAASN,EAAkB,SACzC,SAAA5B,EAAAA,KAAC,OAAA,CACA,UAAU,4DACV,QAAS,IAAM,CACT,UAAU,UAAU,UAAU4B,EAAkB,QAAQ,EAC7DO,GAAU,QAAQ,qCAAqC,CACxD,EACA,SAAA,CAAA,2BAEA7J,EAAAA,IAAC6I,EAAA,CAAK,KAAK,OAAO,KAAK,IAAA,CAAK,CAAA,CAAA,CAAA,EAE9B,EAAiB,IAAI,qEAAA,CAAA,CAEtB,CAAA,CAAA,CACD,EACGS,EACHtJ,EAAAA,IAAC8J,EAAA,CACA,GAAIR,EAAkB,QACtB,QAASA,EACT,oBAAAC,CAAA,CAAA,EAGD7B,EAAAA,KAAC,MAAA,CAAI,UAAU,qCACd,SAAA,CAAA1H,EAAAA,IAAC,KAAE,SAAA,iCAAA,CAA+B,EACjCwJ,EACAxJ,EAAAA,IAAC+J,GAAA,CAAmB,QAASP,EAAgB,EAC1C,IAAA,CAAA,CACL,CAAA,CAAA,CAIJ,CC2IA,MAAMQ,EAAO,CACZ,aACA,UACA,WACA,QACA,OACA,MAAA,EAEKC,GAAkBC,GACvBC,GAAQD,GAAKF,EAAKI,SAASF,CAA0B,GAEtD,SAASG,GACRC,EACArG,EACAuB,EACC,CACD,MAAM+E,EAAkB,IAAIC,gBAAgBF,CAAY,EACxD,OAAI9E,IAAU,KACb+E,EAAgBE,OAAOxG,CAAG,EAE1BsG,EAAgBG,IAAIzG,EAAKuB,CAAK,EAExB+E,CACR,CAEA,MAAA9F,GAAAkG,GAAA,SAA0C,CACzCC,WAAAA,CACD,EAAyB,CACxB,KAAM,CAAErB,oBAAAA,GAAwBsB,GAAA,EAG1BC,EAAiBC,GAAA,EACjB,CAACT,CAAY,EAAIU,GAAA,EAEjBC,EAAUX,EAAaY,IAAI,SAAS,EAEpChD,EAAUC,EAAA,EACVgD,EAAWC,GAAA,EAEjB,SAASC,EAAcC,EAA4B,CAClD,GAAIA,IAAQ,QACX,OACCC,IAAIC,mBACJ,CAACZ,EAAWa,YACZb,EAAWa,WAAWC,KAAKC,OAAS,OAGtC,GAAIL,IAAQ,WAAaA,IAAQ,WAAY,CAC5C,GAAIV,EAAWU,CAAG,GAAGM,IAAID,OAAS,OAAQ,MAAO,GACjD,GAAIJ,IAAIC,kBACP,OACCZ,EAAWU,CAAG,GAAGM,IAAID,OAAS,WAC9B,CAACf,EAAWU,CAAG,GAAGO,aAGrB,CACA,OAAIP,IAAQ,cAAgBC,IAAIC,kBAA0B,GAEtDF,IAAQ,OACJ,CAACR,EAAegB,QAAQC,iBAEzB,EACR,CAEA,SAASC,EACRV,EACyC,CACzC,GAAIA,IAAQ,QAAS,CACpB,GAAI,CAACV,EAAWa,WAAY,OAAO,KACnC,KAAM,CAAEQ,cAAAA,EAAeC,aAAAA,GAAiBtB,EAAWa,WACnD,OAAIQ,EAAsB,UACtBC,IAAiB,EAAU,SAC3BA,IAAiB,MAAQA,IAAiB,EAAU,SACjD,IACR,CACA,OAAIZ,IAAQ,WAAaA,IAAQ,YAAcA,IAAQ,gBAErDA,IAAQ,aAAeV,EAAWa,WAAab,EAAWU,CAAG,IACjDa,UAAkB,UAEzB,IACR,CAEA,MAAMC,EAAYnC,GAAegB,CAAO,EACrCA,EACAjB,EAAKqC,KAAMrD,GAAM,CAACqC,EAAcrC,CAAC,CAAC,EAI/BsD,EAAa,SAAS,IAAI9B,gBAAgB,CAC/C+B,KAAM3B,EAAW4B,SAASrD,MAAQ,GAClCsD,KAAM7B,EAAW8B,UAAUvD,MAAQ,EACpC,CAAC,CAAC,GAEF,SAASwD,EAAmBtK,EAA4C,CACnEA,EAAMuK,QAAU,CAACvK,EAAMwK,SAAW,CAACxK,EAAMyK,UAAY,CAACzK,EAAM0K,UAC/D1K,EAAM2K,eAAA,EACD7B,EAASmB,CAAU,EAE1B,CAEA,OACC5E,EAAAA,KAACzC,GAAA,CACAgI,UAAU,4FACVzH,MAAO4G,EAIPlJ,SAAA,CAAAlD,EAAAA,IAACiF,GAAA,CAAUgI,UAAU,oGACnB/J,SAAA8G,EAAKkD,IAAK5B,GAAQ,CAClB,MAAM6B,EAAS9B,EAAcC,CAAG,EAC1B9D,EAASwE,EAAaV,CAAG,EAC/B,OACCtL,EAAAA,IAACiF,GAAA,CAAuBO,MAAO8F,EAAK6B,OAAAA,EAAgBC,QAAO,GAC1DlK,SAAAlD,EAAAA,IAAC2I,EAAA,CACArF,GAAI,GAAGgI,CAAG,OACV2B,UAAWI,GACV,kZACAF,EAAS,SAAW,cACrB,EACAG,mBAAkB,GAClBC,SAAS,SACTC,QAASb,EACTc,GACCnC,IAAQ,QAAUpD,EACfoE,EACA,IAAIjC,GACJC,EACA,UACAgB,IAAQ,aAAe,KAAOA,CAC/B,CAAC,GAGJpI,SAAAwE,EAAAA,KAAC,OAAA,CAAKuF,UAAU,0BACd/J,SAAA,CAAAsE,GAAUxH,EAAAA,IAACuH,IAAgBC,OAAAA,CAAA,CAAgB,EAC5CxH,EAAAA,IAAC,QAAMkD,SAAAoI,CAAA,CAAI,CAAA,EACZ,EACD,GAxBkBA,CAyBnB,CAEF,CAAC,CAAA,CACF,EACA5D,EAAAA,KAAC,MAAA,CAAIuF,UAAU,6DACd/J,SAAA,CAAAlD,EAAAA,IAACiF,EAAA,CACAO,MAAM,aACNyH,UAAU,uGACVrG,WAAU,GAEV1D,SAAAlD,EAAAA,IAACqJ,GAAA,CACAqE,QAAS9C,EAAWa,WACpBjC,eAAgBoB,EAAW4B,SAASrD,KACpCI,oBAAAA,EACAE,QAASmB,EAAWnB,QACpBC,WAAYkB,EAAWa,YAAY/B,YAAc,GAClD,EACD,EACA1J,EAAAA,IAACiF,EAAA,CACAO,MAAM,UACNyH,UAAU,uGACVrG,WAAU,GAEV1D,SAAAlD,EAAAA,IAAC8J,EAAA,CACA4D,QAAS9C,EAAW4B,QACpBjD,oBAAAA,EACD,EACD,EACAvJ,EAAAA,IAACiF,EAAA,CACAO,MAAM,WACNyH,UAAU,uGACVrG,WAAU,GAEV1D,SAAAlD,EAAAA,IAAC8J,EAAA,CACA4D,QAAS9C,EAAW8B,SACpBnD,oBAAAA,EACD,EACD,EACAvJ,EAAAA,IAACiF,EAAA,CACAO,MAAM,QACNyH,UAAU,uHAEV/J,SAAAlD,EAAAA,IAAC2N,GAAA,CACAD,QAAS9C,EAAWa,WACpBjC,eAAgBoB,EAAW4B,SAASrD,KACpCM,QAASmB,EAAWnB,QACpBC,WAAYkB,EAAWa,YAAY/B,YAAc,GACjDkE,qBAAsBhD,EAAWgD,qBAClC,EACD,EACA5N,EAAAA,IAACiF,EAAA,CACAO,MAAM,OACNyH,UAAU,8GAEV/J,SAAAlD,EAAAA,IAAC6N,GAAA,CACAC,KAAMlD,EAAWkD,KACjBrE,QAASmB,EAAWnB,QACpBmE,qBAAsBhD,EAAWgD,qBAClC,EACD,EACA5N,EAAAA,IAACiF,EAAA,CACAO,MAAM,OACNyH,UAAU,8GAEV/J,eAACyE,GAAA,CAAA,CAAY,CAAA,CACd,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAEF,CAAA,EAEOoG,GAAAC,GAAA,UAAyB,CAC/B,OACChO,EAAAA,IAACiO,GAAA,CACAC,eAAgB,CACf,IAAK,IAAMlO,EAAAA,IAAC,IAAA,CAAEkD,SAAA,uCAAoC,CACnD,CAAA,CACD,CAEF,CAAA","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"index-CDG5ZZjr.js","sources":["../../../../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../../../../node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../app/components/status-indicator.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/discord.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/playground.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index.tsx"],"sourcesContent":["\"use client\";\n\n// src/roving-focus-group.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar ENTRY_FOCUS = \"rovingFocusGroup.onEntryFocus\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar GROUP_NAME = \"RovingFocusGroup\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(GROUP_NAME);\nvar [createRovingFocusGroupContext, createRovingFocusGroupScope] = createContextScope(\n GROUP_NAME,\n [createCollectionScope]\n);\nvar [RovingFocusProvider, useRovingFocusContext] = createRovingFocusGroupContext(GROUP_NAME);\nvar RovingFocusGroup = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(RovingFocusGroupImpl, { ...props, ref: forwardedRef }) }) });\n }\n);\nRovingFocusGroup.displayName = GROUP_NAME;\nvar RovingFocusGroupImpl = React.forwardRef((props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n orientation,\n loop = false,\n dir,\n currentTabStopId: currentTabStopIdProp,\n defaultCurrentTabStopId,\n onCurrentTabStopIdChange,\n onEntryFocus,\n preventScrollOnEntryFocus = false,\n ...groupProps\n } = props;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const direction = useDirection(dir);\n const [currentTabStopId, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId ?? null,\n onChange: onCurrentTabStopIdChange,\n caller: GROUP_NAME\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const handleEntryFocus = useCallbackRef(onEntryFocus);\n const getItems = useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = React.useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n node.addEventListener(ENTRY_FOCUS, handleEntryFocus);\n return () => node.removeEventListener(ENTRY_FOCUS, handleEntryFocus);\n }\n }, [handleEntryFocus]);\n return /* @__PURE__ */ jsx(\n RovingFocusProvider,\n {\n scope: __scopeRovingFocusGroup,\n orientation,\n dir: direction,\n loop,\n currentTabStopId,\n onItemFocus: React.useCallback(\n (tabStopId) => setCurrentTabStopId(tabStopId),\n [setCurrentTabStopId]\n ),\n onItemShiftTab: React.useCallback(() => setIsTabbingBackOut(true), []),\n onFocusableItemAdd: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount + 1),\n []\n ),\n onFocusableItemRemove: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount - 1),\n []\n ),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation,\n ...groupProps,\n ref: composedRefs,\n style: { outline: \"none\", ...props.style },\n onMouseDown: composeEventHandlers(props.onMouseDown, () => {\n isClickFocusRef.current = true;\n }),\n onFocus: composeEventHandlers(props.onFocus, (event) => {\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item) => item.focusable);\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === currentTabStopId);\n const candidateItems = [activeItem, currentItem, ...items].filter(\n Boolean\n );\n const candidateNodes = candidateItems.map((item) => item.ref.current);\n focusFirst(candidateNodes, preventScrollOnEntryFocus);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false))\n }\n )\n }\n );\n});\nvar ITEM_NAME = \"RovingFocusGroupItem\";\nvar RovingFocusGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n focusable = true,\n active = false,\n tabStopId,\n children,\n ...itemProps\n } = props;\n const autoId = useId();\n const id = tabStopId || autoId;\n const context = useRovingFocusContext(ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd, onFocusableItemRemove, currentTabStopId } = context;\n React.useEffect(() => {\n if (focusable) {\n onFocusableItemAdd();\n return () => onFocusableItemRemove();\n }\n }, [focusable, onFocusableItemAdd, onFocusableItemRemove]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeRovingFocusGroup,\n id,\n focusable,\n active,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation,\n ...itemProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!focusable) event.preventDefault();\n else context.onItemFocus(id);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => context.onItemFocus(id)),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Tab\" && event.shiftKey) {\n context.onItemShiftTab();\n return;\n }\n if (event.target !== event.currentTarget) return;\n const focusIntent = getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== void 0) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n event.preventDefault();\n const items = getItems().filter((item) => item.focusable);\n let candidateNodes = items.map((item) => item.ref.current);\n if (focusIntent === \"last\") candidateNodes.reverse();\n else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = context.loop ? wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n }\n }),\n children: typeof children === \"function\" ? children({ isCurrentTabStop, hasTabStop: currentTabStopId != null }) : children\n }\n )\n }\n );\n }\n);\nRovingFocusGroupItem.displayName = ITEM_NAME;\nvar MAP_KEY_TO_FOCUS_INTENT = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\"\n};\nfunction getDirectionAwareKey(key, dir) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\" ? \"ArrowRight\" : key === \"ArrowRight\" ? \"ArrowLeft\" : key;\n}\nfunction getFocusIntent(event, orientation, dir) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key)) return void 0;\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key)) return void 0;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction focusFirst(candidates, preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root = RovingFocusGroup;\nvar Item = RovingFocusGroupItem;\nexport {\n Item,\n Root,\n RovingFocusGroup,\n RovingFocusGroupItem,\n createRovingFocusGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue ?? \"\",\n caller: TABS_NAME\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if ([\" \", \"Enter\"].includes(event.key)) context.onValueChange(value);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","export function StatusIndicator({\n\tstatus,\n}: {\n\tstatus: 'running' | 'passed' | 'failed' | 'stopped'\n}) {\n\tconst colors = {\n\t\trunning: {\n\t\t\tpinger: 'bg-green-400',\n\t\t\tcircle: 'bg-green-500',\n\t\t},\n\t\tpassed: {\n\t\t\tcircle: 'bg-green-500',\n\t\t},\n\t\tfailed: {\n\t\t\tcircle: 'bg-red-500',\n\t\t},\n\t\tstopped: {\n\t\t\tcircle: 'bg-gray-500',\n\t\t},\n\t}[status]\n\treturn (\n\t\t<span className=\"relative flex h-3 w-3\">\n\t\t\t{colors.pinger ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={`absolute inline-flex h-full w-full animate-ping rounded-full ${colors.pinger} opacity-75`}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tclassName={`relative inline-flex h-3 w-3 rounded-full ${colors.circle}`}\n\t\t\t/>\n\t\t</span>\n\t)\n}\n","import * as React from 'react'\nimport { Await, Link, useLoaderData } from 'react-router'\nimport { Icon } from '#app/components/icons.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { DiscordCTA, useDiscordCTALink } from '#app/routes/_app+/discord.tsx'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport { type Route } from '../+types/index.tsx'\n\nexport function DiscordChat() {\n\treturn (\n\t\t<div className=\"flex h-full w-full flex-col gap-4 pt-4\">\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<DiscordCTA />\n\t\t\t</div>\n\t\t\t<div className=\"bg-accent scrollbar-thin scrollbar-thumb-scrollbar flex-1 overflow-y-scroll pb-4\">\n\t\t\t\t<DiscordPosts />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPosts() {\n\tconst data = useLoaderData<Route.ComponentProps['loaderData']>()\n\tconst ctaLink = useDiscordCTALink()\n\tconst altDown = useAltDown()\n\tconst isOnline = useIsOnline()\n\tif (!isOnline) {\n\t\treturn (\n\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t<div className=\"text-foreground-destructive flex h-full w-full flex-col items-center justify-center\">\n\t\t\t\t\t<Icon name=\"WifiNoConnection\" size=\"xl\">\n\t\t\t\t\t\tUnable to load discord messages when offline\n\t\t\t\t\t</Icon>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\treturn (\n\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t<React.Suspense\n\t\t\t\tfallback={\n\t\t\t\t\t<div className=\"flex h-full w-full flex-col items-center justify-center\">\n\t\t\t\t\t\t<Loading>Loading Discord Posts</Loading>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Await\n\t\t\t\t\tresolve={data.discordPostsPromise}\n\t\t\t\t\terrorElement={\n\t\t\t\t\t\t<div className=\"text-red-500\">\n\t\t\t\t\t\t\tThere was a problem loading the discord posts\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{(posts) => (\n\t\t\t\t\t\t<ul className=\"flex w-full flex-col gap-4 p-3 xl:p-12\">\n\t\t\t\t\t\t\t{posts.map((post) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={post.id}\n\t\t\t\t\t\t\t\t\tclassName=\"bg-background rounded-xl border transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<DiscordPost thread={post} />\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</Await>\n\t\t\t</React.Suspense>\n\t\t\t<div>\n\t\t\t\t<Link\n\t\t\t\t\tto={\n\t\t\t\t\t\taltDown && !ctaLink.includes('oauth')\n\t\t\t\t\t\t\t? ctaLink.replace(/^https/, 'discord')\n\t\t\t\t\t\t\t: ctaLink\n\t\t\t\t\t}\n\t\t\t\t\ttarget={ctaLink.includes('oauth') ? undefined : '_blank'}\n\t\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t\t\tonClick={\n\t\t\t\t\t\taltDown\n\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\twindow.open(\n\t\t\t\t\t\t\t\t\t\te.currentTarget.href,\n\t\t\t\t\t\t\t\t\t\t'_blank',\n\t\t\t\t\t\t\t\t\t\t'noreferrer noopener',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclassName=\"flex items-center gap-2 p-2 text-xl hover:underline\"\n\t\t\t\t>\n\t\t\t\t\tCreate Post <Icon name=\"ExternalLink\" />\n\t\t\t\t</Link>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPost({\n\tthread,\n}: {\n\tthread: Awaited<\n\t\tRoute.ComponentProps['loaderData']['discordPostsPromise']\n\t>[number]\n}) {\n\tconst reactionsWithCounts = thread.reactions.filter((r) => r.count)\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t{thread.tags.length ? (\n\t\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t{thread.tags.map((t) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={t.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"bg-accent flex items-center justify-center gap-1 rounded-full px-2 py-1 text-sm\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t<Emoji name={t.emojiName} url={t.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>{t.name}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<strong className=\"text-xl font-bold\">{thread.name}</strong>\n\t\t\t\t\t\t<div className=\"flex items-start gap-1\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t{thread.authorAvatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={thread.authorAvatarUrl}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-bold\"\n\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\tthread.authorHexAccentColor\n\t\t\t\t\t\t\t\t\t\t\t\t? { color: thread.authorHexAccentColor }\n\t\t\t\t\t\t\t\t\t\t\t\t: {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{thread.authorDisplayName}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t:{' '}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground flex-1 overflow-ellipsis\">\n\t\t\t\t\t\t\t\t{thread.messagePreview}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{thread.previewImageUrl ? (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={thread.previewImageUrl}\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tclassName=\"h-28 w-28 rounded-lg object-cover\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{reactionsWithCounts.length ? (\n\t\t\t\t\t\t\t\t<ul className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{reactionsWithCounts.map((r, i) => (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Emoji name={r.emojiName} url={r.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{r.count}</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1\">\n\t\t\t\t\t\t\t\t<Icon name=\"Chat\" /> {thread.messageCount}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{` · ${thread.lastUpdatedDisplay}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"flex items-center gap-4\">\n\t\t\t\t\t\t<a href={thread.link.replace(/^https/, 'discord')}>\n\t\t\t\t\t\t\t<Icon name=\"Discord\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href={thread.link} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Emoji({ name, url }: { name?: string; url?: string }) {\n\treturn url ? (\n\t\t<img src={url} alt={name} className=\"h-full w-full\" />\n\t) : name ? (\n\t\tname\n\t) : null\n}\n","import { toast as showToast } from 'sonner'\nimport { Icon } from '#app/components/icons.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser'\nimport { SimpleTooltip } from '#app/components/ui/tooltip'\nimport { SetAppToPlayground } from '#app/routes/set-playground'\nimport { PlaygroundWindow } from './playground-window'\nimport { Preview } from './preview'\n\nexport function Playground({\n\tappInfo: playgroundAppInfo,\n\tinBrowserBrowserRef,\n\tproblemAppName,\n\tallApps,\n\tisUpToDate,\n}: {\n\tappInfo: Parameters<typeof Preview>['0']['appInfo'] | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n\tproblemAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n\tisUpToDate: boolean\n}) {\n\treturn (\n\t\t<PlaygroundWindow\n\t\t\tplaygroundAppName={playgroundAppInfo?.appName}\n\t\t\tproblemAppName={problemAppName}\n\t\t\tallApps={allApps}\n\t\t\tisUpToDate={isUpToDate}\n\t\t>\n\t\t\t{playgroundAppInfo?.dev.type === 'none' ? (\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-center gap-4\">\n\t\t\t\t\t<div className=\"text-secondary-foreground text-2xl\">\n\t\t\t\t\t\tNon-UI exercise\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-secondary-foreground max-w-md text-center text-balance\">\n\t\t\t\t\t\tThis exercise has no application or other UI associated with it.{' '}\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\tNavigate to{' '}\n\t\t\t\t\t\t<SimpleTooltip content={playgroundAppInfo.fullPath}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"inline-flex cursor-pointer items-center gap-1.5 underline\"\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(playgroundAppInfo.fullPath)\n\t\t\t\t\t\t\t\t\tshowToast.success('Copied playground path to clipboard')\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tthe playground directory\n\t\t\t\t\t\t\t\t<Icon name=\"Copy\" size=\"sm\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</SimpleTooltip>{' '}\n\t\t\t\t\t\tin your editor and follow the exercise instructions to complete it.\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : playgroundAppInfo ? (\n\t\t\t\t<Preview\n\t\t\t\t\tid={playgroundAppInfo.appName}\n\t\t\t\t\tappInfo={playgroundAppInfo}\n\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col justify-center gap-2\">\n\t\t\t\t\t<p>Please set the playground first</p>\n\t\t\t\t\t{problemAppName ? (\n\t\t\t\t\t\t<SetAppToPlayground appName={problemAppName} />\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PlaygroundWindow>\n\t)\n}\n","import {\n\tgetAppByName,\n\tgetAppDisplayName,\n\tgetApps,\n\tgetExerciseApp,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getDiffCode } from '@epic-web/workshop-utils/diff.server'\nimport { userHasAccessToExerciseStep } from '@epic-web/workshop-utils/epic-api.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport * as Tabs from '@radix-ui/react-tabs'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport {\n\tLink,\n\tuseNavigate,\n\tuseSearchParams,\n\tdata,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\tuseOutletContext,\n} from 'react-router'\nimport { Diff } from '#app/components/diff.tsx'\nimport { GeneralErrorBoundary } from '#app/components/error-boundary.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { StatusIndicator } from '#app/components/status-indicator.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.tsx'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { type Route } from './+types/index.ts'\nimport { fetchDiscordPosts } from './__shared/discord.server.ts'\nimport { DiscordChat } from './__shared/discord.tsx'\nimport { Playground } from './__shared/playground.tsx'\nimport { Preview } from './__shared/preview.tsx'\nimport { Tests } from './__shared/tests.tsx'\nimport { getAppRunningState, getTestState } from './__shared/utils.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseStepTypeIndexLoader')\n\tconst searchParams = new URL(request.url).searchParams\n\tconst cacheOptions = { request, timings }\n\n\tconst [exerciseStepApp, allAppsFull, problemApp, solutionApp] =\n\t\tawait Promise.all([\n\t\t\trequireExerciseApp(params, cacheOptions),\n\t\t\tgetApps(cacheOptions),\n\t\t\tgetExerciseApp({ ...params, type: 'problem' }, cacheOptions),\n\t\t\tgetExerciseApp({ ...params, type: 'solution' }, cacheOptions),\n\t\t])\n\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\n\tconst reqUrl = new URL(request.url)\n\n\tconst pathnameParam = reqUrl.searchParams.get('pathname')\n\tif (pathnameParam === '' || pathnameParam === '/') {\n\t\treqUrl.searchParams.delete('pathname')\n\t\tthrow redirect(reqUrl.toString())\n\t}\n\n\tconst app1Name = reqUrl.searchParams.get('app1')\n\tconst app2Name = reqUrl.searchParams.get('app2')\n\tconst app1 = app1Name\n\t\t? await getAppByName(app1Name)\n\t\t: playgroundApp || problemApp\n\tconst app2 = app2Name ? await getAppByName(app2Name) : solutionApp\n\n\tfunction getStepId(a: ExerciseStepApp) {\n\t\treturn (\n\t\t\ta.exerciseNumber * 1000 +\n\t\t\ta.stepNumber * 10 +\n\t\t\t(a.type === 'problem' ? 0 : 1)\n\t\t)\n\t}\n\n\tfunction getStepNameAndId(a: App) {\n\t\tif (isExerciseStepApp(a)) {\n\t\t\tconst exerciseNumberStr = String(a.exerciseNumber).padStart(2, '0')\n\t\t\tconst stepNumberStr = String(a.stepNumber).padStart(2, '0')\n\n\t\t\treturn {\n\t\t\t\tstepName: `${exerciseNumberStr}/${stepNumberStr}.${a.type}`,\n\t\t\t\tstepId: getStepId(a),\n\t\t\t}\n\t\t}\n\t\treturn { stepName: '', stepId: -1 }\n\t}\n\n\tconst allApps = allAppsFull\n\t\t.filter((a, i, ar) => ar.findIndex((b) => a.name === b.name) === i)\n\t\t.map((a) => ({\n\t\t\tdisplayName: getAppDisplayName(a, allAppsFull),\n\t\t\tname: a.name,\n\t\t\ttitle: a.title,\n\t\t\ttype: a.type,\n\t\t\t...getStepNameAndId(a),\n\t\t}))\n\n\tallApps.sort((a, b) => {\n\t\t// order them by their stepId\n\t\tif (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId\n\n\t\t// non-step apps should come after step apps\n\t\tif (a.stepId > 0) return -1\n\t\tif (b.stepId > 0) return 1\n\n\t\treturn 0\n\t})\n\n\tasync function getDiffProp() {\n\t\tif (!app1 || !app2) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: null,\n\t\t\t}\n\t\t}\n\t\tconst diffCode = await getDiffCode(app1, app2, {\n\t\t\t...cacheOptions,\n\t\t\tforceFresh: searchParams.get('forceFresh') === 'diff',\n\t\t}).catch((e) => {\n\t\t\tconsole.error(e)\n\t\t\treturn null\n\t\t})\n\t\treturn {\n\t\t\tapp1: app1.name,\n\t\t\tapp2: app2.name,\n\t\t\tdiffCode,\n\t\t}\n\t}\n\n\treturn data(\n\t\t{\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\tallApps,\n\t\t\t// defer this promise so that we don't block the response from being sent\n\t\t\tdiscordPostsPromise: fetchDiscordPosts({ request }),\n\t\t\tuserHasAccessPromise: userHasAccessToExerciseStep({\n\t\t\t\texerciseNumber: Number(params.exerciseNumber),\n\t\t\t\tstepNumber: Number(params.stepNumber),\n\t\t\t\trequest,\n\t\t\t\ttimings,\n\t\t\t}),\n\t\t\tplayground: playgroundApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'playground',\n\t\t\t\t\t\tfullPath: playgroundApp.fullPath,\n\t\t\t\t\t\tdev: playgroundApp.dev,\n\t\t\t\t\t\ttest: playgroundApp.test,\n\t\t\t\t\t\ttitle: playgroundApp.title,\n\t\t\t\t\t\tname: playgroundApp.name,\n\t\t\t\t\t\tappName: playgroundApp.appName,\n\t\t\t\t\t\tisUpToDate: playgroundApp.isUpToDate,\n\t\t\t\t\t\tstackBlitzUrl: playgroundApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(playgroundApp)),\n\t\t\t\t\t\t...getTestState(playgroundApp),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tproblem: problemApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'problem',\n\t\t\t\t\t\tfullPath: problemApp.fullPath,\n\t\t\t\t\t\tdev: problemApp.dev,\n\t\t\t\t\t\ttest: problemApp.test,\n\t\t\t\t\t\ttitle: problemApp.title,\n\t\t\t\t\t\tname: problemApp.name,\n\t\t\t\t\t\tstackBlitzUrl: problemApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(problemApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tsolution: solutionApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'solution',\n\t\t\t\t\t\tfullPath: solutionApp.fullPath,\n\t\t\t\t\t\tdev: solutionApp.dev,\n\t\t\t\t\t\ttest: solutionApp.test,\n\t\t\t\t\t\ttitle: solutionApp.title,\n\t\t\t\t\t\tname: solutionApp.name,\n\t\t\t\t\t\tstackBlitzUrl: solutionApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(solutionApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tdiff: getDiffProp(),\n\t\t} as const,\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst tabs = [\n\t'playground',\n\t'problem',\n\t'solution',\n\t'tests',\n\t'diff',\n\t'chat',\n] as const\nconst isValidPreview = (s: string | null): s is (typeof tabs)[number] =>\n\tBoolean(s && tabs.includes(s as (typeof tabs)[number]))\n\nfunction withParam(\n\tsearchParams: URLSearchParams,\n\tkey: string,\n\tvalue: string | null,\n) {\n\tconst newSearchParams = new URLSearchParams(searchParams)\n\tif (value === null) {\n\t\tnewSearchParams.delete(key)\n\t} else {\n\t\tnewSearchParams.set(key, value)\n\t}\n\treturn newSearchParams\n}\n\nexport default function ExercisePartRoute({\n\tloaderData,\n}: Route.ComponentProps) {\n\tconst { inBrowserBrowserRef } = useOutletContext<{\n\t\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n\t}>()\n\tconst workshopConfig = useWorkshopConfig()\n\tconst [searchParams] = useSearchParams()\n\n\tconst preview = searchParams.get('preview')\n\n\tconst altDown = useAltDown()\n\tconst navigate = useNavigate()\n\n\tfunction shouldHideTab(tab: (typeof tabs)[number]) {\n\t\tif (tab === 'tests') {\n\t\t\treturn (\n\t\t\t\tENV.EPICSHOP_DEPLOYED ||\n\t\t\t\t!loaderData.playground ||\n\t\t\t\tloaderData.playground.test.type === 'none'\n\t\t\t)\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution') {\n\t\t\tif (loaderData[tab]?.dev.type === 'none') return true\n\t\t\tif (ENV.EPICSHOP_DEPLOYED) {\n\t\t\t\tconst devType = loaderData[tab]?.dev.type\n\t\t\t\treturn (\n\t\t\t\t\tdevType !== 'browser' &&\n\t\t\t\t\tdevType !== 'export' &&\n\t\t\t\t\t!loaderData[tab]?.stackBlitzUrl\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (tab === 'playground' && ENV.EPICSHOP_DEPLOYED) return true\n\n\t\tif (tab === 'chat') {\n\t\t\treturn !workshopConfig.product.discordChannelId\n\t\t}\n\t\treturn false\n\t}\n\n\tfunction getTabStatus(\n\t\ttab: (typeof tabs)[number],\n\t): 'running' | 'passed' | 'failed' | null {\n\t\tif (tab === 'tests') {\n\t\t\tif (!loaderData.playground) return null\n\t\t\tconst { isTestRunning, testExitCode } = loaderData.playground\n\t\t\tif (isTestRunning) return 'running'\n\t\t\tif (testExitCode === 0) return 'passed'\n\t\t\tif (testExitCode !== null && testExitCode !== 0) return 'failed'\n\t\t\treturn null\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution' || tab === 'playground') {\n\t\t\tconst appData =\n\t\t\t\ttab === 'playground' ? loaderData.playground : loaderData[tab]\n\t\t\tif (appData?.isRunning) return 'running'\n\t\t}\n\t\treturn null\n\t}\n\n\tconst activeTab = isValidPreview(preview)\n\t\t? preview\n\t\t: tabs.find((t) => !shouldHideTab(t))\n\n\t// when alt is held down, the diff tab should open to the full-page diff view\n\t// between the problem and solution (this is more for the instructor than the student)\n\tconst altDiffUrl = `/diff?${new URLSearchParams({\n\t\tapp1: loaderData.problem?.name ?? '',\n\t\tapp2: loaderData.solution?.name ?? '',\n\t})}`\n\n\tfunction handleDiffTabClick(event: React.MouseEvent<HTMLAnchorElement>) {\n\t\tif (event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {\n\t\t\tevent.preventDefault()\n\t\t\tvoid navigate(altDiffUrl)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Tabs.Root\n\t\t\tclassName=\"relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden sm:col-span-1 sm:row-span-1\"\n\t\t\tvalue={activeTab}\n\t\t\t// intentionally no onValueChange here because the Link will trigger the\n\t\t\t// change.\n\t\t>\n\t\t\t<Tabs.List className=\"scrollbar-thin scrollbar-thumb-scrollbar h-14 min-h-14 overflow-x-auto border-b whitespace-nowrap\">\n\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\tconst hidden = shouldHideTab(tab)\n\t\t\t\t\tconst status = getTabStatus(tab)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Tabs.Trigger key={tab} value={tab} hidden={hidden} asChild>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tid={`${tab}-tab`}\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'clip-path-button radix-state-active:z-10 radix-state-active:bg-foreground radix-state-active:text-background radix-state-active:hover:bg-foreground/80 radix-state-active:hover:text-background/80 radix-state-inactive:hover:bg-foreground/20 radix-state-inactive:hover:text-foreground/80 focus:bg-foreground/80 focus:text-background/80 relative h-full px-6 py-4 font-mono text-sm uppercase outline-none',\n\t\t\t\t\t\t\t\t\thidden ? 'hidden' : 'inline-block',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tpreventScrollReset\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tonClick={handleDiffTabClick}\n\t\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\t\ttab === 'diff' && altDown\n\t\t\t\t\t\t\t\t\t\t? altDiffUrl\n\t\t\t\t\t\t\t\t\t\t: `?${withParam(\n\t\t\t\t\t\t\t\t\t\t\t\tsearchParams,\n\t\t\t\t\t\t\t\t\t\t\t\t'preview',\n\t\t\t\t\t\t\t\t\t\t\t\ttab === 'playground' ? null : tab,\n\t\t\t\t\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{status && <StatusIndicator status={status} />}\n\t\t\t\t\t\t\t\t\t<span>{tab}</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</Tabs.List>\n\t\t\t<div className=\"relative z-10 flex min-h-0 flex-1 flex-col overflow-hidden\">\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"playground\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t\tforceMount\n\t\t\t\t>\n\t\t\t\t\t<Playground\n\t\t\t\t\t\tappInfo={loaderData.playground}\n\t\t\t\t\t\tproblemAppName={loaderData.problem?.name}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\tallApps={loaderData.allApps}\n\t\t\t\t\t\tisUpToDate={loaderData.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"problem\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t\tforceMount\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={loaderData.problem}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"solution\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t\tforceMount\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={loaderData.solution}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"tests\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start overflow-hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Tests\n\t\t\t\t\t\tappInfo={loaderData.playground}\n\t\t\t\t\t\tproblemAppName={loaderData.problem?.name}\n\t\t\t\t\t\tallApps={loaderData.allApps}\n\t\t\t\t\t\tisUpToDate={loaderData.playground?.isUpToDate ?? false}\n\t\t\t\t\t\tuserHasAccessPromise={loaderData.userHasAccessPromise}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"diff\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex h-full min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t>\n\t\t\t\t\t<Diff\n\t\t\t\t\t\tdiff={loaderData.diff}\n\t\t\t\t\t\tallApps={loaderData.allApps}\n\t\t\t\t\t\tuserHasAccessPromise={loaderData.userHasAccessPromise}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"chat\"\n\t\t\t\t\tclassName=\"radix-state-inactive:hidden flex h-full min-h-0 w-full grow basis-0 items-stretch justify-center self-start\"\n\t\t\t\t>\n\t\t\t\t\t<DiscordChat />\n\t\t\t\t</Tabs.Content>\n\t\t\t</div>\n\t\t</Tabs.Root>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<GeneralErrorBoundary\n\t\t\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["ENTRY_FOCUS","EVENT_OPTIONS","GROUP_NAME","Collection","useCollection","createCollectionScope","createCollection","createRovingFocusGroupContext","createRovingFocusGroupScope","createContextScope","RovingFocusProvider","useRovingFocusContext","RovingFocusGroup","React.forwardRef","props","forwardedRef","jsx","RovingFocusGroupImpl","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","preventScrollOnEntryFocus","groupProps","ref","React.useRef","composedRefs","useComposedRefs","direction","useDirection","currentTabStopId","setCurrentTabStopId","useControllableState","isTabbingBackOut","setIsTabbingBackOut","React.useState","handleEntryFocus","useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","React.useEffect","node","React.useCallback","tabStopId","prevCount","Primitive","composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","focusFirst","ITEM_NAME","RovingFocusGroupItem","focusable","active","children","itemProps","autoId","useId","id","context","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","getFocusIntent","currentIndex","wrapArray","MAP_KEY_TO_FOCUS_INTENT","getDirectionAwareKey","key","candidates","preventScroll","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","index","Root","Item","TABS_NAME","createTabsContext","useRovingFocusGroupScope","TabsProvider","useTabsContext","Tabs","__scopeTabs","valueProp","onValueChange","defaultValue","activationMode","tabsProps","value","setValue","TAB_LIST_NAME","TabsList","listProps","rovingFocusGroupScope","RovingFocusGroup.Root","TRIGGER_NAME","TabsTrigger","disabled","triggerProps","triggerId","makeTriggerId","contentId","makeContentId","isSelected","RovingFocusGroup.Item","isAutomaticActivation","CONTENT_NAME","TabsContent","forceMount","contentProps","isMountAnimationPreventedRef","rAF","Presence","present","baseId","Root2","List","Trigger","Content","StatusIndicator","status","colors","jsxs","DiscordChat","DiscordCTA","DiscordPosts","data","useLoaderData","ctaLink","useDiscordCTALink","altDown","useAltDown","useIsOnline","React.Suspense","Loading","Await","posts","post","DiscordPost","Link","e","Icon","thread","reactionsWithCounts","t","Emoji","i","name","url","Playground","playgroundAppInfo","inBrowserBrowserRef","problemAppName","allApps","isUpToDate","PlaygroundWindow","SimpleTooltip","showToast","Preview","SetAppToPlayground","tabs","isValidPreview","s","Boolean","includes","withParam","searchParams","newSearchParams","URLSearchParams","delete","set","_UNSAFE_withComponentProps","loaderData","useOutletContext","workshopConfig","useWorkshopConfig","useSearchParams","preview","get","navigate","useNavigate","shouldHideTab","tab","ENV","EPICSHOP_DEPLOYED","playground","test","type","dev","devType","stackBlitzUrl","product","discordChannelId","getTabStatus","isTestRunning","testExitCode","isRunning","activeTab","find","altDiffUrl","app1","problem","app2","solution","handleDiffTabClick","altKey","ctrlKey","shiftKey","metaKey","preventDefault","className","map","hidden","asChild","clsx","preventScrollReset","prefetch","onClick","to","appInfo","Tests","userHasAccessPromise","Diff","diff","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary","statusHandlers"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-DjFfCWKe.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-CW4XEGqi.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-BapXpylh.js","/assets/client-only-DtkKCk_i.js","/assets/error-boundary-C8da5z08.js","/assets/presence-9HHV7YsZ.js","/assets/progress-bar-D66irkpP.js","/assets/index-Dd9cSrtE.js","/assets/tooltip-C2AQeNhD.js","/assets/types-Cl2NuNg4.js","/assets/index-_LzGTKVC.js","/assets/seo-t5J-DRxw.js","/assets/pe-Bs-DFNma.js","/assets/index-Cod-PQ6D.js","/assets/online-Dw7HU4wM.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_-1yI9s8bZ.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-C8da5z08.js","/assets/misc-BapXpylh.js","/assets/index-Az39ZADK.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-CCv2KXTW.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/index-Az39ZADK.js","/assets/pe-Bs-DFNma.js","/assets/product-CGPgWFTC.js","/assets/revalidation-ws-BahUMYqf.js","/assets/presence-9HHV7YsZ.js","/assets/tooltip-C2AQeNhD.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/online-Dw7HU4wM.js","/assets/progress-DJ4oeyzx.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/types-Cl2NuNg4.js","/assets/index-Cod-PQ6D.js","/assets/index-CjiomtK6.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/account-Cs6fPUt5.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Ds94YjAg.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/api.$":{"id":"routes/_app+/app.$appName+/api.$","parentId":"routes/_app+/_layout","path":"app/:appName/api/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/api._-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/epic_ws[.js]":{"id":"routes/_app+/app.$appName+/epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/epic_ws.js","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/index":{"id":"routes/_app+/app.$appName+/index","parentId":"routes/_app+/_layout","path":"app/:appName","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.$testName":{"id":"routes/_app+/app.$appName+/test.$testName","parentId":"routes/_app+/_layout","path":"app/:appName/test/:testName","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test._testName-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.epic_ws[.js]":{"id":"routes/_app+/app.$appName+/test.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/test/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/discord-CuIGDSx9.js","imports":["/assets/discord-CRlZTq2g.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/index-Az39ZADK.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/user-DtZkTMil.js","/assets/root-loader-C5P2c7MU.js","/assets/workshop-config-DCYN9tG7.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-DJDj5-wE.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-CrMXg7Kc.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/epic-video-DQNGJhVF.js","/assets/error-boundary-C8da5z08.js","/assets/revalidation-ws-BahUMYqf.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/mdx-C_z6TweY.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-ChRytjv2.js","/assets/index-Az39ZADK.js","/assets/index-_LzGTKVC.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-D66irkpP.js","/assets/index-Dd9cSrtE.js","/assets/chunk-JG3XND5A-pL43G3x8.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber/:type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_layout-Bm8WMscw.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/index-Az39ZADK.js","/assets/error-boundary-C8da5z08.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/revalidation-ws-BahUMYqf.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/set-playground-kIjHv9mG.js","/assets/misc-BapXpylh.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-ChRytjv2.js","/assets/epic-video-DQNGJhVF.js","/assets/tooltip-C2AQeNhD.js","/assets/mdx-C_z6TweY.js","/assets/index-Cod-PQ6D.js","/assets/preload-helper-BXl3LOEh.js","/assets/types-Cl2NuNg4.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/index--z_DgN94.js","/assets/index-CjiomtK6.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/index-_LzGTKVC.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-Dd9cSrtE.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app-Wqtaq0if.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/preview-CuS2jg4z.js","/assets/misc-BapXpylh.js","/assets/button-Ds94YjAg.js","/assets/loading-DyvhEH4Q.js","/assets/index-_LzGTKVC.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/progress-bar-D66irkpP.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-auYYjXx0.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/tooltip-C2AQeNhD.js","/assets/index--z_DgN94.js","/assets/misc-BapXpylh.js","/assets/diff-CSBF170R.js","/assets/error-boundary-C8da5z08.js","/assets/workshop-config-DCYN9tG7.js","/assets/loading-DyvhEH4Q.js","/assets/discord-CRlZTq2g.js","/assets/online-Dw7HU4wM.js","/assets/index-Dd9cSrtE.js","/assets/set-playground-kIjHv9mG.js","/assets/tests-CA21WazO.js","/assets/preview-CuS2jg4z.js","/assets/index-CjiomtK6.js","/assets/index-Cod-PQ6D.js","/assets/accordion-APJveXWr.js","/assets/mdx-C_z6TweY.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/user-DtZkTMil.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-bar-D66irkpP.js","/assets/revalidation-ws-BahUMYqf.js","/assets/use-event-source-CrGUTTzj.js","/assets/button-Ds94YjAg.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"test","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-gTncEzfm.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/tests-CA21WazO.js","/assets/index-Az39ZADK.js","/assets/accordion-APJveXWr.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/misc-BapXpylh.js","/assets/index--z_DgN94.js","/assets/index-Cod-PQ6D.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/use-event-source-CrGUTTzj.js","/assets/set-playground-kIjHv9mG.js","/assets/progress-bar-D66irkpP.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber.index-Dy66qf8f.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-C8da5z08.js","/assets/error-boundary-ChRytjv2.js","/assets/index-Az39ZADK.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-BapXpylh.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/types-Cl2NuNg4.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-Dpykf0EZ.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/index-Az39ZADK.js","/assets/epic-video-DQNGJhVF.js","/assets/misc-BapXpylh.js","/assets/loading-DyvhEH4Q.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/revalidation-ws-BahUMYqf.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/index-_LzGTKVC.js","/assets/mdx-C_z6TweY.js","/assets/online-Dw7HU4wM.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/types-Cl2NuNg4.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/index-Dd9cSrtE.js","/assets/preload-helper-BXl3LOEh.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/finished-B2yFbqLt.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/index-Az39ZADK.js","/assets/epic-video-DQNGJhVF.js","/assets/misc-BapXpylh.js","/assets/loading-DyvhEH4Q.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/revalidation-ws-BahUMYqf.js","/assets/mdx-C_z6TweY.js","/assets/online-Dw7HU4wM.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/index-_LzGTKVC.js","/assets/types-Cl2NuNg4.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-CjiomtK6.js","/assets/index-Dd9cSrtE.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/tooltip-C2AQeNhD.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-C2q1R-FH.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/epic-video-DQNGJhVF.js","/assets/error-boundary-C8da5z08.js","/assets/launch-editor-FcTaA5kv.js","/assets/mdx-C_z6TweY.js","/assets/misc-BapXpylh.js","/assets/progress-DJ4oeyzx.js","/assets/index-Az39ZADK.js","/assets/index-_LzGTKVC.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-D66irkpP.js","/assets/index-Dd9cSrtE.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/l":{"id":"routes/_app+/l","parentId":"routes/_app+/_layout","path":"l","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/l-Cct_IxW4.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-yLggg23y.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/use-event-source-CrGUTTzj.js","/assets/button-Ds94YjAg.js","/assets/loading-DyvhEH4Q.js","/assets/product-CGPgWFTC.js","/assets/workshop-config-DCYN9tG7.js","/assets/types-Cl2NuNg4.js","/assets/misc-BapXpylh.js","/assets/index-_LzGTKVC.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js"],"css":[]},"routes/_app+/preferences":{"id":"routes/_app+/preferences","parentId":"routes/_app+/_layout","path":"preferences","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/preferences-zUgsPzPt.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Ds94YjAg.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/root-loader-C5P2c7MU.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/support-Df0EnQVB.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/_app+/workspace-structure":{"id":"routes/_app+/workspace-structure","parentId":"routes/_app+/_layout","path":"workspace-structure","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/workspace-structure-DDQsVv9A.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Ds94YjAg.js","/assets/index-Az39ZADK.js","/assets/misc-BapXpylh.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BpAXVqmz.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/root-loader-C5P2c7MU.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache-BC7pviSz.js","imports":["/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/client-only-DtkKCk_i.js","/assets/button-Ds94YjAg.js","/assets/misc-BapXpylh.js","/assets/launch-editor-FcTaA5kv.js","/assets/pe-Bs-DFNma.js","/assets/progress-bar-D66irkpP.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/admin+/cache.$":{"id":"routes/admin+/cache.$","parentId":"routes/admin+/cache","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache._-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/db":{"id":"routes/admin+/db","parentId":"routes/admin+/_layout","path":"db","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/db-Bgj8fG7B.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/launch-editor-FcTaA5kv.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DO6Ta8On.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/progress-DJ4oeyzx.js","/assets/root-loader-C5P2c7MU.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/pe-Bs-DFNma.js"],"css":[]},"routes/admin+/notifications":{"id":"routes/admin+/notifications","parentId":"routes/admin+/_layout","path":"notifications","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/notifications-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version-DqkJKhhX.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-Az39ZADK.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/admin+/version[.json]":{"id":"routes/admin+/version[.json]","parentId":"routes/admin+/_layout","path":"version.json","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version_.json_-l0sNRNKZ.js","imports":[],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff-DHSrZwrp.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/diff-CSBF170R.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/index-Az39ZADK.js","/assets/accordion-APJveXWr.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/index--z_DgN94.js","/assets/index-Cod-PQ6D.js","/assets/mdx-C_z6TweY.js","/assets/index-Dd9cSrtE.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-bar-D66irkpP.js","/assets/revalidation-ws-BahUMYqf.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/diff.$shortcut":{"id":"routes/diff.$shortcut","parentId":"routes/diff","path":":shortcut","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff._shortcut-l0sNRNKZ.js","imports":[],"css":[]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/mcp-ui+/epic-video":{"id":"routes/mcp-ui+/epic-video","parentId":"root","path":"mcp-ui/epic-video","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic-video-D_8dpHsg.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/healthcheck":{"id":"routes/resources+/healthcheck","parentId":"root","path":"resources/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/healthcheck-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/lookout":{"id":"routes/resources+/lookout","parentId":"root","path":"resources/lookout","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/lookout-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-2ee52cac.js","version":"2ee52cac"};
|
|
1
|
+
window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-DjFfCWKe.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-CW4XEGqi.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-BapXpylh.js","/assets/client-only-DtkKCk_i.js","/assets/error-boundary-C8da5z08.js","/assets/presence-9HHV7YsZ.js","/assets/progress-bar-D66irkpP.js","/assets/index-Dd9cSrtE.js","/assets/tooltip-C2AQeNhD.js","/assets/types-Cl2NuNg4.js","/assets/index-_LzGTKVC.js","/assets/seo-t5J-DRxw.js","/assets/pe-Bs-DFNma.js","/assets/index-Cod-PQ6D.js","/assets/online-Dw7HU4wM.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_-1yI9s8bZ.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-C8da5z08.js","/assets/misc-BapXpylh.js","/assets/index-Az39ZADK.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-CCv2KXTW.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/index-Az39ZADK.js","/assets/pe-Bs-DFNma.js","/assets/product-CGPgWFTC.js","/assets/revalidation-ws-BahUMYqf.js","/assets/presence-9HHV7YsZ.js","/assets/tooltip-C2AQeNhD.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/online-Dw7HU4wM.js","/assets/progress-DJ4oeyzx.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/types-Cl2NuNg4.js","/assets/index-Cod-PQ6D.js","/assets/index-CjiomtK6.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/account-Cs6fPUt5.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Ds94YjAg.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/api.$":{"id":"routes/_app+/app.$appName+/api.$","parentId":"routes/_app+/_layout","path":"app/:appName/api/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/api._-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/epic_ws[.js]":{"id":"routes/_app+/app.$appName+/epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/epic_ws.js","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/index":{"id":"routes/_app+/app.$appName+/index","parentId":"routes/_app+/_layout","path":"app/:appName","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.$testName":{"id":"routes/_app+/app.$appName+/test.$testName","parentId":"routes/_app+/_layout","path":"app/:appName/test/:testName","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test._testName-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.epic_ws[.js]":{"id":"routes/_app+/app.$appName+/test.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/test/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/discord-CuIGDSx9.js","imports":["/assets/discord-CRlZTq2g.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/index-Az39ZADK.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/user-DtZkTMil.js","/assets/root-loader-C5P2c7MU.js","/assets/workshop-config-DCYN9tG7.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-DJDj5-wE.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-CrMXg7Kc.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/epic-video-DQNGJhVF.js","/assets/error-boundary-C8da5z08.js","/assets/revalidation-ws-BahUMYqf.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/mdx-C_z6TweY.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-ChRytjv2.js","/assets/index-Az39ZADK.js","/assets/index-_LzGTKVC.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-D66irkpP.js","/assets/index-Dd9cSrtE.js","/assets/chunk-JG3XND5A-pL43G3x8.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber/:type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_layout-COy4UuFj.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/index-Az39ZADK.js","/assets/error-boundary-C8da5z08.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/revalidation-ws-BahUMYqf.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/set-playground-kIjHv9mG.js","/assets/misc-BapXpylh.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-ChRytjv2.js","/assets/epic-video-DQNGJhVF.js","/assets/tooltip-C2AQeNhD.js","/assets/mdx-C_z6TweY.js","/assets/index-Cod-PQ6D.js","/assets/preload-helper-BXl3LOEh.js","/assets/types-Cl2NuNg4.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/index--z_DgN94.js","/assets/index-CjiomtK6.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/index-_LzGTKVC.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-Dd9cSrtE.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app-B-WYurXM.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/preview-CqV1y1NY.js","/assets/misc-BapXpylh.js","/assets/button-Ds94YjAg.js","/assets/loading-DyvhEH4Q.js","/assets/index-_LzGTKVC.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/progress-bar-D66irkpP.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-CDG5ZZjr.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/tooltip-C2AQeNhD.js","/assets/index--z_DgN94.js","/assets/misc-BapXpylh.js","/assets/diff-CSBF170R.js","/assets/error-boundary-C8da5z08.js","/assets/workshop-config-DCYN9tG7.js","/assets/loading-DyvhEH4Q.js","/assets/discord-CRlZTq2g.js","/assets/online-Dw7HU4wM.js","/assets/index-Dd9cSrtE.js","/assets/set-playground-kIjHv9mG.js","/assets/tests-CA21WazO.js","/assets/preview-CqV1y1NY.js","/assets/index-CjiomtK6.js","/assets/index-Cod-PQ6D.js","/assets/accordion-APJveXWr.js","/assets/mdx-C_z6TweY.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/user-DtZkTMil.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-bar-D66irkpP.js","/assets/revalidation-ws-BahUMYqf.js","/assets/use-event-source-CrGUTTzj.js","/assets/button-Ds94YjAg.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"test","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-gTncEzfm.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/tests-CA21WazO.js","/assets/index-Az39ZADK.js","/assets/accordion-APJveXWr.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/misc-BapXpylh.js","/assets/index--z_DgN94.js","/assets/index-Cod-PQ6D.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/use-event-source-CrGUTTzj.js","/assets/set-playground-kIjHv9mG.js","/assets/progress-bar-D66irkpP.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber.index-Dy66qf8f.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-C8da5z08.js","/assets/error-boundary-ChRytjv2.js","/assets/index-Az39ZADK.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-BapXpylh.js","/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/types-Cl2NuNg4.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-Dpykf0EZ.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/index-Az39ZADK.js","/assets/epic-video-DQNGJhVF.js","/assets/misc-BapXpylh.js","/assets/loading-DyvhEH4Q.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/revalidation-ws-BahUMYqf.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/index-_LzGTKVC.js","/assets/mdx-C_z6TweY.js","/assets/online-Dw7HU4wM.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/types-Cl2NuNg4.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/index-Dd9cSrtE.js","/assets/preload-helper-BXl3LOEh.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/finished-B2yFbqLt.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/index-Az39ZADK.js","/assets/epic-video-DQNGJhVF.js","/assets/misc-BapXpylh.js","/assets/loading-DyvhEH4Q.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/revalidation-ws-BahUMYqf.js","/assets/mdx-C_z6TweY.js","/assets/online-Dw7HU4wM.js","/assets/root-loader-C5P2c7MU.js","/assets/seo-t5J-DRxw.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-DJ4oeyzx.js","/assets/index-_LzGTKVC.js","/assets/types-Cl2NuNg4.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-CjiomtK6.js","/assets/index-Dd9cSrtE.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/tooltip-C2AQeNhD.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-C2q1R-FH.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-BwZqB-mh.js","/assets/epic-video-DQNGJhVF.js","/assets/error-boundary-C8da5z08.js","/assets/launch-editor-FcTaA5kv.js","/assets/mdx-C_z6TweY.js","/assets/misc-BapXpylh.js","/assets/progress-DJ4oeyzx.js","/assets/index-Az39ZADK.js","/assets/index-_LzGTKVC.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-D66irkpP.js","/assets/index-Dd9cSrtE.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/l":{"id":"routes/_app+/l","parentId":"routes/_app+/_layout","path":"l","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/l-Cct_IxW4.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-yLggg23y.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/use-event-source-CrGUTTzj.js","/assets/button-Ds94YjAg.js","/assets/loading-DyvhEH4Q.js","/assets/product-CGPgWFTC.js","/assets/workshop-config-DCYN9tG7.js","/assets/types-Cl2NuNg4.js","/assets/misc-BapXpylh.js","/assets/index-_LzGTKVC.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js"],"css":[]},"routes/_app+/preferences":{"id":"routes/_app+/preferences","parentId":"routes/_app+/_layout","path":"preferences","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/preferences-zUgsPzPt.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Ds94YjAg.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/root-loader-C5P2c7MU.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/support-Df0EnQVB.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/_app+/workspace-structure":{"id":"routes/_app+/workspace-structure","parentId":"routes/_app+/_layout","path":"workspace-structure","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/workspace-structure-DDQsVv9A.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Ds94YjAg.js","/assets/index-Az39ZADK.js","/assets/misc-BapXpylh.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BpAXVqmz.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/root-loader-C5P2c7MU.js","/assets/index-Az39ZADK.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache-BC7pviSz.js","imports":["/assets/chunk-JG3XND5A-pL43G3x8.js","/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/client-only-DtkKCk_i.js","/assets/button-Ds94YjAg.js","/assets/misc-BapXpylh.js","/assets/launch-editor-FcTaA5kv.js","/assets/pe-Bs-DFNma.js","/assets/progress-bar-D66irkpP.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/admin+/cache.$":{"id":"routes/admin+/cache.$","parentId":"routes/admin+/cache","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache._-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/db":{"id":"routes/admin+/db","parentId":"routes/admin+/_layout","path":"db","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/db-Bgj8fG7B.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/launch-editor-FcTaA5kv.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/progress-bar-D66irkpP.js","/assets/pe-Bs-DFNma.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DO6Ta8On.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/progress-DJ4oeyzx.js","/assets/root-loader-C5P2c7MU.js","/assets/index-Az39ZADK.js","/assets/index-CjiomtK6.js","/assets/pe-Bs-DFNma.js"],"css":[]},"routes/admin+/notifications":{"id":"routes/admin+/notifications","parentId":"routes/admin+/_layout","path":"notifications","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/notifications-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version-DqkJKhhX.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/workshop-config-DCYN9tG7.js","/assets/index-Az39ZADK.js","/assets/root-loader-C5P2c7MU.js"],"css":[]},"routes/admin+/version[.json]":{"id":"routes/admin+/version[.json]","parentId":"routes/admin+/_layout","path":"version.json","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version_.json_-l0sNRNKZ.js","imports":[],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff-DHSrZwrp.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-BapXpylh.js","/assets/diff-CSBF170R.js","/assets/nav-chevrons-Q_xwzgQq.js","/assets/index-Az39ZADK.js","/assets/accordion-APJveXWr.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/index--z_DgN94.js","/assets/index-Cod-PQ6D.js","/assets/mdx-C_z6TweY.js","/assets/index-Dd9cSrtE.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-FcTaA5kv.js","/assets/progress-bar-D66irkpP.js","/assets/revalidation-ws-BahUMYqf.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/diff.$shortcut":{"id":"routes/diff.$shortcut","parentId":"routes/diff","path":":shortcut","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff._shortcut-l0sNRNKZ.js","imports":[],"css":[]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/mcp-ui+/epic-video":{"id":"routes/mcp-ui+/epic-video","parentId":"root","path":"mcp-ui/epic-video","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic-video-D_8dpHsg.js","imports":["/assets/chunk-UIGDSWPH-BWkP6tD5.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-Az39ZADK.js","/assets/epic-video-DQNGJhVF.js","/assets/index-_LzGTKVC.js","/assets/misc-BapXpylh.js","/assets/tooltip-C2AQeNhD.js","/assets/index-CjiomtK6.js","/assets/root-loader-C5P2c7MU.js","/assets/pe-Bs-DFNma.js","/assets/types-Cl2NuNg4.js","/assets/online-Dw7HU4wM.js","/assets/loading-DyvhEH4Q.js","/assets/user-DtZkTMil.js","/assets/workshop-config-DCYN9tG7.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/healthcheck":{"id":"routes/resources+/healthcheck","parentId":"root","path":"resources/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/healthcheck-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/lookout":{"id":"routes/resources+/lookout","parentId":"root","path":"resources/lookout","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/lookout-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-940d9817.js","version":"940d9817"};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as u}from"./index-Az39ZADK.js";import{c as x,g as A}from"./chunk-UIGDSWPH-BWkP6tD5.js";import{k as F,l as k,I as f,a as C,c as R}from"./misc-BapXpylh.js";import{B as P,L as O}from"./button-Ds94YjAg.js";import{L as I}from"./loading-DyvhEH4Q.js";import{s as j}from"./progress-bar-D66irkpP.js";import{u as g}from"./pe-Bs-DFNma.js";import{u as w}from"./index-_LzGTKVC.js";import{a as L}from"./root-loader-C5P2c7MU.js";import{T as z,a as v,b as S,c as N}from"./tooltip-C2AQeNhD.js";function q({name:r}){const t=x(),s=g(),o=t.formData?.get("intent"),l=o==="stop"?"Stopping App":o==="restart"?"Restarting App":null,a=F();return e.jsxs(t.Form,{method:"POST",action:"/start",children:[s,j,e.jsx("input",{type:"hidden",name:"name",value:r}),e.jsx("button",{type:"submit",name:"intent",value:a?"restart":"stop",className:"h-full border-r px-3 py-4 font-mono text-xs leading-none uppercase",children:l||(a?"Restart App":"Stop App")})]})}function B({port:r}){const t=x(),s=g();return e.jsxs(t.Form,{method:"POST",action:"/start",children:[s,j,e.jsx("input",{type:"hidden",name:"port",value:r}),e.jsx(P,{varient:"mono",type:"submit",name:"intent",value:"stop-port",children:t.state==="idle"?"Stop Port":"Stopping Port"})]})}function D({name:r}){const t=x(),s=g();return t.data?.status==="app-not-started"?t.data.error==="port-unavailable"?e.jsxs("div",{children:["The port is unavailable. Would you like to stop whatever is running on that port and try again?",e.jsx(B,{port:t.data.port})]}):e.jsx("div",{children:"An unknown error has happened."}):e.jsxs(t.Form,{method:"POST",action:"/start",children:[s,j,e.jsx("input",{type:"hidden",name:"name",value:r}),t.state==="idle"?e.jsx(P,{type:"submit",name:"intent",value:"start",varient:"mono",children:"Start App"}):e.jsx("div",{children:e.jsx(I,{children:"Starting App"})})]})}function _({name:r,port:t,portIsAvailable:s,isRunning:o,baseUrl:l,id:a,initialRoute:p,ref:n}){const d=L(),[m,c]=u.useState(!1);return o||m?e.jsx(K,{baseUrl:l,id:a,name:r,ref:n,initialRoute:p}):s===!1?e.jsxs("div",{className:"flex flex-col items-center justify-center",children:[e.jsxs("p",{className:"max-w-xs pb-5 text-center",role:"status",children:["The port for this app is unavailable. It could be that you're running it ",e.jsx("a",{href:k({domain:d.domain,port:t}),className:"underline",target:"_blank",rel:"noreferrer",children:"elsewhere"}),". ",e.jsx(O,{onClick:()=>c(!0),children:"Show here anyway"})]}),e.jsx(B,{port:t})]}):e.jsx("div",{className:"flex h-full flex-col items-center justify-center",children:e.jsx(D,{name:r})})}function K({baseUrl:r,id:t,name:s,initialRoute:o,ref:l}){const a=w(),[p,n]=u.useState(0),d=t+p,m=u.useRef(null),c=new URL(o,r),[i,b]=u.useState(c),y=u.useRef(t);y.current!==t&&(y.current=t,b(c));function U(h){if(h){const E=new URL(h,r);b(E),n(T=>T+1)}}return u.useImperativeHandle(l,()=>({handleExtrnalNavigation:U})),e.jsx(z,{children:e.jsxs("div",{className:"flex h-full grow flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b pl-1.5",children:[e.jsx("div",{className:"mr-2 flex items-center justify-center gap-2 px-1",children:e.jsxs(v,{children:[e.jsx(S,{asChild:!0,children:e.jsx("button",{type:"button",className:"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",onClick:()=>{n(h=>h+1)},children:e.jsx(f,{name:"Refresh","aria-hidden":"true"})})}),e.jsx(N,{children:"Refresh"})]})}),e.jsx("div",{className:"bg-background text-foreground flex flex-1 items-center border-x p-3 leading-none",children:e.jsx("a",{href:i.toString(),target:"_blank",rel:"noreferrer",children:i.toString()})}),e.jsx(q,{name:s}),e.jsxs(v,{children:[e.jsx(S,{asChild:!0,children:e.jsx("a",{href:i.toString(),target:"_blank",rel:"noreferrer",className:C("flex aspect-square items-center justify-center px-3.5"),children:e.jsx(f,{name:"ExternalLink"})})}),e.jsx(N,{children:"Open in new tab"})]})]}),e.jsx("div",{className:"flex h-full w-full grow dark:bg-white",children:e.jsx("iframe",{title:s,ref:m,src:i.toString(),className:"h-full w-full grow bg-white",style:{colorScheme:a},allow:"clipboard-write"},d)})]})})}function te({id:r,appInfo:t,inBrowserBrowserRef:s}){const o=L(),[l]=A(),a=w();if(!t)return e.jsx("p",{children:"No app here. Sorry."});const{isRunning:p,dev:n,name:d,portIsAvailable:m,title:c}=t;if(ENV.EPICSHOP_DEPLOYED&&t.stackBlitzUrl){const i=new URL(t.stackBlitzUrl);return i.searchParams.set("embed","1"),i.searchParams.set("theme",a),e.jsx(H,{title:c,url:i.toString(),loadingContent:e.jsx(I,{children:e.jsxs("span",{children:["Loading"," ",e.jsxs("a",{className:"underline",href:t.stackBlitzUrl,children:['"',c,'"']})]})})})}if(n.type==="script"){const i=k({domain:o.domain,port:n.portNumber});return e.jsx(_,{ref:s,isRunning:p,id:r??d,name:d,portIsAvailable:m,port:n.portNumber,baseUrl:i,initialRoute:l.get("pathname")??n.initialRoute})}else return n.type==="browser"?e.jsxs("div",{className:"scrollbar-thin scrollbar-thumb-scrollbar relative h-full grow overflow-y-auto",children:[e.jsxs("a",{href:n.pathname,target:"_blank",rel:"noreferrer",className:R("absolute right-5 bottom-5 flex items-center justify-center rounded-full bg-gray-100 p-2.5 transition hover:bg-gray-200 dark:bg-gray-800 hover:dark:bg-gray-600"),children:[e.jsx(f,{name:"ExternalLink","aria-hidden":"true"}),e.jsx("span",{className:"sr-only",children:"Open in New Window"})]}),e.jsx("iframe",{title:c,src:n.pathname,className:"yo yo h-full w-full grow bg-white",style:{colorScheme:a},allow:"clipboard-write"})]}):e.jsx("div",{className:"flex h-full items-center justify-center text-lg",children:e.jsxs("p",{children:["Preview for dev type of ",e.jsx("code",{children:n.type})," not supported."]})})}function H({url:r,title:t,loadingContent:s}){const o=w(),[l,a]=u.useState(!1);return e.jsxs("div",{className:"h-full w-full grow",children:[l?null:e.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center",children:s}),e.jsx("iframe",{onLoad:()=>a(!0),onError:()=>a(!0),src:r,className:R("h-full w-full grow transition-opacity duration-300",l?"opacity-100":"opacity-0"),title:t,sandbox:"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox",allow:"clipboard-write",style:{colorScheme:o}})]})}export{te as P};
|
|
2
|
-
//# sourceMappingURL=preview-
|
|
1
|
+
import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as u}from"./index-Az39ZADK.js";import{c as x,g as A}from"./chunk-UIGDSWPH-BWkP6tD5.js";import{k as F,l as k,I as f,a as C,c as R}from"./misc-BapXpylh.js";import{B as P,L as O}from"./button-Ds94YjAg.js";import{L as I}from"./loading-DyvhEH4Q.js";import{s as j}from"./progress-bar-D66irkpP.js";import{u as g}from"./pe-Bs-DFNma.js";import{u as w}from"./index-_LzGTKVC.js";import{a as L}from"./root-loader-C5P2c7MU.js";import{T as z,a as v,b as S,c as N}from"./tooltip-C2AQeNhD.js";function q({name:r}){const t=x(),s=g(),o=t.formData?.get("intent"),l=o==="stop"?"Stopping App":o==="restart"?"Restarting App":null,a=F();return e.jsxs(t.Form,{method:"POST",action:"/start",children:[s,j,e.jsx("input",{type:"hidden",name:"name",value:r}),e.jsx("button",{type:"submit",name:"intent",value:a?"restart":"stop",className:"h-full border-r px-3 py-4 font-mono text-xs leading-none uppercase",children:l||(a?"Restart App":"Stop App")})]})}function B({port:r}){const t=x(),s=g();return e.jsxs(t.Form,{method:"POST",action:"/start",children:[s,j,e.jsx("input",{type:"hidden",name:"port",value:r}),e.jsx(P,{varient:"mono",type:"submit",name:"intent",value:"stop-port",children:t.state==="idle"?"Stop Port":"Stopping Port"})]})}function D({name:r}){const t=x(),s=g();return t.data?.status==="app-not-started"?t.data.error==="port-unavailable"?e.jsxs("div",{children:["The port is unavailable. Would you like to stop whatever is running on that port and try again?",e.jsx(B,{port:t.data.port})]}):e.jsx("div",{children:"An unknown error has happened."}):e.jsxs(t.Form,{method:"POST",action:"/start",children:[s,j,e.jsx("input",{type:"hidden",name:"name",value:r}),t.state==="idle"?e.jsx(P,{type:"submit",name:"intent",value:"start",varient:"mono",children:"Start App"}):e.jsx("div",{children:e.jsx(I,{children:"Starting App"})})]})}function _({name:r,port:t,portIsAvailable:s,isRunning:o,baseUrl:l,id:a,initialRoute:p,ref:n}){const d=L(),[m,c]=u.useState(!1);return o||m?e.jsx(K,{baseUrl:l,id:a,name:r,ref:n,initialRoute:p}):s===!1?e.jsxs("div",{className:"flex flex-col items-center justify-center",children:[e.jsxs("p",{className:"max-w-xs pb-5 text-center",role:"status",children:["The port for this app is unavailable. It could be that you're running it ",e.jsx("a",{href:k({domain:d.domain,port:t}),className:"underline",target:"_blank",rel:"noreferrer",children:"elsewhere"}),". ",e.jsx(O,{onClick:()=>c(!0),children:"Show here anyway"})]}),e.jsx(B,{port:t})]}):e.jsx("div",{className:"flex h-full flex-col items-center justify-center",children:e.jsx(D,{name:r})})}function K({baseUrl:r,id:t,name:s,initialRoute:o,ref:l}){const a=w(),[p,n]=u.useState(0),d=t+p,m=u.useRef(null),c=new URL(o,r),[i,b]=u.useState(c),y=u.useRef(t);y.current!==t&&(y.current=t,b(c));function U(h){if(h){const E=new URL(h,r);b(E),n(T=>T+1)}}return u.useImperativeHandle(l,()=>({handleExtrnalNavigation:U})),e.jsx(z,{children:e.jsxs("div",{className:"flex h-full grow flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b pl-1.5",children:[e.jsx("div",{className:"mr-2 flex items-center justify-center gap-2 px-1",children:e.jsxs(v,{children:[e.jsx(S,{asChild:!0,children:e.jsx("button",{type:"button",className:"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",onClick:()=>{n(h=>h+1)},children:e.jsx(f,{name:"Refresh","aria-hidden":"true"})})}),e.jsx(N,{children:"Refresh"})]})}),e.jsx("div",{className:"bg-background text-foreground flex flex-1 items-center border-x p-3 leading-none",children:e.jsx("a",{href:i.toString(),target:"_blank",rel:"noreferrer",children:i.toString()})}),e.jsx(q,{name:s}),e.jsxs(v,{children:[e.jsx(S,{asChild:!0,children:e.jsx("a",{href:i.toString(),target:"_blank",rel:"noreferrer",className:C("flex aspect-square items-center justify-center px-3.5"),children:e.jsx(f,{name:"ExternalLink"})})}),e.jsx(N,{children:"Open in new tab"})]})]}),e.jsx("div",{className:"flex h-full w-full grow dark:bg-white",children:e.jsx("iframe",{title:s,ref:m,src:i.toString(),className:"h-full w-full grow bg-white",style:{colorScheme:a},allow:"clipboard-write"},d)})]})})}function te({id:r,appInfo:t,inBrowserBrowserRef:s}){const o=L(),[l]=A(),a=w();if(!t)return e.jsx("p",{children:"No app here. Sorry."});const{isRunning:p,dev:n,name:d,portIsAvailable:m,title:c}=t;if(ENV.EPICSHOP_DEPLOYED&&t.stackBlitzUrl){const i=new URL(t.stackBlitzUrl);return i.searchParams.set("embed","1"),i.searchParams.set("theme",a),e.jsx(H,{title:c,url:i.toString(),loadingContent:e.jsx(I,{children:e.jsxs("span",{children:["Loading"," ",e.jsxs("a",{className:"underline",href:t.stackBlitzUrl,children:['"',c,'"']})]})})})}if(n.type==="script"){const i=k({domain:o.domain,port:n.portNumber});return e.jsx(_,{ref:s,isRunning:p,id:r??d,name:d,portIsAvailable:m,port:n.portNumber,baseUrl:i,initialRoute:l.get("pathname")??n.initialRoute})}else return n.type==="browser"||n.type==="export"?e.jsxs("div",{className:"scrollbar-thin scrollbar-thumb-scrollbar relative h-full grow overflow-y-auto",children:[e.jsxs("a",{href:n.pathname,target:"_blank",rel:"noreferrer",className:R("absolute right-5 bottom-5 flex items-center justify-center rounded-full bg-gray-100 p-2.5 transition hover:bg-gray-200 dark:bg-gray-800 hover:dark:bg-gray-600"),children:[e.jsx(f,{name:"ExternalLink","aria-hidden":"true"}),e.jsx("span",{className:"sr-only",children:"Open in New Window"})]}),e.jsx("iframe",{title:c,src:n.pathname,className:"yo yo h-full w-full grow bg-white",style:{colorScheme:a},allow:"clipboard-write"})]}):e.jsx("div",{className:"flex h-full items-center justify-center text-lg",children:e.jsxs("p",{children:["Preview for dev type of ",e.jsx("code",{children:n.type})," not supported."]})})}function H({url:r,title:t,loadingContent:s}){const o=w(),[l,a]=u.useState(!1);return e.jsxs("div",{className:"h-full w-full grow",children:[l?null:e.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center",children:s}),e.jsx("iframe",{onLoad:()=>a(!0),onError:()=>a(!0),src:r,className:R("h-full w-full grow transition-opacity duration-300",l?"opacity-100":"opacity-0"),title:t,sandbox:"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox",allow:"clipboard-write",style:{colorScheme:o}})]})}export{te as P};
|
|
2
|
+
//# sourceMappingURL=preview-CqV1y1NY.js.map
|