@hyunsdev/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +89 -0
- package/SKILL.md +38 -0
- package/dist/WindowContext-DybYtZJa.d.ts +50 -0
- package/dist/_styles-BbTx89aX.d.ts +3 -0
- package/dist/chunk-23KUNTRD.js +49 -0
- package/dist/chunk-23KUNTRD.js.map +1 -0
- package/dist/chunk-3RTSANKB.js +51 -0
- package/dist/chunk-3RTSANKB.js.map +1 -0
- package/dist/chunk-4QIWBOF4.js +129 -0
- package/dist/chunk-4QIWBOF4.js.map +1 -0
- package/dist/chunk-5JCWC7IU.js +293 -0
- package/dist/chunk-5JCWC7IU.js.map +1 -0
- package/dist/chunk-6ANDNGHD.js +33 -0
- package/dist/chunk-6ANDNGHD.js.map +1 -0
- package/dist/chunk-7W7QZHEZ.js +42 -0
- package/dist/chunk-7W7QZHEZ.js.map +1 -0
- package/dist/chunk-BHO4WT2N.js +51 -0
- package/dist/chunk-BHO4WT2N.js.map +1 -0
- package/dist/chunk-BI3KKBIC.js +11 -0
- package/dist/chunk-BI3KKBIC.js.map +1 -0
- package/dist/chunk-D3SP7GL3.js +55 -0
- package/dist/chunk-D3SP7GL3.js.map +1 -0
- package/dist/chunk-D7W4RSQX.js +115 -0
- package/dist/chunk-D7W4RSQX.js.map +1 -0
- package/dist/chunk-DN2AEEA2.js +11 -0
- package/dist/chunk-DN2AEEA2.js.map +1 -0
- package/dist/chunk-ETTKFCO6.js +84 -0
- package/dist/chunk-ETTKFCO6.js.map +1 -0
- package/dist/chunk-GJT7TDBS.js +66 -0
- package/dist/chunk-GJT7TDBS.js.map +1 -0
- package/dist/chunk-HZT6RQYZ.js +109 -0
- package/dist/chunk-HZT6RQYZ.js.map +1 -0
- package/dist/chunk-JB2QZV7K.js +60 -0
- package/dist/chunk-JB2QZV7K.js.map +1 -0
- package/dist/chunk-KJJB2PVC.js +21 -0
- package/dist/chunk-KJJB2PVC.js.map +1 -0
- package/dist/chunk-NE3IVPMO.js +31 -0
- package/dist/chunk-NE3IVPMO.js.map +1 -0
- package/dist/chunk-O2BG2KSY.js +23 -0
- package/dist/chunk-O2BG2KSY.js.map +1 -0
- package/dist/chunk-OUFGNJ3V.js +1726 -0
- package/dist/chunk-OUFGNJ3V.js.map +1 -0
- package/dist/chunk-PLZMCJSL.js +351 -0
- package/dist/chunk-PLZMCJSL.js.map +1 -0
- package/dist/chunk-POG5DZBT.js +104 -0
- package/dist/chunk-POG5DZBT.js.map +1 -0
- package/dist/chunk-SECZM6JE.js +170 -0
- package/dist/chunk-SECZM6JE.js.map +1 -0
- package/dist/chunk-T64WPXSC.js +48 -0
- package/dist/chunk-T64WPXSC.js.map +1 -0
- package/dist/chunk-TU5CYBB4.js +90 -0
- package/dist/chunk-TU5CYBB4.js.map +1 -0
- package/dist/chunk-UVAI2U6X.js +153 -0
- package/dist/chunk-UVAI2U6X.js.map +1 -0
- package/dist/chunk-UXCBLYG6.js +142 -0
- package/dist/chunk-UXCBLYG6.js.map +1 -0
- package/dist/chunk-VUR4MQMH.js +53 -0
- package/dist/chunk-VUR4MQMH.js.map +1 -0
- package/dist/chunk-WIEKNG4S.js +26 -0
- package/dist/chunk-WIEKNG4S.js.map +1 -0
- package/dist/chunk-WIZ4OLOB.js +23 -0
- package/dist/chunk-WIZ4OLOB.js.map +1 -0
- package/dist/chunk-WJRJBMFN.js +21 -0
- package/dist/chunk-WJRJBMFN.js.map +1 -0
- package/dist/chunk-YUPLJP3F.js +33 -0
- package/dist/chunk-YUPLJP3F.js.map +1 -0
- package/dist/chunk-Z7ITPSUF.js +184 -0
- package/dist/chunk-Z7ITPSUF.js.map +1 -0
- package/dist/chunk-ZC76ALSI.js +75 -0
- package/dist/chunk-ZC76ALSI.js.map +1 -0
- package/dist/code-block-core-xkE94Rk5.d.ts +30 -0
- package/dist/components/accordion.d.ts +9 -0
- package/dist/components/accordion.js +98 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +26 -0
- package/dist/components/alert-dialog.js +341 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.d.ts +13 -0
- package/dist/components/alert.js +76 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/aspect-ratio.d.ts +6 -0
- package/dist/components/aspect-ratio.js +12 -0
- package/dist/components/aspect-ratio.js.map +1 -0
- package/dist/components/avatar.d.ts +13 -0
- package/dist/components/avatar.js +19 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +12 -0
- package/dist/components/badge.js +11 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +13 -0
- package/dist/components/breadcrumb.js +102 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button-group.d.ts +16 -0
- package/dist/components/button-group.js +15 -0
- package/dist/components/button-group.js.map +1 -0
- package/dist/components/button.d.ts +14 -0
- package/dist/components/button.js +11 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +14 -0
- package/dist/components/calendar.js +13 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +13 -0
- package/dist/components/card.js +21 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.d.ts +32 -0
- package/dist/components/carousel.js +196 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/chart.d.ts +46 -0
- package/dist/components/chart.js +254 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/checkbox.d.ts +6 -0
- package/dist/components/checkbox.js +41 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/code-block-core.d.ts +3 -0
- package/dist/components/code-block-core.js +13 -0
- package/dist/components/code-block-core.js.map +1 -0
- package/dist/components/code-block-custom.d.ts +20 -0
- package/dist/components/code-block-custom.js +16 -0
- package/dist/components/code-block-custom.js.map +1 -0
- package/dist/components/code-block-shiki.d.ts +13 -0
- package/dist/components/code-block-shiki.js +15 -0
- package/dist/components/code-block-shiki.js.map +1 -0
- package/dist/components/code-block.d.ts +5 -0
- package/dist/components/code-block.js +14 -0
- package/dist/components/code-block.js.map +1 -0
- package/dist/components/collapsible.d.ts +8 -0
- package/dist/components/collapsible.js +24 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/collection.d.ts +63 -0
- package/dist/components/collection.js +598 -0
- package/dist/components/collection.js.map +1 -0
- package/dist/components/color-dot.d.ts +19 -0
- package/dist/components/color-dot.js +41 -0
- package/dist/components/color-dot.js.map +1 -0
- package/dist/components/color-picker.d.ts +12 -0
- package/dist/components/color-picker.js +142 -0
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/combobox.d.ts +74 -0
- package/dist/components/combobox.js +610 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +21 -0
- package/dist/components/command.js +31 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/date-picker.d.ts +43 -0
- package/dist/components/date-picker.js +235 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +25 -0
- package/dist/components/dialog.js +31 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.d.ts +15 -0
- package/dist/components/drawer.js +124 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +34 -0
- package/dist/components/dropdown-menu.js +248 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/empty.d.ts +15 -0
- package/dist/components/empty.js +104 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field.d.ts +29 -0
- package/dist/components/field.js +214 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/format-bytes.d.ts +12 -0
- package/dist/components/format-bytes.js +30 -0
- package/dist/components/format-bytes.js.map +1 -0
- package/dist/components/format-number.d.ts +12 -0
- package/dist/components/format-number.js +30 -0
- package/dist/components/format-number.js.map +1 -0
- package/dist/components/gauge.d.ts +11 -0
- package/dist/components/gauge.js +82 -0
- package/dist/components/gauge.js.map +1 -0
- package/dist/components/hover-card.d.ts +8 -0
- package/dist/components/hover-card.js +45 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input-group.d.ts +24 -0
- package/dist/components/input-group.js +23 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input-otp.d.ts +20 -0
- package/dist/components/input-otp.js +95 -0
- package/dist/components/input-otp.js.map +1 -0
- package/dist/components/input.d.ts +9 -0
- package/dist/components/input.js +9 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/item.d.ts +27 -0
- package/dist/components/item.js +182 -0
- package/dist/components/item.js.map +1 -0
- package/dist/components/kbd.d.ts +6 -0
- package/dist/components/kbd.js +34 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.d.ts +6 -0
- package/dist/components/label.js +9 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/loading-bar.d.ts +8 -0
- package/dist/components/loading-bar.js +127 -0
- package/dist/components/loading-bar.js.map +1 -0
- package/dist/components/loading-dots.d.ts +5 -0
- package/dist/components/loading-dots.js +45 -0
- package/dist/components/loading-dots.js.map +1 -0
- package/dist/components/main-provider.d.ts +7 -0
- package/dist/components/main-provider.js +12 -0
- package/dist/components/main-provider.js.map +1 -0
- package/dist/components/mark.d.ts +11 -0
- package/dist/components/mark.js +44 -0
- package/dist/components/mark.js.map +1 -0
- package/dist/components/pagination.d.ts +21 -0
- package/dist/components/pagination.js +114 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +12 -0
- package/dist/components/popover.js +22 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/prev-next-navigation.d.ts +15 -0
- package/dist/components/prev-next-navigation.js +85 -0
- package/dist/components/prev-next-navigation.js.map +1 -0
- package/dist/components/progress.d.ts +6 -0
- package/dist/components/progress.js +38 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.d.ts +7 -0
- package/dist/components/radio-group.js +57 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/relative-time.d.ts +16 -0
- package/dist/components/relative-time.js +75 -0
- package/dist/components/relative-time.js.map +1 -0
- package/dist/components/resizable.d.ts +10 -0
- package/dist/components/resizable.js +45 -0
- package/dist/components/resizable.js.map +1 -0
- package/dist/components/scroll-area.d.ts +7 -0
- package/dist/components/scroll-area.js +11 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +20 -0
- package/dist/components/select.js +189 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +6 -0
- package/dist/components/separator.js +9 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +16 -0
- package/dist/components/sheet.js +25 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/show-more.d.ts +15 -0
- package/dist/components/show-more.js +79 -0
- package/dist/components/show-more.js.map +1 -0
- package/dist/components/skeleton.d.ts +5 -0
- package/dist/components/skeleton.js +8 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +6 -0
- package/dist/components/slider.js +65 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/snippet.d.ts +13 -0
- package/dist/components/snippet.js +135 -0
- package/dist/components/snippet.js.map +1 -0
- package/dist/components/sonner.d.ts +6 -0
- package/dist/components/sonner.js +10 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/spinner.d.ts +5 -0
- package/dist/components/spinner.js +8 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/stat.d.ts +17 -0
- package/dist/components/stat.js +71 -0
- package/dist/components/stat.js.map +1 -0
- package/dist/components/steps.d.ts +17 -0
- package/dist/components/steps.js +133 -0
- package/dist/components/steps.js.map +1 -0
- package/dist/components/switch.d.ts +8 -0
- package/dist/components/switch.js +44 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +12 -0
- package/dist/components/table.js +101 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +14 -0
- package/dist/components/tabs.js +88 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +5 -0
- package/dist/components/textarea.js +9 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/theme-provider.d.ts +10 -0
- package/dist/components/theme-provider.js +14 -0
- package/dist/components/theme-provider.js.map +1 -0
- package/dist/components/time-picker.d.ts +17 -0
- package/dist/components/time-picker.js +219 -0
- package/dist/components/time-picker.js.map +1 -0
- package/dist/components/timeline.d.ts +17 -0
- package/dist/components/timeline.js +138 -0
- package/dist/components/timeline.js.map +1 -0
- package/dist/components/toggle-group.d.ts +14 -0
- package/dist/components/toggle-group.js +82 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.d.ts +12 -0
- package/dist/components/toggle.js +11 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/tooltip.d.ts +9 -0
- package/dist/components/tooltip.js +15 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/typography.d.ts +17 -0
- package/dist/components/typography.js +91 -0
- package/dist/components/typography.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +7 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-theme.d.ts +3 -0
- package/dist/hooks/use-theme.js +8 -0
- package/dist/hooks/use-theme.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts/center/index.d.ts +18 -0
- package/dist/layouts/center/index.js +73 -0
- package/dist/layouts/center/index.js.map +1 -0
- package/dist/layouts/chat/index.d.ts +42 -0
- package/dist/layouts/chat/index.js +191 -0
- package/dist/layouts/chat/index.js.map +1 -0
- package/dist/layouts/command/index.d.ts +2 -0
- package/dist/layouts/command/index.js +1 -0
- package/dist/layouts/command/index.js.map +1 -0
- package/dist/layouts/panel/index.d.ts +55 -0
- package/dist/layouts/panel/index.js +513 -0
- package/dist/layouts/panel/index.js.map +1 -0
- package/dist/layouts/presentation/index.d.ts +14 -0
- package/dist/layouts/presentation/index.js +100 -0
- package/dist/layouts/presentation/index.js.map +1 -0
- package/dist/layouts/site/index.d.ts +17 -0
- package/dist/layouts/site/index.js +82 -0
- package/dist/layouts/site/index.js.map +1 -0
- package/dist/layouts/window/index.d.ts +223 -0
- package/dist/layouts/window/index.js +127 -0
- package/dist/layouts/window/index.js.map +1 -0
- package/dist/layouts/workbench/index.d.ts +281 -0
- package/dist/layouts/workbench/index.js +2457 -0
- package/dist/layouts/workbench/index.js.map +1 -0
- package/dist/lib/format.d.ts +15 -0
- package/dist/lib/format.js +9 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/theme.d.ts +22 -0
- package/dist/lib/theme.js +25 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +7 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/styles/fonts.css +1 -0
- package/dist/styles/globals.css +717 -0
- package/dist/styles/tokens.css +693 -0
- package/package.json +137 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layouts/window/components/WindowRow.tsx","../src/layouts/window/core/Window.tsx","../src/layouts/window/WindowManager.tsx","../src/layouts/window/core/WindowContext.tsx","../src/layouts/window/core/WindowContent.tsx","../src/layouts/window/core/WindowSidebar.tsx","../src/layouts/window/WindowFlow.tsx","../src/layouts/window/WindowFlowContext.tsx","../src/layouts/window/WindowPage.tsx","../src/layouts/window/WindowPageContext.tsx"],"sourcesContent":["import * as Slot from \"@radix-ui/react-slot\"\n\nimport { Separator } from \"@hyunsdev/ui/components/separator\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nexport function WindowGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-group\"\n className={cn(\"relative mt-4 flex w-full min-w-0 flex-col px-2 py-2 md:px-8\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"window-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-text-muted focus-visible:ring-focus-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WindowGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-group-content\"\n className={cn(\"relative flex w-full min-w-0 flex-col px-2 py-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowRow({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-row\"\n className={cn(\n \"relative flex w-full min-w-0 justify-between gap-2 py-3 first:pt-0 last:pb-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WindowRowContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-row-content\"\n className={cn(\"relative flex w-full min-w-0 flex-col\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowRowTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"window-row-title\" className={cn(\"text text-base\", className)} {...props} />\n}\n\nexport function WindowRowDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-row-description\"\n className={cn(\"text-text-muted text-xs\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowRowActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-row-actions\"\n className={cn(\"relative flex shrink-0 items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowRowSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"window-row-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-window-border w-auto\", className)}\n {...props}\n />\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { XIcon } from \"lucide-react\"\nimport { motion } from \"motion/react\"\n\nimport { Button } from \"@hyunsdev/ui/components/button\"\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@hyunsdev/ui/components/dialog\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport { WindowManagerContext } from \"../WindowManager\"\nimport { useWindow } from \"./WindowContext\"\n\nexport type WindowSize =\n | \"default\"\n | \"content\"\n | {\n height?: React.CSSProperties[\"height\"]\n maxHeight?: React.CSSProperties[\"maxHeight\"]\n maxWidth?: React.CSSProperties[\"maxWidth\"]\n minHeight?: React.CSSProperties[\"minHeight\"]\n minWidth?: React.CSSProperties[\"minWidth\"]\n width?: React.CSSProperties[\"width\"]\n }\n\ntype WindowProps = {\n children: React.ReactNode\n className?: string\n forceMount?: boolean\n showCloseButton?: boolean\n size?: WindowSize\n}\n\ntype WindowCloseButtonProps = Omit<React.ComponentProps<typeof Button>, \"asChild\" | \"children\">\ntype WindowSizeRequest = {\n size: WindowSize | undefined\n token: symbol\n}\ntype WindowSizeContextValue = {\n requestSize: (token: symbol, size: WindowSize | undefined) => void\n}\n\nconst MotionDialogContent = motion.create(DialogContent)\ntype MotionDialogContentStyle = React.ComponentProps<typeof MotionDialogContent>[\"style\"]\nconst WindowSizeContext = React.createContext<WindowSizeContextValue | null>(null)\nconst DEFAULT_WINDOW_SIZE_CLASS =\n \"h-[min(90vh,48rem)] w-[min(1120px,calc(100%-1rem))] max-w-280 sm:max-w-280\"\n\nfunction getWindowSizeClass(size: WindowSize | undefined) {\n if (size === undefined || size === \"default\") {\n return DEFAULT_WINDOW_SIZE_CLASS\n }\n\n return \"max-w-[calc(100%-1rem)] sm:max-w-[calc(100%-1rem)]\"\n}\n\nfunction getWindowSizeStyle(size: WindowSize | undefined): MotionDialogContentStyle {\n if (size === undefined || size === \"default\") {\n return undefined\n }\n\n if (size === \"content\") {\n return {\n height: \"fit-content\",\n maxHeight: \"min(90vh, 48rem)\",\n maxWidth: \"min(1120px, calc(100% - 1rem))\",\n width: \"fit-content\",\n }\n }\n\n return {\n maxHeight: \"min(90vh, 48rem)\",\n maxWidth: \"min(1120px, calc(100% - 1rem))\",\n ...size,\n }\n}\n\nfunction WindowCloseButton({\n className,\n onClick,\n type = \"button\",\n ...props\n}: WindowCloseButtonProps) {\n return (\n <DialogClose asChild>\n <Button\n data-slot=\"window-close-button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n type={type}\n className={cn(\"absolute top-2 right-2 z-10\", className)}\n onClick={onClick}\n {...props}\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogClose>\n )\n}\n\nfunction WindowLayout({\n children,\n className,\n forceMount: forceMountProp,\n showCloseButton = true,\n size,\n}: WindowProps) {\n const windowManager = React.useContext(WindowManagerContext)\n const { blockedInteractionCount, close, forceClose, isOpen, open } = useWindow()\n const [sizeRequest, setSizeRequest] = React.useState<WindowSizeRequest | null>(null)\n const forceMount = forceMountProp ?? windowManager !== null\n const resolvedSize = sizeRequest?.size ?? size\n const sizeContextValue = React.useMemo<WindowSizeContextValue>(\n () => ({\n requestSize: (token, nextSize) => {\n setSizeRequest((currentRequest) => {\n if (nextSize === undefined) {\n return currentRequest?.token === token ? null : currentRequest\n }\n\n return {\n size: nextSize,\n token,\n }\n })\n },\n }),\n [],\n )\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n open()\n\n return\n }\n\n forceClose()\n },\n [forceClose, open],\n )\n const windowSizeStyle = getWindowSizeStyle(resolvedSize)\n\n return (\n <Dialog open={isOpen} onCloseRequest={close} onOpenChange={handleOpenChange}>\n <MotionDialogContent\n layout=\"size\"\n blockedInteractionCount={blockedInteractionCount}\n {...(forceMount === true ? { forceMount: true } : {})}\n showCloseButton={false}\n {...(windowSizeStyle !== undefined ? { style: windowSizeStyle } : {})}\n transition={{\n layout: {\n duration: 0.18,\n ease: [0, 0.5, 0, 1],\n },\n }}\n className={cn(\n \"border-window-border bg-window-background text-window-text shadow-window overflow-hidden rounded-[var(--radius-window)] p-0\",\n getWindowSizeClass(resolvedSize),\n \"flex gap-0\",\n className,\n )}\n >\n <DialogHeader className=\"sr-only\">\n <DialogTitle>Window Layout</DialogTitle>\n <DialogDescription>\n Displays a modal window with a navigation sidebar and context content.\n </DialogDescription>\n </DialogHeader>\n\n <WindowSizeContext.Provider value={sizeContextValue}>\n <div\n data-slot=\"window-layout\"\n className=\"relative flex min-h-0 min-w-0 flex-auto overflow-hidden\"\n >\n {showCloseButton && <WindowCloseButton />}\n <div className=\"pointer-events-none absolute inset-x-0 top-0 h-px bg-white/50 dark:bg-white/10\" />\n <div className=\"flex min-h-0 min-w-0 flex-auto flex-col md:flex-row\">{children}</div>\n </div>\n </WindowSizeContext.Provider>\n </MotionDialogContent>\n </Dialog>\n )\n}\n\nfunction useWindowSizeRequest(size: WindowSize | undefined) {\n const context = React.useContext(WindowSizeContext)\n\n React.useLayoutEffect(() => {\n if (!context) {\n return\n }\n\n const token = Symbol(\"window-size-request\")\n context.requestSize(token, size)\n\n return () => {\n context.requestSize(token, undefined)\n }\n }, [context, size])\n}\n\nexport { WindowCloseButton, WindowLayout, useWindowSizeRequest }\nexport type { WindowCloseButtonProps, WindowProps }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n WindowProvider,\n type WindowCloseReason,\n type WindowContextValue,\n useWindow,\n} from \"./core/WindowContext\"\n\nexport type WindowDefinition = {\n id: string\n onCloseRequest?: ((reason: WindowCloseReason) => boolean | Promise<boolean>) | undefined\n render: () => React.ReactNode\n}\n\ntype WindowManagerContextValue = {\n activeWindowId: string | null\n closeActiveWindow: () => Promise<boolean>\n getWindow: (id: string) => WindowDefinition | undefined\n isOpen: (id: string) => boolean\n openWindow: (id: string) => Promise<boolean>\n registerWindowController: (\n id: string,\n controller: Pick<WindowContextValue, \"close\">,\n ) => () => void\n setWindowOpenState: (id: string, open: boolean) => void\n windows: WindowDefinition[]\n}\n\nexport type WindowManagerProviderProps = {\n children: React.ReactNode\n defaultActiveWindowId?: string | null\n windows: WindowDefinition[]\n}\n\nexport const WindowManagerContext = React.createContext<WindowManagerContextValue | null>(null)\n\nexport function defineWindow<TDefinition extends WindowDefinition>(definition: TDefinition) {\n return definition\n}\n\nexport function WindowManagerProvider({\n children,\n defaultActiveWindowId = null,\n windows,\n}: WindowManagerProviderProps) {\n const windowMap = React.useMemo(() => {\n const nextWindowMap = new Map<string, WindowDefinition>()\n\n windows.forEach((windowDefinition) => {\n if (nextWindowMap.has(windowDefinition.id)) {\n throw new Error(`Duplicate Window id \"${windowDefinition.id}\" is not allowed.`)\n }\n\n nextWindowMap.set(windowDefinition.id, windowDefinition)\n })\n\n return nextWindowMap\n }, [windows])\n\n if (defaultActiveWindowId !== null && !windowMap.has(defaultActiveWindowId)) {\n throw new Error(\n `WindowManagerProvider could not find a registered window for \"${defaultActiveWindowId}\".`,\n )\n }\n\n const [activeWindowId, setActiveWindowId] = React.useState<string | null>(defaultActiveWindowId)\n const activeWindowIdRef = React.useRef(activeWindowId)\n const windowControllersRef = React.useRef(new Map<string, Pick<WindowContextValue, \"close\">>())\n\n React.useEffect(() => {\n activeWindowIdRef.current = activeWindowId\n }, [activeWindowId])\n\n const getWindow = React.useCallback((id: string) => windowMap.get(id), [windowMap])\n\n const isOpen = React.useCallback((id: string) => activeWindowId === id, [activeWindowId])\n\n const registerWindowController = React.useCallback(\n (id: string, controller: Pick<WindowContextValue, \"close\">) => {\n windowControllersRef.current.set(id, controller)\n\n return () => {\n const registeredController = windowControllersRef.current.get(id)\n\n if (registeredController === controller) {\n windowControllersRef.current.delete(id)\n }\n }\n },\n [],\n )\n\n const closeActiveWindow = React.useCallback(async () => {\n const currentActiveWindowId = activeWindowIdRef.current\n\n if (!currentActiveWindowId) {\n return true\n }\n\n const activeWindowController = windowControllersRef.current.get(currentActiveWindowId)\n\n if (!activeWindowController) {\n throw new Error(\n `WindowManagerProvider could not find a controller for \"${currentActiveWindowId}\".`,\n )\n }\n\n return activeWindowController.close(\"programmatic\")\n }, [])\n\n const openWindow = React.useCallback(\n async (id: string) => {\n if (!windowMap.has(id)) {\n throw new Error(`WindowManagerProvider could not find a registered window for \"${id}\".`)\n }\n\n const currentActiveWindowId = activeWindowIdRef.current\n\n if (currentActiveWindowId === id) {\n return true\n }\n\n if (currentActiveWindowId) {\n const activeWindowController = windowControllersRef.current.get(currentActiveWindowId)\n\n if (!activeWindowController) {\n throw new Error(\n `WindowManagerProvider could not find a controller for \"${currentActiveWindowId}\".`,\n )\n }\n\n const closeSucceeded = await activeWindowController.close(\"window-switch\")\n\n if (!closeSucceeded) {\n return false\n }\n }\n\n setActiveWindowId(id)\n\n return true\n },\n [windowMap],\n )\n\n const setWindowOpenState = React.useCallback((id: string, open: boolean) => {\n setActiveWindowId((currentActiveWindowId) => {\n if (open) {\n return id\n }\n\n if (currentActiveWindowId === id) {\n return null\n }\n\n return currentActiveWindowId\n })\n }, [])\n\n const contextValue = React.useMemo(\n () => ({\n activeWindowId,\n closeActiveWindow,\n getWindow,\n isOpen,\n openWindow,\n registerWindowController,\n setWindowOpenState,\n windows,\n }),\n [\n activeWindowId,\n closeActiveWindow,\n getWindow,\n isOpen,\n openWindow,\n registerWindowController,\n setWindowOpenState,\n windows,\n ],\n )\n\n return (\n <WindowManagerContext.Provider value={contextValue}>{children}</WindowManagerContext.Provider>\n )\n}\n\nexport function useWindowManager() {\n const context = React.useContext(WindowManagerContext)\n\n if (!context) {\n throw new Error(\"useWindowManager must be used within a WindowManagerProvider.\")\n }\n\n return context\n}\n\nfunction ManagedWindowControllerBridge({ id }: { id: string }) {\n const { close } = useWindow()\n const { registerWindowController } = useWindowManager()\n\n React.useEffect(\n () => registerWindowController(id, { close }),\n [close, id, registerWindowController],\n )\n\n return null\n}\n\nfunction ManagedWindowInstance({\n definition,\n isOpen,\n}: {\n definition: WindowDefinition\n isOpen: boolean\n}) {\n const { setWindowOpenState } = useWindowManager()\n\n return (\n <WindowProvider\n open={isOpen}\n onCloseRequest={definition.onCloseRequest}\n onOpenChange={(nextOpen) => {\n setWindowOpenState(definition.id, nextOpen)\n }}\n >\n <ManagedWindowControllerBridge id={definition.id} />\n {definition.render()}\n </WindowProvider>\n )\n}\n\nexport function WindowHost() {\n const { activeWindowId, windows } = useWindowManager()\n\n return (\n <>\n {windows.map((windowDefinition) => (\n <ManagedWindowInstance\n key={windowDefinition.id}\n definition={windowDefinition}\n isOpen={activeWindowId === windowDefinition.id}\n />\n ))}\n </>\n )\n}\n","import React from \"react\"\n\nexport type WindowCloseReason =\n | \"close-button\"\n | \"escape-key\"\n | \"outside-click\"\n | \"programmatic\"\n | \"window-switch\"\n\nexport type WindowProviderProps = {\n children: React.ReactNode\n defaultOpen?: boolean\n onCloseRequest?: ((reason: WindowCloseReason) => boolean | Promise<boolean>) | undefined\n onOpenChange?: (open: boolean) => void\n open?: boolean\n}\n\nexport type WindowContextValue = {\n blockedInteractionCount: number\n forceClose: () => void\n isOpen: boolean\n open: () => void\n close: (reason: WindowCloseReason) => Promise<boolean>\n indicateBlockedInteraction: () => void\n toggle: () => void\n}\n\nexport const WindowStateContext = React.createContext<WindowContextValue | null>(null)\n\nexport function WindowStateProvider({\n children,\n value,\n}: {\n children: React.ReactNode\n value: WindowContextValue\n}) {\n return <WindowStateContext.Provider value={value}>{children}</WindowStateContext.Provider>\n}\n\nexport function useWindow() {\n const context = React.useContext(WindowStateContext)\n\n if (!context) {\n throw new Error(\"useWindow must be used within a WindowProvider.\")\n }\n\n return context\n}\n\nfunction resolveOpenState(currentOpen: boolean, nextOpen: React.SetStateAction<boolean>) {\n return typeof nextOpen === \"function\" ? nextOpen(currentOpen) : nextOpen\n}\n\nexport function WindowProvider({\n children,\n defaultOpen = false,\n onCloseRequest,\n onOpenChange,\n open,\n}: WindowProviderProps) {\n const [blockedInteractionCount, setBlockedInteractionCount] = React.useState(0)\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = open !== undefined\n const isOpen = isControlled ? open : uncontrolledOpen\n const isOpenRef = React.useRef(isOpen)\n const closeRequestVersionRef = React.useRef(0)\n\n React.useEffect(() => {\n isOpenRef.current = isOpen\n }, [isOpen])\n\n const forceSetOpen = React.useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n (nextOpen) => {\n const resolvedOpen = resolveOpenState(isOpen, nextOpen)\n\n if (!isControlled) {\n setUncontrolledOpen(resolvedOpen)\n }\n\n onOpenChange?.(resolvedOpen)\n },\n [isControlled, isOpen, onOpenChange],\n )\n\n const openWindow = React.useCallback(() => {\n closeRequestVersionRef.current += 1\n forceSetOpen(true)\n }, [forceSetOpen])\n\n const forceCloseWindow = React.useCallback(() => {\n forceSetOpen(false)\n }, [forceSetOpen])\n\n const indicateBlockedInteraction = React.useCallback(() => {\n setBlockedInteractionCount((currentCount) => currentCount + 1)\n }, [])\n\n const closeWindow = React.useCallback(\n async (reason: WindowCloseReason) => {\n if (!isOpenRef.current) {\n return true\n }\n\n const closeRequestVersion = closeRequestVersionRef.current + 1\n closeRequestVersionRef.current = closeRequestVersion\n const closeAllowed = (await onCloseRequest?.(reason)) ?? true\n\n if (!closeAllowed) {\n return false\n }\n\n if (closeRequestVersion !== closeRequestVersionRef.current) {\n return false\n }\n\n forceCloseWindow()\n\n return true\n },\n [forceCloseWindow, onCloseRequest],\n )\n\n const toggleWindow = React.useCallback(() => {\n if (isOpenRef.current) {\n void closeWindow(\"programmatic\").catch((error) => {\n console.error(\"Failed to toggle window closed.\", error)\n })\n\n return\n }\n\n openWindow()\n }, [closeWindow, openWindow])\n\n const contextValue = React.useMemo(\n () => ({\n blockedInteractionCount,\n close: closeWindow,\n forceClose: forceCloseWindow,\n indicateBlockedInteraction,\n isOpen,\n open: openWindow,\n toggle: toggleWindow,\n }),\n [\n blockedInteractionCount,\n closeWindow,\n forceCloseWindow,\n indicateBlockedInteraction,\n isOpen,\n openWindow,\n toggleWindow,\n ],\n )\n\n return <WindowStateProvider value={contextValue}>{children}</WindowStateProvider>\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { ScrollArea, ScrollBar } from \"@hyunsdev/ui/components/scroll-area\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nexport function WindowContent({\n children,\n className,\n ...props\n}: React.ComponentProps<typeof ScrollArea>) {\n return (\n <ScrollArea\n data-slot=\"window-layout-content\"\n className={cn(\n \"bg-window-background relative flex min-h-0 w-full min-w-0 flex-1 flex-col overflow-auto\",\n className,\n )}\n {...props}\n >\n {children}\n <ScrollBar />\n </ScrollArea>\n )\n}\n","import React from \"react\"\n\nimport * as Slot from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { Input } from \"@hyunsdev/ui/components/input\"\nimport { ScrollArea, ScrollBar } from \"@hyunsdev/ui/components/scroll-area\"\nimport { Skeleton } from \"@hyunsdev/ui/components/skeleton\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@hyunsdev/ui/components/tooltip\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport { useWindow } from \"./WindowContext\"\nimport { sidedockFocusClass, sidedockOutlineStrokeClass, sidedockShellClass } from \"../../_styles\"\n\ntype WindowSidebarSkeletonStyle = React.CSSProperties & {\n readonly \"--skeleton-width\": string\n}\n\nexport type WindowSidebarProps = React.ComponentPropsWithoutRef<\"aside\">\nexport function WindowSidebar({ className, ...props }: WindowSidebarProps) {\n return (\n <aside\n data-slot=\"window-layout-sidebar\"\n className={cn(\n \"border-sidedock-border relative flex max-h-[min(20rem,40vh)] min-h-48 w-full shrink-0 flex-col overflow-auto border-b md:border-r md:border-b-0\",\n sidedockShellClass,\n \"md:h-full md:max-h-none md:w-64\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarContent({\n children,\n className,\n ...props\n}: React.ComponentProps<typeof ScrollArea>) {\n return (\n <ScrollArea\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n >\n {children}\n <ScrollBar />\n </ScrollArea>\n )\n}\n\nexport function WindowSidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidedock-label flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 [&>svg]:size-4 [&>svg]:shrink-0\",\n sidedockFocusClass,\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidedock-text hover:bg-sidedock-hover-background hover:text-sidedock-text-hover absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n sidedockFocusClass,\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n cn(\n \"cursor-pointer peer/menu-button group/menu-button text-sidedock-text flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidedock-hover-background hover:text-sidedock-text-hover active:bg-sidedock-active-background active:text-sidedock-text-active disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidedock-hover-background data-open:hover:text-sidedock-text-hover data-active:bg-sidedock-active-background data-active:text-sidedock-text-active data-active:font-medium [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n sidedockFocusClass,\n ),\n {\n variants: {\n variant: {\n default: \"\",\n outline: cn(\"bg-background-primary text-text-normal\", sidedockOutlineStrokeClass),\n },\n size: {\n default: \"h-7 text-sm\",\n sm: \"h-6 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n)\n\nexport function WindowSidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n leadingVisual,\n trailingVisual,\n trailingVisualVisibility = \"always\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n leadingVisual?: React.ReactNode\n trailingVisual?: React.ReactNode\n trailingVisualVisibility?: \"always\" | \"hover\"\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isOpen } = useWindow()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n >\n {leadingVisual ? (\n <span\n data-slot=\"sidebar-menu-button-leading-visual\"\n className=\"flex shrink-0 items-center justify-center\"\n >\n {leadingVisual}\n </span>\n ) : null}\n <Slot.Slottable>\n <span data-slot=\"sidebar-menu-button-label\" className=\"flex min-w-0 flex-1 truncate\">\n {children}\n </span>\n </Slot.Slottable>\n {trailingVisual ? (\n <span\n data-slot=\"sidebar-menu-button-trailing-visual\"\n className={cn(\n \"ml-auto flex shrink-0 items-center justify-center\",\n trailingVisualVisibility === \"hover\" &&\n \"invisible opacity-0 group-hover/menu-button:visible group-hover/menu-button:opacity-100 group-focus-visible/menu-button:visible group-focus-visible/menu-button:opacity-100\",\n )}\n >\n {trailingVisual}\n </span>\n ) : null}\n </Comp>\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side={\"right\"} align=\"center\" hidden={!isOpen} {...tooltip} />\n </Tooltip>\n )\n}\n\nexport function WindowSidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidedock-text peer-hover/menu-button:text-sidedock-text-hover hover:bg-sidedock-hover-background hover:text-sidedock-text-hover absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n sidedockFocusClass,\n showOnHover &&\n \"peer-data-active/menu-button:text-sidedock-text-active group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WindowSidebarMenuBadge({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidedock-text peer-hover/menu-button:text-sidedock-text-hover peer-data-active/menu-button:text-sidedock-text-active pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1\",\n className,\n )}\n {...props}\n />\n )\n}\nexport function WindowSidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n const skeletonStyle = {\n \"--skeleton-width\": width,\n } satisfies WindowSidebarSkeletonStyle\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={skeletonStyle}\n />\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { ArrowLeftIcon, ArrowRightIcon } from \"lucide-react\"\nimport { AnimatePresence, motion } from \"motion/react\"\n\nimport { Button } from \"@hyunsdev/ui/components/button\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport { useWindowSizeRequest, type WindowSize } from \"./core/Window\"\nimport { useWindowFlow, type WindowFlowDirection, type WindowFlowStepId } from \"./WindowFlowContext\"\n\nexport function WindowFlowLayout({ className, ...props }: React.ComponentProps<\"div\">) {\n const { getStep, step } = useWindowFlow()\n const activeStep = getStep(step)\n const windowSize = React.useMemo(\n () => getFlowStepWindowSize(activeStep?.windowSize),\n [activeStep?.windowSize],\n )\n\n useWindowSizeRequest(windowSize)\n\n return (\n <div\n data-slot=\"window-flow-layout\"\n className={cn(\"flex min-h-0 min-w-0 flex-auto flex-col\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowFlowHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-flow-header\"\n className={cn(\n \"border-window-border flex shrink-0 flex-col gap-3 border-b px-6 py-5\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WindowFlowContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-flow-content\"\n className={cn(\"relative flex min-h-0 min-w-0 flex-auto flex-col overflow-hidden\", className)}\n {...props}\n />\n )\n}\n\nexport function WindowFlowFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"window-flow-footer\"\n className={cn(\n \"border-window-border flex shrink-0 items-center justify-between gap-3 border-t px-6 py-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\ntype FlowPosition = \"previous\" | \"active\" | \"next\"\n\nconst WINDOW_FLOW_EXIT_TRANSITION_DURATION_SECONDS = 0.08\nconst WINDOW_FLOW_ENTER_TRANSITION_DURATION_SECONDS = 0.16\nconst WINDOW_FLOW_ENTER_TRANSITION_DELAY_SECONDS = 0.04\nconst WINDOW_FLOW_EXIT_TRANSITION_OFFSET_PX = 24\nconst WINDOW_FLOW_ENTER_TRANSITION_OFFSET_PX = 48\nconst WINDOW_FLOW_EXIT_X_TRANSITION_EASE: [number, number, number, number] = [0, 0.5, 0, 1]\nconst WINDOW_FLOW_ENTER_X_TRANSITION_EASE: [number, number, number, number] = [0, 0.5, 0, 1]\nconst WINDOW_FLOW_EXIT_OPACITY_TRANSITION_EASE: [number, number, number, number] = [\n 0.35, 0.35, 0.65, 0.65,\n]\nconst WINDOW_FLOW_ENTER_OPACITY_TRANSITION_EASE: [number, number, number, number] = [\n 0.35, 0.35, 0.65, 0.65,\n]\n\nfunction getFlowPosition(stepIndex: number, activeStepIndex: number): FlowPosition {\n if (stepIndex < activeStepIndex) {\n return \"previous\"\n }\n\n if (stepIndex > activeStepIndex) {\n return \"next\"\n }\n\n return \"active\"\n}\n\nfunction getFlowEnterAnimation(direction: WindowFlowDirection) {\n if (direction === \"next\") {\n return {\n x: WINDOW_FLOW_ENTER_TRANSITION_OFFSET_PX,\n opacity: 0,\n }\n }\n\n if (direction === \"previous\") {\n return {\n x: -WINDOW_FLOW_ENTER_TRANSITION_OFFSET_PX,\n opacity: 0,\n }\n }\n\n return {\n x: 0,\n opacity: 1,\n }\n}\n\nfunction getFlowAnimateState(direction: WindowFlowDirection) {\n const delay = direction === \"none\" ? 0 : WINDOW_FLOW_ENTER_TRANSITION_DELAY_SECONDS\n\n return {\n x: 0,\n opacity: 1,\n transition: {\n x: {\n delay,\n duration: WINDOW_FLOW_ENTER_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_ENTER_X_TRANSITION_EASE,\n },\n opacity: {\n delay,\n duration: WINDOW_FLOW_ENTER_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_ENTER_OPACITY_TRANSITION_EASE,\n },\n },\n }\n}\n\nfunction getFlowExitAnimation(direction: WindowFlowDirection) {\n if (direction === \"next\") {\n return {\n x: -WINDOW_FLOW_EXIT_TRANSITION_OFFSET_PX,\n opacity: 0,\n transition: {\n x: {\n duration: WINDOW_FLOW_EXIT_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_EXIT_X_TRANSITION_EASE,\n },\n opacity: {\n duration: WINDOW_FLOW_EXIT_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_EXIT_OPACITY_TRANSITION_EASE,\n },\n },\n }\n }\n\n if (direction === \"previous\") {\n return {\n x: WINDOW_FLOW_EXIT_TRANSITION_OFFSET_PX,\n opacity: 0,\n transition: {\n x: {\n duration: WINDOW_FLOW_EXIT_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_EXIT_X_TRANSITION_EASE,\n },\n opacity: {\n duration: WINDOW_FLOW_EXIT_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_EXIT_OPACITY_TRANSITION_EASE,\n },\n },\n }\n }\n\n return {\n x: 0,\n opacity: 0,\n transition: {\n x: {\n duration: WINDOW_FLOW_EXIT_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_EXIT_X_TRANSITION_EASE,\n },\n opacity: {\n duration: WINDOW_FLOW_EXIT_TRANSITION_DURATION_SECONDS,\n ease: WINDOW_FLOW_EXIT_OPACITY_TRANSITION_EASE,\n },\n },\n }\n}\n\nconst windowFlowViewVariants = {\n center: getFlowAnimateState,\n enter: getFlowEnterAnimation,\n exit: getFlowExitAnimation,\n}\n\nfunction getFlowInitialState(direction: WindowFlowDirection) {\n return direction === \"none\" ? false : \"enter\"\n}\n\nfunction getFlowStepWindowSize(size: WindowSize | undefined): WindowSize | undefined {\n if (typeof size === \"object\" && size.height === undefined && size.minHeight !== undefined) {\n return {\n ...size,\n height: size.minHeight,\n }\n }\n\n return size\n}\n\nfunction shouldMeasureFlowStepSize(size: WindowSize | undefined) {\n if (size === \"content\") {\n return true\n }\n\n return typeof size === \"object\" && size.height === undefined\n}\n\nfunction useElementHeight<TElement extends HTMLElement>() {\n const elementRef = React.useRef<TElement | null>(null)\n const resizeObserverRef = React.useRef<ResizeObserver | null>(null)\n const [height, setHeight] = React.useState<number | null>(null)\n\n const updateHeight = React.useCallback((element: TElement | null) => {\n const nextHeight = element ? element.getBoundingClientRect().height : null\n\n setHeight((currentHeight) => (currentHeight === nextHeight ? currentHeight : nextHeight))\n }, [])\n\n const ref = React.useCallback(\n (element: TElement | null) => {\n resizeObserverRef.current?.disconnect()\n resizeObserverRef.current = null\n elementRef.current = element\n\n if (!element) {\n return\n }\n\n updateHeight(element)\n\n if (element && typeof ResizeObserver !== \"undefined\") {\n resizeObserverRef.current = new ResizeObserver(([entry]) => {\n if (!entry) {\n return\n }\n\n setHeight(entry.contentRect.height)\n })\n resizeObserverRef.current.observe(element)\n }\n },\n [updateHeight],\n )\n\n React.useEffect(() => {\n return () => {\n resizeObserverRef.current?.disconnect()\n }\n }, [])\n\n React.useLayoutEffect(() => {\n updateHeight(elementRef.current)\n })\n\n return [ref, height] as const\n}\n\nfunction getFlowViewLayoutClass(measuredSize: boolean, activeViewHeight: number | null) {\n if (!measuredSize) {\n return \"absolute inset-0\"\n }\n\n if (activeViewHeight === null) {\n return \"relative w-full\"\n }\n\n return \"absolute inset-x-0 top-0\"\n}\n\nexport type WindowFlowViewProps = React.ComponentProps<typeof motion.div> & {\n direction?: WindowFlowDirection\n pageIndex?: number\n step: WindowFlowStepId\n}\n\nexport function WindowFlowView({\n children,\n className,\n direction: directionProp,\n pageIndex,\n step,\n ...props\n}: WindowFlowViewProps) {\n const { direction, stepIndex, steps } = useWindowFlow()\n const ownStepIndex = pageIndex ?? steps.findIndex((stepDefinition) => stepDefinition.id === step)\n const active = ownStepIndex === stepIndex\n const position = getFlowPosition(ownStepIndex, stepIndex)\n const resolvedDirection = directionProp ?? direction\n\n return (\n <motion.div\n data-slot=\"window-flow-view\"\n data-active={active}\n data-flow-direction={resolvedDirection}\n data-flow-position={position}\n data-step={step}\n aria-hidden={!active}\n className={cn(\n \"min-h-0 min-w-0 overflow-auto motion-reduce:transform-none!\",\n active ? \"pointer-events-auto\" : \"pointer-events-none\",\n className,\n )}\n custom={resolvedDirection}\n variants={windowFlowViewVariants}\n initial={getFlowInitialState(resolvedDirection)}\n animate=\"center\"\n exit=\"exit\"\n {...props}\n >\n {children}\n </motion.div>\n )\n}\n\nexport type WindowFlowViewsProps = Omit<React.ComponentProps<typeof motion.div>, \"children\"> & {\n children?: React.ReactNode\n}\n\nexport function WindowFlowViews({ children, className, style, ...props }: WindowFlowViewsProps) {\n const { direction, getStep, step, steps } = useWindowFlow()\n\n if (steps.length === 0) {\n throw new Error(\"WindowFlowViews requires registered steps on WindowFlowProvider.\")\n }\n\n const activeStep = getStep(step)\n\n if (!activeStep) {\n throw new Error(`WindowFlowViews could not find a registered step for \"${step}\".`)\n }\n\n const activeWindowSize = getFlowStepWindowSize(activeStep.windowSize)\n const [activeViewRef, activeViewHeight] = useElementHeight<HTMLDivElement>()\n const measuredSize = shouldMeasureFlowStepSize(activeWindowSize)\n\n return (\n <motion.div\n data-slot=\"window-flow-views\"\n data-flow-direction={direction}\n className={cn(\"relative flex min-h-0 min-w-0 flex-auto overflow-hidden\", className)}\n style={{\n ...style,\n ...(measuredSize && activeViewHeight !== null ? { height: activeViewHeight } : null),\n }}\n {...props}\n >\n {children}\n <AnimatePresence custom={direction} initial={false}>\n <motion.div\n key={activeStep.id}\n custom={direction}\n data-slot=\"window-flow-view\"\n data-active\n data-flow-direction={direction}\n data-flow-position=\"active\"\n data-step={activeStep.id}\n ref={activeViewRef}\n className={cn(\n \"min-h-0 min-w-0 overflow-auto motion-reduce:transform-none!\",\n getFlowViewLayoutClass(measuredSize, activeViewHeight),\n )}\n variants={windowFlowViewVariants}\n initial={getFlowInitialState(direction)}\n animate=\"center\"\n exit=\"exit\"\n >\n {activeStep.render()}\n </motion.div>\n </AnimatePresence>\n </motion.div>\n )\n}\n\nexport type WindowFlowPreviousButtonProps = React.ComponentProps<typeof Button>\n\nexport function WindowFlowPreviousButton({\n children = \"Back\",\n disabled,\n onClick,\n type = \"button\",\n variant = \"outline\",\n ...props\n}: WindowFlowPreviousButtonProps) {\n const { canGoPrevious, previousStep } = useWindowFlow()\n\n return (\n <Button\n disabled={disabled ?? !canGoPrevious}\n onClick={(event) => {\n onClick?.(event)\n\n if (!event.defaultPrevented) {\n void previousStep(\"previous-button\").catch((error) => {\n console.error(\"Failed to move to the previous window flow step.\", error)\n })\n }\n }}\n type={type}\n variant={variant}\n {...props}\n >\n <ArrowLeftIcon />\n {children}\n </Button>\n )\n}\n\nexport type WindowFlowNextButtonProps = React.ComponentProps<typeof Button>\n\nexport function WindowFlowNextButton({\n children,\n disabled,\n onClick,\n type = \"button\",\n variant = \"accent\",\n ...props\n}: WindowFlowNextButtonProps) {\n const { canGoNext, isLastStep, nextStep } = useWindowFlow()\n\n return (\n <Button\n disabled={disabled ?? !canGoNext}\n onClick={(event) => {\n onClick?.(event)\n\n if (!event.defaultPrevented) {\n void nextStep(\"next-button\").catch((error) => {\n console.error(\"Failed to move to the next window flow step.\", error)\n })\n }\n }}\n type={type}\n variant={variant}\n {...props}\n >\n {children ?? (isLastStep ? \"Done\" : \"Next\")}\n <ArrowRightIcon />\n </Button>\n )\n}\n\nexport type WindowFlowProgressProps = React.ComponentProps<\"div\">\n\nexport function WindowFlowProgress({ className, ...props }: WindowFlowProgressProps) {\n const { stepIndex, steps } = useWindowFlow()\n\n return (\n <div\n data-slot=\"window-flow-progress\"\n className={cn(\"flex w-full items-center gap-1.5\", className)}\n {...props}\n >\n {steps.map((stepDefinition, index) => (\n <div\n key={stepDefinition.id}\n data-active={index === stepIndex}\n data-complete={index < stepIndex}\n data-slot=\"window-flow-progress-segment\"\n className={cn(\n \"bg-background-tertiary h-1.5 min-w-0 flex-1 rounded-full transition-colors\",\n index <= stepIndex && \"bg-interactive-accent\",\n )}\n />\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { WindowStateContext } from \"./core/WindowContext\"\n\nimport type { WindowSize } from \"./core/Window\"\n\nexport type WindowFlowStepId = string\nexport type WindowFlowDirection = \"previous\" | \"next\" | \"none\"\nexport type WindowFlowChangeReason = \"previous-button\" | \"next-button\" | \"programmatic\"\nexport type WindowFlowChangeRequest = {\n from: WindowFlowStepId\n to: WindowFlowStepId\n reason: WindowFlowChangeReason\n}\nexport type WindowFlowStepDefinition = {\n id: WindowFlowStepId\n label: React.ReactNode\n render: () => React.ReactNode\n windowSize?: WindowSize\n}\n\ntype WindowFlowContextValue = {\n canGoNext: boolean\n canGoPrevious: boolean\n direction: WindowFlowDirection\n getStep: (targetStep: WindowFlowStepId) => WindowFlowStepDefinition | undefined\n isFirstStep: boolean\n isLastStep: boolean\n nextStep: (reason?: WindowFlowChangeReason) => Promise<boolean>\n previousStep: (reason?: WindowFlowChangeReason) => Promise<boolean>\n setStep: (nextStep: WindowFlowStepId, reason?: WindowFlowChangeReason) => Promise<boolean>\n step: WindowFlowStepId\n stepIndex: number\n steps: WindowFlowStepDefinition[]\n}\n\ntype ControlledWindowFlowProviderProps = {\n children: React.ReactNode\n defaultStep?: WindowFlowStepId\n onStepChangeRequest?: (request: WindowFlowChangeRequest) => boolean | Promise<boolean>\n onStepChange?: (nextStep: WindowFlowStepId) => void\n step: WindowFlowStepId\n steps: WindowFlowStepDefinition[]\n}\n\ntype UncontrolledWindowFlowProviderProps = {\n children: React.ReactNode\n defaultStep: WindowFlowStepId\n onStepChangeRequest?: (request: WindowFlowChangeRequest) => boolean | Promise<boolean>\n onStepChange?: (nextStep: WindowFlowStepId) => void\n step?: undefined\n steps: WindowFlowStepDefinition[]\n}\n\nexport type WindowFlowProviderProps =\n | ControlledWindowFlowProviderProps\n | UncontrolledWindowFlowProviderProps\n\nconst WindowFlowContext = React.createContext<WindowFlowContextValue | null>(null)\n\nexport function defineWindowFlowStep<TDefinition extends WindowFlowStepDefinition>(\n definition: TDefinition,\n) {\n return definition\n}\n\nexport function WindowFlowProvider({\n children,\n defaultStep,\n onStepChangeRequest,\n onStepChange,\n step,\n steps,\n}: WindowFlowProviderProps) {\n const windowContext = React.useContext(WindowStateContext)\n const stepMap = React.useMemo(() => {\n const nextStepMap = new Map<WindowFlowStepId, WindowFlowStepDefinition>()\n\n steps.forEach((stepDefinition) => {\n if (nextStepMap.has(stepDefinition.id)) {\n throw new Error(`Duplicate WindowFlow step id \"${stepDefinition.id}\" is not allowed.`)\n }\n\n nextStepMap.set(stepDefinition.id, stepDefinition)\n })\n\n return nextStepMap\n }, [steps])\n const initialStep = step ?? defaultStep\n\n if (initialStep === undefined) {\n throw new Error(\"WindowFlowProvider requires a step or defaultStep.\")\n }\n\n if (!stepMap.has(initialStep)) {\n throw new Error(`WindowFlowProvider could not find a registered step for \"${initialStep}\".`)\n }\n\n const [uncontrolledStep, setUncontrolledStep] = React.useState<WindowFlowStepId>(initialStep)\n const [direction, setDirection] = React.useState<WindowFlowDirection>(\"none\")\n const isControlled = step !== undefined\n const activeStep = isControlled ? step : uncontrolledStep\n const activeStepRef = React.useRef(activeStep)\n const stepChangeRequestVersionRef = React.useRef(0)\n const indicateBlockedInteraction = windowContext?.indicateBlockedInteraction\n const activeStepIndex = steps.findIndex((stepDefinition) => stepDefinition.id === activeStep)\n\n if (activeStepIndex === -1) {\n throw new Error(`WindowFlowProvider could not find a registered step for \"${activeStep}\".`)\n }\n\n React.useEffect(() => {\n activeStepRef.current = activeStep\n }, [activeStep])\n\n const getStep = React.useCallback(\n (targetStep: WindowFlowStepId) => stepMap.get(targetStep),\n [stepMap],\n )\n\n const setFlowStep = React.useCallback(\n async (nextStep: WindowFlowStepId, reason: WindowFlowChangeReason = \"programmatic\") => {\n const currentStep = activeStepRef.current\n\n if (nextStep === currentStep) {\n return true\n }\n\n if (!stepMap.has(nextStep)) {\n throw new Error(`WindowFlowProvider could not find a registered step for \"${nextStep}\".`)\n }\n\n const currentStepIndex = steps.findIndex(\n (stepDefinition) => stepDefinition.id === currentStep,\n )\n const nextStepIndex = steps.findIndex((stepDefinition) => stepDefinition.id === nextStep)\n const nextDirection: WindowFlowDirection =\n nextStepIndex > currentStepIndex\n ? \"next\"\n : nextStepIndex < currentStepIndex\n ? \"previous\"\n : \"none\"\n const stepChangeRequestVersion = stepChangeRequestVersionRef.current + 1\n stepChangeRequestVersionRef.current = stepChangeRequestVersion\n const stepChangeAllowed =\n (await onStepChangeRequest?.({\n from: currentStep,\n reason,\n to: nextStep,\n })) ?? true\n\n if (!stepChangeAllowed) {\n indicateBlockedInteraction?.()\n return false\n }\n\n if (stepChangeRequestVersion !== stepChangeRequestVersionRef.current) {\n return false\n }\n\n setDirection(nextDirection)\n\n if (!isControlled) {\n setUncontrolledStep(nextStep)\n }\n\n onStepChange?.(nextStep)\n\n return true\n },\n [indicateBlockedInteraction, isControlled, onStepChange, onStepChangeRequest, stepMap, steps],\n )\n\n const previousStep = React.useCallback(\n (reason: WindowFlowChangeReason = \"programmatic\") => {\n const currentStepIndex = steps.findIndex(\n (stepDefinition) => stepDefinition.id === activeStepRef.current,\n )\n const previousStepDefinition = steps[currentStepIndex - 1]\n\n if (!previousStepDefinition) {\n return Promise.resolve(false)\n }\n\n return setFlowStep(previousStepDefinition.id, reason)\n },\n [setFlowStep, steps],\n )\n\n const nextStep = React.useCallback(\n (reason: WindowFlowChangeReason = \"programmatic\") => {\n const currentStepIndex = steps.findIndex(\n (stepDefinition) => stepDefinition.id === activeStepRef.current,\n )\n const nextStepDefinition = steps[currentStepIndex + 1]\n\n if (!nextStepDefinition) {\n return Promise.resolve(false)\n }\n\n return setFlowStep(nextStepDefinition.id, reason)\n },\n [setFlowStep, steps],\n )\n\n const contextValue = React.useMemo(\n () => ({\n canGoNext: activeStepIndex < steps.length - 1,\n canGoPrevious: activeStepIndex > 0,\n direction,\n getStep,\n isFirstStep: activeStepIndex === 0,\n isLastStep: activeStepIndex === steps.length - 1,\n nextStep,\n previousStep,\n setStep: setFlowStep,\n step: activeStep,\n stepIndex: activeStepIndex,\n steps,\n }),\n [activeStep, activeStepIndex, direction, getStep, nextStep, previousStep, setFlowStep, steps],\n )\n\n return <WindowFlowContext.Provider value={contextValue}>{children}</WindowFlowContext.Provider>\n}\n\nexport function useWindowFlow() {\n const context = React.useContext(WindowFlowContext)\n\n if (!context) {\n throw new Error(\"useWindowFlow must be used within a WindowFlowProvider.\")\n }\n\n return context\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport {\n WindowSidebarMenu,\n WindowSidebarMenuButton,\n WindowSidebarMenuItem,\n} from \"./core/WindowSidebar\"\nimport { useWindowPage, type WindowPageDefinition, type WindowPageId } from \"./WindowPageContext\"\n\nexport type WindowPageNavButtonProps = Omit<\n React.ComponentProps<typeof WindowSidebarMenuButton>,\n \"isActive\"\n> & {\n page: WindowPageId\n}\n\nexport function WindowPageNavButton({ onClick, page, ...props }: WindowPageNavButtonProps) {\n const { isActive, setPage } = useWindowPage()\n\n return (\n <WindowSidebarMenuButton\n data-slot=\"window-page-nav-button\"\n isActive={isActive(page)}\n onClick={(event) => {\n onClick?.(event)\n\n if (!event.defaultPrevented) {\n void setPage(page, \"nav-button\").catch((error) => {\n console.error(\"Failed to change window page from nav button.\", error)\n })\n }\n }}\n {...props}\n />\n )\n}\n\nfunction useRegisteredWindowPages() {\n const context = useWindowPage()\n\n if (context.pages.length === 0) {\n throw new Error(\n \"WindowPageList and WindowPageViews require registered pages on WindowPageProvider.\",\n )\n }\n\n return context\n}\n\nexport type WindowPageViewProps = React.ComponentProps<\"div\"> & {\n keepMounted?: boolean | undefined\n page: WindowPageId\n}\n\nexport function WindowPageView({\n children,\n className,\n keepMounted = false,\n page,\n ...props\n}: WindowPageViewProps) {\n const { isActive } = useWindowPage()\n const active = isActive(page)\n\n if (!keepMounted && !active) {\n return null\n }\n\n return (\n <div\n data-slot=\"window-page-view\"\n data-active={active}\n data-page={page}\n aria-hidden={!active}\n hidden={!active}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport type WindowPageListProps = React.ComponentProps<typeof WindowSidebarMenu>\n\nexport function WindowPageList({ className, ...props }: WindowPageListProps) {\n const { pages } = useRegisteredWindowPages()\n\n return (\n <WindowSidebarMenu data-slot=\"window-page-list\" className={cn(className)} {...props}>\n {pages.map((pageDefinition) => {\n const Icon = pageDefinition.icon\n\n return (\n <WindowSidebarMenuItem key={pageDefinition.id}>\n <WindowPageNavButton\n page={pageDefinition.id}\n leadingVisual={Icon ? <Icon className=\"size-4\" /> : undefined}\n >\n {pageDefinition.label}\n </WindowPageNavButton>\n </WindowSidebarMenuItem>\n )\n })}\n </WindowSidebarMenu>\n )\n}\n\nexport type WindowPageViewsProps = React.ComponentProps<\"div\">\n\nexport function WindowPageViews({ children, className, ...props }: WindowPageViewsProps) {\n const { pages } = useRegisteredWindowPages()\n\n return (\n <div data-slot=\"window-page-views\" className={cn(className)} {...props}>\n {children}\n {pages.map((pageDefinition: WindowPageDefinition) => (\n <WindowPageView\n key={pageDefinition.id}\n page={pageDefinition.id}\n keepMounted={pageDefinition.keepMounted}\n >\n {pageDefinition.render()}\n </WindowPageView>\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { WindowStateContext } from \"./core/WindowContext\"\n\nexport type WindowPageId = string\nexport type WindowPageChangeReason = \"nav-button\" | \"programmatic\"\nexport type WindowPageChangeRequest = {\n from: WindowPageId\n to: WindowPageId\n reason: WindowPageChangeReason\n}\nexport type WindowPageDefinition = {\n id: WindowPageId\n label: React.ReactNode\n icon?: React.ComponentType<{ className?: string }>\n render: () => React.ReactNode\n keepMounted?: boolean | undefined\n}\n\ntype WindowPageContextValue = {\n getPage: (targetPage: WindowPageId) => WindowPageDefinition | undefined\n pages: WindowPageDefinition[]\n page: WindowPageId\n setPage: (nextPage: WindowPageId, reason?: WindowPageChangeReason) => Promise<boolean>\n isActive: (targetPage: WindowPageId) => boolean\n}\n\ntype ControlledWindowPageProviderProps = {\n children: React.ReactNode\n defaultPage?: WindowPageId\n onPageChangeRequest?: (request: WindowPageChangeRequest) => boolean | Promise<boolean>\n onPageChange?: (nextPage: WindowPageId) => void\n pages?: WindowPageDefinition[]\n page: WindowPageId\n}\n\ntype UncontrolledWindowPageProviderProps = {\n children: React.ReactNode\n defaultPage: WindowPageId\n onPageChangeRequest?: (request: WindowPageChangeRequest) => boolean | Promise<boolean>\n onPageChange?: (nextPage: WindowPageId) => void\n pages?: WindowPageDefinition[]\n page?: undefined\n}\n\nexport type WindowPageProviderProps =\n | ControlledWindowPageProviderProps\n | UncontrolledWindowPageProviderProps\n\nconst WindowPageContext = React.createContext<WindowPageContextValue | null>(null)\n\nexport function defineWindowPage<TDefinition extends WindowPageDefinition>(\n definition: TDefinition,\n) {\n return definition\n}\n\nexport function WindowPageProvider({\n children,\n defaultPage,\n onPageChangeRequest,\n onPageChange,\n pages = [],\n page,\n}: WindowPageProviderProps) {\n const windowContext = React.useContext(WindowStateContext)\n const pageMap = React.useMemo(() => {\n const nextPageMap = new Map<WindowPageId, WindowPageDefinition>()\n\n pages.forEach((pageDefinition) => {\n if (nextPageMap.has(pageDefinition.id)) {\n throw new Error(`Duplicate WindowPage id \"${pageDefinition.id}\" is not allowed.`)\n }\n\n nextPageMap.set(pageDefinition.id, pageDefinition)\n })\n\n return nextPageMap\n }, [pages])\n const initialPage = page ?? defaultPage\n\n if (initialPage === undefined) {\n throw new Error(\"WindowPageProvider requires a page or defaultPage.\")\n }\n\n if (pages.length > 0 && !pageMap.has(initialPage)) {\n throw new Error(`WindowPageProvider could not find a registered page for \"${initialPage}\".`)\n }\n\n const [uncontrolledPage, setUncontrolledPage] = React.useState<WindowPageId>(initialPage)\n const isControlled = page !== undefined\n const activePage = isControlled ? page : uncontrolledPage\n const activePageRef = React.useRef(activePage)\n const pageChangeRequestVersionRef = React.useRef(0)\n const indicateBlockedInteraction = windowContext?.indicateBlockedInteraction\n\n if (pages.length > 0 && !pageMap.has(activePage)) {\n throw new Error(`WindowPageProvider could not find a registered page for \"${activePage}\".`)\n }\n\n React.useEffect(() => {\n activePageRef.current = activePage\n }, [activePage])\n\n const getPage = React.useCallback(\n (targetPage: WindowPageId) => pageMap.get(targetPage),\n [pageMap],\n )\n\n const setPage = React.useCallback(\n async (nextPage: WindowPageId, reason: WindowPageChangeReason = \"programmatic\") => {\n const currentPage = activePageRef.current\n\n if (nextPage === currentPage) {\n return true\n }\n\n if (pages.length > 0 && !pageMap.has(nextPage)) {\n throw new Error(`WindowPageProvider could not find a registered page for \"${nextPage}\".`)\n }\n\n const pageChangeRequestVersion = pageChangeRequestVersionRef.current + 1\n pageChangeRequestVersionRef.current = pageChangeRequestVersion\n const pageChangeAllowed =\n (await onPageChangeRequest?.({\n from: currentPage,\n reason,\n to: nextPage,\n })) ?? true\n\n if (!pageChangeAllowed) {\n indicateBlockedInteraction?.()\n return false\n }\n\n if (pageChangeRequestVersion !== pageChangeRequestVersionRef.current) {\n return false\n }\n\n if (!isControlled) {\n setUncontrolledPage(nextPage)\n }\n\n onPageChange?.(nextPage)\n\n return true\n },\n [\n indicateBlockedInteraction,\n isControlled,\n onPageChange,\n onPageChangeRequest,\n pageMap,\n pages.length,\n ],\n )\n\n const isActive = React.useCallback(\n (targetPage: WindowPageId) => activePage === targetPage,\n [activePage],\n )\n\n const contextValue = React.useMemo(\n () => ({\n getPage,\n isActive,\n pages,\n page: activePage,\n setPage,\n }),\n [activePage, getPage, isActive, pages, setPage],\n )\n\n return <WindowPageContext.Provider value={contextValue}>{children}</WindowPageContext.Provider>\n}\n\nexport function useWindowPage() {\n const context = React.useContext(WindowPageContext)\n\n if (!context) {\n throw new Error(\"useWindowPage must be used within a WindowPageProvider.\")\n }\n\n return context\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,YAAY,UAAU;AAOlB;AAFG,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AAChF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,gEAAgE,SAAS;AAAA,MACtF,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAAwD;AACtD,QAAM,OAAO,UAAe,YAAO;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,mBAAmB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACvF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,mDAAmD,SAAS;AAAA,MACzE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,UAAU,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACrF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,yCAAyC,SAAS;AAAA,MAC/D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAgC;AACnF,SAAO,oBAAC,SAAI,aAAU,oBAAmB,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,OAAO;AAClG;AAEO,SAAS,qBAAqB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACrF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6CAA6C,SAAS;AAAA,MACnE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,GAAG;AACL,GAA2C;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACtGA,YAAYA,YAAW;AAEvB,SAAS,aAAa;AACtB,SAAS,cAAc;;;ACHvB,YAAYC,YAAW;;;ACFvB,OAAO,WAAW;AAoCT,gBAAAC,YAAA;AATF,IAAM,qBAAqB,MAAM,cAAyC,IAAI;AAE9E,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGG;AACD,SAAO,gBAAAA,KAAC,mBAAmB,UAAnB,EAA4B,OAAe,UAAS;AAC9D;AAEO,SAAS,YAAY;AAC1B,QAAM,UAAU,MAAM,WAAW,kBAAkB;AAEnD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,aAAsB,UAAyC;AACvF,SAAO,OAAO,aAAa,aAAa,SAAS,WAAW,IAAI;AAClE;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,MAAM,SAAS,CAAC;AAC9E,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,WAAW;AAC1E,QAAM,eAAe,SAAS;AAC9B,QAAM,SAAS,eAAe,OAAO;AACrC,QAAM,YAAY,MAAM,OAAO,MAAM;AACrC,QAAM,yBAAyB,MAAM,OAAO,CAAC;AAE7C,QAAM,UAAU,MAAM;AACpB,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,aAAa;AACZ,YAAM,eAAe,iBAAiB,QAAQ,QAAQ;AAEtD,UAAI,CAAC,cAAc;AACjB,4BAAoB,YAAY;AAAA,MAClC;AAEA,qBAAe,YAAY;AAAA,IAC7B;AAAA,IACA,CAAC,cAAc,QAAQ,YAAY;AAAA,EACrC;AAEA,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,2BAAuB,WAAW;AAClC,iBAAa,IAAI;AAAA,EACnB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,mBAAmB,MAAM,YAAY,MAAM;AAC/C,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,6BAA6B,MAAM,YAAY,MAAM;AACzD,+BAA2B,CAAC,iBAAiB,eAAe,CAAC;AAAA,EAC/D,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAM;AAAA,IACxB,OAAO,WAA8B;AACnC,UAAI,CAAC,UAAU,SAAS;AACtB,eAAO;AAAA,MACT;AAEA,YAAM,sBAAsB,uBAAuB,UAAU;AAC7D,6BAAuB,UAAU;AACjC,YAAM,eAAgB,MAAM,iBAAiB,MAAM,KAAM;AAEzD,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,MACT;AAEA,UAAI,wBAAwB,uBAAuB,SAAS;AAC1D,eAAO;AAAA,MACT;AAEA,uBAAiB;AAEjB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,kBAAkB,cAAc;AAAA,EACnC;AAEA,QAAM,eAAe,MAAM,YAAY,MAAM;AAC3C,QAAI,UAAU,SAAS;AACrB,WAAK,YAAY,cAAc,EAAE,MAAM,CAAC,UAAU;AAChD,gBAAQ,MAAM,mCAAmC,KAAK;AAAA,MACxD,CAAC;AAED;AAAA,IACF;AAEA,eAAW;AAAA,EACb,GAAG,CAAC,aAAa,UAAU,CAAC;AAE5B,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,gBAAAA,KAAC,uBAAoB,OAAO,cAAe,UAAS;AAC7D;;;AD8BI,SAqDA,UArDA,OAAAC,MAoCA,YApCA;AArJG,IAAM,uBAA6B,qBAAgD,IAAI;AAEvF,SAAS,aAAmD,YAAyB;AAC1F,SAAO;AACT;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,wBAAwB;AAAA,EACxB;AACF,GAA+B;AAC7B,QAAM,YAAkB,eAAQ,MAAM;AACpC,UAAM,gBAAgB,oBAAI,IAA8B;AAExD,YAAQ,QAAQ,CAAC,qBAAqB;AACpC,UAAI,cAAc,IAAI,iBAAiB,EAAE,GAAG;AAC1C,cAAM,IAAI,MAAM,wBAAwB,iBAAiB,EAAE,mBAAmB;AAAA,MAChF;AAEA,oBAAc,IAAI,iBAAiB,IAAI,gBAAgB;AAAA,IACzD,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,MAAI,0BAA0B,QAAQ,CAAC,UAAU,IAAI,qBAAqB,GAAG;AAC3E,UAAM,IAAI;AAAA,MACR,iEAAiE,qBAAqB;AAAA,IACxF;AAAA,EACF;AAEA,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,gBAAwB,qBAAqB;AAC/F,QAAM,oBAA0B,cAAO,cAAc;AACrD,QAAM,uBAA6B,cAAO,oBAAI,IAA+C,CAAC;AAE9F,EAAM,iBAAU,MAAM;AACpB,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,YAAkB,mBAAY,CAAC,OAAe,UAAU,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC;AAElF,QAAM,SAAe,mBAAY,CAAC,OAAe,mBAAmB,IAAI,CAAC,cAAc,CAAC;AAExF,QAAM,2BAAiC;AAAA,IACrC,CAAC,IAAY,eAAkD;AAC7D,2BAAqB,QAAQ,IAAI,IAAI,UAAU;AAE/C,aAAO,MAAM;AACX,cAAM,uBAAuB,qBAAqB,QAAQ,IAAI,EAAE;AAEhE,YAAI,yBAAyB,YAAY;AACvC,+BAAqB,QAAQ,OAAO,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,oBAA0B,mBAAY,YAAY;AACtD,UAAM,wBAAwB,kBAAkB;AAEhD,QAAI,CAAC,uBAAuB;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,yBAAyB,qBAAqB,QAAQ,IAAI,qBAAqB;AAErF,QAAI,CAAC,wBAAwB;AAC3B,YAAM,IAAI;AAAA,QACR,0DAA0D,qBAAqB;AAAA,MACjF;AAAA,IACF;AAEA,WAAO,uBAAuB,MAAM,cAAc;AAAA,EACpD,GAAG,CAAC,CAAC;AAEL,QAAM,aAAmB;AAAA,IACvB,OAAO,OAAe;AACpB,UAAI,CAAC,UAAU,IAAI,EAAE,GAAG;AACtB,cAAM,IAAI,MAAM,iEAAiE,EAAE,IAAI;AAAA,MACzF;AAEA,YAAM,wBAAwB,kBAAkB;AAEhD,UAAI,0BAA0B,IAAI;AAChC,eAAO;AAAA,MACT;AAEA,UAAI,uBAAuB;AACzB,cAAM,yBAAyB,qBAAqB,QAAQ,IAAI,qBAAqB;AAErF,YAAI,CAAC,wBAAwB;AAC3B,gBAAM,IAAI;AAAA,YACR,0DAA0D,qBAAqB;AAAA,UACjF;AAAA,QACF;AAEA,cAAM,iBAAiB,MAAM,uBAAuB,MAAM,eAAe;AAEzE,YAAI,CAAC,gBAAgB;AACnB,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,wBAAkB,EAAE;AAEpB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,qBAA2B,mBAAY,CAAC,IAAY,SAAkB;AAC1E,sBAAkB,CAAC,0BAA0B;AAC3C,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAEA,UAAI,0BAA0B,IAAI;AAChC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,eAAqB;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAA,KAAC,qBAAqB,UAArB,EAA8B,OAAO,cAAe,UAAS;AAElE;AAEO,SAAS,mBAAmB;AACjC,QAAM,UAAgB,kBAAW,oBAAoB;AAErD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,EAAE,GAAG,GAAmB;AAC7D,QAAM,EAAE,MAAM,IAAI,UAAU;AAC5B,QAAM,EAAE,yBAAyB,IAAI,iBAAiB;AAEtD,EAAM;AAAA,IACJ,MAAM,yBAAyB,IAAI,EAAE,MAAM,CAAC;AAAA,IAC5C,CAAC,OAAO,IAAI,wBAAwB;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,mBAAmB,IAAI,iBAAiB;AAEhD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,gBAAgB,WAAW;AAAA,MAC3B,cAAc,CAAC,aAAa;AAC1B,2BAAmB,WAAW,IAAI,QAAQ;AAAA,MAC5C;AAAA,MAEA;AAAA,wBAAAA,KAAC,iCAA8B,IAAI,WAAW,IAAI;AAAA,QACjD,WAAW,OAAO;AAAA;AAAA;AAAA,EACrB;AAEJ;AAEO,SAAS,aAAa;AAC3B,QAAM,EAAE,gBAAgB,QAAQ,IAAI,iBAAiB;AAErD,SACE,gBAAAA,KAAA,YACG,kBAAQ,IAAI,CAAC,qBACZ,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,YAAY;AAAA,MACZ,QAAQ,mBAAmB,iBAAiB;AAAA;AAAA,IAFvC,iBAAiB;AAAA,EAGxB,CACD,GACH;AAEJ;;;AD5JM,SASE,OAAAC,MATF,QAAAC,aAAA;AA3CN,IAAM,sBAAsB,OAAO,OAAO,aAAa;AAEvD,IAAM,oBAA0B,qBAA6C,IAAI;AACjF,IAAM,4BACJ;AAEF,SAAS,mBAAmB,MAA8B;AACxD,MAAI,SAAS,UAAa,SAAS,WAAW;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAwD;AAClF,MAAI,SAAS,UAAa,SAAS,WAAW;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAG;AAAA,EACL;AACF;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAA2B;AACzB,SACE,gBAAAD,KAAC,eAAY,SAAO,MAClB,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACtD;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,wBAAAD,KAAC,SAAM;AAAA,QACP,gBAAAA,KAAC,UAAK,WAAU,WAAU,mBAAK;AAAA;AAAA;AAAA,EACjC,GACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB;AACF,GAAgB;AACd,QAAM,gBAAsB,kBAAW,oBAAoB;AAC3D,QAAM,EAAE,yBAAyB,OAAO,YAAY,QAAQ,KAAK,IAAI,UAAU;AAC/E,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAmC,IAAI;AACnF,QAAM,aAAa,kBAAkB,kBAAkB;AACvD,QAAM,eAAe,aAAa,QAAQ;AAC1C,QAAM,mBAAyB;AAAA,IAC7B,OAAO;AAAA,MACL,aAAa,CAAC,OAAO,aAAa;AAChC,uBAAe,CAAC,mBAAmB;AACjC,cAAI,aAAa,QAAW;AAC1B,mBAAO,gBAAgB,UAAU,QAAQ,OAAO;AAAA,UAClD;AAEA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,mBAAyB;AAAA,IAC7B,CAAC,aAAsB;AACrB,UAAI,UAAU;AACZ,aAAK;AAEL;AAAA,MACF;AAEA,iBAAW;AAAA,IACb;AAAA,IACA,CAAC,YAAY,IAAI;AAAA,EACnB;AACA,QAAM,kBAAkB,mBAAmB,YAAY;AAEvD,SACE,gBAAAA,KAAC,UAAO,MAAM,QAAQ,gBAAgB,OAAO,cAAc,kBACzD,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,QAAO;AAAA,MACP;AAAA,MACC,GAAI,eAAe,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,MACnD,iBAAiB;AAAA,MAChB,GAAI,oBAAoB,SAAY,EAAE,OAAO,gBAAgB,IAAI,CAAC;AAAA,MACnE,YAAY;AAAA,QACV,QAAQ;AAAA,UACN,UAAU;AAAA,UACV,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,QACrB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,mBAAmB,YAAY;AAAA,QAC/B;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAA,MAAC,gBAAa,WAAU,WACtB;AAAA,0BAAAD,KAAC,eAAY,2BAAa;AAAA,UAC1B,gBAAAA,KAAC,qBAAkB,oFAEnB;AAAA,WACF;AAAA,QAEA,gBAAAA,KAAC,kBAAkB,UAAlB,EAA2B,OAAO,kBACjC,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAU;AAAA,YAET;AAAA,iCAAmB,gBAAAD,KAAC,qBAAkB;AAAA,cACvC,gBAAAA,KAAC,SAAI,WAAU,kFAAiF;AAAA,cAChG,gBAAAA,KAAC,SAAI,WAAU,uDAAuD,UAAS;AAAA;AAAA;AAAA,QACjF,GACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;AAEA,SAAS,qBAAqB,MAA8B;AAC1D,QAAM,UAAgB,kBAAW,iBAAiB;AAElD,EAAM,uBAAgB,MAAM;AAC1B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,QAAQ,uBAAO,qBAAqB;AAC1C,YAAQ,YAAY,OAAO,IAAI;AAE/B,WAAO,MAAM;AACX,cAAQ,YAAY,OAAO,MAAS;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,SAAS,IAAI,CAAC;AACpB;;;AGjNA,OAAuB;AAWnB,SASE,OAAAE,MATF,QAAAC,aAAA;AANG,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4C;AAC1C,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,gBAAAD,KAAC,aAAU;AAAA;AAAA;AAAA,EACb;AAEJ;;;ACzBA,OAAOE,YAAW;AAElB,YAAYC,WAAU;AACtB,SAAS,WAA8B;AAkBnC,gBAAAC,MAoDA,QAAAC,aApDA;AAFG,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAuB;AACzE,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,mBAAmB,EAAE,WAAW,GAAG,MAAM,GAAuC;AAC9F,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,0BAA0B,SAAS;AAAA,MAChD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,oBAAoB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,oBAAoB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4C;AAC1C,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,gBAAAD,KAAC,aAAU;AAAA;AAAA;AAAA,EACb;AAEJ;AAEO,SAAS,mBAAmB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACvF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,6CAA6C,SAAS;AAAA,MACnE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAAwD;AACtD,QAAM,OAAO,UAAe,aAAO;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAA2D;AACzD,QAAM,OAAO,UAAe,aAAO;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,0BAA0B,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC9F,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAA+B;AACrF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,wCAAwC,SAAS;AAAA,MAC9D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,sBAAsB,EAAE,WAAW,GAAG,MAAM,GAA+B;AACzF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,4BAA4B,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,4BAA4B;AAAA,EAChC;AAAA,IACE;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS,GAAG,0CAA0C,0BAA0B;AAAA,MAClF;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB;AAAA,EACtC,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAA2B;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAOoD;AAClD,QAAM,OAAO,UAAe,aAAO;AACnC,QAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,QAAM,SACJ,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,aAAW;AAAA,MACX,eAAa;AAAA,MACb,WAAW,GAAG,0BAA0B,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,MACpE,GAAG;AAAA,MAEH;AAAA,wBACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAU;AAAA,YAET;AAAA;AAAA,QACH,IACE;AAAA,QACJ,gBAAAA,KAAM,iBAAL,EACC,0BAAAA,KAAC,UAAK,aAAU,6BAA4B,WAAU,gCACnD,UACH,GACF;AAAA,QACC,iBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACA,6BAA6B,WAC3B;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACH,IACE;AAAA;AAAA;AAAA,EACN;AAGF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,cAAU;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SACE,gBAAAC,MAAC,WACC;AAAA,oBAAAD,KAAC,kBAAe,SAAO,MAAE,kBAAO;AAAA,IAChC,gBAAAA,KAAC,kBAAe,MAAM,SAAS,OAAM,UAAS,QAAQ,CAAC,QAAS,GAAG,SAAS;AAAA,KAC9E;AAEJ;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,GAAG;AACL,GAGG;AACD,QAAM,OAAO,UAAe,aAAO;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,eACE;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,uBAAuB,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3F,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACL,GAEG;AAED,QAAM,CAAC,KAAK,IAAIE,OAAM,SAAS,MAAM;AACnC,WAAO,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE;AAAA,EAC/C,CAAC;AACD,QAAM,gBAAgB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,+CAA+C,SAAS;AAAA,MACrE,GAAG;AAAA,MAEH;AAAA,oBAAY,gBAAAD,KAAC,YAAS,WAAU,qBAAoB,gBAAa,sBAAqB;AAAA,QACvF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,gBAAa;AAAA,YACb,OAAO;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACxVA,YAAYG,YAAW;AAEvB,SAAS,eAAe,sBAAsB;AAC9C,SAAS,iBAAiB,UAAAC,eAAc;;;ACHxC,YAAYC,YAAW;AA+Nd,gBAAAC,YAAA;AArKT,IAAM,oBAA0B,qBAA6C,IAAI;AAE1E,SAAS,qBACd,YACA;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,gBAAsB,kBAAW,kBAAkB;AACzD,QAAM,UAAgB,eAAQ,MAAM;AAClC,UAAM,cAAc,oBAAI,IAAgD;AAExE,UAAM,QAAQ,CAAC,mBAAmB;AAChC,UAAI,YAAY,IAAI,eAAe,EAAE,GAAG;AACtC,cAAM,IAAI,MAAM,iCAAiC,eAAe,EAAE,mBAAmB;AAAA,MACvF;AAEA,kBAAY,IAAI,eAAe,IAAI,cAAc;AAAA,IACnD,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,KAAK,CAAC;AACV,QAAM,cAAc,QAAQ;AAE5B,MAAI,gBAAgB,QAAW;AAC7B,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,MAAI,CAAC,QAAQ,IAAI,WAAW,GAAG;AAC7B,UAAM,IAAI,MAAM,4DAA4D,WAAW,IAAI;AAAA,EAC7F;AAEA,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAA2B,WAAW;AAC5F,QAAM,CAAC,WAAW,YAAY,IAAU,gBAA8B,MAAM;AAC5E,QAAM,eAAe,SAAS;AAC9B,QAAM,aAAa,eAAe,OAAO;AACzC,QAAM,gBAAsB,cAAO,UAAU;AAC7C,QAAM,8BAAoC,cAAO,CAAC;AAClD,QAAM,6BAA6B,eAAe;AAClD,QAAM,kBAAkB,MAAM,UAAU,CAAC,mBAAmB,eAAe,OAAO,UAAU;AAE5F,MAAI,oBAAoB,IAAI;AAC1B,UAAM,IAAI,MAAM,4DAA4D,UAAU,IAAI;AAAA,EAC5F;AAEA,EAAM,iBAAU,MAAM;AACpB,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,UAAgB;AAAA,IACpB,CAAC,eAAiC,QAAQ,IAAI,UAAU;AAAA,IACxD,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,cAAoB;AAAA,IACxB,OAAOC,WAA4B,SAAiC,mBAAmB;AACrF,YAAM,cAAc,cAAc;AAElC,UAAIA,cAAa,aAAa;AAC5B,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,QAAQ,IAAIA,SAAQ,GAAG;AAC1B,cAAM,IAAI,MAAM,4DAA4DA,SAAQ,IAAI;AAAA,MAC1F;AAEA,YAAM,mBAAmB,MAAM;AAAA,QAC7B,CAAC,mBAAmB,eAAe,OAAO;AAAA,MAC5C;AACA,YAAM,gBAAgB,MAAM,UAAU,CAAC,mBAAmB,eAAe,OAAOA,SAAQ;AACxF,YAAM,gBACJ,gBAAgB,mBACZ,SACA,gBAAgB,mBACd,aACA;AACR,YAAM,2BAA2B,4BAA4B,UAAU;AACvE,kCAA4B,UAAU;AACtC,YAAM,oBACH,MAAM,sBAAsB;AAAA,QAC3B,MAAM;AAAA,QACN;AAAA,QACA,IAAIA;AAAA,MACN,CAAC,KAAM;AAET,UAAI,CAAC,mBAAmB;AACtB,qCAA6B;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,6BAA6B,4BAA4B,SAAS;AACpE,eAAO;AAAA,MACT;AAEA,mBAAa,aAAa;AAE1B,UAAI,CAAC,cAAc;AACjB,4BAAoBA,SAAQ;AAAA,MAC9B;AAEA,qBAAeA,SAAQ;AAEvB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,4BAA4B,cAAc,cAAc,qBAAqB,SAAS,KAAK;AAAA,EAC9F;AAEA,QAAM,eAAqB;AAAA,IACzB,CAAC,SAAiC,mBAAmB;AACnD,YAAM,mBAAmB,MAAM;AAAA,QAC7B,CAAC,mBAAmB,eAAe,OAAO,cAAc;AAAA,MAC1D;AACA,YAAM,yBAAyB,MAAM,mBAAmB,CAAC;AAEzD,UAAI,CAAC,wBAAwB;AAC3B,eAAO,QAAQ,QAAQ,KAAK;AAAA,MAC9B;AAEA,aAAO,YAAY,uBAAuB,IAAI,MAAM;AAAA,IACtD;AAAA,IACA,CAAC,aAAa,KAAK;AAAA,EACrB;AAEA,QAAM,WAAiB;AAAA,IACrB,CAAC,SAAiC,mBAAmB;AACnD,YAAM,mBAAmB,MAAM;AAAA,QAC7B,CAAC,mBAAmB,eAAe,OAAO,cAAc;AAAA,MAC1D;AACA,YAAM,qBAAqB,MAAM,mBAAmB,CAAC;AAErD,UAAI,CAAC,oBAAoB;AACvB,eAAO,QAAQ,QAAQ,KAAK;AAAA,MAC9B;AAEA,aAAO,YAAY,mBAAmB,IAAI,MAAM;AAAA,IAClD;AAAA,IACA,CAAC,aAAa,KAAK;AAAA,EACrB;AAEA,QAAM,eAAqB;AAAA,IACzB,OAAO;AAAA,MACL,WAAW,kBAAkB,MAAM,SAAS;AAAA,MAC5C,eAAe,kBAAkB;AAAA,MACjC;AAAA,MACA;AAAA,MACA,aAAa,oBAAoB;AAAA,MACjC,YAAY,oBAAoB,MAAM,SAAS;AAAA,MAC/C;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,MACX;AAAA,IACF;AAAA,IACA,CAAC,YAAY,iBAAiB,WAAW,SAAS,UAAU,cAAc,aAAa,KAAK;AAAA,EAC9F;AAEA,SAAO,gBAAAD,KAAC,kBAAkB,UAAlB,EAA2B,OAAO,cAAe,UAAS;AACpE;AAEO,SAAS,gBAAgB;AAC9B,QAAM,UAAgB,kBAAW,iBAAiB;AAElD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,SAAO;AACT;;;ADpNI,gBAAAE,MAmUA,QAAAC,aAnUA;AAXG,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACrF,QAAM,EAAE,SAAS,KAAK,IAAI,cAAc;AACxC,QAAM,aAAa,QAAQ,IAAI;AAC/B,QAAM,aAAmB;AAAA,IACvB,MAAM,sBAAsB,YAAY,UAAU;AAAA,IAClD,CAAC,YAAY,UAAU;AAAA,EACzB;AAEA,uBAAqB,UAAU;AAE/B,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,2CAA2C,SAAS;AAAA,MACjE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACrF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACtF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,oEAAoE,SAAS;AAAA,MAC1F,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAAgC;AACrF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAIA,IAAM,+CAA+C;AACrD,IAAM,gDAAgD;AACtD,IAAM,6CAA6C;AACnD,IAAM,wCAAwC;AAC9C,IAAM,yCAAyC;AAC/C,IAAM,qCAAuE,CAAC,GAAG,KAAK,GAAG,CAAC;AAC1F,IAAM,sCAAwE,CAAC,GAAG,KAAK,GAAG,CAAC;AAC3F,IAAM,2CAA6E;AAAA,EACjF;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACpB;AACA,IAAM,4CAA8E;AAAA,EAClF;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACpB;AAEA,SAAS,gBAAgB,WAAmB,iBAAuC;AACjF,MAAI,YAAY,iBAAiB;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,iBAAiB;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,WAAgC;AAC7D,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,cAAc,YAAY;AAC5B,WAAO;AAAA,MACL,GAAG,CAAC;AAAA,MACJ,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,EACX;AACF;AAEA,SAAS,oBAAoB,WAAgC;AAC3D,QAAM,QAAQ,cAAc,SAAS,IAAI;AAEzC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,YAAY;AAAA,MACV,GAAG;AAAA,QACD;AAAA,QACA,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,WAAgC;AAC5D,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,MACL,GAAG,CAAC;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,QACV,GAAG;AAAA,UACD,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAAA,QACA,SAAS;AAAA,UACP,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,YAAY;AAC5B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,MACT,YAAY;AAAA,QACV,GAAG;AAAA,UACD,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAAA,QACA,SAAS;AAAA,UACP,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,YAAY;AAAA,MACV,GAAG;AAAA,QACD,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACP,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,yBAAyB;AAAA,EAC7B,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AACR;AAEA,SAAS,oBAAoB,WAAgC;AAC3D,SAAO,cAAc,SAAS,QAAQ;AACxC;AAEA,SAAS,sBAAsB,MAAsD;AACnF,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,UAAa,KAAK,cAAc,QAAW;AACzF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,MAA8B;AAC/D,MAAI,SAAS,WAAW;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,SAAS,YAAY,KAAK,WAAW;AACrD;AAEA,SAAS,mBAAiD;AACxD,QAAM,aAAmB,cAAwB,IAAI;AACrD,QAAM,oBAA0B,cAA8B,IAAI;AAClE,QAAM,CAAC,QAAQ,SAAS,IAAU,gBAAwB,IAAI;AAE9D,QAAM,eAAqB,mBAAY,CAAC,YAA6B;AACnE,UAAM,aAAa,UAAU,QAAQ,sBAAsB,EAAE,SAAS;AAEtE,cAAU,CAAC,kBAAmB,kBAAkB,aAAa,gBAAgB,UAAW;AAAA,EAC1F,GAAG,CAAC,CAAC;AAEL,QAAM,MAAY;AAAA,IAChB,CAAC,YAA6B;AAC5B,wBAAkB,SAAS,WAAW;AACtC,wBAAkB,UAAU;AAC5B,iBAAW,UAAU;AAErB,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AAEA,mBAAa,OAAO;AAEpB,UAAI,WAAW,OAAO,mBAAmB,aAAa;AACpD,0BAAkB,UAAU,IAAI,eAAe,CAAC,CAAC,KAAK,MAAM;AAC1D,cAAI,CAAC,OAAO;AACV;AAAA,UACF;AAEA,oBAAU,MAAM,YAAY,MAAM;AAAA,QACpC,CAAC;AACD,0BAAkB,QAAQ,QAAQ,OAAO;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,EAAM,iBAAU,MAAM;AACpB,WAAO,MAAM;AACX,wBAAkB,SAAS,WAAW;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAM,uBAAgB,MAAM;AAC1B,iBAAa,WAAW,OAAO;AAAA,EACjC,CAAC;AAED,SAAO,CAAC,KAAK,MAAM;AACrB;AAEA,SAAS,uBAAuB,cAAuB,kBAAiC;AACtF,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAQO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,WAAW,WAAW,MAAM,IAAI,cAAc;AACtD,QAAM,eAAe,aAAa,MAAM,UAAU,CAAC,mBAAmB,eAAe,OAAO,IAAI;AAChG,QAAM,SAAS,iBAAiB;AAChC,QAAM,WAAW,gBAAgB,cAAc,SAAS;AACxD,QAAM,oBAAoB,iBAAiB;AAE3C,SACE,gBAAAA;AAAA,IAACE,QAAO;AAAA,IAAP;AAAA,MACC,aAAU;AAAA,MACV,eAAa;AAAA,MACb,uBAAqB;AAAA,MACrB,sBAAoB;AAAA,MACpB,aAAW;AAAA,MACX,eAAa,CAAC;AAAA,MACd,WAAW;AAAA,QACT;AAAA,QACA,SAAS,wBAAwB;AAAA,QACjC;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS,oBAAoB,iBAAiB;AAAA,MAC9C,SAAQ;AAAA,MACR,MAAK;AAAA,MACJ,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAMO,SAAS,gBAAgB,EAAE,UAAU,WAAW,OAAO,GAAG,MAAM,GAAyB;AAC9F,QAAM,EAAE,WAAW,SAAS,MAAM,MAAM,IAAI,cAAc;AAE1D,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AAEA,QAAM,aAAa,QAAQ,IAAI;AAE/B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,yDAAyD,IAAI,IAAI;AAAA,EACnF;AAEA,QAAM,mBAAmB,sBAAsB,WAAW,UAAU;AACpE,QAAM,CAAC,eAAe,gBAAgB,IAAI,iBAAiC;AAC3E,QAAM,eAAe,0BAA0B,gBAAgB;AAE/D,SACE,gBAAAD;AAAA,IAACC,QAAO;AAAA,IAAP;AAAA,MACC,aAAU;AAAA,MACV,uBAAqB;AAAA,MACrB,WAAW,GAAG,2DAA2D,SAAS;AAAA,MAClF,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAI,gBAAgB,qBAAqB,OAAO,EAAE,QAAQ,iBAAiB,IAAI;AAAA,MACjF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,gBAAAF,KAAC,mBAAgB,QAAQ,WAAW,SAAS,OAC3C,0BAAAA;AAAA,UAACE,QAAO;AAAA,UAAP;AAAA,YAEC,QAAQ;AAAA,YACR,aAAU;AAAA,YACV,eAAW;AAAA,YACX,uBAAqB;AAAA,YACrB,sBAAmB;AAAA,YACnB,aAAW,WAAW;AAAA,YACtB,KAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA,uBAAuB,cAAc,gBAAgB;AAAA,YACvD;AAAA,YACA,UAAU;AAAA,YACV,SAAS,oBAAoB,SAAS;AAAA,YACtC,SAAQ;AAAA,YACR,MAAK;AAAA,YAEJ,qBAAW,OAAO;AAAA;AAAA,UAjBd,WAAW;AAAA,QAkBlB,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAIO,SAAS,yBAAyB;AAAA,EACvC,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,GAAG;AACL,GAAkC;AAChC,QAAM,EAAE,eAAe,aAAa,IAAI,cAAc;AAEtD,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY,CAAC;AAAA,MACvB,SAAS,CAAC,UAAU;AAClB,kBAAU,KAAK;AAEf,YAAI,CAAC,MAAM,kBAAkB;AAC3B,eAAK,aAAa,iBAAiB,EAAE,MAAM,CAAC,UAAU;AACpD,oBAAQ,MAAM,oDAAoD,KAAK;AAAA,UACzE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,wBAAAD,KAAC,iBAAc;AAAA,QACd;AAAA;AAAA;AAAA,EACH;AAEJ;AAIO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,GAAG;AACL,GAA8B;AAC5B,QAAM,EAAE,WAAW,YAAY,SAAS,IAAI,cAAc;AAE1D,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY,CAAC;AAAA,MACvB,SAAS,CAAC,UAAU;AAClB,kBAAU,KAAK;AAEf,YAAI,CAAC,MAAM,kBAAkB;AAC3B,eAAK,SAAS,aAAa,EAAE,MAAM,CAAC,UAAU;AAC5C,oBAAQ,MAAM,gDAAgD,KAAK;AAAA,UACrE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,qBAAa,aAAa,SAAS;AAAA,QACpC,gBAAAD,KAAC,kBAAe;AAAA;AAAA;AAAA,EAClB;AAEJ;AAIO,SAAS,mBAAmB,EAAE,WAAW,GAAG,MAAM,GAA4B;AACnF,QAAM,EAAE,WAAW,MAAM,IAAI,cAAc;AAE3C,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,oCAAoC,SAAS;AAAA,MAC1D,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,gBAAgB,UAC1B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,eAAa,UAAU;AAAA,UACvB,iBAAe,QAAQ;AAAA,UACvB,aAAU;AAAA,UACV,WAAW;AAAA,YACT;AAAA,YACA,SAAS,aAAa;AAAA,UACxB;AAAA;AAAA,QAPK,eAAe;AAAA,MAQtB,CACD;AAAA;AAAA,EACH;AAEJ;;;AE3dA,OAAuB;;;ACAvB,YAAYG,YAAW;AA6Kd,gBAAAC,YAAA;AA5HT,IAAM,oBAA0B,qBAA6C,IAAI;AAE1E,SAAS,iBACd,YACA;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,CAAC;AAAA,EACT;AACF,GAA4B;AAC1B,QAAM,gBAAsB,kBAAW,kBAAkB;AACzD,QAAM,UAAgB,eAAQ,MAAM;AAClC,UAAM,cAAc,oBAAI,IAAwC;AAEhE,UAAM,QAAQ,CAAC,mBAAmB;AAChC,UAAI,YAAY,IAAI,eAAe,EAAE,GAAG;AACtC,cAAM,IAAI,MAAM,4BAA4B,eAAe,EAAE,mBAAmB;AAAA,MAClF;AAEA,kBAAY,IAAI,eAAe,IAAI,cAAc;AAAA,IACnD,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,KAAK,CAAC;AACV,QAAM,cAAc,QAAQ;AAE5B,MAAI,gBAAgB,QAAW;AAC7B,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,MAAI,MAAM,SAAS,KAAK,CAAC,QAAQ,IAAI,WAAW,GAAG;AACjD,UAAM,IAAI,MAAM,4DAA4D,WAAW,IAAI;AAAA,EAC7F;AAEA,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAuB,WAAW;AACxF,QAAM,eAAe,SAAS;AAC9B,QAAM,aAAa,eAAe,OAAO;AACzC,QAAM,gBAAsB,cAAO,UAAU;AAC7C,QAAM,8BAAoC,cAAO,CAAC;AAClD,QAAM,6BAA6B,eAAe;AAElD,MAAI,MAAM,SAAS,KAAK,CAAC,QAAQ,IAAI,UAAU,GAAG;AAChD,UAAM,IAAI,MAAM,4DAA4D,UAAU,IAAI;AAAA,EAC5F;AAEA,EAAM,iBAAU,MAAM;AACpB,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,UAAgB;AAAA,IACpB,CAAC,eAA6B,QAAQ,IAAI,UAAU;AAAA,IACpD,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,UAAgB;AAAA,IACpB,OAAO,UAAwB,SAAiC,mBAAmB;AACjF,YAAM,cAAc,cAAc;AAElC,UAAI,aAAa,aAAa;AAC5B,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,SAAS,KAAK,CAAC,QAAQ,IAAI,QAAQ,GAAG;AAC9C,cAAM,IAAI,MAAM,4DAA4D,QAAQ,IAAI;AAAA,MAC1F;AAEA,YAAM,2BAA2B,4BAA4B,UAAU;AACvE,kCAA4B,UAAU;AACtC,YAAM,oBACH,MAAM,sBAAsB;AAAA,QAC3B,MAAM;AAAA,QACN;AAAA,QACA,IAAI;AAAA,MACN,CAAC,KAAM;AAET,UAAI,CAAC,mBAAmB;AACtB,qCAA6B;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,6BAA6B,4BAA4B,SAAS;AACpE,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,cAAc;AACjB,4BAAoB,QAAQ;AAAA,MAC9B;AAEA,qBAAe,QAAQ;AAEvB,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,WAAiB;AAAA,IACrB,CAAC,eAA6B,eAAe;AAAA,IAC7C,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,eAAqB;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,IACA,CAAC,YAAY,SAAS,UAAU,OAAO,OAAO;AAAA,EAChD;AAEA,SAAO,gBAAAA,KAAC,kBAAkB,UAAlB,EAA2B,OAAO,cAAe,UAAS;AACpE;AAEO,SAAS,gBAAgB;AAC9B,QAAM,UAAgB,kBAAW,iBAAiB;AAElD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,SAAO;AACT;;;ADlKI,gBAAAC,OA8FA,QAAAC,aA9FA;AAJG,SAAS,oBAAoB,EAAE,SAAS,MAAM,GAAG,MAAM,GAA6B;AACzF,QAAM,EAAE,UAAU,QAAQ,IAAI,cAAc;AAE5C,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,UAAU,SAAS,IAAI;AAAA,MACvB,SAAS,CAAC,UAAU;AAClB,kBAAU,KAAK;AAEf,YAAI,CAAC,MAAM,kBAAkB;AAC3B,eAAK,QAAQ,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU;AAChD,oBAAQ,MAAM,iDAAiD,KAAK;AAAA,UACtE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,2BAA2B;AAClC,QAAM,UAAU,cAAc;AAE9B,MAAI,QAAQ,MAAM,WAAW,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,SAAS,IAAI,cAAc;AACnC,QAAM,SAAS,SAAS,IAAI;AAE5B,MAAI,CAAC,eAAe,CAAC,QAAQ;AAC3B,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,eAAa;AAAA,MACb,aAAW;AAAA,MACX,eAAa,CAAC;AAAA,MACd,QAAQ,CAAC;AAAA,MACT,WAAW,GAAG,SAAS;AAAA,MACtB,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAIO,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAwB;AAC3E,QAAM,EAAE,MAAM,IAAI,yBAAyB;AAE3C,SACE,gBAAAA,MAAC,qBAAkB,aAAU,oBAAmB,WAAW,GAAG,SAAS,GAAI,GAAG,OAC3E,gBAAM,IAAI,CAAC,mBAAmB;AAC7B,UAAM,OAAO,eAAe;AAE5B,WACE,gBAAAA,MAAC,yBACC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,eAAe;AAAA,QACrB,eAAe,OAAO,gBAAAA,MAAC,QAAK,WAAU,UAAS,IAAK;AAAA,QAEnD,yBAAe;AAAA;AAAA,IAClB,KAN0B,eAAe,EAO3C;AAAA,EAEJ,CAAC,GACH;AAEJ;AAIO,SAAS,gBAAgB,EAAE,UAAU,WAAW,GAAG,MAAM,GAAyB;AACvF,QAAM,EAAE,MAAM,IAAI,yBAAyB;AAE3C,SACE,gBAAAC,MAAC,SAAI,aAAU,qBAAoB,WAAW,GAAG,SAAS,GAAI,GAAG,OAC9D;AAAA;AAAA,IACA,MAAM,IAAI,CAAC,mBACV,gBAAAD;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,eAAe;AAAA,QACrB,aAAa,eAAe;AAAA,QAE3B,yBAAe,OAAO;AAAA;AAAA,MAJlB,eAAe;AAAA,IAKtB,CACD;AAAA,KACH;AAEJ;","names":["React","React","jsx","jsx","jsx","jsxs","jsx","jsxs","React","Slot","jsx","jsxs","React","React","motion","React","jsx","nextStep","jsx","jsxs","motion","React","jsx","jsx","jsxs"]}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Button
|
|
3
|
+
} from "./chunk-TU5CYBB4.js";
|
|
4
|
+
import {
|
|
5
|
+
dialogSurfaceClass
|
|
6
|
+
} from "./chunk-O2BG2KSY.js";
|
|
7
|
+
import {
|
|
8
|
+
cn
|
|
9
|
+
} from "./chunk-DN2AEEA2.js";
|
|
10
|
+
|
|
11
|
+
// src/components/dialog.tsx
|
|
12
|
+
import * as React from "react";
|
|
13
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
14
|
+
import * as Slot from "@radix-ui/react-slot";
|
|
15
|
+
import { XIcon } from "lucide-react";
|
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
var DialogContext = React.createContext(null);
|
|
18
|
+
function resolveOpenState(currentOpen, nextOpen) {
|
|
19
|
+
return typeof nextOpen === "function" ? nextOpen(currentOpen) : nextOpen;
|
|
20
|
+
}
|
|
21
|
+
function setRefValue(ref, value) {
|
|
22
|
+
if (typeof ref === "function") {
|
|
23
|
+
ref(value);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (ref) {
|
|
27
|
+
ref.current = value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function useDialogContext(componentName) {
|
|
31
|
+
const context = React.useContext(DialogContext);
|
|
32
|
+
if (!context) {
|
|
33
|
+
throw new Error(`${componentName} must be used within a Dialog.`);
|
|
34
|
+
}
|
|
35
|
+
return context;
|
|
36
|
+
}
|
|
37
|
+
function Dialog({
|
|
38
|
+
defaultOpen = false,
|
|
39
|
+
onCloseRequest,
|
|
40
|
+
onOpenChange,
|
|
41
|
+
open,
|
|
42
|
+
...props
|
|
43
|
+
}) {
|
|
44
|
+
const [blockedInteractionCount, setBlockedInteractionCount] = React.useState(0);
|
|
45
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
|
|
46
|
+
const isControlled = open !== void 0;
|
|
47
|
+
const isOpen = isControlled ? open : uncontrolledOpen;
|
|
48
|
+
const isOpenRef = React.useRef(isOpen);
|
|
49
|
+
const closeRequestVersionRef = React.useRef(0);
|
|
50
|
+
React.useEffect(() => {
|
|
51
|
+
isOpenRef.current = isOpen;
|
|
52
|
+
}, [isOpen]);
|
|
53
|
+
const setOpenState = React.useCallback(
|
|
54
|
+
(nextOpen) => {
|
|
55
|
+
const resolvedOpen = resolveOpenState(isOpenRef.current, nextOpen);
|
|
56
|
+
if (!isControlled) {
|
|
57
|
+
setUncontrolledOpen(resolvedOpen);
|
|
58
|
+
}
|
|
59
|
+
onOpenChange?.(resolvedOpen);
|
|
60
|
+
},
|
|
61
|
+
[isControlled, onOpenChange]
|
|
62
|
+
);
|
|
63
|
+
const openDialog = React.useCallback(() => {
|
|
64
|
+
closeRequestVersionRef.current += 1;
|
|
65
|
+
setOpenState(true);
|
|
66
|
+
}, [setOpenState]);
|
|
67
|
+
const forceCloseDialog = React.useCallback(() => {
|
|
68
|
+
closeRequestVersionRef.current += 1;
|
|
69
|
+
setOpenState(false);
|
|
70
|
+
}, [setOpenState]);
|
|
71
|
+
const requestClose = React.useCallback(
|
|
72
|
+
async (reason) => {
|
|
73
|
+
if (!isOpenRef.current) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
const closeRequestVersion = closeRequestVersionRef.current + 1;
|
|
77
|
+
closeRequestVersionRef.current = closeRequestVersion;
|
|
78
|
+
const closeAllowed = await onCloseRequest?.(reason) ?? true;
|
|
79
|
+
if (!closeAllowed) {
|
|
80
|
+
setBlockedInteractionCount((currentCount) => currentCount + 1);
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (closeRequestVersion !== closeRequestVersionRef.current) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
setOpenState(false);
|
|
87
|
+
return true;
|
|
88
|
+
},
|
|
89
|
+
[onCloseRequest, setOpenState]
|
|
90
|
+
);
|
|
91
|
+
const contextValue = React.useMemo(
|
|
92
|
+
() => ({
|
|
93
|
+
blockedInteractionCount,
|
|
94
|
+
forceClose: forceCloseDialog,
|
|
95
|
+
open: openDialog,
|
|
96
|
+
requestClose
|
|
97
|
+
}),
|
|
98
|
+
[blockedInteractionCount, forceCloseDialog, openDialog, requestClose]
|
|
99
|
+
);
|
|
100
|
+
return /* @__PURE__ */ jsx(DialogContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
|
|
101
|
+
DialogPrimitive.Root,
|
|
102
|
+
{
|
|
103
|
+
"data-slot": "dialog",
|
|
104
|
+
open: isOpen,
|
|
105
|
+
onOpenChange: (nextOpen) => {
|
|
106
|
+
if (nextOpen) {
|
|
107
|
+
openDialog();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
void requestClose("programmatic").catch((error) => {
|
|
111
|
+
console.error("Failed to close dialog from root state change.", error);
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
...props
|
|
115
|
+
}
|
|
116
|
+
) });
|
|
117
|
+
}
|
|
118
|
+
function DialogTrigger({ ...props }) {
|
|
119
|
+
return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
|
|
120
|
+
}
|
|
121
|
+
function DialogPortal({ ...props }) {
|
|
122
|
+
return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
|
|
123
|
+
}
|
|
124
|
+
function DialogPrimitiveClose({
|
|
125
|
+
asChild = false,
|
|
126
|
+
onClick,
|
|
127
|
+
type = "button",
|
|
128
|
+
...props
|
|
129
|
+
}) {
|
|
130
|
+
const { forceClose } = useDialogContext("DialogPrimitiveClose");
|
|
131
|
+
const Comp = asChild ? Slot.Root : "button";
|
|
132
|
+
return /* @__PURE__ */ jsx(
|
|
133
|
+
Comp,
|
|
134
|
+
{
|
|
135
|
+
"data-slot": "dialog-close",
|
|
136
|
+
onClick: (event) => {
|
|
137
|
+
onClick?.(event);
|
|
138
|
+
if (event.defaultPrevented) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
forceClose();
|
|
142
|
+
},
|
|
143
|
+
type: asChild ? void 0 : type,
|
|
144
|
+
...props
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
function DialogClose({
|
|
149
|
+
asChild = false,
|
|
150
|
+
onClick,
|
|
151
|
+
type = "button",
|
|
152
|
+
...props
|
|
153
|
+
}) {
|
|
154
|
+
const { requestClose } = useDialogContext("DialogClose");
|
|
155
|
+
const Comp = asChild ? Slot.Root : "button";
|
|
156
|
+
return /* @__PURE__ */ jsx(
|
|
157
|
+
Comp,
|
|
158
|
+
{
|
|
159
|
+
"data-slot": "dialog-close",
|
|
160
|
+
onClick: (event) => {
|
|
161
|
+
onClick?.(event);
|
|
162
|
+
if (event.defaultPrevented) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
void requestClose("close-button").catch((error) => {
|
|
166
|
+
console.error("Failed to close dialog from close button.", error);
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
type: asChild ? void 0 : type,
|
|
170
|
+
...props
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
function DialogOverlay({
|
|
175
|
+
className,
|
|
176
|
+
...props
|
|
177
|
+
}) {
|
|
178
|
+
return /* @__PURE__ */ jsx(
|
|
179
|
+
DialogPrimitive.Overlay,
|
|
180
|
+
{
|
|
181
|
+
"data-slot": "dialog-overlay",
|
|
182
|
+
className: cn(
|
|
183
|
+
"data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-[var(--layer-dialog)] bg-(--overlay-scrim) duration-200 data-[state=closed]:pointer-events-none data-[state=closed]:invisible",
|
|
184
|
+
className
|
|
185
|
+
),
|
|
186
|
+
...props
|
|
187
|
+
}
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
var DialogContent = React.forwardRef(function DialogContent2({
|
|
191
|
+
blockedInteractionCount: blockedInteractionCountProp = 0,
|
|
192
|
+
className,
|
|
193
|
+
children,
|
|
194
|
+
forceMount,
|
|
195
|
+
onEscapeKeyDown,
|
|
196
|
+
onPointerDownOutside,
|
|
197
|
+
showCloseButton = true,
|
|
198
|
+
...props
|
|
199
|
+
}, ref) {
|
|
200
|
+
const { blockedInteractionCount, requestClose } = useDialogContext("DialogContent");
|
|
201
|
+
const contentRef = React.useRef(null);
|
|
202
|
+
const blockedInteractionAnimationRef = React.useRef(null);
|
|
203
|
+
const totalBlockedInteractionCount = blockedInteractionCount + blockedInteractionCountProp;
|
|
204
|
+
React.useEffect(() => {
|
|
205
|
+
if (totalBlockedInteractionCount === 0) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const dialogContentElement = contentRef.current;
|
|
209
|
+
if (!dialogContentElement || typeof dialogContentElement.animate !== "function") {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const prefersReducedMotion = typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
213
|
+
const offset = prefersReducedMotion ? 6 : 12;
|
|
214
|
+
const duration = prefersReducedMotion ? 180 : 320;
|
|
215
|
+
blockedInteractionAnimationRef.current?.cancel();
|
|
216
|
+
blockedInteractionAnimationRef.current = dialogContentElement.animate(
|
|
217
|
+
[
|
|
218
|
+
{ marginLeft: "0px" },
|
|
219
|
+
{ marginLeft: `-${offset}px` },
|
|
220
|
+
{ marginLeft: `${Math.round(offset * 0.83)}px` },
|
|
221
|
+
{ marginLeft: `-${Math.round(offset * 0.67)}px` },
|
|
222
|
+
{ marginLeft: `${Math.round(offset * 0.5)}px` },
|
|
223
|
+
{ marginLeft: "0px" }
|
|
224
|
+
],
|
|
225
|
+
{
|
|
226
|
+
duration,
|
|
227
|
+
easing: "cubic-bezier(0.36, 0.07, 0.19, 0.97)"
|
|
228
|
+
}
|
|
229
|
+
);
|
|
230
|
+
return () => {
|
|
231
|
+
blockedInteractionAnimationRef.current?.cancel();
|
|
232
|
+
};
|
|
233
|
+
}, [totalBlockedInteractionCount]);
|
|
234
|
+
const composedRef = React.useCallback(
|
|
235
|
+
(node) => {
|
|
236
|
+
contentRef.current = node;
|
|
237
|
+
setRefValue(ref, node);
|
|
238
|
+
},
|
|
239
|
+
[ref]
|
|
240
|
+
);
|
|
241
|
+
return /* @__PURE__ */ jsxs(DialogPortal, { children: [
|
|
242
|
+
/* @__PURE__ */ jsx(DialogOverlay, { ...forceMount === true ? { forceMount: true } : {} }),
|
|
243
|
+
/* @__PURE__ */ jsxs(
|
|
244
|
+
DialogPrimitive.Content,
|
|
245
|
+
{
|
|
246
|
+
ref: composedRef,
|
|
247
|
+
...forceMount === true ? { forceMount: true } : {},
|
|
248
|
+
"data-slot": "dialog-content",
|
|
249
|
+
className: cn(
|
|
250
|
+
"data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-[var(--layer-dialog)] grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-[var(--radius-dialog)] p-4 text-sm duration-150 outline-none data-[state=closed]:pointer-events-none data-[state=closed]:invisible sm:max-w-sm",
|
|
251
|
+
dialogSurfaceClass,
|
|
252
|
+
className
|
|
253
|
+
),
|
|
254
|
+
onEscapeKeyDown: (event) => {
|
|
255
|
+
onEscapeKeyDown?.(event);
|
|
256
|
+
if (event.defaultPrevented) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
event.preventDefault();
|
|
260
|
+
void requestClose("escape-key").catch((error) => {
|
|
261
|
+
console.error("Failed to close dialog from escape key.", error);
|
|
262
|
+
});
|
|
263
|
+
},
|
|
264
|
+
onPointerDownOutside: (event) => {
|
|
265
|
+
onPointerDownOutside?.(event);
|
|
266
|
+
if (event.defaultPrevented) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
event.preventDefault();
|
|
270
|
+
void requestClose("outside-click").catch((error) => {
|
|
271
|
+
console.error("Failed to close dialog from outside click.", error);
|
|
272
|
+
});
|
|
273
|
+
},
|
|
274
|
+
...props,
|
|
275
|
+
children: [
|
|
276
|
+
children,
|
|
277
|
+
showCloseButton && /* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", className: "absolute top-2 right-2", size: "icon-sm", children: [
|
|
278
|
+
/* @__PURE__ */ jsx(XIcon, {}),
|
|
279
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
280
|
+
] }) })
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
)
|
|
284
|
+
] });
|
|
285
|
+
});
|
|
286
|
+
function DialogHeader({ className, ...props }) {
|
|
287
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-2", className), ...props });
|
|
288
|
+
}
|
|
289
|
+
function DialogFooter({
|
|
290
|
+
className,
|
|
291
|
+
showCloseButton = false,
|
|
292
|
+
children,
|
|
293
|
+
...props
|
|
294
|
+
}) {
|
|
295
|
+
return /* @__PURE__ */ jsxs(
|
|
296
|
+
"div",
|
|
297
|
+
{
|
|
298
|
+
"data-slot": "dialog-footer",
|
|
299
|
+
className: cn(
|
|
300
|
+
"bg-dialog-footer-background border-dialog-border -mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-[var(--radius-dialog)] border-t p-4 sm:flex-row sm:justify-end",
|
|
301
|
+
className
|
|
302
|
+
),
|
|
303
|
+
...props,
|
|
304
|
+
children: [
|
|
305
|
+
children,
|
|
306
|
+
showCloseButton && /* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "outline", children: "Close" }) })
|
|
307
|
+
]
|
|
308
|
+
}
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
function DialogTitle({ className, ...props }) {
|
|
312
|
+
return /* @__PURE__ */ jsx(
|
|
313
|
+
DialogPrimitive.Title,
|
|
314
|
+
{
|
|
315
|
+
"data-slot": "dialog-title",
|
|
316
|
+
className: cn("font-heading text-dialog-text text-base leading-none font-medium", className),
|
|
317
|
+
...props
|
|
318
|
+
}
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
function DialogDescription({
|
|
322
|
+
className,
|
|
323
|
+
...props
|
|
324
|
+
}) {
|
|
325
|
+
return /* @__PURE__ */ jsx(
|
|
326
|
+
DialogPrimitive.Description,
|
|
327
|
+
{
|
|
328
|
+
"data-slot": "dialog-description",
|
|
329
|
+
className: cn(
|
|
330
|
+
"text-text-muted *:[a]:hover:text-text-normal text-sm *:[a]:underline *:[a]:underline-offset-3",
|
|
331
|
+
className
|
|
332
|
+
),
|
|
333
|
+
...props
|
|
334
|
+
}
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export {
|
|
339
|
+
Dialog,
|
|
340
|
+
DialogTrigger,
|
|
341
|
+
DialogPortal,
|
|
342
|
+
DialogPrimitiveClose,
|
|
343
|
+
DialogClose,
|
|
344
|
+
DialogOverlay,
|
|
345
|
+
DialogContent,
|
|
346
|
+
DialogHeader,
|
|
347
|
+
DialogFooter,
|
|
348
|
+
DialogTitle,
|
|
349
|
+
DialogDescription
|
|
350
|
+
};
|
|
351
|
+
//# sourceMappingURL=chunk-PLZMCJSL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dialog.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport * as Slot from \"@radix-ui/react-slot\"\nimport { XIcon } from \"lucide-react\"\n\nimport { Button } from \"@hyunsdev/ui/components/button\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport { dialogSurfaceClass } from \"./_styles\"\n\nexport type DialogCloseReason = \"close-button\" | \"escape-key\" | \"outside-click\" | \"programmatic\"\n\ntype DialogRootProps = React.ComponentProps<typeof DialogPrimitive.Root> & {\n onCloseRequest?: (reason: DialogCloseReason) => boolean | Promise<boolean>\n}\n\ntype DialogContextValue = {\n blockedInteractionCount: number\n forceClose: () => void\n open: () => void\n requestClose: (reason: DialogCloseReason) => Promise<boolean>\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\nfunction resolveOpenState(currentOpen: boolean, nextOpen: React.SetStateAction<boolean>) {\n return typeof nextOpen === \"function\" ? nextOpen(currentOpen) : nextOpen\n}\n\nfunction setRefValue<T>(ref: React.Ref<T> | undefined, value: T) {\n if (typeof ref === \"function\") {\n ref(value)\n return\n }\n\n if (ref) {\n ref.current = value\n }\n}\n\nfunction useDialogContext(componentName: string) {\n const context = React.useContext(DialogContext)\n\n if (!context) {\n throw new Error(`${componentName} must be used within a Dialog.`)\n }\n\n return context\n}\n\nfunction Dialog({\n defaultOpen = false,\n onCloseRequest,\n onOpenChange,\n open,\n ...props\n}: DialogRootProps) {\n const [blockedInteractionCount, setBlockedInteractionCount] = React.useState(0)\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = open !== undefined\n const isOpen = isControlled ? open : uncontrolledOpen\n const isOpenRef = React.useRef(isOpen)\n const closeRequestVersionRef = React.useRef(0)\n\n React.useEffect(() => {\n isOpenRef.current = isOpen\n }, [isOpen])\n\n const setOpenState = React.useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n (nextOpen) => {\n const resolvedOpen = resolveOpenState(isOpenRef.current, nextOpen)\n\n if (!isControlled) {\n setUncontrolledOpen(resolvedOpen)\n }\n\n onOpenChange?.(resolvedOpen)\n },\n [isControlled, onOpenChange],\n )\n\n const openDialog = React.useCallback(() => {\n closeRequestVersionRef.current += 1\n setOpenState(true)\n }, [setOpenState])\n\n const forceCloseDialog = React.useCallback(() => {\n closeRequestVersionRef.current += 1\n setOpenState(false)\n }, [setOpenState])\n\n const requestClose = React.useCallback(\n async (reason: DialogCloseReason) => {\n if (!isOpenRef.current) {\n return true\n }\n\n const closeRequestVersion = closeRequestVersionRef.current + 1\n closeRequestVersionRef.current = closeRequestVersion\n const closeAllowed = (await onCloseRequest?.(reason)) ?? true\n\n if (!closeAllowed) {\n setBlockedInteractionCount((currentCount) => currentCount + 1)\n return false\n }\n\n if (closeRequestVersion !== closeRequestVersionRef.current) {\n return false\n }\n\n setOpenState(false)\n\n return true\n },\n [onCloseRequest, setOpenState],\n )\n\n const contextValue = React.useMemo(\n () => ({\n blockedInteractionCount,\n forceClose: forceCloseDialog,\n open: openDialog,\n requestClose,\n }),\n [blockedInteractionCount, forceCloseDialog, openDialog, requestClose],\n )\n\n return (\n <DialogContext.Provider value={contextValue}>\n <DialogPrimitive.Root\n data-slot=\"dialog\"\n open={isOpen}\n onOpenChange={(nextOpen) => {\n if (nextOpen) {\n openDialog()\n return\n }\n\n void requestClose(\"programmatic\").catch((error) => {\n console.error(\"Failed to close dialog from root state change.\", error)\n })\n }}\n {...props}\n />\n </DialogContext.Provider>\n )\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogPrimitiveClose({\n asChild = false,\n onClick,\n type = \"button\",\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n const { forceClose } = useDialogContext(\"DialogPrimitiveClose\")\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"dialog-close\"\n onClick={(event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n forceClose()\n }}\n type={asChild ? undefined : type}\n {...props}\n />\n )\n}\n\nfunction DialogClose({\n asChild = false,\n onClick,\n type = \"button\",\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n const { requestClose } = useDialogContext(\"DialogClose\")\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"dialog-close\"\n onClick={(event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n void requestClose(\"close-button\").catch((error) => {\n console.error(\"Failed to close dialog from close button.\", error)\n })\n }}\n type={asChild ? undefined : type}\n {...props}\n />\n )\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-[var(--layer-dialog)] bg-(--overlay-scrim) duration-200 data-[state=closed]:pointer-events-none data-[state=closed]:invisible\",\n className,\n )}\n {...props}\n />\n )\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentProps<typeof DialogPrimitive.Content> & {\n blockedInteractionCount?: number\n showCloseButton?: boolean\n }\n>(function DialogContent(\n {\n blockedInteractionCount: blockedInteractionCountProp = 0,\n className,\n children,\n forceMount,\n onEscapeKeyDown,\n onPointerDownOutside,\n showCloseButton = true,\n ...props\n },\n ref,\n) {\n const { blockedInteractionCount, requestClose } = useDialogContext(\"DialogContent\")\n const contentRef = React.useRef<React.ElementRef<typeof DialogPrimitive.Content> | null>(null)\n const blockedInteractionAnimationRef = React.useRef<Animation | null>(null)\n const totalBlockedInteractionCount = blockedInteractionCount + blockedInteractionCountProp\n\n React.useEffect(() => {\n if (totalBlockedInteractionCount === 0) {\n return\n }\n\n const dialogContentElement = contentRef.current\n\n if (!dialogContentElement || typeof dialogContentElement.animate !== \"function\") {\n return\n }\n\n const prefersReducedMotion =\n typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n const offset = prefersReducedMotion ? 6 : 12\n const duration = prefersReducedMotion ? 180 : 320\n\n blockedInteractionAnimationRef.current?.cancel()\n blockedInteractionAnimationRef.current = dialogContentElement.animate(\n [\n { marginLeft: \"0px\" },\n { marginLeft: `-${offset}px` },\n { marginLeft: `${Math.round(offset * 0.83)}px` },\n { marginLeft: `-${Math.round(offset * 0.67)}px` },\n { marginLeft: `${Math.round(offset * 0.5)}px` },\n { marginLeft: \"0px\" },\n ],\n {\n duration,\n easing: \"cubic-bezier(0.36, 0.07, 0.19, 0.97)\",\n },\n )\n\n return () => {\n blockedInteractionAnimationRef.current?.cancel()\n }\n }, [totalBlockedInteractionCount])\n\n const composedRef = React.useCallback(\n (node: React.ElementRef<typeof DialogPrimitive.Content> | null) => {\n contentRef.current = node\n setRefValue(ref, node)\n },\n [ref],\n )\n\n return (\n <DialogPortal>\n <DialogOverlay {...(forceMount === true ? { forceMount: true } : {})} />\n <DialogPrimitive.Content\n ref={composedRef}\n {...(forceMount === true ? { forceMount: true } : {})}\n data-slot=\"dialog-content\"\n className={cn(\n \"data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-[var(--layer-dialog)] grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-[var(--radius-dialog)] p-4 text-sm duration-150 outline-none data-[state=closed]:pointer-events-none data-[state=closed]:invisible sm:max-w-sm\",\n dialogSurfaceClass,\n className,\n )}\n onEscapeKeyDown={(event) => {\n onEscapeKeyDown?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n event.preventDefault()\n\n void requestClose(\"escape-key\").catch((error) => {\n console.error(\"Failed to close dialog from escape key.\", error)\n })\n }}\n onPointerDownOutside={(event) => {\n onPointerDownOutside?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n event.preventDefault()\n\n void requestClose(\"outside-click\").catch((error) => {\n console.error(\"Failed to close dialog from outside click.\", error)\n })\n }}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogClose asChild>\n <Button variant=\"ghost\" className=\"absolute top-2 right-2\" size=\"icon-sm\">\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogClose>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n})\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"dialog-header\" className={cn(\"flex flex-col gap-2\", className)} {...props} />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"bg-dialog-footer-background border-dialog-border -mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-[var(--radius-dialog)] border-t p-4 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogClose asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogClose>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"font-heading text-dialog-text text-base leading-none font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-text-muted *:[a]:hover:text-text-normal text-sm *:[a]:underline *:[a]:underline-offset-3\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogPrimitiveClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"mappings":"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","names":["DialogContent"]}
|