@epic-web/workshop-app 4.10.1 → 4.12.0

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.
Files changed (91) hide show
  1. package/build/client/assets/{_-Bd2gNcck.js → _-DYArYM0Z.js} +2 -2
  2. package/build/client/assets/{_-Bd2gNcck.js.map → _-DYArYM0Z.js.map} +1 -1
  3. package/build/client/assets/_exerciseNumber-DN5AsSNn.js +2 -0
  4. package/build/client/assets/{_exerciseNumber-CfF6tJcN.js.map → _exerciseNumber-DN5AsSNn.js.map} +1 -1
  5. package/build/client/assets/{_exerciseNumber_._stepNumber-DCbWNWpZ.js → _exerciseNumber_._stepNumber-Ct5BCuA1.js} +2 -2
  6. package/build/client/assets/{_exerciseNumber_._stepNumber-DCbWNWpZ.js.map → _exerciseNumber_._stepNumber-Ct5BCuA1.js.map} +1 -1
  7. package/build/client/assets/_exerciseNumber_.finished-W3hcmvgu.js +2 -0
  8. package/build/client/assets/{_exerciseNumber_.finished-CykPBfYE.js.map → _exerciseNumber_.finished-W3hcmvgu.js.map} +1 -1
  9. package/build/client/assets/{_layout-rEQoj43V.js → _layout-B9Y-8OU6.js} +2 -2
  10. package/build/client/assets/{_layout-rEQoj43V.js.map → _layout-B9Y-8OU6.js.map} +1 -1
  11. package/build/client/assets/{_layout-DHBLG7Ti.js → _layout-CLLcE4oc.js} +2 -2
  12. package/build/client/assets/{_layout-DHBLG7Ti.js.map → _layout-CLLcE4oc.js.map} +1 -1
  13. package/build/client/assets/_layout-qyqfsEt3.js +2 -0
  14. package/build/client/assets/_layout-qyqfsEt3.js.map +1 -0
  15. package/build/client/assets/{account-CnLkZd_O.js → account-DHsaqKNy.js} +2 -2
  16. package/build/client/assets/{account-CnLkZd_O.js.map → account-DHsaqKNy.js.map} +1 -1
  17. package/build/client/assets/{button-CyZl24U2.js → button-BA3iiLRs.js} +2 -2
  18. package/build/client/assets/{button-CyZl24U2.js.map → button-BA3iiLRs.js.map} +1 -1
  19. package/build/client/assets/cache-l0sNRNKZ.js +2 -0
  20. package/build/client/assets/cache-l0sNRNKZ.js.map +1 -0
  21. package/build/client/assets/{client-hints-BE5mB4r0.js → client-hints-DLYDs4RF.js} +2 -2
  22. package/build/client/assets/{client-hints-BE5mB4r0.js.map → client-hints-DLYDs4RF.js.map} +1 -1
  23. package/build/client/assets/{components-BMzmvxYw.js → components-wgHiPsTg.js} +2 -2
  24. package/build/client/assets/{components-BMzmvxYw.js.map → components-wgHiPsTg.js.map} +1 -1
  25. package/build/client/assets/diff-DczVYWk4.js +2 -0
  26. package/build/client/assets/{diff-PfwTHr6-.js.map → diff-DczVYWk4.js.map} +1 -1
  27. package/build/client/assets/{diff-P5f7-8E4.js → diff-hpVBklM0.js} +2 -2
  28. package/build/client/assets/{diff-P5f7-8E4.js.map → diff-hpVBklM0.js.map} +1 -1
  29. package/build/client/assets/discord-CgwNGD2p.js +2 -0
  30. package/build/client/assets/discord-CgwNGD2p.js.map +1 -0
  31. package/build/client/assets/{discord-COPE8EOZ.js → discord-yZor-3t1.js} +2 -2
  32. package/build/client/assets/{discord-COPE8EOZ.js.map → discord-yZor-3t1.js.map} +1 -1
  33. package/build/client/assets/{entry.client-B0vV2fsa.js → entry.client-Cs8lBz8l.js} +2 -2
  34. package/build/client/assets/{entry.client-B0vV2fsa.js.map → entry.client-Cs8lBz8l.js.map} +1 -1
  35. package/build/client/assets/{epic-video-CYnG2ziQ.js → epic-video--ydmGfR4.js} +96 -96
  36. package/build/client/assets/{epic-video-CYnG2ziQ.js.map → epic-video--ydmGfR4.js.map} +1 -1
  37. package/build/client/assets/{error-boundary-DxfVshQ5.js → error-boundary-BVTbN8PZ.js} +2 -2
  38. package/build/client/assets/{error-boundary-DxfVshQ5.js.map → error-boundary-BVTbN8PZ.js.map} +1 -1
  39. package/build/client/assets/finished-3FuL-PiH.js +2 -0
  40. package/build/client/assets/{finished-zLjWvstg.js.map → finished-3FuL-PiH.js.map} +1 -1
  41. package/build/client/assets/{index-4E9_Sx3m.js → index-C6ToujzV.js} +2 -2
  42. package/build/client/assets/{index-4E9_Sx3m.js.map → index-C6ToujzV.js.map} +1 -1
  43. package/build/client/assets/index-DCO6tIXL.js +2 -0
  44. package/build/client/assets/{index-BXefr1BB.js.map → index-DCO6tIXL.js.map} +1 -1
  45. package/build/client/assets/{index-90bzTYUX.js → index-DMhFsRrG.js} +2 -2
  46. package/build/client/assets/{index-90bzTYUX.js.map → index-DMhFsRrG.js.map} +1 -1
  47. package/build/client/assets/{index-Doi37489.js → index-DjzedX4O.js} +2 -2
  48. package/build/client/assets/{index-Doi37489.js.map → index-DjzedX4O.js.map} +1 -1
  49. package/build/client/assets/{loading-CNWJVymJ.js → loading-B0uKxERz.js} +2 -2
  50. package/build/client/assets/{loading-CNWJVymJ.js.map → loading-B0uKxERz.js.map} +1 -1
  51. package/build/client/assets/{login-DxG854vQ.js → login-CHE9W6po.js} +2 -2
  52. package/build/client/assets/{login-DxG854vQ.js.map → login-CHE9W6po.js.map} +1 -1
  53. package/build/client/assets/manifest-b955f6ee.js +1 -0
  54. package/build/client/assets/{mdx-CR7Me1v_.js → mdx-DF11h1m-.js} +2 -2
  55. package/build/client/assets/{mdx-CR7Me1v_.js.map → mdx-DF11h1m-.js.map} +1 -1
  56. package/build/client/assets/{misc-CypjEQkt.js → misc-S5ZD98sI.js} +2 -2
  57. package/build/client/assets/{misc-CypjEQkt.js.map → misc-S5ZD98sI.js.map} +1 -1
  58. package/build/client/assets/{nav-chevrons-BYKwyIgG.js → nav-chevrons-DaXg0NPS.js} +2 -2
  59. package/build/client/assets/{nav-chevrons-BYKwyIgG.js.map → nav-chevrons-DaXg0NPS.js.map} +1 -1
  60. package/build/client/assets/onboarding-CBm-xBhv.js +2 -0
  61. package/build/client/assets/{onboarding-b9lcdh4n.js.map → onboarding-CBm-xBhv.js.map} +1 -1
  62. package/build/client/assets/{presence-DXXVJbaH.js → presence-CW1_eiIo.js} +2 -2
  63. package/build/client/assets/{presence-DXXVJbaH.js.map → presence-CW1_eiIo.js.map} +1 -1
  64. package/build/client/assets/{progress-B_mReZVE.js → progress-BwanvUpB.js} +2 -2
  65. package/build/client/assets/{progress-B_mReZVE.js.map → progress-BwanvUpB.js.map} +1 -1
  66. package/build/client/assets/{progress-bar-DCrt7X4t.js → progress-bar-wMXWRGq0.js} +2 -2
  67. package/build/client/assets/{progress-bar-DCrt7X4t.js.map → progress-bar-wMXWRGq0.js.map} +1 -1
  68. package/build/client/assets/{request-info-CUT0ULYN.js → request-info-DHtGM4FI.js} +2 -2
  69. package/build/client/assets/{request-info-CUT0ULYN.js.map → request-info-DHtGM4FI.js.map} +1 -1
  70. package/build/client/assets/{root-DWqeqKvM.js → root-CW5sLiRQ.js} +2 -2
  71. package/build/client/assets/{root-DWqeqKvM.js.map → root-CW5sLiRQ.js.map} +1 -1
  72. package/build/client/assets/{support-DrY-qRGh.js → support-D1ydJNdm.js} +2 -2
  73. package/build/client/assets/{support-DrY-qRGh.js.map → support-D1ydJNdm.js.map} +1 -1
  74. package/build/client/assets/{tooltip-CfmIzAYi.js → tooltip-BtzSIxlB.js} +2 -2
  75. package/build/client/assets/{tooltip-CfmIzAYi.js.map → tooltip-BtzSIxlB.js.map} +1 -1
  76. package/build/client/assets/{user-C4QTtQw5.js → user-CdUDQ7a8.js} +2 -2
  77. package/build/client/assets/{user-C4QTtQw5.js.map → user-CdUDQ7a8.js.map} +1 -1
  78. package/build/server/index.js +150 -84
  79. package/build/server/index.js.map +1 -1
  80. package/package.json +3 -3
  81. package/build/client/assets/_exerciseNumber-CfF6tJcN.js +0 -2
  82. package/build/client/assets/_exerciseNumber_.finished-CykPBfYE.js +0 -2
  83. package/build/client/assets/_layout-CKMWSKRh.js +0 -2
  84. package/build/client/assets/_layout-CKMWSKRh.js.map +0 -1
  85. package/build/client/assets/diff-PfwTHr6-.js +0 -2
  86. package/build/client/assets/discord-DIog7bBO.js +0 -2
  87. package/build/client/assets/discord-DIog7bBO.js.map +0 -1
  88. package/build/client/assets/finished-zLjWvstg.js +0 -2
  89. package/build/client/assets/index-BXefr1BB.js +0 -2
  90. package/build/client/assets/manifest-60765f76.js +0 -1
  91. package/build/client/assets/onboarding-b9lcdh4n.js +0 -2
@@ -1 +0,0 @@
1
- {"version":3,"file":"_layout-CKMWSKRh.js","sources":["../../../../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../../../../node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../app/routes/set-playground.tsx","../../../../../node_modules/dayjs/dayjs.min.js","../../../../../node_modules/dayjs/plugin/relativeTime.js","../../../../../node_modules/dayjs/plugin/timezone.js","../../../../../node_modules/dayjs/plugin/utc.js","../../../app/utils/dayjs.ts","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/__shared/discord.tsx","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/__shared/playground-window.tsx","../../../app/routes/start.tsx","../../../app/components/in-browser-browser.tsx","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/__shared/preview.tsx","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/__shared/playground.tsx","../../../app/routes/update-mdx-cache.tsx","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/__shared/step-mdx.tsx","../../../app/components/in-browser-test-runner.tsx","../../../app/routes/test.tsx","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/__shared/tests.tsx","../../../../../node_modules/@radix-ui/react-popover/dist/index.mjs","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/__shared/touched-files.tsx","../../../app/routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout.tsx"],"sourcesContent":["\"use client\";\n\n// packages/react/roving-focus/src/RovingFocusGroup.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 = null, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId,\n onChange: onCurrentTabStopIdChange\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 ...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 } = 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 }\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// packages/react/tabs/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 });\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","import {\n\tgetAppByName,\n\tgetApps,\n\tisPlaygroundApp,\n\tisProblemApp,\n\tisSolutionApp,\n\tsetPlayground,\n} from '@epic-web/workshop-utils/apps.server'\nimport * as Select from '@radix-ui/react-select'\nimport { json, type ActionFunctionArgs } from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport { z } from 'zod'\nimport { Icon } from '#app/components/icons.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { getDiffCode } from '#app/utils/diff.server.ts'\nimport { ensureUndeployed, getErrorMessage } from '#app/utils/misc.tsx'\nimport { createToastHeaders } from '#app/utils/toast.server.ts'\n\nconst SetPlaygroundSchema = z.object({\n\tappName: z.string(),\n\treset: z\n\t\t.string()\n\t\t.nullable()\n\t\t.optional()\n\t\t.transform((v) => v === 'true'),\n})\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst rawData = {\n\t\tappName: formData.get('appName'),\n\t}\n\tconst result = SetPlaygroundSchema.safeParse(rawData)\n\tif (!result.success) {\n\t\treturn json({ status: 'error', error: result.error.message } as const, {\n\t\t\tstatus: 400,\n\t\t})\n\t}\n\tconst form = result.data\n\tconst app = await getAppByName(form.appName)\n\tif (!app) {\n\t\treturn json(\n\t\t\t{ status: 'error', error: `App ${form.appName} not found` } as const,\n\t\t\t{ status: 404 },\n\t\t)\n\t}\n\tconst converseApp =\n\t\tisProblemApp(app) && app.solutionName\n\t\t\t? await getAppByName(app.solutionName)\n\t\t\t: isSolutionApp(app) && app.problemName\n\t\t\t\t? await getAppByName(app.problemName)\n\t\t\t\t: undefined\n\ttry {\n\t\tawait setPlayground(app.fullPath, { reset: form.reset })\n\t} catch (error: unknown) {\n\t\tconst message = getErrorMessage(error)\n\t\tconsole.error('Error setting playground', message)\n\t\treturn json({ status: 'error', error: message } as const, {\n\t\t\tstatus: 500,\n\t\t\theaders: await createToastHeaders({\n\t\t\t\ttype: 'error',\n\t\t\t\ttitle: 'Error',\n\t\t\t\tdescription:\n\t\t\t\t\t'There was an error setting the playground. Check the terminal for details.',\n\t\t\t}),\n\t\t})\n\t}\n\tconst apps = await getApps({ forceFresh: true })\n\tconst playground = apps.find(isPlaygroundApp)\n\tif (playground && converseApp) {\n\t\tawait getDiffCode(playground, converseApp, { forceFresh: true })\n\t}\n\treturn json({ status: 'success' } as const)\n}\n\nexport function SetPlayground({\n\tappName,\n\treset = false,\n\ttooltipText,\n\t...buttonProps\n}: {\n\tappName: string\n\ttooltipText?: string\n\treset?: boolean\n} & React.ComponentProps<'button'>) {\n\tconst fetcher = useFetcher<typeof action>()\n\n\tconst submitButton = (\n\t\t<button\n\t\t\ttype=\"submit\"\n\t\t\t{...buttonProps}\n\t\t\tclassName={clsx(\n\t\t\t\tbuttonProps.className,\n\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t)}\n\t\t/>\n\t)\n\treturn (\n\t\t<fetcher.Form\n\t\t\taction=\"/set-playground\"\n\t\t\tmethod=\"POST\"\n\t\t\tclassName=\"inline-flex items-center justify-center\"\n\t\t>\n\t\t\t<input type=\"hidden\" name=\"appName\" value={appName} />\n\t\t\t{reset ? <input type=\"hidden\" name=\"reset\" value=\"true\" /> : null}\n\t\t\t{showProgressBarField}\n\t\t\t{tooltipText ? (\n\t\t\t\t<SimpleTooltip content={tooltipText}>{submitButton}</SimpleTooltip>\n\t\t\t) : (\n\t\t\t\tsubmitButton\n\t\t\t)}\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function PlaygroundChooser({\n\tplaygroundAppName,\n\tallApps,\n}: {\n\tplaygroundAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\treturn (\n\t\t<Select.Root\n\t\t\tname=\"appName\"\n\t\t\tvalue={playgroundAppName}\n\t\t\tonValueChange={(appName) => {\n\t\t\t\tfetcher.submit(\n\t\t\t\t\t{ appName },\n\t\t\t\t\t{ method: 'POST', action: '/set-playground' },\n\t\t\t\t)\n\t\t\t}}\n\t\t>\n\t\t\t<Select.Trigger\n\t\t\t\taria-label=\"Select app for playground\"\n\t\t\t\tclassName={clsx(\n\t\t\t\t\t'flex h-full w-full items-center justify-between text-left radix-placeholder:text-gray-500 focus-visible:outline-none',\n\t\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span className=\"w-80 flex-1 overflow-hidden text-ellipsis whitespace-nowrap scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t<Select.Value\n\t\t\t\t\t\tplaceholder=\"Select current app\"\n\t\t\t\t\t\tclassName=\"inline-block w-40 text-ellipsis\"\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t\t<Select.Icon>\n\t\t\t\t\t<Icon name=\"TriangleDownSmall\" />\n\t\t\t\t</Select.Icon>\n\t\t\t</Select.Trigger>\n\t\t\t<Select.Portal>\n\t\t\t\t<Select.Content\n\t\t\t\t\tposition=\"popper\"\n\t\t\t\t\talign=\"start\"\n\t\t\t\t\tclassName=\"z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]\"\n\t\t\t\t>\n\t\t\t\t\t<Select.ScrollUpButton className=\"flex h-5 cursor-default items-center justify-center \">\n\t\t\t\t\t\t<Icon name=\"ChevronUp\" />\n\t\t\t\t\t</Select.ScrollUpButton>\n\t\t\t\t\t<Select.Viewport className=\"p-3\">\n\t\t\t\t\t\t<Select.Group>\n\t\t\t\t\t\t\t<Select.Label className=\"px-5 pb-3 font-mono uppercase\">\n\t\t\t\t\t\t\t\tApp\n\t\t\t\t\t\t\t</Select.Label>\n\t\t\t\t\t\t\t{allApps\n\t\t\t\t\t\t\t\t.filter((app) => app.name !== 'playground')\n\t\t\t\t\t\t\t\t.map((app) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<SelectItem key={app.name} value={app.name}>\n\t\t\t\t\t\t\t\t\t\t\t{app.displayName}\n\t\t\t\t\t\t\t\t\t\t</SelectItem>\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</Select.Group>\n\t\t\t\t\t</Select.Viewport>\n\t\t\t\t\t<Select.ScrollDownButton className=\"flex h-5 cursor-default items-center justify-center \">\n\t\t\t\t\t\t<Icon name=\"ChevronDown\" />\n\t\t\t\t\t</Select.ScrollDownButton>\n\t\t\t\t</Select.Content>\n\t\t\t</Select.Portal>\n\t\t</Select.Root>\n\t)\n}\n\nfunction SelectItem({\n\tvalue,\n\tchildren,\n}: {\n\tvalue: string\n\tchildren: React.ReactNode\n}) {\n\treturn (\n\t\t<Select.Item\n\t\t\tvalue={value}\n\t\t\tclassName=\"relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100\"\n\t\t>\n\t\t\t<Select.ItemText>{children}</Select.ItemText>\n\t\t\t<Select.ItemIndicator className=\"absolute left-0 inline-flex w-[25px] items-center justify-center\">\n\t\t\t\t<Icon name=\"CheckSmall\" />\n\t\t\t</Select.ItemIndicator>\n\t\t</Select.Item>\n\t)\n}\n\nexport function SetAppToPlayground({ appName }: { appName: string }) {\n\tif (ENV.EPICSHOP_DEPLOYED) return null\n\treturn (\n\t\t<SetPlayground\n\t\t\tappName={appName}\n\t\t\ttooltipText=\"Playground is not set to the right app. Click to set Playground.\"\n\t\t>\n\t\t\t<span className=\"flex items-center justify-center gap-1 text-foreground-danger hover:underline\">\n\t\t\t\t<Icon name=\"Unlinked\" className=\"animate-ping\" />{' '}\n\t\t\t\t<span className=\"uppercase\">Set to Playground</span>\n\t\t\t</span>\n\t\t</SetPlayground>\n\t)\n}\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(r,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(r=\"undefined\"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){\"use strict\";return function(r,e,t){r=r||{};var n=e.prototype,o={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),a=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return\"function\"==typeof M?M(a):M.replace(\"%s\",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n=this.utcOffset(),i=this.toDate(),a=i.toLocaleString(\"en-US\",{timeZone:t}),u=Math.round((i-new Date(a))/1e3/60),f=o(a,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(15*-Math.round(i.getTimezoneOffset()/15)-u,!0);if(e){var s=f.utcOffset();f=f.add(n-s,\"minute\")}return f.$x.$timezone=t,f},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var o=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),o.call(this,t)};var r=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else r.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s,o=this;if(f)return o.$offset=u,o.$u=0===s,o;if(0!==s){var r=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(o=this.local().add(u+r,t)).$offset=u,o.$x.$localOffset=r}else o=this.utc();return o};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","import dayjs from 'dayjs'\nimport relativeTimePlugin from 'dayjs/plugin/relativeTime.js'\nimport timeZonePlugin from 'dayjs/plugin/timezone.js'\nimport utcPlugin from 'dayjs/plugin/utc.js'\n\ndayjs.extend(utcPlugin)\ndayjs.extend(timeZonePlugin)\ndayjs.extend(relativeTimePlugin)\n\nexport { dayjs }\n","import { Await, Link, useLoaderData } from '@remix-run/react'\nimport * as React from 'react'\nimport { type z } from 'zod'\nimport { Icon } from '#app/components/icons.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { useHints } from '#app/utils/client-hints.tsx'\nimport { dayjs } from '#app/utils/dayjs.ts'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { DiscordCTA, useDiscordCTALink } from '../../../discord.tsx'\nimport { type loader } from '../_layout.tsx'\nimport { type ThreadItemSchema } from './discord.server.ts'\n\nexport function DiscordChat() {\n\tconst data = useLoaderData<typeof loader>()\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 discordAuthUrl={data.discordAuthUrl} />\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar\">\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<typeof loader>()\n\tconst ctaLink = useDiscordCTALink({ discordAuthUrl: data.discordAuthUrl })\n\tconst altDown = useAltDown()\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=\"rounded-xl border bg-background 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({ thread }: { thread: z.infer<typeof ThreadItemSchema> }) {\n\tconst reactionsWithCounts = thread.reactions.filter((r) => r.count)\n\tconst hints = useHints()\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=\"flex items-center justify-center gap-1 rounded-full bg-accent 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=\"flex-1 overflow-ellipsis text-muted-foreground\">\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{` · ${dayjs(thread.lastUpdated).tz(hints.timeZone).fromNow()}`}\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 { Icon } from '#app/components/icons'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.js'\nimport { PlaygroundChooser, SetPlayground } from '#app/routes/set-playground'\n\nexport function PlaygroundWindow({\n\tplaygroundAppName,\n\tproblemAppName,\n\tisUpToDate,\n\tallApps,\n\tchildren,\n}: {\n\tplaygroundAppName?: string\n\tproblemAppName?: string\n\tisUpToDate: boolean\n\tallApps: Array<{ name: string; displayName: string }>\n\tchildren: React.ReactNode\n}) {\n\tconst isCorrectApp = playgroundAppName === problemAppName\n\tconst playgroundLinkedUI =\n\t\tisCorrectApp && isUpToDate ? (\n\t\t\t<Icon size=\"xl\" name=\"Linked\" />\n\t\t) : (\n\t\t\t<Icon\n\t\t\t\tsize=\"xl\"\n\t\t\t\tname=\"Unlinked\"\n\t\t\t\tclassName=\"animate-pulse text-foreground-danger\"\n\t\t\t/>\n\t\t)\n\tlet setPlaygroundTooltipText = 'Click to reset Playground.'\n\tif (!isUpToDate) {\n\t\tsetPlaygroundTooltipText =\n\t\t\t'Playground is out of date. Click to reset Playground.'\n\t}\n\tif (!isCorrectApp) {\n\t\tsetPlaygroundTooltipText =\n\t\t\t'Playground is not set to the right app. Click to set Playground.'\n\t}\n\treturn (\n\t\t<div className=\"flex h-full w-full flex-col justify-between\">\n\t\t\t<div className=\"flex h-14 flex-shrink-0 items-center justify-start gap-2 border-b px-3\">\n\t\t\t\t<div className=\"display-alt-up\">\n\t\t\t\t\t{problemAppName ? (\n\t\t\t\t\t\t<SetPlayground\n\t\t\t\t\t\t\tappName={problemAppName}\n\t\t\t\t\t\t\ttooltipText={setPlaygroundTooltipText}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{playgroundLinkedUI}\n\t\t\t\t\t\t</SetPlayground>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<SimpleTooltip content=\"No problem app available for this step\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"display-alt-down\">\n\t\t\t\t\t{playgroundAppName ? (\n\t\t\t\t\t\t<SetPlayground\n\t\t\t\t\t\t\tappName={playgroundAppName}\n\t\t\t\t\t\t\treset\n\t\t\t\t\t\t\ttooltipText=\"Reset Playground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex h-7 w-7 items-center justify-center\">\n\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SetPlayground>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"h-7 w-7\" />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<PlaygroundChooser\n\t\t\t\t\tallApps={allApps}\n\t\t\t\t\tplaygroundAppName={playgroundAppName}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"flex h-full flex-1 flex-grow items-center justify-center\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import { invariant, invariantResponse } from '@epic-web/invariant'\nimport { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcloseProcess,\n\trunAppDev,\n\tstopPort,\n\twaitOnApp,\n} from '@epic-web/workshop-utils/process-manager.server'\nimport { json, type ActionFunctionArgs } from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { Button } from '#app/components/button.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { ensureUndeployed, useAltDown } from '#app/utils/misc.tsx'\nimport { createToastHeaders } from '#app/utils/toast.server'\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tinvariantResponse(typeof intent === 'string', 'intent is required')\n\n\tif (intent === 'start' || intent === 'stop' || intent === 'restart') {\n\t\tconst name = formData.get('name')\n\t\tinvariantResponse(typeof name === 'string', 'name is required')\n\t\tconst app = await getAppByName(name)\n\t\tif (!app) {\n\t\t\tthrow new Response('Not found', { status: 404 })\n\t\t}\n\t\tif (app.dev.type !== 'script') {\n\t\t\tthrow new Response(`App \"${name}\" does not have a server`, {\n\t\t\t\tstatus: 400,\n\t\t\t})\n\t\t}\n\n\t\tasync function startApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tconst result = await runAppDev(app)\n\t\t\tif (result.running) {\n\t\t\t\tconst appRunningResult = await waitOnApp(app)\n\t\t\t\tif (appRunningResult?.status === 'success') {\n\t\t\t\t\t// wait another 200ms just in case the build output for assets isn't finished\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200))\n\t\t\t\t\treturn json({ status: 'app-started' } as const)\n\t\t\t\t} else if (app.dev.type === 'script') {\n\t\t\t\t\tconst errorMessage = appRunningResult\n\t\t\t\t\t\t? appRunningResult.error\n\t\t\t\t\t\t: 'Unknown error'\n\t\t\t\t\treturn json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\t\t\terror: errorMessage,\n\t\t\t\t\t\t\tport: app.dev.portNumber,\n\t\t\t\t\t\t} as const,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tstatusText: 'App did not start',\n\t\t\t\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\t\t\t\tdescription: errorMessage,\n\t\t\t\t\t\t\t\ttitle: 'App did not start',\n\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (result.portNumber) {\n\t\t\t\treturn json({\n\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\terror: result.status,\n\t\t\t\t\tport: result.portNumber,\n\t\t\t\t} as const)\n\t\t\t} else {\n\t\t\t\tthrow new Response(\n\t\t\t\t\t'Tried starting a server for an app that does not have one',\n\t\t\t\t\t{ status: 400 },\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tasync function stopApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tawait closeProcess(app.name)\n\t\t\treturn json({ status: 'app-stopped' } as const)\n\t\t}\n\n\t\tswitch (intent) {\n\t\t\tcase 'start': {\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t\tcase 'stop': {\n\t\t\t\treturn stopApp()\n\t\t\t}\n\t\t\tcase 'restart': {\n\t\t\t\tawait stopApp()\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t}\n\t}\n\n\tif (intent === 'stop-port') {\n\t\tconst port = formData.get('port')\n\t\tinvariantResponse(typeof port === 'string', 'port is required')\n\t\tawait stopPort(port)\n\t\treturn json({ status: 'port-stopped' } as const)\n\t}\n\tthrow new Error(`Unknown intent: ${intent}`)\n}\n\nexport function AppStopper({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst inFlightIntent = fetcher.formData?.get('intent')\n\tconst inFlightState =\n\t\tinFlightIntent === 'stop'\n\t\t\t? 'Stopping App'\n\t\t\t: inFlightIntent === 'restart'\n\t\t\t\t? 'Restarting App'\n\t\t\t\t: null\n\tconst altDown = useAltDown()\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tname=\"intent\"\n\t\t\t\tvalue={altDown ? 'restart' : 'stop'}\n\t\t\t\tclassName=\"h-full border-r px-3 py-4 font-mono text-xs uppercase leading-none\"\n\t\t\t>\n\t\t\t\t{inFlightState ? inFlightState : altDown ? 'Restart App' : 'Stop App'}\n\t\t\t</button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function PortStopper({ port }: { port: number | string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t<input type=\"hidden\" name=\"port\" value={port} />\n\t\t\t<Button varient=\"mono\" type=\"submit\" name=\"intent\" value=\"stop-port\">\n\t\t\t\t{fetcher.state === 'idle' ? 'Stop Port' : 'Stopping Port'}\n\t\t\t</Button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function AppStarter({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tif (fetcher.data?.status === 'app-not-started') {\n\t\tif (fetcher.data.error === 'port-unavailable') {\n\t\t\treturn (\n\t\t\t\t<div>\n\t\t\t\t\tThe port is unavailable. Would you like to stop whatever is running on\n\t\t\t\t\tthat port and try again?\n\t\t\t\t\t<PortStopper port={fetcher.data.port} />\n\t\t\t\t</div>\n\t\t\t)\n\t\t} else {\n\t\t\treturn <div>An unknown error has happened.</div>\n\t\t}\n\t}\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t<Button type=\"submit\" name=\"intent\" value=\"start\" varient=\"mono\">\n\t\t\t\t\tStart App\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t<Loading>Starting App</Loading>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</fetcher.Form>\n\t)\n}\n","import { Form, useSearchParams, type NavigateFunction } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport {\n\tforwardRef,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n\ttype ForwardedRef,\n} from 'react'\nimport { z } from 'zod'\nimport { Icon } from '#app/components/icons.tsx'\nimport { AppStarter, AppStopper, PortStopper } from '#app/routes/start.tsx'\nimport { getBaseUrl } from '#app/utils/misc.tsx'\nimport { useRequestInfo } from '#app/utils/request-info.ts'\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from './ui/tooltip.tsx'\n\nconst historyCallDataSchema = z.intersection(\n\tz.object({\n\t\ttype: z.literal('epicshop:history-call'),\n\t}),\n\tz.union([\n\t\tz.object({\n\t\t\tmethod: z.literal('pushState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('replaceState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('go'),\n\t\t\targs: z.tuple([z.number().optional()]),\n\t\t}),\n\t\tz.object({ method: z.literal('forward'), args: z.tuple([]) }),\n\t\tz.object({ method: z.literal('back'), args: z.tuple([]) }),\n\t\tz.object({\n\t\t\tmethod: z.literal('popstate'),\n\t\t\tpathname: z.string(),\n\t\t\tdelta: z.number(),\n\t\t}),\n\t]),\n)\n\nconst loadedSchema = z.object({\n\ttype: z.literal('epicshop:loaded'),\n\turl: z.string(),\n})\n\nconst messageSchema = z.union([historyCallDataSchema, loadedSchema])\n\nfunction getNewIndex(prevIndex: number, delta: number, max: number) {\n\t// keep the index bound between 0 and the history length\n\treturn Math.min(Math.max(prevIndex + delta, 0), max)\n}\n\ntype Props = {\n\tid: string\n\tname: string\n\tport: number\n\tportIsAvailable: boolean | null\n\tisRunning: boolean\n\tbaseUrl: string\n\tinitialRoute: string\n}\n\nexport type InBrowserBrowserRef = {\n\thandleExtrnalNavigation: (pathname?: string) => void\n}\n\nexport const InBrowserBrowser = forwardRef<InBrowserBrowserRef, Props>(\n\tInBrowserBrowserImpl,\n)\n\nfunction InBrowserBrowserImpl(\n\t{ name, port, portIsAvailable, isRunning, baseUrl, id, initialRoute }: Props,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst requestInfo = useRequestInfo()\n\treturn isRunning ? (\n\t\t<InBrowserBrowserForRealz\n\t\t\tbaseUrl={baseUrl}\n\t\t\tid={id}\n\t\t\tname={name}\n\t\t\tref={ref}\n\t\t\tinitialRoute={initialRoute}\n\t\t/>\n\t) : portIsAvailable === false ? (\n\t\t<div className=\"flex flex-col items-center justify-center\">\n\t\t\t<p className=\"max-w-xs pb-5 text-center\" role=\"status\">\n\t\t\t\t{`The port for this app is unavailable. It could be that you're running it `}\n\t\t\t\t<a\n\t\t\t\t\thref={getBaseUrl({ domain: requestInfo.domain, port })}\n\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t>\n\t\t\t\t\telsewhere\n\t\t\t\t</a>\n\t\t\t\t?\n\t\t\t</p>\n\t\t\t<PortStopper port={port} />\n\t\t</div>\n\t) : (\n\t\t<AppStarter name={name} />\n\t)\n}\ntype RealBrowserProps = {\n\tbaseUrl: string\n\tid: string\n\tname: string\n\tinitialRoute: string\n}\n\nconst InBrowserBrowserForRealz = forwardRef<\n\tInBrowserBrowserRef,\n\tRealBrowserProps\n>(InBrowserBrowserForRealzImpl)\n\n// we're doing this to ensure all of this complex stuff doesn't happen unless\n// the iframe is actually rendered.\nfunction InBrowserBrowserForRealzImpl(\n\t{ baseUrl, id, name, initialRoute }: RealBrowserProps,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst [searchParams, setSearchParams] = useSearchParams()\n\tconst searchParamsPathname = searchParams.get('pathname') ?? initialRoute\n\tconst [iframeKeyNumber, setIframeKeyNumber] = useState(0)\n\tconst iframeKey = id + iframeKeyNumber\n\tconst lastDirectionRef = useRef<'forward' | 'back' | 'new'>('new')\n\tconst lastDirectionTimeout = useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t)\n\tconst [iframeContext, setIFrameContext] = useState({\n\t\thistory: [searchParamsPathname],\n\t\tindex: 0,\n\t})\n\tconst [pathnameInputValue, setPathnameInputValue] =\n\t\tuseState(searchParamsPathname)\n\tconst iframeRef = useRef<HTMLIFrameElement>(null)\n\n\tconst appUrl = new URL(searchParamsPathname, baseUrl)\n\tconst currentAppUrl = useRef(appUrl)\n\tuseEffect(() => {\n\t\tcurrentAppUrl.current = appUrl\n\t})\n\n\t/** changing the iframeSrcUrl will trigger a reload of the iframe */\n\tconst [iframeSrcUrl, setIframeSrcUrl] = useState(appUrl)\n\n\tconst currentId = useRef(id)\n\t// if the id changes, then we're going to reload the iframe, but we want to\n\t// make sure to preserve the pathname so we set the src to the current pathname\n\t// this is one of the few side-effects in render that are \"ok\"\n\tif (currentId.current !== id) {\n\t\tcurrentId.current = id\n\t\tsetIframeSrcUrl(currentAppUrl.current)\n\t}\n\tuseEffect(() => {\n\t\tcurrentId.current = id\n\t})\n\n\tuseEffect(() => {\n\t\tfunction handleMessage(messageEvent: MessageEvent) {\n\t\t\tif (messageEvent.source !== iframeRef.current?.contentWindow) return\n\n\t\t\tconst result = messageSchema.safeParse(messageEvent.data, {\n\t\t\t\tpath: ['messageEvent', 'data'],\n\t\t\t})\n\t\t\tif (!result.success) return\n\t\t\tconst { data } = result\n\n\t\t\tif (data.type === 'epicshop:loaded') {\n\t\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\t\tif (lastDirectionRef.current === 'back') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'forward') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'new') {\n\t\t\t\t\t\tconst currentPathname = prevContext.history[prevContext.index]\n\t\t\t\t\t\tconst newPathname = new URL(data.url).pathname\n\t\t\t\t\t\tif (currentPathname === newPathname) return prevContext\n\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tnewPathname,\n\t\t\t\t\t\t]\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Unexpected lastDirectionRef value')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst { method } = data\n\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\tconst currentPathname = prevContext.history[prevContext.index]\n\t\t\t\tswitch (method) {\n\t\t\t\t\tcase 'popstate': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(data.delta) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'forward': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'back': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'pushState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t].filter(Boolean)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'replaceState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: [\n\t\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index),\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t...prevContext.history.slice(prevContext.index + 1),\n\t\t\t\t\t\t\t].filter(Boolean),\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'go': {\n\t\t\t\t\t\tconst [delta = 0] = data.args\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(delta) }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\twindow.addEventListener('message', handleMessage)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', handleMessage)\n\t\t}\n\t}, [])\n\n\t// setSearchParams is unstable\n\t// https://github.com/remix-run/react-router/issues/9991\n\tconst setSearchParamsLatestRef = useRef(setSearchParams)\n\tuseEffect(() => {\n\t\tsetSearchParamsLatestRef.current = setSearchParams\n\t}, [setSearchParams])\n\n\tconst iframePathname = iframeContext.history[iframeContext.index]\n\tuseEffect(() => {\n\t\tif (!iframePathname) return\n\n\t\tsetPathnameInputValue(iframePathname)\n\n\t\tconst newSearchParams = new URLSearchParams(window.location.search)\n\t\tif (iframePathname === '/') {\n\t\t\tnewSearchParams.delete('pathname')\n\t\t} else {\n\t\t\tnewSearchParams.set('pathname', iframePathname)\n\t\t}\n\t\tconst newSearch = newSearchParams.toString()\n\t\tif (`?${newSearch}` !== window.location.search) {\n\t\t\tsetSearchParamsLatestRef.current(newSearchParams, { replace: true })\n\t\t}\n\t}, [iframePathname])\n\n\tconst navigateChild: NavigateFunction = (...params) => {\n\t\tconst to = params[0]\n\t\tif (typeof to === 'number') {\n\t\t\t// this part feels very brittle to me...\n\t\t\tlastDirectionRef.current = to > 0 ? 'forward' : 'back'\n\t\t} else {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}\n\t\tif (lastDirectionTimeout.current) {\n\t\t\tclearTimeout(lastDirectionTimeout.current)\n\t\t}\n\t\tlastDirectionTimeout.current = setTimeout(() => {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}, 100)\n\t\tiframeRef.current?.contentWindow?.postMessage(\n\t\t\t{ type: 'epicshop:navigate-call', params },\n\t\t\t'*',\n\t\t)\n\t}\n\n\tfunction handleExtrnalNavigation(\n\t\tnewPathnameInputValue: string = pathnameInputValue,\n\t) {\n\t\tsetPathnameInputValue(newPathnameInputValue)\n\n\t\tconst currentPathname = iframeContext.history[iframeContext.index]\n\t\tnavigateChild(newPathnameInputValue, {\n\t\t\treplace: currentPathname === newPathnameInputValue,\n\t\t})\n\t}\n\n\tuseImperativeHandle(ref, () => ({ handleExtrnalNavigation }))\n\n\tconst atEndOfHistory =\n\t\tiframeContext.index === iframeContext.history.length - 1\n\tconst atStartOfHistory = iframeContext.index <= 0\n\tconst existingSearchParamHiddenInputs: Array<React.ReactElement> = []\n\tfor (const [key, value] of searchParams.entries()) {\n\t\tif (key === 'pathname') continue\n\n\t\texistingSearchParamHiddenInputs.push(\n\t\t\t<input key={key} type=\"hidden\" name={key} value={value} />,\n\t\t)\n\t}\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<div className=\"flex h-full flex-grow flex-col\">\n\t\t\t\t<div className=\"flex items-center justify-between border-b pl-1.5\">\n\t\t\t\t\t<div className=\"mr-2 flex items-center justify-center gap-2 px-1\">\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atStartOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(-1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowLeft\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go back</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atEndOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowRight\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go forward</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetIframeSrcUrl(appUrl)\n\t\t\t\t\t\t\t\t\t\tsetIframeKeyNumber(iframeKeyNumber + 1)\n\t\t\t\t\t\t\t\t\t\t// TODO: figure out how we can avoid having to do this...\n\t\t\t\t\t\t\t\t\t\t// I stayed up for hours one night trying and couldn't work out\n\t\t\t\t\t\t\t\t\t\t// why react router wouldn't update the UI when using back/forward\n\t\t\t\t\t\t\t\t\t\t// after a refresh.\n\t\t\t\t\t\t\t\t\t\tsetIFrameContext({\n\t\t\t\t\t\t\t\t\t\t\thistory: [appUrl.pathname],\n\t\t\t\t\t\t\t\t\t\t\tindex: 0,\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>\n\t\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Refresh</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Form\n\t\t\t\t\t\tmethod=\"get\"\n\t\t\t\t\t\treplace\n\t\t\t\t\t\tclassName=\"flex flex-1 gap-2\"\n\t\t\t\t\t\tonSubmit={() => handleExtrnalNavigation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{existingSearchParamHiddenInputs}\n\t\t\t\t\t\t<div className=\"flex flex-1 items-center border-x bg-background p-3 leading-none text-foreground\">\n\t\t\t\t\t\t\t<a href={appUrl.toString()} target=\"_blank\" rel=\"noreferrer\">\n\t\t\t\t\t\t\t\t{iframeSrcUrl.host}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\taria-label=\"pathname\"\n\t\t\t\t\t\t\t\tclassName=\"w-full flex-1 bg-background focus-visible:outline-none\"\n\t\t\t\t\t\t\t\tvalue={pathnameInputValue}\n\t\t\t\t\t\t\t\tname=\"pathname\"\n\t\t\t\t\t\t\t\tonChange={(e) => setPathnameInputValue(e.currentTarget.value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/* TODO: Reconsider if this is needed as browsers don't usually have a submit button in address bar */}\n\t\t\t\t\t\t{/* <button type=\"submit\">Go</button> */}\n\t\t\t\t\t</Form>\n\t\t\t\t\t<AppStopper name={name} />\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={appUrl.toString()}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex aspect-square items-center justify-center px-3.5',\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<Icon name=\"ExternalLink\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>Open in new tab</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex h-full w-full flex-grow dark:bg-white\">\n\t\t\t\t\t<iframe\n\t\t\t\t\t\ttitle={name}\n\t\t\t\t\t\tkey={iframeKey}\n\t\t\t\t\t\tref={iframeRef}\n\t\t\t\t\t\tsrc={iframeSrcUrl.toString()}\n\t\t\t\t\t\tclassName=\"h-full w-full flex-grow bg-white\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</TooltipProvider>\n\t)\n}\n","import { type BaseExerciseStepApp } from '@epic-web/workshop-utils/apps.server'\nimport { Icon } from '#app/components/icons'\nimport {\n\tInBrowserBrowser,\n\ttype InBrowserBrowserRef,\n} from '#app/components/in-browser-browser'\nimport { useTheme } from '#app/routes/theme/index.js'\nimport { cn, getBaseUrl } from '#app/utils/misc'\nimport { useRequestInfo } from '#app/utils/request-info'\n\nexport function Preview({\n\tid,\n\tappInfo,\n\tinBrowserBrowserRef,\n}: {\n\tid?: string\n\tappInfo: {\n\t\tisRunning: boolean\n\t\tappName?: string\n\t\tname: string\n\t\ttitle: string\n\t\tportIsAvailable: boolean | null\n\t\ttype: string\n\t\tfullPath: string\n\t\tdev: BaseExerciseStepApp['dev']\n\t\ttest: BaseExerciseStepApp['test']\n\t\tstackBlitzUrl: BaseExerciseStepApp['stackBlitzUrl']\n\t} | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst requestInfo = useRequestInfo()\n\tconst theme = useTheme()\n\tif (!appInfo) return <p>No app here. Sorry.</p>\n\tconst { isRunning, dev, name, portIsAvailable, title } = appInfo\n\n\tif (ENV.EPICSHOP_DEPLOYED && appInfo.stackBlitzUrl) {\n\t\tconst url = new URL(appInfo.stackBlitzUrl)\n\t\turl.searchParams.set('embed', '1')\n\t\turl.searchParams.set('theme', theme)\n\n\t\treturn (\n\t\t\t<iframe\n\t\t\t\ttitle={title}\n\t\t\t\tsrc={url.toString()}\n\t\t\t\tclassName=\"h-full w-full flex-grow bg-white\"\n\t\t\t/>\n\t\t)\n\t}\n\n\tif (dev.type === 'script') {\n\t\tconst baseUrl = getBaseUrl({\n\t\t\tdomain: requestInfo.domain,\n\t\t\tport: dev.portNumber,\n\t\t})\n\t\treturn (\n\t\t\t<InBrowserBrowser\n\t\t\t\tref={inBrowserBrowserRef}\n\t\t\t\tisRunning={isRunning}\n\t\t\t\tid={id ?? name}\n\t\t\t\tname={name}\n\t\t\t\tportIsAvailable={portIsAvailable}\n\t\t\t\tport={dev.portNumber}\n\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\tinitialRoute={dev.initialRoute}\n\t\t\t/>\n\t\t)\n\t} else if (dev.type === 'browser') {\n\t\treturn (\n\t\t\t<div className=\"relative h-full flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<a\n\t\t\t\t\thref={dev.pathname}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'absolute bottom-5 right-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',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"ExternalLink\" aria-hidden=\"true\" />\n\t\t\t\t\t<span className=\"sr-only\">Open in New Window</span>\n\t\t\t\t</a>\n\t\t\t\t<iframe\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsrc={dev.pathname}\n\t\t\t\t\tclassName=\"h-full w-full flex-grow bg-white\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t} else {\n\t\treturn (\n\t\t\t<p>\n\t\t\t\tPreview for dev type of <code>{dev.type}</code> not supported.\n\t\t\t</p>\n\t\t)\n\t}\n}\n","import { toast as showToast } from 'sonner'\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>\n\t\t\t\t\t<div className=\"text-foreground-secondary flex h-full items-center justify-center text-2xl\">\n\t\t\t\t\t\tNon-UI playground\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"text-foreground-secondary flex flex-wrap gap-1 text-center\">\n\t\t\t\t\t\t\tNavigate to{' '}\n\t\t\t\t\t\t\t<SimpleTooltip content={playgroundAppInfo.fullPath}>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tplaygroundAppInfo.fullPath,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tshowToast.success('Copied playground path to clipboard')\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\t\tthe playground directory\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</SimpleTooltip>{' '}\n\t\t\t\t\t\t\tin your editor and terminal to work on this exercise!\n\t\t\t\t\t\t</div>\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 fs from 'node:fs'\nimport { setModifiedTimesForDir } from '@epic-web/workshop-utils/apps.server'\nimport { type EmbeddedFile } from '@epic-web/workshop-utils/codefile-mdx.server'\nimport { json, type ActionFunctionArgs } from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport { z } from 'zod'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\n\nconst cacheSchema = z.object({\n\tcacheLocation: z.string(),\n\tembeddedKey: z.string(),\n\tappFullPath: z.string(),\n})\n\nfunction checkFileExists(file: string) {\n\treturn fs.promises.access(file, fs.constants.F_OK).then(\n\t\t() => true,\n\t\t() => false,\n\t)\n}\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst rawData = {\n\t\tcacheLocation: formData.get('cacheLocation'),\n\t\tembeddedKey: formData.get('embeddedKey'),\n\t\tappFullPath: formData.get('appFullPath'),\n\t}\n\n\tconst { cacheLocation, embeddedKey, appFullPath } = cacheSchema.parse(rawData)\n\n\tif (!(await checkFileExists(cacheLocation))) {\n\t\tconsole.log(`file ${cacheLocation} not found`)\n\t\treturn json({ success: true })\n\t}\n\n\tconst cached = JSON.parse(\n\t\tawait fs.promises.readFile(cacheLocation, 'utf-8'),\n\t) as any\n\n\tconst cachedEmbeddedFiles = new Map<string, EmbeddedFile>(\n\t\tObject.entries(cached?.value?.embeddedFiles ?? {}),\n\t)\n\n\tif (cachedEmbeddedFiles.has(embeddedKey)) {\n\t\tdelete cachedEmbeddedFiles.get(embeddedKey)?.warning\n\n\t\tcached.value.embeddedFiles = Object.fromEntries(cachedEmbeddedFiles)\n\t}\n\n\ttry {\n\t\tcached.value.warningCancled = true\n\t\tawait fs.promises.writeFile(cacheLocation, JSON.stringify(cached))\n\t} catch (error) {\n\t\tconsole.log(\n\t\t\t`Error when trying to write cache file at ${cacheLocation}`,\n\t\t\terror,\n\t\t)\n\t}\n\tsetModifiedTimesForDir(appFullPath)\n\n\treturn json({ success: true })\n}\n\nexport function UpdateMdxCache({\n\thandleClick,\n\tcacheLocation,\n\tembeddedKey,\n\tappFullPath,\n}: {\n\thandleClick: () => void\n\tcacheLocation: string\n\tembeddedKey: string\n\tappFullPath: string\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\n\treturn (\n\t\t<fetcher.Form action=\"/update-mdx-cache\" method=\"POST\">\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"cacheLocation\" value={cacheLocation} />\n\t\t\t<input type=\"hidden\" name=\"embeddedKey\" value={embeddedKey} />\n\t\t\t<input type=\"hidden\" name=\"appFullPath\" value={appFullPath} />\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tonClick={handleClick}\n\t\t\t\tclassName={clsx(\n\t\t\t\t\t'launch_button',\n\t\t\t\t\tfetcher.state === 'idle' ? null : 'cursor-progress',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\tCancel Warning\n\t\t\t</button>\n\t\t</fetcher.Form>\n\t)\n}\n","import {\n\tLink,\n\tuseLoaderData,\n\tuseSearchParams,\n\ttype LinkProps,\n} from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { useState, type PropsWithChildren } from 'react'\nimport { EpicVideoInfoProvider } from '#app/components/epic-video.tsx'\nimport { Icon } from '#app/components/icons.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { LaunchEditor } from '#app/routes/launch-editor.tsx'\nimport { UpdateMdxCache } from '#app/routes/update-mdx-cache.tsx'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { cn, getBaseUrl } from '#app/utils/misc.tsx'\nimport { useRequestInfo } from '#app/utils/request-info.ts'\nimport { type loader } from '../_layout.tsx'\n\ntype StepContextType = {\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}\nconst StepContext = React.createContext<StepContextType | null>(null)\n\nfunction useStepContext() {\n\tconst context = React.useContext(StepContext)\n\tif (!context) {\n\t\tthrow new Error('useStepContext must be used within a StepContext.Provider')\n\t}\n\treturn context\n}\n\nfunction StepContextProvider({\n\tchildren,\n\tinBrowserBrowserRef,\n}: {\n\tchildren: React.ReactNode\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\treturn (\n\t\t<StepContext.Provider value={{ inBrowserBrowserRef }}>\n\t\t\t{children}\n\t\t</StepContext.Provider>\n\t)\n}\n\nconst stepMdxComponents = {\n\tCodeFile,\n\tCodeFileNotification,\n\tDiffLink,\n\tPrevDiffLink,\n\tNextDiffLink,\n\tInlineFile,\n\tLinkToApp,\n}\n\nexport function StepMdx({\n\tinBrowserBrowserRef,\n}: {\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tif (!data.exerciseStepApp.instructionsCode) return null\n\treturn (\n\t\t<StepContextProvider inBrowserBrowserRef={inBrowserBrowserRef}>\n\t\t\t<EpicVideoInfoProvider epicVideoInfosPromise={data.epicVideoInfosPromise}>\n\t\t\t\t<div className=\"prose dark:prose-invert sm:prose-lg\">\n\t\t\t\t\t<Mdx\n\t\t\t\t\t\tcode={data.exerciseStepApp.instructionsCode}\n\t\t\t\t\t\tcomponents={stepMdxComponents}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</EpicVideoInfoProvider>\n\t\t</StepContextProvider>\n\t)\n}\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\nfunction NextDiffLink({\n\tapp = 0,\n\tfullPage = false,\n\tchildren,\n}: {\n\tapp: number\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<DiffLink app1={app} app2={app + 1} fullPage={fullPage}>\n\t\t\t{children}\n\t\t</DiffLink>\n\t)\n}\n\nfunction PrevDiffLink({\n\tapp = -1,\n\tfullPage = false,\n\tchildren,\n}: {\n\tapp: number\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<DiffLink app1={app} app2={app + 1} fullPage={fullPage}>\n\t\t\t{children}\n\t\t</DiffLink>\n\t)\n}\n\nfunction DiffLink({\n\tapp1 = 0,\n\tapp2 = 1,\n\tchildren,\n\tfullPage = false,\n\tto,\n}: {\n\tapp1?: string | number | null\n\tapp2?: string | number | null\n\tto?: string\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tif (!to && !app1 && !app2) {\n\t\treturn (\n\t\t\t// @ts-expect-error 🤷‍♂️\n\t\t\t<callout-danger className=\"notification\">\n\t\t\t\t<div className=\"title\">DiffLink Error: invalid input</div>\n\t\t\t\t{/* @ts-expect-error 🤷‍♂️ */}\n\t\t\t</callout-danger>\n\t\t)\n\t}\n\n\tfunction getAppName(input: typeof app1) {\n\t\tif (typeof input === 'number') {\n\t\t\tconst stepIndex = data.exerciseIndex + input\n\t\t\treturn data.allApps[stepIndex]?.name\n\t\t}\n\t\tif (!input) return null\n\t\tfor (const { name, stepName } of data.allApps) {\n\t\t\tif (input === name || input === stepName) {\n\t\t\t\treturn name\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tif (to) {\n\t\tconst params = new URLSearchParams(to)\n\t\tapp1 = params.get('app1')\n\t\tapp2 = params.get('app2')\n\t}\n\tconst app1Name = getAppName(app1)\n\tconst app2Name = getAppName(app2)\n\tif (!app1Name || !app2Name) {\n\t\treturn (\n\t\t\t// @ts-expect-error 🤷‍♂️\n\t\t\t<callout-danger className=\"notification\">\n\t\t\t\t<div className=\"title\">DiffLink Error: invalid input</div>\n\t\t\t\t{!app1Name && <div>app1: \"{app1}\" is not a valid app name</div>}\n\t\t\t\t{!app2Name && <div>app2: \"{app2}\" is not a valid app name</div>}\n\t\t\t\t{/* @ts-expect-error 🤷‍♂️ */}\n\t\t\t</callout-danger>\n\t\t)\n\t}\n\n\tif (!to) {\n\t\tto = `app1=${app1Name}&app2=${app2Name}`\n\t}\n\tconst pathToDiff = fullPage\n\t\t? `/diff?${to}`\n\t\t: `?${decodeURIComponent(\n\t\t\t\twithParam(new URLSearchParams(), 'preview', `diff&${to}`).toString(),\n\t\t\t)}`\n\n\tif (!children) {\n\t\tchildren = (\n\t\t\t<span>\n\t\t\t\tGo to Diff {fullPage ? '' : 'Preview'} from: <code>{app1Name}</code> to:{' '}\n\t\t\t\t<code>{app2Name}</code>\n\t\t\t</span>\n\t\t)\n\t}\n\n\treturn <Link to={pathToDiff}>{children}</Link>\n}\n\nfunction CodeFile({ file }: { file: string }) {\n\treturn (\n\t\t<div className=\"border-4 border-[#ff4545] bg-[#ff454519] p-4 text-lg\">\n\t\t\tSomething went wrong compiling <b>CodeFile</b> for file: <u>{file}</u> to\n\t\t\tmarkdown\n\t\t</div>\n\t)\n}\n\nfunction CodeFileNotification({\n\tfile,\n\ttype = 'problem',\n\tchildren,\n\tvariant,\n\tcacheLocation,\n\tembeddedKey,\n\t...props\n}: {\n\tfile: string\n\ttype?: 'solution' | 'problem'\n\tchildren: React.ReactNode\n} & (\n\t| {\n\t\t\tvariant: 'error'\n\t\t\tcacheLocation?: never\n\t\t\tembeddedKey?: never\n\t }\n\t| {\n\t\t\tvariant: 'warning'\n\t\t\tcacheLocation: string\n\t\t\tembeddedKey: string\n\t }\n)) {\n\tconst [visibility, setVisibility] = useState('visible')\n\tconst data = useLoaderData<typeof loader>()\n\tconst app = data[type]\n\n\tconst handleClick = () => {\n\t\tif (visibility !== 'visible') return\n\t\tsetVisibility('collapse')\n\t\tsetTimeout(() => {\n\t\t\tsetVisibility('none')\n\t\t}, 400)\n\t}\n\n\tconst className = clsx(\n\t\t'rounded px-4 py-1 font-mono text-sm font-semibold outline-none transition duration-300 ease-in-out',\n\t\t{\n\t\t\t'bg-amber-300/70 hover:bg-amber-300/40 active:bg-amber-300/50':\n\t\t\t\tvariant === 'warning',\n\t\t\t'bg-red-300/70 hover:bg-red-300/40 active:bg-red-300/50':\n\t\t\t\tvariant === 'error',\n\t\t},\n\t)\n\n\treturn (\n\t\t<div\n\t\t\tclassName={clsx('notification important h-15 relative', {\n\t\t\t\t'duration-400 !my-0 !h-0 !py-0 !opacity-0 transition-all ease-out':\n\t\t\t\t\tvisibility !== 'visible',\n\t\t\t\thidden: visibility === 'none',\n\t\t\t})}\n\t\t>\n\t\t\t<div className=\"absolute right-3 top-3 z-50 flex gap-4\">\n\t\t\t\t{app ? (\n\t\t\t\t\t<div className={className} title={`Edit ${file}`}>\n\t\t\t\t\t\t<LaunchEditor appFile={file} appName={app.name} {...props}>\n\t\t\t\t\t\t\tEdit this File\n\t\t\t\t\t\t</LaunchEditor>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t{app && variant === 'warning' ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\ttitle={`Remove the warning from here and from ${file} cache file`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<UpdateMdxCache\n\t\t\t\t\t\t\thandleClick={handleClick}\n\t\t\t\t\t\t\tcacheLocation={cacheLocation}\n\t\t\t\t\t\t\tembeddedKey={embeddedKey}\n\t\t\t\t\t\t\tappFullPath={app.fullPath}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nfunction InlineFile({\n\tfile,\n\ttype = 'playground',\n\tchildren = <code>{file}</code>,\n\t...props\n}: Omit<PropsWithChildren<typeof LaunchEditor>, 'appName'> & {\n\tfile: string\n\ttype?: 'playground' | 'solution' | 'problem'\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst app = data[type] || data[data.type]\n\n\tconst info = (\n\t\t<div className=\"launch-editor-button-wrapper flex underline underline-offset-4\">\n\t\t\t{children}{' '}\n\t\t\t<svg height={24} width={24}>\n\t\t\t\t<use href={`/icons.svg#keyboard`} />\n\t\t\t</svg>\n\t\t</div>\n\t)\n\n\treturn ENV.EPICSHOP_DEPLOYED && app ? (\n\t\t<div className=\"inline-block grow\">\n\t\t\t<LaunchEditor appFile={file} appName={app.name} {...props}>\n\t\t\t\t{info}\n\t\t\t</LaunchEditor>\n\t\t</div>\n\t) : app ? (\n\t\t<div className=\"inline-block grow\">\n\t\t\t<LaunchEditor appFile={file} appName={app.name} {...props}>\n\t\t\t\t{info}\n\t\t\t</LaunchEditor>\n\t\t</div>\n\t) : type === 'playground' ? (\n\t\t// playground does not exist yet\n\t\t<SimpleTooltip content=\"You must 'Set to Playground' before opening a file\">\n\t\t\t<div className=\"inline-block grow cursor-not-allowed\">{info}</div>\n\t\t</SimpleTooltip>\n\t) : (\n\t\t<>children</>\n\t)\n}\n\nfunction getPreviewType(\n\tpreview: string | null,\n): 'playground' | 'problem' | 'solution' {\n\tif (preview === 'problem') return 'problem'\n\tif (preview === 'solution') return 'solution'\n\treturn 'playground'\n}\n\nfunction LinkToApp({\n\tto: appTo,\n\tchildren = <code>{appTo.toString()}</code>,\n\t...props\n}: LinkProps) {\n\tconst [searchParams] = useSearchParams()\n\tconst to = `?${withParam(\n\t\tsearchParams,\n\t\t'pathname',\n\t\tappTo.toString(),\n\t).toString()}`\n\tconst data = useLoaderData<typeof loader>()\n\tconst type = getPreviewType(searchParams.get('preview'))\n\tconst requestInfo = useRequestInfo()\n\tconst app = data[type]\n\tconst previewAppUrl =\n\t\tapp?.dev.type === 'script'\n\t\t\t? getBaseUrl({\n\t\t\t\t\tdomain: requestInfo.domain,\n\t\t\t\t\tport: app.dev.portNumber,\n\t\t\t\t})\n\t\t\t: data.playground?.dev.type === 'browser'\n\t\t\t\t? data.playground.dev.pathname\n\t\t\t\t: null\n\tconst { inBrowserBrowserRef } = useStepContext()\n\tconst href = previewAppUrl\n\t\t? previewAppUrl.slice(0, -1) + appTo.toString()\n\t\t: null\n\treturn (\n\t\t<div className=\"inline-flex items-center justify-between gap-1\">\n\t\t\t<Link\n\t\t\t\tto={to}\n\t\t\t\t{...props}\n\t\t\t\tclassName={cn(props.className, {\n\t\t\t\t\t'cursor-not-allowed': ENV.EPICSHOP_DEPLOYED,\n\t\t\t\t})}\n\t\t\t\ttitle={\n\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t? 'Cannot link to app in deployed version'\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tonClick={(event) => {\n\t\t\t\t\tif (ENV.EPICSHOP_DEPLOYED) event.preventDefault()\n\n\t\t\t\t\tprops.onClick?.(event)\n\t\t\t\t\tinBrowserBrowserRef.current?.handleExtrnalNavigation(appTo.toString())\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Link>\n\t\t\t{href ? (\n\t\t\t\t<SimpleTooltip content=\"Open in new tab\">\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\tclassName={cn('flex aspect-square items-center justify-center', {\n\t\t\t\t\t\t\t'cursor-not-allowed': ENV.EPICSHOP_DEPLOYED,\n\t\t\t\t\t\t})}\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t? 'Cannot link to app in deployed version'\n\t\t\t\t\t\t\t\t: 'Open in new tab'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tif (ENV.EPICSHOP_DEPLOYED) event.preventDefault()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t</a>\n\t\t\t\t</SimpleTooltip>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n","import * as Accordion from '@radix-ui/react-accordion'\nimport { useEffect, useRef, useState } from 'react'\nimport { z } from 'zod'\nimport AccordionComponent from '#app/components/accordion.tsx'\nimport { AnimatedBars, Icon } from './icons.tsx'\n\nconst testRunnerStatusDataSchema = z.intersection(\n\tz.object({\n\t\ttype: z.literal('epicshop:test-status-update'),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.union([\n\t\tz.object({ status: z.literal('pending') }),\n\t\tz.object({ status: z.literal('pass') }),\n\t\tz.object({ status: z.literal('fail'), error: z.string() }),\n\t]),\n)\n\nconst testRunnerTestStepDataSchema = z.object({\n\ttype: z.literal('epicshop:test-step-update'),\n\tstatus: z.literal('pass'),\n\ttitle: z.string(),\n\ttimestamp: z.number(),\n})\n\nconst testRunnerDataSchema = z.union([\n\ttestRunnerTestStepDataSchema,\n\ttestRunnerStatusDataSchema,\n])\n\ntype TestRunnerStatusData = z.infer<typeof testRunnerStatusDataSchema>\ntype TestRunnerTestStepData = z.infer<typeof testRunnerTestStepDataSchema>\n\nexport function InBrowserTestRunner({\n\tpathname,\n\ttestFile,\n}: {\n\tpathname: string\n\ttestFile: string\n}) {\n\tconst iframeRef = useRef<HTMLIFrameElement>(null)\n\tconst [message, setMessage] = useState<TestRunnerStatusData | null>(null)\n\tconst [testSteps, setTestSteps] = useState<Array<TestRunnerTestStepData>>([])\n\n\tuseEffect(() => {\n\t\tfunction handleMessage(messageEvent: MessageEvent) {\n\t\t\tif (messageEvent.source !== iframeRef.current?.contentWindow) return\n\t\t\tif ('request' in messageEvent.data) return\n\n\t\t\tconst result = testRunnerDataSchema.safeParse(messageEvent.data, {\n\t\t\t\tpath: ['messageEvent', 'data'],\n\t\t\t})\n\t\t\tif (!result.success) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Invalid message from test iframe`,\n\t\t\t\t\tmessageEvent.data,\n\t\t\t\t\tresult.error,\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst { data } = result\n\t\t\tif (data.type === 'epicshop:test-status-update') {\n\t\t\t\tif (data.status === 'pending') {\n\t\t\t\t\tsetTestSteps([])\n\t\t\t\t}\n\t\t\t\tsetMessage(data)\n\t\t\t}\n\t\t\tif (data.type === 'epicshop:test-step-update') {\n\t\t\t\tsetTestSteps((steps) => [...steps, data])\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('message', handleMessage)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', handleMessage)\n\t\t}\n\t}, [])\n\n\tconst statusEmoji = {\n\t\tpending: <AnimatedBars aria-label=\"Pending\" />,\n\t\tpass: (\n\t\t\t<Icon\n\t\t\t\tname=\"CheckSmall\"\n\t\t\t\taria-label=\"Passed\"\n\t\t\t\tclassName=\"text-emerald-700\"\n\t\t\t/>\n\t\t),\n\t\tfail: (\n\t\t\t<Icon\n\t\t\t\tname=\"Remove\"\n\t\t\t\taria-label=\"Failed\"\n\t\t\t\tclassName=\"text-foreground-danger\"\n\t\t\t/>\n\t\t),\n\t\tunknown: (\n\t\t\t<Icon name=\"Question\" aria-label=\"Unknown\" className=\"animate-pulse\" />\n\t\t),\n\t}[message?.status ?? 'unknown']\n\n\tconst sortedTestSteps = testSteps.sort((a, b) => a.timestamp - b.timestamp)\n\tconst testStepStatusEmojis = {\n\t\tpass: <Icon name=\"CheckSmall\" aria-label=\"Passed\" />,\n\t\tfail: <Icon name=\"Remove\" aria-label=\"Failed\" />,\n\t\tunknown: (\n\t\t\t<Icon name=\"Question\" aria-label=\"Unknown\" className=\"animate-pulse\" />\n\t\t),\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<Accordion.Root className=\"w-full\" type=\"multiple\">\n\t\t\t\t<AccordionComponent\n\t\t\t\t\ticon={statusEmoji}\n\t\t\t\t\ttitle={testFile}\n\t\t\t\t\tforceMount={true}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"not-prose\">\n\t\t\t\t\t\t<div className=\"p-5 pt-3\">\n\t\t\t\t\t\t\t<ul className=\"\">\n\t\t\t\t\t\t\t\t{sortedTestSteps.map((testStep) => (\n\t\t\t\t\t\t\t\t\t// sometimes the steps come in so fast that the timestamp is the same\n\t\t\t\t\t\t\t\t\t<li key={testStep.timestamp + testStep.title}>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-baseline gap-2 text-emerald-700\">\n\t\t\t\t\t\t\t\t\t\t\t<span>{testStepStatusEmojis[testStep.status]}</span>\n\t\t\t\t\t\t\t\t\t\t\t<pre className=\"whitespace-pre-wrap\">\n\t\t\t\t\t\t\t\t\t\t\t\t{testStep.title}\n\t\t\t\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t{message?.status === 'fail' ? (\n\t\t\t\t\t\t\t\t<div className=\"flex items-baseline gap-2 text-foreground-danger\">\n\t\t\t\t\t\t\t\t\t<span>{testStepStatusEmojis.fail}</span>\n\t\t\t\t\t\t\t\t\t<pre className=\"max-h-48 overflow-y-auto text-foreground-danger scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t\t\t\t\t\t{message.error}\n\t\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<iframe\n\t\t\t\t\t\t\t\tref={iframeRef}\n\t\t\t\t\t\t\t\ttitle={testFile}\n\t\t\t\t\t\t\t\tsrc={pathname + testFile}\n\t\t\t\t\t\t\t\tclassName=\"mt-5 min-h-[420px] w-full border bg-white\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex border-y\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\tiframeRef.current?.contentWindow?.location.reload()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"border-r p-3\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" aria-label=\"Rerun Tests\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={pathname + testFile}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\tclassName=\"border-r p-3\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" aria-label=\"Open in New Window\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</AccordionComponent>\n\t\t\t</Accordion.Root>\n\t\t</>\n\t)\n}\n","import { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tclearTestProcessEntry,\n\tgetTestProcessEntry,\n\tisTestRunning,\n\trunAppTests,\n} from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tjson,\n\ttype ActionFunctionArgs,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport AnsiToHTML from 'ansi-to-html'\nimport escapeHtml from 'lodash.escape'\nimport { useEffect, useReducer, useRef } from 'react'\nimport { useEventSource } from 'remix-utils/sse/react'\nimport { eventStream } from 'remix-utils/sse/server'\nimport { z } from 'zod'\nimport { AnimatedBars, Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\n\nconst testActionSchema = z.union([\n\tz.object({\n\t\tintent: z.literal('run'),\n\t\tname: z.string(),\n\t}),\n\tz.object({\n\t\tintent: z.literal('stop'),\n\t\tname: z.string(),\n\t}),\n\tz.object({\n\t\tintent: z.literal('clear'),\n\t\tname: z.string(),\n\t}),\n])\n\nconst testEventSchema = z.union([\n\tz.object({\n\t\ttype: z.literal('init'),\n\t\texitCode: z.number().nullable().optional(),\n\t\tisRunning: z.boolean(),\n\t\toutput: z.array(\n\t\t\tz.object({\n\t\t\t\ttype: z.union([z.literal('stdout'), z.literal('stderr')]),\n\t\t\t\thtml: z.string(),\n\t\t\t\ttimestamp: z.number(),\n\t\t\t}),\n\t\t),\n\t}),\n\tz.object({\n\t\ttype: z.union([z.literal('stdout'), z.literal('stderr')]),\n\t\tdata: z.string(),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal('exit'),\n\t\tisRunning: z.literal(false),\n\t\tcode: z.number().nullable(),\n\t}),\n])\nconst testEventQueueSchema = z.array(testEventSchema)\n\ntype TestEvent = z.infer<typeof testEventSchema>\ntype TestEventQueue = z.infer<typeof testEventQueueSchema>\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tensureUndeployed()\n\tconst url = new URL(request.url)\n\tconst name = url.searchParams.get('name')\n\tif (!name) {\n\t\treturn json({ error: 'Missing name' }, { status: 400 })\n\t}\n\tconst app = await getAppByName(name)\n\tif (!app) {\n\t\treturn json({ error: 'App not found' }, { status: 404 })\n\t}\n\tconst processEntry = getTestProcessEntry(app)\n\tif (!processEntry) {\n\t\treturn json({ error: 'App is not running tests' }, { status: 404 })\n\t}\n\treturn eventStream(request.signal, function setup(send) {\n\t\tconst ansi = new AnsiToHTML()\n\t\t// have to batch because the client may miss events if we send too many\n\t\t// too rapidly\n\t\tlet queue: TestEventQueue = []\n\t\tfunction sendEvent(event: TestEvent) {\n\t\t\tqueue.push(event)\n\t\t}\n\t\tconst interval = setInterval(() => {\n\t\t\tif (queue.length) {\n\t\t\t\tsend({ data: JSON.stringify(queue) })\n\t\t\t\tqueue = []\n\t\t\t}\n\t\t}, 10)\n\n\t\tconst isRunning = isTestRunning(app)\n\n\t\tsendEvent({\n\t\t\ttype: 'init',\n\t\t\texitCode: processEntry.exitCode,\n\t\t\tisRunning,\n\t\t\toutput: processEntry.output.map((line) => ({\n\t\t\t\ttype: line.type,\n\t\t\t\thtml: ansi.toHtml(escapeHtml(line.content)),\n\t\t\t\ttimestamp: line.timestamp,\n\t\t\t})),\n\t\t})\n\n\t\tconst testProcess = processEntry.process\n\t\tif (!testProcess) {\n\t\t\treturn () => {}\n\t\t}\n\n\t\tfunction handleStdOutData(data: Buffer) {\n\t\t\tsendEvent({\n\t\t\t\ttype: 'stdout',\n\t\t\t\tdata: ansi.toHtml(escapeHtml(data.toString('utf-8'))),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t})\n\t\t}\n\t\tfunction handleStdErrData(data: Buffer) {\n\t\t\tsendEvent({\n\t\t\t\ttype: 'stderr',\n\t\t\t\tdata: ansi.toHtml(escapeHtml(data.toString('utf-8'))),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t})\n\t\t}\n\t\tfunction handleExit(code: number) {\n\t\t\ttestProcess?.stdout?.off('data', handleStdOutData)\n\t\t\ttestProcess?.stderr?.off('data', handleStdErrData)\n\t\t\ttestProcess?.off('exit', handleExit)\n\t\t\tsendEvent({ type: 'exit', isRunning: false, code })\n\t\t}\n\t\ttestProcess.stdout?.on('data', handleStdOutData)\n\t\ttestProcess.stderr?.on('data', handleStdErrData)\n\t\ttestProcess.on('exit', handleExit)\n\t\treturn function cleanup() {\n\t\t\ttestProcess.stdout?.off('data', handleStdOutData)\n\t\t\ttestProcess.stderr?.off('data', handleStdErrData)\n\t\t\ttestProcess.off('exit', handleExit)\n\t\t\tclearInterval(interval)\n\t\t}\n\t})\n}\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst result = testActionSchema.safeParse({\n\t\tintent: formData.get('intent'),\n\t\tname: formData.get('name'),\n\t})\n\tif (!result.success) {\n\t\treturn json(\n\t\t\t{ success: false, error: result.error.flatten() },\n\t\t\t{ status: 400 },\n\t\t)\n\t}\n\tconst app = await getAppByName(result.data.name)\n\tif (!app) {\n\t\treturn json({ success: false, error: 'App not found' }, { status: 404 })\n\t}\n\tswitch (result.data.intent) {\n\t\tcase 'run': {\n\t\t\tvoid runAppTests(app)\n\t\t\treturn json({ success: true })\n\t\t}\n\t\tcase 'stop': {\n\t\t\tconst processEntry = getTestProcessEntry(app)\n\t\t\tif (processEntry) {\n\t\t\t\tprocessEntry.process?.kill()\n\t\t\t}\n\t\t\treturn json({ success: true })\n\t\t}\n\t\tcase 'clear': {\n\t\t\tclearTestProcessEntry(app)\n\t\t\treturn json({ success: true })\n\t\t}\n\t}\n}\n\nfunction simpleReducer<State>(prev: State, getNext: (prev: State) => State) {\n\treturn getNext(prev)\n}\n\nexport function TestOutput({ name }: { name: string }) {\n\ttype State = {\n\t\t/** version is used to trigger an unsubscribe and resubscribe to the event source */\n\t\tversion: number\n\t\tisRunning: boolean\n\t\texitCode: number | null | undefined\n\t\tlines: Array<{ type: 'stdout' | 'stderr'; html: string; timestamp: number }>\n\t}\n\tconst [state, dispatch] = useReducer(simpleReducer<State>, {\n\t\tversion: 0,\n\t\tisRunning: false,\n\t\texitCode: undefined,\n\t\tlines: [],\n\t})\n\tconst { version, isRunning, exitCode, lines } = state\n\tconst lastMessage = useEventSource(\n\t\t`/test?${new URLSearchParams({ name })}&v=${version}`,\n\t)\n\tuseEffect(() => {\n\t\tif (!lastMessage) return\n\n\t\tconst parsed = JSON.parse(lastMessage)\n\t\tconst result = testEventQueueSchema.safeParse(parsed)\n\t\tif (!result.success) {\n\t\t\tconsole.error(result.error.flatten())\n\t\t\treturn\n\t\t}\n\t\tfor (const event of result.data) {\n\t\t\tswitch (event.type) {\n\t\t\t\tcase 'exit': {\n\t\t\t\t\tconst { isRunning, code: exitCode } = event\n\t\t\t\t\tdispatch((prev) => ({ ...prev, isRunning, exitCode }))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'init': {\n\t\t\t\t\tconst { output, exitCode, isRunning } = event\n\t\t\t\t\tdispatch((prev) => ({ ...prev, lines: output, exitCode, isRunning }))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'stderr':\n\t\t\t\tcase 'stdout': {\n\t\t\t\t\tconst { type, data: html, timestamp } = event\n\t\t\t\t\tdispatch((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tlines: [...prev.lines, { type, html, timestamp }].sort(\n\t\t\t\t\t\t\t(a, b) => a.timestamp - b.timestamp,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tisRunning: true,\n\t\t\t\t\t}))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [lastMessage])\n\n\treturn (\n\t\t<div className=\"relative flex h-full w-full flex-col\">\n\t\t\t<div className=\"flex h-12 w-full flex-shrink-0 items-center justify-between border-b\">\n\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t{!isRunning && (\n\t\t\t\t\t\t<TestRunner\n\t\t\t\t\t\t\tname={name}\n\t\t\t\t\t\t\tonRun={() => {\n\t\t\t\t\t\t\t\tdispatch((prev) => ({\n\t\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t\texitCode: undefined,\n\t\t\t\t\t\t\t\t\tlines: [],\n\t\t\t\t\t\t\t\t\tversion: prev.version + 1,\n\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{isRunning ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className=\"flex h-full flex-grow items-center justify-center border-r px-3.5\">\n\t\t\t\t\t\t\t\t<AnimatedBars role=\"status\" aria-label=\"Running Tests\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<StopTest name={name} />\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{!isRunning && exitCode !== undefined && (\n\t\t\t\t\t<p className=\"pr-3.5 leading-none\">\n\t\t\t\t\t\t{exitCode === 0\n\t\t\t\t\t\t\t? `Tests passed`\n\t\t\t\t\t\t\t: `Test failed (exit code ${String(exitCode)})`}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t{!isRunning && exitCode !== undefined && (\n\t\t\t\t\t<ClearTest\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tonClear={() => {\n\t\t\t\t\t\t\tdispatch((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\texitCode: undefined,\n\t\t\t\t\t\t\t\tlines: [],\n\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex h-full flex-col gap-5 p-5\">\n\t\t\t\t<p className=\"font-mono text-sm font-medium uppercase\">Test Output</p>\n\t\t\t\t<pre className=\"shadow-on-scrollbox flex-1 overflow-y-scroll scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{lines.map((line) => (\n\t\t\t\t\t\t<code\n\t\t\t\t\t\t\tkey={line.timestamp}\n\t\t\t\t\t\t\tdata-type={line.type}\n\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t__html: line.html,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</pre>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nexport function TestRunner({\n\tname,\n\tonRun,\n}: {\n\tname: string\n\tonRun?: () => void\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst latestOnRun = useRef(onRun)\n\tuseEffect(() => {\n\t\tlatestOnRun.current = onRun\n\t}, [onRun])\n\tuseEffect(() => {\n\t\tif (fetcher.data?.success) {\n\t\t\tlatestOnRun.current?.()\n\t\t}\n\t}, [fetcher.data])\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/test\" className=\"h-full\">\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<SimpleTooltip\n\t\t\t\tcontent={fetcher.state === 'idle' ? 'Run Tests' : 'Running Tests...'}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tname=\"intent\"\n\t\t\t\t\tvalue=\"run\"\n\t\t\t\t\tclassName=\"flex h-full flex-grow items-center justify-center border-r px-3.5\"\n\t\t\t\t>\n\t\t\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t\t\t<Icon name=\"TriangleSmall\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<AnimatedBars role=\"status\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</SimpleTooltip>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function ClearTest({\n\tname,\n\tonClear,\n}: {\n\tname: string\n\tonClear?: () => void\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst latestOnClear = useRef(onClear)\n\tuseEffect(() => {\n\t\tlatestOnClear.current = onClear\n\t}, [onClear])\n\tuseEffect(() => {\n\t\tif (fetcher.data?.success) {\n\t\t\tlatestOnClear.current?.()\n\t\t}\n\t}, [fetcher.data])\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/test\" className=\"h-full\">\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<SimpleTooltip\n\t\t\t\tcontent={fetcher.state === 'idle' ? 'Clear Tests' : 'Clearing Tests...'}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tname=\"intent\"\n\t\t\t\t\tvalue=\"clear\"\n\t\t\t\t\tclassName=\"flex h-full flex-grow items-center justify-center border-l px-3.5\"\n\t\t\t\t>\n\t\t\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t\t\t<Icon name=\"Clear\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Icon name=\"Clear\" className=\"animate-pulse\" role=\"status\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</SimpleTooltip>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function StopTest({\n\tname,\n\tonStop,\n}: {\n\tname: string\n\tonStop?: () => void\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst latestOnStop = useRef(onStop)\n\tuseEffect(() => {\n\t\tlatestOnStop.current = onStop\n\t}, [onStop])\n\tuseEffect(() => {\n\t\tif (fetcher.data?.success) {\n\t\t\tlatestOnStop.current?.()\n\t\t}\n\t}, [fetcher.data])\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/test\" className=\"h-full\">\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<SimpleTooltip\n\t\t\t\tcontent={fetcher.state === 'idle' ? 'Stop Tests' : 'Stopping Tests...'}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tname=\"intent\"\n\t\t\t\t\tvalue=\"stop\"\n\t\t\t\t\tclassName=\"flex h-full flex-grow items-center justify-center border-r px-3.5\"\n\t\t\t\t>\n\t\t\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t\t\t<Icon name=\"Stop\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Icon name=\"Stop\" className=\"animate-pulse\" role=\"status\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</SimpleTooltip>\n\t\t</fetcher.Form>\n\t)\n}\n","import { type PlaygroundApp } from '@epic-web/workshop-utils/apps.server'\nimport { useState } from 'react'\nimport { Icon } from '#app/components/icons'\nimport { InBrowserTestRunner } from '#app/components/in-browser-test-runner'\nimport { TestOutput } from '#app/routes/test'\nimport { PlaygroundWindow } from './playground-window'\n\nexport function Tests({\n\tappInfo: playgroundAppInfo,\n\tproblemAppName,\n\tallApps,\n\tisUpToDate,\n}: {\n\tappInfo: Pick<PlaygroundApp, 'appName' | 'name' | 'type' | 'test'> | null\n\tproblemAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n\tisUpToDate: boolean\n}) {\n\tconst [inBrowserTestKey, setInBrowserTestKey] = useState(0)\n\tlet testUI = <p>No tests here. Sorry.</p>\n\tif (playgroundAppInfo?.test.type === 'script') {\n\t\ttestUI = <TestOutput name={playgroundAppInfo.name} />\n\t}\n\tif (playgroundAppInfo?.test.type === 'browser') {\n\t\tconst { pathname } = playgroundAppInfo.test\n\t\ttestUI = (\n\t\t\t<div\n\t\t\t\tclassName=\"flex h-full w-full flex-grow flex-col\"\n\t\t\t\tkey={inBrowserTestKey}\n\t\t\t>\n\t\t\t\t{playgroundAppInfo.test.testFiles.map((testFile) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={testFile}>\n\t\t\t\t\t\t\t<InBrowserTestRunner pathname={pathname} testFile={testFile} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t\t<div className=\"px-3 py-[21px]\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setInBrowserTestKey((c) => c + 1)}\n\t\t\t\t\t\tclassName=\"flex items-center gap-2 font-mono text-sm uppercase leading-none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"Refresh\" aria-hidden /> Rerun All Tests\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\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{testUI}\n\t\t</PlaygroundWindow>\n\t)\n}\n","\"use client\";\n\n// packages/react/popover/src/Popover.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar POPOVER_NAME = \"Popover\";\nvar [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);\nvar Popover = (props) => {\n const {\n __scopePopover,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = false\n } = props;\n const popperScope = usePopperScope(__scopePopover);\n const triggerRef = React.useRef(null);\n const [hasCustomAnchor, setHasCustomAnchor] = React.useState(false);\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange\n });\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n PopoverProvider,\n {\n scope: __scopePopover,\n contentId: useId(),\n triggerRef,\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n hasCustomAnchor,\n onCustomAnchorAdd: React.useCallback(() => setHasCustomAnchor(true), []),\n onCustomAnchorRemove: React.useCallback(() => setHasCustomAnchor(false), []),\n modal,\n children\n }\n ) });\n};\nPopover.displayName = POPOVER_NAME;\nvar ANCHOR_NAME = \"PopoverAnchor\";\nvar PopoverAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...anchorProps } = props;\n const context = usePopoverContext(ANCHOR_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const { onCustomAnchorAdd, onCustomAnchorRemove } = context;\n React.useEffect(() => {\n onCustomAnchorAdd();\n return () => onCustomAnchorRemove();\n }, [onCustomAnchorAdd, onCustomAnchorRemove]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nPopoverAnchor.displayName = ANCHOR_NAME;\nvar TRIGGER_NAME = \"PopoverTrigger\";\nvar PopoverTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...triggerProps } = props;\n const context = usePopoverContext(TRIGGER_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n const trigger = /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n return context.hasCustomAnchor ? trigger : /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: trigger });\n }\n);\nPopoverTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"PopoverPortal\";\nvar [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar PopoverPortal = (props) => {\n const { __scopePopover, forceMount, children, container } = props;\n const context = usePopoverContext(PORTAL_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopePopover, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nPopoverPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"PopoverContent\";\nvar PopoverContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopePopover);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(PopoverContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(PopoverContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nPopoverContent.displayName = CONTENT_NAME;\nvar PopoverContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const isRightClickOutsideRef = React.useRef(false);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n if (!isRightClickOutsideRef.current) context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(\n props.onPointerDownOutside,\n (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutsideRef.current = isRightClick;\n },\n { checkForDefaultPrevented: false }\n ),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nvar PopoverContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar PopoverContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopePopover,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n ...contentProps\n } = props;\n const context = usePopoverContext(CONTENT_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n useFocusGuards();\n return /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onInteractOutside,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onDismiss: () => context.onOpenChange(false),\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n \"data-state\": getState(context.open),\n role: \"dialog\",\n id: context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-popover-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-popover-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-popover-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-popover-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-popover-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n )\n }\n )\n }\n );\n }\n);\nvar CLOSE_NAME = \"PopoverClose\";\nvar PopoverClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...closeProps } = props;\n const context = usePopoverContext(CLOSE_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nPopoverClose.displayName = CLOSE_NAME;\nvar ARROW_NAME = \"PopoverArrow\";\nvar PopoverArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopePopover);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nPopoverArrow.displayName = ARROW_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar Root2 = Popover;\nvar Anchor2 = PopoverAnchor;\nvar Trigger = PopoverTrigger;\nvar Portal = PopoverPortal;\nvar Content2 = PopoverContent;\nvar Close = PopoverClose;\nvar Arrow2 = PopoverArrow;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n Close,\n Content2 as Content,\n Popover,\n PopoverAnchor,\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverTrigger,\n Portal,\n Root2 as Root,\n Trigger,\n createPopoverScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as Popover from '@radix-ui/react-popover'\nimport { Await, useLoaderData } from '@remix-run/react'\nimport * as React from 'react'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { LaunchEditor } from '#app/routes/launch-editor.tsx'\nimport { SetAppToPlayground } from '#app/routes/set-playground.tsx'\nimport { type loader } from '../_layout.tsx'\n\nfunction TouchedFiles() {\n\tconst data = useLoaderData<typeof loader>()\n\n\tconst [open, setOpen] = React.useState(false)\n\tconst contentRef = React.useRef<HTMLDivElement>(null)\n\n\tfunction handleLaunchUpdate() {\n\t\tsetOpen(false)\n\t}\n\n\tconst appName = data.playground?.appName\n\n\treturn (\n\t\t<>\n\t\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t\t<Popover.Trigger asChild>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName=\"flex h-full items-center gap-1 border-r px-6 py-3 font-mono text-sm uppercase\"\n\t\t\t\t\t\taria-label=\"Relevant Files\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"Files\" />\n\t\t\t\t\t\tFiles\n\t\t\t\t\t</button>\n\t\t\t\t</Popover.Trigger>\n\t\t\t\t<Popover.Portal>\n\t\t\t\t\t<Popover.Content\n\t\t\t\t\t\tref={contentRef}\n\t\t\t\t\t\tclassName=\"slideRightContent lg:slideUpContent invert-theme z-10 select-none rounded bg-background px-9 py-8 text-foreground\"\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tsideOffset={5}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"launch-editor-wrapper\">\n\t\t\t\t\t\t\t<strong className=\"inline-block px-2 pb-4 font-semibold uppercase\">\n\t\t\t\t\t\t\t\tRelevant Files\n\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t\t{data.problem &&\n\t\t\t\t\t\t\tdata.playground?.appName !== data.problem.name ? (\n\t\t\t\t\t\t\t\t<div className=\"mb-2 rounded p-1 font-mono font-medium\">\n\t\t\t\t\t\t\t\t\t<SetAppToPlayground appName={data.problem.name} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<div id=\"files\">\n\t\t\t\t\t\t\t\t<React.Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"Loading diff\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" className=\"h-8 w-8 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</SimpleTooltip>\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\t\t<Await\n\t\t\t\t\t\t\t\t\t\tresolve={data.diff}\n\t\t\t\t\t\t\t\t\t\terrorElement={\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-foreground-danger\">\n\t\t\t\t\t\t\t\t\t\t\t\tSomething went wrong.\n\t\t\t\t\t\t\t\t\t\t\t</div>\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{({ diffFiles }) => {\n\t\t\t\t\t\t\t\t\t\t\tif (!diffFiles) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground-danger\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tUnable to determine diff\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (typeof diffFiles === 'string') {\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground-danger\">{diffFiles}</p>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (!diffFiles.length) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn <p>No files changed</p>\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tconst props =\n\t\t\t\t\t\t\t\t\t\t\t\tappName || ENV.EPICSHOP_GITHUB_ROOT\n\t\t\t\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"You must 'Set to Playground' before opening a file\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName: 'not-allowed',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<ul {...props}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles.length > 1 && !ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mb-2 border-b border-b-gray-50 border-opacity-50 pb-2 font-sans\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<LaunchEditor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappFile={diffFiles.map(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(file) => `${file.path},${file.line},1`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappName=\"playground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonUpdate={handleLaunchUpdate}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>Open All Files</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</LaunchEditor>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles.map((file) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li key={file.path} data-state={file.status}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<LaunchEditor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappFile={`${file.path},${file.line},1`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappName={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? data.problem?.name ?? 'playground'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'playground'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonUpdate={handleLaunchUpdate}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<code>{file.path}</code>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</LaunchEditor>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</ul>\n\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</Await>\n\t\t\t\t\t\t\t\t</React.Suspense>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popover.Content>\n\t\t\t\t</Popover.Portal>\n\t\t\t</Popover.Root>\n\t\t</>\n\t)\n}\n\nexport default TouchedFiles\n","import { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetAppByName,\n\tgetAppDisplayName,\n\tgetAppPageRoute,\n\tgetApps,\n\tgetExerciseApp,\n\tgetNextExerciseApp,\n\tgetPrevExerciseApp,\n\tgetWorkshopTitle,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExercise,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport {\n\tisAppRunning,\n\tisPortAvailable,\n} from '@epic-web/workshop-utils/process-manager.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 {\n\tdefer,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n\ttype SerializeFrom,\n} from '@remix-run/node'\nimport {\n\tLink,\n\tuseLoaderData,\n\tuseNavigate,\n\tuseSearchParams,\n} from '@remix-run/react'\nimport slugify from '@sindresorhus/slugify'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { useRef } from 'react'\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 { NavChevrons } from '#app/components/nav-chevrons.tsx'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport { getDiscordAuthURL } from '#app/routes/discord.callback.ts'\nimport { EditFileOnGitHub } from '#app/routes/launch-editor.tsx'\nimport { ProgressToggle } from '#app/routes/progress.tsx'\nimport { SetAppToPlayground } from '#app/routes/set-playground.tsx'\nimport { getDiffCode, getDiffFiles } from '#app/utils/diff.server.ts'\nimport { getEpicVideoInfos } from '#app/utils/epic-api.ts'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { getSeoMetaTags } from '#app/utils/seo.js'\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 { StepMdx } from './__shared/step-mdx.tsx'\nimport { Tests } from './__shared/tests.tsx'\nimport TouchedFiles from './__shared/touched-files.tsx'\n\nfunction pageTitle(\n\tdata: SerializeFrom<typeof loader> | undefined,\n\tworkshopTitle?: string,\n) {\n\tconst exerciseNumber =\n\t\tdata?.exerciseStepApp.exerciseNumber.toString().padStart(2, '0') ?? '00'\n\tconst stepNumber =\n\t\tdata?.exerciseStepApp.stepNumber.toString().padStart(2, '0') ?? '00'\n\tconst emoji = (\n\t\t{\n\t\t\tproblem: '💪',\n\t\t\tsolution: '🏁',\n\t\t} as const\n\t)[data?.type ?? 'problem']\n\tconst title = data?.[data.type]?.title ?? 'N/A'\n\treturn {\n\t\temoji,\n\t\tstepNumber,\n\t\ttitle,\n\t\texerciseNumber,\n\t\texerciseTitle: data?.exerciseTitle ?? 'Unknown exercise',\n\t\tworkshopTitle,\n\t\ttype: data?.type ?? 'problem',\n\t}\n}\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tdata,\n\tmatches,\n\tparams,\n}) => {\n\tconst rootData = matches.find((m) => m.id === 'root')?.data\n\tif (!data || !rootData) return [{ title: '🦉 | Error' }]\n\tconst { emoji, stepNumber, title, exerciseNumber, exerciseTitle } =\n\t\tpageTitle(data)\n\n\treturn getSeoMetaTags({\n\t\ttitle: `${emoji} | ${stepNumber}. ${title} | ${exerciseNumber}. ${exerciseTitle} | ${rootData.workshopTitle}`,\n\t\tdescription: `${params.type} step for exercise ${exerciseNumber}. ${exerciseTitle}`,\n\t\togTitle: title,\n\t\togDescription: `${exerciseTitle} step ${Number(stepNumber)} ${params.type}`,\n\t\tinstructor: rootData.instructor,\n\t\trequestInfo: rootData.requestInfo,\n\t})\n}\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseStepTypeLoader')\n\tconst workshopTitle = await getWorkshopTitle()\n\tconst searchParams = new URL(request.url).searchParams\n\tconst cacheOptions = { request, timings }\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\tconst exercise = await requireExercise(\n\t\texerciseStepApp.exerciseNumber,\n\t\tcacheOptions,\n\t)\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 problemApp = await getExerciseApp(\n\t\t{ ...params, type: 'problem' },\n\t\tcacheOptions,\n\t)\n\tconst solutionApp = await getExerciseApp(\n\t\t{ ...params, type: 'solution' },\n\t\tcacheOptions,\n\t)\n\n\tif (!problemApp && !solutionApp) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst allAppsFull = await getApps(cacheOptions)\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\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\tasync function getAppRunningState(a: App) {\n\t\tif (a.dev.type !== 'script') {\n\t\t\treturn { isRunning: false, portIsAvailable: null }\n\t\t}\n\t\tconst isRunning = isAppRunning(a)\n\t\tconst portIsAvailable = isRunning\n\t\t\t? null\n\t\t\t: await isPortAvailable(a.dev.portNumber)\n\t\treturn { isRunning, portIsAvailable }\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\tconst exerciseId = getStepId(exerciseStepApp)\n\tconst exerciseIndex = allApps.findIndex((step) => step.stepId === exerciseId)\n\n\tconst exerciseApps = allAppsFull\n\t\t.filter(isExerciseStepApp)\n\t\t.filter((app) => app.exerciseNumber === exerciseStepApp.exerciseNumber)\n\tconst isLastStep =\n\t\texerciseApps[exerciseApps.length - 1]?.name === exerciseStepApp.name\n\tconst isFirstStep = exerciseApps[0]?.name === exerciseStepApp.name\n\n\tconst nextApp = await getNextExerciseApp(exerciseStepApp, cacheOptions)\n\tconst prevApp = await getPrevExerciseApp(exerciseStepApp, cacheOptions)\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\tdiffFiles: null,\n\t\t\t}\n\t\t}\n\t\tconst [diffCode, diffFiles] = await Promise.all([\n\t\t\tgetDiffCode(app1, app2, {\n\t\t\t\t...cacheOptions,\n\t\t\t\tforceFresh: searchParams.get('forceFresh') === 'diff',\n\t\t\t}).catch((e) => {\n\t\t\t\tconsole.error(e)\n\t\t\t\treturn null\n\t\t\t}),\n\t\t\tproblemApp && solutionApp\n\t\t\t\t? getDiffFiles(problemApp, solutionApp, {\n\t\t\t\t\t\t...cacheOptions,\n\t\t\t\t\t\tforceFresh: searchParams.get('forceFresh') === 'diff',\n\t\t\t\t\t}).catch((e) => {\n\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t\treturn 'There was a problem generating the diff'\n\t\t\t\t\t})\n\t\t\t\t: 'No diff available',\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\tdiffFiles,\n\t\t}\n\t}\n\n\tconst articleId = `workshop-${slugify(workshopTitle)}-${\n\t\texercise.exerciseNumber\n\t}-${exerciseStepApp.stepNumber}-${exerciseStepApp.type}`\n\treturn defer(\n\t\t{\n\t\t\tarticleId,\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\texerciseTitle: exercise.title,\n\t\t\tepicVideoInfosPromise: getEpicVideoInfos(exerciseStepApp.epicVideoEmbeds),\n\t\t\texerciseIndex,\n\t\t\tallApps,\n\t\t\tdiscordAuthUrl: getDiscordAuthURL(),\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\tprevStepLink: isFirstStep\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/${exerciseStepApp.exerciseNumber\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0')}`,\n\t\t\t\t\t}\n\t\t\t\t: prevApp\n\t\t\t\t\t? { to: getAppPageRoute(prevApp) }\n\t\t\t\t\t: null,\n\t\t\tnextStepLink: isLastStep\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/${exerciseStepApp.exerciseNumber\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0')}/finished`,\n\t\t\t\t\t}\n\t\t\t\t: nextApp\n\t\t\t\t\t? { to: getAppPageRoute(nextApp) }\n\t\t\t\t\t: null,\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} 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\tconst data = useLoaderData<typeof loader>()\n\tconst [searchParams] = useSearchParams()\n\n\tconst preview = searchParams.get('preview')\n\tconst inBrowserBrowserRef = useRef<InBrowserBrowserRef>(null)\n\n\tconst titleBits = pageTitle(data)\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!data.playground ||\n\t\t\t\tdata.playground.test.type === 'none'\n\t\t\t)\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution') {\n\t\t\tif (data[tab]?.dev.type === 'none') return true\n\t\t\tif (ENV.EPICSHOP_DEPLOYED) {\n\t\t\t\treturn data[tab]?.dev.type !== 'browser' && !data[tab]?.stackBlitzUrl\n\t\t\t}\n\t\t}\n\t\tif (tab === 'playground' && ENV.EPICSHOP_DEPLOYED) return true\n\t\treturn false\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: data.problem?.name ?? '',\n\t\tapp2: data.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\tnavigate(altDiffUrl)\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex max-w-full flex-grow flex-col\">\n\t\t\t<main className=\"flex flex-grow flex-col sm:grid sm:h-full sm:min-h-[800px] sm:grid-cols-1 sm:grid-rows-2 md:min-h-[unset] lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r\">\n\t\t\t\t\t<h1 className=\"h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight\">\n\t\t\t\t\t\t<div className=\"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-start gap-x-2 uppercase\">\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={`/${titleBits.exerciseNumber}`}\n\t\t\t\t\t\t\t\t\tclassName=\"hover:underline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{titleBits.exerciseNumber}. {titleBits.exerciseTitle}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t{'/'}\n\t\t\t\t\t\t\t\t<Link to=\".\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{titleBits.stepNumber}. {titleBits.title}\n\t\t\t\t\t\t\t\t\t{' ('}\n\t\t\t\t\t\t\t\t\t{titleBits.emoji} {titleBits.type}\n\t\t\t\t\t\t\t\t\t{')'}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{data.problem &&\n\t\t\t\t\t\t\tdata.playground?.appName !== data.problem.name ? (\n\t\t\t\t\t\t\t\t<div className=\"hidden md:block\">\n\t\t\t\t\t\t\t\t\t<SetAppToPlayground appName={data.problem.name} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</h1>\n\t\t\t\t\t<article\n\t\t\t\t\t\tid={data.articleId}\n\t\t\t\t\t\tkey={data.articleId}\n\t\t\t\t\t\tclassName=\"shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.exerciseStepApp.instructionsCode ? (\n\t\t\t\t\t\t\t<StepMdx inBrowserBrowserRef={inBrowserBrowserRef} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p>No instructions yet...</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</article>\n\t\t\t\t\t<ElementScrollRestoration\n\t\t\t\t\t\telementQuery={`#${data.articleId}`}\n\t\t\t\t\t\tkey={`scroll-${data.articleId}`}\n\t\t\t\t\t/>\n\t\t\t\t\t{data.type === 'solution' ? (\n\t\t\t\t\t\t<ProgressToggle\n\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\texerciseNumber={data.exerciseStepApp.exerciseNumber}\n\t\t\t\t\t\t\tstepNumber={data.exerciseStepApp.stepNumber}\n\t\t\t\t\t\t\tclassName=\"h-14 border-t px-6\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"flex h-16 justify-between border-b-4 border-t lg:border-b-0\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<div className=\"h-full\">\n\t\t\t\t\t\t\t\t<TouchedFiles />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\t\t\tappName={data.exerciseStepApp.name}\n\t\t\t\t\t\t\trelativePath={data.exerciseStepApp.relativePath}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<NavChevrons\n\t\t\t\t\t\t\tprev={\n\t\t\t\t\t\t\t\tdata.prevStepLink\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tto: data.prevStepLink.to,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': 'Previous Step',\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnext={\n\t\t\t\t\t\t\t\tdata.nextStepLink\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tto: data.nextStepLink.to,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': 'Next Step',\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Tabs.Root\n\t\t\t\t\tclassName=\"relative flex flex-col overflow-y-auto sm:col-span-1 sm:row-span-1\"\n\t\t\t\t\tvalue={activeTab}\n\t\t\t\t\t// intentionally no onValueChange here because the Link will trigger the\n\t\t\t\t\t// change.\n\t\t\t\t>\n\t\t\t\t\t<Tabs.List className=\"h-14 min-h-14 overflow-x-hidden border-b scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\t\t\tconst hidden = shouldHideTab(tab)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Tabs.Trigger key={tab} value={tab} hidden={hidden} asChild>\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tid={`${tab}-tab`}\n\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t'clip-path-button relative h-full px-6 py-4 font-mono text-sm uppercase outline-none 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',\n\t\t\t\t\t\t\t\t\t\t\thidden ? 'hidden' : 'inline-block',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tpreventScrollReset\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleDiffTabClick}\n\t\t\t\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\t\t\t\ttab === 'diff' && altDown\n\t\t\t\t\t\t\t\t\t\t\t\t? altDiffUrl\n\t\t\t\t\t\t\t\t\t\t\t\t: `?${withParam(\n\t\t\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\t\t'preview',\n\t\t\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\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{tab}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Tabs.List>\n\t\t\t\t\t<div className=\"relative z-10 flex min-h-96 flex-grow flex-col overflow-y-auto\">\n\t\t\t\t\t\t<Tabs.Content\n\t\t\t\t\t\t\tvalue=\"playground\"\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Playground\n\t\t\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t<Tabs.Content\n\t\t\t\t\t\t\tvalue=\"problem\"\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Preview\n\t\t\t\t\t\t\t\tappInfo={data.problem}\n\t\t\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t<Tabs.Content\n\t\t\t\t\t\t\tvalue=\"solution\"\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Preview\n\t\t\t\t\t\t\t\tappInfo={data.solution}\n\t\t\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t<Tabs.Content\n\t\t\t\t\t\t\tvalue=\"tests\"\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow items-start justify-center self-start overflow-hidden radix-state-inactive:hidden\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Tests\n\t\t\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t<Tabs.Content\n\t\t\t\t\t\t\tvalue=\"diff\"\n\t\t\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Diff diff={data.diff} allApps={data.allApps} />\n\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t<Tabs.Content\n\t\t\t\t\t\t\tvalue=\"chat\"\n\t\t\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<DiscordChat />\n\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t</div>\n\t\t\t\t</Tabs.Root>\n\t\t\t</main>\n\t\t</div>\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","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","createTabsScope","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","children","contentProps","isMountAnimationPreventedRef","rAF","Presence","present","baseId","Root2","List","Trigger","Content","SetPlayground","appName","reset","tooltipText","buttonProps","fetcher","useFetcher","submitButton","type","className","clsx","state","data","status","jsxs","Form","action","method","name","showProgressBarField","SimpleTooltip","content","PlaygroundChooser","playgroundAppName","allApps","Select","submit","placeholder","Icon","position","align","filter","app","map","SelectItem","displayName","SetAppToPlayground","ENV","EPICSHOP_DEPLOYED","t","e","module","this","n","r","i","s","u","a","o","c","f","h","d","l","y","M","m","v","g","D","p","S","w","O","b","$","k","dayjs","utcPlugin","timeZonePlugin","relativeTimePlugin","DiscordChat","useLoaderData","DiscordCTA","DiscordPosts","ctaLink","useDiscordCTALink","altDown","useAltDown","React.Suspense","Loading","Await","posts","post","DiscordPost","Link","thread","reactionsWithCounts","hints","useHints","Emoji","url","PlaygroundWindow","problemAppName","isUpToDate","isCorrectApp","playgroundLinkedUI","setPlaygroundTooltipText","AppStopper","inFlightIntent","formData","get","inFlightState","PortStopper","port","Button","varient","AppStarter","error","historyCallDataSchema","z","loadedSchema","messageSchema","getNewIndex","prevIndex","delta","max","InBrowserBrowser","forwardRef","InBrowserBrowserImpl","portIsAvailable","isRunning","baseUrl","initialRoute","requestInfo","useRequestInfo","InBrowserBrowserForRealz","getBaseUrl","InBrowserBrowserForRealzImpl","searchParams","setSearchParams","useSearchParams","searchParamsPathname","iframeKeyNumber","setIframeKeyNumber","useState","iframeKey","lastDirectionRef","useRef","lastDirectionTimeout","iframeContext","setIFrameContext","pathnameInputValue","setPathnameInputValue","iframeRef","appUrl","currentAppUrl","useEffect","iframeSrcUrl","setIframeSrcUrl","currentId","handleMessage","messageEvent","_a","result","prevContext","newIndex","currentPathname","newPathname","newHistory","pathname","setSearchParamsLatestRef","iframePathname","newSearchParams","navigateChild","params","to","_b","handleExtrnalNavigation","newPathnameInputValue","useImperativeHandle","atEndOfHistory","atStartOfHistory","existingSearchParamHiddenInputs","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Preview","appInfo","inBrowserBrowserRef","theme","useTheme","dev","title","cn","Playground","playgroundAppInfo","showToast","UpdateMdxCache","handleClick","cacheLocation","embeddedKey","appFullPath","onClick","StepContext","React.createContext","useStepContext","React.useContext","StepContextProvider","stepMdxComponents","CodeFile","CodeFileNotification","DiffLink","PrevDiffLink","NextDiffLink","InlineFile","LinkToApp","StepMdx","EpicVideoInfoProvider","Mdx","withParam","fullPage","app1","app2","getAppName","input","stepIndex","stepName","app1Name","app2Name","pathToDiff","file","variant","visibility","setVisibility","LaunchEditor","info","getPreviewType","preview","appTo","previewAppUrl","href","testRunnerStatusDataSchema","testRunnerTestStepDataSchema","testRunnerDataSchema","InBrowserTestRunner","testFile","message","setMessage","testSteps","setTestSteps","steps","statusEmoji","AnimatedBars","sortedTestSteps","testStepStatusEmojis","Fragment","Accordion.Root","AccordionComponent","testStep","testEventSchema","union","object","literal","exitCode","number","nullable","optional","boolean","output","html","string","timestamp","code","testEventQueueSchema","simpleReducer","prev","getNext","TestOutput","dispatch","useReducer","version","lines","lastMessage","useEventSource","URLSearchParams","parsed","JSON","parse","safeParse","success","console","flatten","sort","TestRunner","onRun","role","StopTest","String","ClearTest","onClear","line","dangerouslySetInnerHTML","__html","latestOnRun","current","latestOnClear","onStop","latestOnStop","Tests","inBrowserTestKey","setInBrowserTestKey","testUI","POPOVER_NAME","createPopoverContext","createPopoverScope","createPopperScope","usePopperScope","PopoverProvider","usePopoverContext","Popover","__scopePopover","openProp","defaultOpen","onOpenChange","modal","popperScope","triggerRef","hasCustomAnchor","setHasCustomAnchor","open","setOpen","PopperPrimitive.Root","prevOpen","ANCHOR_NAME","PopoverAnchor","anchorProps","onCustomAnchorAdd","onCustomAnchorRemove","PopperPrimitive.Anchor","PopoverTrigger","composedTriggerRef","trigger","getState","PORTAL_NAME","PortalProvider","usePortalContext","PopoverPortal","container","PortalPrimitive","PopoverContent","portalContext","PopoverContentModal","PopoverContentNonModal","contentRef","isRightClickOutsideRef","hideOthers","RemoveScroll","Slot","PopoverContentImpl","originalEvent","ctrlLeftClick","isRightClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","disableOutsidePointerEvents","onEscapeKeyDown","onPointerDownOutside","onFocusOutside","onInteractOutside","useFocusGuards","FocusScope","DismissableLayer","PopperPrimitive.Content","CLOSE_NAME","PopoverClose","closeProps","ARROW_NAME","PopoverArrow","arrowProps","PopperPrimitive.Arrow","Portal","Content2","TouchedFiles","handleLaunchUpdate","Popover.Root","Popover.Trigger","Popover.Portal","Popover.Content","diffFiles","pageTitle","workshopTitle","exerciseNumber","exerciseStepApp","toString","padStart","stepNumber","emoji","problem","solution","exerciseTitle","meta","matches","rootData","find","getSeoMetaTags","description","ogTitle","ogDescription","Number","instructor","tabs","isValidPreview","Boolean","includes","delete","set","ExercisePartRoute","titleBits","navigate","useNavigate","shouldHideTab","tab","playground","test","stackBlitzUrl","activeTab","altDiffUrl","handleDiffTabClick","altKey","ctrlKey","shiftKey","metaKey","preventDefault","articleId","instructionsCode","ElementScrollRestoration","elementQuery","ProgressToggle","EditFileOnGitHub","relativePath","NavChevrons","prevStepLink","next","nextStepLink","hidden","asChild","preventScrollReset","prefetch","Diff","diff","ErrorBoundary","GeneralErrorBoundary","statusHandlers"],"mappings":"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","x_google_ignoreList":[0,1,3,4,5,6,19]}
@@ -1,2 +0,0 @@
1
- import{c as e,j as r}from"./index-Czg1ruVn.js";import{d as o,c as m}from"./misc-CypjEQkt.js";import{D as p}from"./diff-P5f7-8E4.js";import{N as n}from"./nav-chevrons-BYKwyIgG.js";import{u as f,c}from"./components-BMzmvxYw.js";import"./clsx-B-dksMZM.js";import"./tooltip-CfmIzAYi.js";import"./index-4E9_Sx3m.js";import"./mdx-CR7Me1v_.js";import"./epic-video-CYnG2ziQ.js";import"./index-90bzTYUX.js";import"./request-info-CUT0ULYN.js";import"./client-hints-BE5mB4r0.js";import"./loading-CNWJVymJ.js";import"./progress-bar-DCrt7X4t.js";function k(){const s=f(),[i]=c();new URLSearchParams(i).set("forceFresh","diff");const a=e(),t=o.useSpinDelay(a.state!=="idle",{delay:200,minDuration:200});return r.jsxs("div",{className:m("grid h-full grid-rows-[1fr,auto]",{"cursor-wait opacity-30":t}),children:[r.jsx("div",{className:"overflow-y-auto",children:r.jsx(p,{diff:s.diff,allApps:s.allApps})}),r.jsx("div",{className:"flex h-16 items-center justify-end border-t",children:r.jsx(n,{prev:s.prevLink,next:s.nextLink})})]})}export{k as default};
2
- //# sourceMappingURL=diff-PfwTHr6-.js.map