@epic-web/workshop-app 4.20.1 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/build/client/assets/{_-Dfo2h4rl.js → _-DbrWZazo.js} +2 -2
  2. package/build/client/assets/_-DbrWZazo.js.map +1 -0
  3. package/build/client/assets/_exerciseNumber-Cq0nozYz.js +2 -0
  4. package/build/client/assets/_exerciseNumber-Cq0nozYz.js.map +1 -0
  5. package/build/client/assets/{_exerciseNumber_._stepNumber-DpAxO0AM.js → _exerciseNumber_._stepNumber-B5pmJ29o.js} +2 -2
  6. package/build/client/assets/_exerciseNumber_._stepNumber-B5pmJ29o.js.map +1 -0
  7. package/build/client/assets/{_exerciseNumber_.finished-czQBjiVF.js → _exerciseNumber_.finished-Q9qnPuZX.js} +2 -2
  8. package/build/client/assets/_exerciseNumber_.finished-Q9qnPuZX.js.map +1 -0
  9. package/build/client/assets/{_layout-IOROGN78.js → _layout-AgYGL72C.js} +2 -2
  10. package/build/client/assets/_layout-AgYGL72C.js.map +1 -0
  11. package/build/client/assets/_layout-BUs3av-e.js.map +1 -1
  12. package/build/client/assets/{_layout-BrGbNrqb.js → _layout-C8uU4Hwj.js} +2 -2
  13. package/build/client/assets/{_layout-BrGbNrqb.js.map → _layout-C8uU4Hwj.js.map} +1 -1
  14. package/build/client/assets/_layout-DLVrpOki.js +2 -0
  15. package/build/client/assets/_layout-DLVrpOki.js.map +1 -0
  16. package/build/client/assets/accordion-BroSqIct.js +2 -0
  17. package/build/client/assets/accordion-BroSqIct.js.map +1 -0
  18. package/build/client/assets/{account-CQNVYlpT.js → account-7o6O4ruO.js} +2 -2
  19. package/build/client/assets/{account-CQNVYlpT.js.map → account-7o6O4ruO.js.map} +1 -1
  20. package/build/client/assets/app-BiWJY58g.js +2 -0
  21. package/build/client/assets/app-BiWJY58g.js.map +1 -0
  22. package/build/client/assets/{button-DcWUKEqR.js → button-BklqyTPS.js} +2 -2
  23. package/build/client/assets/{button-DcWUKEqR.js.map → button-BklqyTPS.js.map} +1 -1
  24. package/build/client/assets/{client-hints-DWL_Mq1C.js → client-hints-DNUUFGmB.js} +2 -2
  25. package/build/client/assets/{client-hints-DWL_Mq1C.js.map → client-hints-DNUUFGmB.js.map} +1 -1
  26. package/build/client/assets/{components-C17zb3Us.js → components-CME-nGId.js} +2 -2
  27. package/build/client/assets/{components-C17zb3Us.js.map → components-CME-nGId.js.map} +1 -1
  28. package/build/client/assets/diff-CpFxuKA2.js +2 -0
  29. package/build/client/assets/diff-CpFxuKA2.js.map +1 -0
  30. package/build/client/assets/diff-Cw8ktQ1-.js +2 -0
  31. package/build/client/assets/{diff-DBQZWFaQ.js.map → diff-Cw8ktQ1-.js.map} +1 -1
  32. package/build/client/assets/discord-CHP4_JLJ.js +2 -0
  33. package/build/client/assets/discord-CHP4_JLJ.js.map +1 -0
  34. package/build/client/assets/{discord-CBGQw7I4.js → discord-Dq4e30wV.js} +2 -2
  35. package/build/client/assets/{discord-CBGQw7I4.js.map → discord-Dq4e30wV.js.map} +1 -1
  36. package/build/client/assets/{entry.client-C1yl0iQe.js → entry.client-3M2p-8I3.js} +2 -2
  37. package/build/client/assets/{entry.client-C1yl0iQe.js.map → entry.client-3M2p-8I3.js.map} +1 -1
  38. package/build/client/assets/{epic-video-DGVKtAan.js → epic-video-iluUs1-s.js} +2 -2
  39. package/build/client/assets/{epic-video-DGVKtAan.js.map → epic-video-iluUs1-s.js.map} +1 -1
  40. package/build/client/assets/{error-boundary-yAXgvsPR.js → error-boundary-DDTvdkB4.js} +2 -2
  41. package/build/client/assets/{error-boundary-yAXgvsPR.js.map → error-boundary-DDTvdkB4.js.map} +1 -1
  42. package/build/client/assets/{finished-DQ70NSmN.js → finished-Bm-bCUU2.js} +2 -2
  43. package/build/client/assets/{finished-DQ70NSmN.js.map → finished-Bm-bCUU2.js.map} +1 -1
  44. package/build/client/assets/{index-B9w5akmN.js → index-B-hHvmeV.js} +2 -2
  45. package/build/client/assets/{index-B9w5akmN.js.map → index-B-hHvmeV.js.map} +1 -1
  46. package/build/client/assets/{index-Dc-1lfub.js → index-BATSX33w.js} +2 -2
  47. package/build/client/assets/{index-Dc-1lfub.js.map → index-BATSX33w.js.map} +1 -1
  48. package/build/client/assets/{index-DC4pM5aW.js → index-BXWoOGxB.js} +4 -4
  49. package/build/client/assets/{index-DC4pM5aW.js.map → index-BXWoOGxB.js.map} +1 -1
  50. package/build/client/assets/index-Dm1ll1kT.js +2 -0
  51. package/build/client/assets/index-Dm1ll1kT.js.map +1 -0
  52. package/build/client/assets/{index-yQg0GLtS.js → index-Tfdnz1AB.js} +2 -2
  53. package/build/client/assets/{index-yQg0GLtS.js.map → index-Tfdnz1AB.js.map} +1 -1
  54. package/build/client/assets/index-hogig2HK.js +2 -0
  55. package/build/client/assets/index-hogig2HK.js.map +1 -0
  56. package/build/client/assets/{loading-C4Cc1EBG.js → loading-C5uX0jJw.js} +2 -2
  57. package/build/client/assets/{loading-C4Cc1EBG.js.map → loading-C5uX0jJw.js.map} +1 -1
  58. package/build/client/assets/{login-Bimq6Ilz.js → login-4cvVFzF8.js} +2 -2
  59. package/build/client/assets/{login-Bimq6Ilz.js.map → login-4cvVFzF8.js.map} +1 -1
  60. package/build/client/assets/manifest-746b2907.js +1 -0
  61. package/build/client/assets/{mdx-Cb7iYGhg.js → mdx-M0kcP-mP.js} +2 -2
  62. package/build/client/assets/{mdx-Cb7iYGhg.js.map → mdx-M0kcP-mP.js.map} +1 -1
  63. package/build/client/assets/{misc-Bt-_bj1O.js → misc-ENVX3CWf.js} +2 -2
  64. package/build/client/assets/{misc-Bt-_bj1O.js.map → misc-ENVX3CWf.js.map} +1 -1
  65. package/build/client/assets/{nav-chevrons-DIhkJv4W.js → nav-chevrons-B82nbdyj.js} +2 -2
  66. package/build/client/assets/{nav-chevrons-DIhkJv4W.js.map → nav-chevrons-B82nbdyj.js.map} +1 -1
  67. package/build/client/assets/{onboarding-CU7IWhDE.js → onboarding-Bib-wh6d.js} +2 -2
  68. package/build/client/assets/{onboarding-CU7IWhDE.js.map → onboarding-Bib-wh6d.js.map} +1 -1
  69. package/build/client/assets/presence-Cr--lRCr.js +28 -0
  70. package/build/client/assets/{presence-DgSzsRAv.js.map → presence-Cr--lRCr.js.map} +1 -1
  71. package/build/client/assets/preview-CqrRe2BV.js +2 -0
  72. package/build/client/assets/preview-CqrRe2BV.js.map +1 -0
  73. package/build/client/assets/{progress-C1WSMZl4.js → progress-BsY6hGPp.js} +2 -2
  74. package/build/client/assets/{progress-C1WSMZl4.js.map → progress-BsY6hGPp.js.map} +1 -1
  75. package/build/client/assets/{progress-bar-DMef_aq8.js → progress-bar-CSvo1ZXP.js} +2 -2
  76. package/build/client/assets/{progress-bar-DMef_aq8.js.map → progress-bar-CSvo1ZXP.js.map} +1 -1
  77. package/build/client/assets/{request-info-DU15ezmn.js → request-info-CEhUGODY.js} +2 -2
  78. package/build/client/assets/{request-info-DU15ezmn.js.map → request-info-CEhUGODY.js.map} +1 -1
  79. package/build/client/assets/{root-CX2PgcP9.js → root-Tcnfz99O.js} +3 -3
  80. package/build/client/assets/{root-CX2PgcP9.js.map → root-Tcnfz99O.js.map} +1 -1
  81. package/build/client/assets/set-playground-Cdy8VlVD.js +2 -0
  82. package/build/client/assets/set-playground-Cdy8VlVD.js.map +1 -0
  83. package/build/client/assets/{support-D6UIcaNu.js → support-hcqGIpir.js} +2 -2
  84. package/build/client/assets/{support-D6UIcaNu.js.map → support-hcqGIpir.js.map} +1 -1
  85. package/build/client/assets/tailwind-DTowOebn.css +1 -0
  86. package/build/client/assets/test-D9HsTvpe.js +2 -0
  87. package/build/client/assets/test-D9HsTvpe.js.map +1 -0
  88. package/build/client/assets/tests-CmNNBElK.js +4 -0
  89. package/build/client/assets/tests-CmNNBElK.js.map +1 -0
  90. package/build/client/assets/{tooltip-Cqh5cQvd.js → tooltip-BiHTe_7F.js} +2 -2
  91. package/build/client/assets/{tooltip-Cqh5cQvd.js.map → tooltip-BiHTe_7F.js.map} +1 -1
  92. package/build/client/assets/{user-MNzkRgJ3.js → user-D6tTg1yS.js} +2 -2
  93. package/build/client/assets/{user-MNzkRgJ3.js.map → user-D6tTg1yS.js.map} +1 -1
  94. package/build/client/icons.svg +1 -1
  95. package/build/server/index.js +6144 -5873
  96. package/build/server/index.js.map +1 -1
  97. package/package.json +3 -3
  98. package/build/client/assets/_-Dfo2h4rl.js.map +0 -1
  99. package/build/client/assets/_exerciseNumber-CfKoF9W0.js +0 -2
  100. package/build/client/assets/_exerciseNumber-CfKoF9W0.js.map +0 -1
  101. package/build/client/assets/_exerciseNumber_._stepNumber-DpAxO0AM.js.map +0 -1
  102. package/build/client/assets/_exerciseNumber_.finished-czQBjiVF.js.map +0 -1
  103. package/build/client/assets/_layout-DBCEqk3b.js +0 -4
  104. package/build/client/assets/_layout-DBCEqk3b.js.map +0 -1
  105. package/build/client/assets/_layout-IOROGN78.js.map +0 -1
  106. package/build/client/assets/diff-CCCucBoq.js +0 -2
  107. package/build/client/assets/diff-CCCucBoq.js.map +0 -1
  108. package/build/client/assets/diff-DBQZWFaQ.js +0 -2
  109. package/build/client/assets/discord-CULpXzAC.js +0 -2
  110. package/build/client/assets/discord-CULpXzAC.js.map +0 -1
  111. package/build/client/assets/manifest-8371b608.js +0 -1
  112. package/build/client/assets/presence-DgSzsRAv.js +0 -28
  113. package/build/client/assets/tailwind-BZciDTNv.css +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"_layout-IOROGN78.js","sources":["../../../../../node_modules/framer-motion/dist/es/animation/hooks/animation-controls.mjs","../../../../../node_modules/framer-motion/dist/es/animation/hooks/use-animation.mjs","../../../app/components/media-query.ts","../../../../../node_modules/@radix-ui/react-dialog/dist/index.mjs","../../../app/components/ui/dialog.tsx","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { invariant } from '../../utils/errors.mjs';\nimport { setTarget } from '../../render/utils/setters.mjs';\nimport { animateVisualElement } from '../interfaces/visual-element.mjs';\n\nfunction stopAnimation(visualElement) {\n visualElement.values.forEach((value) => value.stop());\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\n/**\n * @public\n */\nfunction animationControls() {\n /**\n * Track whether the host component has mounted.\n */\n let hasMounted = false;\n /**\n * A collection of linked component animation controls.\n */\n const subscribers = new Set();\n const controls = {\n subscribe(visualElement) {\n subscribers.add(visualElement);\n return () => void subscribers.delete(visualElement);\n },\n start(definition, transitionOverride) {\n invariant(hasMounted, \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n const animations = [];\n subscribers.forEach((visualElement) => {\n animations.push(animateVisualElement(visualElement, definition, {\n transitionOverride,\n }));\n });\n return Promise.all(animations);\n },\n set(definition) {\n invariant(hasMounted, \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n return subscribers.forEach((visualElement) => {\n setValues(visualElement, definition);\n });\n },\n stop() {\n subscribers.forEach((visualElement) => {\n stopAnimation(visualElement);\n });\n },\n mount() {\n hasMounted = true;\n return () => {\n hasMounted = false;\n controls.stop();\n };\n },\n };\n return controls;\n}\n\nexport { animationControls, setValues };\n","import { animationControls } from './animation-controls.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\n\n/**\n * Creates `AnimationControls`, which can be used to manually start, stop\n * and sequence animations on one or more components.\n *\n * The returned `AnimationControls` should be passed to the `animate` property\n * of the components you want to animate.\n *\n * These components can then be animated with the `start` method.\n *\n * ```jsx\n * import * as React from 'react'\n * import { motion, useAnimation } from 'framer-motion'\n *\n * export function MyComponent(props) {\n * const controls = useAnimation()\n *\n * controls.start({\n * x: 100,\n * transition: { duration: 0.5 },\n * })\n *\n * return <motion.div animate={controls} />\n * }\n * ```\n *\n * @returns Animation controller with `start` and `stop` methods\n *\n * @public\n */\nfunction useAnimationControls() {\n const controls = useConstant(animationControls);\n useIsomorphicLayoutEffect(controls.mount, []);\n return controls;\n}\nconst useAnimation = useAnimationControls;\n\nexport { useAnimation, useAnimationControls };\n","import { useSyncExternalStore } from 'react'\n\nexport function makeMediaQueryStore(\n\tmediaQuery: string,\n\tserverSnapshot: boolean,\n) {\n\tfunction getSnapshot() {\n\t\treturn window.matchMedia(mediaQuery).matches\n\t}\n\n\tfunction subscribe(callback: () => void) {\n\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\t\tmediaQueryList.addEventListener('change', callback)\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener('change', callback)\n\t\t}\n\t}\n\n\treturn function useMediaQuery() {\n\t\treturn useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot)\n\t}\n}\n","\"use client\";\n\n// packages/react/dialog/src/Dialog.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContext, createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { hideOthers } from \"aria-hidden\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar DIALOG_NAME = \"Dialog\";\nvar [createDialogContext, createDialogScope] = createContextScope(DIALOG_NAME);\nvar [DialogProvider, useDialogContext] = createDialogContext(DIALOG_NAME);\nvar Dialog = (props) => {\n const {\n __scopeDialog,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const triggerRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange\n });\n return /* @__PURE__ */ jsx(\n DialogProvider,\n {\n scope: __scopeDialog,\n triggerRef,\n contentRef,\n contentId: useId(),\n titleId: useId(),\n descriptionId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children\n }\n );\n};\nDialog.displayName = DIALOG_NAME;\nvar TRIGGER_NAME = \"DialogTrigger\";\nvar DialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...triggerProps } = props;\n const context = useDialogContext(TRIGGER_NAME, __scopeDialog);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n }\n);\nDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DialogPortal\";\nvar [PortalProvider, usePortalContext] = createDialogContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar DialogPortal = (props) => {\n const { __scopeDialog, forceMount, children, container } = props;\n const context = useDialogContext(PORTAL_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeDialog, forceMount, children: React.Children.map(children, (child) => /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children: child }) })) });\n};\nDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"DialogOverlay\";\nvar DialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(OVERLAY_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, props.__scopeDialog);\n return context.modal ? /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(DialogOverlayImpl, { ...overlayProps, ref: forwardedRef }) }) : null;\n }\n);\nDialogOverlay.displayName = OVERLAY_NAME;\nvar DialogOverlayImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, __scopeDialog);\n return (\n // Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll`\n // ie. when `Overlay` and `Content` are siblings\n /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, shards: [context.contentRef], children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": getState(context.open),\n ...overlayProps,\n ref: forwardedRef,\n style: { pointerEvents: \"auto\", ...overlayProps.style }\n }\n ) })\n );\n }\n);\nvar CONTENT_NAME = \"DialogContent\";\nvar DialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(DialogContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(DialogContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nDialogContent.displayName = CONTENT_NAME;\nvar DialogContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, context.contentRef, contentRef);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: 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 if (isRightClick) event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault()\n )\n }\n );\n }\n);\nvar DialogContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar DialogContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, trapFocus, onOpenAutoFocus, onCloseAutoFocus, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, __scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n useFocusGuards();\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n role: \"dialog\",\n id: context.contentId,\n \"aria-describedby\": context.descriptionId,\n \"aria-labelledby\": context.titleId,\n \"data-state\": getState(context.open),\n ...contentProps,\n ref: composedRefs,\n onDismiss: () => context.onOpenChange(false)\n }\n )\n }\n ),\n /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(TitleWarning, { titleId: context.titleId }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef, descriptionId: context.descriptionId })\n ] })\n ] });\n }\n);\nvar TITLE_NAME = \"DialogTitle\";\nvar DialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...titleProps } = props;\n const context = useDialogContext(TITLE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.h2, { id: context.titleId, ...titleProps, ref: forwardedRef });\n }\n);\nDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"DialogDescription\";\nvar DialogDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...descriptionProps } = props;\n const context = useDialogContext(DESCRIPTION_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.p, { id: context.descriptionId, ...descriptionProps, ref: forwardedRef });\n }\n);\nDialogDescription.displayName = DESCRIPTION_NAME;\nvar CLOSE_NAME = \"DialogClose\";\nvar DialogClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...closeProps } = props;\n const context = useDialogContext(CLOSE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nDialogClose.displayName = CLOSE_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar TITLE_WARNING_NAME = \"DialogTitleWarning\";\nvar [WarningProvider, useWarningContext] = createContext(TITLE_WARNING_NAME, {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"dialog\"\n});\nvar TitleWarning = ({ titleId }) => {\n const titleWarningContext = useWarningContext(TITLE_WARNING_NAME);\n const MESSAGE = `\\`${titleWarningContext.contentName}\\` requires a \\`${titleWarningContext.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${titleWarningContext.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`;\n React.useEffect(() => {\n if (titleId) {\n const hasTitle = document.getElementById(titleId);\n if (!hasTitle) console.error(MESSAGE);\n }\n }, [MESSAGE, titleId]);\n return null;\n};\nvar DESCRIPTION_WARNING_NAME = \"DialogDescriptionWarning\";\nvar DescriptionWarning = ({ contentRef, descriptionId }) => {\n const descriptionWarningContext = useWarningContext(DESCRIPTION_WARNING_NAME);\n const MESSAGE = `Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${descriptionWarningContext.contentName}}.`;\n React.useEffect(() => {\n const describedById = contentRef.current?.getAttribute(\"aria-describedby\");\n if (descriptionId && describedById) {\n const hasDescription = document.getElementById(descriptionId);\n if (!hasDescription) console.warn(MESSAGE);\n }\n }, [MESSAGE, contentRef, descriptionId]);\n return null;\n};\nvar Root = Dialog;\nvar Trigger = DialogTrigger;\nvar Portal = DialogPortal;\nvar Overlay = DialogOverlay;\nvar Content = DialogContent;\nvar Title = DialogTitle;\nvar Description = DialogDescription;\nvar Close = DialogClose;\nexport {\n Close,\n Content,\n Description,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n Overlay,\n Portal,\n Root,\n Title,\n Trigger,\n WarningProvider,\n createDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\nimport { Icon } from '../icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nfunction DialogOverlay({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n\treturn (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\n\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t</DialogPrimitive.Close>\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t)\n}\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col space-y-1.5 text-center sm:text-left',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogHeader.displayName = 'DialogHeader'\n\nfunction DialogFooter({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogFooter.displayName = 'DialogFooter'\n\nfunction DialogTitle({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-lg font-semibold leading-none tracking-tight',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nfunction DialogDescription({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n}\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetExercises,\n\tgetPlaygroundAppName,\n\tgetWorkshopTitle,\n} from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport {\n\tjson,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport {\n\tLink,\n\tNavLink,\n\tOutlet,\n\tuseLoaderData,\n\tuseParams,\n} from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport {\n\tmotion,\n\tuseAnimationControls,\n\ttype AnimationControls,\n} from 'framer-motion'\nimport * as React from 'react'\nimport { useHydrated } from 'remix-utils/use-hydrated'\nimport { Icon } from '#app/components/icons.tsx'\nimport { makeMediaQueryStore } from '#app/components/media-query.js'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.js'\nimport {\n\tSimpleTooltip,\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from '#app/components/ui/tooltip.tsx'\nimport { useOptionalUser } from '#app/components/user.tsx'\nimport { cn } from '#app/utils/misc.tsx'\nimport { usePresence, type User } from '#app/utils/presence.tsx'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch } from '../theme/index.tsx'\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('stepLoader')\n\tconst [exercises, workshopTitle, playgroundAppName] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetWorkshopTitle(),\n\t\tgetPlaygroundAppName(),\n\t])\n\n\tconst playground = {\n\t\tappName: playgroundAppName,\n\t\texerciseNumber: Number(\n\t\t\textractNumbersAndTypeFromAppNameOrPath(playgroundAppName ?? '')\n\t\t\t\t?.exerciseNumber,\n\t\t),\n\t}\n\n\tconst result = json(\n\t\t{\n\t\t\tworkshopTitle,\n\t\t\texercises: exercises.map((e) => ({\n\t\t\t\texerciseNumber: e.exerciseNumber,\n\t\t\t\ttitle: e.title,\n\t\t\t\tsolutions: e.solutions.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tproblems: e.problems.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tsteps: e.steps.map(({ stepNumber, problem, solution }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle: problem?.title ?? solution?.title ?? 'Unknown',\n\t\t\t\t\tname: problem?.name ?? solution?.name ?? 'Unknown',\n\t\t\t\t})),\n\t\t\t})),\n\t\t\tplayground,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\tVary: 'Cookie',\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n\treturn result\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\tVary: 'Cookie',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst opacities = ['opacity-70', 'opacity-80', 'opacity-90', 'opacity-100']\nconst shadows = [\n\t'shadow-[0_0_2px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_4px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_7px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_10px_0_rgba(0,0,0,0.3)]',\n]\nfunction getScoreClassNames(score: number) {\n\tconst opacityNumber = Math.round(score * opacities.length - 1)\n\tconst shadowNumber = Math.round(score * shadows.length - 1)\n\treturn cn(\n\t\t'shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200',\n\t\topacities[opacityNumber] ?? 'opacity-60',\n\t\tshadows[shadowNumber] ?? 'shadow-none',\n\t\tscore === 1 ? 'animate-pulse hover:animate-none focus:animate-none' : null,\n\t)\n}\n\nfunction FacePile({ isMenuOpened }: { isMenuOpened: boolean }) {\n\tconst loggedInUser = useOptionalUser()\n\tconst { users } = usePresence()\n\tconst limit = isMenuOpened ? 17 : 0\n\tconst numberOverLimit = users.length - limit\n\tif (!users.length) return null\n\tconst tiffany =\n\t\tisMenuOpened && users.length === 1 ? (\n\t\t\t<Link\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tto=\"https://www.youtube.com/watch?v=w6Q3mHyzn78\"\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\talt=\"Tiffany Tunes\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\tgetScoreClassNames(1),\n\t\t\t\t\t)}\n\t\t\t\t\tsrc=\"/img/tiffany.png\"\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t) : null\n\tconst overLimitLabel = `${numberOverLimit}${\n\t\tisMenuOpened ? ' more ' : ' '\n\t}Epic Web Dev${numberOverLimit === 1 ? '' : 's'} working now`\n\treturn (\n\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t<TooltipProvider>\n\t\t\t\t{users.slice(0, limit).map(({ user, score }) => {\n\t\t\t\t\tconst scoreClassNames = getScoreClassNames(score)\n\t\t\t\t\tconst locationLabel = getLocationLabel(user.location)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t{user.avatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\talt={user.name || 'Epic Web Dev'}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tsrc={user.avatarUrl}\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<div\n\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\taria-label={user.name || 'Epic Web Dev'}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full border',\n\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\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<Icon name=\"User\" />\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</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t{user.name || 'An EPIC Web Dev'}{' '}\n\t\t\t\t\t\t\t\t\t\t{locationLabel\n\t\t\t\t\t\t\t\t\t\t\t? ` is ${user.location?.origin?.includes('epicweb.dev') ? 'learning' : 'working'} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\tscore === 1 && loggedInUser?.id !== user.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'with you'\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\t\t} on`\n\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t{locationLabel?.line1 ? (\n\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line1}</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t{locationLabel?.line2 ? (\n\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line2}</span>\n\t\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</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t\t{tiffany}\n\t\t\t\t{numberOverLimit > 0 ? (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\taria-label={overLimitLabel}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex items-center justify-center rounded-full border bg-accent text-xs text-accent-foreground',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'h-8 w-8' : 'h-6 w-6',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pointer-events-none overflow-hidden text-ellipsis whitespace-nowrap text-center',\n\t\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-8' : 'w-6',\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{isMenuOpened ? `+${numberOverLimit}` : numberOverLimit}\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</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>{overLimitLabel}</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t) : null}\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t)\n}\n\nconst useIsWide = makeMediaQueryStore('(min-width: 640px)', true)\n\nexport default function App() {\n\tconst user = useOptionalUser()\n\tconst isWide = useIsWide()\n\tconst isHydrated = useHydrated()\n\n\tconst [isMenuOpened, setMenuOpened] = React.useState(false)\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{user ? null : <EpicWebBanner />}\n\t\t\t{/*\n\t\t\t\tthis isn't placed in a conditional with isWide because the server render\n\t\t\t\tdoesn't know whether it should be around or not so we just use CSS to hide it\n\t\t\t\tif it's not supposed to show up.\n\n\t\t\t\tWe don't just use media queries for the wider screen nav because we want\n\t\t\t\tto avoid running all the logic in there unnecessarily.\n\t\t\t*/}\n\t\t\t{isHydrated && isWide ? null : (\n\t\t\t\t<MobileNavigation\n\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\t// this nonsense is here because we want the panels to be scrollable rather\n\t\t\t\t// than having the entire page be scrollable (at least on wider screens)\n\t\t\t\tclassName={cn('flex flex-grow flex-col sm:flex-row', {\n\t\t\t\t\t'h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\t!user,\n\t\t\t\t\t'h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\tuser,\n\t\t\t\t\t'h-[unset]': !isWide && isMenuOpened,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isWide ? (\n\t\t\t\t\t<Navigation\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-full w-full max-w-full sm:max-w-[calc(100%-56px)]',\n\t\t\t\t\t\tisMenuOpened ? 'hidden md:block' : '',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Outlet />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getLocationLabel(location: User['location']) {\n\tif (!location) return null\n\n\tconst { exercise } = location\n\n\tconst exercisePortion = [\n\t\texercise\n\t\t\t? [exercise.exerciseNumber, exercise.stepNumber]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s) => s.toString().padStart(2, '0'))\n\t\t\t\t\t.join('/')\n\t\t\t: null,\n\t\texercise?.type,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' - ')\n\treturn { line1: location.workshopTitle, line2: exercisePortion }\n}\n\nfunction EpicWebBanner() {\n\tconst isWide = useIsWide()\n\tconst details = (\n\t\t<div>\n\t\t\t{ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t<div>\n\t\t\t\t\t{`This is the deployed version. `}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tto={ENV.EPICSHOP_GITHUB_REPO}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t{` for full experience.`}\n\t\t\t\t\t</>{' '}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\tLogin\n\t\t\t\t\t</Link>{' '}\n\t\t\t\t\tor{' '}\n\t\t\t\t\t<a href=\"https://www.epicweb.dev/login\" className=\"underline\">\n\t\t\t\t\t\tjoin for free\n\t\t\t\t\t</a>{' '}\n\t\t\t\t\tfor the full experience.\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n\treturn (\n\t\t<div className=\"z-10 flex h-16 items-center justify-between border-b bg-gradient-to-tr from-blue-500 to-indigo-500 pl-4 text-white\">\n\t\t\t{isWide ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"hidden flex-1 flex-wrap items-center gap-4 sm:flex\">\n\t\t\t\t\t\t<Icon name=\"EpicWeb\" size=\"lg\" />\n\t\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center\">\n\t\t\t\t\t\t\t<p className=\"mr-2\">\n\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto=\"https://www.epicweb.dev\"\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tEpicWeb.dev\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"hidden h-full flex-col items-center sm:flex md:flex-row\">\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"https://www.epicweb.dev\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join Epic Web</span>\n\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t\t? 'https://www.epicweb.dev/login'\n\t\t\t\t\t\t\t\t\t: '/login'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center gap-4 sm:hidden\">\n\t\t\t\t\t\t<a href=\"https://www.epicweb.dev\">\n\t\t\t\t\t\t\t<Icon name=\"EpicWeb\" size=\"lg\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<Dialog>\n\t\t\t\t\t\t\t<DialogTrigger>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"lg\" className=\"animate-pulse\" />\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t<Icon name=\"EpicWeb\" size=\"lg\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-lg font-semibold\">EpicWeb.dev</span>\n\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t\t<Link to=\"https://www.epicweb.dev\" className=\"underline\">\n\t\t\t\t\t\t\t\t\t\tEpicWeb.dev\n\t\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"https://www.epicweb.dev\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join</span>\n\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t\t? 'https://www.epicweb.dev/login'\n\t\t\t\t\t\t\t\t\t: '/login'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nconst itemVariants = {\n\thidden: { opacity: 0, x: -20 },\n\tvisible: { opacity: 1, x: 0 },\n}\nfunction NavigationExerciseListItem({\n\texerciseNumber,\n\tchildren,\n}: {\n\texerciseNumber: number\n\tchildren: React.ReactNode\n}) {\n\tconst progressClassName = useExerciseProgressClassName(exerciseNumber)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"ml-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExerciseStepListItem({\n\tchildren,\n\t...progressItemSearch\n}: {\n\tchildren: React.ReactNode\n} & ProgressItemSearch) {\n\tconst progressClassName = useProgressItemClassName(progressItemSearch)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"ml-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction MobileNavigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst { users } = usePresence()\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"flex w-full border-b sm:hidden\">\n\t\t\t<div className=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('flex items-center', {\n\t\t\t\t\t\t'flex-col': isMenuOpened,\n\t\t\t\t\t\t'h-14': !isMenuOpened,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst exerciseNum = exerciseNumber.toString().padStart(2, '0')\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\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\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? ' 🛝' : null}\n\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-4 mt-4 flex flex-col\"\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\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\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\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\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)}\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\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ name, stepNumber, title }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tNumber(params.stepNumber) === stepNumber\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst step = stepNumber\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.padStart(2, '0')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isPlayground =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname === data.playground.appName\n\t\t\t\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\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}/${step}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\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\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\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\t\t\t)}\n\t\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\t\t\t{isPlayground\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `${step}. ${title} 🛝`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${step}. ${title}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\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})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}/finished`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\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\t\t\t'bg-foreground text-background': isActive,\n\t\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\t)\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>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\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</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\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}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"flex-grow\" />\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex items-center justify-start p-4',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'min-h-14' : 'h-14',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t// left border is covered by the menu\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\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 flex-shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\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\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.avatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.avatarUrl}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\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=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\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\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</nav>\n\t)\n}\n\nconst OPENED_MENU_WIDTH = 400\n\nfunction Navigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst { users } = usePresence()\n\n\tconst exercise = data.exercises.find(\n\t\t(e) => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tconst app =\n\t\tparams.type === 'solution'\n\t\t\t? exercise?.solutions.find(\n\t\t\t\t\t(s) => s.stepNumber === Number(params.stepNumber),\n\t\t\t\t)\n\t\t\t: params.type === 'problem'\n\t\t\t\t? exercise?.problems.find(\n\t\t\t\t\t\t(p) => p.stepNumber === Number(params.stepNumber),\n\t\t\t\t\t)\n\t\t\t\t: null\n\n\t// container\n\tconst menuControls = useAnimationControls()\n\tconst menuVariants = {\n\t\tclose: { width: 56 },\n\t\topen: { width: OPENED_MENU_WIDTH },\n\t}\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\tconst exNum = Number(params.exerciseNumber).toString().padStart(2, '0')\n\n\treturn (\n\t\t<nav className=\"hidden border-r sm:flex\">\n\t\t\t<motion.div\n\t\t\t\tinitial={isMenuOpened ? 'open' : 'close'}\n\t\t\t\tvariants={menuVariants}\n\t\t\t\tanimate={menuControls}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tmenuControls={menuControls}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tstyle={{ width: OPENED_MENU_WIDTH }}\n\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\tclassName=\"flex flex-grow flex-col justify-between overflow-y-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst exerciseNum = exerciseNumber.toString().padStart(2, '0')\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\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\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? ' 🛝' : null}\n\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-4 mt-4 flex flex-col\"\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\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\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\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\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)}\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\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ name, stepNumber, title }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tNumber(params.stepNumber) === stepNumber\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst step = stepNumber\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.padStart(2, '0')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isPlayground =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname === data.playground.appName\n\t\t\t\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\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}/${step}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\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\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\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\t\t\t)}\n\t\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\t\t\t{isPlayground\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `${step}. ${title} 🛝`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${step}. ${title}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\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})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/${exerciseNum}/finished`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\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\t\t\t'bg-foreground text-background': isActive,\n\t\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\t)\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>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\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</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\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}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isMenuOpened && (\n\t\t\t\t\t\t<div className=\"flex flex-grow flex-col justify-center\">\n\t\t\t\t\t\t\t<div className=\"orientation-sideways w-full font-mono text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t\t\t{exercise?.title ? (\n\t\t\t\t\t\t\t\t\t<Link to={`/${exNum}`}>{exercise.title}</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{exercise?.title && app?.title ? ' — ' : null}\n\t\t\t\t\t\t\t\t{app?.title ? (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tto={`/${exNum}/${app.stepNumber\n\t\t\t\t\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t\t\t\t\t.padStart(2, '0')}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{app.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex w-full items-center justify-start border-t p-4 transition-[height]',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'h-28' : 'h-14',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={isMenuOpened ? { width: OPENED_MENU_WIDTH } : {}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName=\"flex h-14 w-full flex-shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline\"\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.avatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.avatarUrl}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\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=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"mb-4 w-full self-start border-t pl-3 pt-[15px]\">\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</nav>\n\t)\n}\n\nfunction NavToggle({\n\ttitle,\n\tisMenuOpened,\n\tsetMenuOpened,\n\tmenuControls,\n}: {\n\ttitle: string\n\tisMenuOpened: boolean\n\tsetMenuOpened: (value: boolean) => void\n\tmenuControls?: AnimationControls\n}) {\n\tconst menuButtonRef = React.useRef<HTMLButtonElement>(null)\n\tconst path01Variants = {\n\t\topen: { d: 'M3.06061 2.99999L21.0606 21' },\n\t\tclosed: { d: 'M0 9.5L24 9.5' },\n\t}\n\tconst path02Variants = {\n\t\topen: { d: 'M3.00006 21.0607L21 3.06064' },\n\t\tmoving: { d: 'M0 14.5L24 14.5' },\n\t\tclosed: { d: 'M0 14.5L15 14.5' },\n\t}\n\tconst path01Controls = useAnimationControls()\n\tconst path02Controls = useAnimationControls()\n\n\tasync function toggleMenu() {\n\t\tvoid menuControls?.start(isMenuOpened ? 'close' : 'open')\n\t\tsetMenuOpened(!isMenuOpened)\n\t\tif (isMenuOpened) {\n\t\t\tvoid path01Controls.start(path01Variants.closed)\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path02Controls.start(path02Variants.closed)\n\t\t} else {\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path01Controls.start(path01Variants.open)\n\t\t\tvoid path02Controls.start(path02Variants.open)\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (!isMenuOpened) return\n\n\t\tfunction handleKeyUp(event: KeyboardEvent) {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keyup', handleKeyUp)\n\t\treturn () => document.removeEventListener('keyup', handleKeyUp)\n\t}, [isMenuOpened])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'relative inline-flex h-14 flex-shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-b sm:border-r-0',\n\t\t\t\t{\n\t\t\t\t\t'w-full': isMenuOpened,\n\t\t\t\t},\n\t\t\t)}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={menuButtonRef}\n\t\t\t\tclassName=\"flex h-14 w-14 items-center justify-center\"\n\t\t\t\taria-label=\"Open Navigation menu\"\n\t\t\t\tonClick={toggleMenu}\n\t\t\t>\n\t\t\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path01Variants.closed}\n\t\t\t\t\t\tanimate={path01Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path02Variants.closed}\n\t\t\t\t\t\tanimate={path02Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t{isMenuOpened && (\n\t\t\t\t<motion.p\n\t\t\t\t\ttransition={{ delay: 0.2 }}\n\t\t\t\t\tinitial={{ opacity: 0, y: 5 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t// @ts-expect-error framer-motion + latest typescript types has issues\n\t\t\t\t\tclassName=\"absolute right-5 whitespace-nowrap font-mono text-sm uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<Link to=\"/\">{title}</Link>\n\t\t\t\t</motion.p>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n"],"names":["stopAnimation","visualElement","value","setVariants","variantLabels","key","variant","setTarget","child","setValues","definition","animationControls","subscribers","controls","transitionOverride","animations","animateVisualElement","useAnimationControls","useConstant","useIsomorphicLayoutEffect","makeMediaQueryStore","mediaQuery","serverSnapshot","getSnapshot","subscribe","callback","mediaQueryList","useSyncExternalStore","DIALOG_NAME","createDialogContext","createDialogScope","createContextScope","DialogProvider","useDialogContext","Dialog","props","__scopeDialog","children","openProp","defaultOpen","onOpenChange","modal","triggerRef","React.useRef","contentRef","open","setOpen","useControllableState","jsx","useId","React.useCallback","prevOpen","TRIGGER_NAME","DialogTrigger","React.forwardRef","forwardedRef","triggerProps","context","composedTriggerRef","useComposedRefs","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","DialogPortal","forceMount","container","React.Children","Presence","PortalPrimitive","OVERLAY_NAME","DialogOverlay","portalContext","overlayProps","DialogOverlayImpl","RemoveScroll","Slot","CONTENT_NAME","DialogContent","contentProps","DialogContentModal","DialogContentNonModal","composedRefs","React.useEffect","content","hideOthers","DialogContentImpl","event","_a","originalEvent","ctrlLeftClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","_b","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","useFocusGuards","jsxs","Fragment","FocusScope","DismissableLayer","TitleWarning","DescriptionWarning","TITLE_NAME","DialogTitle","titleProps","DESCRIPTION_NAME","DialogDescription","descriptionProps","CLOSE_NAME","DialogClose","closeProps","TITLE_WARNING_NAME","WarningProvider","useWarningContext","createContext","titleId","titleWarningContext","MESSAGE","DESCRIPTION_WARNING_NAME","descriptionId","describedById","Root","Trigger","Portal","Overlay","Content","Title","Description","Close","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","className","ref","DialogPrimitive.Overlay","cn","DialogPrimitive.Content","DialogPrimitive.Close","Icon","DialogHeader","DialogPrimitive.Title","DialogPrimitive.Description","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","limit","numberOverLimit","tiffany","Link","rel","to","alt","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locationLabel","getLocationLabel","location","Tooltip","TooltipTrigger","asChild","avatarUrl","tabIndex","name","TooltipContent","origin","includes","id","line1","line2","useIsWide","App","isWide","isHydrated","useHydrated","setMenuOpened","React","EpicWebBanner","MobileNavigation","onMenuOpenChange","Navigation","Outlet","exercise","exercisePortion","exerciseNumber","stepNumber","filter","Boolean","s","toString","padStart","join","type","workshopTitle","details","ENV","EPICSHOP_DEPLOYED","EPICSHOP_GITHUB_REPO","href","size","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","data","useLoaderData","nextExerciseRoute","useNextExerciseRoute","params","useParams","listVariants","transition","duration","when","staggerChildren","NavToggle","title","div","initial","animate","ul","exercises","steps","isActive","Number","showPlayground","playground","exerciseNum","prefetch","clsx","step","isPlayground","appName","NavLink","SimpleTooltip","email","state","from","ThemeSwitch","OPENED_MENU_WIDTH","find","e","app","solutions","problems","p","menuControls","menuVariants","close","width","exNum","style","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyUp","current","click","document","addEventListener","removeEventListener","onClick","height","viewBox","path","stroke","strokeWidth","delay","y"],"mappings":"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","x_google_ignoreList":[0,1,3]}
@@ -1,2 +0,0 @@
1
- import{R as j,j as t,r as d,c as Ht}from"./index-1cKOJFpX.js";import{c as he,u as O,d as je,f as ce,g as le,P as _,a as A,b as Bt,k as K,l as Ke,A as Ft,D as $t,C as Ut,m as Wt,V as Kt,n as Gt,R as zt,S as $e}from"./tooltip-Cqh5cQvd.js";import{r as Ge,e as qt,b as Yt,A as Xt,L as Zt,F as Jt}from"./components-C17zb3Us.js";import{h as Qt,u as eo,R as to,F as oo,P as no}from"./index-DC4pM5aW.js";import{c as ie}from"./clsx-B-dksMZM.js";import{I as L,d as ro,c as so}from"./misc-Bt-_bj1O.js";import{M as ao}from"./mdx-Cb7iYGhg.js";function ze(o){const n=o+"CollectionProvider",[e,r]=he(n),[s,c]=e(n,{collectionRef:{current:null},itemMap:new Map}),l=w=>{const{scope:f,children:h}=w,S=j.useRef(null),m=j.useRef(new Map).current;return t.jsx(s,{scope:f,itemMap:m,collectionRef:S,children:h})};l.displayName=n;const i=o+"CollectionSlot",a=j.forwardRef((w,f)=>{const{scope:h,children:S}=w,m=c(i,h),u=O(f,m.collectionRef);return t.jsx(je,{ref:u,children:S})});a.displayName=i;const p=o+"CollectionItemSlot",x="data-radix-collection-item",g=j.forwardRef((w,f)=>{const{scope:h,children:S,...m}=w,u=j.useRef(null),C=O(f,u),T=c(p,h);return j.useEffect(()=>(T.itemMap.set(u,{ref:u,...m}),()=>void T.itemMap.delete(u))),t.jsx(je,{[x]:"",ref:C,children:S})});g.displayName=p;function b(w){const f=c(o+"CollectionConsumer",w);return j.useCallback(()=>{const S=f.collectionRef.current;if(!S)return[];const m=Array.from(S.querySelectorAll(`[${x}]`));return Array.from(f.itemMap.values()).sort((T,P)=>m.indexOf(T.ref.current)-m.indexOf(P.ref.current))},[f.collectionRef,f.itemMap])}return[{Provider:l,Slot:a,ItemSlot:g},b,r]}var co=d.createContext(void 0);function qe(o){const n=d.useContext(co);return o||n||"ltr"}var De="Collapsible",[lo,Ye]=he(De),[io,Oe]=lo(De),Xe=d.forwardRef((o,n)=>{const{__scopeCollapsible:e,open:r,defaultOpen:s,disabled:c,onOpenChange:l,...i}=o,[a=!1,p]=ce({prop:r,defaultProp:s,onChange:l});return t.jsx(io,{scope:e,disabled:c,contentId:le(),open:a,onOpenToggle:d.useCallback(()=>p(x=>!x),[p]),children:t.jsx(_.div,{"data-state":Le(a),"data-disabled":c?"":void 0,...i,ref:n})})});Xe.displayName=De;var Ze="CollapsibleTrigger",Je=d.forwardRef((o,n)=>{const{__scopeCollapsible:e,...r}=o,s=Oe(Ze,e);return t.jsx(_.button,{type:"button","aria-controls":s.contentId,"aria-expanded":s.open||!1,"data-state":Le(s.open),"data-disabled":s.disabled?"":void 0,disabled:s.disabled,...r,ref:n,onClick:A(o.onClick,s.onOpenToggle)})});Je.displayName=Ze;var ke="CollapsibleContent",Qe=d.forwardRef((o,n)=>{const{forceMount:e,...r}=o,s=Oe(ke,o.__scopeCollapsible);return t.jsx(Bt,{present:e||s.open,children:({present:c})=>t.jsx(uo,{...r,ref:n,present:c})})});Qe.displayName=ke;var uo=d.forwardRef((o,n)=>{const{__scopeCollapsible:e,present:r,children:s,...c}=o,l=Oe(ke,e),[i,a]=d.useState(r),p=d.useRef(null),x=O(n,p),g=d.useRef(0),b=g.current,w=d.useRef(0),f=w.current,h=l.open||i,S=d.useRef(h),m=d.useRef();return d.useEffect(()=>{const u=requestAnimationFrame(()=>S.current=!1);return()=>cancelAnimationFrame(u)},[]),K(()=>{const u=p.current;if(u){m.current=m.current||{transitionDuration:u.style.transitionDuration,animationName:u.style.animationName},u.style.transitionDuration="0s",u.style.animationName="none";const C=u.getBoundingClientRect();g.current=C.height,w.current=C.width,S.current||(u.style.transitionDuration=m.current.transitionDuration,u.style.animationName=m.current.animationName),a(r)}},[l.open,r]),t.jsx(_.div,{"data-state":Le(l.open),"data-disabled":l.disabled?"":void 0,id:l.contentId,hidden:!h,...c,ref:x,style:{"--radix-collapsible-content-height":b?`${b}px`:void 0,"--radix-collapsible-content-width":f?`${f}px`:void 0,...o.style},children:h&&s})});function Le(o){return o?"open":"closed"}var po=Xe,fo=Je,mo=Qe,G="Accordion",ho=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[Ve,xo,vo]=ze(G),[xe,In]=he(G,[vo,Ye]),He=Ye(),et=j.forwardRef((o,n)=>{const{type:e,...r}=o,s=r,c=r;return t.jsx(Ve.Provider,{scope:o.__scopeAccordion,children:e==="multiple"?t.jsx(wo,{...c,ref:n}):t.jsx(Co,{...s,ref:n})})});et.displayName=G;var[tt,go]=xe(G),[ot,So]=xe(G,{collapsible:!1}),Co=j.forwardRef((o,n)=>{const{value:e,defaultValue:r,onValueChange:s=()=>{},collapsible:c=!1,...l}=o,[i,a]=ce({prop:e,defaultProp:r,onChange:s});return t.jsx(tt,{scope:o.__scopeAccordion,value:i?[i]:[],onItemOpen:a,onItemClose:j.useCallback(()=>c&&a(""),[c,a]),children:t.jsx(ot,{scope:o.__scopeAccordion,collapsible:c,children:t.jsx(nt,{...l,ref:n})})})}),wo=j.forwardRef((o,n)=>{const{value:e,defaultValue:r,onValueChange:s=()=>{},...c}=o,[l=[],i]=ce({prop:e,defaultProp:r,onChange:s}),a=j.useCallback(x=>i((g=[])=>[...g,x]),[i]),p=j.useCallback(x=>i((g=[])=>g.filter(b=>b!==x)),[i]);return t.jsx(tt,{scope:o.__scopeAccordion,value:l,onItemOpen:a,onItemClose:p,children:t.jsx(ot,{scope:o.__scopeAccordion,collapsible:!0,children:t.jsx(nt,{...c,ref:n})})})}),[bo,ve]=xe(G),nt=j.forwardRef((o,n)=>{const{__scopeAccordion:e,disabled:r,dir:s,orientation:c="vertical",...l}=o,i=j.useRef(null),a=O(i,n),p=xo(e),g=qe(s)==="ltr",b=A(o.onKeyDown,w=>{var M;if(!ho.includes(w.key))return;const f=w.target,h=p().filter(V=>{var $;return!(($=V.ref.current)!=null&&$.disabled)}),S=h.findIndex(V=>V.ref.current===f),m=h.length;if(S===-1)return;w.preventDefault();let u=S;const C=0,T=m-1,P=()=>{u=S+1,u>T&&(u=C)},F=()=>{u=S-1,u<C&&(u=T)};switch(w.key){case"Home":u=C;break;case"End":u=T;break;case"ArrowRight":c==="horizontal"&&(g?P():F());break;case"ArrowDown":c==="vertical"&&P();break;case"ArrowLeft":c==="horizontal"&&(g?F():P());break;case"ArrowUp":c==="vertical"&&F();break}const E=u%m;(M=h[E].ref.current)==null||M.focus()});return t.jsx(bo,{scope:e,disabled:r,direction:s,orientation:c,children:t.jsx(Ve.Slot,{scope:e,children:t.jsx(_.div,{...l,"data-orientation":c,ref:a,onKeyDown:r?void 0:b})})})}),fe="AccordionItem",[yo,Be]=xe(fe),rt=j.forwardRef((o,n)=>{const{__scopeAccordion:e,value:r,...s}=o,c=ve(fe,e),l=go(fe,e),i=He(e),a=le(),p=r&&l.value.includes(r)||!1,x=c.disabled||o.disabled;return t.jsx(yo,{scope:e,open:p,disabled:x,triggerId:a,children:t.jsx(po,{"data-orientation":c.orientation,"data-state":dt(p),...i,...s,ref:n,disabled:x,open:p,onOpenChange:g=>{g?l.onItemOpen(r):l.onItemClose(r)}})})});rt.displayName=fe;var st="AccordionHeader",at=j.forwardRef((o,n)=>{const{__scopeAccordion:e,...r}=o,s=ve(G,e),c=Be(st,e);return t.jsx(_.h3,{"data-orientation":s.orientation,"data-state":dt(c.open),"data-disabled":c.disabled?"":void 0,...r,ref:n})});at.displayName=st;var Te="AccordionTrigger",ct=j.forwardRef((o,n)=>{const{__scopeAccordion:e,...r}=o,s=ve(G,e),c=Be(Te,e),l=So(Te,e),i=He(e);return t.jsx(Ve.ItemSlot,{scope:e,children:t.jsx(fo,{"aria-disabled":c.open&&!l.collapsible||void 0,"data-orientation":s.orientation,id:c.triggerId,...i,...r,ref:n})})});ct.displayName=Te;var lt="AccordionContent",it=j.forwardRef((o,n)=>{const{__scopeAccordion:e,...r}=o,s=ve(G,e),c=Be(lt,e),l=He(e);return t.jsx(mo,{role:"region","aria-labelledby":c.triggerId,"data-orientation":s.orientation,...l,...r,ref:n,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...o.style}})});it.displayName=lt;function dt(o){return o?"open":"closed"}var Io=et,No=rt,Ro=at,jo=ct,To=it;function Ue(o,[n,e]){return Math.min(e,Math.max(n,o))}function Po(o){const n=d.useRef({value:o,previous:o});return d.useMemo(()=>(n.current.value!==o&&(n.current.previous=n.current.value,n.current.value=o),n.current.previous),[o])}var Ao=[" ","Enter","ArrowUp","ArrowDown"],_o=[" ","Enter"],de="Select",[ge,Se,Eo]=ze(de),[re,Nn]=he(de,[Eo,Ke]),Ce=Ke(),[Mo,X]=re(de),[Do,Oo]=re(de),ut=o=>{const{__scopeSelect:n,children:e,open:r,defaultOpen:s,onOpenChange:c,value:l,defaultValue:i,onValueChange:a,dir:p,name:x,autoComplete:g,disabled:b,required:w}=o,f=Ce(n),[h,S]=d.useState(null),[m,u]=d.useState(null),[C,T]=d.useState(!1),P=qe(p),[F=!1,E]=ce({prop:r,defaultProp:s,onChange:c}),[M,V]=ce({prop:l,defaultProp:i,onChange:a}),$=d.useRef(null),J=h?!!h.closest("form"):!0,[H,z]=d.useState(new Set),q=Array.from(H).map(D=>D.props.value).join(";");return t.jsx(zt,{...f,children:t.jsxs(Mo,{required:w,scope:n,trigger:h,onTriggerChange:S,valueNode:m,onValueNodeChange:u,valueNodeHasChildren:C,onValueNodeHasChildrenChange:T,contentId:le(),value:M,onValueChange:V,open:F,onOpenChange:E,dir:P,triggerPointerDownPosRef:$,disabled:b,children:[t.jsx(ge.Provider,{scope:n,children:t.jsx(Do,{scope:o.__scopeSelect,onNativeOptionAdd:d.useCallback(D=>{z(B=>new Set(B).add(D))},[]),onNativeOptionRemove:d.useCallback(D=>{z(B=>{const U=new Set(B);return U.delete(D),U})},[]),children:e})}),J?t.jsxs(kt,{"aria-hidden":!0,required:w,tabIndex:-1,name:x,autoComplete:g,value:M,onChange:D=>V(D.target.value),disabled:b,children:[M===void 0?t.jsx("option",{value:""}):null,Array.from(H)]},q):null]})})};ut.displayName=de;var pt="SelectTrigger",ft=d.forwardRef((o,n)=>{const{__scopeSelect:e,disabled:r=!1,...s}=o,c=Ce(e),l=X(pt,e),i=l.disabled||r,a=O(n,l.onTriggerChange),p=Se(e),[x,g,b]=Lt(f=>{const h=p().filter(u=>!u.disabled),S=h.find(u=>u.value===l.value),m=Vt(h,f,S);m!==void 0&&l.onValueChange(m.value)}),w=()=>{i||(l.onOpenChange(!0),b())};return t.jsx(Ft,{asChild:!0,...c,children:t.jsx(_.button,{type:"button",role:"combobox","aria-controls":l.contentId,"aria-expanded":l.open,"aria-required":l.required,"aria-autocomplete":"none",dir:l.dir,"data-state":l.open?"open":"closed",disabled:i,"data-disabled":i?"":void 0,"data-placeholder":Ot(l.value)?"":void 0,...s,ref:a,onClick:A(s.onClick,f=>{f.currentTarget.focus()}),onPointerDown:A(s.onPointerDown,f=>{const h=f.target;h.hasPointerCapture(f.pointerId)&&h.releasePointerCapture(f.pointerId),f.button===0&&f.ctrlKey===!1&&(w(),l.triggerPointerDownPosRef.current={x:Math.round(f.pageX),y:Math.round(f.pageY)},f.preventDefault())}),onKeyDown:A(s.onKeyDown,f=>{const h=x.current!=="";!(f.ctrlKey||f.altKey||f.metaKey)&&f.key.length===1&&g(f.key),!(h&&f.key===" ")&&Ao.includes(f.key)&&(w(),f.preventDefault())})})})});ft.displayName=pt;var mt="SelectValue",ht=d.forwardRef((o,n)=>{const{__scopeSelect:e,className:r,style:s,children:c,placeholder:l="",...i}=o,a=X(mt,e),{onValueNodeHasChildrenChange:p}=a,x=c!==void 0,g=O(n,a.onValueNodeChange);return K(()=>{p(x)},[p,x]),t.jsx(_.span,{...i,ref:g,style:{pointerEvents:"none"},children:Ot(a.value)?t.jsx(t.Fragment,{children:l}):c})});ht.displayName=mt;var ko="SelectIcon",xt=d.forwardRef((o,n)=>{const{__scopeSelect:e,children:r,...s}=o;return t.jsx(_.span,{"aria-hidden":!0,...s,ref:n,children:r||"▼"})});xt.displayName=ko;var Lo="SelectPortal",vt=o=>t.jsx(no,{asChild:!0,...o});vt.displayName=Lo;var te="SelectContent",gt=d.forwardRef((o,n)=>{const e=X(te,o.__scopeSelect),[r,s]=d.useState();if(K(()=>{s(new DocumentFragment)},[]),!e.open){const c=r;return c?Ge.createPortal(t.jsx(St,{scope:o.__scopeSelect,children:t.jsx(ge.Slot,{scope:o.__scopeSelect,children:t.jsx("div",{children:o.children})})}),c):null}return t.jsx(Ct,{...o,ref:n})});gt.displayName=te;var W=10,[St,Z]=re(te),Vo="SelectContentImpl",Ct=d.forwardRef((o,n)=>{const{__scopeSelect:e,position:r="item-aligned",onCloseAutoFocus:s,onEscapeKeyDown:c,onPointerDownOutside:l,side:i,sideOffset:a,align:p,alignOffset:x,arrowPadding:g,collisionBoundary:b,collisionPadding:w,sticky:f,hideWhenDetached:h,avoidCollisions:S,...m}=o,u=X(te,e),[C,T]=d.useState(null),[P,F]=d.useState(null),E=O(n,v=>T(v)),[M,V]=d.useState(null),[$,J]=d.useState(null),H=Se(e),[z,q]=d.useState(!1),D=d.useRef(!1);d.useEffect(()=>{if(C)return Qt(C)},[C]),eo();const B=d.useCallback(v=>{const[R,...k]=H().map(I=>I.ref.current),[N]=k.slice(-1),y=document.activeElement;for(const I of v)if(I===y||(I==null||I.scrollIntoView({block:"nearest"}),I===R&&P&&(P.scrollTop=0),I===N&&P&&(P.scrollTop=P.scrollHeight),I==null||I.focus(),document.activeElement!==y))return},[H,P]),U=d.useCallback(()=>B([M,C]),[B,M,C]);d.useEffect(()=>{z&&U()},[z,U]);const{onOpenChange:oe,triggerPointerDownPosRef:Y}=u;d.useEffect(()=>{if(C){let v={x:0,y:0};const R=N=>{var y,I;v={x:Math.abs(Math.round(N.pageX)-(((y=Y.current)==null?void 0:y.x)??0)),y:Math.abs(Math.round(N.pageY)-(((I=Y.current)==null?void 0:I.y)??0))}},k=N=>{v.x<=10&&v.y<=10?N.preventDefault():C.contains(N.target)||oe(!1),document.removeEventListener("pointermove",R),Y.current=null};return Y.current!==null&&(document.addEventListener("pointermove",R),document.addEventListener("pointerup",k,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",R),document.removeEventListener("pointerup",k,{capture:!0})}}},[C,oe,Y]),d.useEffect(()=>{const v=()=>oe(!1);return window.addEventListener("blur",v),window.addEventListener("resize",v),()=>{window.removeEventListener("blur",v),window.removeEventListener("resize",v)}},[oe]);const[we,ue]=Lt(v=>{const R=H().filter(y=>!y.disabled),k=R.find(y=>y.ref.current===document.activeElement),N=Vt(R,v,k);N&&setTimeout(()=>N.ref.current.focus())}),be=d.useCallback((v,R,k)=>{const N=!D.current&&!k;(u.value!==void 0&&u.value===R||N)&&(V(v),N&&(D.current=!0))},[u.value]),ye=d.useCallback(()=>C==null?void 0:C.focus(),[C]),ne=d.useCallback((v,R,k)=>{const N=!D.current&&!k;(u.value!==void 0&&u.value===R||N)&&J(v)},[u.value]),pe=r==="popper"?Pe:wt,se=pe===Pe?{side:i,sideOffset:a,align:p,alignOffset:x,arrowPadding:g,collisionBoundary:b,collisionPadding:w,sticky:f,hideWhenDetached:h,avoidCollisions:S}:{};return t.jsx(St,{scope:e,content:C,viewport:P,onViewportChange:F,itemRefCallback:be,selectedItem:M,onItemLeave:ye,itemTextRefCallback:ne,focusSelectedItem:U,selectedItemText:$,position:r,isPositioned:z,searchRef:we,children:t.jsx(to,{as:je,allowPinchZoom:!0,children:t.jsx(oo,{asChild:!0,trapped:u.open,onMountAutoFocus:v=>{v.preventDefault()},onUnmountAutoFocus:A(s,v=>{var R;(R=u.trigger)==null||R.focus({preventScroll:!0}),v.preventDefault()}),children:t.jsx($t,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:c,onPointerDownOutside:l,onFocusOutside:v=>v.preventDefault(),onDismiss:()=>u.onOpenChange(!1),children:t.jsx(pe,{role:"listbox",id:u.contentId,"data-state":u.open?"open":"closed",dir:u.dir,onContextMenu:v=>v.preventDefault(),...m,...se,onPlaced:()=>q(!0),ref:E,style:{display:"flex",flexDirection:"column",outline:"none",...m.style},onKeyDown:A(m.onKeyDown,v=>{const R=v.ctrlKey||v.altKey||v.metaKey;if(v.key==="Tab"&&v.preventDefault(),!R&&v.key.length===1&&ue(v.key),["ArrowUp","ArrowDown","Home","End"].includes(v.key)){let N=H().filter(y=>!y.disabled).map(y=>y.ref.current);if(["ArrowUp","End"].includes(v.key)&&(N=N.slice().reverse()),["ArrowUp","ArrowDown"].includes(v.key)){const y=v.target,I=N.indexOf(y);N=N.slice(I+1)}setTimeout(()=>B(N)),v.preventDefault()}})})})})})})});Ct.displayName=Vo;var Ho="SelectItemAlignedPosition",wt=d.forwardRef((o,n)=>{const{__scopeSelect:e,onPlaced:r,...s}=o,c=X(te,e),l=Z(te,e),[i,a]=d.useState(null),[p,x]=d.useState(null),g=O(n,E=>x(E)),b=Se(e),w=d.useRef(!1),f=d.useRef(!0),{viewport:h,selectedItem:S,selectedItemText:m,focusSelectedItem:u}=l,C=d.useCallback(()=>{if(c.trigger&&c.valueNode&&i&&p&&h&&S&&m){const E=c.trigger.getBoundingClientRect(),M=p.getBoundingClientRect(),V=c.valueNode.getBoundingClientRect(),$=m.getBoundingClientRect();if(c.dir!=="rtl"){const y=$.left-M.left,I=V.left-y,Q=E.left-I,ee=E.width+Q,Ie=Math.max(ee,M.width),Ne=window.innerWidth-W,Re=Ue(I,[W,Ne-Ie]);i.style.minWidth=ee+"px",i.style.left=Re+"px"}else{const y=M.right-$.right,I=window.innerWidth-V.right-y,Q=window.innerWidth-E.right-I,ee=E.width+Q,Ie=Math.max(ee,M.width),Ne=window.innerWidth-W,Re=Ue(I,[W,Ne-Ie]);i.style.minWidth=ee+"px",i.style.right=Re+"px"}const J=b(),H=window.innerHeight-W*2,z=h.scrollHeight,q=window.getComputedStyle(p),D=parseInt(q.borderTopWidth,10),B=parseInt(q.paddingTop,10),U=parseInt(q.borderBottomWidth,10),oe=parseInt(q.paddingBottom,10),Y=D+B+z+oe+U,we=Math.min(S.offsetHeight*5,Y),ue=window.getComputedStyle(h),be=parseInt(ue.paddingTop,10),ye=parseInt(ue.paddingBottom,10),ne=E.top+E.height/2-W,pe=H-ne,se=S.offsetHeight/2,v=S.offsetTop+se,R=D+B+v,k=Y-R;if(R<=ne){const y=S===J[J.length-1].ref.current;i.style.bottom="0px";const I=p.clientHeight-h.offsetTop-h.offsetHeight,Q=Math.max(pe,se+(y?ye:0)+I+U),ee=R+Q;i.style.height=ee+"px"}else{const y=S===J[0].ref.current;i.style.top="0px";const Q=Math.max(ne,D+h.offsetTop+(y?be:0)+se)+k;i.style.height=Q+"px",h.scrollTop=R-ne+h.offsetTop}i.style.margin=`${W}px 0`,i.style.minHeight=we+"px",i.style.maxHeight=H+"px",r==null||r(),requestAnimationFrame(()=>w.current=!0)}},[b,c.trigger,c.valueNode,i,p,h,S,m,c.dir,r]);K(()=>C(),[C]);const[T,P]=d.useState();K(()=>{p&&P(window.getComputedStyle(p).zIndex)},[p]);const F=d.useCallback(E=>{E&&f.current===!0&&(C(),u==null||u(),f.current=!1)},[C,u]);return t.jsx(Fo,{scope:e,contentWrapper:i,shouldExpandOnScrollRef:w,onScrollButtonChange:F,children:t.jsx("div",{ref:a,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:T},children:t.jsx(_.div,{...s,ref:g,style:{boxSizing:"border-box",maxHeight:"100%",...s.style}})})})});wt.displayName=Ho;var Bo="SelectPopperPosition",Pe=d.forwardRef((o,n)=>{const{__scopeSelect:e,align:r="start",collisionPadding:s=W,...c}=o,l=Ce(e);return t.jsx(Ut,{...l,...c,ref:n,align:r,collisionPadding:s,style:{boxSizing:"border-box",...c.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});Pe.displayName=Bo;var[Fo,Fe]=re(te,{}),Ae="SelectViewport",bt=d.forwardRef((o,n)=>{const{__scopeSelect:e,nonce:r,...s}=o,c=Z(Ae,e),l=Fe(Ae,e),i=O(n,c.onViewportChange),a=d.useRef(0);return t.jsxs(t.Fragment,{children:[t.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),t.jsx(ge.Slot,{scope:e,children:t.jsx(_.div,{"data-radix-select-viewport":"",role:"presentation",...s,ref:i,style:{position:"relative",flex:1,overflow:"auto",...s.style},onScroll:A(s.onScroll,p=>{const x=p.currentTarget,{contentWrapper:g,shouldExpandOnScrollRef:b}=l;if(b!=null&&b.current&&g){const w=Math.abs(a.current-x.scrollTop);if(w>0){const f=window.innerHeight-W*2,h=parseFloat(g.style.minHeight),S=parseFloat(g.style.height),m=Math.max(h,S);if(m<f){const u=m+w,C=Math.min(f,u),T=u-C;g.style.height=C+"px",g.style.bottom==="0px"&&(x.scrollTop=T>0?T:0,g.style.justifyContent="flex-end")}}}a.current=x.scrollTop})})})]})});bt.displayName=Ae;var yt="SelectGroup",[$o,Uo]=re(yt),It=d.forwardRef((o,n)=>{const{__scopeSelect:e,...r}=o,s=le();return t.jsx($o,{scope:e,id:s,children:t.jsx(_.div,{role:"group","aria-labelledby":s,...r,ref:n})})});It.displayName=yt;var Nt="SelectLabel",Rt=d.forwardRef((o,n)=>{const{__scopeSelect:e,...r}=o,s=Uo(Nt,e);return t.jsx(_.div,{id:s.id,...r,ref:n})});Rt.displayName=Nt;var me="SelectItem",[Wo,jt]=re(me),Tt=d.forwardRef((o,n)=>{const{__scopeSelect:e,value:r,disabled:s=!1,textValue:c,...l}=o,i=X(me,e),a=Z(me,e),p=i.value===r,[x,g]=d.useState(c??""),[b,w]=d.useState(!1),f=O(n,m=>{var u;return(u=a.itemRefCallback)==null?void 0:u.call(a,m,r,s)}),h=le(),S=()=>{s||(i.onValueChange(r),i.onOpenChange(!1))};if(r==="")throw new Error("A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return t.jsx(Wo,{scope:e,value:r,disabled:s,textId:h,isSelected:p,onItemTextChange:d.useCallback(m=>{g(u=>u||((m==null?void 0:m.textContent)??"").trim())},[]),children:t.jsx(ge.ItemSlot,{scope:e,value:r,disabled:s,textValue:x,children:t.jsx(_.div,{role:"option","aria-labelledby":h,"data-highlighted":b?"":void 0,"aria-selected":p&&b,"data-state":p?"checked":"unchecked","aria-disabled":s||void 0,"data-disabled":s?"":void 0,tabIndex:s?void 0:-1,...l,ref:f,onFocus:A(l.onFocus,()=>w(!0)),onBlur:A(l.onBlur,()=>w(!1)),onPointerUp:A(l.onPointerUp,S),onPointerMove:A(l.onPointerMove,m=>{var u;s?(u=a.onItemLeave)==null||u.call(a):m.currentTarget.focus({preventScroll:!0})}),onPointerLeave:A(l.onPointerLeave,m=>{var u;m.currentTarget===document.activeElement&&((u=a.onItemLeave)==null||u.call(a))}),onKeyDown:A(l.onKeyDown,m=>{var C;((C=a.searchRef)==null?void 0:C.current)!==""&&m.key===" "||(_o.includes(m.key)&&S(),m.key===" "&&m.preventDefault())})})})})});Tt.displayName=me;var ae="SelectItemText",Pt=d.forwardRef((o,n)=>{const{__scopeSelect:e,className:r,style:s,...c}=o,l=X(ae,e),i=Z(ae,e),a=jt(ae,e),p=Oo(ae,e),[x,g]=d.useState(null),b=O(n,m=>g(m),a.onItemTextChange,m=>{var u;return(u=i.itemTextRefCallback)==null?void 0:u.call(i,m,a.value,a.disabled)}),w=x==null?void 0:x.textContent,f=d.useMemo(()=>t.jsx("option",{value:a.value,disabled:a.disabled,children:w},a.value),[a.disabled,a.value,w]),{onNativeOptionAdd:h,onNativeOptionRemove:S}=p;return K(()=>(h(f),()=>S(f)),[h,S,f]),t.jsxs(t.Fragment,{children:[t.jsx(_.span,{id:a.textId,...c,ref:b}),a.isSelected&&l.valueNode&&!l.valueNodeHasChildren?Ge.createPortal(c.children,l.valueNode):null]})});Pt.displayName=ae;var At="SelectItemIndicator",_t=d.forwardRef((o,n)=>{const{__scopeSelect:e,...r}=o;return jt(At,e).isSelected?t.jsx(_.span,{"aria-hidden":!0,...r,ref:n}):null});_t.displayName=At;var _e="SelectScrollUpButton",Et=d.forwardRef((o,n)=>{const e=Z(_e,o.__scopeSelect),r=Fe(_e,o.__scopeSelect),[s,c]=d.useState(!1),l=O(n,r.onScrollButtonChange);return K(()=>{if(e.viewport&&e.isPositioned){let i=function(){const p=a.scrollTop>0;c(p)};const a=e.viewport;return i(),a.addEventListener("scroll",i),()=>a.removeEventListener("scroll",i)}},[e.viewport,e.isPositioned]),s?t.jsx(Dt,{...o,ref:l,onAutoScroll:()=>{const{viewport:i,selectedItem:a}=e;i&&a&&(i.scrollTop=i.scrollTop-a.offsetHeight)}}):null});Et.displayName=_e;var Ee="SelectScrollDownButton",Mt=d.forwardRef((o,n)=>{const e=Z(Ee,o.__scopeSelect),r=Fe(Ee,o.__scopeSelect),[s,c]=d.useState(!1),l=O(n,r.onScrollButtonChange);return K(()=>{if(e.viewport&&e.isPositioned){let i=function(){const p=a.scrollHeight-a.clientHeight,x=Math.ceil(a.scrollTop)<p;c(x)};const a=e.viewport;return i(),a.addEventListener("scroll",i),()=>a.removeEventListener("scroll",i)}},[e.viewport,e.isPositioned]),s?t.jsx(Dt,{...o,ref:l,onAutoScroll:()=>{const{viewport:i,selectedItem:a}=e;i&&a&&(i.scrollTop=i.scrollTop+a.offsetHeight)}}):null});Mt.displayName=Ee;var Dt=d.forwardRef((o,n)=>{const{__scopeSelect:e,onAutoScroll:r,...s}=o,c=Z("SelectScrollButton",e),l=d.useRef(null),i=Se(e),a=d.useCallback(()=>{l.current!==null&&(window.clearInterval(l.current),l.current=null)},[]);return d.useEffect(()=>()=>a(),[a]),K(()=>{var x;const p=i().find(g=>g.ref.current===document.activeElement);(x=p==null?void 0:p.ref.current)==null||x.scrollIntoView({block:"nearest"})},[i]),t.jsx(_.div,{"aria-hidden":!0,...s,ref:n,style:{flexShrink:0,...s.style},onPointerDown:A(s.onPointerDown,()=>{l.current===null&&(l.current=window.setInterval(r,50))}),onPointerMove:A(s.onPointerMove,()=>{var p;(p=c.onItemLeave)==null||p.call(c),l.current===null&&(l.current=window.setInterval(r,50))}),onPointerLeave:A(s.onPointerLeave,()=>{a()})})}),Ko="SelectSeparator",Go=d.forwardRef((o,n)=>{const{__scopeSelect:e,...r}=o;return t.jsx(_.div,{"aria-hidden":!0,...r,ref:n})});Go.displayName=Ko;var Me="SelectArrow",zo=d.forwardRef((o,n)=>{const{__scopeSelect:e,...r}=o,s=Ce(e),c=X(Me,e),l=Z(Me,e);return c.open&&l.position==="popper"?t.jsx(Wt,{...s,...r,ref:n}):null});zo.displayName=Me;function Ot(o){return o===""||o===void 0}var kt=d.forwardRef((o,n)=>{const{value:e,...r}=o,s=d.useRef(null),c=O(n,s),l=Po(e);return d.useEffect(()=>{const i=s.current,a=window.HTMLSelectElement.prototype,x=Object.getOwnPropertyDescriptor(a,"value").set;if(l!==e&&x){const g=new Event("change",{bubbles:!0});x.call(i,e),i.dispatchEvent(g)}},[l,e]),t.jsx(Kt,{asChild:!0,children:t.jsx("select",{...r,ref:c,defaultValue:e})})});kt.displayName="BubbleSelect";function Lt(o){const n=Gt(o),e=d.useRef(""),r=d.useRef(0),s=d.useCallback(l=>{const i=e.current+l;n(i),function a(p){e.current=p,window.clearTimeout(r.current),p!==""&&(r.current=window.setTimeout(()=>a(""),1e3))}(i)},[n]),c=d.useCallback(()=>{e.current="",window.clearTimeout(r.current)},[]);return d.useEffect(()=>()=>window.clearTimeout(r.current),[]),[e,s,c]}function Vt(o,n,e){const s=n.length>1&&Array.from(n).every(p=>p===n[0])?n[0]:n,c=e?o.indexOf(e):-1;let l=qo(o,Math.max(c,0));s.length===1&&(l=l.filter(p=>p!==e));const a=l.find(p=>p.textValue.toLowerCase().startsWith(s.toLowerCase()));return a!==e?a:void 0}function qo(o,n){return o.map((e,r)=>o[(n+r)%o.length])}var Yo=ut,Xo=ft,Zo=ht,Jo=xt,Qo=vt,en=gt,tn=bt,on=It,nn=Rt,rn=Tt,sn=Pt,an=_t,cn=Et,ln=Mt;const dn=({title:o,children:n,variant:e,icon:r,forceMount:s=!1})=>{const c=()=>{switch(e){case"changed":return t.jsx(L,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"});case"renamed":return t.jsx(L,{name:"Renamed","aria-label":"Renamed",className:"text-[#fb923c]"});case"added":return t.jsx(L,{name:"Added","aria-label":"Added",className:"text-[#10b981]"});case"deleted":return t.jsx(L,{name:"Deleted","aria-label":"Deleted",className:"text-[#ef4444]"});default:return t.jsx(L,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"})}},l=()=>{switch(e){case"changed":return"modified";default:return e}},i=o.replace(/\\\\/g,"\\");return t.jsxs(No,{value:o,children:[t.jsxs(un,{variant:l(),children:[r||c()," ",i]}),t.jsx(pn,{forceMount:s,className:ie("prose max-w-none whitespace-pre-wrap dark:prose-invert prose-pre:m-0 prose-pre:mb-1 prose-pre:rounded-none",{"radix-state-closed:hidden":s}),children:n})]})},un=d.forwardRef(({children:o,className:n,variant:e,...r},s)=>t.jsx(Ro,{className:"flex",asChild:!0,children:t.jsxs(jo,{className:ie("group flex w-full items-center justify-between border-b p-4 pr-3 font-mono text-sm font-medium leading-none hover:bg-foreground/20",n),...r,ref:s,children:[t.jsx("div",{className:"flex items-center gap-1.5",children:o}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"font-mono text-xs font-normal uppercase text-muted-foreground",children:e}),t.jsx(L,{name:"TriangleDownSmall",className:"transition group-radix-state-open:rotate-180","aria-hidden":!0})]})]})})),pn=d.forwardRef(({children:o,className:n,...e},r)=>t.jsx(To,{className:ie("",n),...e,ref:r,children:t.jsx("div",{children:o})})),fn=o=>t.jsx("pre",{...o}),mn={Accordion:dn,pre:fn};function Rn({diff:o,allApps:n}){const e=qt(),[r]=Yt(),s=new URLSearchParams(r);s.set("forceFresh","diff");const c=Ht(),l=ro.useSpinDelay(c.state!=="idle",{delay:0,minDuration:1e3}),i=[];for(const[a,p]of r.entries())a==="app1"||a==="app2"||i.push(t.jsx("input",{type:"hidden",name:a,value:p},a));return t.jsx(d.Suspense,{fallback:t.jsx("div",{className:"flex items-center justify-center p-8",children:t.jsx($e,{content:"Loading diff",children:t.jsx(L,{name:"Refresh",className:"animate-spin"})})}),children:t.jsx(Xt,{resolve:o,errorElement:t.jsx("p",{className:"p-6 text-foreground-danger",children:"There was an error calculating the diff. Sorry."}),children:a=>t.jsxs("div",{className:"flex h-full w-full flex-col",children:[t.jsxs("div",{className:"flex h-14 min-h-14 w-full overflow-x-hidden border-b",children:[t.jsx("div",{className:"border-r",children:t.jsx($e,{content:"Reload diff",children:t.jsx(Zt,{to:`.?${s}`,className:"flex h-full w-14 items-center justify-center",children:t.jsx(L,{name:"Refresh",className:so({"animate-spin":l})})})})}),t.jsxs(Jt,{onChange:p=>e(p.currentTarget),className:"flex h-full flex-1 items-center overflow-x-auto scrollbar-thin scrollbar-thumb-scrollbar",children:[i,t.jsx(We,{name:"app1",label:"App 1",className:"border-r",allApps:n,defaultValue:a.app1}),t.jsx(We,{name:"app2",label:"App 2",allApps:n,defaultValue:a.app2})]},`${a.app1}${a.app2}`)]}),t.jsx("div",{className:"flex-grow overflow-y-scroll scrollbar-thin scrollbar-thumb-scrollbar",children:a.diffCode?t.jsx("div",{children:t.jsx(Io,{className:"w-full",type:"multiple",children:t.jsx(ao,{code:a.diffCode,components:mn})})}):a.app1&&a.app2?t.jsx("p",{className:"m-5 inline-flex items-center justify-center bg-foreground px-1 py-0.5 font-mono text-sm uppercase text-background",children:"There was a problem generating the diff"}):t.jsx("p",{className:"m-5 inline-flex items-center justify-center bg-foreground px-1 py-0.5 font-mono text-sm uppercase text-background",children:"Select two apps to compare"})})]})})})}function We({name:o,label:n,className:e,allApps:r,defaultValue:s}){return t.jsxs(Yo,{name:o,defaultValue:s,children:[t.jsxs(Xo,{className:ie("flex h-full w-full max-w-[50%] items-center justify-between px-3 text-left radix-placeholder:text-gray-500 focus-visible:outline-none",e),"aria-label":`Select ${n} for git Diff`,children:[t.jsxs("span",{className:"overflow-hidden text-ellipsis whitespace-nowrap",children:[n,":"," ",t.jsx(xn,{placeholder:`Select ${n}`,className:"inline-block w-40 text-ellipsis"})]}),t.jsx(Jo,{className:"",children:t.jsx(L,{name:"TriangleDownSmall"})})]}),t.jsx(Qo,{children:t.jsxs(en,{position:"popper",align:"start",className:"z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",children:[t.jsx(cn,{className:"flex h-5 cursor-default items-center justify-center ",children:t.jsx(L,{name:"ChevronUp"})}),t.jsx(tn,{className:"p-3",children:t.jsxs(on,{children:[t.jsx(nn,{className:"px-5 pb-3 font-mono uppercase",children:n}),r.map(c=>t.jsx(hn,{value:c.name,children:c.displayName},c.name))]})}),t.jsx(ln,{className:"flex h-5 cursor-default items-center justify-center ",children:t.jsx(L,{name:"ChevronDown"})})]})})]})}const hn=j.forwardRef(({children:o,className:n,...e},r)=>t.jsxs(rn,{className:ie("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),...e,ref:r,children:[t.jsx(sn,{children:o}),t.jsx(an,{className:"absolute left-0 inline-flex w-[25px] items-center justify-center",children:t.jsx(L,{name:"CheckSmall"})})]})),xn=j.forwardRef(({children:o,className:n,...e},r)=>t.jsx(Zo,{...e,ref:r,children:e.value}));export{dn as A,en as C,Rn as D,on as G,Jo as I,nn as L,Qo as P,Yo as R,cn as S,Xo as T,Zo as V,tn as a,ln as b,ze as c,rn as d,sn as e,an as f,Io as g,qe as u};
2
- //# sourceMappingURL=diff-CCCucBoq.js.map