@tutti-os/workspace-app-center 0.0.1
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 +202 -0
- package/README.md +5 -0
- package/dist/chunk-3Z2WIHMP.js +7 -0
- package/dist/chunk-3Z2WIHMP.js.map +1 -0
- package/dist/chunk-FENSLRNH.js +690 -0
- package/dist/chunk-FENSLRNH.js.map +1 -0
- package/dist/chunk-LBSZLLZK.js +94 -0
- package/dist/chunk-LBSZLLZK.js.map +1 -0
- package/dist/chunk-VLUZD2IT.js +15 -0
- package/dist/chunk-VLUZD2IT.js.map +1 -0
- package/dist/contracts/index.d.ts +158 -0
- package/dist/contracts/index.js +11 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.js +42 -0
- package/dist/core/index.js.map +1 -0
- package/dist/i18n/index.d.ts +18 -0
- package/dist/i18n/index.js +574 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index-Bert0Egy.d.ts +71 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/index.d.ts +88 -0
- package/dist/ui/index.js +1619 -0
- package/dist/ui/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/AppCard.tsx","../../src/ui/AppCenterPanel.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport {\n Button,\n ChatIcon,\n DeleteIcon,\n EditIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MoreHorizontalIcon,\n NavApplicationsFilledIcon,\n UninstallIcon,\n UploadIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { WorkspaceAppCardViewModel } from \"../contracts/viewModel.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\n\nexport interface AppCenterFactoryProviderOption {\n readonly disabled?: boolean;\n readonly disabledReason?: string;\n readonly iconUrl?: string | null;\n readonly label: string;\n readonly provider: string;\n}\n\nexport interface AppCenterFactoryModelOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryReasoningOption {\n readonly label: string;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryPermissionOption {\n readonly label: string;\n readonly semantic?: string | null;\n readonly value: string;\n}\n\nexport interface AppCenterFactoryProviderConfiguration {\n readonly defaultModel?: string | null;\n readonly defaultPermissionModeId?: string | null;\n readonly defaultReasoningEffort?: string | null;\n readonly modelOptions: readonly AppCenterFactoryModelOption[];\n readonly permissionModeOptions: readonly AppCenterFactoryPermissionOption[];\n readonly reasoningEffortOptions: readonly AppCenterFactoryReasoningOption[];\n}\n\nexport interface AppCenterHostActions {\n readonly cancelFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly createFactoryJob?: (input: {\n displayName: string;\n model?: string;\n permissionModeId?: string;\n provider?: string;\n prompt: string;\n reasoningEffort?: string;\n }) => Promise<void> | void;\n readonly deleteApp?: (appId: string, appName: string) => Promise<void> | void;\n readonly deleteFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly exportApp?: (appId: string) => Promise<void> | void;\n readonly fixFactoryJob?: (\n jobId: string,\n prompt: string\n ) => Promise<void> | void;\n readonly importApp?: () => Promise<void> | void;\n readonly installApp?: (appId: string) => Promise<void> | void;\n readonly openApp?: (appId: string) => Promise<void> | void;\n readonly openAppFolder?: (appId: string) => Promise<void> | void;\n readonly openAppPackageFolder?: (appId: string) => Promise<void> | void;\n readonly openFactoryJobAgentSession?: (\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly modifyAppWithAgent?: (\n jobId: string,\n agentSessionId: string,\n provider?: string | null\n ) => Promise<void> | void;\n readonly publishFactoryJob?: (jobId: string) => Promise<void> | void;\n readonly replaceAppIcon?: (appId: string) => Promise<void> | void;\n readonly retryFactoryValidation?: (jobId: string) => Promise<void> | void;\n readonly retryApp?: (appId: string) => Promise<void> | void;\n readonly updateApp?: (\n appId: string,\n trigger: \"badge_button\" | \"primary_action\"\n ) => Promise<void> | void;\n readonly uninstallApp?: (appId: string) => Promise<void> | void;\n}\n\nexport interface AppCardProps {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n}\n\nexport function AppCard({\n actions,\n app,\n className,\n copy\n}: AppCardProps): ReactElement {\n const statusLabel = copy.t(app.statusLabelKey);\n const primaryActionLabel =\n app.primaryAction === \"install\"\n ? copy.t(\"actions.installApp\")\n : app.primaryAction === \"retry\"\n ? copy.t(\"actions.retryApp\")\n : app.primaryAction === \"update\"\n ? copy.t(\"actions.updateApp\")\n : copy.t(\"actions.openApp\");\n const canExecutePrimaryAction = app.primaryAction !== \"none\";\n const canOpenFromCard = app.canOpen;\n const canPublishFactoryUpdate =\n app.canPublishFactoryUpdate && !!app.factoryJobId;\n const canOpenFactorySession =\n app.canOpenFactorySession &&\n !!app.factoryAgentSessionId &&\n !!app.factoryJobId;\n const hasMoreActions =\n canPublishFactoryUpdate ||\n canOpenFactorySession ||\n app.canExport ||\n app.canDelete ||\n app.canReplaceIcon ||\n app.canOpenFolder ||\n app.canOpenPackageFolder ||\n app.canUninstall;\n const executePrimaryAction = (): void => {\n if (app.primaryAction === \"retry\") {\n void actions.retryApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"install\") {\n void actions.installApp?.(app.id);\n return;\n }\n if (app.primaryAction === \"update\") {\n void actions.updateApp?.(app.id, \"primary_action\");\n return;\n }\n if (app.primaryAction === \"open\") {\n void actions.openApp?.(app.id);\n }\n };\n const executeCardAction = (): void => {\n if (canOpenFromCard) {\n void actions.openApp?.(app.id);\n }\n };\n\n return (\n <article\n aria-disabled={canOpenFromCard ? undefined : true}\n className={cn(\n \"group flex h-full min-h-[168px] min-w-0 flex-col rounded-[12px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left text-[var(--text-primary)] transition-transform duration-200 ease-out will-change-transform hover:-translate-y-0.5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)] motion-reduce:transition-none motion-reduce:hover:translate-y-0\",\n canOpenFromCard ? \"cursor-pointer\" : \"cursor-default\",\n className\n )}\n data-app-center-app-id={app.id}\n role=\"listitem\"\n tabIndex={canOpenFromCard ? 0 : -1}\n onClick={executeCardAction}\n onKeyDown={(event) => {\n if (!canOpenFromCard || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n executeCardAction();\n }}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <AppIcon\n app={app}\n replaceIconLabel={copy.t(\"actions.replaceIcon\")}\n onReplaceIcon={() => {\n void actions.replaceAppIcon?.(app.id);\n }}\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {hasMoreActions ? (\n <AppCardMoreActions\n actions={actions}\n app={app}\n canOpenFactorySession={canOpenFactorySession}\n canPublishFactoryUpdate={canPublishFactoryUpdate}\n copy={copy}\n />\n ) : null}\n <Button\n className={cn(\n \"min-w-[56px]\",\n !canExecutePrimaryAction ? \"cursor-default\" : null,\n canExecutePrimaryAction\n ? app.primaryAction === \"retry\"\n ? statusClassName(app.status)\n : \"text-[var(--text-primary)]\"\n : statusClassName(app.status)\n )}\n disabled={!canExecutePrimaryAction}\n size=\"default\"\n title={statusLabel}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n executePrimaryAction();\n }}\n >\n {canExecutePrimaryAction ? primaryActionLabel : statusLabel}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-5 flex min-h-0 min-w-0 flex-1 flex-col p-1\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <h3 className=\"block min-w-0 truncate text-[16px] font-semibold leading-6 tracking-[0] text-[var(--text-primary)]\">\n {app.name}\n </h3>\n {app.version ? (\n <span className=\"min-w-0 flex-none text-[11px] leading-4 text-[var(--text-tertiary)] opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\">\n {copy.t(\"labels.version\", { version: app.version })}\n </span>\n ) : null}\n </div>\n {app.updateAvailable && app.availableVersion ? (\n <button\n className={cn(\n \"mt-1 inline-flex max-w-full items-center rounded-[4px] bg-[color-mix(in_srgb,var(--state-warning)_12%,transparent)] px-2 py-0.5 text-[11px] leading-4 text-[var(--state-warning)] outline-none transition-colors hover:bg-[color-mix(in_srgb,var(--state-warning)_18%,transparent)] focus-visible:ring-2 focus-visible:ring-[color-mix(in_srgb,var(--state-warning)_42%,transparent)]\",\n app.canUpdate ? \"cursor-pointer\" : \"cursor-default\"\n )}\n disabled={!app.canUpdate}\n title={copy.t(\"actions.updateApp\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n if (app.canUpdate) {\n void actions.updateApp?.(app.id, \"badge_button\");\n }\n }}\n >\n <span className=\"truncate\">\n {copy.t(\"labels.updateAvailable\", {\n version: app.availableVersion\n })}\n </span>\n </button>\n ) : null}\n {app.description ? (\n <p className=\"mt-2 line-clamp-3 text-[13px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n {app.description}\n </p>\n ) : null}\n </div>\n\n {app.errorMessage || app.tags.length > 0 ? (\n <div className=\"mt-auto flex min-w-0 flex-col gap-3 pt-3\">\n {app.errorMessage ? (\n <p\n className=\"min-w-0 rounded-[6px] bg-[color-mix(in_srgb,var(--state-danger)_10%,transparent)] px-2 py-1 text-[12px] leading-4 text-[var(--state-danger)]\"\n title={app.errorMessage}\n >\n {copy.t(\"messages.appRuntimeFailed\")}\n </p>\n ) : null}\n {app.tags.length > 0 ? (\n <div className=\"flex min-w-0 flex-wrap gap-1.5\">\n {app.tags.slice(0, 3).map((tag) => (\n <span\n className=\"inline-flex h-5 max-w-full items-center rounded-[4px] bg-[var(--transparency-block)] px-2 text-[11px] leading-4 text-[var(--text-secondary)]\"\n key={tag}\n >\n <span className=\"truncate\">{tag}</span>\n </span>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction AppCardMoreActions({\n actions,\n app,\n canOpenFactorySession,\n canPublishFactoryUpdate,\n copy\n}: {\n readonly actions: AppCenterHostActions;\n readonly app: WorkspaceAppCardViewModel;\n readonly canOpenFactorySession: boolean;\n readonly canPublishFactoryUpdate: boolean;\n readonly copy: AppCenterI18nRuntime;\n}): ReactElement {\n const menuItems: AppCenterActionMenuItem[] = [];\n\n if (canPublishFactoryUpdate) {\n menuItems.push({\n attention: true,\n icon: <UploadIcon />,\n key: \"publish\",\n label: copy.t(\"actions.publishAppUpdate\"),\n onSelect: () => {\n void actions.publishFactoryJob?.(app.factoryJobId ?? \"\");\n }\n });\n }\n\n if (canOpenFactorySession) {\n menuItems.push({\n icon: <ChatIcon />,\n key: \"modify-app-with-agent\",\n label: copy.t(\"actions.modifyAppWithAgent\"),\n onSelect: () => {\n void actions.modifyAppWithAgent?.(\n app.factoryJobId ?? \"\",\n app.factoryAgentSessionId ?? \"\",\n app.factoryProvider\n );\n }\n });\n }\n\n if (app.canReplaceIcon) {\n menuItems.push({\n icon: <EditIcon />,\n key: \"replace-icon\",\n label: copy.t(\"actions.replaceIcon\"),\n onSelect: () => {\n void actions.replaceAppIcon?.(app.id);\n }\n });\n }\n\n if (app.canOpenFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-folder\",\n label: copy.t(\"actions.openAppFolder\"),\n onSelect: () => {\n void actions.openAppFolder?.(app.id);\n }\n });\n }\n\n if (app.canOpenPackageFolder) {\n menuItems.push({\n icon: <FolderIcon />,\n key: \"open-package-folder\",\n label: copy.t(\"actions.openAppPackageFolder\"),\n onSelect: () => {\n void actions.openAppPackageFolder?.(app.id);\n }\n });\n }\n\n if (app.canExport) {\n menuItems.push({\n icon: <UploadIcon />,\n key: \"export\",\n label: copy.t(\"actions.exportApp\"),\n onSelect: () => {\n void actions.exportApp?.(app.id);\n }\n });\n }\n\n if (app.canUninstall) {\n menuItems.push({\n icon: <UninstallIcon />,\n key: \"uninstall\",\n label: copy.t(\"actions.uninstallApp\"),\n onSelect: () => {\n void actions.uninstallApp?.(app.id);\n },\n variant: \"destructive\"\n });\n }\n\n if (app.canDelete) {\n menuItems.push({\n icon: <DeleteIcon />,\n key: \"delete\",\n label: copy.t(\n app.installed ? \"actions.uninstallAndDeleteApp\" : \"actions.deleteApp\"\n ),\n onSelect: () => {\n void actions.deleteApp?.(app.id, app.name);\n },\n variant: \"destructive\"\n });\n }\n\n return (\n <AppCenterActionMenu\n ariaLabel={copy.t(\"actions.moreActions\")}\n attention={canPublishFactoryUpdate}\n items={menuItems}\n triggerTitle={copy.t(\"actions.moreActions\")}\n />\n );\n}\n\ninterface AppCenterActionMenuItem {\n readonly attention?: boolean;\n readonly icon: ReactElement;\n readonly key: string;\n readonly label: string;\n readonly onSelect: () => void;\n readonly variant?: \"default\" | \"destructive\";\n}\n\nfunction AppCenterActionMenu({\n ariaLabel,\n attention = false,\n items,\n triggerTitle\n}: {\n readonly ariaLabel: string;\n readonly attention?: boolean;\n readonly items: readonly AppCenterActionMenuItem[];\n readonly triggerTitle: string;\n}): ReactElement {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={ariaLabel}\n className=\"relative\"\n size=\"icon\"\n title={triggerTitle}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <MoreHorizontalIcon />\n {attention ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute right-1.5 top-1.5 size-1.5 rounded-full bg-[var(--state-danger)] shadow-[0_0_0_2px_var(--background-fronted)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className=\"min-w-[192px]\"\n collisionPadding={12}\n side=\"bottom\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n >\n <DropdownMenuGroup className=\"gap-[2px]\">\n {items.map((item) => (\n <DropdownMenuItem\n className=\"font-normal\"\n key={item.key}\n variant={item.variant}\n onSelect={(event) => {\n event.stopPropagation();\n item.onSelect();\n }}\n >\n {item.icon}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.attention ? (\n <span\n aria-hidden=\"true\"\n className=\"ml-2 size-1.5 flex-none rounded-full bg-[var(--state-danger)]\"\n />\n ) : null}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AppIcon({\n app,\n onReplaceIcon,\n replaceIconLabel\n}: {\n readonly app: WorkspaceAppCardViewModel;\n readonly onReplaceIcon: () => void;\n readonly replaceIconLabel: string;\n}): ReactElement {\n const icon =\n app.icon?.type === \"asset\" ? (\n <img\n alt=\"\"\n className=\"size-11 flex-none rounded-[10px] object-contain object-center select-none\"\n draggable={false}\n src={app.icon.src}\n />\n ) : (\n <span className=\"flex size-11 flex-none items-center justify-center rounded-[10px] bg-[var(--transparency-block)] text-[var(--text-secondary)]\">\n <NavApplicationsFilledIcon className=\"size-[22px]\" />\n </span>\n );\n\n return (\n <span className=\"group/app-icon relative block size-11 flex-none\">\n {icon}\n {app.canReplaceIcon ? (\n <button\n aria-label={replaceIconLabel}\n className=\"absolute inset-0 flex size-11 items-center justify-center rounded-[10px] bg-black/55 p-0 text-white opacity-0 transition-opacity duration-150 group-hover/app-icon:opacity-100 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color-mix(in_srgb,var(--border-focus)_70%,transparent)]\"\n title={replaceIconLabel}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n event.currentTarget.blur();\n onReplaceIcon();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <EditIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n );\n}\n\nfunction statusClassName(status: WorkspaceAppCardViewModel[\"status\"]): string {\n if (status === \"failed\") {\n return \"text-[var(--state-danger)]\";\n }\n if (status === \"running\") {\n return \"text-[var(--text-primary)]\";\n }\n return \"text-[var(--text-secondary)]\";\n}\n","import type { FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\nimport {\n Badge,\n BareIconButton,\n Button,\n CloseIcon,\n ConfirmationDialog,\n DeleteIcon,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileCreateIcon,\n Input,\n OpenSessionsIcon as OpenSessionsFilledIcon,\n Select,\n SelectContent,\n SelectItem,\n SelectSplitColumn,\n SelectSplitColumnItems,\n SelectSplitColumnLabel,\n SelectSplitDivider,\n SelectSplitLayout,\n SelectTrigger,\n SelectValue,\n SectionTabs,\n Spinner,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n UploadIcon as ImportIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n AppCenterViewModel,\n WorkspaceAppFactoryJobViewModel\n} from \"../contracts/viewModel.ts\";\nimport {\n sortMyAppsByCreatedDesc,\n sortRecommendedApps,\n sortRecommendedAppsForAllTab\n} from \"../core/appCenterAppOrdering.ts\";\nimport {\n resolveDefaultAppFactoryProvider,\n resolveSelectedAppFactoryProvider\n} from \"../core/appFactoryProviderDefaults.ts\";\nimport type { AppCenterI18nRuntime } from \"../i18n/appCenterI18n.ts\";\nimport {\n AppCard,\n type AppCenterFactoryProviderConfiguration,\n type AppCenterFactoryProviderOption,\n type AppCenterFactoryPermissionOption,\n type AppCenterHostActions\n} from \"./AppCard.tsx\";\n\ntype FactoryTemplateID = \"weather\" | \"lookup\" | \"system\" | \"news\" | \"gomoku\";\nexport type AppCenterAppTab = \"recommended\" | \"my\";\ntype RecommendedCategoryTabID =\n | \"all\"\n | \"product-design\"\n | \"office\"\n | \"tools\"\n | \"content-creation\";\ntype FactorySettingsMenu = \"modelReasoning\" | \"permission\" | \"provider\";\n\ninterface FactoryTemplate {\n readonly id: FactoryTemplateID;\n readonly defaultNameKey: string;\n readonly promptKey: string;\n readonly titleKey: string;\n}\n\nconst factoryTemplates: readonly FactoryTemplate[] = [\n {\n defaultNameKey: \"factory.templates.weather.defaultName\",\n id: \"weather\",\n promptKey: \"factory.templates.weather.prompt\",\n titleKey: \"factory.templates.weather.title\"\n },\n {\n defaultNameKey: \"factory.templates.lookup.defaultName\",\n id: \"lookup\",\n promptKey: \"factory.templates.lookup.prompt\",\n titleKey: \"factory.templates.lookup.title\"\n },\n {\n defaultNameKey: \"factory.templates.system.defaultName\",\n id: \"system\",\n promptKey: \"factory.templates.system.prompt\",\n titleKey: \"factory.templates.system.title\"\n },\n {\n defaultNameKey: \"factory.templates.news.defaultName\",\n id: \"news\",\n promptKey: \"factory.templates.news.prompt\",\n titleKey: \"factory.templates.news.title\"\n },\n {\n defaultNameKey: \"factory.templates.gomoku.defaultName\",\n id: \"gomoku\",\n promptKey: \"factory.templates.gomoku.prompt\",\n titleKey: \"factory.templates.gomoku.title\"\n }\n];\n\nconst recommendedCategoryTabDefinitions: readonly (\n | {\n readonly id: \"all\";\n readonly labelKey: null;\n }\n | {\n readonly id: Exclude<RecommendedCategoryTabID, \"all\">;\n readonly labelKey: string;\n }\n)[] = [\n { id: \"all\", labelKey: null },\n { id: \"tools\", labelKey: \"categories.tools\" },\n { id: \"content-creation\", labelKey: \"categories.contentCreation\" },\n { id: \"product-design\", labelKey: \"categories.productDesign\" },\n { id: \"office\", labelKey: \"categories.office\" }\n];\n\nexport interface AppCenterPanelProps {\n readonly actions: AppCenterHostActions;\n readonly activeAppTab?: AppCenterAppTab;\n readonly catalogStatus?: \"failed\" | \"loading\";\n readonly className?: string;\n readonly copy: AppCenterI18nRuntime;\n readonly defaultAgentProvider?: string | null;\n readonly errorMessage?: string;\n readonly loadProviderConfiguration?: (\n provider: string\n ) => Promise<AppCenterFactoryProviderConfiguration>;\n readonly onActiveAppTabChange?: (tab: AppCenterAppTab) => void;\n readonly providerErrorMessage?: string | null;\n readonly providerLoading?: boolean;\n readonly providerOptions?: readonly AppCenterFactoryProviderOption[];\n readonly viewModel: AppCenterViewModel;\n}\n\nexport function AppCenterPanel({\n actions,\n activeAppTab: controlledActiveAppTab,\n catalogStatus,\n className,\n copy,\n defaultAgentProvider = null,\n errorMessage,\n loadProviderConfiguration,\n onActiveAppTabChange,\n providerErrorMessage = null,\n providerLoading = false,\n providerOptions = [],\n viewModel\n}: AppCenterPanelProps): ReactElement {\n const promptTextareaId = useId();\n const [factoryDialogOpen, setFactoryDialogOpen] = useState(false);\n const [deleteAppBusy, setDeleteAppBusy] = useState(false);\n const [pendingDeleteApp, setPendingDeleteApp] = useState<{\n id: string;\n installed: boolean;\n name: string;\n } | null>(null);\n const [uninstallAppBusy, setUninstallAppBusy] = useState(false);\n const [pendingUninstallApp, setPendingUninstallApp] = useState<{\n id: string;\n name: string;\n sourceKind: AppCenterViewModel[\"apps\"][number][\"sourceKind\"];\n } | null>(null);\n const [displayName, setDisplayName] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\n const [providerConfiguration, setProviderConfiguration] =\n useState<AppCenterFactoryProviderConfiguration | null>(null);\n const [providerConfigurationStatus, setProviderConfigurationStatus] =\n useState<\"idle\" | \"loading\" | \"ready\">(\"idle\");\n const [openFactorySettingsMenu, setOpenFactorySettingsMenu] =\n useState<FactorySettingsMenu | null>(null);\n const [selectedModel, setSelectedModel] = useState(\"\");\n const [selectedPermissionModeId, setSelectedPermissionModeId] = useState(\"\");\n const [selectedReasoningEffort, setSelectedReasoningEffort] = useState(\"\");\n const normalizedProviderOptions = useMemo(\n () =>\n providerOptions\n .map((option) => {\n const provider = option.provider.trim();\n const label = option.label.trim() || provider;\n if (!provider || !label) {\n return null;\n }\n return {\n ...option,\n ...(option.disabledReason?.trim()\n ? { disabledReason: option.disabledReason.trim() }\n : {}),\n ...(option.iconUrl?.trim()\n ? { iconUrl: option.iconUrl.trim() }\n : {}),\n label,\n provider\n };\n })\n .filter((option) => option != null),\n [providerOptions]\n );\n const [selectedProvider, setSelectedProvider] = useState(() =>\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n const [uncontrolledActiveAppTab, setUncontrolledActiveAppTab] =\n useState<AppCenterAppTab>(\"recommended\");\n const [activeRecommendedCategoryTab, setActiveRecommendedCategoryTab] =\n useState<RecommendedCategoryTabID>(\"all\");\n const activeAppTab = controlledActiveAppTab ?? uncontrolledActiveAppTab;\n useEffect(() => {\n setSelectedProvider((current) =>\n resolveSelectedAppFactoryProvider(\n current,\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n }, [defaultAgentProvider, normalizedProviderOptions]);\n const selectedProviderOption =\n normalizedProviderOptions.find(\n (option) => option.provider === selectedProvider\n ) ?? null;\n useEffect(() => {\n if (!factoryDialogOpen) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n return;\n }\n const provider = selectedProviderOption?.provider?.trim() ?? \"\";\n if (!provider || !loadProviderConfiguration) {\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n return;\n }\n let canceled = false;\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"loading\");\n void loadProviderConfiguration(provider)\n .then((configuration) => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(configuration);\n setProviderConfigurationStatus(\"ready\");\n })\n .catch(() => {\n if (canceled) {\n return;\n }\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"ready\");\n });\n return () => {\n canceled = true;\n };\n }, [\n factoryDialogOpen,\n loadProviderConfiguration,\n selectedProvider,\n selectedProviderOption?.provider\n ]);\n const modelOptions = providerConfiguration?.modelOptions ?? [];\n const permissionModeOptions =\n providerConfiguration?.permissionModeOptions ?? [];\n const reasoningEffortOptions =\n providerConfiguration?.reasoningEffortOptions ?? [];\n useEffect(() => {\n setSelectedModel((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n modelOptions,\n providerConfiguration?.defaultModel\n )\n );\n }, [modelOptions, providerConfiguration?.defaultModel]);\n useEffect(() => {\n setSelectedPermissionModeId((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n permissionModeOptions,\n providerConfiguration?.defaultPermissionModeId\n )\n );\n }, [permissionModeOptions, providerConfiguration?.defaultPermissionModeId]);\n useEffect(() => {\n setSelectedReasoningEffort((current) =>\n resolveSelectedFactoryOptionValue(\n current,\n reasoningEffortOptions,\n providerConfiguration?.defaultReasoningEffort\n )\n );\n }, [providerConfiguration?.defaultReasoningEffort, reasoningEffortOptions]);\n const setActiveAppTab = (tab: AppCenterAppTab): void => {\n if (controlledActiveAppTab === undefined) {\n setUncontrolledActiveAppTab(tab);\n }\n onActiveAppTabChange?.(tab);\n };\n const factoryJobs = viewModel.factoryJobs ?? [];\n const hasFactoryJobs = factoryJobs.length > 0;\n const closeFactoryDialog = (): void => {\n setFactoryDialogOpen(false);\n setDisplayName(\"\");\n setPrompt(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n };\n const openFactoryDialog = (): void => {\n setSelectedProvider(\n resolveDefaultAppFactoryProvider(\n normalizedProviderOptions,\n defaultAgentProvider\n )\n );\n setSelectedModel(\"\");\n setSelectedPermissionModeId(\"\");\n setSelectedReasoningEffort(\"\");\n setProviderConfiguration(null);\n setProviderConfigurationStatus(\"idle\");\n setOpenFactorySettingsMenu(null);\n setFactoryDialogOpen(true);\n };\n const canCreateFactoryJob =\n !!displayName.trim() &&\n !!prompt.trim() &&\n providerConfigurationStatus !== \"loading\" &&\n !!selectedProviderOption &&\n selectedProviderOption.disabled !== true;\n const submitCreate = (event: FormEvent): void => {\n event.preventDefault();\n const normalizedDisplayName = displayName.trim();\n const normalizedPrompt = prompt.trim();\n if (\n !normalizedDisplayName ||\n !normalizedPrompt ||\n !selectedProviderOption ||\n selectedProviderOption.disabled === true\n ) {\n return;\n }\n setDisplayName(\"\");\n setPrompt(\"\");\n setFactoryDialogOpen(false);\n void actions.createFactoryJob?.({\n displayName: normalizedDisplayName,\n ...(selectedModel.trim() ? { model: selectedModel.trim() } : {}),\n ...(selectedPermissionModeId.trim()\n ? { permissionModeId: selectedPermissionModeId.trim() }\n : {}),\n provider: selectedProviderOption.provider,\n prompt: normalizedPrompt,\n ...(selectedReasoningEffort.trim()\n ? { reasoningEffort: selectedReasoningEffort.trim() }\n : {})\n });\n };\n const selectTemplate = (template: FactoryTemplate): void => {\n setDisplayName(copy.t(template.defaultNameKey));\n setPrompt(copy.t(template.promptKey));\n };\n const openFactoryJobAgentSession = (job: {\n agentSessionId?: string | null;\n provider?: string | null;\n }): void => {\n const agentSessionId = job.agentSessionId?.trim();\n if (!agentSessionId) {\n return;\n }\n void actions.openFactoryJobAgentSession?.(agentSessionId, job.provider);\n };\n const cardActions: AppCenterHostActions = {\n ...actions,\n deleteApp: (appId, appName) => {\n setPendingDeleteApp({\n id: appId,\n installed:\n viewModel.apps.find((app) => app.id === appId)?.installed ?? false,\n name: appName\n });\n },\n uninstallApp: (appId) => {\n const app = viewModel.apps.find((item) => item.id === appId);\n if (!app) {\n return;\n }\n setPendingUninstallApp({\n id: app.id,\n name: app.name,\n sourceKind: app.sourceKind\n });\n }\n };\n const loadingMessage =\n catalogStatus === \"loading\" ? copy.t(\"messages.catalogLoading\") : null;\n const failedMessage =\n catalogStatus === \"failed\" ? copy.t(\"messages.catalogFailed\") : null;\n const statusToast =\n errorMessage != null\n ? {\n busy: false,\n message: errorMessage,\n tone: \"destructive\" as const\n }\n : failedMessage != null\n ? {\n busy: false,\n message: failedMessage,\n tone: \"destructive\" as const\n }\n : loadingMessage != null\n ? {\n busy: true,\n message: loadingMessage,\n tone: \"default\" as const\n }\n : null;\n const myApps = sortMyAppsByCreatedDesc(\n viewModel.apps.filter((app) => app.sourceKind === \"local\")\n );\n const recommendedSourceApps = viewModel.apps.filter(\n (app) => app.sourceKind !== \"local\"\n );\n const recommendedApps = sortRecommendedApps(recommendedSourceApps);\n const recommendedAppsForAllTab = sortRecommendedAppsForAllTab(\n recommendedSourceApps\n );\n const recommendedCategoryTabs = createRecommendedCategoryTabs(\n recommendedApps,\n copy\n );\n const activeRecommendedCategoryLabel =\n recommendedCategoryTabs.find(\n (tab) => tab.id === activeRecommendedCategoryTab\n )?.category ?? null;\n const activeRecommendedApps =\n activeRecommendedCategoryLabel == null\n ? recommendedAppsForAllTab\n : recommendedApps.filter(\n (app) => app.category === activeRecommendedCategoryLabel\n );\n const activeApps =\n activeAppTab === \"recommended\" ? activeRecommendedApps : myApps;\n const activeAppTabTitle =\n activeAppTab === \"recommended\"\n ? copy.t(\"labels.recommendedApps\")\n : copy.t(\"labels.myApps\");\n const activeAppEmptyMessage =\n activeAppTab === \"recommended\"\n ? copy.t(\"messages.recommendedAppsEmpty\")\n : copy.t(\"messages.myAppsEmpty\");\n const pendingDeleteAppInstalled = pendingDeleteApp?.installed ?? false;\n const deleteAppConfirmLabel = copy.t(\n pendingDeleteAppInstalled\n ? \"actions.uninstallAndDeleteApp\"\n : \"actions.deleteApp\"\n );\n const deleteAppConfirmDescription = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppDescription\"\n : \"confirmations.deleteAppDescription\"\n );\n const deleteAppConfirmTitle = copy.t(\n pendingDeleteAppInstalled\n ? \"confirmations.uninstallAndDeleteAppTitle\"\n : \"confirmations.deleteAppTitle\",\n {\n name: pendingDeleteApp?.name ?? \"\"\n }\n );\n const pendingUninstallAppLocal = pendingUninstallApp?.sourceKind === \"local\";\n const uninstallAppConfirmDescription = copy.t(\n pendingUninstallAppLocal\n ? \"confirmations.uninstallAppDescriptionLocal\"\n : \"confirmations.uninstallAppDescriptionRecommended\"\n );\n const uninstallAppConfirmTitle = copy.t(\"confirmations.uninstallAppTitle\", {\n name: pendingUninstallApp?.name ?? \"\"\n });\n\n return (\n <section\n aria-label={copy.t(\"title\")}\n className={cn(\n \"relative flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden bg-[var(--background-panel)] text-[var(--text-primary)]\",\n className\n )}\n >\n {statusToast ? <AppCenterStatusToast toast={statusToast} /> : null}\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-auto px-6 pb-6 pt-5 [container-type:inline-size]\">\n {hasFactoryJobs ? (\n <section className=\"min-w-0\">\n <h2 className=\"mb-3 text-[15px] font-semibold leading-5 tracking-[0] text-[var(--text-primary)]\">\n {copy.t(\"factory.labels.jobs\")}\n </h2>\n <div className=\"flex min-w-0 flex-col gap-2\">\n {factoryJobs.map((job) => (\n <article\n aria-disabled={job.canOpenAgentSession ? undefined : true}\n className={cn(\n \"group flex min-w-0 items-center justify-between gap-3 rounded-[8px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] p-[12px] text-left transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\",\n job.canOpenAgentSession\n ? \"cursor-pointer hover:bg-[var(--transparency-block)]\"\n : \"cursor-default\"\n )}\n key={job.id}\n role=\"button\"\n tabIndex={job.canOpenAgentSession ? 0 : -1}\n onClick={() => openFactoryJobAgentSession(job)}\n onKeyDown={(event) => {\n if (\n !job.canOpenAgentSession ||\n event.currentTarget !== event.target ||\n (event.key !== \"Enter\" && event.key !== \" \")\n ) {\n return;\n }\n event.preventDefault();\n openFactoryJobAgentSession(job);\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {job.title}\n </h3>\n <FactoryJobStatusIndicator copy={copy} job={job} />\n </div>\n {job.failureReason ? (\n <p\n className=\"mt-2 truncate text-[12px] leading-4 text-[var(--state-danger)]\"\n title={job.failureReason}\n >\n {copy.t(\"factory.messages.factoryJobFailed\")}\n </p>\n ) : (\n <p className=\"mt-2 truncate text-[12px] leading-4 text-[var(--text-secondary)]\">\n {job.prompt}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {job.canRetryValidation ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.retryFactoryValidation?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.validate\")}\n </Button>\n ) : null}\n {job.canPublish ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.publishFactoryJob?.(job.id);\n }}\n >\n {copy.t(\"factory.actions.publish\")}\n </Button>\n ) : null}\n {job.canFix ? (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.fixFactoryJob?.(\n job.id,\n copy.t(\"factory.prompts.fixDefault\")\n );\n }}\n >\n {copy.t(\"factory.actions.fix\")}\n </Button>\n ) : null}\n {job.canCancel ? (\n <Button\n aria-label={copy.t(\"factory.actions.cancel\")}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n size=\"icon-sm\"\n title={copy.t(\"factory.actions.cancel\")}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.cancelFactoryJob?.(job.id);\n }}\n >\n <CloseIcon />\n </Button>\n ) : null}\n {job.canDelete ? (\n <BareIconButton\n aria-label={copy.t(\"factory.actions.delete\")}\n className=\"text-[var(--text-secondary)]\"\n size=\"md\"\n title={copy.t(\"factory.actions.delete\")}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void actions.deleteFactoryJob?.(job.id);\n }}\n >\n <DeleteIcon />\n </BareIconButton>\n ) : null}\n </div>\n </article>\n ))}\n </div>\n </section>\n ) : null}\n\n <section className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <SectionTabs\n ariaLabel={copy.t(\"labels.appList\")}\n tabs={[\n {\n label: copy.t(\"labels.recommendedApps\"),\n value: \"recommended\"\n },\n {\n label: copy.t(\"labels.myApps\"),\n value: \"my\"\n }\n ]}\n value={activeAppTab}\n onValueChange={setActiveAppTab}\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {activeAppTab === \"my\" ? (\n <AppCenterHeaderActions\n copy={copy}\n onCreateApp={() => {\n openFactoryDialog();\n }}\n onImportApp={() => {\n void actions.importApp?.();\n }}\n />\n ) : (\n <div aria-hidden=\"true\" className=\"h-8 w-[172px]\" />\n )}\n </div>\n </div>\n {viewModel.empty ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.empty\")}\n </p>\n ) : null}\n {activeAppTab === \"recommended\" ? (\n <RecommendedCategoryTabs\n copy={copy}\n tabs={recommendedCategoryTabs}\n value={activeRecommendedCategoryTab}\n onValueChange={setActiveRecommendedCategoryTab}\n />\n ) : null}\n <AppCardGrid\n actions={cardActions}\n apps={activeApps}\n copy={copy}\n emptyMessage={activeAppEmptyMessage}\n title={activeAppTabTitle}\n />\n </section>\n </div>\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteAppBusy}\n confirmLabel={deleteAppConfirmLabel}\n description={deleteAppConfirmDescription}\n open={pendingDeleteApp != null}\n title={deleteAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingDeleteApp;\n if (!app) {\n return;\n }\n setDeleteAppBusy(true);\n void Promise.resolve(actions.deleteApp?.(app.id, app.name)).finally(\n () => {\n setDeleteAppBusy(false);\n setPendingDeleteApp(null);\n }\n );\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !deleteAppBusy) {\n setPendingDeleteApp(null);\n }\n }}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={uninstallAppBusy}\n confirmLabel={copy.t(\"actions.uninstallApp\")}\n description={uninstallAppConfirmDescription}\n open={pendingUninstallApp != null}\n title={uninstallAppConfirmTitle}\n tone=\"destructive\"\n onConfirm={() => {\n const app = pendingUninstallApp;\n if (!app) {\n return;\n }\n setUninstallAppBusy(true);\n void Promise.resolve(actions.uninstallApp?.(app.id)).finally(() => {\n setUninstallAppBusy(false);\n setPendingUninstallApp(null);\n });\n }}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !uninstallAppBusy) {\n setPendingUninstallApp(null);\n }\n }}\n />\n <Dialog\n open={factoryDialogOpen}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n closeFactoryDialog();\n return;\n }\n openFactoryDialog();\n }}\n >\n <DialogContent\n className=\"sm:max-w-[min(640px,calc(100%-2rem))]\"\n showCloseButton={false}\n >\n <form\n className=\"grid max-h-[min(760px,calc(100vh-64px))] min-w-0 gap-4 overflow-auto\"\n onSubmit={submitCreate}\n >\n <DialogHeader>\n <DialogTitle>{copy.t(\"factory.labels.create\")}</DialogTitle>\n </DialogHeader>\n <label className=\"grid min-w-0 gap-2\">\n <span className=\"text-[12px] font-semibold leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.appName\")}\n </span>\n <Input\n autoFocus\n className=\"h-9 rounded-[8px]\"\n placeholder={copy.t(\"factory.placeholders.appName\")}\n value={displayName}\n onChange={(event) => setDisplayName(event.currentTarget.value)}\n />\n </label>\n <div className=\"grid min-w-0 gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <label\n className=\"text-[12px] font-semibold leading-4 text-[var(--text-secondary)]\"\n htmlFor={promptTextareaId}\n >\n {copy.t(\"factory.labels.prompt\")}\n </label>\n <div className=\"relative min-w-0\">\n <Textarea\n className=\"min-h-[148px] resize-none rounded-[10px] border border-[color:var(--line-2)] bg-[var(--background-fronted)] pb-14 leading-[1.45] sm:pb-8\"\n id={promptTextareaId}\n placeholder={copy.t(\"factory.placeholders.prompt\")}\n value={prompt}\n onChange={(event) => setPrompt(event.currentTarget.value)}\n />\n <div className=\"pointer-events-none absolute inset-x-3 bottom-1.5 flex min-w-0 flex-wrap items-end justify-between gap-2\">\n {providerErrorMessage &&\n normalizedProviderOptions.length === 0 ? (\n <p className=\"pointer-events-auto max-w-[240px] text-[12px] leading-4 text-[var(--state-danger)]\">\n {providerErrorMessage}\n </p>\n ) : (\n <span aria-hidden=\"true\" className=\"min-h-4 flex-1\" />\n )}\n <div className=\"pointer-events-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-0.5 px-0.5 py-0\">\n <FactoryProviderSelect\n copy={copy}\n errorMessage={providerErrorMessage}\n loading={providerLoading}\n open={openFactorySettingsMenu === \"provider\"}\n options={normalizedProviderOptions}\n selectedProvider={selectedProvider}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent data-[placeholder]:text-[var(--text-tertiary)]\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"provider\" : null\n )\n }\n onSelectProvider={setSelectedProvider}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryPermissionDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n open={openFactorySettingsMenu === \"permission\"}\n options={permissionModeOptions}\n selectedPermissionModeId={selectedPermissionModeId}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"permission\" : null\n )\n }\n onSelectPermissionMode={setSelectedPermissionModeId}\n />\n <div\n aria-hidden=\"true\"\n className=\"h-4 w-px bg-[var(--line-2)]\"\n />\n <FactoryModelReasoningDropdown\n copy={copy}\n loading={providerConfigurationStatus === \"loading\"}\n modelOptions={modelOptions}\n open={openFactorySettingsMenu === \"modelReasoning\"}\n reasoningEffortOptions={reasoningEffortOptions}\n selectedModel={selectedModel}\n selectedReasoningEffort={selectedReasoningEffort}\n triggerClassName=\"h-6 w-auto max-w-full border-0 bg-transparent px-1.5 text-[11px] font-medium text-[var(--text-secondary)] shadow-none hover:bg-transparent focus-visible:bg-transparent\"\n onOpenChange={(nextOpen) =>\n setOpenFactorySettingsMenu(\n nextOpen ? \"modelReasoning\" : null\n )\n }\n onSelectModel={setSelectedModel}\n onSelectReasoningEffort={setSelectedReasoningEffort}\n />\n </div>\n </div>\n </div>\n </div>\n <fieldset className=\"min-w-0 border-0 p-0\">\n <legend className=\"sr-only\">\n {copy.t(\"factory.labels.templates\")}\n </legend>\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2\">\n <span className=\"shrink-0 text-[14px] font-medium leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"factory.labels.templateInspirationPrefix\")}\n </span>\n {factoryTemplates.map((template) => (\n <button\n className=\"inline-flex max-w-full items-center gap-1 border-0 bg-transparent p-0 text-[14px] font-medium leading-5 text-[var(--text-secondary)] transition-colors duration-150 hover:text-[var(--text-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\"\n key={template.id}\n type=\"button\"\n onClick={() => selectTemplate(template)}\n >\n <span className=\"truncate\">\n {copy.t(template.titleKey)}\n </span>\n <OpenSessionsFilledIcon\n aria-hidden=\"true\"\n className=\"shrink-0\"\n size={14}\n />\n </button>\n ))}\n </div>\n </fieldset>\n </div>\n <DialogFooter>\n <Button\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={closeFactoryDialog}\n >\n {copy.t(\"factory.actions.cancel\")}\n </Button>\n <Button\n disabled={!canCreateFactoryJob}\n size=\"dialog\"\n type=\"submit\"\n >\n {copy.t(\"factory.actions.create\")}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </section>\n );\n}\n\nfunction FactoryProviderSelect({\n copy,\n errorMessage,\n loading,\n onOpenChange,\n onSelectProvider,\n open,\n options,\n selectedProvider,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n errorMessage?: string | null;\n loading?: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectProvider: (provider: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryProviderOption[];\n selectedProvider: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.provider === selectedProvider) ?? null;\n const placeholder =\n options.length > 0\n ? copy.t(\"factory.messages.noAgentProviders\")\n : loading\n ? copy.t(\"factory.messages.loadingProviders\")\n : errorMessage?.trim() || copy.t(\"factory.messages.noAgentProviders\");\n\n return (\n <Select\n disabled={options.length === 0}\n open={open}\n value={selectedOption?.provider}\n onOpenChange={onOpenChange}\n onValueChange={onSelectProvider}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.agent\")}\n className={cn(\n \"h-9 w-full rounded-[8px] px-3 font-normal [&_[data-slot=select-value]]:flex [&_[data-slot=select-value]]:min-w-0 [&_[data-slot=select-value]]:items-center [&_[data-slot=select-value]]:gap-2\",\n loading && options.length === 0 ? \"animate-pulse\" : null,\n triggerClassName\n )}\n >\n <SelectValue placeholder={placeholder}>\n {selectedOption ? (\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={selectedOption.iconUrl} />\n <span className=\"truncate\">{selectedOption.label}</span>\n </span>\n ) : null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent\n align=\"start\"\n className=\"w-[300px] min-w-[240px] max-w-[min(100vw-64px,480px)]\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length === 0 ? (\n <SelectItem disabled value=\"__no-provider__\">\n {copy.t(\"factory.messages.noAgentProviders\")}\n </SelectItem>\n ) : (\n options.map((option) => (\n <SelectItem\n disabled={option.disabled === true}\n key={option.provider}\n title={option.disabledReason}\n value={option.provider}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <AppCenterAgentProviderIcon iconUrl={option.iconUrl} />\n <span className=\"truncate\">{option.label}</span>\n </span>\n </SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryPermissionDropdown({\n copy,\n loading,\n onOpenChange,\n onSelectPermissionMode,\n open,\n options,\n selectedPermissionModeId,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n onOpenChange: (open: boolean) => void;\n onSelectPermissionMode: (value: string) => void;\n open: boolean;\n options: readonly AppCenterFactoryPermissionOption[];\n selectedPermissionModeId: string;\n triggerClassName?: string;\n}): ReactElement {\n const selectedOption =\n options.find((option) => option.value === selectedPermissionModeId) ?? null;\n const disabled = loading || options.length === 0;\n const selectedLabel = selectedOption\n ? permissionOptionLabel(copy, selectedOption)\n : selectedPermissionModeId;\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedOption?.value}\n onOpenChange={onOpenChange}\n onValueChange={onSelectPermissionMode}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.review\")}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading ? \"animate-pulse\" : null,\n disabled\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center overflow-hidden\">\n {selectedLabel ? (\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n ) : (\n <span className=\"min-w-0 truncate text-[var(--text-tertiary)]\">\n {loading\n ? copy.t(\"factory.messages.loadingConfiguration\")\n : copy.t(\"factory.messages.noPermissionOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className=\"w-max min-w-[220px] max-w-[min(100vw-32px,360px)] data-[side=top]:!translate-y-0\"\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {options.length > 0 ? (\n options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <span className=\"min-w-0 truncate\">\n {permissionOptionLabel(copy, option)}\n </span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noPermissionOptions\")}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction FactoryModelReasoningDropdown({\n copy,\n loading,\n modelOptions,\n onOpenChange,\n onSelectModel,\n onSelectReasoningEffort,\n open,\n reasoningEffortOptions,\n selectedModel,\n selectedReasoningEffort,\n triggerClassName\n}: {\n copy: AppCenterI18nRuntime;\n loading: boolean;\n modelOptions: readonly { label: string; value: string }[];\n onOpenChange: (open: boolean) => void;\n onSelectModel: (value: string) => void;\n onSelectReasoningEffort: (value: string) => void;\n open: boolean;\n reasoningEffortOptions: readonly { label: string; value: string }[];\n selectedModel: string;\n selectedReasoningEffort: string;\n triggerClassName?: string;\n}): ReactElement {\n const showModelSection = modelOptions.length > 0;\n const showReasoningSection = reasoningEffortOptions.length > 0;\n const disabled = loading || (!showModelSection && !showReasoningSection);\n const selectedModelLabel =\n modelOptions.find((option) => option.value === selectedModel)?.label ??\n selectedModel;\n const selectedReasoningLabel =\n reasoningEffortOptions.find(\n (option) => option.value === selectedReasoningEffort\n )?.label ?? selectedReasoningEffort;\n const triggerLabel = [selectedModelLabel, selectedReasoningLabel]\n .filter((value) => value.trim().length > 0)\n .join(\" \");\n const selectedValue = showModelSection\n ? selectedModel\n ? `model:${selectedModel}`\n : undefined\n : selectedReasoningEffort\n ? `reasoning:${selectedReasoningEffort}`\n : undefined;\n const applySettingsValue = (nextValue: string): void => {\n if (nextValue.startsWith(\"reasoning:\")) {\n onSelectReasoningEffort(nextValue.slice(\"reasoning:\".length));\n return;\n }\n if (nextValue.startsWith(\"model:\")) {\n onSelectModel(nextValue.slice(\"model:\".length));\n }\n };\n\n return (\n <Select\n disabled={disabled}\n open={open}\n value={selectedValue}\n onOpenChange={onOpenChange}\n onValueChange={applySettingsValue}\n >\n <SelectTrigger\n aria-label={copy.t(\"factory.labels.modelReasoning\")}\n className={cn(\n \"h-9 max-w-full rounded-[999px] border border-[color:var(--line-2)] bg-[var(--background-panel)] px-3 text-[13px] font-medium text-[var(--text-primary)] shadow-none hover:bg-[var(--transparency-block)] [&>svg:last-child]:opacity-70\",\n loading ? \"animate-pulse\" : null,\n disabled\n ? \"cursor-not-allowed text-[var(--text-tertiary)] opacity-60 hover:bg-[var(--background-panel)]\"\n : null,\n triggerClassName\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2 overflow-hidden\">\n {triggerLabel ? (\n selectedModelLabel && selectedReasoningLabel ? (\n <>\n <span className=\"min-w-0 truncate\">{selectedModelLabel}</span>\n <span className=\"shrink-0 text-[var(--text-secondary)]\">\n {selectedReasoningLabel}\n </span>\n </>\n ) : (\n <span className=\"min-w-0 truncate\">{triggerLabel}</span>\n )\n ) : (\n <span className=\"min-w-0 truncate text-[var(--text-tertiary)]\">\n {loading\n ? copy.t(\"factory.messages.loadingConfiguration\")\n : copy.t(\"factory.messages.noConfigurationOptions\")}\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"end\"\n className={cn(\n \"max-w-[min(100vw-32px,460px)] data-[side=top]:!translate-y-0\",\n showModelSection && showReasoningSection\n ? \"w-[430px]\"\n : \"w-max min-w-[240px]\"\n )}\n sideOffset={4}\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {showModelSection && showReasoningSection ? (\n <SelectSplitLayout>\n <SelectSplitColumn>\n <SelectSplitColumnLabel>\n {copy.t(\"factory.labels.model\")}\n </SelectSplitColumnLabel>\n <SelectSplitColumnItems>\n {modelOptions.map((option) => (\n <SelectItem\n key={option.value}\n value={`model:${option.value}`}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))}\n </SelectSplitColumnItems>\n </SelectSplitColumn>\n <SelectSplitDivider />\n <SelectSplitColumn>\n <SelectSplitColumnLabel>\n {copy.t(\"factory.labels.reasoningEffort\")}\n </SelectSplitColumnLabel>\n <SelectSplitColumnItems>\n {reasoningEffortOptions.map((option) => (\n <SelectItem\n forceSelectedIndicator={\n selectedReasoningEffort === option.value\n }\n key={option.value}\n value={`reasoning:${option.value}`}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))}\n </SelectSplitColumnItems>\n </SelectSplitColumn>\n </SelectSplitLayout>\n ) : showModelSection ? (\n modelOptions.map((option) => (\n <SelectItem key={option.value} value={`model:${option.value}`}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : showReasoningSection ? (\n reasoningEffortOptions.map((option) => (\n <SelectItem key={option.value} value={`reasoning:${option.value}`}>\n <span className=\"min-w-0 truncate\">{option.label}</span>\n </SelectItem>\n ))\n ) : (\n <SelectItem disabled value=\"__empty__\">\n {copy.t(\"factory.messages.noConfigurationOptions\")}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nfunction permissionOptionLabel(\n copy: AppCenterI18nRuntime,\n option: AppCenterFactoryPermissionOption\n): string {\n const semantic = option.semantic?.trim();\n if (semantic) {\n const key = `factory.permissionSemantics.${semantic}.label`;\n const translated = copy.t(key);\n if (translated !== key) {\n return translated;\n }\n }\n return option.label.trim() || option.value;\n}\n\nfunction AppCenterAgentProviderIcon({\n iconUrl\n}: {\n iconUrl?: string | null;\n}): ReactElement {\n const normalizedIconUrl = iconUrl?.trim();\n if (!normalizedIconUrl) {\n return (\n <span aria-hidden=\"true\" className=\"size-4 shrink-0 rounded-[4px]\" />\n );\n }\n\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 rounded-[4px] object-contain\"\n decoding=\"async\"\n draggable={false}\n src={normalizedIconUrl}\n />\n );\n}\n\nfunction resolveSelectedFactoryOptionValue(\n currentValue: string,\n options: readonly { value: string }[],\n defaultValue?: string | null\n): string {\n if (options.some((option) => option.value === currentValue)) {\n return currentValue;\n }\n const normalizedDefault = defaultValue?.trim() ?? \"\";\n if (\n normalizedDefault &&\n options.some((option) => option.value === normalizedDefault)\n ) {\n return normalizedDefault;\n }\n return options[0]?.value ?? \"\";\n}\n\nfunction AppCardGrid({\n actions,\n apps,\n copy,\n emptyMessage,\n title\n}: {\n readonly actions: AppCenterHostActions;\n readonly apps: AppCenterViewModel[\"apps\"];\n readonly copy: AppCenterI18nRuntime;\n readonly emptyMessage: string;\n readonly title: string;\n}): ReactElement {\n if (apps.length === 0) {\n return (\n <div\n aria-label={title}\n className=\"flex min-h-[min(360px,45vh)] min-w-0 flex-1 items-center justify-center rounded-[8px] px-6 text-center text-[13px] leading-5 text-[var(--text-secondary)]\"\n role=\"status\"\n >\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div\n aria-label={title}\n className=\"grid min-h-0 min-w-0 grid-cols-[repeat(auto-fill,minmax(min(100%,260px),1fr))] gap-3\"\n role=\"list\"\n >\n {apps.map((app) => (\n <AppCard actions={actions} app={app} copy={copy} key={app.id} />\n ))}\n </div>\n );\n}\n\ninterface RecommendedCategoryTab {\n readonly category: string | null;\n readonly count: number;\n readonly id: RecommendedCategoryTabID;\n readonly label: string;\n}\n\nfunction createRecommendedCategoryTabs(\n apps: AppCenterViewModel[\"apps\"],\n copy: AppCenterI18nRuntime\n): RecommendedCategoryTab[] {\n const categoryCounts = new Map<string, number>();\n\n for (const app of apps) {\n const category = app.category?.trim();\n if (!category) {\n continue;\n }\n categoryCounts.set(category, (categoryCounts.get(category) ?? 0) + 1);\n }\n\n return recommendedCategoryTabDefinitions.map((definition) => {\n if (definition.id === \"all\") {\n return {\n category: null,\n count: apps.length,\n id: definition.id,\n label: copy.t(\"labels.allApps\")\n };\n }\n\n const category = copy.t(definition.labelKey);\n return {\n category,\n count: categoryCounts.get(category) ?? 0,\n id: definition.id,\n label: category\n };\n });\n}\n\nfunction RecommendedCategoryTabs({\n copy,\n tabs,\n value,\n onValueChange\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly tabs: readonly RecommendedCategoryTab[];\n readonly value: RecommendedCategoryTabID;\n readonly onValueChange: (value: RecommendedCategoryTabID) => void;\n}): ReactElement {\n return (\n <div\n aria-label={copy.t(\"labels.appCategories\")}\n className=\"-mx-1 flex min-w-0 items-center gap-2 overflow-x-auto px-1 py-1\"\n role=\"tablist\"\n >\n {tabs.map((tab) => {\n const selected = tab.id === value;\n return (\n <button\n aria-selected={selected}\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-[8px] px-3 text-[13px] font-semibold leading-5 tracking-[0] transition-colors duration-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-focus)]\",\n selected\n ? \"border border-[color:var(--line-1)] bg-[var(--background-fronted)] text-[var(--text-primary)]\"\n : \"border border-transparent text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n )}\n key={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onValueChange(tab.id)}\n >\n {tab.label} {tab.count}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction AppCenterStatusToast({\n toast\n}: {\n readonly toast: {\n readonly busy: boolean;\n readonly message: string;\n readonly tone: \"default\" | \"destructive\";\n };\n}): ReactElement {\n return (\n <ToastProvider>\n <ToastRoot\n key={`${toast.tone}:${toast.message}`}\n open\n anchor=\"node\"\n busy={toast.busy}\n className={cn(\n \"z-30 w-[calc(100%_-_48px)] max-w-[640px] justify-start px-4 py-3 text-left text-[12px] leading-5 shadow-[0_14px_36px_var(--shadow-elevated)]\",\n toast.tone === \"default\"\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)]\"\n : \"\"\n )}\n nodeInsetTopPx={20}\n variant={toast.tone}\n >\n <ToastTitle className=\"w-full justify-start gap-2 text-left text-[12px] leading-5\">\n <span className=\"min-w-0 truncate\">{toast.message}</span>\n </ToastTitle>\n </ToastRoot>\n </ToastProvider>\n );\n}\n\nfunction AppCenterHeaderActions({\n copy,\n onCreateApp,\n onImportApp\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly onCreateApp: () => void;\n readonly onImportApp: () => void;\n}): ReactElement {\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onImportApp}\n >\n <ImportIcon />\n <span>{copy.t(\"actions.importApp\")}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.importAppTooltip\")}\n </TooltipContent>\n </Tooltip>\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onCreateApp}\n >\n <FileCreateIcon />\n {copy.t(\"factory.actions.create\")}\n </Button>\n </>\n );\n}\n\nfunction FactoryJobStatusIndicator({\n copy,\n job\n}: {\n readonly copy: AppCenterI18nRuntime;\n readonly job: WorkspaceAppFactoryJobViewModel;\n}): ReactElement {\n const statusLabel = copy.t(job.statusLabelKey);\n if (job.status === \"generating\") {\n return (\n <span\n aria-label={statusLabel}\n className=\"inline-flex size-3 shrink-0 items-center justify-center\"\n role=\"status\"\n title={statusLabel}\n >\n <Spinner\n className=\"text-[var(--text-tertiary)]\"\n size={12}\n strokeWidth={2}\n trackColor=\"var(--line-2)\"\n />\n </span>\n );\n }\n return (\n <Badge variant={job.status === \"failed\" ? \"destructive\" : \"secondary\"}>\n {statusLabel}\n </Badge>\n );\n}\n"],"mappings":";;;;;;;;;AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkKC,cAOA,YAPA;AA5ED,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,cAAc,KAAK,EAAE,IAAI,cAAc;AAC7C,QAAM,qBACJ,IAAI,kBAAkB,YAClB,KAAK,EAAE,oBAAoB,IAC3B,IAAI,kBAAkB,UACpB,KAAK,EAAE,kBAAkB,IACzB,IAAI,kBAAkB,WACpB,KAAK,EAAE,mBAAmB,IAC1B,KAAK,EAAE,iBAAiB;AAClC,QAAM,0BAA0B,IAAI,kBAAkB;AACtD,QAAM,kBAAkB,IAAI;AAC5B,QAAM,0BACJ,IAAI,2BAA2B,CAAC,CAAC,IAAI;AACvC,QAAM,wBACJ,IAAI,yBACJ,CAAC,CAAC,IAAI,yBACN,CAAC,CAAC,IAAI;AACR,QAAM,iBACJ,2BACA,yBACA,IAAI,aACJ,IAAI,aACJ,IAAI,kBACJ,IAAI,iBACJ,IAAI,wBACJ,IAAI;AACN,QAAM,uBAAuB,MAAY;AACvC,QAAI,IAAI,kBAAkB,SAAS;AACjC,WAAK,QAAQ,WAAW,IAAI,EAAE;AAC9B;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB,WAAW;AACnC,WAAK,QAAQ,aAAa,IAAI,EAAE;AAChC;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB,UAAU;AAClC,WAAK,QAAQ,YAAY,IAAI,IAAI,gBAAgB;AACjD;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB,QAAQ;AAChC,WAAK,QAAQ,UAAU,IAAI,EAAE;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,oBAAoB,MAAY;AACpC,QAAI,iBAAiB;AACnB,WAAK,QAAQ,UAAU,IAAI,EAAE;AAAA,IAC/B;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe,kBAAkB,SAAY;AAAA,MAC7C,WAAW;AAAA,QACT;AAAA,QACA,kBAAkB,mBAAmB;AAAA,QACrC;AAAA,MACF;AAAA,MACA,0BAAwB,IAAI;AAAA,MAC5B,MAAK;AAAA,MACL,UAAU,kBAAkB,IAAI;AAAA,MAChC,SAAS;AAAA,MACT,WAAW,CAAC,UAAU;AACpB,YAAI,CAAC,mBAAoB,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAM;AACpE;AAAA,QACF;AACA,cAAM,eAAe;AACrB,0BAAkB;AAAA,MACpB;AAAA,MAEA;AAAA,6BAAC,SAAI,WAAU,0CACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,kBAAkB,KAAK,EAAE,qBAAqB;AAAA,cAC9C,eAAe,MAAM;AACnB,qBAAK,QAAQ,iBAAiB,IAAI,EAAE;AAAA,cACtC;AAAA;AAAA,UACF;AAAA,UACA,qBAAC,SAAI,WAAU,oCACZ;AAAA,6BACC;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF,IACE;AAAA,YACJ;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,CAAC,0BAA0B,mBAAmB;AAAA,kBAC9C,0BACI,IAAI,kBAAkB,UACpB,gBAAgB,IAAI,MAAM,IAC1B,+BACF,gBAAgB,IAAI,MAAM;AAAA,gBAChC;AAAA,gBACA,UAAU,CAAC;AAAA,gBACX,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS,CAAC,UAAU;AAClB,wBAAM,gBAAgB;AACtB,uCAAqB;AAAA,gBACvB;AAAA,gBAEC,oCAA0B,qBAAqB;AAAA;AAAA,YAClD;AAAA,aACF;AAAA,WACF;AAAA,QAEA,qBAAC,SAAI,WAAU,iDACb;AAAA,+BAAC,SAAI,WAAU,WACb;AAAA,iCAAC,SAAI,WAAU,qCACb;AAAA,kCAAC,QAAG,WAAU,sGACX,cAAI,MACP;AAAA,cACC,IAAI,UACH,oBAAC,UAAK,WAAU,wKACb,eAAK,EAAE,kBAAkB,EAAE,SAAS,IAAI,QAAQ,CAAC,GACpD,IACE;AAAA,eACN;AAAA,YACC,IAAI,mBAAmB,IAAI,mBAC1B;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,IAAI,YAAY,mBAAmB;AAAA,gBACrC;AAAA,gBACA,UAAU,CAAC,IAAI;AAAA,gBACf,OAAO,KAAK,EAAE,mBAAmB;AAAA,gBACjC,MAAK;AAAA,gBACL,SAAS,CAAC,UAAU;AAClB,wBAAM,gBAAgB;AACtB,sBAAI,IAAI,WAAW;AACjB,yBAAK,QAAQ,YAAY,IAAI,IAAI,cAAc;AAAA,kBACjD;AAAA,gBACF;AAAA,gBAEA,8BAAC,UAAK,WAAU,YACb,eAAK,EAAE,0BAA0B;AAAA,kBAChC,SAAS,IAAI;AAAA,gBACf,CAAC,GACH;AAAA;AAAA,YACF,IACE;AAAA,YACH,IAAI,cACH,oBAAC,OAAE,WAAU,wFACV,cAAI,aACP,IACE;AAAA,aACN;AAAA,UAEC,IAAI,gBAAgB,IAAI,KAAK,SAAS,IACrC,qBAAC,SAAI,WAAU,4CACZ;AAAA,gBAAI,eACH;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,IAAI;AAAA,gBAEV,eAAK,EAAE,2BAA2B;AAAA;AAAA,YACrC,IACE;AAAA,YACH,IAAI,KAAK,SAAS,IACjB,oBAAC,SAAI,WAAU,kCACZ,cAAI,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QACzB;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBAGV,8BAAC,UAAK,WAAU,YAAY,eAAI;AAAA;AAAA,cAF3B;AAAA,YAGP,CACD,GACH,IACE;AAAA,aACN,IACE;AAAA,WACN;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMiB;AACf,QAAM,YAAuC,CAAC;AAE9C,MAAI,yBAAyB;AAC3B,cAAU,KAAK;AAAA,MACb,WAAW;AAAA,MACX,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,0BAA0B;AAAA,MACxC,UAAU,MAAM;AACd,aAAK,QAAQ,oBAAoB,IAAI,gBAAgB,EAAE;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,uBAAuB;AACzB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,YAAS;AAAA,MAChB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,4BAA4B;AAAA,MAC1C,UAAU,MAAM;AACd,aAAK,QAAQ;AAAA,UACX,IAAI,gBAAgB;AAAA,UACpB,IAAI,yBAAyB;AAAA,UAC7B,IAAI;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,gBAAgB;AACtB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,YAAS;AAAA,MAChB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,qBAAqB;AAAA,MACnC,UAAU,MAAM;AACd,aAAK,QAAQ,iBAAiB,IAAI,EAAE;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,eAAe;AACrB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,uBAAuB;AAAA,MACrC,UAAU,MAAM;AACd,aAAK,QAAQ,gBAAgB,IAAI,EAAE;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,sBAAsB;AAC5B,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,8BAA8B;AAAA,MAC5C,UAAU,MAAM;AACd,aAAK,QAAQ,uBAAuB,IAAI,EAAE;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,WAAW;AACjB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,mBAAmB;AAAA,MACjC,UAAU,MAAM;AACd,aAAK,QAAQ,YAAY,IAAI,EAAE;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,cAAc;AACpB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,iBAAc;AAAA,MACrB,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,sBAAsB;AAAA,MACpC,UAAU,MAAM;AACd,aAAK,QAAQ,eAAe,IAAI,EAAE;AAAA,MACpC;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,WAAW;AACjB,cAAU,KAAK;AAAA,MACb,MAAM,oBAAC,cAAW;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,KAAK;AAAA,QACV,IAAI,YAAY,kCAAkC;AAAA,MACpD;AAAA,MACA,UAAU,MAAM;AACd,aAAK,QAAQ,YAAY,IAAI,IAAI,IAAI,IAAI;AAAA,MAC3C;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,KAAK,EAAE,qBAAqB;AAAA,MACvC,WAAW;AAAA,MACX,OAAO;AAAA,MACP,cAAc,KAAK,EAAE,qBAAqB;AAAA;AAAA,EAC5C;AAEJ;AAWA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAKiB;AACf,SACE,qBAAC,gBACC;AAAA,wBAAC,uBAAoB,SAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QAEA;AAAA,8BAAC,sBAAmB;AAAA,UACnB,YACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ,IACE;AAAA;AAAA;AAAA,IACN,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAU;AAAA,QACV,kBAAkB;AAAA,QAClB,MAAK;AAAA,QACL,OAAO,EAAE,QAAQ,yBAAyB;AAAA,QAC1C,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,eAAe,CAAC,UAAU;AACxB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,WAAW,CAAC,UAAU;AACpB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QAEA,8BAAC,qBAAkB,WAAU,aAC1B,gBAAM,IAAI,CAAC,SACV;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YAEV,SAAS,KAAK;AAAA,YACd,UAAU,CAAC,UAAU;AACnB,oBAAM,gBAAgB;AACtB,mBAAK,SAAS;AAAA,YAChB;AAAA,YAEC;AAAA,mBAAK;AAAA,cACN,oBAAC,UAAK,WAAU,2BAA2B,eAAK,OAAM;AAAA,cACrD,KAAK,YACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAU;AAAA;AAAA,cACZ,IACE;AAAA;AAAA;AAAA,UAdC,KAAK;AAAA,QAeZ,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIiB;AACf,QAAM,OACJ,IAAI,MAAM,SAAS,UACjB;AAAA,IAAC;AAAA;AAAA,MACC,KAAI;AAAA,MACJ,WAAU;AAAA,MACV,WAAW;AAAA,MACX,KAAK,IAAI,KAAK;AAAA;AAAA,EAChB,IAEA,oBAAC,UAAK,WAAU,iIACd,8BAAC,6BAA0B,WAAU,eAAc,GACrD;AAGJ,SACE,qBAAC,UAAK,WAAU,mDACb;AAAA;AAAA,IACA,IAAI,iBACH;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAK;AAAA,QACL,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AACtB,gBAAM,cAAc,KAAK;AACzB,wBAAc;AAAA,QAChB;AAAA,QACA,eAAe,CAAC,UAAU;AACxB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QAEA,8BAAC,YAAS,WAAU,YAAW;AAAA;AAAA,IACjC,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,gBAAgB,QAAqD;AAC5E,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC3iBA,SAAS,WAAW,OAAO,SAAS,gBAAgB;AACpD;AAAA,EACE;AAAA,EACA;AAAA,EACA,UAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,MAAAC;AAAA,OACK;AAkdc,SA4oBP,UA5oBO,OAAAC,MAkCD,QAAAC,aAlCC;AA1arB,IAAM,mBAA+C;AAAA,EACnD;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,oCASA;AAAA,EACJ,EAAE,IAAI,OAAO,UAAU,KAAK;AAAA,EAC5B,EAAE,IAAI,SAAS,UAAU,mBAAmB;AAAA,EAC5C,EAAE,IAAI,oBAAoB,UAAU,6BAA6B;AAAA,EACjE,EAAE,IAAI,kBAAkB,UAAU,2BAA2B;AAAA,EAC7D,EAAE,IAAI,UAAU,UAAU,oBAAoB;AAChD;AAoBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB,CAAC;AAAA,EACnB;AACF,GAAsC;AACpC,QAAM,mBAAmB,MAAM;AAC/B,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAItC,IAAI;AACd,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAI5C,IAAI;AACd,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,uBAAuB,wBAAwB,IACpD,SAAuD,IAAI;AAC7D,QAAM,CAAC,6BAA6B,8BAA8B,IAChE,SAAuC,MAAM;AAC/C,QAAM,CAAC,yBAAyB,0BAA0B,IACxD,SAAqC,IAAI;AAC3C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,EAAE;AACrD,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAAS,EAAE;AAC3E,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,SAAS,EAAE;AACzE,QAAM,4BAA4B;AAAA,IAChC,MACE,gBACG,IAAI,CAAC,WAAW;AACf,YAAM,WAAW,OAAO,SAAS,KAAK;AACtC,YAAM,QAAQ,OAAO,MAAM,KAAK,KAAK;AACrC,UAAI,CAAC,YAAY,CAAC,OAAO;AACvB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAI,OAAO,gBAAgB,KAAK,IAC5B,EAAE,gBAAgB,OAAO,eAAe,KAAK,EAAE,IAC/C,CAAC;AAAA,QACL,GAAI,OAAO,SAAS,KAAK,IACrB,EAAE,SAAS,OAAO,QAAQ,KAAK,EAAE,IACjC,CAAC;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC,EACA,OAAO,CAAC,WAAW,UAAU,IAAI;AAAA,IACtC,CAAC,eAAe;AAAA,EAClB;AACA,QAAM,CAAC,kBAAkB,mBAAmB,IAAI;AAAA,IAAS,MACvD;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,CAAC,0BAA0B,2BAA2B,IAC1D,SAA0B,aAAa;AACzC,QAAM,CAAC,8BAA8B,+BAA+B,IAClE,SAAmC,KAAK;AAC1C,QAAM,eAAe,0BAA0B;AAC/C,YAAU,MAAM;AACd;AAAA,MAAoB,CAAC,YACnB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,sBAAsB,yBAAyB,CAAC;AACpD,QAAM,yBACJ,0BAA0B;AAAA,IACxB,CAAC,WAAW,OAAO,aAAa;AAAA,EAClC,KAAK;AACP,YAAU,MAAM;AACd,QAAI,CAAC,mBAAmB;AACtB,+BAAyB,IAAI;AAC7B,qCAA+B,MAAM;AACrC;AAAA,IACF;AACA,UAAM,WAAW,wBAAwB,UAAU,KAAK,KAAK;AAC7D,QAAI,CAAC,YAAY,CAAC,2BAA2B;AAC3C,+BAAyB,IAAI;AAC7B,qCAA+B,OAAO;AACtC;AAAA,IACF;AACA,QAAI,WAAW;AACf,6BAAyB,IAAI;AAC7B,mCAA+B,SAAS;AACxC,SAAK,0BAA0B,QAAQ,EACpC,KAAK,CAAC,kBAAkB;AACvB,UAAI,UAAU;AACZ;AAAA,MACF;AACA,+BAAyB,aAAa;AACtC,qCAA+B,OAAO;AAAA,IACxC,CAAC,EACA,MAAM,MAAM;AACX,UAAI,UAAU;AACZ;AAAA,MACF;AACA,+BAAyB,IAAI;AAC7B,qCAA+B,OAAO;AAAA,IACxC,CAAC;AACH,WAAO,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAwB;AAAA,EAC1B,CAAC;AACD,QAAM,eAAe,uBAAuB,gBAAgB,CAAC;AAC7D,QAAM,wBACJ,uBAAuB,yBAAyB,CAAC;AACnD,QAAM,yBACJ,uBAAuB,0BAA0B,CAAC;AACpD,YAAU,MAAM;AACd;AAAA,MAAiB,CAAC,YAChB;AAAA,QACE;AAAA,QACA;AAAA,QACA,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,uBAAuB,YAAY,CAAC;AACtD,YAAU,MAAM;AACd;AAAA,MAA4B,CAAC,YAC3B;AAAA,QACE;AAAA,QACA;AAAA,QACA,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,uBAAuB,uBAAuB,uBAAuB,CAAC;AAC1E,YAAU,MAAM;AACd;AAAA,MAA2B,CAAC,YAC1B;AAAA,QACE;AAAA,QACA;AAAA,QACA,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,uBAAuB,wBAAwB,sBAAsB,CAAC;AAC1E,QAAM,kBAAkB,CAAC,QAA+B;AACtD,QAAI,2BAA2B,QAAW;AACxC,kCAA4B,GAAG;AAAA,IACjC;AACA,2BAAuB,GAAG;AAAA,EAC5B;AACA,QAAM,cAAc,UAAU,eAAe,CAAC;AAC9C,QAAM,iBAAiB,YAAY,SAAS;AAC5C,QAAM,qBAAqB,MAAY;AACrC,yBAAqB,KAAK;AAC1B,mBAAe,EAAE;AACjB,cAAU,EAAE;AACZ,6BAAyB,IAAI;AAC7B,mCAA+B,MAAM;AACrC,+BAA2B,IAAI;AAC/B,qBAAiB,EAAE;AACnB,gCAA4B,EAAE;AAC9B,+BAA2B,EAAE;AAAA,EAC/B;AACA,QAAM,oBAAoB,MAAY;AACpC;AAAA,MACE;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,qBAAiB,EAAE;AACnB,gCAA4B,EAAE;AAC9B,+BAA2B,EAAE;AAC7B,6BAAyB,IAAI;AAC7B,mCAA+B,MAAM;AACrC,+BAA2B,IAAI;AAC/B,yBAAqB,IAAI;AAAA,EAC3B;AACA,QAAM,sBACJ,CAAC,CAAC,YAAY,KAAK,KACnB,CAAC,CAAC,OAAO,KAAK,KACd,gCAAgC,aAChC,CAAC,CAAC,0BACF,uBAAuB,aAAa;AACtC,QAAM,eAAe,CAAC,UAA2B;AAC/C,UAAM,eAAe;AACrB,UAAM,wBAAwB,YAAY,KAAK;AAC/C,UAAM,mBAAmB,OAAO,KAAK;AACrC,QACE,CAAC,yBACD,CAAC,oBACD,CAAC,0BACD,uBAAuB,aAAa,MACpC;AACA;AAAA,IACF;AACA,mBAAe,EAAE;AACjB,cAAU,EAAE;AACZ,yBAAqB,KAAK;AAC1B,SAAK,QAAQ,mBAAmB;AAAA,MAC9B,aAAa;AAAA,MACb,GAAI,cAAc,KAAK,IAAI,EAAE,OAAO,cAAc,KAAK,EAAE,IAAI,CAAC;AAAA,MAC9D,GAAI,yBAAyB,KAAK,IAC9B,EAAE,kBAAkB,yBAAyB,KAAK,EAAE,IACpD,CAAC;AAAA,MACL,UAAU,uBAAuB;AAAA,MACjC,QAAQ;AAAA,MACR,GAAI,wBAAwB,KAAK,IAC7B,EAAE,iBAAiB,wBAAwB,KAAK,EAAE,IAClD,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AACA,QAAM,iBAAiB,CAAC,aAAoC;AAC1D,mBAAe,KAAK,EAAE,SAAS,cAAc,CAAC;AAC9C,cAAU,KAAK,EAAE,SAAS,SAAS,CAAC;AAAA,EACtC;AACA,QAAM,6BAA6B,CAAC,QAGxB;AACV,UAAM,iBAAiB,IAAI,gBAAgB,KAAK;AAChD,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AACA,SAAK,QAAQ,6BAA6B,gBAAgB,IAAI,QAAQ;AAAA,EACxE;AACA,QAAM,cAAoC;AAAA,IACxC,GAAG;AAAA,IACH,WAAW,CAAC,OAAO,YAAY;AAC7B,0BAAoB;AAAA,QAClB,IAAI;AAAA,QACJ,WACE,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,GAAG,aAAa;AAAA,QAC/D,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,cAAc,CAAC,UAAU;AACvB,YAAM,MAAM,UAAU,KAAK,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK;AAC3D,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AACA,6BAAuB;AAAA,QACrB,IAAI,IAAI;AAAA,QACR,MAAM,IAAI;AAAA,QACV,YAAY,IAAI;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,iBACJ,kBAAkB,YAAY,KAAK,EAAE,yBAAyB,IAAI;AACpE,QAAM,gBACJ,kBAAkB,WAAW,KAAK,EAAE,wBAAwB,IAAI;AAClE,QAAM,cACJ,gBAAgB,OACZ;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR,IACA,iBAAiB,OACf;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR,IACA,kBAAkB,OAChB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR,IACA;AACV,QAAM,SAAS;AAAA,IACb,UAAU,KAAK,OAAO,CAAC,QAAQ,IAAI,eAAe,OAAO;AAAA,EAC3D;AACA,QAAM,wBAAwB,UAAU,KAAK;AAAA,IAC3C,CAAC,QAAQ,IAAI,eAAe;AAAA,EAC9B;AACA,QAAM,kBAAkB,oBAAoB,qBAAqB;AACjE,QAAM,2BAA2B;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACA,QAAM,iCACJ,wBAAwB;AAAA,IACtB,CAAC,QAAQ,IAAI,OAAO;AAAA,EACtB,GAAG,YAAY;AACjB,QAAM,wBACJ,kCAAkC,OAC9B,2BACA,gBAAgB;AAAA,IACd,CAAC,QAAQ,IAAI,aAAa;AAAA,EAC5B;AACN,QAAM,aACJ,iBAAiB,gBAAgB,wBAAwB;AAC3D,QAAM,oBACJ,iBAAiB,gBACb,KAAK,EAAE,wBAAwB,IAC/B,KAAK,EAAE,eAAe;AAC5B,QAAM,wBACJ,iBAAiB,gBACb,KAAK,EAAE,+BAA+B,IACtC,KAAK,EAAE,sBAAsB;AACnC,QAAM,4BAA4B,kBAAkB,aAAa;AACjE,QAAM,wBAAwB,KAAK;AAAA,IACjC,4BACI,kCACA;AAAA,EACN;AACA,QAAM,8BAA8B,KAAK;AAAA,IACvC,4BACI,mDACA;AAAA,EACN;AACA,QAAM,wBAAwB,KAAK;AAAA,IACjC,4BACI,6CACA;AAAA,IACJ;AAAA,MACE,MAAM,kBAAkB,QAAQ;AAAA,IAClC;AAAA,EACF;AACA,QAAM,2BAA2B,qBAAqB,eAAe;AACrE,QAAM,iCAAiC,KAAK;AAAA,IAC1C,2BACI,+CACA;AAAA,EACN;AACA,QAAM,2BAA2B,KAAK,EAAE,mCAAmC;AAAA,IACzE,MAAM,qBAAqB,QAAQ;AAAA,EACrC,CAAC;AAED,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,KAAK,EAAE,OAAO;AAAA,MAC1B,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA,sBAAc,gBAAAF,KAAC,wBAAqB,OAAO,aAAa,IAAK;AAAA,QAC9D,gBAAAC,MAAC,SAAI,WAAU,gGACZ;AAAA,2BACC,gBAAAA,MAAC,aAAQ,WAAU,WACjB;AAAA,4BAAAD,KAAC,QAAG,WAAU,oFACX,eAAK,EAAE,qBAAqB,GAC/B;AAAA,YACA,gBAAAA,KAAC,SAAI,WAAU,+BACZ,sBAAY,IAAI,CAAC,QAChB,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,iBAAe,IAAI,sBAAsB,SAAY;AAAA,gBACrD,WAAWC;AAAA,kBACT;AAAA,kBACA,IAAI,sBACA,wDACA;AAAA,gBACN;AAAA,gBAEA,MAAK;AAAA,gBACL,UAAU,IAAI,sBAAsB,IAAI;AAAA,gBACxC,SAAS,MAAM,2BAA2B,GAAG;AAAA,gBAC7C,WAAW,CAAC,UAAU;AACpB,sBACE,CAAC,IAAI,uBACL,MAAM,kBAAkB,MAAM,UAC7B,MAAM,QAAQ,WAAW,MAAM,QAAQ,KACxC;AACA;AAAA,kBACF;AACA,wBAAM,eAAe;AACrB,6CAA2B,GAAG;AAAA,gBAChC;AAAA,gBAEA;AAAA,kCAAAD,MAAC,SAAI,WAAU,WACb;AAAA,oCAAAA,MAAC,SAAI,WAAU,mCACb;AAAA,sCAAAD,KAAC,QAAG,WAAU,2EACX,cAAI,OACP;AAAA,sBACA,gBAAAA,KAAC,6BAA0B,MAAY,KAAU;AAAA,uBACnD;AAAA,oBACC,IAAI,gBACH,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO,IAAI;AAAA,wBAEV,eAAK,EAAE,mCAAmC;AAAA;AAAA,oBAC7C,IAEA,gBAAAA,KAAC,OAAE,WAAU,oEACV,cAAI,QACP;AAAA,qBAEJ;AAAA,kBACA,gBAAAC,MAAC,SAAI,WAAU,oCACZ;AAAA,wBAAI,qBACH,gBAAAD;AAAA,sBAACG;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,yBAAyB,IAAI,EAAE;AAAA,wBAC9C;AAAA,wBAEC,eAAK,EAAE,0BAA0B;AAAA;AAAA,oBACpC,IACE;AAAA,oBACH,IAAI,aACH,gBAAAH;AAAA,sBAACG;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,oBAAoB,IAAI,EAAE;AAAA,wBACzC;AAAA,wBAEC,eAAK,EAAE,yBAAyB;AAAA;AAAA,oBACnC,IACE;AAAA,oBACH,IAAI,SACH,gBAAAH;AAAA,sBAACG;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ;AAAA,4BACX,IAAI;AAAA,4BACJ,KAAK,EAAE,4BAA4B;AAAA,0BACrC;AAAA,wBACF;AAAA,wBAEC,eAAK,EAAE,qBAAqB;AAAA;AAAA,oBAC/B,IACE;AAAA,oBACH,IAAI,YACH,gBAAAH;AAAA,sBAACG;AAAA,sBAAA;AAAA,wBACC,cAAY,KAAK,EAAE,wBAAwB;AAAA,wBAC3C,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,OAAO,KAAK,EAAE,wBAAwB;AAAA,wBACtC,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,mBAAmB,IAAI,EAAE;AAAA,wBACxC;AAAA,wBAEA,0BAAAH,KAAC,aAAU;AAAA;AAAA,oBACb,IACE;AAAA,oBACH,IAAI,YACH,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,cAAY,KAAK,EAAE,wBAAwB;AAAA,wBAC3C,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,OAAO,KAAK,EAAE,wBAAwB;AAAA,wBACtC,MAAK;AAAA,wBACL,SAAS,CAAC,UAAU;AAClB,gCAAM,gBAAgB;AACtB,+BAAK,QAAQ,mBAAmB,IAAI,EAAE;AAAA,wBACxC;AAAA,wBAEA,0BAAAA,KAACI,aAAA,EAAW;AAAA;AAAA,oBACd,IACE;AAAA,qBACN;AAAA;AAAA;AAAA,cA9GK,IAAI;AAAA,YA+GX,CACD,GACH;AAAA,aACF,IACE;AAAA,UAEJ,gBAAAH,MAAC,aAAQ,WAAU,+BACjB;AAAA,4BAAAA,MAAC,SAAI,WAAU,mDACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,KAAK,EAAE,gBAAgB;AAAA,kBAClC,MAAM;AAAA,oBACJ;AAAA,sBACE,OAAO,KAAK,EAAE,wBAAwB;AAAA,sBACtC,OAAO;AAAA,oBACT;AAAA,oBACA;AAAA,sBACE,OAAO,KAAK,EAAE,eAAe;AAAA,sBAC7B,OAAO;AAAA,oBACT;AAAA,kBACF;AAAA,kBACA,OAAO;AAAA,kBACP,eAAe;AAAA;AAAA,cACjB;AAAA,cACA,gBAAAA,KAAC,SAAI,WAAU,oCACZ,2BAAiB,OAChB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,aAAa,MAAM;AACjB,sCAAkB;AAAA,kBACpB;AAAA,kBACA,aAAa,MAAM;AACjB,yBAAK,QAAQ,YAAY;AAAA,kBAC3B;AAAA;AAAA,cACF,IAEA,gBAAAA,KAAC,SAAI,eAAY,QAAO,WAAU,iBAAgB,GAEtD;AAAA,eACF;AAAA,YACC,UAAU,QACT,gBAAAA,KAAC,OAAE,WAAU,sDACV,eAAK,EAAE,gBAAgB,GAC1B,IACE;AAAA,YACH,iBAAiB,gBAChB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,eAAe;AAAA;AAAA,YACjB,IACE;AAAA,YACJ,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,MAAM;AAAA,gBACN;AAAA,gBACA,cAAc;AAAA,gBACd,OAAO;AAAA;AAAA,YACT;AAAA,aACF;AAAA,WACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,KAAK,EAAE,gBAAgB;AAAA,YACpC,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,MAAK;AAAA,YACL,WAAW,MAAM;AACf,oBAAM,MAAM;AACZ,kBAAI,CAAC,KAAK;AACR;AAAA,cACF;AACA,+BAAiB,IAAI;AACrB,mBAAK,QAAQ,QAAQ,QAAQ,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;AAAA,gBAC1D,MAAM;AACJ,mCAAiB,KAAK;AACtB,sCAAoB,IAAI;AAAA,gBAC1B;AAAA,cACF;AAAA,YACF;AAAA,YACA,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,YAAY,CAAC,eAAe;AAC/B,oCAAoB,IAAI;AAAA,cAC1B;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,KAAK,EAAE,gBAAgB;AAAA,YACpC,aAAa;AAAA,YACb,cAAc,KAAK,EAAE,sBAAsB;AAAA,YAC3C,aAAa;AAAA,YACb,MAAM,uBAAuB;AAAA,YAC7B,OAAO;AAAA,YACP,MAAK;AAAA,YACL,WAAW,MAAM;AACf,oBAAM,MAAM;AACZ,kBAAI,CAAC,KAAK;AACR;AAAA,cACF;AACA,kCAAoB,IAAI;AACxB,mBAAK,QAAQ,QAAQ,QAAQ,eAAe,IAAI,EAAE,CAAC,EAAE,QAAQ,MAAM;AACjE,oCAAoB,KAAK;AACzB,uCAAuB,IAAI;AAAA,cAC7B,CAAC;AAAA,YACH;AAAA,YACA,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,YAAY,CAAC,kBAAkB;AAClC,uCAAuB,IAAI;AAAA,cAC7B;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,cAAc,CAAC,aAAa;AAC1B,kBAAI,CAAC,UAAU;AACb,mCAAmB;AACnB;AAAA,cACF;AACA,gCAAkB;AAAA,YACpB;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,iBAAiB;AAAA,gBAEjB,0BAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,UAAU;AAAA,oBAEV;AAAA,sCAAAD,KAAC,gBACC,0BAAAA,KAAC,eAAa,eAAK,EAAE,uBAAuB,GAAE,GAChD;AAAA,sBACA,gBAAAC,MAAC,WAAM,WAAU,sBACf;AAAA,wCAAAD,KAAC,UAAK,WAAU,oEACb,eAAK,EAAE,wBAAwB,GAClC;AAAA,wBACA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAS;AAAA,4BACT,WAAU;AAAA,4BACV,aAAa,KAAK,EAAE,8BAA8B;AAAA,4BAClD,OAAO;AAAA,4BACP,UAAU,CAAC,UAAU,eAAe,MAAM,cAAc,KAAK;AAAA;AAAA,wBAC/D;AAAA,yBACF;AAAA,sBACA,gBAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,wCAAAA,MAAC,SAAI,WAAU,sBACb;AAAA,0CAAAD;AAAA,4BAAC;AAAA;AAAA,8BACC,WAAU;AAAA,8BACV,SAAS;AAAA,8BAER,eAAK,EAAE,uBAAuB;AAAA;AAAA,0BACjC;AAAA,0BACA,gBAAAC,MAAC,SAAI,WAAU,oBACb;AAAA,4CAAAD;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAU;AAAA,gCACV,IAAI;AAAA,gCACJ,aAAa,KAAK,EAAE,6BAA6B;AAAA,gCACjD,OAAO;AAAA,gCACP,UAAU,CAAC,UAAU,UAAU,MAAM,cAAc,KAAK;AAAA;AAAA,4BAC1D;AAAA,4BACA,gBAAAC,MAAC,SAAI,WAAU,4GACZ;AAAA,sDACD,0BAA0B,WAAW,IACnC,gBAAAD,KAAC,OAAE,WAAU,sFACV,gCACH,IAEA,gBAAAA,KAAC,UAAK,eAAY,QAAO,WAAU,kBAAiB;AAAA,8BAEtD,gBAAAC,MAAC,SAAI,WAAU,sGACb;AAAA,gDAAAD;AAAA,kCAAC;AAAA;AAAA,oCACC;AAAA,oCACA,cAAc;AAAA,oCACd,SAAS;AAAA,oCACT,MAAM,4BAA4B;AAAA,oCAClC,SAAS;AAAA,oCACT;AAAA,oCACA,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb;AAAA,sCACE,WAAW,aAAa;AAAA,oCAC1B;AAAA,oCAEF,kBAAkB;AAAA;AAAA,gCACpB;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,eAAY;AAAA,oCACZ,WAAU;AAAA;AAAA,gCACZ;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC;AAAA,oCACA,SAAS,gCAAgC;AAAA,oCACzC,MAAM,4BAA4B;AAAA,oCAClC,SAAS;AAAA,oCACT;AAAA,oCACA,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb;AAAA,sCACE,WAAW,eAAe;AAAA,oCAC5B;AAAA,oCAEF,wBAAwB;AAAA;AAAA,gCAC1B;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,eAAY;AAAA,oCACZ,WAAU;AAAA;AAAA,gCACZ;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC;AAAA,oCACA,SAAS,gCAAgC;AAAA,oCACzC;AAAA,oCACA,MAAM,4BAA4B;AAAA,oCAClC;AAAA,oCACA;AAAA,oCACA;AAAA,oCACA,kBAAiB;AAAA,oCACjB,cAAc,CAAC,aACb;AAAA,sCACE,WAAW,mBAAmB;AAAA,oCAChC;AAAA,oCAEF,eAAe;AAAA,oCACf,yBAAyB;AAAA;AAAA,gCAC3B;AAAA,iCACF;AAAA,+BACF;AAAA,6BACF;AAAA,2BACF;AAAA,wBACA,gBAAAC,MAAC,cAAS,WAAU,wBAClB;AAAA,0CAAAD,KAAC,YAAO,WAAU,WACf,eAAK,EAAE,0BAA0B,GACpC;AAAA,0BACA,gBAAAC,MAAC,SAAI,WAAU,uDACb;AAAA,4CAAAD,KAAC,UAAK,WAAU,2EACb,eAAK,EAAE,0CAA0C,GACpD;AAAA,4BACC,iBAAiB,IAAI,CAAC,aACrB,gBAAAC;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAU;AAAA,gCAEV,MAAK;AAAA,gCACL,SAAS,MAAM,eAAe,QAAQ;AAAA,gCAEtC;AAAA,kDAAAD,KAAC,UAAK,WAAU,YACb,eAAK,EAAE,SAAS,QAAQ,GAC3B;AAAA,kCACA,gBAAAA;AAAA,oCAAC;AAAA;AAAA,sCACC,eAAY;AAAA,sCACZ,WAAU;AAAA,sCACV,MAAM;AAAA;AAAA,kCACR;AAAA;AAAA;AAAA,8BAXK,SAAS;AAAA,4BAYhB,CACD;AAAA,6BACH;AAAA,2BACF;AAAA,yBACF;AAAA,sBACA,gBAAAC,MAAC,gBACC;AAAA,wCAAAD;AAAA,0BAACG;AAAA,0BAAA;AAAA,4BACC,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,SAAQ;AAAA,4BACR,SAAS;AAAA,4BAER,eAAK,EAAE,wBAAwB;AAAA;AAAA,wBAClC;AAAA,wBACA,gBAAAH;AAAA,0BAACG;AAAA,0BAAA;AAAA,4BACC,UAAU,CAAC;AAAA,4BACX,MAAK;AAAA,4BACL,MAAK;AAAA,4BAEJ,eAAK,EAAE,wBAAwB;AAAA;AAAA,wBAClC;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUiB;AACf,QAAM,iBACJ,QAAQ,KAAK,CAAC,WAAW,OAAO,aAAa,gBAAgB,KAAK;AACpE,QAAM,cACJ,QAAQ,SAAS,IACb,KAAK,EAAE,mCAAmC,IAC1C,UACE,KAAK,EAAE,mCAAmC,IAC1C,cAAc,KAAK,KAAK,KAAK,EAAE,mCAAmC;AAE1E,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,QAAQ,WAAW;AAAA,MAC7B;AAAA,MACA,OAAO,gBAAgB;AAAA,MACvB;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK,EAAE,sBAAsB;AAAA,YACzC,WAAWE;AAAA,cACT;AAAA,cACA,WAAW,QAAQ,WAAW,IAAI,kBAAkB;AAAA,cACpD;AAAA,YACF;AAAA,YAEA,0BAAAF,KAAC,eAAY,aACV,2BACC,gBAAAC,MAAC,UAAK,WAAU,mCACd;AAAA,8BAAAD,KAAC,8BAA2B,SAAS,eAAe,SAAS;AAAA,cAC7D,gBAAAA,KAAC,UAAK,WAAU,YAAY,yBAAe,OAAM;AAAA,eACnD,IACE,MACN;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,0BAA0B;AAAA,YAE1C,kBAAQ,WAAW,IAClB,gBAAAA,KAAC,cAAW,UAAQ,MAAC,OAAM,mBACxB,eAAK,EAAE,mCAAmC,GAC7C,IAEA,QAAQ,IAAI,CAAC,WACX,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU,OAAO,aAAa;AAAA,gBAE9B,OAAO,OAAO;AAAA,gBACd,OAAO,OAAO;AAAA,gBAEd,0BAAAC,MAAC,UAAK,WAAU,mCACd;AAAA,kCAAAD,KAAC,8BAA2B,SAAS,OAAO,SAAS;AAAA,kBACrD,gBAAAA,KAAC,UAAK,WAAU,YAAY,iBAAO,OAAM;AAAA,mBAC3C;AAAA;AAAA,cAPK,OAAO;AAAA,YAQd,CACD;AAAA;AAAA,QAEL;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASiB;AACf,QAAM,iBACJ,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,wBAAwB,KAAK;AACzE,QAAM,WAAW,WAAW,QAAQ,WAAW;AAC/C,QAAM,gBAAgB,iBAClB,sBAAsB,MAAM,cAAc,IAC1C;AAEJ,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO,gBAAgB;AAAA,MACvB;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK,EAAE,uBAAuB;AAAA,YAC1C,WAAWE;AAAA,cACT;AAAA,cACA,UAAU,kBAAkB;AAAA,cAC5B,WACI,iGACA;AAAA,cACJ;AAAA,YACF;AAAA,YAEA,0BAAAF,KAAC,UAAK,WAAU,6CACb,0BACC,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,yBAAc,IAElD,gBAAAA,KAAC,UAAK,WAAU,gDACb,oBACG,KAAK,EAAE,uCAAuC,IAC9C,KAAK,EAAE,sCAAsC,GACnD,GAEJ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO,EAAE,QAAQ,0BAA0B;AAAA,YAE1C,kBAAQ,SAAS,IAChB,QAAQ,IAAI,CAAC,WACX,gBAAAA,KAAC,cAA8B,OAAO,OAAO,OAC3C,0BAAAA,KAAC,UAAK,WAAU,oBACb,gCAAsB,MAAM,MAAM,GACrC,KAHe,OAAO,KAIxB,CACD,IAED,gBAAAA,KAAC,cAAW,UAAQ,MAAC,OAAM,aACxB,eAAK,EAAE,sCAAsC,GAChD;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,8BAA8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYiB;AACf,QAAM,mBAAmB,aAAa,SAAS;AAC/C,QAAM,uBAAuB,uBAAuB,SAAS;AAC7D,QAAM,WAAW,WAAY,CAAC,oBAAoB,CAAC;AACnD,QAAM,qBACJ,aAAa,KAAK,CAAC,WAAW,OAAO,UAAU,aAAa,GAAG,SAC/D;AACF,QAAM,yBACJ,uBAAuB;AAAA,IACrB,CAAC,WAAW,OAAO,UAAU;AAAA,EAC/B,GAAG,SAAS;AACd,QAAM,eAAe,CAAC,oBAAoB,sBAAsB,EAC7D,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,EACzC,KAAK,GAAG;AACX,QAAM,gBAAgB,mBAClB,gBACE,SAAS,aAAa,KACtB,SACF,0BACE,aAAa,uBAAuB,KACpC;AACN,QAAM,qBAAqB,CAAC,cAA4B;AACtD,QAAI,UAAU,WAAW,YAAY,GAAG;AACtC,8BAAwB,UAAU,MAAM,aAAa,MAAM,CAAC;AAC5D;AAAA,IACF;AACA,QAAI,UAAU,WAAW,QAAQ,GAAG;AAClC,oBAAc,UAAU,MAAM,SAAS,MAAM,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAe;AAAA,MAEf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK,EAAE,+BAA+B;AAAA,YAClD,WAAWE;AAAA,cACT;AAAA,cACA,UAAU,kBAAkB;AAAA,cAC5B,WACI,iGACA;AAAA,cACJ;AAAA,YACF;AAAA,YAEA,0BAAAF,KAAC,UAAK,WAAU,mDACb,yBACC,sBAAsB,yBACpB,gBAAAC,MAAA,YACE;AAAA,8BAAAD,KAAC,UAAK,WAAU,oBAAoB,8BAAmB;AAAA,cACvD,gBAAAA,KAAC,UAAK,WAAU,yCACb,kCACH;AAAA,eACF,IAEA,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,wBAAa,IAGnD,gBAAAA,KAAC,UAAK,WAAU,gDACb,oBACG,KAAK,EAAE,uCAAuC,IAC9C,KAAK,EAAE,yCAAyC,GACtD,GAEJ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAWE;AAAA,cACT;AAAA,cACA,oBAAoB,uBAChB,cACA;AAAA,YACN;AAAA,YACA,YAAY;AAAA,YACZ,OAAO,EAAE,QAAQ,0BAA0B;AAAA,YAE1C,8BAAoB,uBACnB,gBAAAD,MAAC,qBACC;AAAA,8BAAAA,MAAC,qBACC;AAAA,gCAAAD,KAAC,0BACE,eAAK,EAAE,sBAAsB,GAChC;AAAA,gBACA,gBAAAA,KAAC,0BACE,uBAAa,IAAI,CAAC,WACjB,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,OAAO,SAAS,OAAO,KAAK;AAAA,oBAE5B,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM;AAAA;AAAA,kBAH5C,OAAO;AAAA,gBAId,CACD,GACH;AAAA,iBACF;AAAA,cACA,gBAAAA,KAAC,sBAAmB;AAAA,cACpB,gBAAAC,MAAC,qBACC;AAAA,gCAAAD,KAAC,0BACE,eAAK,EAAE,gCAAgC,GAC1C;AAAA,gBACA,gBAAAA,KAAC,0BACE,iCAAuB,IAAI,CAAC,WAC3B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,wBACE,4BAA4B,OAAO;AAAA,oBAGrC,OAAO,aAAa,OAAO,KAAK;AAAA,oBAEhC,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM;AAAA;AAAA,kBAH5C,OAAO;AAAA,gBAId,CACD,GACH;AAAA,iBACF;AAAA,eACF,IACE,mBACF,aAAa,IAAI,CAAC,WAChB,gBAAAA,KAAC,cAA8B,OAAO,SAAS,OAAO,KAAK,IACzD,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM,KADlC,OAAO,KAExB,CACD,IACC,uBACF,uBAAuB,IAAI,CAAC,WAC1B,gBAAAA,KAAC,cAA8B,OAAO,aAAa,OAAO,KAAK,IAC7D,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM,KADlC,OAAO,KAExB,CACD,IAED,gBAAAA,KAAC,cAAW,UAAQ,MAAC,OAAM,aACxB,eAAK,EAAE,yCAAyC,GACnD;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBACP,MACA,QACQ;AACR,QAAM,WAAW,OAAO,UAAU,KAAK;AACvC,MAAI,UAAU;AACZ,UAAM,MAAM,+BAA+B,QAAQ;AACnD,UAAM,aAAa,KAAK,EAAE,GAAG;AAC7B,QAAI,eAAe,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,OAAO,MAAM,KAAK,KAAK,OAAO;AACvC;AAEA,SAAS,2BAA2B;AAAA,EAClC;AACF,GAEiB;AACf,QAAM,oBAAoB,SAAS,KAAK;AACxC,MAAI,CAAC,mBAAmB;AACtB,WACE,gBAAAA,KAAC,UAAK,eAAY,QAAO,WAAU,iCAAgC;AAAA,EAEvE;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAI;AAAA,MACJ,eAAY;AAAA,MACZ,WAAU;AAAA,MACV,UAAS;AAAA,MACT,WAAW;AAAA,MACX,KAAK;AAAA;AAAA,EACP;AAEJ;AAEA,SAAS,kCACP,cACA,SACA,cACQ;AACR,MAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,YAAY,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,QAAM,oBAAoB,cAAc,KAAK,KAAK;AAClD,MACE,qBACA,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,iBAAiB,GAC3D;AACA,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,CAAC,GAAG,SAAS;AAC9B;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMiB;AACf,MAAI,KAAK,WAAW,GAAG;AACrB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,WAAU;AAAA,MACV,MAAK;AAAA,MAEJ,eAAK,IAAI,CAAC,QACT,gBAAAA,KAAC,WAAQ,SAAkB,KAAU,QAAiB,IAAI,EAAI,CAC/D;AAAA;AAAA,EACH;AAEJ;AASA,SAAS,8BACP,MACA,MAC0B;AAC1B,QAAM,iBAAiB,oBAAI,IAAoB;AAE/C,aAAW,OAAO,MAAM;AACtB,UAAM,WAAW,IAAI,UAAU,KAAK;AACpC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,mBAAe,IAAI,WAAW,eAAe,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,EACtE;AAEA,SAAO,kCAAkC,IAAI,CAAC,eAAe;AAC3D,QAAI,WAAW,OAAO,OAAO;AAC3B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,IAAI,WAAW;AAAA,QACf,OAAO,KAAK,EAAE,gBAAgB;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,EAAE,WAAW,QAAQ;AAC3C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,eAAe,IAAI,QAAQ,KAAK;AAAA,MACvC,IAAI,WAAW;AAAA,MACf,OAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKiB;AACf,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,KAAK,EAAE,sBAAsB;AAAA,MACzC,WAAU;AAAA,MACV,MAAK;AAAA,MAEJ,eAAK,IAAI,CAAC,QAAQ;AACjB,cAAM,WAAW,IAAI,OAAO;AAC5B,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,iBAAe;AAAA,YACf,WAAWC;AAAA,cACT;AAAA,cACA,WACI,kGACA;AAAA,YACN;AAAA,YAEA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,IAAI,EAAE;AAAA,YAElC;AAAA,kBAAI;AAAA,cAAM;AAAA,cAAE,IAAI;AAAA;AAAA;AAAA,UALZ,IAAI;AAAA,QAMX;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AACF,GAMiB;AACf,SACE,gBAAAF,KAAC,iBACC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,MAAI;AAAA,MACJ,QAAO;AAAA,MACP,MAAM,MAAM;AAAA,MACZ,WAAWE;AAAA,QACT;AAAA,QACA,MAAM,SAAS,YACX,uFACA;AAAA,MACN;AAAA,MACA,gBAAgB;AAAA,MAChB,SAAS,MAAM;AAAA,MAEf,0BAAAF,KAAC,cAAW,WAAU,8DACpB,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,gBAAM,SAAQ,GACpD;AAAA;AAAA,IAfK,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO;AAAA,EAgBrC,GACF;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIiB;AACf,SACE,gBAAAC,MAAA,YACE;AAAA,oBAAAA,MAAC,WACC;AAAA,sBAAAD,KAAC,kBAAe,SAAO,MACrB,0BAAAC;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS;AAAA,UAET;AAAA,4BAAAH,KAAC,cAAW;AAAA,YACZ,gBAAAA,KAAC,UAAM,eAAK,EAAE,mBAAmB,GAAE;AAAA;AAAA;AAAA,MACrC,GACF;AAAA,MACA,gBAAAA,KAAC,kBAAe,MAAK,UAClB,eAAK,EAAE,0BAA0B,GACpC;AAAA,OACF;AAAA,IACA,gBAAAC;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS;AAAA,QAET;AAAA,0BAAAH,KAAC,kBAAe;AAAA,UACf,KAAK,EAAE,wBAAwB;AAAA;AAAA;AAAA,IAClC;AAAA,KACF;AAEJ;AAEA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA;AACF,GAGiB;AACf,QAAM,cAAc,KAAK,EAAE,IAAI,cAAc;AAC7C,MAAI,IAAI,WAAW,cAAc;AAC/B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAK;AAAA,QACL,OAAO;AAAA,QAEP,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAM;AAAA,YACN,aAAa;AAAA,YACb,YAAW;AAAA;AAAA,QACb;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,SACE,gBAAAA,KAAC,SAAM,SAAS,IAAI,WAAW,WAAW,gBAAgB,aACvD,uBACH;AAEJ;","names":["Button","DeleteIcon","cn","jsx","jsxs","cn","Button","DeleteIcon"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tutti-os/workspace-app-center",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./contracts": {
|
|
13
|
+
"types": "./dist/contracts/index.d.ts",
|
|
14
|
+
"import": "./dist/contracts/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./core": {
|
|
17
|
+
"types": "./dist/core/index.d.ts",
|
|
18
|
+
"import": "./dist/core/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./i18n": {
|
|
21
|
+
"types": "./dist/i18n/index.d.ts",
|
|
22
|
+
"import": "./dist/i18n/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./ui": {
|
|
25
|
+
"types": "./dist/ui/index.d.ts",
|
|
26
|
+
"import": "./dist/ui/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/tutti-os/tutti.git",
|
|
36
|
+
"directory": "packages/workspace/app-center"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@tutti-os/ui-i18n-runtime": "0.0.1",
|
|
40
|
+
"@tutti-os/ui-system": "0.0.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^24.0.1",
|
|
44
|
+
"@types/react": "^19.1.6",
|
|
45
|
+
"@types/react-dom": "^19.1.5",
|
|
46
|
+
"react": "^19.1.0",
|
|
47
|
+
"react-dom": "^19.1.0",
|
|
48
|
+
"typescript": "^5.8.3",
|
|
49
|
+
"@tutti-os/config-tsconfig": "0.0.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"react": "^19.1.0",
|
|
53
|
+
"react-dom": "^19.1.0"
|
|
54
|
+
},
|
|
55
|
+
"nextop": {
|
|
56
|
+
"tailwindSourceRoot": "src"
|
|
57
|
+
},
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"access": "public"
|
|
60
|
+
},
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsup --config tsup.config.ts",
|
|
63
|
+
"test": "node --test --experimental-strip-types \"./src/**/*.test.ts\"",
|
|
64
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
65
|
+
}
|
|
66
|
+
}
|