@epic-web/workshop-app 4.5.0 → 4.6.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.
- package/bin/epicshop.js +3 -3
- package/build/client/assets/{_-CGn-2XfF.js → _-COWH0sBh.js} +2 -2
- package/build/client/assets/{_-CGn-2XfF.js.map → _-COWH0sBh.js.map} +1 -1
- package/build/client/assets/_exerciseNumber-rfzZiDNa.js +2 -0
- package/build/client/assets/_exerciseNumber-rfzZiDNa.js.map +1 -0
- package/build/client/assets/{_exerciseNumber_._stepNumber-D00x64Vg.js → _exerciseNumber_._stepNumber-C37pli7_.js} +2 -2
- package/build/client/assets/_exerciseNumber_._stepNumber-C37pli7_.js.map +1 -0
- package/build/client/assets/_exerciseNumber_.finished-B7SgnqdS.js +2 -0
- package/build/client/assets/_exerciseNumber_.finished-B7SgnqdS.js.map +1 -0
- package/build/client/assets/_layout-BG1Jwh7V.js +2 -0
- package/build/client/assets/_layout-BG1Jwh7V.js.map +1 -0
- package/build/client/assets/{_layout-Caqk73Ed.js → _layout-CNgYirUN.js} +2 -2
- package/build/client/assets/_layout-CNgYirUN.js.map +1 -0
- package/build/client/assets/{_layout-MFX35ekR.js → _layout-D0zbQZjf.js} +2 -2
- package/build/client/assets/_layout-D0zbQZjf.js.map +1 -0
- package/build/client/assets/{account-Cp6A7SfU.js → account-DesvwOeg.js} +2 -2
- package/build/client/assets/{account-Cp6A7SfU.js.map → account-DesvwOeg.js.map} +1 -1
- package/build/client/assets/diff-BKsbFB6w.js +42 -0
- package/build/client/assets/diff-BKsbFB6w.js.map +1 -0
- package/build/client/assets/{diff-Ddyuc0-s.js → diff-KDzcgGYL.js} +2 -2
- package/build/client/assets/diff-KDzcgGYL.js.map +1 -0
- package/build/client/assets/{discord-DZWTKMPn.js → discord-0kv66Q6F.js} +2 -2
- package/build/client/assets/{discord-DZWTKMPn.js.map → discord-0kv66Q6F.js.map} +1 -1
- package/build/client/assets/discord-Xp0X4-Fl.js +2 -0
- package/build/client/assets/discord-Xp0X4-Fl.js.map +1 -0
- package/build/client/assets/epic-video-BwtXsHGU.js +2988 -0
- package/build/client/assets/epic-video-BwtXsHGU.js.map +1 -0
- package/build/client/assets/{error-boundary-BUV7xD2e.js → error-boundary-Bcric_4t.js} +2 -2
- package/build/client/assets/error-boundary-Bcric_4t.js.map +1 -0
- package/build/client/assets/finished-BI2-0Ykt.js +2 -0
- package/build/client/assets/finished-BI2-0Ykt.js.map +1 -0
- package/build/client/assets/{index-CVJowtf6.js → index-BQRtqn3g.js} +2 -2
- package/build/client/assets/index-BQRtqn3g.js.map +1 -0
- package/build/client/assets/index-Bg9MMnnf.js +2 -0
- package/build/client/assets/index-Bg9MMnnf.js.map +1 -0
- package/build/client/assets/{login-BCM4kJTm.js → login-D8zyjBAb.js} +2 -2
- package/build/client/assets/{login-BCM4kJTm.js.map → login-D8zyjBAb.js.map} +1 -1
- package/build/client/assets/manifest-c65c0481.js +1 -0
- package/build/client/assets/{mdx-BVZ4sNxQ.js → mdx-BYvGbvEr.js} +2 -2
- package/build/client/assets/mdx-BYvGbvEr.js.map +1 -0
- package/build/client/assets/{misc-DBBsMyAP.js → misc-DNgC2Frq.js} +2 -2
- package/build/client/assets/{misc-DBBsMyAP.js.map → misc-DNgC2Frq.js.map} +1 -1
- package/build/client/assets/{nav-chevrons-DnG58Hov.js → nav-chevrons-DOYtx9XE.js} +2 -2
- package/build/client/assets/{nav-chevrons-DnG58Hov.js.map → nav-chevrons-DOYtx9XE.js.map} +1 -1
- package/build/client/assets/og-l0sNRNKZ.js +2 -0
- package/build/client/assets/og-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/{onboarding-oSo74A5L.js → onboarding-euWyXpCL.js} +2 -2
- package/build/client/assets/{onboarding-oSo74A5L.js.map → onboarding-euWyXpCL.js.map} +1 -1
- package/build/client/assets/presence-BJPzwbUy.js.map +1 -1
- package/build/client/assets/progress-CF9Xwfxf.js +2 -0
- package/build/client/assets/progress-CF9Xwfxf.js.map +1 -0
- package/build/client/assets/{progress-bar-TRgQ8YZ8.js → progress-bar-7LK87ZMh.js} +2 -2
- package/build/client/assets/progress-bar-7LK87ZMh.js.map +1 -0
- package/build/client/assets/{root-CxuwYUpK.js → root-BXq0yevS.js} +4 -4
- package/build/client/assets/root-BXq0yevS.js.map +1 -0
- package/build/client/assets/seo-CHrqghsC.js +2 -0
- package/build/client/assets/seo-CHrqghsC.js.map +1 -0
- package/build/client/assets/support-DUAHYT3r.js.map +1 -1
- package/build/client/assets/tooltip-Kw0lYWBI.js +2 -0
- package/build/client/assets/tooltip-Kw0lYWBI.js.map +1 -0
- package/build/client/img/epicweb-og-background.png +0 -0
- package/build/server/index.js +1816 -1472
- package/build/server/index.js.map +1 -1
- package/dist/server/index.js +0 -2
- package/node_modules/@babel/runtime/helpers/AwaitValue.js +2 -2
- package/node_modules/@babel/runtime/helpers/OverloadYield.js +2 -2
- package/node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js +7 -22
- package/node_modules/@babel/runtime/helpers/applyDecs2311.js +9 -9
- package/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +4 -4
- package/node_modules/@babel/runtime/helpers/arrayWithHoles.js +2 -2
- package/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +2 -2
- package/node_modules/@babel/runtime/helpers/assertThisInitialized.js +3 -5
- package/node_modules/@babel/runtime/helpers/asyncToGenerator.js +16 -21
- package/node_modules/@babel/runtime/helpers/checkPrivateRedeclaration.js +2 -4
- package/node_modules/@babel/runtime/helpers/classApplyDescriptorDestructureSet.js +7 -15
- package/node_modules/@babel/runtime/helpers/classApplyDescriptorGet.js +2 -5
- package/node_modules/@babel/runtime/helpers/classApplyDescriptorSet.js +4 -8
- package/node_modules/@babel/runtime/helpers/classCallCheck.js +2 -4
- package/node_modules/@babel/runtime/helpers/classCheckPrivateStaticAccess.js +2 -2
- package/node_modules/@babel/runtime/helpers/classCheckPrivateStaticFieldDescriptor.js +2 -4
- package/node_modules/@babel/runtime/helpers/classExtractFieldDescriptor.js +2 -2
- package/node_modules/@babel/runtime/helpers/classNameTDZError.js +2 -2
- package/node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js +3 -3
- package/node_modules/@babel/runtime/helpers/classPrivateFieldGet.js +3 -3
- package/node_modules/@babel/runtime/helpers/classPrivateFieldInitSpec.js +2 -3
- package/node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js +3 -5
- package/node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js +2 -2
- package/node_modules/@babel/runtime/helpers/classPrivateFieldSet.js +3 -4
- package/node_modules/@babel/runtime/helpers/classPrivateMethodGet.js +2 -3
- package/node_modules/@babel/runtime/helpers/classPrivateMethodInitSpec.js +2 -3
- package/node_modules/@babel/runtime/helpers/classStaticPrivateFieldDestructureSet.js +2 -4
- package/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js +2 -4
- package/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js +2 -5
- package/node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js +2 -3
- package/node_modules/@babel/runtime/helpers/construct.js +1 -1
- package/node_modules/@babel/runtime/helpers/createClass.js +8 -14
- package/node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js +24 -27
- package/node_modules/@babel/runtime/helpers/createForOfIteratorHelperLoose.js +11 -12
- package/node_modules/@babel/runtime/helpers/createSuper.js +10 -12
- package/node_modules/@babel/runtime/helpers/decorate.js +185 -278
- package/node_modules/@babel/runtime/helpers/defaults.js +6 -9
- package/node_modules/@babel/runtime/helpers/defineEnumerableProperties.js +8 -16
- package/node_modules/@babel/runtime/helpers/defineProperty.js +7 -13
- package/node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/AwaitValue.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/OverloadYield.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js +9 -23
- package/node_modules/@babel/runtime/helpers/esm/applyDecs.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/applyDecs2203.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/applyDecs2203R.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/applyDecs2301.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/applyDecs2305.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/applyDecs2311.js +12 -11
- package/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +6 -5
- package/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/assertClassBrand.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +5 -6
- package/node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/asyncIterator.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js +18 -22
- package/node_modules/@babel/runtime/helpers/esm/awaitAsyncGenerator.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/callSuper.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/checkInRHS.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/checkPrivateRedeclaration.js +4 -5
- package/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorDestructureSet.js +9 -16
- package/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorGet.js +4 -6
- package/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorSet.js +6 -9
- package/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +4 -5
- package/node_modules/@babel/runtime/helpers/esm/classCheckPrivateStaticAccess.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/classCheckPrivateStaticFieldDescriptor.js +4 -5
- package/node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/classNameTDZError.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldDestructureSet.js +5 -4
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js +5 -4
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet2.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldInitSpec.js +4 -4
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js +5 -6
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js +5 -5
- package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet2.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/classPrivateGetter.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/classPrivateMethodGet.js +4 -4
- package/node_modules/@babel/runtime/helpers/esm/classPrivateMethodInitSpec.js +4 -4
- package/node_modules/@babel/runtime/helpers/esm/classPrivateMethodSet.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/classPrivateSetter.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldDestructureSet.js +4 -5
- package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecGet.js +4 -5
- package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecSet.js +4 -6
- package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodGet.js +4 -4
- package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodSet.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/construct.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/createClass.js +10 -15
- package/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelper.js +26 -28
- package/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelperLoose.js +13 -13
- package/node_modules/@babel/runtime/helpers/esm/createSuper.js +12 -13
- package/node_modules/@babel/runtime/helpers/esm/decorate.js +187 -279
- package/node_modules/@babel/runtime/helpers/esm/defaults.js +8 -10
- package/node_modules/@babel/runtime/helpers/esm/defineAccessor.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/defineEnumerableProperties.js +10 -17
- package/node_modules/@babel/runtime/helpers/esm/defineProperty.js +9 -14
- package/node_modules/@babel/runtime/helpers/esm/dispose.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/extends.js +9 -13
- package/node_modules/@babel/runtime/helpers/esm/get.js +10 -16
- package/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +6 -6
- package/node_modules/@babel/runtime/helpers/esm/identity.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/importDeferProxy.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/inherits.js +11 -14
- package/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js +4 -5
- package/node_modules/@babel/runtime/helpers/esm/initializerDefineProperty.js +8 -8
- package/node_modules/@babel/runtime/helpers/esm/initializerWarningHelper.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/instanceof.js +4 -7
- package/node_modules/@babel/runtime/helpers/esm/interopRequireDefault.js +5 -4
- package/node_modules/@babel/runtime/helpers/esm/interopRequireWildcard.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/isNativeFunction.js +6 -5
- package/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimitLoose.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/jsx.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/maybeArrayLike.js +7 -6
- package/node_modules/@babel/runtime/helpers/esm/newArrowCheck.js +4 -5
- package/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/nullishReceiverError.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/objectSpread.js +11 -13
- package/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +10 -13
- package/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +9 -10
- package/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +6 -8
- package/node_modules/@babel/runtime/helpers/esm/readOnlyError.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/set.js +19 -37
- package/node_modules/@babel/runtime/helpers/esm/setFunctionName.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +6 -7
- package/node_modules/@babel/runtime/helpers/esm/skipFirstGeneratorNext.js +5 -5
- package/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/slicedToArrayLoose.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/superPropBase.js +5 -7
- package/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +5 -7
- package/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteralLoose.js +4 -7
- package/node_modules/@babel/runtime/helpers/esm/tdz.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/temporalRef.js +6 -5
- package/node_modules/@babel/runtime/helpers/esm/temporalUndefined.js +2 -1
- package/node_modules/@babel/runtime/helpers/esm/toArray.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/toSetter.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/typeof.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +8 -8
- package/node_modules/@babel/runtime/helpers/esm/using.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/usingCtx.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js +4 -3
- package/node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js +17 -20
- package/node_modules/@babel/runtime/helpers/esm/wrapRegExp.js +3 -2
- package/node_modules/@babel/runtime/helpers/esm/writeOnlyError.js +4 -3
- package/node_modules/@babel/runtime/helpers/extends.js +6 -11
- package/node_modules/@babel/runtime/helpers/get.js +7 -14
- package/node_modules/@babel/runtime/helpers/getPrototypeOf.js +4 -5
- package/node_modules/@babel/runtime/helpers/identity.js +2 -2
- package/node_modules/@babel/runtime/helpers/inherits.js +9 -13
- package/node_modules/@babel/runtime/helpers/inheritsLoose.js +2 -4
- package/node_modules/@babel/runtime/helpers/initializerDefineProperty.js +6 -7
- package/node_modules/@babel/runtime/helpers/initializerWarningHelper.js +2 -2
- package/node_modules/@babel/runtime/helpers/instanceof.js +2 -6
- package/node_modules/@babel/runtime/helpers/interopRequireDefault.js +3 -3
- package/node_modules/@babel/runtime/helpers/isNativeFunction.js +4 -4
- package/node_modules/@babel/runtime/helpers/iterableToArray.js +2 -2
- package/node_modules/@babel/runtime/helpers/maybeArrayLike.js +5 -5
- package/node_modules/@babel/runtime/helpers/newArrowCheck.js +2 -4
- package/node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js +2 -2
- package/node_modules/@babel/runtime/helpers/objectSpread.js +9 -12
- package/node_modules/@babel/runtime/helpers/objectWithoutProperties.js +8 -12
- package/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js +7 -9
- package/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js +4 -7
- package/node_modules/@babel/runtime/helpers/readOnlyError.js +2 -2
- package/node_modules/@babel/runtime/helpers/set.js +17 -36
- package/node_modules/@babel/runtime/helpers/setPrototypeOf.js +4 -6
- package/node_modules/@babel/runtime/helpers/skipFirstGeneratorNext.js +3 -4
- package/node_modules/@babel/runtime/helpers/slicedToArray.js +2 -2
- package/node_modules/@babel/runtime/helpers/slicedToArrayLoose.js +2 -2
- package/node_modules/@babel/runtime/helpers/superPropBase.js +3 -6
- package/node_modules/@babel/runtime/helpers/taggedTemplateLiteral.js +3 -6
- package/node_modules/@babel/runtime/helpers/taggedTemplateLiteralLoose.js +2 -6
- package/node_modules/@babel/runtime/helpers/tdz.js +2 -2
- package/node_modules/@babel/runtime/helpers/temporalRef.js +2 -2
- package/node_modules/@babel/runtime/helpers/toArray.js +2 -2
- package/node_modules/@babel/runtime/helpers/toConsumableArray.js +2 -2
- package/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +6 -7
- package/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js +2 -2
- package/node_modules/@babel/runtime/helpers/wrapNativeSuper.js +15 -19
- package/node_modules/@babel/runtime/helpers/writeOnlyError.js +2 -2
- package/node_modules/@babel/runtime/package.json +587 -587
- package/node_modules/@conform-to/dom/form.js +1 -1
- package/node_modules/@conform-to/dom/form.mjs +1 -1
- package/node_modules/@conform-to/dom/formdata.d.ts +2 -2
- package/node_modules/@conform-to/dom/formdata.js +12 -34
- package/node_modules/@conform-to/dom/formdata.mjs +12 -34
- package/node_modules/@conform-to/dom/intent.d.ts +82 -0
- package/node_modules/@conform-to/dom/intent.js +136 -0
- package/node_modules/@conform-to/dom/intent.mjs +126 -0
- package/node_modules/@conform-to/dom/package.json +58 -59
- package/node_modules/@conform-to/dom/parse.d.ts +30 -0
- package/node_modules/@conform-to/dom/parse.js +43 -0
- package/node_modules/@conform-to/dom/parse.mjs +37 -0
- package/node_modules/@conform-to/dom/submission.d.ts +2 -2
- package/node_modules/@conform-to/dom/submission.js +23 -21
- package/node_modules/@conform-to/dom/submission.mjs +23 -21
- package/node_modules/@conform-to/dom/types.d.ts +20 -0
- package/node_modules/@conform-to/react/helpers.js +1 -1
- package/node_modules/@conform-to/react/helpers.mjs +1 -1
- package/node_modules/@conform-to/react/package.json +68 -69
- package/node_modules/@conform-to/zod/package.json +60 -61
- package/node_modules/framer-motion/dist/cjs/{dom-entry-fJy-kji5.js → dom-entry-DSxBucW4.js} +115 -107
- package/node_modules/framer-motion/dist/cjs/dom-entry.js +1 -1
- package/node_modules/framer-motion/dist/cjs/index.js +43 -10
- package/node_modules/framer-motion/dist/dom-entry.d.ts +1 -1
- package/node_modules/framer-motion/dist/dom.js +1 -1
- package/node_modules/framer-motion/dist/es/animation/GroupPlaybackControls.mjs +2 -3
- package/node_modules/framer-motion/dist/es/animation/interfaces/motion-value.mjs +4 -1
- package/node_modules/framer-motion/dist/es/animation/interfaces/visual-element-target.mjs +2 -3
- package/node_modules/framer-motion/dist/es/animation/optimized-appear/get-appear-id.mjs +7 -0
- package/node_modules/framer-motion/dist/es/projection/node/create-projection-node.mjs +43 -9
- package/node_modules/framer-motion/dist/es/render/dom/DOMKeyframesResolver.mjs +11 -8
- package/node_modules/framer-motion/dist/es/render/utils/motion-values.mjs +1 -1
- package/node_modules/framer-motion/dist/es/value/index.mjs +1 -1
- package/node_modules/framer-motion/dist/framer-motion.dev.js +156 -116
- package/node_modules/framer-motion/dist/framer-motion.js +1 -1
- package/node_modules/framer-motion/dist/index.d.ts +2 -1
- package/node_modules/framer-motion/dist/projection.dev.js +163 -20
- package/node_modules/framer-motion/dist/three-entry.d.ts +1 -0
- package/node_modules/framer-motion/package.json +8 -8
- package/node_modules/remix-utils/node_modules/type-fest/package.json +1 -1
- package/node_modules/remix-utils/node_modules/type-fest/source/conditional-keys.d.ts +5 -3
- package/node_modules/tslib/package.json +1 -1
- package/node_modules/tslib/tslib.d.ts +1 -1
- package/node_modules/tslib/tslib.es6.js +7 -3
- package/node_modules/tslib/tslib.es6.mjs +10 -7
- package/node_modules/tslib/tslib.js +7 -4
- package/package.json +8 -6
- package/start.js +6 -4
- package/build/client/assets/_exerciseNumber-D6YNCQoj.js +0 -2
- package/build/client/assets/_exerciseNumber-D6YNCQoj.js.map +0 -1
- package/build/client/assets/_exerciseNumber_._stepNumber-D00x64Vg.js.map +0 -1
- package/build/client/assets/_exerciseNumber_.finished-DR3gQ1pK.js +0 -2
- package/build/client/assets/_exerciseNumber_.finished-DR3gQ1pK.js.map +0 -1
- package/build/client/assets/_layout-Caqk73Ed.js.map +0 -1
- package/build/client/assets/_layout-DXegGcTM.js +0 -2
- package/build/client/assets/_layout-DXegGcTM.js.map +0 -1
- package/build/client/assets/_layout-MFX35ekR.js.map +0 -1
- package/build/client/assets/diff-Ddyuc0-s.js.map +0 -1
- package/build/client/assets/diff-ZJmYghvh.js +0 -42
- package/build/client/assets/diff-ZJmYghvh.js.map +0 -1
- package/build/client/assets/discord-fsySDDKv.js +0 -2
- package/build/client/assets/discord-fsySDDKv.js.map +0 -1
- package/build/client/assets/epic-video-BKzHxm70.js +0 -2985
- package/build/client/assets/epic-video-BKzHxm70.js.map +0 -1
- package/build/client/assets/error-boundary-BUV7xD2e.js.map +0 -1
- package/build/client/assets/finished-gQ-B3k8j.js +0 -2
- package/build/client/assets/finished-gQ-B3k8j.js.map +0 -1
- package/build/client/assets/index-CVJowtf6.js.map +0 -1
- package/build/client/assets/index-Drecz7hr.js +0 -2
- package/build/client/assets/index-Drecz7hr.js.map +0 -1
- package/build/client/assets/manifest-0b01450d.js +0 -1
- package/build/client/assets/mdx-BVZ4sNxQ.js.map +0 -1
- package/build/client/assets/progress-HmjERaPh.js +0 -2
- package/build/client/assets/progress-HmjERaPh.js.map +0 -1
- package/build/client/assets/progress-bar-TRgQ8YZ8.js.map +0 -1
- package/build/client/assets/root-CxuwYUpK.js.map +0 -1
- package/build/client/assets/tooltip-BdTNdCYE.js +0 -2
- package/build/client/assets/tooltip-BdTNdCYE.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_layout-DXegGcTM.js","sources":["../../../../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../../../../node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../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/set-playground.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":["import $98Iye$babelruntimehelpersesmextends from \"@babel/runtime/helpers/esm/extends\";\nimport {forwardRef as $98Iye$forwardRef, createElement as $98Iye$createElement, useRef as $98Iye$useRef, useState as $98Iye$useState, useEffect as $98Iye$useEffect, useCallback as $98Iye$useCallback} from \"react\";\nimport {composeEventHandlers as $98Iye$composeEventHandlers} from \"@radix-ui/primitive\";\nimport {createCollection as $98Iye$createCollection} from \"@radix-ui/react-collection\";\nimport {useComposedRefs as $98Iye$useComposedRefs} from \"@radix-ui/react-compose-refs\";\nimport {createContextScope as $98Iye$createContextScope} from \"@radix-ui/react-context\";\nimport {useId as $98Iye$useId} from \"@radix-ui/react-id\";\nimport {Primitive as $98Iye$Primitive} from \"@radix-ui/react-primitive\";\nimport {useCallbackRef as $98Iye$useCallbackRef} from \"@radix-ui/react-use-callback-ref\";\nimport {useControllableState as $98Iye$useControllableState} from \"@radix-ui/react-use-controllable-state\";\nimport {useDirection as $98Iye$useDirection} from \"@radix-ui/react-direction\";\n\n\n\n\n\n\n\n\n\n\n\n\nconst $d7bdfb9eb0fdf311$var$ENTRY_FOCUS = 'rovingFocusGroup.onEntryFocus';\nconst $d7bdfb9eb0fdf311$var$EVENT_OPTIONS = {\n bubbles: false,\n cancelable: true\n};\n/* -------------------------------------------------------------------------------------------------\n * RovingFocusGroup\n * -----------------------------------------------------------------------------------------------*/ const $d7bdfb9eb0fdf311$var$GROUP_NAME = 'RovingFocusGroup';\nconst [$d7bdfb9eb0fdf311$var$Collection, $d7bdfb9eb0fdf311$var$useCollection, $d7bdfb9eb0fdf311$var$createCollectionScope] = $98Iye$createCollection($d7bdfb9eb0fdf311$var$GROUP_NAME);\nconst [$d7bdfb9eb0fdf311$var$createRovingFocusGroupContext, $d7bdfb9eb0fdf311$export$c7109489551a4f4] = $98Iye$createContextScope($d7bdfb9eb0fdf311$var$GROUP_NAME, [\n $d7bdfb9eb0fdf311$var$createCollectionScope\n]);\nconst [$d7bdfb9eb0fdf311$var$RovingFocusProvider, $d7bdfb9eb0fdf311$var$useRovingFocusContext] = $d7bdfb9eb0fdf311$var$createRovingFocusGroupContext($d7bdfb9eb0fdf311$var$GROUP_NAME);\nconst $d7bdfb9eb0fdf311$export$8699f7c8af148338 = /*#__PURE__*/ $98Iye$forwardRef((props, forwardedRef)=>{\n return /*#__PURE__*/ $98Iye$createElement($d7bdfb9eb0fdf311$var$Collection.Provider, {\n scope: props.__scopeRovingFocusGroup\n }, /*#__PURE__*/ $98Iye$createElement($d7bdfb9eb0fdf311$var$Collection.Slot, {\n scope: props.__scopeRovingFocusGroup\n }, /*#__PURE__*/ $98Iye$createElement($d7bdfb9eb0fdf311$var$RovingFocusGroupImpl, $98Iye$babelruntimehelpersesmextends({}, props, {\n ref: forwardedRef\n }))));\n});\n/*#__PURE__*/ Object.assign($d7bdfb9eb0fdf311$export$8699f7c8af148338, {\n displayName: $d7bdfb9eb0fdf311$var$GROUP_NAME\n});\n/* -----------------------------------------------------------------------------------------------*/ const $d7bdfb9eb0fdf311$var$RovingFocusGroupImpl = /*#__PURE__*/ $98Iye$forwardRef((props, forwardedRef)=>{\n const { __scopeRovingFocusGroup: __scopeRovingFocusGroup , orientation: orientation , loop: loop = false , dir: dir , currentTabStopId: currentTabStopIdProp , defaultCurrentTabStopId: defaultCurrentTabStopId , onCurrentTabStopIdChange: onCurrentTabStopIdChange , onEntryFocus: onEntryFocus , ...groupProps } = props;\n const ref = $98Iye$useRef(null);\n const composedRefs = $98Iye$useComposedRefs(forwardedRef, ref);\n const direction = $98Iye$useDirection(dir);\n const [currentTabStopId = null, setCurrentTabStopId] = $98Iye$useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId,\n onChange: onCurrentTabStopIdChange\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = $98Iye$useState(false);\n const handleEntryFocus = $98Iye$useCallbackRef(onEntryFocus);\n const getItems = $d7bdfb9eb0fdf311$var$useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = $98Iye$useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = $98Iye$useState(0);\n $98Iye$useEffect(()=>{\n const node = ref.current;\n if (node) {\n node.addEventListener($d7bdfb9eb0fdf311$var$ENTRY_FOCUS, handleEntryFocus);\n return ()=>node.removeEventListener($d7bdfb9eb0fdf311$var$ENTRY_FOCUS, handleEntryFocus)\n ;\n }\n }, [\n handleEntryFocus\n ]);\n return /*#__PURE__*/ $98Iye$createElement($d7bdfb9eb0fdf311$var$RovingFocusProvider, {\n scope: __scopeRovingFocusGroup,\n orientation: orientation,\n dir: direction,\n loop: loop,\n currentTabStopId: currentTabStopId,\n onItemFocus: $98Iye$useCallback((tabStopId)=>setCurrentTabStopId(tabStopId)\n , [\n setCurrentTabStopId\n ]),\n onItemShiftTab: $98Iye$useCallback(()=>setIsTabbingBackOut(true)\n , []),\n onFocusableItemAdd: $98Iye$useCallback(()=>setFocusableItemsCount((prevCount)=>prevCount + 1\n )\n , []),\n onFocusableItemRemove: $98Iye$useCallback(()=>setFocusableItemsCount((prevCount)=>prevCount - 1\n )\n , [])\n }, /*#__PURE__*/ $98Iye$createElement($98Iye$Primitive.div, $98Iye$babelruntimehelpersesmextends({\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation\n }, groupProps, {\n ref: composedRefs,\n style: {\n outline: 'none',\n ...props.style\n },\n onMouseDown: $98Iye$composeEventHandlers(props.onMouseDown, ()=>{\n isClickFocusRef.current = true;\n }),\n onFocus: $98Iye$composeEventHandlers(props.onFocus, (event)=>{\n // We normally wouldn't need this check, because we already check\n // that the focus is on the current target and not bubbling to it.\n // We do this because Safari doesn't focus buttons when clicked, and\n // instead, the wrapper will get focused and not through a bubbling event.\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent($d7bdfb9eb0fdf311$var$ENTRY_FOCUS, $d7bdfb9eb0fdf311$var$EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item)=>item.focusable\n );\n const activeItem = items.find((item)=>item.active\n );\n const currentItem = items.find((item)=>item.id === currentTabStopId\n );\n const candidateItems = [\n activeItem,\n currentItem,\n ...items\n ].filter(Boolean);\n const candidateNodes = candidateItems.map((item)=>item.ref.current\n );\n $d7bdfb9eb0fdf311$var$focusFirst(candidateNodes);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: $98Iye$composeEventHandlers(props.onBlur, ()=>setIsTabbingBackOut(false)\n )\n })));\n});\n/* -------------------------------------------------------------------------------------------------\n * RovingFocusGroupItem\n * -----------------------------------------------------------------------------------------------*/ const $d7bdfb9eb0fdf311$var$ITEM_NAME = 'RovingFocusGroupItem';\nconst $d7bdfb9eb0fdf311$export$ab9df7c53fe8454 = /*#__PURE__*/ $98Iye$forwardRef((props, forwardedRef)=>{\n const { __scopeRovingFocusGroup: __scopeRovingFocusGroup , focusable: focusable = true , active: active = false , tabStopId: tabStopId , ...itemProps } = props;\n const autoId = $98Iye$useId();\n const id = tabStopId || autoId;\n const context = $d7bdfb9eb0fdf311$var$useRovingFocusContext($d7bdfb9eb0fdf311$var$ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = $d7bdfb9eb0fdf311$var$useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd: onFocusableItemAdd , onFocusableItemRemove: onFocusableItemRemove } = context;\n $98Iye$useEffect(()=>{\n if (focusable) {\n onFocusableItemAdd();\n return ()=>onFocusableItemRemove()\n ;\n }\n }, [\n focusable,\n onFocusableItemAdd,\n onFocusableItemRemove\n ]);\n return /*#__PURE__*/ $98Iye$createElement($d7bdfb9eb0fdf311$var$Collection.ItemSlot, {\n scope: __scopeRovingFocusGroup,\n id: id,\n focusable: focusable,\n active: active\n }, /*#__PURE__*/ $98Iye$createElement($98Iye$Primitive.span, $98Iye$babelruntimehelpersesmextends({\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation\n }, itemProps, {\n ref: forwardedRef,\n onMouseDown: $98Iye$composeEventHandlers(props.onMouseDown, (event)=>{\n // We prevent focusing non-focusable items on `mousedown`.\n // Even though the item has tabIndex={-1}, that only means take it out of the tab order.\n if (!focusable) event.preventDefault(); // Safari doesn't focus a button when clicked so we run our logic on mousedown also\n else context.onItemFocus(id);\n }),\n onFocus: $98Iye$composeEventHandlers(props.onFocus, ()=>context.onItemFocus(id)\n ),\n onKeyDown: $98Iye$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 = $d7bdfb9eb0fdf311$var$getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== undefined) {\n event.preventDefault();\n const items = getItems().filter((item)=>item.focusable\n );\n let candidateNodes = items.map((item)=>item.ref.current\n );\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 ? $d7bdfb9eb0fdf311$var$wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n /**\n * Imperative focus during keydown is risky so we prevent React's batching updates\n * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332\n */ setTimeout(()=>$d7bdfb9eb0fdf311$var$focusFirst(candidateNodes)\n );\n }\n })\n })));\n});\n/*#__PURE__*/ Object.assign($d7bdfb9eb0fdf311$export$ab9df7c53fe8454, {\n displayName: $d7bdfb9eb0fdf311$var$ITEM_NAME\n});\n/* -----------------------------------------------------------------------------------------------*/ // prettier-ignore\nconst $d7bdfb9eb0fdf311$var$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 $d7bdfb9eb0fdf311$var$getDirectionAwareKey(key, dir) {\n if (dir !== 'rtl') return key;\n return key === 'ArrowLeft' ? 'ArrowRight' : key === 'ArrowRight' ? 'ArrowLeft' : key;\n}\nfunction $d7bdfb9eb0fdf311$var$getFocusIntent(event, orientation, dir) {\n const key = $d7bdfb9eb0fdf311$var$getDirectionAwareKey(event.key, dir);\n if (orientation === 'vertical' && [\n 'ArrowLeft',\n 'ArrowRight'\n ].includes(key)) return undefined;\n if (orientation === 'horizontal' && [\n 'ArrowUp',\n 'ArrowDown'\n ].includes(key)) return undefined;\n return $d7bdfb9eb0fdf311$var$MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction $d7bdfb9eb0fdf311$var$focusFirst(candidates) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates){\n // if focus is already where we want to go, we don't want to keep going through the candidates\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus();\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n/**\n * Wraps an array around itself at a given start index\n * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`\n */ function $d7bdfb9eb0fdf311$var$wrapArray(array, startIndex) {\n return array.map((_, index)=>array[(startIndex + index) % array.length]\n );\n}\nconst $d7bdfb9eb0fdf311$export$be92b6f5f03c0fe9 = $d7bdfb9eb0fdf311$export$8699f7c8af148338;\nconst $d7bdfb9eb0fdf311$export$6d08773d2e66f8f2 = $d7bdfb9eb0fdf311$export$ab9df7c53fe8454;\n\n\n\n\nexport {$d7bdfb9eb0fdf311$export$c7109489551a4f4 as createRovingFocusGroupScope, $d7bdfb9eb0fdf311$export$8699f7c8af148338 as RovingFocusGroup, $d7bdfb9eb0fdf311$export$ab9df7c53fe8454 as RovingFocusGroupItem, $d7bdfb9eb0fdf311$export$be92b6f5f03c0fe9 as Root, $d7bdfb9eb0fdf311$export$6d08773d2e66f8f2 as Item};\n//# sourceMappingURL=index.mjs.map\n","import $1IHzk$babelruntimehelpersesmextends from \"@babel/runtime/helpers/esm/extends\";\nimport {forwardRef as $1IHzk$forwardRef, createElement as $1IHzk$createElement, useRef as $1IHzk$useRef, useEffect as $1IHzk$useEffect} from \"react\";\nimport {composeEventHandlers as $1IHzk$composeEventHandlers} from \"@radix-ui/primitive\";\nimport {createContextScope as $1IHzk$createContextScope} from \"@radix-ui/react-context\";\nimport {createRovingFocusGroupScope as $1IHzk$createRovingFocusGroupScope, Root as $1IHzk$Root, Item as $1IHzk$Item} from \"@radix-ui/react-roving-focus\";\nimport {Presence as $1IHzk$Presence} from \"@radix-ui/react-presence\";\nimport {Primitive as $1IHzk$Primitive} from \"@radix-ui/react-primitive\";\nimport {useDirection as $1IHzk$useDirection} from \"@radix-ui/react-direction\";\nimport {useControllableState as $1IHzk$useControllableState} from \"@radix-ui/react-use-controllable-state\";\nimport {useId as $1IHzk$useId} from \"@radix-ui/react-id\";\n\n\n\n\n\n\n\n\n\n\n\n\n/* -------------------------------------------------------------------------------------------------\n * Tabs\n * -----------------------------------------------------------------------------------------------*/ const $69cb30bb0017df05$var$TABS_NAME = 'Tabs';\nconst [$69cb30bb0017df05$var$createTabsContext, $69cb30bb0017df05$export$355f5bd209d7b13a] = $1IHzk$createContextScope($69cb30bb0017df05$var$TABS_NAME, [\n $1IHzk$createRovingFocusGroupScope\n]);\nconst $69cb30bb0017df05$var$useRovingFocusGroupScope = $1IHzk$createRovingFocusGroupScope();\nconst [$69cb30bb0017df05$var$TabsProvider, $69cb30bb0017df05$var$useTabsContext] = $69cb30bb0017df05$var$createTabsContext($69cb30bb0017df05$var$TABS_NAME);\nconst $69cb30bb0017df05$export$b2539bed5023c21c = /*#__PURE__*/ $1IHzk$forwardRef((props, forwardedRef)=>{\n const { __scopeTabs: __scopeTabs , value: valueProp , onValueChange: onValueChange , defaultValue: defaultValue , orientation: orientation = 'horizontal' , dir: dir , activationMode: activationMode = 'automatic' , ...tabsProps } = props;\n const direction = $1IHzk$useDirection(dir);\n const [value, setValue] = $1IHzk$useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue\n });\n return /*#__PURE__*/ $1IHzk$createElement($69cb30bb0017df05$var$TabsProvider, {\n scope: __scopeTabs,\n baseId: $1IHzk$useId(),\n value: value,\n onValueChange: setValue,\n orientation: orientation,\n dir: direction,\n activationMode: activationMode\n }, /*#__PURE__*/ $1IHzk$createElement($1IHzk$Primitive.div, $1IHzk$babelruntimehelpersesmextends({\n dir: direction,\n \"data-orientation\": orientation\n }, tabsProps, {\n ref: forwardedRef\n })));\n});\n/*#__PURE__*/ Object.assign($69cb30bb0017df05$export$b2539bed5023c21c, {\n displayName: $69cb30bb0017df05$var$TABS_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * TabsList\n * -----------------------------------------------------------------------------------------------*/ const $69cb30bb0017df05$var$TAB_LIST_NAME = 'TabsList';\nconst $69cb30bb0017df05$export$9712d22edc0d78c1 = /*#__PURE__*/ $1IHzk$forwardRef((props, forwardedRef)=>{\n const { __scopeTabs: __scopeTabs , loop: loop = true , ...listProps } = props;\n const context = $69cb30bb0017df05$var$useTabsContext($69cb30bb0017df05$var$TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = $69cb30bb0017df05$var$useRovingFocusGroupScope(__scopeTabs);\n return /*#__PURE__*/ $1IHzk$createElement($1IHzk$Root, $1IHzk$babelruntimehelpersesmextends({\n asChild: true\n }, rovingFocusGroupScope, {\n orientation: context.orientation,\n dir: context.dir,\n loop: loop\n }), /*#__PURE__*/ $1IHzk$createElement($1IHzk$Primitive.div, $1IHzk$babelruntimehelpersesmextends({\n role: \"tablist\",\n \"aria-orientation\": context.orientation\n }, listProps, {\n ref: forwardedRef\n })));\n});\n/*#__PURE__*/ Object.assign($69cb30bb0017df05$export$9712d22edc0d78c1, {\n displayName: $69cb30bb0017df05$var$TAB_LIST_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * TabsTrigger\n * -----------------------------------------------------------------------------------------------*/ const $69cb30bb0017df05$var$TRIGGER_NAME = 'TabsTrigger';\nconst $69cb30bb0017df05$export$8114b9fdfdf9f3ba = /*#__PURE__*/ $1IHzk$forwardRef((props, forwardedRef)=>{\n const { __scopeTabs: __scopeTabs , value: value , disabled: disabled = false , ...triggerProps } = props;\n const context = $69cb30bb0017df05$var$useTabsContext($69cb30bb0017df05$var$TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = $69cb30bb0017df05$var$useRovingFocusGroupScope(__scopeTabs);\n const triggerId = $69cb30bb0017df05$var$makeTriggerId(context.baseId, value);\n const contentId = $69cb30bb0017df05$var$makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /*#__PURE__*/ $1IHzk$createElement($1IHzk$Item, $1IHzk$babelruntimehelpersesmextends({\n asChild: true\n }, rovingFocusGroupScope, {\n focusable: !disabled,\n active: isSelected\n }), /*#__PURE__*/ $1IHzk$createElement($1IHzk$Primitive.button, $1IHzk$babelruntimehelpersesmextends({\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? 'active' : 'inactive',\n \"data-disabled\": disabled ? '' : undefined,\n disabled: disabled,\n id: triggerId\n }, triggerProps, {\n ref: forwardedRef,\n onMouseDown: $1IHzk$composeEventHandlers(props.onMouseDown, (event)=>{\n // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)\n // but not when the control key is pressed (avoiding MacOS right click)\n if (!disabled && event.button === 0 && event.ctrlKey === false) context.onValueChange(value);\n else // prevent focus to avoid accidental activation\n event.preventDefault();\n }),\n onKeyDown: $1IHzk$composeEventHandlers(props.onKeyDown, (event)=>{\n if ([\n ' ',\n 'Enter'\n ].includes(event.key)) context.onValueChange(value);\n }),\n onFocus: $1IHzk$composeEventHandlers(props.onFocus, ()=>{\n // handle \"automatic\" activation if necessary\n // ie. activate tab following focus\n const isAutomaticActivation = context.activationMode !== 'manual';\n if (!isSelected && !disabled && isAutomaticActivation) context.onValueChange(value);\n })\n })));\n});\n/*#__PURE__*/ Object.assign($69cb30bb0017df05$export$8114b9fdfdf9f3ba, {\n displayName: $69cb30bb0017df05$var$TRIGGER_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * TabsContent\n * -----------------------------------------------------------------------------------------------*/ const $69cb30bb0017df05$var$CONTENT_NAME = 'TabsContent';\nconst $69cb30bb0017df05$export$bd905d70e8fd2ebb = /*#__PURE__*/ $1IHzk$forwardRef((props, forwardedRef)=>{\n const { __scopeTabs: __scopeTabs , value: value , forceMount: forceMount , children: children , ...contentProps } = props;\n const context = $69cb30bb0017df05$var$useTabsContext($69cb30bb0017df05$var$CONTENT_NAME, __scopeTabs);\n const triggerId = $69cb30bb0017df05$var$makeTriggerId(context.baseId, value);\n const contentId = $69cb30bb0017df05$var$makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = $1IHzk$useRef(isSelected);\n $1IHzk$useEffect(()=>{\n const rAF = requestAnimationFrame(()=>isMountAnimationPreventedRef.current = false\n );\n return ()=>cancelAnimationFrame(rAF)\n ;\n }, []);\n return /*#__PURE__*/ $1IHzk$createElement($1IHzk$Presence, {\n present: forceMount || isSelected\n }, ({ present: present })=>/*#__PURE__*/ $1IHzk$createElement($1IHzk$Primitive.div, $1IHzk$babelruntimehelpersesmextends({\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' : undefined\n }\n }), present && children)\n );\n});\n/*#__PURE__*/ Object.assign($69cb30bb0017df05$export$bd905d70e8fd2ebb, {\n displayName: $69cb30bb0017df05$var$CONTENT_NAME\n});\n/* ---------------------------------------------------------------------------------------------- */ function $69cb30bb0017df05$var$makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction $69cb30bb0017df05$var$makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nconst $69cb30bb0017df05$export$be92b6f5f03c0fe9 = $69cb30bb0017df05$export$b2539bed5023c21c;\nconst $69cb30bb0017df05$export$54c2e3dc7acea9f5 = $69cb30bb0017df05$export$9712d22edc0d78c1;\nconst $69cb30bb0017df05$export$41fb9f06171c75f4 = $69cb30bb0017df05$export$8114b9fdfdf9f3ba;\nconst $69cb30bb0017df05$export$7c6e2c02157bb7d2 = $69cb30bb0017df05$export$bd905d70e8fd2ebb;\n\n\n\n\nexport {$69cb30bb0017df05$export$355f5bd209d7b13a as createTabsScope, $69cb30bb0017df05$export$b2539bed5023c21c as Tabs, $69cb30bb0017df05$export$9712d22edc0d78c1 as TabsList, $69cb30bb0017df05$export$8114b9fdfdf9f3ba as TabsTrigger, $69cb30bb0017df05$export$bd905d70e8fd2ebb as TabsContent, $69cb30bb0017df05$export$be92b6f5f03c0fe9 as Root, $69cb30bb0017df05$export$54c2e3dc7acea9f5 as List, $69cb30bb0017df05$export$41fb9f06171c75f4 as Trigger, $69cb30bb0017df05$export$7c6e2c02157bb7d2 as Content};\n//# sourceMappingURL=index.mjs.map\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 { DiscordCTA, useDiscordCTALink } from '../../../discord.tsx'\nimport { type loader } from '../_layout.tsx'\nimport { type ThreadItemSchema } from './discord.server.ts'\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'\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 {\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 { type ActionFunctionArgs, json } 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","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 { type ActionFunctionArgs, json } 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 { type NavigateFunction, Form, useSearchParams } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport {\n\tuseEffect,\n\tforwardRef,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n\ttype ForwardedRef,\n} from 'react'\nimport { z } from 'zod'\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from './ui/tooltip.tsx'\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'\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// eslint-disable-next-line @typescript-eslint/no-use-before-define\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\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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=\"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\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=\"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\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=\"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 { 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} | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst requestInfo = useRequestInfo()\n\tif (!appInfo) return <p>No app here. Sorry.</p>\n\tconst { isRunning, dev, name, portIsAvailable, title } = appInfo\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 { PlaygroundWindow } from './playground-window'\nimport { Preview } from './preview'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser'\nimport { SimpleTooltip } from '#app/components/ui/tooltip'\nimport { SetAppToPlayground } from '#app/routes/set-playground'\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 { type ActionFunctionArgs, json } 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\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n\t\tObject.entries(cached?.value?.embeddedFiles ?? {}),\n\t)\n\n\tif (cachedEmbeddedFiles.has(embeddedKey)) {\n\t\tdelete cachedEmbeddedFiles.get(embeddedKey)?.warning\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\tcached.value.embeddedFiles = Object.fromEntries(cachedEmbeddedFiles)\n\t}\n\n\ttry {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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 { type loader } from '../_layout.tsx'\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'\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 { AnimatedBars, Icon } from './icons.tsx'\nimport AccordionComponent from '#app/components/accordion.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\ttype ActionFunctionArgs,\n\ttype LoaderFunctionArgs,\n\tjson,\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 { Icon, AnimatedBars } 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 { PlaygroundWindow } from './playground-window'\nimport { Icon } from '#app/components/icons'\nimport { InBrowserTestRunner } from '#app/components/in-browser-test-runner'\nimport { TestOutput } from '#app/routes/test'\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","import $am6gm$babelruntimehelpersesmextends from \"@babel/runtime/helpers/esm/extends\";\nimport {useRef as $am6gm$useRef, useState as $am6gm$useState, createElement as $am6gm$createElement, useCallback as $am6gm$useCallback, forwardRef as $am6gm$forwardRef, useEffect as $am6gm$useEffect} from \"react\";\nimport {composeEventHandlers as $am6gm$composeEventHandlers} from \"@radix-ui/primitive\";\nimport {useComposedRefs as $am6gm$useComposedRefs} from \"@radix-ui/react-compose-refs\";\nimport {createContextScope as $am6gm$createContextScope} from \"@radix-ui/react-context\";\nimport {DismissableLayer as $am6gm$DismissableLayer} from \"@radix-ui/react-dismissable-layer\";\nimport {useFocusGuards as $am6gm$useFocusGuards} from \"@radix-ui/react-focus-guards\";\nimport {FocusScope as $am6gm$FocusScope} from \"@radix-ui/react-focus-scope\";\nimport {useId as $am6gm$useId} from \"@radix-ui/react-id\";\nimport {createPopperScope as $am6gm$createPopperScope, Root as $am6gm$Root, Anchor as $am6gm$Anchor, Content as $am6gm$Content, Arrow as $am6gm$Arrow} from \"@radix-ui/react-popper\";\nimport {Portal as $am6gm$Portal} from \"@radix-ui/react-portal\";\nimport {Presence as $am6gm$Presence} from \"@radix-ui/react-presence\";\nimport {Primitive as $am6gm$Primitive} from \"@radix-ui/react-primitive\";\nimport {Slot as $am6gm$Slot} from \"@radix-ui/react-slot\";\nimport {useControllableState as $am6gm$useControllableState} from \"@radix-ui/react-use-controllable-state\";\nimport {hideOthers as $am6gm$hideOthers} from \"aria-hidden\";\nimport {RemoveScroll as $am6gm$RemoveScroll} from \"react-remove-scroll\";\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$POPOVER_NAME = 'Popover';\nconst [$cb5cc270b50c6fcd$var$createPopoverContext, $cb5cc270b50c6fcd$export$c8393c9e73286932] = $am6gm$createContextScope($cb5cc270b50c6fcd$var$POPOVER_NAME, [\n $am6gm$createPopperScope\n]);\nconst $cb5cc270b50c6fcd$var$usePopperScope = $am6gm$createPopperScope();\nconst [$cb5cc270b50c6fcd$var$PopoverProvider, $cb5cc270b50c6fcd$var$usePopoverContext] = $cb5cc270b50c6fcd$var$createPopoverContext($cb5cc270b50c6fcd$var$POPOVER_NAME);\nconst $cb5cc270b50c6fcd$export$5b6b19405a83ff9d = (props)=>{\n const { __scopePopover: __scopePopover , children: children , open: openProp , defaultOpen: defaultOpen , onOpenChange: onOpenChange , modal: modal = false } = props;\n const popperScope = $cb5cc270b50c6fcd$var$usePopperScope(__scopePopover);\n const triggerRef = $am6gm$useRef(null);\n const [hasCustomAnchor, setHasCustomAnchor] = $am6gm$useState(false);\n const [open = false, setOpen] = $am6gm$useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange\n });\n return /*#__PURE__*/ $am6gm$createElement($am6gm$Root, popperScope, /*#__PURE__*/ $am6gm$createElement($cb5cc270b50c6fcd$var$PopoverProvider, {\n scope: __scopePopover,\n contentId: $am6gm$useId(),\n triggerRef: triggerRef,\n open: open,\n onOpenChange: setOpen,\n onOpenToggle: $am6gm$useCallback(()=>setOpen((prevOpen)=>!prevOpen\n )\n , [\n setOpen\n ]),\n hasCustomAnchor: hasCustomAnchor,\n onCustomAnchorAdd: $am6gm$useCallback(()=>setHasCustomAnchor(true)\n , []),\n onCustomAnchorRemove: $am6gm$useCallback(()=>setHasCustomAnchor(false)\n , []),\n modal: modal\n }, children));\n};\n/*#__PURE__*/ Object.assign($cb5cc270b50c6fcd$export$5b6b19405a83ff9d, {\n displayName: $cb5cc270b50c6fcd$var$POPOVER_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * PopoverAnchor\n * -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$ANCHOR_NAME = 'PopoverAnchor';\nconst $cb5cc270b50c6fcd$export$96e5381f42521a79 = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const { __scopePopover: __scopePopover , ...anchorProps } = props;\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$ANCHOR_NAME, __scopePopover);\n const popperScope = $cb5cc270b50c6fcd$var$usePopperScope(__scopePopover);\n const { onCustomAnchorAdd: onCustomAnchorAdd , onCustomAnchorRemove: onCustomAnchorRemove } = context;\n $am6gm$useEffect(()=>{\n onCustomAnchorAdd();\n return ()=>onCustomAnchorRemove()\n ;\n }, [\n onCustomAnchorAdd,\n onCustomAnchorRemove\n ]);\n return /*#__PURE__*/ $am6gm$createElement($am6gm$Anchor, $am6gm$babelruntimehelpersesmextends({}, popperScope, anchorProps, {\n ref: forwardedRef\n }));\n});\n/*#__PURE__*/ Object.assign($cb5cc270b50c6fcd$export$96e5381f42521a79, {\n displayName: $cb5cc270b50c6fcd$var$ANCHOR_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * PopoverTrigger\n * -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$TRIGGER_NAME = 'PopoverTrigger';\nconst $cb5cc270b50c6fcd$export$7dacb05d26466c3 = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const { __scopePopover: __scopePopover , ...triggerProps } = props;\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$TRIGGER_NAME, __scopePopover);\n const popperScope = $cb5cc270b50c6fcd$var$usePopperScope(__scopePopover);\n const composedTriggerRef = $am6gm$useComposedRefs(forwardedRef, context.triggerRef);\n const trigger = /*#__PURE__*/ $am6gm$createElement($am6gm$Primitive.button, $am6gm$babelruntimehelpersesmextends({\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": $cb5cc270b50c6fcd$var$getState(context.open)\n }, triggerProps, {\n ref: composedTriggerRef,\n onClick: $am6gm$composeEventHandlers(props.onClick, context.onOpenToggle)\n }));\n return context.hasCustomAnchor ? trigger : /*#__PURE__*/ $am6gm$createElement($am6gm$Anchor, $am6gm$babelruntimehelpersesmextends({\n asChild: true\n }, popperScope), trigger);\n});\n/*#__PURE__*/ Object.assign($cb5cc270b50c6fcd$export$7dacb05d26466c3, {\n displayName: $cb5cc270b50c6fcd$var$TRIGGER_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * PopoverPortal\n * -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$PORTAL_NAME = 'PopoverPortal';\nconst [$cb5cc270b50c6fcd$var$PortalProvider, $cb5cc270b50c6fcd$var$usePortalContext] = $cb5cc270b50c6fcd$var$createPopoverContext($cb5cc270b50c6fcd$var$PORTAL_NAME, {\n forceMount: undefined\n});\nconst $cb5cc270b50c6fcd$export$dd679ffb4362d2d4 = (props)=>{\n const { __scopePopover: __scopePopover , forceMount: forceMount , children: children , container: container } = props;\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$PORTAL_NAME, __scopePopover);\n return /*#__PURE__*/ $am6gm$createElement($cb5cc270b50c6fcd$var$PortalProvider, {\n scope: __scopePopover,\n forceMount: forceMount\n }, /*#__PURE__*/ $am6gm$createElement($am6gm$Presence, {\n present: forceMount || context.open\n }, /*#__PURE__*/ $am6gm$createElement($am6gm$Portal, {\n asChild: true,\n container: container\n }, children)));\n};\n/*#__PURE__*/ Object.assign($cb5cc270b50c6fcd$export$dd679ffb4362d2d4, {\n displayName: $cb5cc270b50c6fcd$var$PORTAL_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * PopoverContent\n * -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$CONTENT_NAME = 'PopoverContent';\nconst $cb5cc270b50c6fcd$export$d7e1f420b25549ff = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const portalContext = $cb5cc270b50c6fcd$var$usePortalContext($cb5cc270b50c6fcd$var$CONTENT_NAME, props.__scopePopover);\n const { forceMount: forceMount = portalContext.forceMount , ...contentProps } = props;\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$CONTENT_NAME, props.__scopePopover);\n return /*#__PURE__*/ $am6gm$createElement($am6gm$Presence, {\n present: forceMount || context.open\n }, context.modal ? /*#__PURE__*/ $am6gm$createElement($cb5cc270b50c6fcd$var$PopoverContentModal, $am6gm$babelruntimehelpersesmextends({}, contentProps, {\n ref: forwardedRef\n })) : /*#__PURE__*/ $am6gm$createElement($cb5cc270b50c6fcd$var$PopoverContentNonModal, $am6gm$babelruntimehelpersesmextends({}, contentProps, {\n ref: forwardedRef\n })));\n});\n/*#__PURE__*/ Object.assign($cb5cc270b50c6fcd$export$d7e1f420b25549ff, {\n displayName: $cb5cc270b50c6fcd$var$CONTENT_NAME\n});\n/* -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$PopoverContentModal = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$CONTENT_NAME, props.__scopePopover);\n const contentRef = $am6gm$useRef(null);\n const composedRefs = $am6gm$useComposedRefs(forwardedRef, contentRef);\n const isRightClickOutsideRef = $am6gm$useRef(false); // aria-hide everything except the content (better supported equivalent to setting aria-modal)\n $am6gm$useEffect(()=>{\n const content = contentRef.current;\n if (content) return $am6gm$hideOthers(content);\n }, []);\n return /*#__PURE__*/ $am6gm$createElement($am6gm$RemoveScroll, {\n as: $am6gm$Slot,\n allowPinchZoom: true\n }, /*#__PURE__*/ $am6gm$createElement($cb5cc270b50c6fcd$var$PopoverContentImpl, $am6gm$babelruntimehelpersesmextends({}, props, {\n ref: composedRefs // we make sure we're not trapping once it's been closed\n ,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: $am6gm$composeEventHandlers(props.onCloseAutoFocus, (event)=>{\n var _context$triggerRef$c;\n event.preventDefault();\n if (!isRightClickOutsideRef.current) (_context$triggerRef$c = context.triggerRef.current) === null || _context$triggerRef$c === void 0 || _context$triggerRef$c.focus();\n }),\n onPointerDownOutside: $am6gm$composeEventHandlers(props.onPointerDownOutside, (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 }) // When focus is trapped, a `focusout` event may still happen.\n ,\n onFocusOutside: $am6gm$composeEventHandlers(props.onFocusOutside, (event)=>event.preventDefault()\n , {\n checkForDefaultPrevented: false\n })\n })));\n});\nconst $cb5cc270b50c6fcd$var$PopoverContentNonModal = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$CONTENT_NAME, props.__scopePopover);\n const hasInteractedOutsideRef = $am6gm$useRef(false);\n const hasPointerDownOutsideRef = $am6gm$useRef(false);\n return /*#__PURE__*/ $am6gm$createElement($cb5cc270b50c6fcd$var$PopoverContentImpl, $am6gm$babelruntimehelpersesmextends({}, props, {\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event)=>{\n var _props$onCloseAutoFoc;\n (_props$onCloseAutoFoc = props.onCloseAutoFocus) === null || _props$onCloseAutoFoc === void 0 || _props$onCloseAutoFoc.call(props, event);\n if (!event.defaultPrevented) {\n var _context$triggerRef$c2;\n if (!hasInteractedOutsideRef.current) (_context$triggerRef$c2 = context.triggerRef.current) === null || _context$triggerRef$c2 === void 0 || _context$triggerRef$c2.focus(); // Always prevent auto focus because we either focus manually or want user agent focus\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event)=>{\n var _props$onInteractOuts, _context$triggerRef$c3;\n (_props$onInteractOuts = props.onInteractOutside) === null || _props$onInteractOuts === void 0 || _props$onInteractOuts.call(props, event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === 'pointerdown') hasPointerDownOutsideRef.current = true;\n } // Prevent dismissing when clicking the trigger.\n // As the trigger is already setup to close, without doing so would\n // cause it to close and immediately open.\n const target = event.target;\n const targetIsTrigger = (_context$triggerRef$c3 = context.triggerRef.current) === null || _context$triggerRef$c3 === void 0 ? void 0 : _context$triggerRef$c3.contains(target);\n if (targetIsTrigger) event.preventDefault(); // On Safari if the trigger is inside a container with tabIndex={0}, when clicked\n // we will get the pointer down outside event on the trigger, but then a subsequent\n // focus outside event on the container, we ignore any focus outside event when we've\n // already had a pointer down outside event.\n if (event.detail.originalEvent.type === 'focusin' && hasPointerDownOutsideRef.current) event.preventDefault();\n }\n }));\n});\n/* -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$PopoverContentImpl = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const { __scopePopover: __scopePopover , trapFocus: trapFocus , onOpenAutoFocus: onOpenAutoFocus , onCloseAutoFocus: onCloseAutoFocus , disableOutsidePointerEvents: disableOutsidePointerEvents , onEscapeKeyDown: onEscapeKeyDown , onPointerDownOutside: onPointerDownOutside , onFocusOutside: onFocusOutside , onInteractOutside: onInteractOutside , ...contentProps } = props;\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$CONTENT_NAME, __scopePopover);\n const popperScope = $cb5cc270b50c6fcd$var$usePopperScope(__scopePopover); // Make sure the whole tree has focus guards as our `Popover` may be\n // the last element in the DOM (beacuse of the `Portal`)\n $am6gm$useFocusGuards();\n return /*#__PURE__*/ $am6gm$createElement($am6gm$FocusScope, {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus\n }, /*#__PURE__*/ $am6gm$createElement($am6gm$DismissableLayer, {\n asChild: true,\n disableOutsidePointerEvents: disableOutsidePointerEvents,\n onInteractOutside: onInteractOutside,\n onEscapeKeyDown: onEscapeKeyDown,\n onPointerDownOutside: onPointerDownOutside,\n onFocusOutside: onFocusOutside,\n onDismiss: ()=>context.onOpenChange(false)\n }, /*#__PURE__*/ $am6gm$createElement($am6gm$Content, $am6gm$babelruntimehelpersesmextends({\n \"data-state\": $cb5cc270b50c6fcd$var$getState(context.open),\n role: \"dialog\",\n id: context.contentId\n }, popperScope, contentProps, {\n ref: forwardedRef,\n style: {\n ...contentProps.style,\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 * PopoverClose\n * -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$CLOSE_NAME = 'PopoverClose';\nconst $cb5cc270b50c6fcd$export$d6ac43ebaa40d53e = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const { __scopePopover: __scopePopover , ...closeProps } = props;\n const context = $cb5cc270b50c6fcd$var$usePopoverContext($cb5cc270b50c6fcd$var$CLOSE_NAME, __scopePopover);\n return /*#__PURE__*/ $am6gm$createElement($am6gm$Primitive.button, $am6gm$babelruntimehelpersesmextends({\n type: \"button\"\n }, closeProps, {\n ref: forwardedRef,\n onClick: $am6gm$composeEventHandlers(props.onClick, ()=>context.onOpenChange(false)\n )\n }));\n});\n/*#__PURE__*/ Object.assign($cb5cc270b50c6fcd$export$d6ac43ebaa40d53e, {\n displayName: $cb5cc270b50c6fcd$var$CLOSE_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * PopoverArrow\n * -----------------------------------------------------------------------------------------------*/ const $cb5cc270b50c6fcd$var$ARROW_NAME = 'PopoverArrow';\nconst $cb5cc270b50c6fcd$export$3152841115e061b2 = /*#__PURE__*/ $am6gm$forwardRef((props, forwardedRef)=>{\n const { __scopePopover: __scopePopover , ...arrowProps } = props;\n const popperScope = $cb5cc270b50c6fcd$var$usePopperScope(__scopePopover);\n return /*#__PURE__*/ $am6gm$createElement($am6gm$Arrow, $am6gm$babelruntimehelpersesmextends({}, popperScope, arrowProps, {\n ref: forwardedRef\n }));\n});\n/*#__PURE__*/ Object.assign($cb5cc270b50c6fcd$export$3152841115e061b2, {\n displayName: $cb5cc270b50c6fcd$var$ARROW_NAME\n});\n/* -----------------------------------------------------------------------------------------------*/ function $cb5cc270b50c6fcd$var$getState(open) {\n return open ? 'open' : 'closed';\n}\nconst $cb5cc270b50c6fcd$export$be92b6f5f03c0fe9 = $cb5cc270b50c6fcd$export$5b6b19405a83ff9d;\nconst $cb5cc270b50c6fcd$export$b688253958b8dfe7 = $cb5cc270b50c6fcd$export$96e5381f42521a79;\nconst $cb5cc270b50c6fcd$export$41fb9f06171c75f4 = $cb5cc270b50c6fcd$export$7dacb05d26466c3;\nconst $cb5cc270b50c6fcd$export$602eac185826482c = $cb5cc270b50c6fcd$export$dd679ffb4362d2d4;\nconst $cb5cc270b50c6fcd$export$7c6e2c02157bb7d2 = $cb5cc270b50c6fcd$export$d7e1f420b25549ff;\nconst $cb5cc270b50c6fcd$export$f39c2d165cd861fe = $cb5cc270b50c6fcd$export$d6ac43ebaa40d53e;\nconst $cb5cc270b50c6fcd$export$21b07c8f274aebd5 = $cb5cc270b50c6fcd$export$3152841115e061b2;\n\n\n\n\nexport {$cb5cc270b50c6fcd$export$c8393c9e73286932 as createPopoverScope, $cb5cc270b50c6fcd$export$5b6b19405a83ff9d as Popover, $cb5cc270b50c6fcd$export$96e5381f42521a79 as PopoverAnchor, $cb5cc270b50c6fcd$export$7dacb05d26466c3 as PopoverTrigger, $cb5cc270b50c6fcd$export$dd679ffb4362d2d4 as PopoverPortal, $cb5cc270b50c6fcd$export$d7e1f420b25549ff as PopoverContent, $cb5cc270b50c6fcd$export$d6ac43ebaa40d53e as PopoverClose, $cb5cc270b50c6fcd$export$3152841115e061b2 as PopoverArrow, $cb5cc270b50c6fcd$export$be92b6f5f03c0fe9 as Root, $cb5cc270b50c6fcd$export$b688253958b8dfe7 as Anchor, $cb5cc270b50c6fcd$export$41fb9f06171c75f4 as Trigger, $cb5cc270b50c6fcd$export$602eac185826482c as Portal, $cb5cc270b50c6fcd$export$7c6e2c02157bb7d2 as Content, $cb5cc270b50c6fcd$export$f39c2d165cd861fe as Close, $cb5cc270b50c6fcd$export$21b07c8f274aebd5 as Arrow};\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 { type loader } from '../_layout.tsx'\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'\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\tfile => `${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\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\tgetAppDisplayName,\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 { 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'\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'\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}) => {\n\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\tconst rootData = matches.find(m => m.id === 'root')?.data\n\tconst { emoji, stepNumber, title, exerciseNumber, exerciseTitle } =\n\t\tpageTitle(data)\n\treturn [\n\t\t{\n\t\t\ttitle: `${emoji} | ${stepNumber}. ${title} | ${exerciseNumber}. ${exerciseTitle} | ${\n\t\t\t\trootData?.workshopTitle ?? 'Epic Workshop'\n\t\t\t}`,\n\t\t},\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\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\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\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'\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 flex-grow flex-col\">\n\t\t\t<main className=\"grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative col-span-1 row-span-1 flex h-full flex-col 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<SetAppToPlayground appName={data.problem.name} />\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-10 pt-8 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.exerciseStepApp.instructionsCode ? (\n\t\t\t\t\t\t\t<div className=\"prose dark:prose-invert sm:prose-lg\">\n\t\t\t\t\t\t\t\t<StepMdx inBrowserBrowserRef={inBrowserBrowserRef} />\n\t\t\t\t\t\t\t</div>\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 col-span-1 row-span-1 flex flex-col overflow-y-auto\"\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 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 flex-grow items-center justify-center 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 flex-grow items-center justify-center 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 flex-grow items-center justify-center 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 flex-grow items-start justify-center 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 flex-grow items-start justify-center 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 flex-grow items-start justify-center 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":["$d7bdfb9eb0fdf311$var$ENTRY_FOCUS","$d7bdfb9eb0fdf311$var$EVENT_OPTIONS","$d7bdfb9eb0fdf311$var$GROUP_NAME","$d7bdfb9eb0fdf311$var$Collection","$d7bdfb9eb0fdf311$var$useCollection","$d7bdfb9eb0fdf311$var$createCollectionScope","$98Iye$createCollection","$d7bdfb9eb0fdf311$var$createRovingFocusGroupContext","$d7bdfb9eb0fdf311$export$c7109489551a4f4","$98Iye$createContextScope","$d7bdfb9eb0fdf311$var$RovingFocusProvider","$d7bdfb9eb0fdf311$var$useRovingFocusContext","$d7bdfb9eb0fdf311$export$8699f7c8af148338","$98Iye$forwardRef","props","forwardedRef","$98Iye$createElement","$d7bdfb9eb0fdf311$var$RovingFocusGroupImpl","$98Iye$babelruntimehelpersesmextends","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","groupProps","ref","$98Iye$useRef","composedRefs","$98Iye$useComposedRefs","direction","$98Iye$useDirection","currentTabStopId","setCurrentTabStopId","$98Iye$useControllableState","isTabbingBackOut","setIsTabbingBackOut","$98Iye$useState","handleEntryFocus","$98Iye$useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","$98Iye$useEffect","node","$98Iye$useCallback","tabStopId","prevCount","$98Iye$Primitive","$98Iye$composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","$d7bdfb9eb0fdf311$var$focusFirst","$d7bdfb9eb0fdf311$var$ITEM_NAME","$d7bdfb9eb0fdf311$export$ab9df7c53fe8454","focusable","active","itemProps","autoId","$98Iye$useId","id","context","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","$d7bdfb9eb0fdf311$var$getFocusIntent","currentIndex","$d7bdfb9eb0fdf311$var$wrapArray","$d7bdfb9eb0fdf311$var$MAP_KEY_TO_FOCUS_INTENT","$d7bdfb9eb0fdf311$var$getDirectionAwareKey","key","candidates","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","index","$d7bdfb9eb0fdf311$export$be92b6f5f03c0fe9","$d7bdfb9eb0fdf311$export$6d08773d2e66f8f2","$69cb30bb0017df05$var$TABS_NAME","$69cb30bb0017df05$var$createTabsContext","$69cb30bb0017df05$export$355f5bd209d7b13a","$1IHzk$createContextScope","$1IHzk$createRovingFocusGroupScope","$69cb30bb0017df05$var$useRovingFocusGroupScope","$69cb30bb0017df05$var$TabsProvider","$69cb30bb0017df05$var$useTabsContext","$69cb30bb0017df05$export$b2539bed5023c21c","$1IHzk$forwardRef","__scopeTabs","valueProp","onValueChange","defaultValue","activationMode","tabsProps","$1IHzk$useDirection","value","setValue","$1IHzk$useControllableState","$1IHzk$createElement","$1IHzk$useId","$1IHzk$Primitive","$1IHzk$babelruntimehelpersesmextends","$69cb30bb0017df05$var$TAB_LIST_NAME","$69cb30bb0017df05$export$9712d22edc0d78c1","listProps","rovingFocusGroupScope","$1IHzk$Root","$69cb30bb0017df05$var$TRIGGER_NAME","$69cb30bb0017df05$export$8114b9fdfdf9f3ba","disabled","triggerProps","triggerId","$69cb30bb0017df05$var$makeTriggerId","contentId","$69cb30bb0017df05$var$makeContentId","isSelected","$1IHzk$Item","$1IHzk$composeEventHandlers","isAutomaticActivation","$69cb30bb0017df05$var$CONTENT_NAME","$69cb30bb0017df05$export$bd905d70e8fd2ebb","forceMount","children","contentProps","isMountAnimationPreventedRef","$1IHzk$useRef","$1IHzk$useEffect","rAF","$1IHzk$Presence","present","baseId","$69cb30bb0017df05$export$be92b6f5f03c0fe9","$69cb30bb0017df05$export$54c2e3dc7acea9f5","$69cb30bb0017df05$export$41fb9f06171c75f4","$69cb30bb0017df05$export$7c6e2c02157bb7d2","t","e","module","this","n","r","s","u","a","o","c","f","h","d","l","$","y","M","m","v","i","g","D","p","S","w","O","b","k","dayjs","utcPlugin","timeZonePlugin","relativeTimePlugin","DiscordChat","data","useLoaderData","jsxs","jsx","DiscordCTA","DiscordPosts","ctaLink","useDiscordCTALink","altDown","useAltDown","React.Suspense","Loading","Await","posts","post","DiscordPost","Link","Icon","thread","reactionsWithCounts","hints","useHints","Emoji","name","url","SetPlayground","appName","reset","tooltipText","buttonProps","fetcher","useFetcher","submitButton","type","className","clsx","state","status","Form","action","method","showProgressBarField","SimpleTooltip","content","PlaygroundChooser","playgroundAppName","allApps","Select","submit","placeholder","position","align","filter","app","map","SelectItem","displayName","SetAppToPlayground","ENV","EPICSHOP_DEPLOYED","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","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","$cb5cc270b50c6fcd$var$POPOVER_NAME","$cb5cc270b50c6fcd$var$createPopoverContext","$cb5cc270b50c6fcd$export$c8393c9e73286932","$am6gm$createContextScope","$am6gm$createPopperScope","$cb5cc270b50c6fcd$var$usePopperScope","$cb5cc270b50c6fcd$var$PopoverProvider","$cb5cc270b50c6fcd$var$usePopoverContext","$cb5cc270b50c6fcd$export$5b6b19405a83ff9d","__scopePopover","openProp","defaultOpen","onOpenChange","modal","popperScope","triggerRef","$am6gm$useRef","hasCustomAnchor","setHasCustomAnchor","$am6gm$useState","open","setOpen","$am6gm$useControllableState","$am6gm$createElement","$am6gm$Root","$am6gm$useId","$am6gm$useCallback","prevOpen","$cb5cc270b50c6fcd$var$TRIGGER_NAME","$cb5cc270b50c6fcd$export$7dacb05d26466c3","$am6gm$forwardRef","composedTriggerRef","$am6gm$useComposedRefs","trigger","$am6gm$Primitive","$am6gm$babelruntimehelpersesmextends","$cb5cc270b50c6fcd$var$getState","$am6gm$composeEventHandlers","$am6gm$Anchor","$cb5cc270b50c6fcd$var$PORTAL_NAME","$cb5cc270b50c6fcd$var$PortalProvider","$cb5cc270b50c6fcd$var$usePortalContext","$cb5cc270b50c6fcd$export$dd679ffb4362d2d4","container","$am6gm$Presence","$am6gm$Portal","$cb5cc270b50c6fcd$var$CONTENT_NAME","$cb5cc270b50c6fcd$export$d7e1f420b25549ff","portalContext","$cb5cc270b50c6fcd$var$PopoverContentModal","$cb5cc270b50c6fcd$var$PopoverContentNonModal","contentRef","isRightClickOutsideRef","$am6gm$useEffect","$am6gm$hideOthers","$am6gm$RemoveScroll","$am6gm$Slot","$cb5cc270b50c6fcd$var$PopoverContentImpl","_context$triggerRef$c","originalEvent","ctrlLeftClick","isRightClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","_props$onCloseAutoFoc","_context$triggerRef$c2","_props$onInteractOuts","_context$triggerRef$c3","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","disableOutsidePointerEvents","onEscapeKeyDown","onPointerDownOutside","onFocusOutside","onInteractOutside","$am6gm$useFocusGuards","$am6gm$FocusScope","$am6gm$DismissableLayer","$am6gm$Content","$cb5cc270b50c6fcd$export$be92b6f5f03c0fe9","$cb5cc270b50c6fcd$export$41fb9f06171c75f4","$cb5cc270b50c6fcd$export$602eac185826482c","$cb5cc270b50c6fcd$export$7c6e2c02157bb7d2","TouchedFiles","React.useState","React.useRef","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","tabs","isValidPreview","Boolean","includes","delete","set","ExercisePartRoute","titleBits","navigate","useNavigate","shouldHideTab","tab","playground","test","activeTab","altDiffUrl","handleDiffTabClick","altKey","ctrlKey","shiftKey","metaKey","preventDefault","articleId","instructionsCode","ElementScrollRestoration","elementQuery","ProgressToggle","EditFileOnGitHub","relativePath","NavChevrons","prevStepLink","next","nextStepLink","Tabs","hidden","asChild","preventScrollReset","prefetch","Diff","diff","ErrorBoundary","GeneralErrorBoundary","statusHandlers"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,19]}
|