@epic-web/workshop-app 4.28.0 → 4.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/{_-C82olNpL.js → _-D0Tgngwe.js} +2 -2
- package/build/client/assets/{_-C82olNpL.js.map → _-D0Tgngwe.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber-DeMmiDU5.js → _exerciseNumber-DE_0qQH_.js} +2 -2
- package/build/client/assets/{_exerciseNumber-DeMmiDU5.js.map → _exerciseNumber-DE_0qQH_.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_._stepNumber-qCtEMlS2.js → _exerciseNumber_._stepNumber-7kSd_6hH.js} +2 -2
- package/build/client/assets/{_exerciseNumber_._stepNumber-qCtEMlS2.js.map → _exerciseNumber_._stepNumber-7kSd_6hH.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_.finished-DM5HZX6r.js → _exerciseNumber_.finished-CXSyM9gG.js} +2 -2
- package/build/client/assets/{_exerciseNumber_.finished-DM5HZX6r.js.map → _exerciseNumber_.finished-CXSyM9gG.js.map} +1 -1
- package/build/client/assets/_layout-BPwIOXxN.js +6 -0
- package/build/client/assets/_layout-BPwIOXxN.js.map +1 -0
- package/build/client/assets/{_layout-DATuycts.js → _layout-BwzhY4NI.js} +2 -2
- package/build/client/assets/{_layout-DATuycts.js.map → _layout-BwzhY4NI.js.map} +1 -1
- package/build/client/assets/{_layout-5idP3Bqx.js → _layout-CX6Ujslq.js} +2 -2
- package/build/client/assets/{_layout-5idP3Bqx.js.map → _layout-CX6Ujslq.js.map} +1 -1
- package/build/client/assets/{accordion-CKwXYK9L.js → accordion-OfO-5m5D.js} +2 -2
- package/build/client/assets/{accordion-CKwXYK9L.js.map → accordion-OfO-5m5D.js.map} +1 -1
- package/build/client/assets/{account-D1DCJCnR.js → account-BatJhmSV.js} +2 -2
- package/build/client/assets/{account-D1DCJCnR.js.map → account-BatJhmSV.js.map} +1 -1
- package/build/client/assets/app-88P7VaQm.js +2 -0
- package/build/client/assets/{app-C-oFaj2l.js.map → app-88P7VaQm.js.map} +1 -1
- package/build/client/assets/{button-CQ6cnotS.js → button-EE0aPg10.js} +2 -2
- package/build/client/assets/{button-CQ6cnotS.js.map → button-EE0aPg10.js.map} +1 -1
- package/build/client/assets/{diff-CU8At1c4.js → diff-aBqZBC2m.js} +2 -2
- package/build/client/assets/{diff-CU8At1c4.js.map → diff-aBqZBC2m.js.map} +1 -1
- package/build/client/assets/{diff-hoOood-9.js → diff-uBbcWjMl.js} +2 -2
- package/build/client/assets/{diff-hoOood-9.js.map → diff-uBbcWjMl.js.map} +1 -1
- package/build/client/assets/{discord-CgdmSzxV.js → discord-BRTW4Rnh.js} +2 -2
- package/build/client/assets/{discord-CgdmSzxV.js.map → discord-BRTW4Rnh.js.map} +1 -1
- package/build/client/assets/discord-BhzUjmbI.js +2 -0
- package/build/client/assets/discord-BhzUjmbI.js.map +1 -0
- package/build/client/assets/{epic-video-BFcdejfC.js → epic-video-CtC1lrmt.js} +2 -2
- package/build/client/assets/{epic-video-BFcdejfC.js.map → epic-video-CtC1lrmt.js.map} +1 -1
- package/build/client/assets/{error-boundary-CqgVAFiu.js → error-boundary-COkPRBOZ.js} +2 -2
- package/build/client/assets/{error-boundary-CqgVAFiu.js.map → error-boundary-COkPRBOZ.js.map} +1 -1
- package/build/client/assets/{finished-C_v7hO19.js → finished-B3ubB4CI.js} +2 -2
- package/build/client/assets/{finished-C_v7hO19.js.map → finished-B3ubB4CI.js.map} +1 -1
- package/build/client/assets/{icons-CnZJXICl.svg → icons-BtWYk6Ws.svg} +17 -0
- package/build/client/assets/{index-9dWszLxO.js → index-BwhlO_gF.js} +2 -2
- package/build/client/assets/{index-9dWszLxO.js.map → index-BwhlO_gF.js.map} +1 -1
- package/build/client/assets/{index-j_VpxCZh.js → index-CXyf3Reb.js} +2 -2
- package/build/client/assets/{index-j_VpxCZh.js.map → index-CXyf3Reb.js.map} +1 -1
- package/build/client/assets/{index-CsPok4Mn.js → index-RXedS5cU.js} +2 -2
- package/build/client/assets/{index-CsPok4Mn.js.map → index-RXedS5cU.js.map} +1 -1
- package/build/client/assets/{index-DlJAkutV.js → index-YNIH4TH8.js} +2 -2
- package/build/client/assets/{index-DlJAkutV.js.map → index-YNIH4TH8.js.map} +1 -1
- package/build/client/assets/{index-BHeB-0xq.js → index-ZRjyMQjt.js} +2 -2
- package/build/client/assets/{index-BHeB-0xq.js.map → index-ZRjyMQjt.js.map} +1 -1
- package/build/client/assets/{loading-CF7oQHQf.js → loading-DizTwLux.js} +2 -2
- package/build/client/assets/{loading-CF7oQHQf.js.map → loading-DizTwLux.js.map} +1 -1
- package/build/client/assets/{login-Ca9EDpZj.js → login-CbBI7xkR.js} +2 -2
- package/build/client/assets/{login-Ca9EDpZj.js.map → login-CbBI7xkR.js.map} +1 -1
- package/build/client/assets/{manifest-ade0c8c3.js → manifest-d831df81.js} +1 -1
- package/build/client/assets/{mdx-DvqHp8UI.js → mdx-C-xljcvl.js} +2 -2
- package/build/client/assets/{mdx-DvqHp8UI.js.map → mdx-C-xljcvl.js.map} +1 -1
- package/build/client/assets/{misc-Txs7O6JX.js → misc-CxCgA-_O.js} +2 -2
- package/build/client/assets/{misc-Txs7O6JX.js.map → misc-CxCgA-_O.js.map} +1 -1
- package/build/client/assets/{nav-chevrons-Cbc1bd_j.js → nav-chevrons-g-C0ilNz.js} +2 -2
- package/build/client/assets/{nav-chevrons-Cbc1bd_j.js.map → nav-chevrons-g-C0ilNz.js.map} +1 -1
- package/build/client/assets/{onboarding-Dc2TmI9y.js → onboarding-BIVf8oVW.js} +2 -2
- package/build/client/assets/onboarding-BIVf8oVW.js.map +1 -0
- package/build/client/assets/preview-DYe41EMN.js +2 -0
- package/build/client/assets/preview-DYe41EMN.js.map +1 -0
- package/build/client/assets/{product-f8Gd2MQ6.js → product-BAWG1Vut.js} +2 -2
- package/build/client/assets/{product-f8Gd2MQ6.js.map → product-BAWG1Vut.js.map} +1 -1
- package/build/client/assets/{progress-C7kc6YXZ.js → progress-BFm2U-l5.js} +2 -2
- package/build/client/assets/{progress-C7kc6YXZ.js.map → progress-BFm2U-l5.js.map} +1 -1
- package/build/client/assets/{progress-bar-bUuKn1Q8.js → progress-bar-D3kudPcr.js} +2 -2
- package/build/client/assets/{progress-bar-bUuKn1Q8.js.map → progress-bar-D3kudPcr.js.map} +1 -1
- package/build/client/assets/{root-CbC_P7jJ.js → root-Wg6CLPzr.js} +2 -2
- package/build/client/assets/{root-CbC_P7jJ.js.map → root-Wg6CLPzr.js.map} +1 -1
- package/build/client/assets/{set-playground-Cr0qL9N9.js → set-playground-DW0yVaNn.js} +2 -2
- package/build/client/assets/{set-playground-Cr0qL9N9.js.map → set-playground-DW0yVaNn.js.map} +1 -1
- package/build/client/assets/test-CSKfnJmn.js +2 -0
- package/build/client/assets/{test-Cy-fo6gv.js.map → test-CSKfnJmn.js.map} +1 -1
- package/build/client/assets/{tests-DmimqC1q.js → tests-AGbZcka3.js} +2 -2
- package/build/client/assets/{tests-DmimqC1q.js.map → tests-AGbZcka3.js.map} +1 -1
- package/build/client/assets/{tooltip-DTFU8ajx.js → tooltip-kD4kSf1i.js} +2 -2
- package/build/client/assets/{tooltip-DTFU8ajx.js.map → tooltip-kD4kSf1i.js.map} +1 -1
- package/build/server/index.js +249 -200
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_layout-DkGEbcMk.js +0 -6
- package/build/client/assets/_layout-DkGEbcMk.js.map +0 -1
- package/build/client/assets/app-C-oFaj2l.js +0 -2
- package/build/client/assets/discord-BBRM_H3g.js +0 -2
- package/build/client/assets/discord-BBRM_H3g.js.map +0 -1
- package/build/client/assets/onboarding-Dc2TmI9y.js.map +0 -1
- package/build/client/assets/preview-WJ-QYhx8.js +0 -2
- package/build/client/assets/preview-WJ-QYhx8.js.map +0 -1
- package/build/client/assets/test-Cy-fo6gv.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CsPok4Mn.js","sources":["../../../../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../../../../node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/discord.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/playground.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index.tsx"],"sourcesContent":["\"use client\";\n\n// packages/react/roving-focus/src/RovingFocusGroup.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar ENTRY_FOCUS = \"rovingFocusGroup.onEntryFocus\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar GROUP_NAME = \"RovingFocusGroup\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(GROUP_NAME);\nvar [createRovingFocusGroupContext, createRovingFocusGroupScope] = createContextScope(\n GROUP_NAME,\n [createCollectionScope]\n);\nvar [RovingFocusProvider, useRovingFocusContext] = createRovingFocusGroupContext(GROUP_NAME);\nvar RovingFocusGroup = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(RovingFocusGroupImpl, { ...props, ref: forwardedRef }) }) });\n }\n);\nRovingFocusGroup.displayName = GROUP_NAME;\nvar RovingFocusGroupImpl = React.forwardRef((props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n orientation,\n loop = false,\n dir,\n currentTabStopId: currentTabStopIdProp,\n defaultCurrentTabStopId,\n onCurrentTabStopIdChange,\n onEntryFocus,\n preventScrollOnEntryFocus = false,\n ...groupProps\n } = props;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const direction = useDirection(dir);\n const [currentTabStopId = null, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId,\n onChange: onCurrentTabStopIdChange\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const handleEntryFocus = useCallbackRef(onEntryFocus);\n const getItems = useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = React.useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n node.addEventListener(ENTRY_FOCUS, handleEntryFocus);\n return () => node.removeEventListener(ENTRY_FOCUS, handleEntryFocus);\n }\n }, [handleEntryFocus]);\n return /* @__PURE__ */ jsx(\n RovingFocusProvider,\n {\n scope: __scopeRovingFocusGroup,\n orientation,\n dir: direction,\n loop,\n currentTabStopId,\n onItemFocus: React.useCallback(\n (tabStopId) => setCurrentTabStopId(tabStopId),\n [setCurrentTabStopId]\n ),\n onItemShiftTab: React.useCallback(() => setIsTabbingBackOut(true), []),\n onFocusableItemAdd: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount + 1),\n []\n ),\n onFocusableItemRemove: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount - 1),\n []\n ),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation,\n ...groupProps,\n ref: composedRefs,\n style: { outline: \"none\", ...props.style },\n onMouseDown: composeEventHandlers(props.onMouseDown, () => {\n isClickFocusRef.current = true;\n }),\n onFocus: composeEventHandlers(props.onFocus, (event) => {\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item) => item.focusable);\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === currentTabStopId);\n const candidateItems = [activeItem, currentItem, ...items].filter(\n Boolean\n );\n const candidateNodes = candidateItems.map((item) => item.ref.current);\n focusFirst(candidateNodes, preventScrollOnEntryFocus);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false))\n }\n )\n }\n );\n});\nvar ITEM_NAME = \"RovingFocusGroupItem\";\nvar RovingFocusGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n focusable = true,\n active = false,\n tabStopId,\n ...itemProps\n } = props;\n const autoId = useId();\n const id = tabStopId || autoId;\n const context = useRovingFocusContext(ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd, onFocusableItemRemove } = context;\n React.useEffect(() => {\n if (focusable) {\n onFocusableItemAdd();\n return () => onFocusableItemRemove();\n }\n }, [focusable, onFocusableItemAdd, onFocusableItemRemove]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeRovingFocusGroup,\n id,\n focusable,\n active,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation,\n ...itemProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!focusable) event.preventDefault();\n else context.onItemFocus(id);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => context.onItemFocus(id)),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Tab\" && event.shiftKey) {\n context.onItemShiftTab();\n return;\n }\n if (event.target !== event.currentTarget) return;\n const focusIntent = getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== void 0) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n event.preventDefault();\n const items = getItems().filter((item) => item.focusable);\n let candidateNodes = items.map((item) => item.ref.current);\n if (focusIntent === \"last\") candidateNodes.reverse();\n else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = context.loop ? wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n }\n })\n }\n )\n }\n );\n }\n);\nRovingFocusGroupItem.displayName = ITEM_NAME;\nvar MAP_KEY_TO_FOCUS_INTENT = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\"\n};\nfunction getDirectionAwareKey(key, dir) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\" ? \"ArrowRight\" : key === \"ArrowRight\" ? \"ArrowLeft\" : key;\n}\nfunction getFocusIntent(event, orientation, dir) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key)) return void 0;\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key)) return void 0;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction focusFirst(candidates, preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root = RovingFocusGroup;\nvar Item = RovingFocusGroupItem;\nexport {\n Item,\n Root,\n RovingFocusGroup,\n RovingFocusGroupItem,\n createRovingFocusGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// packages/react/tabs/src/Tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if ([\" \", \"Enter\"].includes(event.key)) context.onValueChange(value);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","import { type SerializeFrom } from '@remix-run/node'\nimport { Await, Link, useLoaderData } from '@remix-run/react'\nimport * as React from 'react'\nimport { Icon } from '#app/components/icons.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { DiscordCTA, useDiscordCTALink } from '../../../discord.tsx'\nimport { type loader } from '../index.tsx'\n\nexport function DiscordChat() {\n\tconst data = useLoaderData<typeof loader>()\n\treturn (\n\t\t<div className=\"flex h-full w-full flex-col gap-4 pt-4\">\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<DiscordCTA discordAuthUrl={data.discordAuthUrl} />\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<DiscordPosts />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPosts() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst ctaLink = useDiscordCTALink({ discordAuthUrl: data.discordAuthUrl })\n\tconst altDown = useAltDown()\n\treturn (\n\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t<React.Suspense\n\t\t\t\tfallback={\n\t\t\t\t\t<div className=\"flex h-full w-full flex-col items-center justify-center\">\n\t\t\t\t\t\t<Loading>Loading Discord Posts</Loading>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Await\n\t\t\t\t\tresolve={data.discordPostsPromise}\n\t\t\t\t\terrorElement={\n\t\t\t\t\t\t<div className=\"text-red-500\">\n\t\t\t\t\t\t\tThere was a problem loading the discord posts\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{(posts) => (\n\t\t\t\t\t\t<ul className=\"flex w-full flex-col gap-4 p-3 xl:p-12\">\n\t\t\t\t\t\t\t{posts.map((post) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={post.id}\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-xl border bg-background transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<DiscordPost thread={post} />\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</Await>\n\t\t\t</React.Suspense>\n\t\t\t<div>\n\t\t\t\t<Link\n\t\t\t\t\tto={\n\t\t\t\t\t\taltDown && !ctaLink.includes('oauth')\n\t\t\t\t\t\t\t? ctaLink.replace(/^https/, 'discord')\n\t\t\t\t\t\t\t: ctaLink\n\t\t\t\t\t}\n\t\t\t\t\ttarget={ctaLink.includes('oauth') ? undefined : '_blank'}\n\t\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t\t\tonClick={\n\t\t\t\t\t\taltDown\n\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\twindow.open(\n\t\t\t\t\t\t\t\t\t\te.currentTarget.href,\n\t\t\t\t\t\t\t\t\t\t'_blank',\n\t\t\t\t\t\t\t\t\t\t'noreferrer noopener',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclassName=\"flex items-center gap-2 p-2 text-xl hover:underline\"\n\t\t\t\t>\n\t\t\t\t\tCreate Post <Icon name=\"ExternalLink\" />\n\t\t\t\t</Link>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPost({\n\tthread,\n}: {\n\tthread: Awaited<SerializeFrom<typeof loader>['discordPostsPromise']>[number]\n}) {\n\tconst reactionsWithCounts = thread.reactions.filter((r) => r.count)\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t{thread.tags.length ? (\n\t\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t{thread.tags.map((t) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={t.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center gap-1 rounded-full bg-accent px-2 py-1 text-sm\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t{/* not sure how to fix this one... */}\n\t\t\t\t\t\t\t\t\t\t\t{/* @ts-expect-error */}\n\t\t\t\t\t\t\t\t\t\t\t<Emoji name={t.emojiName} url={t.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>{t.name}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<strong className=\"text-xl font-bold\">{thread.name}</strong>\n\t\t\t\t\t\t<div className=\"flex items-start gap-1\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t{thread.authorAvatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={thread.authorAvatarUrl}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-bold\"\n\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\tthread.authorHexAccentColor\n\t\t\t\t\t\t\t\t\t\t\t\t? { color: thread.authorHexAccentColor }\n\t\t\t\t\t\t\t\t\t\t\t\t: {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{thread.authorDisplayName}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t:{' '}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span className=\"flex-1 overflow-ellipsis text-muted-foreground\">\n\t\t\t\t\t\t\t\t{thread.messagePreview}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{thread.previewImageUrl ? (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={thread.previewImageUrl}\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tclassName=\"h-28 w-28 rounded-lg object-cover\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{reactionsWithCounts.length ? (\n\t\t\t\t\t\t\t\t<ul className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{reactionsWithCounts.map((r, i) => (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t{/* not sure how to fix this one... */}\n\t\t\t\t\t\t\t\t\t\t\t\t{/* @ts-expect-error */}\n\t\t\t\t\t\t\t\t\t\t\t\t<Emoji name={r.emojiName} url={r.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{r.count}</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1\">\n\t\t\t\t\t\t\t\t<Icon name=\"Chat\" /> {thread.messageCount}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{` · ${thread.lastUpdatedDisplay}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"flex items-center gap-4\">\n\t\t\t\t\t\t<a href={thread.link.replace(/^https/, 'discord')}>\n\t\t\t\t\t\t\t<Icon name=\"Discord\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href={thread.link} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Emoji({ name, url }: { name?: string; url?: string }) {\n\treturn url ? (\n\t\t<img src={url} alt={name} className=\"h-full w-full\" />\n\t) : name ? (\n\t\tname\n\t) : null\n}\n","import { toast as showToast } from 'sonner'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser'\nimport { SimpleTooltip } from '#app/components/ui/tooltip'\nimport { SetAppToPlayground } from '#app/routes/set-playground'\nimport { PlaygroundWindow } from './playground-window'\nimport { Preview } from './preview'\n\nexport function Playground({\n\tappInfo: playgroundAppInfo,\n\tinBrowserBrowserRef,\n\tproblemAppName,\n\tallApps,\n\tisUpToDate,\n}: {\n\tappInfo: Parameters<typeof Preview>['0']['appInfo'] | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n\tproblemAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n\tisUpToDate: boolean\n}) {\n\treturn (\n\t\t<PlaygroundWindow\n\t\t\tplaygroundAppName={playgroundAppInfo?.appName}\n\t\t\tproblemAppName={problemAppName}\n\t\t\tallApps={allApps}\n\t\t\tisUpToDate={isUpToDate}\n\t\t>\n\t\t\t{playgroundAppInfo?.dev.type === 'none' ? (\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"text-foreground-secondary flex h-full items-center justify-center text-2xl\">\n\t\t\t\t\t\tNon-UI playground\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"text-foreground-secondary flex flex-wrap gap-1 text-center\">\n\t\t\t\t\t\t\tNavigate to{' '}\n\t\t\t\t\t\t\t<SimpleTooltip content={playgroundAppInfo.fullPath}>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tplaygroundAppInfo.fullPath,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tshowToast.success('Copied playground path to clipboard')\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tthe playground directory\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</SimpleTooltip>{' '}\n\t\t\t\t\t\t\tin your editor and terminal to work on this exercise!\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : playgroundAppInfo ? (\n\t\t\t\t<Preview\n\t\t\t\t\tid={playgroundAppInfo.appName}\n\t\t\t\t\tappInfo={playgroundAppInfo}\n\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col justify-center gap-2\">\n\t\t\t\t\t<p>Please set the playground first</p>\n\t\t\t\t\t{problemAppName ? (\n\t\t\t\t\t\t<SetAppToPlayground appName={problemAppName} />\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PlaygroundWindow>\n\t)\n}\n","import {\n\tgetAppByName,\n\tgetAppDisplayName,\n\tgetApps,\n\tgetExerciseApp,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { compileMarkdownString } from '@epic-web/workshop-utils/compile-mdx.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport * as Tabs from '@radix-ui/react-tabs'\nimport {\n\tdefer,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport {\n\tLink,\n\tuseLoaderData,\n\tuseNavigate,\n\tuseSearchParams,\n} from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { useRef } from 'react'\nimport { Diff } from '#app/components/diff.tsx'\nimport { GeneralErrorBoundary } from '#app/components/error-boundary.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { getDiscordAuthURL } from '#app/routes/discord.callback.ts'\nimport { getDiffCode } from '#app/utils/diff.server.ts'\nimport { userHasAccessToWorkshop } from '#app/utils/epic-api.js'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { fetchDiscordPosts } from './__shared/discord.server.ts'\nimport { DiscordChat } from './__shared/discord.tsx'\nimport { Playground } from './__shared/playground.tsx'\nimport { Preview } from './__shared/preview.tsx'\nimport { Tests } from './__shared/tests.tsx'\nimport { getAppRunningState } from './__shared/utils.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseStepTypeLoader')\n\tconst userHasAccess = await userHasAccessToWorkshop({\n\t\trequest,\n\t\ttimings,\n\t})\n\tconst searchParams = new URL(request.url).searchParams\n\tconst cacheOptions = { request, timings }\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\tconst reqUrl = new URL(request.url)\n\n\tconst pathnameParam = reqUrl.searchParams.get('pathname')\n\tif (pathnameParam === '' || pathnameParam === '/') {\n\t\treqUrl.searchParams.delete('pathname')\n\t\tthrow redirect(reqUrl.toString())\n\t}\n\n\tconst problemApp = await getExerciseApp(\n\t\t{ ...params, type: 'problem' },\n\t\tcacheOptions,\n\t)\n\tconst solutionApp = await getExerciseApp(\n\t\t{ ...params, type: 'solution' },\n\t\tcacheOptions,\n\t)\n\n\tif (!problemApp && !solutionApp) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst allAppsFull = await getApps(cacheOptions)\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\n\n\tconst app1Name = reqUrl.searchParams.get('app1')\n\tconst app2Name = reqUrl.searchParams.get('app2')\n\tconst app1 = app1Name\n\t\t? await getAppByName(app1Name)\n\t\t: playgroundApp || problemApp\n\tconst app2 = app2Name ? await getAppByName(app2Name) : solutionApp\n\n\tfunction getStepId(a: ExerciseStepApp) {\n\t\treturn (\n\t\t\ta.exerciseNumber * 1000 +\n\t\t\ta.stepNumber * 10 +\n\t\t\t(a.type === 'problem' ? 0 : 1)\n\t\t)\n\t}\n\n\tfunction getStepNameAndId(a: App) {\n\t\tif (isExerciseStepApp(a)) {\n\t\t\tconst exerciseNumberStr = String(a.exerciseNumber).padStart(2, '0')\n\t\t\tconst stepNumberStr = String(a.stepNumber).padStart(2, '0')\n\n\t\t\treturn {\n\t\t\t\tstepName: `${exerciseNumberStr}/${stepNumberStr}.${a.type}`,\n\t\t\t\tstepId: getStepId(a),\n\t\t\t}\n\t\t}\n\t\treturn { stepName: '', stepId: -1 }\n\t}\n\n\tconst allApps = allAppsFull\n\t\t.filter((a, i, ar) => ar.findIndex((b) => a.name === b.name) === i)\n\t\t.map((a) => ({\n\t\t\tdisplayName: getAppDisplayName(a, allAppsFull),\n\t\t\tname: a.name,\n\t\t\ttitle: a.title,\n\t\t\ttype: a.type,\n\t\t\t...getStepNameAndId(a),\n\t\t}))\n\n\tallApps.sort((a, b) => {\n\t\t// order them by their stepId\n\t\tif (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId\n\n\t\t// non-step apps should come after step apps\n\t\tif (a.stepId > 0) return -1\n\t\tif (b.stepId > 0) return 1\n\n\t\treturn 0\n\t})\n\n\tasync function getDiffProp() {\n\t\tif (!app1 || !app2) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: null,\n\t\t\t}\n\t\t}\n\t\tif (!userHasAccess) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: await compileMarkdownString(\n\t\t\t\t\t`<h1>Access Denied</h1><p>You must login or register for the workshop to view the diff</p>`,\n\t\t\t\t),\n\t\t\t}\n\t\t}\n\t\tconst diffCode = await getDiffCode(app1, app2, {\n\t\t\t...cacheOptions,\n\t\t\tforceFresh: searchParams.get('forceFresh') === 'diff',\n\t\t}).catch((e) => {\n\t\t\tconsole.error(e)\n\t\t\treturn null\n\t\t})\n\t\treturn {\n\t\t\tapp1: app1.name,\n\t\t\tapp2: app2.name,\n\t\t\tdiffCode,\n\t\t}\n\t}\n\n\treturn defer(\n\t\t{\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\tallApps,\n\t\t\tdiscordAuthUrl: getDiscordAuthURL(),\n\t\t\t// defer this promise so that we don't block the response from being sent\n\t\t\tdiscordPostsPromise: fetchDiscordPosts({ request }),\n\t\t\tplayground: playgroundApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'playground',\n\t\t\t\t\t\tfullPath: playgroundApp.fullPath,\n\t\t\t\t\t\tdev: playgroundApp.dev,\n\t\t\t\t\t\ttest: playgroundApp.test,\n\t\t\t\t\t\ttitle: playgroundApp.title,\n\t\t\t\t\t\tname: playgroundApp.name,\n\t\t\t\t\t\tappName: playgroundApp.appName,\n\t\t\t\t\t\tisUpToDate: playgroundApp.isUpToDate,\n\t\t\t\t\t\tstackBlitzUrl: playgroundApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(playgroundApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tproblem: problemApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'problem',\n\t\t\t\t\t\tfullPath: problemApp.fullPath,\n\t\t\t\t\t\tdev: problemApp.dev,\n\t\t\t\t\t\ttest: problemApp.test,\n\t\t\t\t\t\ttitle: problemApp.title,\n\t\t\t\t\t\tname: problemApp.name,\n\t\t\t\t\t\tstackBlitzUrl: problemApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(problemApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tsolution: solutionApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'solution',\n\t\t\t\t\t\tfullPath: solutionApp.fullPath,\n\t\t\t\t\t\tdev: solutionApp.dev,\n\t\t\t\t\t\ttest: solutionApp.test,\n\t\t\t\t\t\ttitle: solutionApp.title,\n\t\t\t\t\t\tname: solutionApp.name,\n\t\t\t\t\t\tstackBlitzUrl: solutionApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(solutionApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tdiff: getDiffProp(),\n\t\t} as const,\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst tabs = [\n\t'playground',\n\t'problem',\n\t'solution',\n\t'tests',\n\t'diff',\n\t'chat',\n] as const\nconst isValidPreview = (s: string | null): s is (typeof tabs)[number] =>\n\tBoolean(s && tabs.includes(s as (typeof tabs)[number]))\n\nfunction withParam(\n\tsearchParams: URLSearchParams,\n\tkey: string,\n\tvalue: string | null,\n) {\n\tconst newSearchParams = new URLSearchParams(searchParams)\n\tif (value === null) {\n\t\tnewSearchParams.delete(key)\n\t} else {\n\t\tnewSearchParams.set(key, value)\n\t}\n\treturn newSearchParams\n}\n\nexport default function ExercisePartRoute() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst [searchParams] = useSearchParams()\n\n\tconst preview = searchParams.get('preview')\n\tconst inBrowserBrowserRef = useRef<InBrowserBrowserRef>(null)\n\n\tconst altDown = useAltDown()\n\tconst navigate = useNavigate()\n\n\tfunction shouldHideTab(tab: (typeof tabs)[number]) {\n\t\tif (tab === 'tests') {\n\t\t\treturn (\n\t\t\t\tENV.EPICSHOP_DEPLOYED ||\n\t\t\t\t!data.playground ||\n\t\t\t\tdata.playground.test.type === 'none'\n\t\t\t)\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution') {\n\t\t\tif (data[tab]?.dev.type === 'none') return true\n\t\t\tif (ENV.EPICSHOP_DEPLOYED) {\n\t\t\t\treturn data[tab]?.dev.type !== 'browser' && !data[tab]?.stackBlitzUrl\n\t\t\t}\n\t\t}\n\t\tif (tab === 'playground' && ENV.EPICSHOP_DEPLOYED) return true\n\t\treturn false\n\t}\n\n\tconst activeTab = isValidPreview(preview)\n\t\t? preview\n\t\t: tabs.find((t) => !shouldHideTab(t))\n\n\t// when alt is held down, the diff tab should open to the full-page diff view\n\t// between the problem and solution (this is more for the instructor than the student)\n\tconst altDiffUrl = `/diff?${new URLSearchParams({\n\t\tapp1: data.problem?.name ?? '',\n\t\tapp2: data.solution?.name ?? '',\n\t})}`\n\n\tfunction handleDiffTabClick(event: React.MouseEvent<HTMLAnchorElement>) {\n\t\tif (event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {\n\t\t\tevent.preventDefault()\n\t\t\tnavigate(altDiffUrl)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Tabs.Root\n\t\t\tclassName=\"relative flex flex-col overflow-y-auto sm:col-span-1 sm:row-span-1\"\n\t\t\tvalue={activeTab}\n\t\t\t// intentionally no onValueChange here because the Link will trigger the\n\t\t\t// change.\n\t\t>\n\t\t\t<Tabs.List className=\"h-14 min-h-14 overflow-x-hidden border-b scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\tconst hidden = shouldHideTab(tab)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Tabs.Trigger key={tab} value={tab} hidden={hidden} asChild>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tid={`${tab}-tab`}\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'clip-path-button relative h-full px-6 py-4 font-mono text-sm uppercase outline-none radix-state-active:z-10 radix-state-active:bg-foreground radix-state-active:text-background radix-state-active:hover:bg-foreground/80 radix-state-active:hover:text-background/80 radix-state-inactive:hover:bg-foreground/20 radix-state-inactive:hover:text-foreground/80 focus:bg-foreground/80 focus:text-background/80',\n\t\t\t\t\t\t\t\t\thidden ? 'hidden' : 'inline-block',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tpreventScrollReset\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tonClick={handleDiffTabClick}\n\t\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\t\ttab === 'diff' && altDown\n\t\t\t\t\t\t\t\t\t\t? altDiffUrl\n\t\t\t\t\t\t\t\t\t\t: `?${withParam(\n\t\t\t\t\t\t\t\t\t\t\t\tsearchParams,\n\t\t\t\t\t\t\t\t\t\t\t\t'preview',\n\t\t\t\t\t\t\t\t\t\t\t\ttab === 'playground' ? null : tab,\n\t\t\t\t\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{tab}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</Tabs.List>\n\t\t\t<div className=\"relative z-10 flex min-h-96 flex-grow flex-col overflow-y-auto\">\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"playground\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Playground\n\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"problem\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={data.problem}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"solution\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={data.solution}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"tests\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-start justify-center self-start overflow-hidden radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Tests\n\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"diff\"\n\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Diff diff={data.diff} allApps={data.allApps} />\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"chat\"\n\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<DiscordChat />\n\t\t\t\t</Tabs.Content>\n\t\t\t</div>\n\t\t</Tabs.Root>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<GeneralErrorBoundary\n\t\t\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["ENTRY_FOCUS","EVENT_OPTIONS","GROUP_NAME","Collection","useCollection","createCollectionScope","createCollection","createRovingFocusGroupContext","createRovingFocusGroupScope","createContextScope","RovingFocusProvider","useRovingFocusContext","RovingFocusGroup","React.forwardRef","props","forwardedRef","jsx","RovingFocusGroupImpl","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","preventScrollOnEntryFocus","groupProps","ref","React.useRef","composedRefs","useComposedRefs","direction","useDirection","currentTabStopId","setCurrentTabStopId","useControllableState","isTabbingBackOut","setIsTabbingBackOut","React.useState","handleEntryFocus","useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","React.useEffect","node","React.useCallback","tabStopId","prevCount","Primitive","composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","focusFirst","ITEM_NAME","RovingFocusGroupItem","focusable","active","itemProps","autoId","useId","id","context","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","getFocusIntent","currentIndex","wrapArray","MAP_KEY_TO_FOCUS_INTENT","getDirectionAwareKey","key","candidates","preventScroll","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","index","Root","Item","TABS_NAME","createTabsContext","createTabsScope","useRovingFocusGroupScope","TabsProvider","useTabsContext","Tabs","__scopeTabs","valueProp","onValueChange","defaultValue","activationMode","tabsProps","value","setValue","TAB_LIST_NAME","TabsList","listProps","rovingFocusGroupScope","RovingFocusGroup.Root","TRIGGER_NAME","TabsTrigger","disabled","triggerProps","triggerId","makeTriggerId","contentId","makeContentId","isSelected","RovingFocusGroup.Item","isAutomaticActivation","CONTENT_NAME","TabsContent","forceMount","children","contentProps","isMountAnimationPreventedRef","rAF","Presence","present","baseId","Root2","List","Trigger","Content","DiscordChat","data","useLoaderData","jsxs","DiscordCTA","DiscordPosts","ctaLink","useDiscordCTALink","altDown","useAltDown","React.Suspense","Loading","Await","posts","post","DiscordPost","Link","e","Icon","thread","reactionsWithCounts","r","t","Emoji","i","name","url","Playground","playgroundAppInfo","inBrowserBrowserRef","problemAppName","allApps","isUpToDate","PlaygroundWindow","SimpleTooltip","showToast","Preview","SetAppToPlayground","tabs","isValidPreview","s","Boolean","includes","withParam","searchParams","newSearchParams","URLSearchParams","delete","set","ExercisePartRoute","useSearchParams","preview","get","useRef","navigate","useNavigate","shouldHideTab","tab","ENV","EPICSHOP_DEPLOYED","playground","test","type","dev","stackBlitzUrl","activeTab","find","altDiffUrl","app1","problem","app2","solution","handleDiffTabClick","altKey","ctrlKey","shiftKey","metaKey","preventDefault","className","map","hidden","asChild","clsx","preventScrollReset","prefetch","onClick","to","appInfo","Tests","Diff","diff","ErrorBoundary","GeneralErrorBoundary","statusHandlers"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"index-RXedS5cU.js","sources":["../../../../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../../../../node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/discord.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/playground.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index.tsx"],"sourcesContent":["\"use client\";\n\n// packages/react/roving-focus/src/RovingFocusGroup.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar ENTRY_FOCUS = \"rovingFocusGroup.onEntryFocus\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar GROUP_NAME = \"RovingFocusGroup\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(GROUP_NAME);\nvar [createRovingFocusGroupContext, createRovingFocusGroupScope] = createContextScope(\n GROUP_NAME,\n [createCollectionScope]\n);\nvar [RovingFocusProvider, useRovingFocusContext] = createRovingFocusGroupContext(GROUP_NAME);\nvar RovingFocusGroup = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(RovingFocusGroupImpl, { ...props, ref: forwardedRef }) }) });\n }\n);\nRovingFocusGroup.displayName = GROUP_NAME;\nvar RovingFocusGroupImpl = React.forwardRef((props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n orientation,\n loop = false,\n dir,\n currentTabStopId: currentTabStopIdProp,\n defaultCurrentTabStopId,\n onCurrentTabStopIdChange,\n onEntryFocus,\n preventScrollOnEntryFocus = false,\n ...groupProps\n } = props;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const direction = useDirection(dir);\n const [currentTabStopId = null, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId,\n onChange: onCurrentTabStopIdChange\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const handleEntryFocus = useCallbackRef(onEntryFocus);\n const getItems = useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = React.useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n node.addEventListener(ENTRY_FOCUS, handleEntryFocus);\n return () => node.removeEventListener(ENTRY_FOCUS, handleEntryFocus);\n }\n }, [handleEntryFocus]);\n return /* @__PURE__ */ jsx(\n RovingFocusProvider,\n {\n scope: __scopeRovingFocusGroup,\n orientation,\n dir: direction,\n loop,\n currentTabStopId,\n onItemFocus: React.useCallback(\n (tabStopId) => setCurrentTabStopId(tabStopId),\n [setCurrentTabStopId]\n ),\n onItemShiftTab: React.useCallback(() => setIsTabbingBackOut(true), []),\n onFocusableItemAdd: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount + 1),\n []\n ),\n onFocusableItemRemove: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount - 1),\n []\n ),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation,\n ...groupProps,\n ref: composedRefs,\n style: { outline: \"none\", ...props.style },\n onMouseDown: composeEventHandlers(props.onMouseDown, () => {\n isClickFocusRef.current = true;\n }),\n onFocus: composeEventHandlers(props.onFocus, (event) => {\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item) => item.focusable);\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === currentTabStopId);\n const candidateItems = [activeItem, currentItem, ...items].filter(\n Boolean\n );\n const candidateNodes = candidateItems.map((item) => item.ref.current);\n focusFirst(candidateNodes, preventScrollOnEntryFocus);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false))\n }\n )\n }\n );\n});\nvar ITEM_NAME = \"RovingFocusGroupItem\";\nvar RovingFocusGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n focusable = true,\n active = false,\n tabStopId,\n ...itemProps\n } = props;\n const autoId = useId();\n const id = tabStopId || autoId;\n const context = useRovingFocusContext(ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd, onFocusableItemRemove } = context;\n React.useEffect(() => {\n if (focusable) {\n onFocusableItemAdd();\n return () => onFocusableItemRemove();\n }\n }, [focusable, onFocusableItemAdd, onFocusableItemRemove]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeRovingFocusGroup,\n id,\n focusable,\n active,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation,\n ...itemProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!focusable) event.preventDefault();\n else context.onItemFocus(id);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => context.onItemFocus(id)),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Tab\" && event.shiftKey) {\n context.onItemShiftTab();\n return;\n }\n if (event.target !== event.currentTarget) return;\n const focusIntent = getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== void 0) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n event.preventDefault();\n const items = getItems().filter((item) => item.focusable);\n let candidateNodes = items.map((item) => item.ref.current);\n if (focusIntent === \"last\") candidateNodes.reverse();\n else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = context.loop ? wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n }\n })\n }\n )\n }\n );\n }\n);\nRovingFocusGroupItem.displayName = ITEM_NAME;\nvar MAP_KEY_TO_FOCUS_INTENT = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\"\n};\nfunction getDirectionAwareKey(key, dir) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\" ? \"ArrowRight\" : key === \"ArrowRight\" ? \"ArrowLeft\" : key;\n}\nfunction getFocusIntent(event, orientation, dir) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key)) return void 0;\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key)) return void 0;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction focusFirst(candidates, preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root = RovingFocusGroup;\nvar Item = RovingFocusGroupItem;\nexport {\n Item,\n Root,\n RovingFocusGroup,\n RovingFocusGroupItem,\n createRovingFocusGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// packages/react/tabs/src/Tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if ([\" \", \"Enter\"].includes(event.key)) context.onValueChange(value);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","import { type SerializeFrom } from '@remix-run/node'\nimport { Await, Link, useLoaderData } from '@remix-run/react'\nimport * as React from 'react'\nimport { Icon } from '#app/components/icons.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { DiscordCTA, useDiscordCTALink } from '../../../discord.tsx'\nimport { type loader } from '../index.tsx'\n\nexport function DiscordChat() {\n\tconst data = useLoaderData<typeof loader>()\n\treturn (\n\t\t<div className=\"flex h-full w-full flex-col gap-4 pt-4\">\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<DiscordCTA discordAuthUrl={data.discordAuthUrl} />\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<DiscordPosts />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPosts() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst ctaLink = useDiscordCTALink({ discordAuthUrl: data.discordAuthUrl })\n\tconst altDown = useAltDown()\n\treturn (\n\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t<React.Suspense\n\t\t\t\tfallback={\n\t\t\t\t\t<div className=\"flex h-full w-full flex-col items-center justify-center\">\n\t\t\t\t\t\t<Loading>Loading Discord Posts</Loading>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Await\n\t\t\t\t\tresolve={data.discordPostsPromise}\n\t\t\t\t\terrorElement={\n\t\t\t\t\t\t<div className=\"text-red-500\">\n\t\t\t\t\t\t\tThere was a problem loading the discord posts\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{(posts) => (\n\t\t\t\t\t\t<ul className=\"flex w-full flex-col gap-4 p-3 xl:p-12\">\n\t\t\t\t\t\t\t{posts.map((post) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={post.id}\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-xl border bg-background transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<DiscordPost thread={post} />\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</Await>\n\t\t\t</React.Suspense>\n\t\t\t<div>\n\t\t\t\t<Link\n\t\t\t\t\tto={\n\t\t\t\t\t\taltDown && !ctaLink.includes('oauth')\n\t\t\t\t\t\t\t? ctaLink.replace(/^https/, 'discord')\n\t\t\t\t\t\t\t: ctaLink\n\t\t\t\t\t}\n\t\t\t\t\ttarget={ctaLink.includes('oauth') ? undefined : '_blank'}\n\t\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t\t\tonClick={\n\t\t\t\t\t\taltDown\n\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\twindow.open(\n\t\t\t\t\t\t\t\t\t\te.currentTarget.href,\n\t\t\t\t\t\t\t\t\t\t'_blank',\n\t\t\t\t\t\t\t\t\t\t'noreferrer noopener',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclassName=\"flex items-center gap-2 p-2 text-xl hover:underline\"\n\t\t\t\t>\n\t\t\t\t\tCreate Post <Icon name=\"ExternalLink\" />\n\t\t\t\t</Link>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPost({\n\tthread,\n}: {\n\tthread: Awaited<SerializeFrom<typeof loader>['discordPostsPromise']>[number]\n}) {\n\tconst reactionsWithCounts = thread.reactions.filter((r) => r.count)\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t{thread.tags.length ? (\n\t\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t{thread.tags.map((t) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={t.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center gap-1 rounded-full bg-accent px-2 py-1 text-sm\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t{/* not sure how to fix this one... */}\n\t\t\t\t\t\t\t\t\t\t\t{/* @ts-expect-error */}\n\t\t\t\t\t\t\t\t\t\t\t<Emoji name={t.emojiName} url={t.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>{t.name}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<strong className=\"text-xl font-bold\">{thread.name}</strong>\n\t\t\t\t\t\t<div className=\"flex items-start gap-1\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t{thread.authorAvatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={thread.authorAvatarUrl}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-bold\"\n\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\tthread.authorHexAccentColor\n\t\t\t\t\t\t\t\t\t\t\t\t? { color: thread.authorHexAccentColor }\n\t\t\t\t\t\t\t\t\t\t\t\t: {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{thread.authorDisplayName}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t:{' '}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span className=\"flex-1 overflow-ellipsis text-muted-foreground\">\n\t\t\t\t\t\t\t\t{thread.messagePreview}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{thread.previewImageUrl ? (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={thread.previewImageUrl}\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tclassName=\"h-28 w-28 rounded-lg object-cover\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{reactionsWithCounts.length ? (\n\t\t\t\t\t\t\t\t<ul className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{reactionsWithCounts.map((r, i) => (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t{/* not sure how to fix this one... */}\n\t\t\t\t\t\t\t\t\t\t\t\t{/* @ts-expect-error */}\n\t\t\t\t\t\t\t\t\t\t\t\t<Emoji name={r.emojiName} url={r.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{r.count}</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1\">\n\t\t\t\t\t\t\t\t<Icon name=\"Chat\" /> {thread.messageCount}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{` · ${thread.lastUpdatedDisplay}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"flex items-center gap-4\">\n\t\t\t\t\t\t<a href={thread.link.replace(/^https/, 'discord')}>\n\t\t\t\t\t\t\t<Icon name=\"Discord\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href={thread.link} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Emoji({ name, url }: { name?: string; url?: string }) {\n\treturn url ? (\n\t\t<img src={url} alt={name} className=\"h-full w-full\" />\n\t) : name ? (\n\t\tname\n\t) : null\n}\n","import { toast as showToast } from 'sonner'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser'\nimport { SimpleTooltip } from '#app/components/ui/tooltip'\nimport { SetAppToPlayground } from '#app/routes/set-playground'\nimport { PlaygroundWindow } from './playground-window'\nimport { Preview } from './preview'\n\nexport function Playground({\n\tappInfo: playgroundAppInfo,\n\tinBrowserBrowserRef,\n\tproblemAppName,\n\tallApps,\n\tisUpToDate,\n}: {\n\tappInfo: Parameters<typeof Preview>['0']['appInfo'] | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n\tproblemAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n\tisUpToDate: boolean\n}) {\n\treturn (\n\t\t<PlaygroundWindow\n\t\t\tplaygroundAppName={playgroundAppInfo?.appName}\n\t\t\tproblemAppName={problemAppName}\n\t\t\tallApps={allApps}\n\t\t\tisUpToDate={isUpToDate}\n\t\t>\n\t\t\t{playgroundAppInfo?.dev.type === 'none' ? (\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"text-foreground-secondary flex h-full items-center justify-center text-2xl\">\n\t\t\t\t\t\tNon-UI playground\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"text-foreground-secondary flex flex-wrap gap-1 text-center\">\n\t\t\t\t\t\t\tNavigate to{' '}\n\t\t\t\t\t\t\t<SimpleTooltip content={playgroundAppInfo.fullPath}>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tplaygroundAppInfo.fullPath,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tshowToast.success('Copied playground path to clipboard')\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tthe playground directory\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</SimpleTooltip>{' '}\n\t\t\t\t\t\t\tin your editor and terminal to work on this exercise!\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : playgroundAppInfo ? (\n\t\t\t\t<Preview\n\t\t\t\t\tid={playgroundAppInfo.appName}\n\t\t\t\t\tappInfo={playgroundAppInfo}\n\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col justify-center gap-2\">\n\t\t\t\t\t<p>Please set the playground first</p>\n\t\t\t\t\t{problemAppName ? (\n\t\t\t\t\t\t<SetAppToPlayground appName={problemAppName} />\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PlaygroundWindow>\n\t)\n}\n","import {\n\tgetAppByName,\n\tgetAppDisplayName,\n\tgetApps,\n\tgetExerciseApp,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { compileMarkdownString } from '@epic-web/workshop-utils/compile-mdx.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport * as Tabs from '@radix-ui/react-tabs'\nimport {\n\tdefer,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport {\n\tLink,\n\tuseLoaderData,\n\tuseNavigate,\n\tuseSearchParams,\n} from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { useRef } from 'react'\nimport { Diff } from '#app/components/diff.tsx'\nimport { GeneralErrorBoundary } from '#app/components/error-boundary.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { getDiscordAuthURL } from '#app/routes/discord.callback.ts'\nimport { getDiffCode } from '#app/utils/diff.server.ts'\nimport { userHasAccessToWorkshop } from '#app/utils/epic-api.js'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { fetchDiscordPosts } from './__shared/discord.server.ts'\nimport { DiscordChat } from './__shared/discord.tsx'\nimport { Playground } from './__shared/playground.tsx'\nimport { Preview } from './__shared/preview.tsx'\nimport { Tests } from './__shared/tests.tsx'\nimport { getAppRunningState } from './__shared/utils.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseStepTypeLoader')\n\tconst userHasAccess = await userHasAccessToWorkshop({\n\t\trequest,\n\t\ttimings,\n\t})\n\tconst searchParams = new URL(request.url).searchParams\n\tconst cacheOptions = { request, timings }\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\tconst reqUrl = new URL(request.url)\n\n\tconst pathnameParam = reqUrl.searchParams.get('pathname')\n\tif (pathnameParam === '' || pathnameParam === '/') {\n\t\treqUrl.searchParams.delete('pathname')\n\t\tthrow redirect(reqUrl.toString())\n\t}\n\n\tconst problemApp = await getExerciseApp(\n\t\t{ ...params, type: 'problem' },\n\t\tcacheOptions,\n\t)\n\tconst solutionApp = await getExerciseApp(\n\t\t{ ...params, type: 'solution' },\n\t\tcacheOptions,\n\t)\n\n\tif (!problemApp && !solutionApp) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst allAppsFull = await getApps(cacheOptions)\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\n\n\tconst app1Name = reqUrl.searchParams.get('app1')\n\tconst app2Name = reqUrl.searchParams.get('app2')\n\tconst app1 = app1Name\n\t\t? await getAppByName(app1Name)\n\t\t: playgroundApp || problemApp\n\tconst app2 = app2Name ? await getAppByName(app2Name) : solutionApp\n\n\tfunction getStepId(a: ExerciseStepApp) {\n\t\treturn (\n\t\t\ta.exerciseNumber * 1000 +\n\t\t\ta.stepNumber * 10 +\n\t\t\t(a.type === 'problem' ? 0 : 1)\n\t\t)\n\t}\n\n\tfunction getStepNameAndId(a: App) {\n\t\tif (isExerciseStepApp(a)) {\n\t\t\tconst exerciseNumberStr = String(a.exerciseNumber).padStart(2, '0')\n\t\t\tconst stepNumberStr = String(a.stepNumber).padStart(2, '0')\n\n\t\t\treturn {\n\t\t\t\tstepName: `${exerciseNumberStr}/${stepNumberStr}.${a.type}`,\n\t\t\t\tstepId: getStepId(a),\n\t\t\t}\n\t\t}\n\t\treturn { stepName: '', stepId: -1 }\n\t}\n\n\tconst allApps = allAppsFull\n\t\t.filter((a, i, ar) => ar.findIndex((b) => a.name === b.name) === i)\n\t\t.map((a) => ({\n\t\t\tdisplayName: getAppDisplayName(a, allAppsFull),\n\t\t\tname: a.name,\n\t\t\ttitle: a.title,\n\t\t\ttype: a.type,\n\t\t\t...getStepNameAndId(a),\n\t\t}))\n\n\tallApps.sort((a, b) => {\n\t\t// order them by their stepId\n\t\tif (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId\n\n\t\t// non-step apps should come after step apps\n\t\tif (a.stepId > 0) return -1\n\t\tif (b.stepId > 0) return 1\n\n\t\treturn 0\n\t})\n\n\tasync function getDiffProp() {\n\t\tif (!app1 || !app2) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: null,\n\t\t\t}\n\t\t}\n\t\tif (!userHasAccess) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: await compileMarkdownString(\n\t\t\t\t\t`<h1>Access Denied</h1><p>You must login or register for the workshop to view the diff</p>`,\n\t\t\t\t),\n\t\t\t}\n\t\t}\n\t\tconst diffCode = await getDiffCode(app1, app2, {\n\t\t\t...cacheOptions,\n\t\t\tforceFresh: searchParams.get('forceFresh') === 'diff',\n\t\t}).catch((e) => {\n\t\t\tconsole.error(e)\n\t\t\treturn null\n\t\t})\n\t\treturn {\n\t\t\tapp1: app1.name,\n\t\t\tapp2: app2.name,\n\t\t\tdiffCode,\n\t\t}\n\t}\n\n\treturn defer(\n\t\t{\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\tallApps,\n\t\t\tdiscordAuthUrl: getDiscordAuthURL(),\n\t\t\t// defer this promise so that we don't block the response from being sent\n\t\t\tdiscordPostsPromise: fetchDiscordPosts({ request }),\n\t\t\tplayground: playgroundApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'playground',\n\t\t\t\t\t\tfullPath: playgroundApp.fullPath,\n\t\t\t\t\t\tdev: playgroundApp.dev,\n\t\t\t\t\t\ttest: playgroundApp.test,\n\t\t\t\t\t\ttitle: playgroundApp.title,\n\t\t\t\t\t\tname: playgroundApp.name,\n\t\t\t\t\t\tappName: playgroundApp.appName,\n\t\t\t\t\t\tisUpToDate: playgroundApp.isUpToDate,\n\t\t\t\t\t\tstackBlitzUrl: playgroundApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(playgroundApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tproblem: problemApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'problem',\n\t\t\t\t\t\tfullPath: problemApp.fullPath,\n\t\t\t\t\t\tdev: problemApp.dev,\n\t\t\t\t\t\ttest: problemApp.test,\n\t\t\t\t\t\ttitle: problemApp.title,\n\t\t\t\t\t\tname: problemApp.name,\n\t\t\t\t\t\tstackBlitzUrl: problemApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(problemApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tsolution: solutionApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'solution',\n\t\t\t\t\t\tfullPath: solutionApp.fullPath,\n\t\t\t\t\t\tdev: solutionApp.dev,\n\t\t\t\t\t\ttest: solutionApp.test,\n\t\t\t\t\t\ttitle: solutionApp.title,\n\t\t\t\t\t\tname: solutionApp.name,\n\t\t\t\t\t\tstackBlitzUrl: solutionApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(solutionApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tdiff: getDiffProp(),\n\t\t} as const,\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst tabs = [\n\t'playground',\n\t'problem',\n\t'solution',\n\t'tests',\n\t'diff',\n\t'chat',\n] as const\nconst isValidPreview = (s: string | null): s is (typeof tabs)[number] =>\n\tBoolean(s && tabs.includes(s as (typeof tabs)[number]))\n\nfunction withParam(\n\tsearchParams: URLSearchParams,\n\tkey: string,\n\tvalue: string | null,\n) {\n\tconst newSearchParams = new URLSearchParams(searchParams)\n\tif (value === null) {\n\t\tnewSearchParams.delete(key)\n\t} else {\n\t\tnewSearchParams.set(key, value)\n\t}\n\treturn newSearchParams\n}\n\nexport default function ExercisePartRoute() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst [searchParams] = useSearchParams()\n\n\tconst preview = searchParams.get('preview')\n\tconst inBrowserBrowserRef = useRef<InBrowserBrowserRef>(null)\n\n\tconst altDown = useAltDown()\n\tconst navigate = useNavigate()\n\n\tfunction shouldHideTab(tab: (typeof tabs)[number]) {\n\t\tif (tab === 'tests') {\n\t\t\treturn (\n\t\t\t\tENV.EPICSHOP_DEPLOYED ||\n\t\t\t\t!data.playground ||\n\t\t\t\tdata.playground.test.type === 'none'\n\t\t\t)\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution') {\n\t\t\tif (data[tab]?.dev.type === 'none') return true\n\t\t\tif (ENV.EPICSHOP_DEPLOYED) {\n\t\t\t\treturn data[tab]?.dev.type !== 'browser' && !data[tab]?.stackBlitzUrl\n\t\t\t}\n\t\t}\n\t\tif (tab === 'playground' && ENV.EPICSHOP_DEPLOYED) return true\n\t\treturn false\n\t}\n\n\tconst activeTab = isValidPreview(preview)\n\t\t? preview\n\t\t: tabs.find((t) => !shouldHideTab(t))\n\n\t// when alt is held down, the diff tab should open to the full-page diff view\n\t// between the problem and solution (this is more for the instructor than the student)\n\tconst altDiffUrl = `/diff?${new URLSearchParams({\n\t\tapp1: data.problem?.name ?? '',\n\t\tapp2: data.solution?.name ?? '',\n\t})}`\n\n\tfunction handleDiffTabClick(event: React.MouseEvent<HTMLAnchorElement>) {\n\t\tif (event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {\n\t\t\tevent.preventDefault()\n\t\t\tnavigate(altDiffUrl)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Tabs.Root\n\t\t\tclassName=\"relative flex flex-col overflow-y-auto sm:col-span-1 sm:row-span-1\"\n\t\t\tvalue={activeTab}\n\t\t\t// intentionally no onValueChange here because the Link will trigger the\n\t\t\t// change.\n\t\t>\n\t\t\t<Tabs.List className=\"h-14 min-h-14 overflow-x-hidden border-b scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\tconst hidden = shouldHideTab(tab)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Tabs.Trigger key={tab} value={tab} hidden={hidden} asChild>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tid={`${tab}-tab`}\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'clip-path-button relative h-full px-6 py-4 font-mono text-sm uppercase outline-none radix-state-active:z-10 radix-state-active:bg-foreground radix-state-active:text-background radix-state-active:hover:bg-foreground/80 radix-state-active:hover:text-background/80 radix-state-inactive:hover:bg-foreground/20 radix-state-inactive:hover:text-foreground/80 focus:bg-foreground/80 focus:text-background/80',\n\t\t\t\t\t\t\t\t\thidden ? 'hidden' : 'inline-block',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tpreventScrollReset\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tonClick={handleDiffTabClick}\n\t\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\t\ttab === 'diff' && altDown\n\t\t\t\t\t\t\t\t\t\t? altDiffUrl\n\t\t\t\t\t\t\t\t\t\t: `?${withParam(\n\t\t\t\t\t\t\t\t\t\t\t\tsearchParams,\n\t\t\t\t\t\t\t\t\t\t\t\t'preview',\n\t\t\t\t\t\t\t\t\t\t\t\ttab === 'playground' ? null : tab,\n\t\t\t\t\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{tab}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</Tabs.List>\n\t\t\t<div className=\"relative z-10 flex min-h-96 flex-grow flex-col overflow-y-auto\">\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"playground\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Playground\n\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"problem\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={data.problem}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"solution\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={data.solution}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"tests\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-start justify-center self-start overflow-hidden radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Tests\n\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"diff\"\n\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Diff diff={data.diff} allApps={data.allApps} />\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"chat\"\n\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<DiscordChat />\n\t\t\t\t</Tabs.Content>\n\t\t\t</div>\n\t\t</Tabs.Root>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<GeneralErrorBoundary\n\t\t\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["ENTRY_FOCUS","EVENT_OPTIONS","GROUP_NAME","Collection","useCollection","createCollectionScope","createCollection","createRovingFocusGroupContext","createRovingFocusGroupScope","createContextScope","RovingFocusProvider","useRovingFocusContext","RovingFocusGroup","React.forwardRef","props","forwardedRef","jsx","RovingFocusGroupImpl","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","preventScrollOnEntryFocus","groupProps","ref","React.useRef","composedRefs","useComposedRefs","direction","useDirection","currentTabStopId","setCurrentTabStopId","useControllableState","isTabbingBackOut","setIsTabbingBackOut","React.useState","handleEntryFocus","useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","React.useEffect","node","React.useCallback","tabStopId","prevCount","Primitive","composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","focusFirst","ITEM_NAME","RovingFocusGroupItem","focusable","active","itemProps","autoId","useId","id","context","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","getFocusIntent","currentIndex","wrapArray","MAP_KEY_TO_FOCUS_INTENT","getDirectionAwareKey","key","candidates","preventScroll","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","index","Root","Item","TABS_NAME","createTabsContext","createTabsScope","useRovingFocusGroupScope","TabsProvider","useTabsContext","Tabs","__scopeTabs","valueProp","onValueChange","defaultValue","activationMode","tabsProps","value","setValue","TAB_LIST_NAME","TabsList","listProps","rovingFocusGroupScope","RovingFocusGroup.Root","TRIGGER_NAME","TabsTrigger","disabled","triggerProps","triggerId","makeTriggerId","contentId","makeContentId","isSelected","RovingFocusGroup.Item","isAutomaticActivation","CONTENT_NAME","TabsContent","forceMount","children","contentProps","isMountAnimationPreventedRef","rAF","Presence","present","baseId","Root2","List","Trigger","Content","DiscordChat","data","useLoaderData","jsxs","DiscordCTA","DiscordPosts","ctaLink","useDiscordCTALink","altDown","useAltDown","React.Suspense","Loading","Await","posts","post","DiscordPost","Link","e","Icon","thread","reactionsWithCounts","r","t","Emoji","i","name","url","Playground","playgroundAppInfo","inBrowserBrowserRef","problemAppName","allApps","isUpToDate","PlaygroundWindow","SimpleTooltip","showToast","Preview","SetAppToPlayground","tabs","isValidPreview","s","Boolean","includes","withParam","searchParams","newSearchParams","URLSearchParams","delete","set","ExercisePartRoute","useSearchParams","preview","get","useRef","navigate","useNavigate","shouldHideTab","tab","ENV","EPICSHOP_DEPLOYED","playground","test","type","dev","stackBlitzUrl","activeTab","find","altDiffUrl","app1","problem","app2","solution","handleDiffTabClick","altKey","ctrlKey","shiftKey","metaKey","preventDefault","className","map","hidden","asChild","clsx","preventScrollReset","prefetch","onClick","to","appInfo","Tests","Diff","diff","ErrorBoundary","GeneralErrorBoundary","statusHandlers"],"mappings":"4iCAcA,IAAIA,EAAc,gCACdC,GAAgB,CAAE,QAAS,GAAO,WAAY,EAAI,EAClDC,EAAa,mBACb,CAACC,EAAYC,EAAeC,EAAqB,EAAIC,GAAiBJ,CAAU,EAChF,CAACK,GAA+BC,CAA2B,EAAIC,EACjEP,EACA,CAACG,EAAqB,CACxB,EACI,CAACK,GAAqBC,EAAqB,EAAIJ,GAA8BL,CAAU,EACvFU,EAAmBC,EAAgB,WACrC,CAACC,EAAOC,IACiBC,MAAIb,EAAW,SAAU,CAAE,MAAOW,EAAM,wBAAyB,SAA0BE,EAAAA,IAAIb,EAAW,KAAM,CAAE,MAAOW,EAAM,wBAAyB,SAA0BE,EAAG,IAACC,GAAsB,CAAE,GAAGH,EAAO,IAAKC,CAAY,CAAE,CAAG,CAAA,CAAG,CAAA,CAE5Q,EACAH,EAAiB,YAAcV,EAC/B,IAAIe,GAAuBJ,EAAgB,WAAC,CAACC,EAAOC,IAAiB,CACnE,KAAM,CACJ,wBAAAG,EACA,YAAAC,EACA,KAAAC,EAAO,GACP,IAAAC,EACA,iBAAkBC,EAClB,wBAAAC,EACA,yBAAAC,EACA,aAAAC,EACA,0BAAAC,EAA4B,GAC5B,GAAGC,CACJ,EAAGb,EACEc,EAAMC,SAAa,IAAI,EACvBC,EAAeC,GAAgBhB,EAAca,CAAG,EAChDI,EAAYC,EAAaZ,CAAG,EAC5B,CAACa,EAAmB,KAAMC,CAAmB,EAAIC,EAAqB,CAC1E,KAAMd,EACN,YAAaC,EACb,SAAUC,CACd,CAAG,EACK,CAACa,EAAkBC,CAAmB,EAAIC,EAAc,SAAC,EAAK,EAC9DC,EAAmBC,GAAehB,CAAY,EAC9CiB,GAAWtC,EAAcc,CAAuB,EAChDyB,EAAkBd,SAAa,EAAK,EACpC,CAACe,GAAqBC,CAAsB,EAAIN,EAAc,SAAC,CAAC,EACtEO,OAAAA,EAAAA,UAAgB,IAAM,CACpB,MAAMC,EAAOnB,EAAI,QACjB,GAAImB,EACF,OAAAA,EAAK,iBAAiB/C,EAAawC,CAAgB,EAC5C,IAAMO,EAAK,oBAAoB/C,EAAawC,CAAgB,CAEzE,EAAK,CAACA,CAAgB,CAAC,EACExB,EAAG,IACxBN,GACA,CACE,MAAOQ,EACP,YAAAC,EACA,IAAKa,EACL,KAAAZ,EACA,iBAAAc,EACA,YAAac,EAAiB,YAC3BC,GAAcd,EAAoBc,CAAS,EAC5C,CAACd,CAAmB,CACrB,EACD,eAAgBa,EAAAA,YAAkB,IAAMV,EAAoB,EAAI,EAAG,CAAA,CAAE,EACrE,mBAAoBU,EAAiB,YACnC,IAAMH,EAAwBK,GAAcA,EAAY,CAAC,EACzD,CAAE,CACH,EACD,sBAAuBF,EAAiB,YACtC,IAAMH,EAAwBK,GAAcA,EAAY,CAAC,EACzD,CAAE,CACH,EACD,SAA0BlC,EAAG,IAC3BmC,EAAU,IACV,CACE,SAAUd,GAAoBO,KAAwB,EAAI,GAAK,EAC/D,mBAAoBzB,EACpB,GAAGQ,EACH,IAAKG,EACL,MAAO,CAAE,QAAS,OAAQ,GAAGhB,EAAM,KAAO,EAC1C,YAAasC,EAAqBtC,EAAM,YAAa,IAAM,CACzD6B,EAAgB,QAAU,EACtC,CAAW,EACD,QAASS,EAAqBtC,EAAM,QAAUuC,GAAU,CACtD,MAAMC,GAAkB,CAACX,EAAgB,QACzC,GAAIU,EAAM,SAAWA,EAAM,eAAiBC,IAAmB,CAACjB,EAAkB,CAChF,MAAMkB,EAAkB,IAAI,YAAYvD,EAAaC,EAAa,EAElE,GADAoD,EAAM,cAAc,cAAcE,CAAe,EAC7C,CAACA,EAAgB,iBAAkB,CACrC,MAAMC,EAAQd,KAAW,OAAQe,GAASA,EAAK,SAAS,EAClDC,GAAaF,EAAM,KAAMC,GAASA,EAAK,MAAM,EAC7CE,GAAcH,EAAM,KAAMC,GAASA,EAAK,KAAOvB,CAAgB,EAI/D0B,GAHiB,CAACF,GAAYC,GAAa,GAAGH,CAAK,EAAE,OACzD,OAClB,EACsD,IAAKC,GAASA,EAAK,IAAI,OAAO,EACpEI,EAAWD,GAAgBlC,CAAyB,CACrD,CACF,CACDiB,EAAgB,QAAU,EACtC,CAAW,EACD,OAAQS,EAAqBtC,EAAM,OAAQ,IAAMwB,EAAoB,EAAK,CAAC,CAC5E,CACF,CACF,CACL,CACA,CAAC,EACGwB,EAAY,uBACZC,EAAuBlD,EAAgB,WACzC,CAACC,EAAOC,IAAiB,CACvB,KAAM,CACJ,wBAAAG,EACA,UAAA8C,EAAY,GACZ,OAAAC,EAAS,GACT,UAAAhB,EACA,GAAGiB,CACJ,EAAGpD,EACEqD,EAASC,IACTC,EAAKpB,GAAakB,EAClBG,EAAU3D,GAAsBmD,EAAW5C,CAAuB,EAClEqD,EAAmBD,EAAQ,mBAAqBD,EAChD3B,EAAWtC,EAAcc,CAAuB,EAChD,CAAE,mBAAAsD,EAAoB,sBAAAC,CAAuB,EAAGH,EACtDxB,OAAAA,EAAAA,UAAgB,IAAM,CACpB,GAAIkB,EACF,OAAAQ,IACO,IAAMC,EAAqB,CAErC,EAAE,CAACT,EAAWQ,EAAoBC,CAAqB,CAAC,EAClCzD,EAAG,IACxBb,EAAW,SACX,CACE,MAAOe,EACP,GAAAmD,EACA,UAAAL,EACA,OAAAC,EACA,SAA0BjD,EAAG,IAC3BmC,EAAU,KACV,CACE,SAAUoB,EAAmB,EAAI,GACjC,mBAAoBD,EAAQ,YAC5B,GAAGJ,EACH,IAAKnD,EACL,YAAaqC,EAAqBtC,EAAM,YAAcuC,GAAU,CACzDW,EACAM,EAAQ,YAAYD,CAAE,EADXhB,EAAM,gBAEpC,CAAa,EACD,QAASD,EAAqBtC,EAAM,QAAS,IAAMwD,EAAQ,YAAYD,CAAE,CAAC,EAC1E,UAAWjB,EAAqBtC,EAAM,UAAYuC,GAAU,CAC1D,GAAIA,EAAM,MAAQ,OAASA,EAAM,SAAU,CACzCiB,EAAQ,eAAc,EACtB,MACD,CACD,GAAIjB,EAAM,SAAWA,EAAM,cAAe,OAC1C,MAAMqB,EAAcC,GAAetB,EAAOiB,EAAQ,YAAaA,EAAQ,GAAG,EAC1E,GAAII,IAAgB,OAAQ,CAC1B,GAAIrB,EAAM,SAAWA,EAAM,SAAWA,EAAM,QAAUA,EAAM,SAAU,OACtEA,EAAM,eAAc,EAEpB,IAAIO,EADUlB,IAAW,OAAQe,GAASA,EAAK,SAAS,EAC7B,IAAKA,GAASA,EAAK,IAAI,OAAO,EACzD,GAAIiB,IAAgB,OAAQd,EAAe,QAAO,UACzCc,IAAgB,QAAUA,IAAgB,OAAQ,CACrDA,IAAgB,QAAQd,EAAe,QAAO,EAClD,MAAMgB,EAAehB,EAAe,QAAQP,EAAM,aAAa,EAC/DO,EAAiBU,EAAQ,KAAOO,GAAUjB,EAAgBgB,EAAe,CAAC,EAAIhB,EAAe,MAAMgB,EAAe,CAAC,CACpH,CACD,WAAW,IAAMf,EAAWD,CAAc,CAAC,CAC5C,CACf,CAAa,CACF,CACF,CACF,CACP,CACG,CACH,EACAG,EAAqB,YAAcD,EACnC,IAAIgB,GAA0B,CAC5B,UAAW,OACX,QAAS,OACT,WAAY,OACZ,UAAW,OACX,OAAQ,QACR,KAAM,QACN,SAAU,OACV,IAAK,MACP,EACA,SAASC,GAAqBC,EAAK3D,EAAK,CACtC,OAAIA,IAAQ,MAAc2D,EACnBA,IAAQ,YAAc,aAAeA,IAAQ,aAAe,YAAcA,CACnF,CACA,SAASL,GAAetB,EAAOlC,EAAaE,EAAK,CAC/C,MAAM2D,EAAMD,GAAqB1B,EAAM,IAAKhC,CAAG,EAC/C,GAAI,EAAAF,IAAgB,YAAc,CAAC,YAAa,YAAY,EAAE,SAAS6D,CAAG,IACtE,EAAA7D,IAAgB,cAAgB,CAAC,UAAW,WAAW,EAAE,SAAS6D,CAAG,GACzE,OAAOF,GAAwBE,CAAG,CACpC,CACA,SAASnB,EAAWoB,EAAYC,EAAgB,GAAO,CACrD,MAAMC,EAA6B,SAAS,cAC5C,UAAWC,KAAaH,EAGtB,GAFIG,IAAcD,IAClBC,EAAU,MAAM,CAAE,cAAAF,CAAa,CAAE,EAC7B,SAAS,gBAAkBC,GAA4B,MAE/D,CACA,SAASN,GAAUQ,EAAOC,EAAY,CACpC,OAAOD,EAAM,IAAI,CAACE,EAAGC,IAAUH,GAAOC,EAAaE,GAASH,EAAM,MAAM,CAAC,CAC3E,CACA,IAAII,GAAO7E,EACP8E,GAAO3B,EC7MP4B,EAAY,OACZ,CAACC,GAAmBC,EAAe,EAAIpF,EAAmBkF,EAAW,CACvEnF,CACF,CAAC,EACGsF,EAA2BtF,EAA2B,EACtD,CAACuF,GAAcC,CAAc,EAAIJ,GAAkBD,CAAS,EAC5DM,GAAOpF,EAAgB,WACzB,CAACC,EAAOC,IAAiB,CACvB,KAAM,CACJ,YAAAmF,EACA,MAAOC,EACP,cAAAC,EACA,aAAAC,EACA,YAAAlF,EAAc,aACd,IAAAE,EACA,eAAAiF,EAAiB,YACjB,GAAGC,CACJ,EAAGzF,EACEkB,EAAYC,EAAaZ,CAAG,EAC5B,CAACmF,EAAOC,CAAQ,EAAIrE,EAAqB,CAC7C,KAAM+D,EACN,SAAUC,EACV,YAAaC,CACnB,CAAK,EACD,OAAuBrF,EAAG,IACxB+E,GACA,CACE,MAAOG,EACP,OAAQ9B,EAAO,EACf,MAAAoC,EACA,cAAeC,EACf,YAAAtF,EACA,IAAKa,EACL,eAAAsE,EACA,SAA0BtF,EAAG,IAC3BmC,EAAU,IACV,CACE,IAAKnB,EACL,mBAAoBb,EACpB,GAAGoF,EACH,IAAKxF,CACN,CACF,CACF,CACP,CACG,CACH,EACAkF,GAAK,YAAcN,EACnB,IAAIe,GAAgB,WAChBC,GAAW9F,EAAgB,WAC7B,CAACC,EAAOC,IAAiB,CACvB,KAAM,CAAE,YAAAmF,EAAa,KAAA9E,EAAO,GAAM,GAAGwF,CAAW,EAAG9F,EAC7CwD,EAAU0B,EAAeU,GAAeR,CAAW,EACnDW,EAAwBf,EAAyBI,CAAW,EAClE,OAAuBlF,EAAG,IACxB8F,GACA,CACE,QAAS,GACT,GAAGD,EACH,YAAavC,EAAQ,YACrB,IAAKA,EAAQ,IACb,KAAAlD,EACA,SAA0BJ,EAAG,IAC3BmC,EAAU,IACV,CACE,KAAM,UACN,mBAAoBmB,EAAQ,YAC5B,GAAGsC,EACH,IAAK7F,CACN,CACF,CACF,CACP,CACG,CACH,EACA4F,GAAS,YAAcD,GACvB,IAAIK,GAAe,cACfC,GAAcnG,EAAgB,WAChC,CAACC,EAAOC,IAAiB,CACvB,KAAM,CAAE,YAAAmF,EAAa,MAAAM,EAAO,SAAAS,EAAW,GAAO,GAAGC,CAAc,EAAGpG,EAC5DwD,EAAU0B,EAAee,GAAcb,CAAW,EAClDW,EAAwBf,EAAyBI,CAAW,EAC5DiB,EAAYC,GAAc9C,EAAQ,OAAQkC,CAAK,EAC/Ca,EAAYC,GAAchD,EAAQ,OAAQkC,CAAK,EAC/Ce,EAAaf,IAAUlC,EAAQ,MACrC,OAAuBtD,EAAG,IACxBwG,GACA,CACE,QAAS,GACT,GAAGX,EACH,UAAW,CAACI,EACZ,OAAQM,EACR,SAA0BvG,EAAG,IAC3BmC,EAAU,OACV,CACE,KAAM,SACN,KAAM,MACN,gBAAiBoE,EACjB,gBAAiBF,EACjB,aAAcE,EAAa,SAAW,WACtC,gBAAiBN,EAAW,GAAK,OACjC,SAAAA,EACA,GAAIE,EACJ,GAAGD,EACH,IAAKnG,EACL,YAAaqC,EAAqBtC,EAAM,YAAcuC,GAAU,CAC1D,CAAC4D,GAAY5D,EAAM,SAAW,GAAKA,EAAM,UAAY,GACvDiB,EAAQ,cAAckC,CAAK,EAE3BnD,EAAM,eAAc,CAEpC,CAAa,EACD,UAAWD,EAAqBtC,EAAM,UAAYuC,GAAU,CACtD,CAAC,IAAK,OAAO,EAAE,SAASA,EAAM,GAAG,GAAGiB,EAAQ,cAAckC,CAAK,CACjF,CAAa,EACD,QAASpD,EAAqBtC,EAAM,QAAS,IAAM,CACjD,MAAM2G,EAAwBnD,EAAQ,iBAAmB,SACrD,CAACiD,GAAc,CAACN,GAAYQ,GAC9BnD,EAAQ,cAAckC,CAAK,CAE3C,CAAa,CACF,CACF,CACF,CACP,CACG,CACH,EACAQ,GAAY,YAAcD,GAC1B,IAAIW,GAAe,cACfC,GAAc9G,EAAgB,WAChC,CAACC,EAAOC,IAAiB,CACvB,KAAM,CAAE,YAAAmF,EAAa,MAAAM,EAAO,WAAAoB,EAAY,SAAAC,EAAU,GAAGC,CAAc,EAAGhH,EAChEwD,EAAU0B,EAAe0B,GAAcxB,CAAW,EAClDiB,EAAYC,GAAc9C,EAAQ,OAAQkC,CAAK,EAC/Ca,EAAYC,GAAchD,EAAQ,OAAQkC,CAAK,EAC/Ce,EAAaf,IAAUlC,EAAQ,MAC/ByD,EAA+BlG,SAAa0F,CAAU,EAC5DzE,OAAAA,EAAAA,UAAgB,IAAM,CACpB,MAAMkF,EAAM,sBAAsB,IAAMD,EAA6B,QAAU,EAAK,EACpF,MAAO,IAAM,qBAAqBC,CAAG,CACtC,EAAE,CAAE,CAAA,EACkBhH,EAAG,IAACiH,GAAU,CAAE,QAASL,GAAcL,EAAY,SAAU,CAAC,CAAE,QAAAW,CAAO,IAAuBlH,EAAG,IACtHmC,EAAU,IACV,CACE,aAAcoE,EAAa,SAAW,WACtC,mBAAoBjD,EAAQ,YAC5B,KAAM,WACN,kBAAmB6C,EACnB,OAAQ,CAACe,EACT,GAAIb,EACJ,SAAU,EACV,GAAGS,EACH,IAAK/G,EACL,MAAO,CACL,GAAGD,EAAM,MACT,kBAAmBiH,EAA6B,QAAU,KAAO,MAClE,EACD,SAAUG,GAAWL,CACtB,CACF,CAAA,CAAE,CACJ,CACH,EACAF,GAAY,YAAcD,GAC1B,SAASN,GAAce,EAAQ3B,EAAO,CACpC,MAAO,GAAG2B,CAAM,YAAY3B,CAAK,EACnC,CACA,SAASc,GAAca,EAAQ3B,EAAO,CACpC,MAAO,GAAG2B,CAAM,YAAY3B,CAAK,EACnC,CACA,IAAI4B,GAAQnC,GACRoC,GAAO1B,GACP2B,GAAUtB,GACVuB,EAAUZ,GCjLP,SAASa,IAAc,CAC7B,MAAMC,EAAOC,IAEZ,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAU,yCACd,SAAA,CAAC3H,EAAAA,IAAA,MAAA,CAAI,UAAU,cACd,SAAAA,EAAAA,IAAC4H,IAAW,eAAgBH,EAAK,eAAgB,CAClD,CAAA,QACC,MAAI,CAAA,UAAU,mFACd,SAAAzH,MAAC6H,IAAa,CAAA,EACf,CACD,CAAA,CAAA,CAEF,CAEA,SAASA,IAAe,CACvB,MAAMJ,EAAOC,IACPI,EAAUC,GAAkB,CAAE,eAAgBN,EAAK,eAAgB,EACnEO,EAAUC,IAEf,OAAAN,EAAA,KAAC,MAAI,CAAA,UAAU,oDACd,SAAA,CAAA3H,EAAA,IAACkI,EAAM,SAAN,CACA,eACE,MAAI,CAAA,UAAU,0DACd,SAAClI,EAAA,IAAAmI,GAAA,CAAQ,iCAAqB,CAC/B,CAAA,EAGD,SAAAnI,EAAA,IAACoI,GAAA,CACA,QAASX,EAAK,oBACd,aACCzH,EAAA,IAAC,MAAI,CAAA,UAAU,eAAe,SAE9B,gDAAA,EAGA,SAACqI,GACArI,EAAA,IAAA,KAAA,CAAG,UAAU,yCACZ,SAAAqI,EAAM,IAAKC,GACXtI,EAAA,IAAC,KAAA,CAEA,UAAU,sJAEV,SAAAA,EAAAA,IAACuI,GAAY,CAAA,OAAQD,CAAM,CAAA,CAAA,EAHtBA,EAAK,EAKX,CAAA,EACF,CAAA,CAEF,CAAA,CACD,QACC,MACA,CAAA,SAAAX,EAAA,KAACa,EAAA,CACA,GACCR,GAAW,CAACF,EAAQ,SAAS,OAAO,EACjCA,EAAQ,QAAQ,SAAU,SAAS,EACnCA,EAEJ,OAAQA,EAAQ,SAAS,OAAO,EAAI,OAAY,SAChD,IAAI,sBACJ,QACCE,EACIS,GAAM,CACPA,EAAE,eAAe,EACV,OAAA,KACNA,EAAE,cAAc,KAChB,SACA,qBAAA,CAGD,EAAA,OAEJ,UAAU,sDACV,SAAA,CAAA,eACYzI,EAAAA,IAAC0I,EAAK,CAAA,KAAK,cAAe,CAAA,CAAA,CAAA,CAAA,EAExC,CACD,CAAA,CAAA,CAEF,CAEA,SAASH,GAAY,CACpB,OAAAI,CACD,EAEG,CACF,MAAMC,EAAsBD,EAAO,UAAU,OAAQE,GAAMA,EAAE,KAAK,EAElE,OACE7I,EAAA,IAAA,MAAA,CACA,SAAC2H,EAAAA,KAAA,MAAA,CAAI,UAAU,0BACd,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,aACd,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,sBACb,SAAA,CAAOgB,EAAA,KAAK,OACZ3I,EAAAA,IAAC,MAAI,CAAA,UAAU,aACb,SAAO2I,EAAA,KAAK,IAAKG,GACjBnB,EAAA,KAAC,MAAA,CAEA,UAAU,kFAEV,SAAA,CAAC3H,EAAA,IAAA,OAAA,CAAK,UAAU,oBAGf,SAACA,EAAAA,IAAA+I,EAAA,CAAM,KAAMD,EAAE,UAAW,IAAKA,EAAE,QAAU,CAAA,EAC5C,EACA9I,EAAAA,IAAC,OAAM,CAAA,SAAA8I,EAAE,IAAK,CAAA,CAAA,CAAA,EARTA,EAAE,IAAA,CAUR,EACF,EACG,KACH9I,EAAA,IAAA,SAAA,CAAO,UAAU,oBAAqB,WAAO,KAAK,EACnD2H,EAAAA,KAAC,MAAI,CAAA,UAAU,yBACd,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAgB,EAAO,gBACP3I,EAAA,IAAC,MAAA,CACA,IAAK2I,EAAO,gBACZ,IAAI,GACJ,UAAU,sBAAA,CAAA,EAER,YACH,OACA,CAAA,SAAA,CAAA3I,EAAA,IAAC,OAAA,CACA,UAAU,YACV,MACC2I,EAAO,qBACJ,CAAE,MAAOA,EAAO,oBAAA,EAChB,CAAC,EAGJ,SAAOA,EAAA,iBAAA,CACT,EAAO,IACL,GAAA,EACH,CAAA,EACD,EACC3I,EAAA,IAAA,OAAA,CAAK,UAAU,iDACd,WAAO,eACT,CAAA,EACD,CAAA,EACD,EACC2I,EAAO,gBACP3I,EAAA,IAAC,MAAA,CACA,IAAK2I,EAAO,gBACZ,IAAI,GACJ,UAAU,mCAAA,CAAA,EAER,IAAA,EACL,EAEAhB,EAAAA,KAAC,MAAI,CAAA,UAAU,uBACd,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,0BACd,SAAA,CAAC3H,EAAA,IAAA,OAAA,CACC,SAAoB4I,EAAA,OACnB5I,EAAAA,IAAA,KAAA,CAAG,UAAU,0BACZ,SAAoB4I,EAAA,IAAI,CAACC,EAAGG,IAC5BrB,EAAA,KAAC,KAAA,CAEA,UAAU,uGAEV,SAAA,CAAC3H,EAAA,IAAA,OAAA,CAAK,UAAU,oBAGf,SAACA,EAAAA,IAAA+I,EAAA,CAAM,KAAMF,EAAE,UAAW,IAAKA,EAAE,QAAU,CAAA,EAC5C,EACA7I,EAAAA,IAAC,OAAM,CAAA,SAAA6I,EAAE,KAAM,CAAA,CAAA,CAAA,EARVG,CAAA,CAUN,CACF,CAAA,EACG,KACL,EACArB,EAAAA,KAAC,OAAK,CAAA,UAAU,0BACf,SAAA,CAACA,EAAAA,KAAA,OAAA,CAAK,UAAU,iCACf,SAAA,CAAC3H,EAAAA,IAAA0I,EAAA,CAAK,KAAK,MAAO,CAAA,EAAE,IAAEC,EAAO,YAAA,EAC9B,EACC,MAAMA,EAAO,kBAAkB,EAAA,EACjC,CAAA,EACD,EACAhB,EAAAA,KAAC,OAAK,CAAA,UAAU,0BACf,SAAA,CAAA3H,EAAA,IAAC,IAAE,CAAA,KAAM2I,EAAO,KAAK,QAAQ,SAAU,SAAS,EAC/C,SAAC3I,EAAAA,IAAA0I,EAAA,CAAK,KAAK,SAAU,CAAA,EACtB,EACC1I,EAAA,IAAA,IAAA,CAAE,KAAM2I,EAAO,KAAM,OAAO,SAAS,IAAI,sBACzC,SAAA3I,EAAAA,IAAC0I,EAAK,CAAA,KAAK,cAAe,CAAA,EAC3B,CAAA,EACD,CAAA,EACD,CAAA,CACD,CAAA,CACD,CAAA,CAEF,CAEA,SAASK,EAAM,CAAE,KAAAE,EAAM,IAAAC,GAAwC,CACvD,OAAAA,EACLlJ,EAAA,IAAA,MAAA,CAAI,IAAKkJ,EAAK,IAAKD,EAAM,UAAU,eAAgB,CAAA,EACjDA,GAEA,IACL,CCpMO,SAASE,GAAW,CAC1B,QAASC,EACT,oBAAAC,EACA,eAAAC,EACA,QAAAC,EACA,WAAAC,CACD,EAMG,CAED,OAAAxJ,EAAA,IAACyJ,GAAA,CACA,kBAAmBL,GAAA,YAAAA,EAAmB,QACtC,eAAAE,EACA,QAAAC,EACA,WAAAC,EAEC,UAAmBJ,GAAA,YAAAA,EAAA,IAAI,QAAS,cAC/B,MACA,CAAA,SAAA,CAACpJ,EAAA,IAAA,MAAA,CAAI,UAAU,6EAA6E,SAE5F,oBAAA,EACCA,MAAA,MAAA,CACA,SAAC2H,EAAAA,KAAA,MAAA,CAAI,UAAU,6DAA6D,SAAA,CAAA,cAC/D,IACX3H,EAAA,IAAA0J,GAAA,CAAc,QAASN,EAAkB,SACzC,SAAApJ,EAAA,IAAC,OAAA,CACA,UAAU,YACV,QAAS,IAAM,CACT,UAAU,UAAU,UACxBoJ,EAAkB,QAAA,EAEnBO,GAAU,QAAQ,qCAAqC,CACxD,EACA,SAAA,0BAAA,CAAA,EAGF,EAAiB,IAAI,uDAAA,CAAA,CAEtB,CACD,CAAA,CAAA,CACD,CAAA,EACGP,EACHpJ,EAAA,IAAC4J,EAAA,CACA,GAAIR,EAAkB,QACtB,QAASA,EACT,oBAAAC,CAAA,CAGD,EAAA1B,EAAA,KAAC,MAAI,CAAA,UAAU,qCACd,SAAA,CAAA3H,EAAAA,IAAC,KAAE,SAA+B,iCAAA,CAAA,EACjCsJ,EACAtJ,EAAA,IAAC6J,GAAmB,CAAA,QAASP,CAAgB,CAAA,EAC1C,IAAA,EACL,CAAA,CAAA,CAIJ,CC2JA,MAAMQ,EAAO,CACZ,aACA,UACA,WACA,QACA,OACA,MAAA,EAEKC,GAAkBC,GACvBC,GAAQD,GAAKF,EAAKI,SAASF,CAA0B,GAEtD,SAASG,GACRC,EACApG,EACAwB,EACC,CACK,MAAA6E,EAAkB,IAAIC,gBAAgBF,CAAY,EACxD,OAAI5E,IAAU,KACb6E,EAAgBE,OAAOvG,CAAG,EAEVqG,EAAAG,IAAIxG,EAAKwB,CAAK,EAExB6E,CACR,CAEA,SAAwBI,IAAoB,iBAC3C,MAAMhD,EAAOC,IACP,CAAC0C,CAAY,EAAIM,KAEjBC,EAAUP,EAAaQ,IAAI,SAAS,EACpCvB,EAAsBwB,SAA4B,IAAI,EAEtD7C,EAAUC,IACV6C,EAAWC,KAEjB,SAASC,EAAcC,EAA4B,WAClD,GAAIA,IAAQ,QAEV,OAAAC,IAAIC,mBACJ,CAAC1D,EAAK2D,YACN3D,EAAK2D,WAAWC,KAAKC,OAAS,OAG5B,GAAAL,IAAQ,WAAaA,IAAQ,WAAY,CAC5C,KAAIxD,EAAAA,EAAKwD,CAAG,IAARxD,YAAAA,EAAW8D,IAAID,QAAS,OAAe,MAAA,GAC3C,GAAIJ,IAAIC,kBACA,QAAA1D,EAAAA,EAAKwD,CAAG,IAARxD,YAAAA,EAAW8D,IAAID,QAAS,WAAa,GAAC7D,EAAAA,EAAKwD,CAAG,IAARxD,MAAAA,EAAW+D,cAE1D,CACA,MAAIP,GAAAA,IAAQ,cAAgBC,IAAIC,kBAEjC,CAEA,MAAMM,EAAY1B,GAAeY,CAAO,EACrCA,EACAb,EAAK4B,KAAM5C,GAAM,CAACkC,EAAclC,CAAC,CAAC,EAI/B6C,EAAa,SAAS,IAAIrB,gBAAgB,CAC/CsB,OAAMnE,EAAAA,EAAKoE,UAALpE,YAAAA,EAAcwB,OAAQ,GAC5B6C,OAAMrE,EAAAA,EAAKsE,WAALtE,YAAAA,EAAewB,OAAQ,EAC7B,CAAA,CAAC,GAEF,SAAS+C,EAAmB3J,EAA4C,CACnEA,EAAM4J,QAAU,CAAC5J,EAAM6J,SAAW,CAAC7J,EAAM8J,UAAY,CAAC9J,EAAM+J,UAC/D/J,EAAMgK,eAAe,EACrBvB,EAASa,CAAU,EAErB,CAGC,OAAAhE,EAAAA,KAAC1C,GAAA,CACAqH,UAAU,qEACV9G,MAAOiG,EAIP5E,SAAA,CAAC7G,EAAA,IAAAiF,GAAA,CAAUqH,UAAU,oFACnBzF,SAAKiD,EAAAyC,IAAKtB,GAAQ,CACZ,MAAAuB,EAASxB,EAAcC,CAAG,EAE/B,OAAAjL,EAAAA,IAACiF,GAAA,CAAuBO,MAAOyF,EAAKuB,OAAAA,EAAgBC,QAAO,GAC1D5F,SAAA7G,EAAA,IAACwI,EAAA,CACAnF,GAAI,GAAG4H,CAAG,OACVqB,UAAWI,GACV,kZACAF,EAAS,SAAW,cACrB,EACAG,mBAAkB,GAClBC,SAAS,SACTC,QAASb,EACTc,GACC7B,IAAQ,QAAUjD,EACf2D,EACA,IAAIxB,GACJC,EACA,UACAa,IAAQ,aAAe,KAAOA,CAC/B,CAAC,GAGHpE,SAAAoE,EACF,GArBkBA,CAsBnB,EAED,CACF,CAAA,EACAtD,EAAA,KAAC,MAAI,CAAA2E,UAAU,iEACdzF,SAAA,CAAA7G,EAAA,IAACiF,EAAA,CACAO,MAAM,aACN8G,UAAU,2FAEVzF,SAAA7G,EAAA,IAACmJ,GAAA,CACA4D,QAAStF,EAAK2D,WACd9B,gBAAgB7B,EAAAA,EAAKoE,UAALpE,YAAAA,EAAcwB,KAC9BI,oBAAAA,EACAE,QAAS9B,EAAK8B,QACdC,aAAY/B,EAAAA,EAAK2D,aAAL3D,YAAAA,EAAiB+B,aAAc,GAC5C,EACD,EACAxJ,EAAA,IAACiF,EAAA,CACAO,MAAM,UACN8G,UAAU,2FAEVzF,SAAA7G,EAAA,IAAC4J,EAAA,CACAmD,QAAStF,EAAKoE,QACdxC,oBAAAA,EACD,EACD,EACArJ,EAAA,IAACiF,EAAA,CACAO,MAAM,WACN8G,UAAU,2FAEVzF,SAAA7G,EAAA,IAAC4J,EAAA,CACAmD,QAAStF,EAAKsE,SACd1C,oBAAAA,EACD,EACD,EACArJ,EAAA,IAACiF,EAAA,CACAO,MAAM,QACN8G,UAAU,0GAEVzF,SAAA7G,EAAA,IAACgN,GAAA,CACAD,QAAStF,EAAK2D,WACd9B,gBAAgB7B,EAAAA,EAAKoE,UAALpE,YAAAA,EAAcwB,KAC9BM,QAAS9B,EAAK8B,QACdC,aAAY/B,EAAAA,EAAK2D,aAAL3D,YAAAA,EAAiB+B,aAAc,GAC5C,EACD,EACAxJ,EAAA,IAACiF,EAAA,CACAO,MAAM,OACN8G,UAAU,iGAEVzF,eAACoG,GAAK,CAAAC,KAAMzF,EAAKyF,KAAM3D,QAAS9B,EAAK8B,QAAS,EAC/C,EACAvJ,EAAA,IAACiF,EAAA,CACAO,MAAM,OACN8G,UAAU,iGAEVzF,eAACW,GAAY,EAAA,CAAA,CACd,CAAA,CACD,CAAA,CAAA,CAAA,CACD,CAEF,CAEO,SAAS2F,IAAgB,CAE9B,OAAAnN,EAAAA,IAACoN,GAAA,CACAC,eAAgB,CACf,IAAK,IAAOrN,EAAA,IAAA,IAAA,CAAE6G,SAAoC,uCAAA,CACnD,CAAA,CACD,CAEF","x_google_ignoreList":[0,1]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as I,e as $e,j as E}from"./index-1cKOJFpX.js";import{a as V,Z as Re,b as He,c as Be,d as ze,e as Je,f as Ke,g as qe,h as We,i as xe,j as Ge,k as Xe,l as Qe,m as Ye,u as le,z as pe}from"./request-info-CEhUGODY.js";import{I as te}from"./misc-Txs7O6JX.js";import{S as er}from"./tooltip-DTFU8ajx.js";import{u as rr}from"./pe-CUZaIcdt.js";import{a as tr,d as nr}from"./components-CME-nGId.js";function ye(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),t.push.apply(t,n)}return t}function p(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?ye(Object(t),!0).forEach(function(n){ar(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ye(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function ar(e,r,t){return r=or(r),r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function ir(e,r){if(typeof e!="object"||e===null)return e;var t=e[Symbol.toPrimitive];if(t!==void 0){var n=t.call(e,r||"default");if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(e)}function or(e){var r=ir(e,"string");return typeof r=="symbol"?r:String(r)}function ur(e,r){var t=new FormData(e,r);if(r&&r.type==="submit"&&r.name!==""){var n=t.getAll(r.name);n.includes(r.value)||t.append(r.name,r.value)}return t}function C(e){return e?e.split(/\.|(\[\d*\])/).reduce((r,t)=>{if(typeof t<"u"&&t!==""&&t!=="__proto__"&&t!=="constructor"&&t!=="prototype")if(t.startsWith("[")&&t.endsWith("]")){var n=t.slice(1,-1);r.push(Number(n))}else r.push(t);return r},[]):[]}function L(e){return e.reduce((r,t)=>typeof t=="number"?"".concat(r,"[").concat(Number.isNaN(t)?"":t,"]"):r===""||t===""?[r,t].join(""):[r,t].join("."),"")}function J(e,r){return typeof r<"u"?L([...C(e),r]):e??""}function W(e,r){var t=C(e),n=C(r);return t.length>=n.length&&n.every((a,o)=>t[o]===a)}function F(e,r,t){for(var n=C(r),a=n.length,o=a-1,s=-1,i=e;i!=null&&++s<a;){var u=n[s],f=n[s+1],y=s!=o?Object.prototype.hasOwnProperty.call(i,u)&&i[u]!==null?i[u]:typeof f=="number"?[]:{}:t(i[u]);i[u]=y,i=i[u]}}function Y(e,r){var t=e;for(var n of C(r)){if(typeof t>"u"||t==null)break;if(!Object.prototype.hasOwnProperty.call(t,n))return;if(D(t)&&typeof n=="string")t=t[n];else if(Array.isArray(t)&&typeof n=="number")t=t[n];else return}return t}function D(e){return!!e&&e.constructor===Object&&Object.getPrototypeOf(e)===Object.prototype}function sr(e){return typeof File>"u"?!1:e instanceof File}function $(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;if(D(e)){var t=Object.keys(e).sort().reduce((n,a)=>{var o=$(e[a],r);return typeof o<"u"&&(n[a]=o),n},{});return Object.keys(t).length===0?void 0:t}if(Array.isArray(e))return e.length===0?void 0:e.map(n=>$(n,r));if(!(typeof e=="string"&&e===""||e===null||sr(e)&&(!r||e.size===0)))return e}function de(e){var r,t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n={},a=(r=t.resolve)!==null&&r!==void 0?r:i=>i;function o(i,u){var f=$(a(i));if(typeof f<"u"&&(n[u]=f),Array.isArray(i))for(var y=0;y<i.length;y++)o(i[y],"".concat(u,"[").concat(y,"]"));else if(D(i))for(var[g,N]of Object.entries(i))o(N,u?"".concat(u,".").concat(g):g)}if(e){var s;o(e,(s=t.prefix)!==null&&s!==void 0?s:"")}return n}function ee(e,r){if(!e)throw new Error(r)}function R(){return(Date.now()*Math.random()).toString(36)}function B(e){return JSON.parse(JSON.stringify(e))}function lr(e){return e instanceof Element&&(e.tagName==="INPUT"||e.tagName==="SELECT"||e.tagName==="TEXTAREA"||e.tagName==="BUTTON")}function ne(e){return lr(e)&&e.type!=="submit"&&e.type!=="button"&&e.type!=="reset"}function dr(e){var r,t,n=e.target,a=e.submitter;return(r=(t=a==null?void 0:a.getAttribute("formaction"))!==null&&t!==void 0?t:n.getAttribute("action"))!==null&&r!==void 0?r:"".concat(location.pathname).concat(location.search)}function fr(e){var r,t=e.target,n=e.submitter,a=(r=n==null?void 0:n.getAttribute("formenctype"))!==null&&r!==void 0?r:t.enctype;return a==="multipart/form-data"?a:"application/x-www-form-urlencoded"}function cr(e){var r,t,n=e.target,a=e.submitter,o=(r=(t=a==null?void 0:a.getAttribute("formmethod"))!==null&&t!==void 0?t:n.getAttribute("method"))===null||r===void 0?void 0:r.toUpperCase();switch(o){case"POST":case"PUT":case"PATCH":case"DELETE":return o}return"GET"}function vr(e,r){if(ee(!!e,"Failed to submit the form. The element provided is null or undefined."),typeof e.requestSubmit=="function")e.requestSubmit(r);else{var t=new SubmitEvent("submit",{bubbles:!0,cancelable:!0,submitter:r});e.dispatchEvent(t)}}var z="__intent__",ae="__state__";function Pe(e){var r=e.get(z),t=e.get(ae);ee((typeof r=="string"||r===null)&&(typeof t=="string"||t===null),'The input name "'.concat(z,'" and "').concat(ae,'" are reserved by Conform. Please use another name for your input.'));var n={payload:{},fields:new Set,intent:yr(r)};t&&(n.state=JSON.parse(t));var a=function(u){if(o===z||o===ae)return 1;n.fields.add(o),F(n.payload,o,f=>f?Array.isArray(f)?f.concat(u):[f,u]:u)};for(var[o,s]of e.entries())a(s);return n}function mr(e,r){var t=Pe(e),n=t.intent;if(n)switch(n.type){case"update":{var a=J(n.payload.name,n.payload.index),o=n.payload.value;typeof n.payload.value<"u"&&(a?F(t.payload,a,()=>o):t.payload=o);break}case"reset":{var s=J(n.payload.name,n.payload.index);s?F(t.payload,s,()=>{}):t.payload={};break}case"insert":case"remove":case"reorder":{Ee(t.payload,n);break}}var i=r.resolve(t.payload,n),u=f=>pr(p(p({},t),{},{value:f.value,error:f.error}));return i instanceof Promise?i.then(u):u(i)}function pr(e){return e.intent||!e.value||e.error?{status:e.intent?void 0:"error",payload:e.payload,error:typeof e.error<"u"?e.error:{},reply(r){return ge(e,r)}}:{status:"success",payload:e.payload,value:e.value,reply(r){return ge(e,r)}}}function ge(e){var r,t,n,a,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if("resetForm"in o&&o.resetForm||((r=e.intent)===null||r===void 0?void 0:r.type)==="reset"&&((t=e.intent.payload.name)!==null&&t!==void 0?t:"")==="")return{initialValue:null};if("hideFields"in o&&o.hideFields)for(var s of o.hideFields){var i=Y(e.payload,s);typeof i<"u"&&F(e.payload,s,()=>{})}var u="formErrors"in o||"fieldErrors"in o?$(p({"":(n=o.formErrors)!==null&&n!==void 0?n:null},o.fieldErrors)):null,f=e.error||u?p(p({},e.error),u):void 0;return{status:e.intent?void 0:f?"error":"success",intent:e.intent?e.intent:void 0,initialValue:(a=$(e.payload,typeof document<"u"))!==null&&a!==void 0?a:{},error:f,state:e.state,fields:Array.from(e.fields)}}function yr(e){if(!e)return null;var r=JSON.parse(e);if(typeof r.type!="string"||typeof r.payload>"u")throw new Error("Unknown form control intent");return r}function gr(e){switch(e.type){case"insert":return JSON.stringify({type:e.type,payload:p(p({},e.payload),{},{defaultValue:K(e.payload.defaultValue)})});case"update":return JSON.stringify({type:e.type,payload:p(p({},e.payload),{},{value:K(e.payload.value)})});default:return JSON.stringify(e)}}function oe(e,r){var t;switch(ee(Array.isArray(e),"Failed to update list. The value is not an array."),r.type){case"insert":e.splice((t=r.payload.index)!==null&&t!==void 0?t:e.length,0,r.payload.defaultValue);break;case"remove":e.splice(r.payload.index,1);break;case"reorder":e.splice(r.payload.to,0,...e.splice(r.payload.from,1));break;default:throw new Error("Unknown list intent received")}}function Ee(e,r){F(e,r.payload.name,t=>{var n=t??[];return oe(n,r),n})}var ue=Symbol.for("root");function Q(e,r,t){var n=Object.keys(e).sort((u,f)=>f.localeCompare(u)),a={},o=function(){var f=e[s];W(s,r)&&s!==r&&(F(a,s,y=>typeof y>"u"?f:(y[ue]=f,y)),delete e[s])};for(var s of n)o();var i=t(Y(a,r));Object.assign(e,de(i,{resolve(u){if(D(u)||Array.isArray(u)){var f;return(f=u[ue])!==null&&f!==void 0?f:null}return u},prefix:r}))}function he(e,r,t){Q(e,r.payload.name,n=>{var a=n??[];switch(r.type){case"insert":oe(a,{type:r.type,payload:p(p({},r.payload),{},{defaultValue:t==null?void 0:t(r.payload.defaultValue)})});break;default:oe(a,r);break}return a})}function K(e){return D(e)?Object.entries(e).reduce((r,t)=>{var[n,a]=t;return r[n]=K(a),r},{}):Array.isArray(e)?e.map(K):e instanceof Date?e.toISOString():typeof e=="boolean"?e?"on":void 0:typeof e=="number"||typeof e=="bigint"?e.toString():e??void 0}function be(e,r){var t,n,a,o,s,i=r?void 0:e.lastResult,u=e.defaultValue?K(e.defaultValue):{},f=(t=i==null?void 0:i.initialValue)!==null&&t!==void 0?t:u,y={formId:e.formId,isValueUpdated:!1,submissionStatus:i==null?void 0:i.status,defaultValue:u,initialValue:f,value:f,constraint:(n=e.constraint)!==null&&n!==void 0?n:{},validated:(a=i==null||(o=i.state)===null||o===void 0?void 0:o.validated)!==null&&a!==void 0?a:{},key:r?p({"":R()},q(u)):q(u),error:(s=i==null?void 0:i.error)!==null&&s!==void 0?s:{}};return Ie(y,i==null?void 0:i.intent,i==null?void 0:i.fields),y}function q(e,r){return Object.entries(de(e,{prefix:r})).reduce((t,n)=>{var[a,o]=n;if(Array.isArray(o))for(var s=0;s<o.length;s++)t[J(a,s)]=R();return t},{})}function Oe(e,r){for(var t of Object.keys(e.error).concat(r??[]))e.validated[t]=!0}function Ie(e,r,t,n){var a;if(!r){Oe(e,t);return}switch(r.type){case"validate":{r.payload.name?e.validated[r.payload.name]=!0:Oe(e,t);break}case"update":{var{validated:o,value:s}=r.payload,i=J(r.payload.name,r.payload.index);typeof s<"u"&&Se(e,i??"",s),typeof o<"u"&&(i?Q(e.validated,i,()=>{}):e.validated={},o?((D(s)||Array.isArray(s))&&Object.assign(e.validated,de(s,{resolve(){return!0},prefix:i})),e.validated[i??""]=!0):i&&delete e.validated[i]);break}case"reset":{var u=J(r.payload.name,r.payload.index),f=Y(e.defaultValue,u);Se(e,u,f),u?(Q(e.validated,u,()=>{}),delete e.validated[u]):e.validated={};break}case"insert":case"remove":case"reorder":{n&&(e.initialValue=B(e.initialValue),e.key=B(e.key),he(e.key,r,g=>!Array.isArray(g)&&!D(g)?R():Object.assign(q(g),{[ue]:R()})),Ee(e.initialValue,r)),he(e.validated,r),e.validated[r.payload.name]=!0;break}}var y=(a=t==null?void 0:t.filter(g=>e.validated[g]))!==null&&a!==void 0?a:[];e.error=Object.entries(e.error).reduce((g,N)=>{var[P,k]=N;return(e.validated[P]||y.some(j=>W(P,j)))&&(g[P]=k),g},{})}function Se(e,r,t){if(r===""){e.initialValue=t,e.value=t,e.key=p(p({},q(t)),{},{"":R()});return}e.initialValue=B(e.initialValue),e.value=B(e.value),e.key=B(e.key),F(e.initialValue,r,()=>t),F(e.value,r,()=>t),(D(t)||Array.isArray(t))&&(Q(e.key,r,()=>{}),Object.assign(e.key,q(t,r))),e.key[r]=R()}function x(e){var r={};return new Proxy(r,{get(t,n,a){var o;if(typeof n=="string")return(o=r[n])!==null&&o!==void 0?o:r[n]=e(n,a)}})}function ie(e){var r=$(e);return x((t,n)=>{if(t==="")return r;var a=C(t),o=L(a.slice(0,-1)),s=L(a.slice(-1)),i=n[o];return Y(i,s)})}function hr(e){return x((r,t)=>{var n,a=e[r];if(!a){for(var o=C(r),s=o.length-1;s>=0;s--){var i=o[s];if(typeof i=="number"&&!Number.isNaN(i)){o[s]=Number.NaN;break}}var u=L(o);r!==u&&(a=t[u])}return(n=a)!==null&&n!==void 0?n:{}})}function br(e){return x((r,t)=>{var n=e[r],a=C(r);if(a.length===0)return n;var o=t[L(a.slice(0,-1))];return typeof o>"u"?n:"".concat(o,"/").concat(n??a.at(-1))})}function Or(e){return x(r=>{var t=Object.keys(e);if(r==="")return t.length===0;for(var n of t)if(W(n,r)&&typeof e[n]<"u")return!1;return!0})}function Sr(e,r,t){return x(n=>JSON.stringify(e[n])!==JSON.stringify(r[n],(a,o)=>n===""&&a===""&&o?Object.entries(o).reduce((s,i)=>{var[u,f]=i;return t(u)?Object.assign(s??{},{[u]:f}):s},void 0):o))}function M(e,r,t,n){var a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:(P,k)=>JSON.stringify(P)!==JSON.stringify(k);if(n&&e!==r){var o,s,i=(o=n.prefix)!==null&&o!==void 0?o:[],u=(s=n.name)!==null&&s!==void 0?s:[],f=i.length===0?u:Array.from(new Set([...Object.keys(e),...Object.keys(r)])),y=function(k){if(i.length===0||u.includes(k)||i.some(H=>W(k,H))){var j;if((j=t[k])!==null&&j!==void 0||(t[k]=a(e[k],r[k])),t[k])return{v:!0}}},g;for(var N of f)if(g=y(N),g)return g.v}return!1}function wr(e){var r=[],t=e,n=be(e),a=s(n);function o(){return document.forms.namedItem(t.formId)}function s(l){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:l,d=arguments.length>2?arguments[2]:void 0,v=!d||c.defaultValue!==l.defaultValue?ie(l.defaultValue):d.defaultValue,b=l.initialValue===l.defaultValue?v:!d||c.initialValue!==l.initialValue?ie(l.initialValue):d.initialValue,h=l.value===l.initialValue?b:!d||c.value!==l.value?ie(l.value):d.value;return{submissionStatus:l.submissionStatus,defaultValue:v,initialValue:b,value:h,error:!d||c.error!==l.error?l.error:d.error,validated:l.validated,constraint:!d||c.constraint!==l.constraint?hr(l.constraint):d.constraint,key:!d||c.key!==l.key?br(l.key):d.key,valid:!d||c.error!==l.error?Or(l.error):d.valid,dirty:!d||c.defaultValue!==l.defaultValue||c.value!==l.value?Sr(v,h,O=>{var w,Z;return(w=(Z=t.shouldDirtyConsider)===null||Z===void 0?void 0:Z.call(t,O))!==null&&w!==void 0?w:!0}):d.dirty}}function i(l){var c=n,d=a,v=s(l,c,d);n=l,a=v;var b={value:{},error:{},initialValue:{},key:{},valid:{},dirty:{}};for(var h of r){var O,w=(O=h.getSubject)===null||O===void 0?void 0:O.call(h);(!w||w.formId&&c.formId!==l.formId||w.status&&d.submissionStatus!==v.submissionStatus||M(d.error,v.error,b.error,w.error)||M(d.initialValue,v.initialValue,b.initialValue,w.initialValue)||M(d.key,v.key,b.key,w.key,(Z,G)=>Z!==G)||M(d.valid,v.valid,b.valid,w.valid,u)||M(d.dirty,v.dirty,b.dirty,w.dirty,u)||M(d.value,v.value,b.value,w.value))&&h.callback()}}function u(){var l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return l!==c}function f(){return JSON.stringify({validated:n.validated})}function y(l){var c=l.target,d=l.submitter;ee(c===o(),"The submit event is dispatched by form#".concat(c.id," instead of form#").concat(t.formId));var v=ur(c,d),b={formData:v,action:dr(l),encType:fr(l),method:cr(l)};if(typeof(t==null?void 0:t.onValidate)>"u")return b;var h=t.onValidate({form:c,formData:v,submitter:d});if(h.status==="success"||h.error!==null){var O=h.reply();fe(p(p({},O),{},{status:O.status!=="success"?O.status:void 0}))}return p(p({},b),{},{submission:h})}function g(l){var c=o(),d=l.target;return!c||!ne(d)||d.form!==c||!d.form.isConnected||d.name===""?null:d}function N(l,c){var{shouldValidate:d="onSubmit",shouldRevalidate:v=d}=t,b=n.validated[l.name];return b?v===c&&(c==="onInput"||n.isValueUpdated):d===c}function P(l){var c=new FormData(l),d=Pe(c);i(p(p({},n),{},{isValueUpdated:!0,value:d.payload}))}function k(l){var c=g(l);!c||!c.form||(l.defaultPrevented||!N(c,"onInput")?P(c.form):re({type:"validate",payload:{name:c.name}}))}function j(l){var c=g(l);!c||l.defaultPrevented||!N(c,"onBlur")||re({type:"validate",payload:{name:c.name}})}function H(){i(be(t,!0))}function Ze(l){var c=o();l.type!=="reset"||l.target!==c||l.defaultPrevented||H()}function fe(l){var c,d,v=o();if(!l.initialValue){H();return}var b=Object.entries((c=l.error)!==null&&c!==void 0?c:{}).reduce((w,Z)=>{var[G,ve]=Z,me=ve===null?n.error[G]:ve;return me&&(w[G]=me),w},{}),h=p(p({},n),{},{isValueUpdated:!1,submissionStatus:l.status,value:l.initialValue,validated:p(p({},n.validated),(d=l.state)===null||d===void 0?void 0:d.validated),error:b});if(Ie(h,l.intent,l.fields,!0),i(h),v&&l.status==="error"){for(var O of v.elements)if(ne(O)&&n.error[O.name]){O.focus();break}}}function Le(l){var c=t.formId,d=t.lastResult;Object.assign(t,l),t.formId!==c?H():l.lastResult&&l.lastResult!==d&&fe(l.lastResult)}function _e(l,c){var d={callback:l,getSubject:c};return r.push(d),()=>{r=r.filter(v=>v!==d)}}function Me(){return a}function re(l){var c=o(),d=document.createElement("button"),v=ce(l);d.name=v.name,d.value=v.value,d.hidden=!0,d.formNoValidate=!0,c==null||c.appendChild(d),vr(c,d),c==null||c.removeChild(d)}function ce(l){return{name:z,value:gr(l),form:t.formId,formNoValidate:!0}}function _(l){var c=function(){var v=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return re({type:l,payload:v})};return Object.assign(c,{getButtonProps(){var d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return ce({type:l,payload:d})}})}function Ue(){var l=new MutationObserver(c=>{var d=o();if(d)for(var v of c){var b=v.type==="childList"?[...v.addedNodes,...v.removedNodes]:[v.target];for(var h of b){var O=ne(h)?h:h instanceof HTMLElement?h.querySelector("input,select,textarea"):null;if((O==null?void 0:O.form)===d){P(d);return}}}});return l.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["form","name"]}),()=>{l.disconnect()}}return{getFormId(){return n.formId},submit:y,onReset:Ze,onInput:k,onBlur:j,onUpdate:Le,validate:_("validate"),reset:_("reset"),update:_("update"),insert:_("insert"),remove:_("remove"),reorder:_("reorder"),subscribe:_e,getState:Me,getSerializedState:f,observe:Ue}}function we(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),t.push.apply(t,n)}return t}function A(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?we(Object(t),!0).forEach(function(n){kr(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):we(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function kr(e,r,t){return r=Ir(r),r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function Nr(e,r){if(e==null)return{};var t={},n=Object.keys(e),a,o;for(o=0;o<n.length;o++)a=n[o],!(r.indexOf(a)>=0)&&(t[a]=e[a]);return t}function Pr(e,r){if(e==null)return{};var t=Nr(e,r),n,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],!(r.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}function Er(e,r){if(typeof e!="object"||e===null)return e;var t=e[Symbol.toPrimitive];if(t!==void 0){var n=t.call(e,r||"default");if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(e)}function Ir(e){var r=Er(e,"string");return typeof r=="symbol"?r:String(r)}var jr=Symbol("wrapped");function Vr(e,r){var t=I.useCallback(n=>e.subscribe(n,()=>r==null?void 0:r.current),[e,r]);return I.useSyncExternalStore(t,e.getState,e.getState)}function Ar(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},r=I.useRef(e);return r.current=e,r}function U(e,r,t,n){if(r==="status"||r==="formId")e.current[r]=!0;else if(typeof t<"u"&&typeof n<"u"){var a,o;e.current[r]=A(A({},e.current[r]),{},{[t]:((a=(o=e.current[r])===null||o===void 0?void 0:o[t])!==null&&a!==void 0?a:[]).concat(n)})}}function je(e,r,t){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"",a=n?"".concat(e.getFormId(),"-").concat(n):e.getFormId(),o=e.getState();return new Proxy({id:a,name:n,errorId:"".concat(a,"-error"),descriptionId:"".concat(a,"-description"),get initialValue(){return o.initialValue[n]},get value(){return o.value[n]},get errors(){return o.error[n]},get key(){return o.key[n]},get valid(){return o.valid[n]},get dirty(){return o.dirty[n]},get allErrors(){if(n==="")return o.error;var s={};for(var[i,u]of Object.entries(o.error))W(i,n)&&(s[i]=u);return s},get getFieldset(){return()=>new Proxy({},{get(s,i,u){return typeof i=="string"?Ve(e,r,t,n,i):Reflect.get(s,i,u)}})}},{get(s,i,u){if(o===t)switch(i){case"id":case"errorId":case"descriptionId":U(r,"formId");break;case"key":case"initialValue":case"value":case"valid":case"dirty":U(r,i,"name",n);break;case"errors":case"allErrors":U(r,"error",i==="errors"?"name":"prefix",n);break}return Reflect.get(s,i,u)}})}function Ve(e,r,t){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"",a=arguments.length>4?arguments[4]:void 0,o=typeof a>"u"?n:L([...C(n),a]);return new Proxy({},{get(s,i,u){var f,y=je(e,r,t,o),g=e.getState();switch(i){case"formId":return g===t&&U(r,"formId"),e.getFormId();case"required":case"minLength":case"maxLength":case"min":case"max":case"pattern":case"step":case"multiple":return(f=g.constraint[o])===null||f===void 0?void 0:f[i];case"getFieldList":return()=>{var N,P=(N=g.initialValue[o])!==null&&N!==void 0?N:[];if(g===t&&U(r,"initialValue","name",o),!Array.isArray(P))throw new Error("The initial value at the given name is not a list");return Array(P.length).fill(0).map((k,j)=>Ve(e,r,t,o,j))}}return Reflect.get(y,i,u)}})}function Cr(e,r,t,n){return new Proxy({},{get(a,o,s){var i=je(e,r,t),u=e.getState();switch(o){case"context":return{[jr]:e};case"status":return u===t&&U(r,"status"),u.submissionStatus;case"validate":case"update":case"reset":case"insert":case"remove":case"reorder":return e[o];case"onSubmit":return e.submit;case"noValidate":return n}return Reflect.get(i,o,s)}})}function Tr(e){var{onSubmit:r}=e,t=wr(e);return A(A({},t),{},{submit(n){var a=n.nativeEvent,o=t.submit(a);if(!o.submission||o.submission.status==="success"||o.submission.error===null){if(!o.formData.has(z)){var s;(s=r)===null||s===void 0||s(n,o)}}else n.preventDefault()},onUpdate(n){r=n.onSubmit,t.onUpdate(n)}})}var Fr=["id"],se=typeof document>"u"?I.useEffect:I.useLayoutEffect;function Dr(e){var r=I.useId();return e??r}function Zr(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,[r,t]=I.useState(e);return se(()=>{r||t(!0)},[r]),r}function Lr(e){var{id:r}=e,t=Pr(e,Fr),n=Dr(r),[a]=I.useState(()=>Tr(A(A({},t),{},{formId:n})));se(()=>{var f=a.observe();return document.addEventListener("input",a.onInput),document.addEventListener("focusout",a.onBlur),document.addEventListener("reset",a.onReset),()=>{f(),document.removeEventListener("input",a.onInput),document.removeEventListener("focusout",a.onBlur),document.removeEventListener("reset",a.onReset)}},[a]),se(()=>{a.onUpdate(A(A({},t),{},{formId:n}))});var o=Ar(),s=Vr(a,o),i=Zr(e.defaultNoValidate),u=Cr(a,o,s,i);return[u,u.getFieldset()]}function Ae(e){for(var r in e)e[r]===void 0&&delete e[r];return e}function _r(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(typeof r.ariaAttributes<"u"&&!r.ariaAttributes)return{};var t=r.ariaInvalid==="allErrors"?!e.valid:typeof e.errors<"u",n=r.ariaDescribedBy;return Ae({"aria-invalid":t||void 0,"aria-describedby":t?"".concat(e.errorId," ").concat(n??"").trim():n})}function Mr(e,r){return Ae(A({id:e.id,onSubmit:e.onSubmit,noValidate:e.noValidate},_r(e,r)))}function ke(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),t.push.apply(t,n)}return t}function m(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?ke(Object(t),!0).forEach(function(n){Ur(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ke(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function Ur(e,r,t){return r=Rr(r),r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function $r(e,r){if(typeof e!="object"||e===null)return e;var t=e[Symbol.toPrimitive];if(t!==void 0){var n=t.call(e,r||"default");if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(e)}function Rr(e){var r=$r(e,"string");return typeof r=="symbol"?r:String(r)}function T(e,r){if(typeof e!="string")return e;if(e!=="")return typeof r!="function"?e:r(e)}function X(e){if(!(typeof File<"u"&&e instanceof File&&e.name===""&&e.size===0))return e}function Hr(e){return typeof File>"u"?!1:e._def.effect.type==="refinement"&&e.innerType()._def.typeName==="ZodAny"&&e.safeParse(new File([],"")).success&&!e.safeParse("").success}function S(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:new Map,t=r.get(e);if(t)return t;var n=e,a=e._def;if(a.typeName==="ZodString"||a.typeName==="ZodLiteral"||a.typeName==="ZodEnum"||a.typeName==="ZodNativeEnum")n=V().transform(i=>T(i)).pipe(e);else if(a.typeName==="ZodNumber")n=V().transform(i=>T(i,u=>u.trim()===""?Number.NaN:Number(u))).pipe(e);else if(a.typeName==="ZodBoolean")n=V().transform(i=>T(i,u=>u==="on"?!0:u)).pipe(e);else if(a.typeName==="ZodDate")n=V().transform(i=>T(i,u=>{var f=new Date(u);return isNaN(f.getTime())?u:f})).pipe(e);else if(a.typeName==="ZodBigInt")n=V().transform(i=>T(i,BigInt)).pipe(e);else if(a.typeName==="ZodArray")n=V().transform(i=>Array.isArray(i)?i:typeof i>"u"||typeof X(T(i))>"u"?[]:[i]).pipe(new Re(m(m({},a),{},{type:S(a.type,r)})));else if(a.typeName==="ZodObject"){var o=Object.fromEntries(Object.entries(a.shape()).map(i=>{var[u,f]=i;return[u,S(f,r)]}));n=new He(m(m({},a),{},{shape:()=>o}))}else if(a.typeName==="ZodEffects")Hr(e)?n=V().transform(i=>X(i)).pipe(e):n=new Be(m(m({},a),{},{schema:S(a.schema,r)}));else if(a.typeName==="ZodOptional")n=V().transform(i=>X(T(i))).pipe(new ze(m(m({},a),{},{innerType:S(a.innerType,r)})));else if(a.typeName==="ZodDefault")n=V().transform(i=>X(T(i))).pipe(new Je(m(m({},a),{},{innerType:S(a.innerType,r)})));else if(a.typeName==="ZodCatch")n=new Ke(m(m({},a),{},{innerType:S(a.innerType,r)}));else if(a.typeName==="ZodIntersection")n=new qe(m(m({},a),{},{left:S(a.left,r),right:S(a.right,r)}));else if(a.typeName==="ZodUnion")n=new We(m(m({},a),{},{options:a.options.map(i=>S(i,r))}));else if(a.typeName==="ZodDiscriminatedUnion")n=new xe(m(m({},a),{},{options:a.options.map(i=>S(i,r)),optionsMap:new Map(Array.from(a.optionsMap.entries()).map(i=>{var[u,f]=i;return[u,S(f,r)]}))}));else if(a.typeName==="ZodTuple")n=new Ge(m(m({},a),{},{items:a.items.map(i=>S(i,r))}));else if(a.typeName==="ZodNullable")n=new Xe(m(m({},a),{},{innerType:S(a.innerType,r)}));else if(a.typeName==="ZodPipeline")n=new Qe(m(m({},a),{},{in:S(a.in,r),out:S(a.out,r)}));else if(a.typeName==="ZodLazy"){var s=a.getter();n=Ye(()=>S(s,r))}return e!==n&&r.set(e,n),n}function Br(e,r){var t={};for(var n of e.errors){var a=L(n.path);switch(n.message){case Ne.VALIDATION_UNDEFINED:return null;case Ne.VALIDATION_SKIPPED:t[a]=null;break;default:{var o=t[a];o!==null&&(o?t[a]=o.concat(n):t[a]=[n]);break}}}return Object.entries(t).reduce((s,i)=>{var[u,f]=i;return s[u]=f?r(f):null,s},{})}function zr(e,r){return mr(e,{resolve(t,n){var a=r.errorMap,o=S(typeof r.schema=="function"?r.schema(n):r.schema),s=i=>{var u;return{value:i.success?i.data:void 0,error:i.success?void 0:Br(i.error,(u=r.formatError)!==null&&u!==void 0?u:f=>f.map(y=>y.message))}};return r.async?o.safeParseAsync(t,{errorMap:a}).then(i=>s(i)):s(o.safeParse(t,{errorMap:a}))}})}var Ne={VALIDATION_SKIPPED:"__skipped__",VALIDATION_UNDEFINED:"__undefined__"};function Jr(e){function r(a,o){var u;const s=e[o];if(!s)throw new Error(`Unknown client hint: ${typeof o=="string"?o:"Unknown"}`);const i=(u=a.split(";").map(f=>f.trim()).find(f=>f.startsWith(s.cookieName+"=")))==null?void 0:u.split("=")[1];return i?decodeURIComponent(i):null}function t(a){const o=typeof document<"u"?document.cookie:typeof a<"u"?a.headers.get("Cookie")??"":"";return Object.entries(e).reduce((s,[i,u])=>{const f=i;return"transform"in u?s[f]=u.transform(r(o,f)??u.fallback):s[f]=r(o,f)??u.fallback,s},{})}function n(){return`
|
|
1
|
+
import{r as I,e as $e,j as E}from"./index-1cKOJFpX.js";import{a as V,Z as Re,b as He,c as Be,d as ze,e as Je,f as Ke,g as qe,h as We,i as xe,j as Ge,k as Xe,l as Qe,m as Ye,u as le,z as pe}from"./request-info-CEhUGODY.js";import{I as te}from"./misc-CxCgA-_O.js";import{S as er}from"./tooltip-kD4kSf1i.js";import{u as rr}from"./pe-CUZaIcdt.js";import{a as tr,d as nr}from"./components-CME-nGId.js";function ye(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),t.push.apply(t,n)}return t}function p(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?ye(Object(t),!0).forEach(function(n){ar(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ye(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function ar(e,r,t){return r=or(r),r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function ir(e,r){if(typeof e!="object"||e===null)return e;var t=e[Symbol.toPrimitive];if(t!==void 0){var n=t.call(e,r||"default");if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(e)}function or(e){var r=ir(e,"string");return typeof r=="symbol"?r:String(r)}function ur(e,r){var t=new FormData(e,r);if(r&&r.type==="submit"&&r.name!==""){var n=t.getAll(r.name);n.includes(r.value)||t.append(r.name,r.value)}return t}function C(e){return e?e.split(/\.|(\[\d*\])/).reduce((r,t)=>{if(typeof t<"u"&&t!==""&&t!=="__proto__"&&t!=="constructor"&&t!=="prototype")if(t.startsWith("[")&&t.endsWith("]")){var n=t.slice(1,-1);r.push(Number(n))}else r.push(t);return r},[]):[]}function L(e){return e.reduce((r,t)=>typeof t=="number"?"".concat(r,"[").concat(Number.isNaN(t)?"":t,"]"):r===""||t===""?[r,t].join(""):[r,t].join("."),"")}function J(e,r){return typeof r<"u"?L([...C(e),r]):e??""}function W(e,r){var t=C(e),n=C(r);return t.length>=n.length&&n.every((a,o)=>t[o]===a)}function F(e,r,t){for(var n=C(r),a=n.length,o=a-1,s=-1,i=e;i!=null&&++s<a;){var u=n[s],f=n[s+1],y=s!=o?Object.prototype.hasOwnProperty.call(i,u)&&i[u]!==null?i[u]:typeof f=="number"?[]:{}:t(i[u]);i[u]=y,i=i[u]}}function Y(e,r){var t=e;for(var n of C(r)){if(typeof t>"u"||t==null)break;if(!Object.prototype.hasOwnProperty.call(t,n))return;if(D(t)&&typeof n=="string")t=t[n];else if(Array.isArray(t)&&typeof n=="number")t=t[n];else return}return t}function D(e){return!!e&&e.constructor===Object&&Object.getPrototypeOf(e)===Object.prototype}function sr(e){return typeof File>"u"?!1:e instanceof File}function $(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;if(D(e)){var t=Object.keys(e).sort().reduce((n,a)=>{var o=$(e[a],r);return typeof o<"u"&&(n[a]=o),n},{});return Object.keys(t).length===0?void 0:t}if(Array.isArray(e))return e.length===0?void 0:e.map(n=>$(n,r));if(!(typeof e=="string"&&e===""||e===null||sr(e)&&(!r||e.size===0)))return e}function de(e){var r,t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n={},a=(r=t.resolve)!==null&&r!==void 0?r:i=>i;function o(i,u){var f=$(a(i));if(typeof f<"u"&&(n[u]=f),Array.isArray(i))for(var y=0;y<i.length;y++)o(i[y],"".concat(u,"[").concat(y,"]"));else if(D(i))for(var[g,N]of Object.entries(i))o(N,u?"".concat(u,".").concat(g):g)}if(e){var s;o(e,(s=t.prefix)!==null&&s!==void 0?s:"")}return n}function ee(e,r){if(!e)throw new Error(r)}function R(){return(Date.now()*Math.random()).toString(36)}function B(e){return JSON.parse(JSON.stringify(e))}function lr(e){return e instanceof Element&&(e.tagName==="INPUT"||e.tagName==="SELECT"||e.tagName==="TEXTAREA"||e.tagName==="BUTTON")}function ne(e){return lr(e)&&e.type!=="submit"&&e.type!=="button"&&e.type!=="reset"}function dr(e){var r,t,n=e.target,a=e.submitter;return(r=(t=a==null?void 0:a.getAttribute("formaction"))!==null&&t!==void 0?t:n.getAttribute("action"))!==null&&r!==void 0?r:"".concat(location.pathname).concat(location.search)}function fr(e){var r,t=e.target,n=e.submitter,a=(r=n==null?void 0:n.getAttribute("formenctype"))!==null&&r!==void 0?r:t.enctype;return a==="multipart/form-data"?a:"application/x-www-form-urlencoded"}function cr(e){var r,t,n=e.target,a=e.submitter,o=(r=(t=a==null?void 0:a.getAttribute("formmethod"))!==null&&t!==void 0?t:n.getAttribute("method"))===null||r===void 0?void 0:r.toUpperCase();switch(o){case"POST":case"PUT":case"PATCH":case"DELETE":return o}return"GET"}function vr(e,r){if(ee(!!e,"Failed to submit the form. The element provided is null or undefined."),typeof e.requestSubmit=="function")e.requestSubmit(r);else{var t=new SubmitEvent("submit",{bubbles:!0,cancelable:!0,submitter:r});e.dispatchEvent(t)}}var z="__intent__",ae="__state__";function Pe(e){var r=e.get(z),t=e.get(ae);ee((typeof r=="string"||r===null)&&(typeof t=="string"||t===null),'The input name "'.concat(z,'" and "').concat(ae,'" are reserved by Conform. Please use another name for your input.'));var n={payload:{},fields:new Set,intent:yr(r)};t&&(n.state=JSON.parse(t));var a=function(u){if(o===z||o===ae)return 1;n.fields.add(o),F(n.payload,o,f=>f?Array.isArray(f)?f.concat(u):[f,u]:u)};for(var[o,s]of e.entries())a(s);return n}function mr(e,r){var t=Pe(e),n=t.intent;if(n)switch(n.type){case"update":{var a=J(n.payload.name,n.payload.index),o=n.payload.value;typeof n.payload.value<"u"&&(a?F(t.payload,a,()=>o):t.payload=o);break}case"reset":{var s=J(n.payload.name,n.payload.index);s?F(t.payload,s,()=>{}):t.payload={};break}case"insert":case"remove":case"reorder":{Ee(t.payload,n);break}}var i=r.resolve(t.payload,n),u=f=>pr(p(p({},t),{},{value:f.value,error:f.error}));return i instanceof Promise?i.then(u):u(i)}function pr(e){return e.intent||!e.value||e.error?{status:e.intent?void 0:"error",payload:e.payload,error:typeof e.error<"u"?e.error:{},reply(r){return ge(e,r)}}:{status:"success",payload:e.payload,value:e.value,reply(r){return ge(e,r)}}}function ge(e){var r,t,n,a,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if("resetForm"in o&&o.resetForm||((r=e.intent)===null||r===void 0?void 0:r.type)==="reset"&&((t=e.intent.payload.name)!==null&&t!==void 0?t:"")==="")return{initialValue:null};if("hideFields"in o&&o.hideFields)for(var s of o.hideFields){var i=Y(e.payload,s);typeof i<"u"&&F(e.payload,s,()=>{})}var u="formErrors"in o||"fieldErrors"in o?$(p({"":(n=o.formErrors)!==null&&n!==void 0?n:null},o.fieldErrors)):null,f=e.error||u?p(p({},e.error),u):void 0;return{status:e.intent?void 0:f?"error":"success",intent:e.intent?e.intent:void 0,initialValue:(a=$(e.payload,typeof document<"u"))!==null&&a!==void 0?a:{},error:f,state:e.state,fields:Array.from(e.fields)}}function yr(e){if(!e)return null;var r=JSON.parse(e);if(typeof r.type!="string"||typeof r.payload>"u")throw new Error("Unknown form control intent");return r}function gr(e){switch(e.type){case"insert":return JSON.stringify({type:e.type,payload:p(p({},e.payload),{},{defaultValue:K(e.payload.defaultValue)})});case"update":return JSON.stringify({type:e.type,payload:p(p({},e.payload),{},{value:K(e.payload.value)})});default:return JSON.stringify(e)}}function oe(e,r){var t;switch(ee(Array.isArray(e),"Failed to update list. The value is not an array."),r.type){case"insert":e.splice((t=r.payload.index)!==null&&t!==void 0?t:e.length,0,r.payload.defaultValue);break;case"remove":e.splice(r.payload.index,1);break;case"reorder":e.splice(r.payload.to,0,...e.splice(r.payload.from,1));break;default:throw new Error("Unknown list intent received")}}function Ee(e,r){F(e,r.payload.name,t=>{var n=t??[];return oe(n,r),n})}var ue=Symbol.for("root");function Q(e,r,t){var n=Object.keys(e).sort((u,f)=>f.localeCompare(u)),a={},o=function(){var f=e[s];W(s,r)&&s!==r&&(F(a,s,y=>typeof y>"u"?f:(y[ue]=f,y)),delete e[s])};for(var s of n)o();var i=t(Y(a,r));Object.assign(e,de(i,{resolve(u){if(D(u)||Array.isArray(u)){var f;return(f=u[ue])!==null&&f!==void 0?f:null}return u},prefix:r}))}function he(e,r,t){Q(e,r.payload.name,n=>{var a=n??[];switch(r.type){case"insert":oe(a,{type:r.type,payload:p(p({},r.payload),{},{defaultValue:t==null?void 0:t(r.payload.defaultValue)})});break;default:oe(a,r);break}return a})}function K(e){return D(e)?Object.entries(e).reduce((r,t)=>{var[n,a]=t;return r[n]=K(a),r},{}):Array.isArray(e)?e.map(K):e instanceof Date?e.toISOString():typeof e=="boolean"?e?"on":void 0:typeof e=="number"||typeof e=="bigint"?e.toString():e??void 0}function be(e,r){var t,n,a,o,s,i=r?void 0:e.lastResult,u=e.defaultValue?K(e.defaultValue):{},f=(t=i==null?void 0:i.initialValue)!==null&&t!==void 0?t:u,y={formId:e.formId,isValueUpdated:!1,submissionStatus:i==null?void 0:i.status,defaultValue:u,initialValue:f,value:f,constraint:(n=e.constraint)!==null&&n!==void 0?n:{},validated:(a=i==null||(o=i.state)===null||o===void 0?void 0:o.validated)!==null&&a!==void 0?a:{},key:r?p({"":R()},q(u)):q(u),error:(s=i==null?void 0:i.error)!==null&&s!==void 0?s:{}};return Ie(y,i==null?void 0:i.intent,i==null?void 0:i.fields),y}function q(e,r){return Object.entries(de(e,{prefix:r})).reduce((t,n)=>{var[a,o]=n;if(Array.isArray(o))for(var s=0;s<o.length;s++)t[J(a,s)]=R();return t},{})}function Oe(e,r){for(var t of Object.keys(e.error).concat(r??[]))e.validated[t]=!0}function Ie(e,r,t,n){var a;if(!r){Oe(e,t);return}switch(r.type){case"validate":{r.payload.name?e.validated[r.payload.name]=!0:Oe(e,t);break}case"update":{var{validated:o,value:s}=r.payload,i=J(r.payload.name,r.payload.index);typeof s<"u"&&Se(e,i??"",s),typeof o<"u"&&(i?Q(e.validated,i,()=>{}):e.validated={},o?((D(s)||Array.isArray(s))&&Object.assign(e.validated,de(s,{resolve(){return!0},prefix:i})),e.validated[i??""]=!0):i&&delete e.validated[i]);break}case"reset":{var u=J(r.payload.name,r.payload.index),f=Y(e.defaultValue,u);Se(e,u,f),u?(Q(e.validated,u,()=>{}),delete e.validated[u]):e.validated={};break}case"insert":case"remove":case"reorder":{n&&(e.initialValue=B(e.initialValue),e.key=B(e.key),he(e.key,r,g=>!Array.isArray(g)&&!D(g)?R():Object.assign(q(g),{[ue]:R()})),Ee(e.initialValue,r)),he(e.validated,r),e.validated[r.payload.name]=!0;break}}var y=(a=t==null?void 0:t.filter(g=>e.validated[g]))!==null&&a!==void 0?a:[];e.error=Object.entries(e.error).reduce((g,N)=>{var[P,k]=N;return(e.validated[P]||y.some(j=>W(P,j)))&&(g[P]=k),g},{})}function Se(e,r,t){if(r===""){e.initialValue=t,e.value=t,e.key=p(p({},q(t)),{},{"":R()});return}e.initialValue=B(e.initialValue),e.value=B(e.value),e.key=B(e.key),F(e.initialValue,r,()=>t),F(e.value,r,()=>t),(D(t)||Array.isArray(t))&&(Q(e.key,r,()=>{}),Object.assign(e.key,q(t,r))),e.key[r]=R()}function x(e){var r={};return new Proxy(r,{get(t,n,a){var o;if(typeof n=="string")return(o=r[n])!==null&&o!==void 0?o:r[n]=e(n,a)}})}function ie(e){var r=$(e);return x((t,n)=>{if(t==="")return r;var a=C(t),o=L(a.slice(0,-1)),s=L(a.slice(-1)),i=n[o];return Y(i,s)})}function hr(e){return x((r,t)=>{var n,a=e[r];if(!a){for(var o=C(r),s=o.length-1;s>=0;s--){var i=o[s];if(typeof i=="number"&&!Number.isNaN(i)){o[s]=Number.NaN;break}}var u=L(o);r!==u&&(a=t[u])}return(n=a)!==null&&n!==void 0?n:{}})}function br(e){return x((r,t)=>{var n=e[r],a=C(r);if(a.length===0)return n;var o=t[L(a.slice(0,-1))];return typeof o>"u"?n:"".concat(o,"/").concat(n??a.at(-1))})}function Or(e){return x(r=>{var t=Object.keys(e);if(r==="")return t.length===0;for(var n of t)if(W(n,r)&&typeof e[n]<"u")return!1;return!0})}function Sr(e,r,t){return x(n=>JSON.stringify(e[n])!==JSON.stringify(r[n],(a,o)=>n===""&&a===""&&o?Object.entries(o).reduce((s,i)=>{var[u,f]=i;return t(u)?Object.assign(s??{},{[u]:f}):s},void 0):o))}function M(e,r,t,n){var a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:(P,k)=>JSON.stringify(P)!==JSON.stringify(k);if(n&&e!==r){var o,s,i=(o=n.prefix)!==null&&o!==void 0?o:[],u=(s=n.name)!==null&&s!==void 0?s:[],f=i.length===0?u:Array.from(new Set([...Object.keys(e),...Object.keys(r)])),y=function(k){if(i.length===0||u.includes(k)||i.some(H=>W(k,H))){var j;if((j=t[k])!==null&&j!==void 0||(t[k]=a(e[k],r[k])),t[k])return{v:!0}}},g;for(var N of f)if(g=y(N),g)return g.v}return!1}function wr(e){var r=[],t=e,n=be(e),a=s(n);function o(){return document.forms.namedItem(t.formId)}function s(l){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:l,d=arguments.length>2?arguments[2]:void 0,v=!d||c.defaultValue!==l.defaultValue?ie(l.defaultValue):d.defaultValue,b=l.initialValue===l.defaultValue?v:!d||c.initialValue!==l.initialValue?ie(l.initialValue):d.initialValue,h=l.value===l.initialValue?b:!d||c.value!==l.value?ie(l.value):d.value;return{submissionStatus:l.submissionStatus,defaultValue:v,initialValue:b,value:h,error:!d||c.error!==l.error?l.error:d.error,validated:l.validated,constraint:!d||c.constraint!==l.constraint?hr(l.constraint):d.constraint,key:!d||c.key!==l.key?br(l.key):d.key,valid:!d||c.error!==l.error?Or(l.error):d.valid,dirty:!d||c.defaultValue!==l.defaultValue||c.value!==l.value?Sr(v,h,O=>{var w,Z;return(w=(Z=t.shouldDirtyConsider)===null||Z===void 0?void 0:Z.call(t,O))!==null&&w!==void 0?w:!0}):d.dirty}}function i(l){var c=n,d=a,v=s(l,c,d);n=l,a=v;var b={value:{},error:{},initialValue:{},key:{},valid:{},dirty:{}};for(var h of r){var O,w=(O=h.getSubject)===null||O===void 0?void 0:O.call(h);(!w||w.formId&&c.formId!==l.formId||w.status&&d.submissionStatus!==v.submissionStatus||M(d.error,v.error,b.error,w.error)||M(d.initialValue,v.initialValue,b.initialValue,w.initialValue)||M(d.key,v.key,b.key,w.key,(Z,G)=>Z!==G)||M(d.valid,v.valid,b.valid,w.valid,u)||M(d.dirty,v.dirty,b.dirty,w.dirty,u)||M(d.value,v.value,b.value,w.value))&&h.callback()}}function u(){var l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return l!==c}function f(){return JSON.stringify({validated:n.validated})}function y(l){var c=l.target,d=l.submitter;ee(c===o(),"The submit event is dispatched by form#".concat(c.id," instead of form#").concat(t.formId));var v=ur(c,d),b={formData:v,action:dr(l),encType:fr(l),method:cr(l)};if(typeof(t==null?void 0:t.onValidate)>"u")return b;var h=t.onValidate({form:c,formData:v,submitter:d});if(h.status==="success"||h.error!==null){var O=h.reply();fe(p(p({},O),{},{status:O.status!=="success"?O.status:void 0}))}return p(p({},b),{},{submission:h})}function g(l){var c=o(),d=l.target;return!c||!ne(d)||d.form!==c||!d.form.isConnected||d.name===""?null:d}function N(l,c){var{shouldValidate:d="onSubmit",shouldRevalidate:v=d}=t,b=n.validated[l.name];return b?v===c&&(c==="onInput"||n.isValueUpdated):d===c}function P(l){var c=new FormData(l),d=Pe(c);i(p(p({},n),{},{isValueUpdated:!0,value:d.payload}))}function k(l){var c=g(l);!c||!c.form||(l.defaultPrevented||!N(c,"onInput")?P(c.form):re({type:"validate",payload:{name:c.name}}))}function j(l){var c=g(l);!c||l.defaultPrevented||!N(c,"onBlur")||re({type:"validate",payload:{name:c.name}})}function H(){i(be(t,!0))}function Ze(l){var c=o();l.type!=="reset"||l.target!==c||l.defaultPrevented||H()}function fe(l){var c,d,v=o();if(!l.initialValue){H();return}var b=Object.entries((c=l.error)!==null&&c!==void 0?c:{}).reduce((w,Z)=>{var[G,ve]=Z,me=ve===null?n.error[G]:ve;return me&&(w[G]=me),w},{}),h=p(p({},n),{},{isValueUpdated:!1,submissionStatus:l.status,value:l.initialValue,validated:p(p({},n.validated),(d=l.state)===null||d===void 0?void 0:d.validated),error:b});if(Ie(h,l.intent,l.fields,!0),i(h),v&&l.status==="error"){for(var O of v.elements)if(ne(O)&&n.error[O.name]){O.focus();break}}}function Le(l){var c=t.formId,d=t.lastResult;Object.assign(t,l),t.formId!==c?H():l.lastResult&&l.lastResult!==d&&fe(l.lastResult)}function _e(l,c){var d={callback:l,getSubject:c};return r.push(d),()=>{r=r.filter(v=>v!==d)}}function Me(){return a}function re(l){var c=o(),d=document.createElement("button"),v=ce(l);d.name=v.name,d.value=v.value,d.hidden=!0,d.formNoValidate=!0,c==null||c.appendChild(d),vr(c,d),c==null||c.removeChild(d)}function ce(l){return{name:z,value:gr(l),form:t.formId,formNoValidate:!0}}function _(l){var c=function(){var v=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return re({type:l,payload:v})};return Object.assign(c,{getButtonProps(){var d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return ce({type:l,payload:d})}})}function Ue(){var l=new MutationObserver(c=>{var d=o();if(d)for(var v of c){var b=v.type==="childList"?[...v.addedNodes,...v.removedNodes]:[v.target];for(var h of b){var O=ne(h)?h:h instanceof HTMLElement?h.querySelector("input,select,textarea"):null;if((O==null?void 0:O.form)===d){P(d);return}}}});return l.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["form","name"]}),()=>{l.disconnect()}}return{getFormId(){return n.formId},submit:y,onReset:Ze,onInput:k,onBlur:j,onUpdate:Le,validate:_("validate"),reset:_("reset"),update:_("update"),insert:_("insert"),remove:_("remove"),reorder:_("reorder"),subscribe:_e,getState:Me,getSerializedState:f,observe:Ue}}function we(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),t.push.apply(t,n)}return t}function A(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?we(Object(t),!0).forEach(function(n){kr(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):we(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function kr(e,r,t){return r=Ir(r),r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function Nr(e,r){if(e==null)return{};var t={},n=Object.keys(e),a,o;for(o=0;o<n.length;o++)a=n[o],!(r.indexOf(a)>=0)&&(t[a]=e[a]);return t}function Pr(e,r){if(e==null)return{};var t=Nr(e,r),n,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],!(r.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}function Er(e,r){if(typeof e!="object"||e===null)return e;var t=e[Symbol.toPrimitive];if(t!==void 0){var n=t.call(e,r||"default");if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(e)}function Ir(e){var r=Er(e,"string");return typeof r=="symbol"?r:String(r)}var jr=Symbol("wrapped");function Vr(e,r){var t=I.useCallback(n=>e.subscribe(n,()=>r==null?void 0:r.current),[e,r]);return I.useSyncExternalStore(t,e.getState,e.getState)}function Ar(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},r=I.useRef(e);return r.current=e,r}function U(e,r,t,n){if(r==="status"||r==="formId")e.current[r]=!0;else if(typeof t<"u"&&typeof n<"u"){var a,o;e.current[r]=A(A({},e.current[r]),{},{[t]:((a=(o=e.current[r])===null||o===void 0?void 0:o[t])!==null&&a!==void 0?a:[]).concat(n)})}}function je(e,r,t){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"",a=n?"".concat(e.getFormId(),"-").concat(n):e.getFormId(),o=e.getState();return new Proxy({id:a,name:n,errorId:"".concat(a,"-error"),descriptionId:"".concat(a,"-description"),get initialValue(){return o.initialValue[n]},get value(){return o.value[n]},get errors(){return o.error[n]},get key(){return o.key[n]},get valid(){return o.valid[n]},get dirty(){return o.dirty[n]},get allErrors(){if(n==="")return o.error;var s={};for(var[i,u]of Object.entries(o.error))W(i,n)&&(s[i]=u);return s},get getFieldset(){return()=>new Proxy({},{get(s,i,u){return typeof i=="string"?Ve(e,r,t,n,i):Reflect.get(s,i,u)}})}},{get(s,i,u){if(o===t)switch(i){case"id":case"errorId":case"descriptionId":U(r,"formId");break;case"key":case"initialValue":case"value":case"valid":case"dirty":U(r,i,"name",n);break;case"errors":case"allErrors":U(r,"error",i==="errors"?"name":"prefix",n);break}return Reflect.get(s,i,u)}})}function Ve(e,r,t){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"",a=arguments.length>4?arguments[4]:void 0,o=typeof a>"u"?n:L([...C(n),a]);return new Proxy({},{get(s,i,u){var f,y=je(e,r,t,o),g=e.getState();switch(i){case"formId":return g===t&&U(r,"formId"),e.getFormId();case"required":case"minLength":case"maxLength":case"min":case"max":case"pattern":case"step":case"multiple":return(f=g.constraint[o])===null||f===void 0?void 0:f[i];case"getFieldList":return()=>{var N,P=(N=g.initialValue[o])!==null&&N!==void 0?N:[];if(g===t&&U(r,"initialValue","name",o),!Array.isArray(P))throw new Error("The initial value at the given name is not a list");return Array(P.length).fill(0).map((k,j)=>Ve(e,r,t,o,j))}}return Reflect.get(y,i,u)}})}function Cr(e,r,t,n){return new Proxy({},{get(a,o,s){var i=je(e,r,t),u=e.getState();switch(o){case"context":return{[jr]:e};case"status":return u===t&&U(r,"status"),u.submissionStatus;case"validate":case"update":case"reset":case"insert":case"remove":case"reorder":return e[o];case"onSubmit":return e.submit;case"noValidate":return n}return Reflect.get(i,o,s)}})}function Tr(e){var{onSubmit:r}=e,t=wr(e);return A(A({},t),{},{submit(n){var a=n.nativeEvent,o=t.submit(a);if(!o.submission||o.submission.status==="success"||o.submission.error===null){if(!o.formData.has(z)){var s;(s=r)===null||s===void 0||s(n,o)}}else n.preventDefault()},onUpdate(n){r=n.onSubmit,t.onUpdate(n)}})}var Fr=["id"],se=typeof document>"u"?I.useEffect:I.useLayoutEffect;function Dr(e){var r=I.useId();return e??r}function Zr(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,[r,t]=I.useState(e);return se(()=>{r||t(!0)},[r]),r}function Lr(e){var{id:r}=e,t=Pr(e,Fr),n=Dr(r),[a]=I.useState(()=>Tr(A(A({},t),{},{formId:n})));se(()=>{var f=a.observe();return document.addEventListener("input",a.onInput),document.addEventListener("focusout",a.onBlur),document.addEventListener("reset",a.onReset),()=>{f(),document.removeEventListener("input",a.onInput),document.removeEventListener("focusout",a.onBlur),document.removeEventListener("reset",a.onReset)}},[a]),se(()=>{a.onUpdate(A(A({},t),{},{formId:n}))});var o=Ar(),s=Vr(a,o),i=Zr(e.defaultNoValidate),u=Cr(a,o,s,i);return[u,u.getFieldset()]}function Ae(e){for(var r in e)e[r]===void 0&&delete e[r];return e}function _r(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(typeof r.ariaAttributes<"u"&&!r.ariaAttributes)return{};var t=r.ariaInvalid==="allErrors"?!e.valid:typeof e.errors<"u",n=r.ariaDescribedBy;return Ae({"aria-invalid":t||void 0,"aria-describedby":t?"".concat(e.errorId," ").concat(n??"").trim():n})}function Mr(e,r){return Ae(A({id:e.id,onSubmit:e.onSubmit,noValidate:e.noValidate},_r(e,r)))}function ke(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),t.push.apply(t,n)}return t}function m(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?ke(Object(t),!0).forEach(function(n){Ur(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ke(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function Ur(e,r,t){return r=Rr(r),r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function $r(e,r){if(typeof e!="object"||e===null)return e;var t=e[Symbol.toPrimitive];if(t!==void 0){var n=t.call(e,r||"default");if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(e)}function Rr(e){var r=$r(e,"string");return typeof r=="symbol"?r:String(r)}function T(e,r){if(typeof e!="string")return e;if(e!=="")return typeof r!="function"?e:r(e)}function X(e){if(!(typeof File<"u"&&e instanceof File&&e.name===""&&e.size===0))return e}function Hr(e){return typeof File>"u"?!1:e._def.effect.type==="refinement"&&e.innerType()._def.typeName==="ZodAny"&&e.safeParse(new File([],"")).success&&!e.safeParse("").success}function S(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:new Map,t=r.get(e);if(t)return t;var n=e,a=e._def;if(a.typeName==="ZodString"||a.typeName==="ZodLiteral"||a.typeName==="ZodEnum"||a.typeName==="ZodNativeEnum")n=V().transform(i=>T(i)).pipe(e);else if(a.typeName==="ZodNumber")n=V().transform(i=>T(i,u=>u.trim()===""?Number.NaN:Number(u))).pipe(e);else if(a.typeName==="ZodBoolean")n=V().transform(i=>T(i,u=>u==="on"?!0:u)).pipe(e);else if(a.typeName==="ZodDate")n=V().transform(i=>T(i,u=>{var f=new Date(u);return isNaN(f.getTime())?u:f})).pipe(e);else if(a.typeName==="ZodBigInt")n=V().transform(i=>T(i,BigInt)).pipe(e);else if(a.typeName==="ZodArray")n=V().transform(i=>Array.isArray(i)?i:typeof i>"u"||typeof X(T(i))>"u"?[]:[i]).pipe(new Re(m(m({},a),{},{type:S(a.type,r)})));else if(a.typeName==="ZodObject"){var o=Object.fromEntries(Object.entries(a.shape()).map(i=>{var[u,f]=i;return[u,S(f,r)]}));n=new He(m(m({},a),{},{shape:()=>o}))}else if(a.typeName==="ZodEffects")Hr(e)?n=V().transform(i=>X(i)).pipe(e):n=new Be(m(m({},a),{},{schema:S(a.schema,r)}));else if(a.typeName==="ZodOptional")n=V().transform(i=>X(T(i))).pipe(new ze(m(m({},a),{},{innerType:S(a.innerType,r)})));else if(a.typeName==="ZodDefault")n=V().transform(i=>X(T(i))).pipe(new Je(m(m({},a),{},{innerType:S(a.innerType,r)})));else if(a.typeName==="ZodCatch")n=new Ke(m(m({},a),{},{innerType:S(a.innerType,r)}));else if(a.typeName==="ZodIntersection")n=new qe(m(m({},a),{},{left:S(a.left,r),right:S(a.right,r)}));else if(a.typeName==="ZodUnion")n=new We(m(m({},a),{},{options:a.options.map(i=>S(i,r))}));else if(a.typeName==="ZodDiscriminatedUnion")n=new xe(m(m({},a),{},{options:a.options.map(i=>S(i,r)),optionsMap:new Map(Array.from(a.optionsMap.entries()).map(i=>{var[u,f]=i;return[u,S(f,r)]}))}));else if(a.typeName==="ZodTuple")n=new Ge(m(m({},a),{},{items:a.items.map(i=>S(i,r))}));else if(a.typeName==="ZodNullable")n=new Xe(m(m({},a),{},{innerType:S(a.innerType,r)}));else if(a.typeName==="ZodPipeline")n=new Qe(m(m({},a),{},{in:S(a.in,r),out:S(a.out,r)}));else if(a.typeName==="ZodLazy"){var s=a.getter();n=Ye(()=>S(s,r))}return e!==n&&r.set(e,n),n}function Br(e,r){var t={};for(var n of e.errors){var a=L(n.path);switch(n.message){case Ne.VALIDATION_UNDEFINED:return null;case Ne.VALIDATION_SKIPPED:t[a]=null;break;default:{var o=t[a];o!==null&&(o?t[a]=o.concat(n):t[a]=[n]);break}}}return Object.entries(t).reduce((s,i)=>{var[u,f]=i;return s[u]=f?r(f):null,s},{})}function zr(e,r){return mr(e,{resolve(t,n){var a=r.errorMap,o=S(typeof r.schema=="function"?r.schema(n):r.schema),s=i=>{var u;return{value:i.success?i.data:void 0,error:i.success?void 0:Br(i.error,(u=r.formatError)!==null&&u!==void 0?u:f=>f.map(y=>y.message))}};return r.async?o.safeParseAsync(t,{errorMap:a}).then(i=>s(i)):s(o.safeParse(t,{errorMap:a}))}})}var Ne={VALIDATION_SKIPPED:"__skipped__",VALIDATION_UNDEFINED:"__undefined__"};function Jr(e){function r(a,o){var u;const s=e[o];if(!s)throw new Error(`Unknown client hint: ${typeof o=="string"?o:"Unknown"}`);const i=(u=a.split(";").map(f=>f.trim()).find(f=>f.startsWith(s.cookieName+"=")))==null?void 0:u.split("=")[1];return i?decodeURIComponent(i):null}function t(a){const o=typeof document<"u"?document.cookie:typeof a<"u"?a.headers.get("Cookie")??"":"";return Object.entries(e).reduce((s,[i,u])=>{const f=i;return"transform"in u?s[f]=u.transform(r(o,f)??u.fallback):s[f]=r(o,f)??u.fallback,s},{})}function n(){return`
|
|
2
2
|
// This block of code allows us to check if the client hints have changed and
|
|
3
3
|
// force a reload of the page with updated hints if they have so you don't get
|
|
4
4
|
// a flash of incorrect content.
|
|
@@ -33,4 +33,4 @@ function checkClientHints() {
|
|
|
33
33
|
|
|
34
34
|
checkClientHints();
|
|
35
35
|
`}return{getHints:t,getClientHintCheckScript:n}}const Ce={cookieName:"CH-prefers-color-scheme",getValueCode:"window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'",fallback:"light",transform(e){return e==="dark"?"dark":"light"}};function Kr(e,r=Ce.cookieName){const t=window.matchMedia("(prefers-color-scheme: dark)");function n(){const a=t.matches?"dark":"light";document.cookie=`${r}=${a}; Max-Age=31536000; Path=/`,e(a)}return t.addEventListener("change",n),function(){t.removeEventListener("change",n)}}const Te={cookieName:"CH-reduced-motion",getValueCode:"window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'reduce' : 'no-preference'",fallback:"no-preference",transform(e){return e==="reduce"?"reduce":"no-preference"}};function qr(e,r=Te.cookieName){const t=window.matchMedia("(prefers-reduced-motion: reduce)");function n(){const a=t.matches?"reduce":"no-preference";document.cookie=`${r}=${a}; Max-Age=31536000; Path=/`,e(a)}return t.addEventListener("change",n),function(){t.removeEventListener("change",n)}}const Wr={cookieName:"CH-time-zone",getValueCode:"Intl.DateTimeFormat().resolvedOptions().timeZone",fallback:"UTC"},Fe="EpicShop_CH-prefers-color-scheme",De="EpicShop_CH-reduced-motion",xr=Jr({theme:{...Ce,cookieName:Fe},timeZone:{...Wr,cookieName:"EpicShop_CH-time-zone"},reducedMotion:{...Te,cookieName:De}});function Gr(){return le().hints}function ot(){const{revalidate:e}=$e();return I.useEffect(()=>Kr(()=>e(),Fe),[e]),I.useEffect(()=>qr(()=>e(),De),[e]),E.jsx("script",{dangerouslySetInnerHTML:{__html:xr.getClientHintCheckScript()}})}function Xr({id:e,errors:r}){const t=r==null?void 0:r.filter(Boolean);return t!=null&&t.length?E.jsx("ul",{id:e,className:"space-y-1",children:t.map(n=>E.jsx("li",{className:"text-danger text-[10px]",children:n},n))}):null}const Qr="/theme",Yr=pe.object({theme:pe.enum(["system","light","dark"])});function ut(){const e=le(),r=rr(),t=tr(),[n]=Lr({lastResult:t.data,onValidate({formData:i}){return zr(i,{schema:Yr})}}),a=e.session.theme??"system",o=a==="system"?"light":a==="light"?"dark":"system",s={light:E.jsx(te,{size:"md",name:"Sun",title:"Light mode"}),dark:E.jsx(te,{size:"md",name:"Moon",title:"Dark mode"}),system:E.jsx(te,{size:"md",name:"Laptop",title:"System mode"})};return E.jsxs(t.Form,{method:"POST",action:Qr,...Mr(n),children:[E.jsxs("div",{className:"flex gap-2",children:[r,E.jsx("input",{type:"hidden",name:"theme",value:o}),E.jsx(er,{content:`Change theme from ${a} mode`,children:E.jsx("button",{type:"submit",name:"intent",value:"update-theme",className:"flex h-8 w-8 cursor-pointer items-center justify-center",children:s[a]})})]}),E.jsx(Xr,{errors:n.errors,id:n.errorId})]})}function st(){var o;const e=Gr(),r=le(),n=nr().find(s=>{var i;return((i=s.formData)==null?void 0:i.get("intent"))==="update-theme"}),a=(o=n==null?void 0:n.formData)==null?void 0:o.get("theme");return a==="system"?e.theme:a==="light"||a==="dark"?a:r.session.theme??e.theme}export{ot as C,ut as T,Gr as a,st as u};
|
|
36
|
-
//# sourceMappingURL=index-
|
|
36
|
+
//# sourceMappingURL=index-YNIH4TH8.js.map
|