@appthen/vibe-workspace 0.1.7 → 0.1.8
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/PLUGIN_DEV.md +30 -0
- package/dist/{DocxPreview-GruinkmZ.js → DocxPreview-CAmipQT3.js} +5 -5
- package/dist/{DocxPreview-GruinkmZ.js.map → DocxPreview-CAmipQT3.js.map} +1 -1
- package/dist/{DotBadge-Dm0es7Ho.js → DotBadge-CeeLzNu3.js} +3 -3
- package/dist/{DotBadge-Dm0es7Ho.js.map → DotBadge-CeeLzNu3.js.map} +1 -1
- package/dist/{ExtensionManifestSchema-BIuNTfeS.js → ExtensionManifestSchema-INV7dTEG.js} +3 -3
- package/dist/{ExtensionManifestSchema-BIuNTfeS.js.map → ExtensionManifestSchema-INV7dTEG.js.map} +1 -1
- package/dist/{FreeCanvas-BC24RbJp.js → FreeCanvas-DritKIPq.js} +2 -2
- package/dist/{FreeCanvas-BC24RbJp.js.map → FreeCanvas-DritKIPq.js.map} +1 -1
- package/dist/{ImagePreview-BUZPZ76T.js → ImagePreview-ByIQrPzb.js} +4 -4
- package/dist/{ImagePreview-BUZPZ76T.js.map → ImagePreview-ByIQrPzb.js.map} +1 -1
- package/dist/{PdfPreview-C431TVJo.js → PdfPreview-0vwF3tLn.js} +4 -4
- package/dist/{PdfPreview-C431TVJo.js.map → PdfPreview-0vwF3tLn.js.map} +1 -1
- package/dist/{PluginContext-J-PUm9Dt.js → PluginContext-uAiGNF8S.js} +2 -20
- package/dist/PluginContext-uAiGNF8S.js.map +1 -0
- package/dist/{Workbench-C3Gi8mtZ.js → Workbench-8uTfTtsq.js} +4267 -2776
- package/dist/{Workbench-C3Gi8mtZ.js.map → Workbench-8uTfTtsq.js.map} +1 -1
- package/dist/{activate-Cn14NQGw.js → activate-DVnxnmfA.js} +84 -80
- package/dist/{activate-Cn14NQGw.js.map → activate-DVnxnmfA.js.map} +1 -1
- package/dist/canvas-core/index.js +1 -1
- package/dist/coding-kit/index.js +1 -1
- package/dist/components/index.js +4 -4
- package/dist/{devWorkbench-Ifd_a8Pb.js → devWorkbench-DZ1mFC3i.js} +2 -2
- package/dist/{devWorkbench-Ifd_a8Pb.js.map → devWorkbench-DZ1mFC3i.js.map} +1 -1
- package/dist/{dialog-DK8v51ew.js → dialog-ssICQNSV.js} +2 -2
- package/dist/{dialog-DK8v51ew.js.map → dialog-ssICQNSV.js.map} +1 -1
- package/dist/{docx-preview-BdpXCqA9.js → docx-preview-lJ7EdPsl.js} +2 -2
- package/dist/{docx-preview-BdpXCqA9.js.map → docx-preview-lJ7EdPsl.js.map} +1 -1
- package/dist/extension-cli/index.js +1 -1
- package/dist/extension-dev/index.js +1 -1
- package/dist/extension-dev-workbench/index.js +4 -4
- package/dist/extension-schema/index.js +3 -3
- package/dist/{extensionRegistry-C_OUg-8s.js → extensionRegistry-D35Ld-Wa.js} +10 -7
- package/dist/{extensionRegistry-C_OUg-8s.js.map → extensionRegistry-D35Ld-Wa.js.map} +1 -1
- package/dist/index.js +17 -17
- package/dist/index.js.map +1 -1
- package/dist/{list-detail-workspace-template-BVyGyLpE.js → list-detail-workspace-template-BTrgMGPx.js} +2 -2
- package/dist/{list-detail-workspace-template-BVyGyLpE.js.map → list-detail-workspace-template-BTrgMGPx.js.map} +1 -1
- package/dist/overlay/index.js +2 -2
- package/dist/{pluginCapabilities-9gzDTIuB.js → pluginCapabilities-BkCT7QDO.js} +197 -20
- package/dist/pluginCapabilities-BkCT7QDO.js.map +1 -0
- package/dist/plugins/agent/PluginModule.js +2 -2
- package/dist/plugins/base/index.js +1 -1
- package/dist/{sheet-CdvS0URe.js → sheet-Bsq3CLW4.js} +6 -6
- package/dist/{sheet-CdvS0URe.js.map → sheet-Bsq3CLW4.js.map} +1 -1
- package/dist/{skeleton-99iI2m9p.js → skeleton-BSqTbX9l.js} +4 -4
- package/dist/{skeleton-99iI2m9p.js.map → skeleton-BSqTbX9l.js.map} +1 -1
- package/dist/types-BL0aIpQ1.js.map +1 -1
- package/dist/ui/index.js +3 -3
- package/dist/{useBinaryFileUrl-CcgcbIxT.js → useBinaryFileUrl-D11yvGuG.js} +3 -3
- package/dist/{useBinaryFileUrl-CcgcbIxT.js.map → useBinaryFileUrl-D11yvGuG.js.map} +1 -1
- package/dist/vibe-workspace/src/components/ExtensionBadgeMark.d.ts +10 -0
- package/dist/vibe-workspace/src/components/LayoutSystem.d.ts +4 -0
- package/dist/vibe-workspace/src/components/MonacoWrapper.d.ts +5 -1
- package/dist/vibe-workspace/src/components/TopBar.d.ts +2 -0
- package/dist/vibe-workspace/src/core/extensionBadges.d.ts +47 -0
- package/dist/vibe-workspace/src/core/extensionBadges.test.d.ts +1 -0
- package/dist/vibe-workspace/src/core/extensionViews.d.ts +6 -0
- package/dist/vibe-workspace/src/core/pluginCapabilities.d.ts +15 -0
- package/dist/vibe-workspace/src/hooks/useThemeLayout.d.ts +3 -0
- package/dist/vibe-workspace/src/index.d.ts +1 -0
- package/dist/vibe-workspace/src/plugins/base/types.d.ts +1 -0
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ComponentDockBar.d.ts +6 -0
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/DynamicComponentZone.d.ts +5 -3
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/PanelSlotCard.d.ts +6 -1
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ParticipantBar.d.ts +1 -2
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ParticipantBarItem.d.ts +18 -15
- package/dist/vibe-workspace/src/plugins/conversation-network/conversationHubShell.d.ts +14 -1
- package/dist/vibe-workspace/src/plugins/conversation-network/services/conversationHubShellResolver.d.ts +3 -1
- package/dist/vibe-workspace/src/services/authRedirect.d.ts +1 -0
- package/dist/vibe-workspace/src/services/themeService.d.ts +81 -7
- package/dist/vibe-workspace/src/workbench/WorkbenchAccountMenu.d.ts +5 -0
- package/dist/vibe-workspace.css +36 -43
- package/dist/workbench/index.js +2 -2
- package/package.json +1 -1
- package/postcss.config.js +1 -2
- package/tailwind.config.js +10 -3
- package/dist/PluginContext-J-PUm9Dt.js.map +0 -1
- package/dist/pluginCapabilities-9gzDTIuB.js.map +0 -1
- package/dist/vibe-workspace/src/AgentEmbedPage.d.ts +0 -1
- package/dist/vibe-workspace/src/plugins/work-weixin/WorkWeixinPlugin.d.ts +0 -5
- package/dist/vibe-workspace/src/plugins/work-weixin/apiService.d.ts +0 -8
- package/dist/vibe-workspace/src/plugins/work-weixin/configService.d.ts +0 -46
- package/dist/vibe-workspace/src/plugins/work-weixin/index.d.ts +0 -2
- package/dist/vibe-workspace/src/plugins/workbench-admin/WorkbenchAdminSidebar.d.ts +0 -7
- package/dist/vibe-workspace/src/plugins/workbench-admin/activate.d.ts +0 -2
- package/dist/vibe-workspace/src/plugins/workbench-admin/index.d.ts +0 -2
|
@@ -4,7 +4,7 @@ import { S as Search } from "./search-BmktXQFD.js";
|
|
|
4
4
|
import { C as ConsoleInput, S as SurfacePanel } from "./panel-Brh_nRmF.js";
|
|
5
5
|
import { B as Bell, A as ArrowLeft } from "./bell-D9i7ClxC.js";
|
|
6
6
|
import * as React from "react";
|
|
7
|
-
import { q as Slot, S as Sheet, b as SheetContent, e as SheetHeader, h as SheetTitle, c as SheetDescription, d as SheetFooter } from "./sheet-
|
|
7
|
+
import { q as Slot, S as Sheet, b as SheetContent, e as SheetHeader, h as SheetTitle, c as SheetDescription, d as SheetFooter } from "./sheet-Bsq3CLW4.js";
|
|
8
8
|
import { c as cva } from "./index-CwWryNvI.js";
|
|
9
9
|
import { a as ChevronRight } from "./chevron-right-D51vM8ri.js";
|
|
10
10
|
const consoleButtonVariants = cva(
|
|
@@ -474,4 +474,4 @@ export {
|
|
|
474
474
|
CodingProductRail as c,
|
|
475
475
|
ProjectWorkspaceShell as d
|
|
476
476
|
};
|
|
477
|
-
//# sourceMappingURL=list-detail-workspace-template-
|
|
477
|
+
//# sourceMappingURL=list-detail-workspace-template-BTrgMGPx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-detail-workspace-template-BVyGyLpE.js","sources":["../src/coding-kit/primitives/button.tsx","../src/coding-kit/patterns/action-toolbar.tsx","../src/coding-kit/patterns/console-shell.tsx","../src/coding-kit/patterns/data-table-shell.tsx","../src/coding-kit/patterns/metric-card.tsx","../src/coding-kit/patterns/page-section.tsx","../src/coding-kit/patterns/project-workspace-shell.tsx","../src/coding-kit/templates/list-detail-workspace-template.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst consoleButtonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--ck-radius-sm)] border text-[13px] font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ck-brand-primary)]/20 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n primary:\n \"border-[var(--ck-brand-primary)] bg-[var(--ck-brand-primary)] text-[var(--ck-brand-contrast)] hover:border-[var(--ck-brand-primary-hover)] hover:bg-[var(--ck-brand-primary-hover)]\",\n secondary:\n \"border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] text-[var(--ck-text-primary)] hover:border-[var(--ck-border-strong)] hover:bg-[var(--ck-bg-hover)]\",\n ghost:\n \"border-transparent bg-transparent text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\",\n danger:\n \"border-[var(--ck-danger-text)] bg-[var(--ck-danger-text)] text-white hover:opacity-90\",\n },\n size: {\n md: \"h-8 px-3\",\n sm: \"h-7 px-2.5 text-[12px]\",\n icon: \"h-8 w-8\",\n },\n },\n defaultVariants: {\n variant: \"secondary\",\n size: \"md\",\n },\n }\n);\n\nexport interface ConsoleButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof consoleButtonVariants> {\n asChild?: boolean;\n}\n\nexport const ConsoleButton = React.forwardRef<\n HTMLButtonElement,\n ConsoleButtonProps\n>(({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n className={cn(consoleButtonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n});\n\nConsoleButton.displayName = \"ConsoleButton\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function ActionToolbar({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 rounded-[var(--ck-radius-md)] border border-[var(--ck-border-default)] bg-[var(--ck-bg-surface-muted)] p-4 md:flex-row md:items-center md:justify-between\",\n className\n )}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\nimport { Bell, Search } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ConsoleButton } from \"../primitives\";\nimport { ConsoleInput } from \"../primitives\";\n\nexport interface ConsoleNavItem {\n key: string;\n label: string;\n icon: React.ReactNode;\n}\n\ninterface ConsoleShellProps {\n navItems: ConsoleNavItem[];\n activeKey: string;\n onActiveKeyChange?: (key: string) => void;\n title: string;\n subtitle?: string;\n topbarActions?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function ConsoleShell({\n navItems,\n activeKey,\n onActiveKeyChange,\n title,\n subtitle,\n topbarActions,\n sidebarFooter,\n children,\n}: ConsoleShellProps) {\n return (\n <div className=\"coding-kit flex min-h-screen bg-[var(--ck-bg-page)] text-[var(--ck-text-primary)]\">\n <aside className=\"hidden w-[var(--ck-sidebar-width)] shrink-0 flex-col border-r border-[var(--ck-border-default)] bg-[var(--ck-bg-sidebar)] lg:flex\">\n <div className=\"flex h-12 items-center justify-center border-b border-[var(--ck-border-default)]\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] bg-[var(--ck-brand-primary)] text-[11px] font-semibold text-white\">\n FX\n </div>\n </div>\n\n <nav className=\"flex-1 space-y-1 px-2 py-3\">\n {navItems.map((item) => {\n const active = item.key === activeKey;\n\n return (\n <button\n key={item.key}\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-radius-sm)] px-2 py-2 text-center text-[11px] transition-colors\",\n active\n ? \"bg-[var(--ck-bg-surface)] text-[var(--ck-brand-primary)] shadow-[var(--ck-shadow-sm)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\"\n )}\n onClick={() => onActiveKeyChange?.(item.key)}\n type=\"button\"\n >\n <span className=\"flex h-5 w-5 items-center justify-center\">\n {item.icon}\n </span>\n <span className=\"leading-tight\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n\n <div className=\"border-t border-[var(--ck-border-default)] p-2\">\n {sidebarFooter}\n </div>\n </aside>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header className=\"sticky top-0 z-10 flex h-[var(--ck-topbar-height)] items-center justify-between border-b border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] px-5\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[15px] font-semibold\">{title}</div>\n {subtitle ? (\n <div className=\"truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </div>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"relative hidden w-[220px] md:block\">\n <Search className=\"pointer-events-none absolute left-2.5 inset-y-0 my-auto h-3.5 w-3.5 text-[var(--ck-text-muted)]\" />\n <ConsoleInput className=\"pl-8\" placeholder=\"搜索主体、Agent、扩展\" />\n </div>\n <ConsoleButton size=\"icon\" variant=\"ghost\" aria-label=\"消息提醒\">\n <Bell className=\"h-4 w-4\" />\n </ConsoleButton>\n {topbarActions}\n </div>\n </header>\n\n <main className=\"min-h-0 flex-1 overflow-y-auto p-5\">{children}</main>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { SurfacePanel } from \"../primitives\";\n\nexport interface DataColumn<T> {\n key: string;\n title: string;\n className?: string;\n render: (row: T) => React.ReactNode;\n}\n\ninterface DataTableShellProps<T> {\n columns: DataColumn<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n emptyState?: React.ReactNode;\n}\n\nexport function DataTableShell<T>({\n columns,\n rows,\n rowKey,\n emptyState,\n}: DataTableShellProps<T>) {\n if (!rows.length && emptyState) {\n return <>{emptyState}</>;\n }\n\n return (\n <SurfacePanel className=\"overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full border-collapse text-left\">\n <thead>\n <tr className=\"bg-[var(--ck-bg-surface-muted)]\">\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n \"border-b border-[var(--ck-border-default)] px-4 py-3 text-[12px] font-medium text-[var(--ck-text-muted)]\",\n column.className\n )}\n >\n {column.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={rowKey(row)}\n className=\"border-b border-[var(--ck-border-default)] last:border-b-0 hover:bg-[var(--ck-bg-hover)]\"\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n \"px-4 py-3 text-[13px] text-[var(--ck-text-secondary)]\",\n column.className\n )}\n >\n {column.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface MetricCardProps {\n label: string;\n value: string;\n hint?: string;\n accent?: \"brand\" | \"warning\" | \"success\";\n icon?: React.ReactNode;\n}\n\nconst accentMap = {\n brand: \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\",\n warning: \"bg-[var(--ck-warning-soft)] text-[var(--ck-warning-text)]\",\n success: \"bg-[var(--ck-success-soft)] text-[var(--ck-success-text)]\",\n} as const;\n\nexport function MetricCard({\n label,\n value,\n hint,\n accent = \"brand\",\n icon,\n}: MetricCardProps) {\n return (\n <SurfacePanel className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-[12px] text-[var(--ck-text-muted)]\">{label}</div>\n <div className=\"mt-2 text-[24px] font-semibold leading-none text-[var(--ck-text-primary)]\">\n {value}\n </div>\n {hint ? (\n <div className=\"mt-2 text-[12px] text-[var(--ck-text-secondary)]\">\n {hint}\n </div>\n ) : null}\n </div>\n {icon ? (\n <div className={`flex h-9 w-9 items-center justify-center rounded-[var(--ck-radius-sm)] ${accentMap[accent]}`}>\n {icon}\n </div>\n ) : null}\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface PageSectionProps {\n title: string;\n description?: string;\n actions?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function PageSection({\n title,\n description,\n actions,\n children,\n}: PageSectionProps) {\n return (\n <SurfacePanel className=\"p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {title}\n </h2>\n {description ? (\n <p className=\"mt-1 text-[13px] text-[var(--ck-text-secondary)]\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n {children}\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface CodingProductNavItem {\n label: string;\n icon: React.ComponentType<{ className?: string; strokeWidth?: string | number }>;\n active?: boolean;\n}\n\ninterface CodingProductRailProps {\n items: CodingProductNavItem[];\n userName?: string;\n editionLabel?: string;\n brandMark?: string;\n className?: string;\n}\n\nexport function CodingProductRail({\n items,\n userName,\n editionLabel = \"标准版\",\n brandMark = \"M\",\n className,\n}: CodingProductRailProps) {\n return (\n <aside\n className={cn(\n \"hidden w-[64px] shrink-0 flex-col border-r border-[var(--ck-border-subtle)] bg-[var(--ck-bg-sidebar)] lg:flex\",\n className,\n )}\n >\n <div className=\"flex flex-col items-center border-b border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-card-radius-sm)] bg-[var(--ck-rail-brand-bg)] text-[13px] font-semibold text-[var(--ck-brand-contrast)]\">\n {brandMark}\n </div>\n <div className=\"mt-1 rounded-full bg-[var(--ck-rail-brand-soft)] px-1.5 py-[1px] text-[9px] font-medium text-[var(--ck-rail-brand-text)]\">\n {editionLabel}\n </div>\n </div>\n <nav className=\"flex-1 space-y-1 overflow-auto px-2 py-3\">\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-card-radius-sm)] px-1 py-2 text-center transition-colors\",\n item.active\n ? \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-surface-overlay)] hover:text-[var(--ck-text-primary)]\",\n )}\n >\n <Icon className=\"h-4 w-4\" strokeWidth={1.8} />\n <span className=\"text-[11px] leading-none\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n {userName ? (\n <div className=\"border-t border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex items-center justify-center rounded-full bg-[var(--ck-rail-user-bg)] px-2 py-2 text-[11px] font-medium text-[var(--ck-brand-contrast)]\">\n {userName.slice(0, 1)}\n </div>\n </div>\n ) : null}\n </aside>\n );\n}\n\ninterface ProjectWorkspaceShellProps {\n productItems: CodingProductNavItem[];\n userName: string;\n projectSidebar?: React.ReactNode;\n systemNotice?: React.ReactNode;\n topBar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n}\n\nexport function ProjectWorkspaceShell({\n productItems,\n userName,\n projectSidebar,\n systemNotice,\n topBar,\n children,\n className,\n viewportClassName,\n contentClassName,\n}: ProjectWorkspaceShellProps) {\n return (\n <div\n className={cn(\n \"coding-kit overflow-visible rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)]\",\n className,\n )}\n >\n <div className={cn(\"flex min-h-[760px] bg-[var(--ck-surface-page)]\", viewportClassName)}>\n <CodingProductRail items={productItems} userName={userName} />\n {projectSidebar}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {systemNotice}\n {topBar}\n <div className={cn(\"min-h-0 flex-1\", contentClassName)}>{children}</div>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { ArrowLeft, ChevronRight } from 'lucide-react';\n\nimport {\n WorkbenchDrawer,\n WorkbenchDrawerContent,\n WorkbenchDrawerDescription,\n WorkbenchDrawerFooter,\n WorkbenchDrawerHeader,\n WorkbenchDrawerTitle,\n} from '../../overlay';\nimport { cn } from '../../lib/utils';\nimport { ConsoleButton as CodingButton } from '../primitives/button';\n\nexport interface CodingListDetailRowInfo {\n key: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n}\n\nexport interface CodingListDetailRowRenderContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n selected: boolean;\n select: () => void;\n}\n\nexport interface CodingListDetailDetailContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n mobile: boolean;\n}\n\nexport interface CodingListDetailWorkspaceProps<TRow> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n rows: TRow[];\n getRowInfo: (row: TRow) => CodingListDetailRowInfo;\n renderDetail: (\n context: CodingListDetailDetailContext<TRow>,\n ) => React.ReactNode;\n renderRow?: (\n context: CodingListDetailRowRenderContext<TRow>,\n ) => React.ReactNode;\n toolbar?: React.ReactNode;\n headerActions?: React.ReactNode;\n detailActions?: React.ReactNode;\n emptyState?: React.ReactNode;\n selectedKey?: string;\n defaultSelectedKey?: string;\n onSelectedKeyChange?: (key: string) => void;\n editor?: React.ReactNode;\n editorTitle?: React.ReactNode;\n editorDescription?: React.ReactNode;\n editorFooter?: React.ReactNode;\n editorOpen?: boolean;\n onEditorOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\nfunction DefaultRow<TRow>({\n context,\n}: {\n context: CodingListDetailRowRenderContext<TRow>;\n}) {\n const { info, selected, select } = context;\n\n return (\n <button\n type=\"button\"\n aria-current={selected ? 'true' : undefined}\n className={cn(\n 'flex w-full items-start gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 text-left transition-colors last:border-b-0 hover:bg-[var(--ck-bg-hover)]',\n selected && 'bg-[var(--ck-bg-active)]',\n )}\n onClick={select}\n >\n <ChevronRight\n className={cn(\n 'mt-0.5 h-4 w-4 shrink-0 text-[var(--ck-text-muted)] transition-transform',\n selected && 'rotate-90 text-[var(--ck-brand-primary)]',\n )}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-[var(--ck-text-primary)]\">\n {info.title}\n </span>\n {info.status ? (\n <span className=\"shrink-0\">{info.status}</span>\n ) : null}\n </span>\n {info.description ? (\n <span className=\"mt-1 block truncate text-[12px] text-[var(--ck-text-secondary)]\">\n {info.description}\n </span>\n ) : null}\n {info.meta ? (\n <span className=\"mt-1 block truncate text-[11px] text-[var(--ck-text-muted)]\">\n {info.meta}\n </span>\n ) : null}\n </span>\n </button>\n );\n}\n\nexport function CodingListDetailWorkspace<TRow>({\n title,\n subtitle,\n rows,\n getRowInfo,\n renderDetail,\n renderRow,\n toolbar,\n headerActions,\n detailActions,\n emptyState,\n selectedKey,\n defaultSelectedKey,\n onSelectedKeyChange,\n editor,\n editorTitle = '编辑',\n editorDescription,\n editorFooter,\n editorOpen,\n onEditorOpenChange,\n className,\n}: CodingListDetailWorkspaceProps<TRow>) {\n const rowInfos = React.useMemo(\n () => rows.map((row) => ({ row, info: getRowInfo(row) })),\n [getRowInfo, rows],\n );\n const firstKey = rowInfos[0]?.info.key || '';\n const [internalSelectedKey, setInternalSelectedKey] = React.useState(\n defaultSelectedKey || firstKey,\n );\n const [mobileDetailOpen, setMobileDetailOpen] = React.useState(false);\n const [internalEditorOpen, setInternalEditorOpen] = React.useState(false);\n const activeKey = selectedKey ?? internalSelectedKey;\n const selectedEntry =\n rowInfos.find(({ info }) => info.key === activeKey) || rowInfos[0];\n const selectedRow = selectedEntry?.row;\n const selectedInfo = selectedEntry?.info;\n const resolvedEditorOpen = editorOpen ?? internalEditorOpen;\n\n React.useEffect(() => {\n if (!selectedEntry || selectedEntry.info.key === activeKey) return;\n setInternalSelectedKey(selectedEntry.info.key);\n onSelectedKeyChange?.(selectedEntry.info.key);\n }, [activeKey, onSelectedKeyChange, selectedEntry]);\n\n const selectRow = React.useCallback(\n (key: string) => {\n setInternalSelectedKey(key);\n onSelectedKeyChange?.(key);\n setMobileDetailOpen(true);\n },\n [onSelectedKeyChange],\n );\n\n const setEditorOpen = React.useCallback(\n (open: boolean) => {\n setInternalEditorOpen(open);\n onEditorOpenChange?.(open);\n },\n [onEditorOpenChange],\n );\n\n return (\n <div\n className={cn(\n 'coding-kit flex h-full min-h-0 flex-col overflow-hidden rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] text-[var(--ck-text-primary)]',\n className,\n )}\n >\n <header className=\"flex shrink-0 items-start justify-between gap-4 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-[16px] font-semibold\">{title}</h1>\n {subtitle ? (\n <p className=\"mt-1 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </p>\n ) : null}\n </div>\n {headerActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{headerActions}</div>\n ) : null}\n </header>\n\n {toolbar ? (\n <div className=\"shrink-0 border-b border-[var(--ck-border-subtle)] bg-[var(--ck-bg-surface-muted)] px-4 py-2.5 sm:px-5\">\n {toolbar}\n </div>\n ) : null}\n\n <main className=\"relative min-h-0 flex-1 overflow-hidden\">\n <section\n className={cn(\n 'flex h-full min-h-0 flex-col lg:w-[min(58%,720px)]',\n mobileDetailOpen && 'hidden lg:flex',\n )}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-2.5 text-[12px] text-[var(--ck-text-muted)] sm:px-5\">\n <span>{rows.length} 条记录</span>\n {selectedInfo ? <span className=\"truncate\">已选:{selectedInfo.title}</span> : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {rows.length === 0 ? (\n emptyState || (\n <div className=\"px-6 py-12 text-center text-sm text-[var(--ck-text-muted)]\">\n 暂无数据\n </div>\n )\n ) : (\n rowInfos.map(({ row, info }) => {\n const context = {\n row,\n info,\n selected: info.key === selectedInfo?.key,\n select: () => selectRow(info.key),\n };\n return (\n <React.Fragment key={info.key}>\n {renderRow ? renderRow(context) : <DefaultRow context={context} />}\n </React.Fragment>\n );\n })\n )}\n </div>\n </section>\n\n {selectedRow && selectedInfo ? (\n <section\n className={cn(\n 'min-h-0 bg-[var(--ck-surface-overlay)] lg:flex lg:min-w-0 lg:flex-1 lg:border-l lg:border-[var(--ck-border-subtle)]',\n mobileDetailOpen && 'absolute inset-0 z-10 flex flex-col',\n !mobileDetailOpen && 'hidden',\n 'lg:!flex lg:!static',\n )}\n >\n <div className=\"flex shrink-0 items-start justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <CodingButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 lg:hidden\"\n aria-label=\"返回列表\"\n onClick={() => setMobileDetailOpen(false)}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </CodingButton>\n <div className=\"min-w-0\">\n <div className=\"truncate text-[13px] font-medium text-[var(--ck-brand-primary)]\">\n 详情\n </div>\n <div className=\"mt-0.5 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {selectedInfo.title}\n </div>\n </div>\n </div>\n {detailActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{detailActions}</div>\n ) : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4 sm:p-5\">\n {renderDetail({ row: selectedRow, info: selectedInfo, mobile: mobileDetailOpen })}\n </div>\n </section>\n ) : null}\n </main>\n\n {editor ? (\n <WorkbenchDrawer\n open={resolvedEditorOpen}\n onOpenChange={setEditorOpen}\n >\n <WorkbenchDrawerContent\n side=\"right\"\n mobileSide=\"bottom\"\n className=\"coding-kit flex max-h-[90dvh] flex-col gap-0 overflow-hidden p-0 md:w-[min(560px,calc(100vw-16px))] md:max-w-[560px]\"\n >\n <WorkbenchDrawerHeader className=\"shrink-0 border-b border-[var(--ck-border-subtle)] px-5 py-4 pr-14\">\n <WorkbenchDrawerTitle className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {editorTitle}\n </WorkbenchDrawerTitle>\n {editorDescription ? (\n <WorkbenchDrawerDescription className=\"mt-1 text-[12px] text-[var(--ck-text-muted)]\">\n {editorDescription}\n </WorkbenchDrawerDescription>\n ) : null}\n </WorkbenchDrawerHeader>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">{editor}</div>\n {editorFooter ? (\n <WorkbenchDrawerFooter className=\"shrink-0 border-t border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] px-5 py-3\">\n {editorFooter}\n </WorkbenchDrawerFooter>\n ) : null}\n </WorkbenchDrawerContent>\n </WorkbenchDrawer>\n ) : null}\n </div>\n );\n}\n"],"names":["CodingButton","WorkbenchDrawer","WorkbenchDrawerContent","WorkbenchDrawerHeader","WorkbenchDrawerTitle","WorkbenchDrawerDescription","WorkbenchDrawerFooter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list-detail-workspace-template-BTrgMGPx.js","sources":["../src/coding-kit/primitives/button.tsx","../src/coding-kit/patterns/action-toolbar.tsx","../src/coding-kit/patterns/console-shell.tsx","../src/coding-kit/patterns/data-table-shell.tsx","../src/coding-kit/patterns/metric-card.tsx","../src/coding-kit/patterns/page-section.tsx","../src/coding-kit/patterns/project-workspace-shell.tsx","../src/coding-kit/templates/list-detail-workspace-template.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst consoleButtonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--ck-radius-sm)] border text-[13px] font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ck-brand-primary)]/20 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n primary:\n \"border-[var(--ck-brand-primary)] bg-[var(--ck-brand-primary)] text-[var(--ck-brand-contrast)] hover:border-[var(--ck-brand-primary-hover)] hover:bg-[var(--ck-brand-primary-hover)]\",\n secondary:\n \"border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] text-[var(--ck-text-primary)] hover:border-[var(--ck-border-strong)] hover:bg-[var(--ck-bg-hover)]\",\n ghost:\n \"border-transparent bg-transparent text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\",\n danger:\n \"border-[var(--ck-danger-text)] bg-[var(--ck-danger-text)] text-white hover:opacity-90\",\n },\n size: {\n md: \"h-8 px-3\",\n sm: \"h-7 px-2.5 text-[12px]\",\n icon: \"h-8 w-8\",\n },\n },\n defaultVariants: {\n variant: \"secondary\",\n size: \"md\",\n },\n }\n);\n\nexport interface ConsoleButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof consoleButtonVariants> {\n asChild?: boolean;\n}\n\nexport const ConsoleButton = React.forwardRef<\n HTMLButtonElement,\n ConsoleButtonProps\n>(({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n className={cn(consoleButtonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n});\n\nConsoleButton.displayName = \"ConsoleButton\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function ActionToolbar({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 rounded-[var(--ck-radius-md)] border border-[var(--ck-border-default)] bg-[var(--ck-bg-surface-muted)] p-4 md:flex-row md:items-center md:justify-between\",\n className\n )}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\nimport { Bell, Search } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ConsoleButton } from \"../primitives\";\nimport { ConsoleInput } from \"../primitives\";\n\nexport interface ConsoleNavItem {\n key: string;\n label: string;\n icon: React.ReactNode;\n}\n\ninterface ConsoleShellProps {\n navItems: ConsoleNavItem[];\n activeKey: string;\n onActiveKeyChange?: (key: string) => void;\n title: string;\n subtitle?: string;\n topbarActions?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function ConsoleShell({\n navItems,\n activeKey,\n onActiveKeyChange,\n title,\n subtitle,\n topbarActions,\n sidebarFooter,\n children,\n}: ConsoleShellProps) {\n return (\n <div className=\"coding-kit flex min-h-screen bg-[var(--ck-bg-page)] text-[var(--ck-text-primary)]\">\n <aside className=\"hidden w-[var(--ck-sidebar-width)] shrink-0 flex-col border-r border-[var(--ck-border-default)] bg-[var(--ck-bg-sidebar)] lg:flex\">\n <div className=\"flex h-12 items-center justify-center border-b border-[var(--ck-border-default)]\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] bg-[var(--ck-brand-primary)] text-[11px] font-semibold text-white\">\n FX\n </div>\n </div>\n\n <nav className=\"flex-1 space-y-1 px-2 py-3\">\n {navItems.map((item) => {\n const active = item.key === activeKey;\n\n return (\n <button\n key={item.key}\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-radius-sm)] px-2 py-2 text-center text-[11px] transition-colors\",\n active\n ? \"bg-[var(--ck-bg-surface)] text-[var(--ck-brand-primary)] shadow-[var(--ck-shadow-sm)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\"\n )}\n onClick={() => onActiveKeyChange?.(item.key)}\n type=\"button\"\n >\n <span className=\"flex h-5 w-5 items-center justify-center\">\n {item.icon}\n </span>\n <span className=\"leading-tight\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n\n <div className=\"border-t border-[var(--ck-border-default)] p-2\">\n {sidebarFooter}\n </div>\n </aside>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header className=\"sticky top-0 z-10 flex h-[var(--ck-topbar-height)] items-center justify-between border-b border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] px-5\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[15px] font-semibold\">{title}</div>\n {subtitle ? (\n <div className=\"truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </div>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"relative hidden w-[220px] md:block\">\n <Search className=\"pointer-events-none absolute left-2.5 inset-y-0 my-auto h-3.5 w-3.5 text-[var(--ck-text-muted)]\" />\n <ConsoleInput className=\"pl-8\" placeholder=\"搜索主体、Agent、扩展\" />\n </div>\n <ConsoleButton size=\"icon\" variant=\"ghost\" aria-label=\"消息提醒\">\n <Bell className=\"h-4 w-4\" />\n </ConsoleButton>\n {topbarActions}\n </div>\n </header>\n\n <main className=\"min-h-0 flex-1 overflow-y-auto p-5\">{children}</main>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { SurfacePanel } from \"../primitives\";\n\nexport interface DataColumn<T> {\n key: string;\n title: string;\n className?: string;\n render: (row: T) => React.ReactNode;\n}\n\ninterface DataTableShellProps<T> {\n columns: DataColumn<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n emptyState?: React.ReactNode;\n}\n\nexport function DataTableShell<T>({\n columns,\n rows,\n rowKey,\n emptyState,\n}: DataTableShellProps<T>) {\n if (!rows.length && emptyState) {\n return <>{emptyState}</>;\n }\n\n return (\n <SurfacePanel className=\"overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full border-collapse text-left\">\n <thead>\n <tr className=\"bg-[var(--ck-bg-surface-muted)]\">\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n \"border-b border-[var(--ck-border-default)] px-4 py-3 text-[12px] font-medium text-[var(--ck-text-muted)]\",\n column.className\n )}\n >\n {column.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={rowKey(row)}\n className=\"border-b border-[var(--ck-border-default)] last:border-b-0 hover:bg-[var(--ck-bg-hover)]\"\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n \"px-4 py-3 text-[13px] text-[var(--ck-text-secondary)]\",\n column.className\n )}\n >\n {column.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface MetricCardProps {\n label: string;\n value: string;\n hint?: string;\n accent?: \"brand\" | \"warning\" | \"success\";\n icon?: React.ReactNode;\n}\n\nconst accentMap = {\n brand: \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\",\n warning: \"bg-[var(--ck-warning-soft)] text-[var(--ck-warning-text)]\",\n success: \"bg-[var(--ck-success-soft)] text-[var(--ck-success-text)]\",\n} as const;\n\nexport function MetricCard({\n label,\n value,\n hint,\n accent = \"brand\",\n icon,\n}: MetricCardProps) {\n return (\n <SurfacePanel className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-[12px] text-[var(--ck-text-muted)]\">{label}</div>\n <div className=\"mt-2 text-[24px] font-semibold leading-none text-[var(--ck-text-primary)]\">\n {value}\n </div>\n {hint ? (\n <div className=\"mt-2 text-[12px] text-[var(--ck-text-secondary)]\">\n {hint}\n </div>\n ) : null}\n </div>\n {icon ? (\n <div className={`flex h-9 w-9 items-center justify-center rounded-[var(--ck-radius-sm)] ${accentMap[accent]}`}>\n {icon}\n </div>\n ) : null}\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface PageSectionProps {\n title: string;\n description?: string;\n actions?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function PageSection({\n title,\n description,\n actions,\n children,\n}: PageSectionProps) {\n return (\n <SurfacePanel className=\"p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {title}\n </h2>\n {description ? (\n <p className=\"mt-1 text-[13px] text-[var(--ck-text-secondary)]\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n {children}\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface CodingProductNavItem {\n label: string;\n icon: React.ComponentType<{ className?: string; strokeWidth?: string | number }>;\n active?: boolean;\n}\n\ninterface CodingProductRailProps {\n items: CodingProductNavItem[];\n userName?: string;\n editionLabel?: string;\n brandMark?: string;\n className?: string;\n}\n\nexport function CodingProductRail({\n items,\n userName,\n editionLabel = \"标准版\",\n brandMark = \"M\",\n className,\n}: CodingProductRailProps) {\n return (\n <aside\n className={cn(\n \"hidden w-[64px] shrink-0 flex-col border-r border-[var(--ck-border-subtle)] bg-[var(--ck-bg-sidebar)] lg:flex\",\n className,\n )}\n >\n <div className=\"flex flex-col items-center border-b border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-card-radius-sm)] bg-[var(--ck-rail-brand-bg)] text-[13px] font-semibold text-[var(--ck-brand-contrast)]\">\n {brandMark}\n </div>\n <div className=\"mt-1 rounded-full bg-[var(--ck-rail-brand-soft)] px-1.5 py-[1px] text-[9px] font-medium text-[var(--ck-rail-brand-text)]\">\n {editionLabel}\n </div>\n </div>\n <nav className=\"flex-1 space-y-1 overflow-auto px-2 py-3\">\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-card-radius-sm)] px-1 py-2 text-center transition-colors\",\n item.active\n ? \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-surface-overlay)] hover:text-[var(--ck-text-primary)]\",\n )}\n >\n <Icon className=\"h-4 w-4\" strokeWidth={1.8} />\n <span className=\"text-[11px] leading-none\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n {userName ? (\n <div className=\"border-t border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex items-center justify-center rounded-full bg-[var(--ck-rail-user-bg)] px-2 py-2 text-[11px] font-medium text-[var(--ck-brand-contrast)]\">\n {userName.slice(0, 1)}\n </div>\n </div>\n ) : null}\n </aside>\n );\n}\n\ninterface ProjectWorkspaceShellProps {\n productItems: CodingProductNavItem[];\n userName: string;\n projectSidebar?: React.ReactNode;\n systemNotice?: React.ReactNode;\n topBar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n}\n\nexport function ProjectWorkspaceShell({\n productItems,\n userName,\n projectSidebar,\n systemNotice,\n topBar,\n children,\n className,\n viewportClassName,\n contentClassName,\n}: ProjectWorkspaceShellProps) {\n return (\n <div\n className={cn(\n \"coding-kit overflow-visible rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)]\",\n className,\n )}\n >\n <div className={cn(\"flex min-h-[760px] bg-[var(--ck-surface-page)]\", viewportClassName)}>\n <CodingProductRail items={productItems} userName={userName} />\n {projectSidebar}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {systemNotice}\n {topBar}\n <div className={cn(\"min-h-0 flex-1\", contentClassName)}>{children}</div>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { ArrowLeft, ChevronRight } from 'lucide-react';\n\nimport {\n WorkbenchDrawer,\n WorkbenchDrawerContent,\n WorkbenchDrawerDescription,\n WorkbenchDrawerFooter,\n WorkbenchDrawerHeader,\n WorkbenchDrawerTitle,\n} from '../../overlay';\nimport { cn } from '../../lib/utils';\nimport { ConsoleButton as CodingButton } from '../primitives/button';\n\nexport interface CodingListDetailRowInfo {\n key: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n}\n\nexport interface CodingListDetailRowRenderContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n selected: boolean;\n select: () => void;\n}\n\nexport interface CodingListDetailDetailContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n mobile: boolean;\n}\n\nexport interface CodingListDetailWorkspaceProps<TRow> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n rows: TRow[];\n getRowInfo: (row: TRow) => CodingListDetailRowInfo;\n renderDetail: (\n context: CodingListDetailDetailContext<TRow>,\n ) => React.ReactNode;\n renderRow?: (\n context: CodingListDetailRowRenderContext<TRow>,\n ) => React.ReactNode;\n toolbar?: React.ReactNode;\n headerActions?: React.ReactNode;\n detailActions?: React.ReactNode;\n emptyState?: React.ReactNode;\n selectedKey?: string;\n defaultSelectedKey?: string;\n onSelectedKeyChange?: (key: string) => void;\n editor?: React.ReactNode;\n editorTitle?: React.ReactNode;\n editorDescription?: React.ReactNode;\n editorFooter?: React.ReactNode;\n editorOpen?: boolean;\n onEditorOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\nfunction DefaultRow<TRow>({\n context,\n}: {\n context: CodingListDetailRowRenderContext<TRow>;\n}) {\n const { info, selected, select } = context;\n\n return (\n <button\n type=\"button\"\n aria-current={selected ? 'true' : undefined}\n className={cn(\n 'flex w-full items-start gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 text-left transition-colors last:border-b-0 hover:bg-[var(--ck-bg-hover)]',\n selected && 'bg-[var(--ck-bg-active)]',\n )}\n onClick={select}\n >\n <ChevronRight\n className={cn(\n 'mt-0.5 h-4 w-4 shrink-0 text-[var(--ck-text-muted)] transition-transform',\n selected && 'rotate-90 text-[var(--ck-brand-primary)]',\n )}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-[var(--ck-text-primary)]\">\n {info.title}\n </span>\n {info.status ? (\n <span className=\"shrink-0\">{info.status}</span>\n ) : null}\n </span>\n {info.description ? (\n <span className=\"mt-1 block truncate text-[12px] text-[var(--ck-text-secondary)]\">\n {info.description}\n </span>\n ) : null}\n {info.meta ? (\n <span className=\"mt-1 block truncate text-[11px] text-[var(--ck-text-muted)]\">\n {info.meta}\n </span>\n ) : null}\n </span>\n </button>\n );\n}\n\nexport function CodingListDetailWorkspace<TRow>({\n title,\n subtitle,\n rows,\n getRowInfo,\n renderDetail,\n renderRow,\n toolbar,\n headerActions,\n detailActions,\n emptyState,\n selectedKey,\n defaultSelectedKey,\n onSelectedKeyChange,\n editor,\n editorTitle = '编辑',\n editorDescription,\n editorFooter,\n editorOpen,\n onEditorOpenChange,\n className,\n}: CodingListDetailWorkspaceProps<TRow>) {\n const rowInfos = React.useMemo(\n () => rows.map((row) => ({ row, info: getRowInfo(row) })),\n [getRowInfo, rows],\n );\n const firstKey = rowInfos[0]?.info.key || '';\n const [internalSelectedKey, setInternalSelectedKey] = React.useState(\n defaultSelectedKey || firstKey,\n );\n const [mobileDetailOpen, setMobileDetailOpen] = React.useState(false);\n const [internalEditorOpen, setInternalEditorOpen] = React.useState(false);\n const activeKey = selectedKey ?? internalSelectedKey;\n const selectedEntry =\n rowInfos.find(({ info }) => info.key === activeKey) || rowInfos[0];\n const selectedRow = selectedEntry?.row;\n const selectedInfo = selectedEntry?.info;\n const resolvedEditorOpen = editorOpen ?? internalEditorOpen;\n\n React.useEffect(() => {\n if (!selectedEntry || selectedEntry.info.key === activeKey) return;\n setInternalSelectedKey(selectedEntry.info.key);\n onSelectedKeyChange?.(selectedEntry.info.key);\n }, [activeKey, onSelectedKeyChange, selectedEntry]);\n\n const selectRow = React.useCallback(\n (key: string) => {\n setInternalSelectedKey(key);\n onSelectedKeyChange?.(key);\n setMobileDetailOpen(true);\n },\n [onSelectedKeyChange],\n );\n\n const setEditorOpen = React.useCallback(\n (open: boolean) => {\n setInternalEditorOpen(open);\n onEditorOpenChange?.(open);\n },\n [onEditorOpenChange],\n );\n\n return (\n <div\n className={cn(\n 'coding-kit flex h-full min-h-0 flex-col overflow-hidden rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] text-[var(--ck-text-primary)]',\n className,\n )}\n >\n <header className=\"flex shrink-0 items-start justify-between gap-4 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-[16px] font-semibold\">{title}</h1>\n {subtitle ? (\n <p className=\"mt-1 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </p>\n ) : null}\n </div>\n {headerActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{headerActions}</div>\n ) : null}\n </header>\n\n {toolbar ? (\n <div className=\"shrink-0 border-b border-[var(--ck-border-subtle)] bg-[var(--ck-bg-surface-muted)] px-4 py-2.5 sm:px-5\">\n {toolbar}\n </div>\n ) : null}\n\n <main className=\"relative min-h-0 flex-1 overflow-hidden\">\n <section\n className={cn(\n 'flex h-full min-h-0 flex-col lg:w-[min(58%,720px)]',\n mobileDetailOpen && 'hidden lg:flex',\n )}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-2.5 text-[12px] text-[var(--ck-text-muted)] sm:px-5\">\n <span>{rows.length} 条记录</span>\n {selectedInfo ? <span className=\"truncate\">已选:{selectedInfo.title}</span> : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {rows.length === 0 ? (\n emptyState || (\n <div className=\"px-6 py-12 text-center text-sm text-[var(--ck-text-muted)]\">\n 暂无数据\n </div>\n )\n ) : (\n rowInfos.map(({ row, info }) => {\n const context = {\n row,\n info,\n selected: info.key === selectedInfo?.key,\n select: () => selectRow(info.key),\n };\n return (\n <React.Fragment key={info.key}>\n {renderRow ? renderRow(context) : <DefaultRow context={context} />}\n </React.Fragment>\n );\n })\n )}\n </div>\n </section>\n\n {selectedRow && selectedInfo ? (\n <section\n className={cn(\n 'min-h-0 bg-[var(--ck-surface-overlay)] lg:flex lg:min-w-0 lg:flex-1 lg:border-l lg:border-[var(--ck-border-subtle)]',\n mobileDetailOpen && 'absolute inset-0 z-10 flex flex-col',\n !mobileDetailOpen && 'hidden',\n 'lg:!flex lg:!static',\n )}\n >\n <div className=\"flex shrink-0 items-start justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <CodingButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 lg:hidden\"\n aria-label=\"返回列表\"\n onClick={() => setMobileDetailOpen(false)}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </CodingButton>\n <div className=\"min-w-0\">\n <div className=\"truncate text-[13px] font-medium text-[var(--ck-brand-primary)]\">\n 详情\n </div>\n <div className=\"mt-0.5 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {selectedInfo.title}\n </div>\n </div>\n </div>\n {detailActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{detailActions}</div>\n ) : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4 sm:p-5\">\n {renderDetail({ row: selectedRow, info: selectedInfo, mobile: mobileDetailOpen })}\n </div>\n </section>\n ) : null}\n </main>\n\n {editor ? (\n <WorkbenchDrawer\n open={resolvedEditorOpen}\n onOpenChange={setEditorOpen}\n >\n <WorkbenchDrawerContent\n side=\"right\"\n mobileSide=\"bottom\"\n className=\"coding-kit flex max-h-[90dvh] flex-col gap-0 overflow-hidden p-0 md:w-[min(560px,calc(100vw-16px))] md:max-w-[560px]\"\n >\n <WorkbenchDrawerHeader className=\"shrink-0 border-b border-[var(--ck-border-subtle)] px-5 py-4 pr-14\">\n <WorkbenchDrawerTitle className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {editorTitle}\n </WorkbenchDrawerTitle>\n {editorDescription ? (\n <WorkbenchDrawerDescription className=\"mt-1 text-[12px] text-[var(--ck-text-muted)]\">\n {editorDescription}\n </WorkbenchDrawerDescription>\n ) : null}\n </WorkbenchDrawerHeader>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">{editor}</div>\n {editorFooter ? (\n <WorkbenchDrawerFooter className=\"shrink-0 border-t border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] px-5 py-3\">\n {editorFooter}\n </WorkbenchDrawerFooter>\n ) : null}\n </WorkbenchDrawerContent>\n </WorkbenchDrawer>\n ) : null}\n </div>\n );\n}\n"],"names":["CodingButton","WorkbenchDrawer","WorkbenchDrawerContent","WorkbenchDrawerHeader","WorkbenchDrawerTitle","WorkbenchDrawerDescription","WorkbenchDrawerFooter"],"mappings":"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"}
|
package/dist/overlay/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { D, a, b, c, d, e, f, g, h, i } from "../dialog-
|
|
2
|
-
import { S, a as a2, b as b2, c as c2, d as d2, e as e2, f as f2, g as g2, h as h2, i as i2 } from "../sheet-
|
|
1
|
+
import { D, a, b, c, d, e, f, g, h, i } from "../dialog-ssICQNSV.js";
|
|
2
|
+
import { S, a as a2, b as b2, c as c2, d as d2, e as e2, f as f2, g as g2, h as h2, i as i2 } from "../sheet-Bsq3CLW4.js";
|
|
3
3
|
export {
|
|
4
4
|
D as WorkbenchDialog,
|
|
5
5
|
a as WorkbenchDialogClose,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React__default from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import React__default, { useCallback, useSyncExternalStore } from "react";
|
|
2
|
+
import { b as extractFrontendToolsFromManifest } from "./ExtensionManifestSchema-INV7dTEG.js";
|
|
3
|
+
import { mergeExtensionAccessPolicy, canAccessExtensionCapability } from "./extension-schema/index.js";
|
|
4
4
|
var UIMimeType = /* @__PURE__ */ ((UIMimeType2) => {
|
|
5
5
|
UIMimeType2["HTML_MCP_APP"] = "text/html;profile=mcp-app";
|
|
6
6
|
UIMimeType2["HTML"] = "text/html";
|
|
@@ -1300,7 +1300,7 @@ function getFrontendMCPServer() {
|
|
|
1300
1300
|
return globalFrontendMCPServer;
|
|
1301
1301
|
}
|
|
1302
1302
|
let currentActor = null;
|
|
1303
|
-
const listeners = /* @__PURE__ */ new Set();
|
|
1303
|
+
const listeners$1 = /* @__PURE__ */ new Set();
|
|
1304
1304
|
const DEFAULT_API_BASE_URL = "http://127.0.0.1:1626";
|
|
1305
1305
|
const getViteApiBaseUrl = () => {
|
|
1306
1306
|
var _a, _b, _c;
|
|
@@ -1417,7 +1417,7 @@ function resolveRuntimeActor(input = {}) {
|
|
|
1417
1417
|
}
|
|
1418
1418
|
function setRuntimeActor(actor) {
|
|
1419
1419
|
currentActor = actor;
|
|
1420
|
-
listeners.forEach((listener) => listener(currentActor));
|
|
1420
|
+
listeners$1.forEach((listener) => listener(currentActor));
|
|
1421
1421
|
}
|
|
1422
1422
|
function refreshRuntimeActor(input = {}) {
|
|
1423
1423
|
const actor = resolveRuntimeActor(input);
|
|
@@ -1494,8 +1494,8 @@ function getRuntimeUserName() {
|
|
|
1494
1494
|
return ((_a = currentActor == null ? void 0 : currentActor.user) == null ? void 0 : _a.name) || ((_b = currentActor == null ? void 0 : currentActor.subject) == null ? void 0 : _b.displayName) || (getRuntimeUserId() ? `User ${getRuntimeUserId()}` : null);
|
|
1495
1495
|
}
|
|
1496
1496
|
function subscribeRuntimeActor(listener) {
|
|
1497
|
-
listeners.add(listener);
|
|
1498
|
-
return () => listeners.delete(listener);
|
|
1497
|
+
listeners$1.add(listener);
|
|
1498
|
+
return () => listeners$1.delete(listener);
|
|
1499
1499
|
}
|
|
1500
1500
|
function getRuntimeAccessToken() {
|
|
1501
1501
|
return (currentActor == null ? void 0 : currentActor.token) || (typeof window !== "undefined" ? window.localStorage.getItem("access_token") : null);
|
|
@@ -1549,10 +1549,132 @@ class ClientToolRegistry {
|
|
|
1549
1549
|
}
|
|
1550
1550
|
}
|
|
1551
1551
|
const globalClientToolRegistry = new ClientToolRegistry();
|
|
1552
|
+
const badges = /* @__PURE__ */ new Map();
|
|
1553
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
1554
|
+
const notify = () => {
|
|
1555
|
+
listeners.forEach((listener) => listener());
|
|
1556
|
+
};
|
|
1557
|
+
const buildStoreKey = (kind, viewId, key) => kind === "sidebar" ? `sidebar:${viewId}` : `tab:${viewId}/${key ?? ""}`;
|
|
1558
|
+
const getExtensionBadgeStoreKey = buildStoreKey;
|
|
1559
|
+
const normalizeBadge = (badge) => {
|
|
1560
|
+
if (!badge || typeof badge !== "object") return null;
|
|
1561
|
+
const normalized = {};
|
|
1562
|
+
if (typeof badge.count === "number" && Number.isFinite(badge.count) && badge.count > 0) {
|
|
1563
|
+
normalized.count = Math.floor(badge.count);
|
|
1564
|
+
}
|
|
1565
|
+
if (typeof badge.text === "string" && badge.text.trim()) {
|
|
1566
|
+
normalized.text = badge.text.trim();
|
|
1567
|
+
}
|
|
1568
|
+
if (badge.dot === true) {
|
|
1569
|
+
normalized.dot = true;
|
|
1570
|
+
}
|
|
1571
|
+
if (badge.tone) {
|
|
1572
|
+
normalized.tone = badge.tone;
|
|
1573
|
+
}
|
|
1574
|
+
if (normalized.count === void 0 && normalized.text === void 0 && !normalized.dot) {
|
|
1575
|
+
return null;
|
|
1576
|
+
}
|
|
1577
|
+
return normalized;
|
|
1578
|
+
};
|
|
1579
|
+
const serializeBadge = (badge) => JSON.stringify(badge);
|
|
1580
|
+
function setExtensionBadge(kind, viewId, key, badge) {
|
|
1581
|
+
if (!viewId) return () => void 0;
|
|
1582
|
+
const storeKey = buildStoreKey(kind, viewId, key);
|
|
1583
|
+
const normalized = normalizeBadge(badge);
|
|
1584
|
+
const previous = badges.get(storeKey);
|
|
1585
|
+
if (!normalized) {
|
|
1586
|
+
if (previous !== void 0) {
|
|
1587
|
+
badges.delete(storeKey);
|
|
1588
|
+
notify();
|
|
1589
|
+
}
|
|
1590
|
+
return () => void 0;
|
|
1591
|
+
}
|
|
1592
|
+
if (previous && serializeBadge(previous) === serializeBadge(normalized)) {
|
|
1593
|
+
return () => setExtensionBadge(kind, viewId, key, null);
|
|
1594
|
+
}
|
|
1595
|
+
badges.set(storeKey, normalized);
|
|
1596
|
+
notify();
|
|
1597
|
+
return () => setExtensionBadge(kind, viewId, key, null);
|
|
1598
|
+
}
|
|
1599
|
+
function subscribeExtensionBadges(listener) {
|
|
1600
|
+
listeners.add(listener);
|
|
1601
|
+
return () => {
|
|
1602
|
+
listeners.delete(listener);
|
|
1603
|
+
};
|
|
1604
|
+
}
|
|
1605
|
+
function parseVirtualViewFileId(fileId) {
|
|
1606
|
+
if (typeof fileId !== "string" || !fileId.startsWith("view://")) return null;
|
|
1607
|
+
const rest = fileId.slice("view://".length);
|
|
1608
|
+
const separatorIndex = rest.indexOf("/");
|
|
1609
|
+
if (separatorIndex <= 0 || separatorIndex === rest.length - 1) return null;
|
|
1610
|
+
const viewId = rest.slice(0, separatorIndex);
|
|
1611
|
+
const key = rest.slice(separatorIndex + 1);
|
|
1612
|
+
if (!viewId || !key) return null;
|
|
1613
|
+
return { viewId, key };
|
|
1614
|
+
}
|
|
1615
|
+
const formatBadgeCount = (count) => count > 99 ? "99+" : String(count);
|
|
1616
|
+
const EXTENSION_BADGE_TONE_COLORS = {
|
|
1617
|
+
default: {
|
|
1618
|
+
background: "var(--vscode-badge-background, #e5484d)",
|
|
1619
|
+
foreground: "var(--vscode-badge-foreground, #ffffff)"
|
|
1620
|
+
},
|
|
1621
|
+
danger: { background: "#e5484d", foreground: "#ffffff" },
|
|
1622
|
+
warning: { background: "#e0af2f", foreground: "#262115" },
|
|
1623
|
+
success: { background: "#2ea043", foreground: "#ffffff" },
|
|
1624
|
+
info: { background: "#3e5bec", foreground: "#ffffff" }
|
|
1625
|
+
};
|
|
1626
|
+
function useExtensionBadge(kind, viewId, key) {
|
|
1627
|
+
const storeKey = viewId ? buildStoreKey(kind, viewId, key) : null;
|
|
1628
|
+
const subscribe = useCallback(
|
|
1629
|
+
(listener) => {
|
|
1630
|
+
if (!storeKey) return () => void 0;
|
|
1631
|
+
return subscribeExtensionBadges(listener);
|
|
1632
|
+
},
|
|
1633
|
+
[storeKey]
|
|
1634
|
+
);
|
|
1635
|
+
const getSnapshot = useCallback(() => {
|
|
1636
|
+
if (!storeKey) return null;
|
|
1637
|
+
return badges.get(storeKey) ?? null;
|
|
1638
|
+
}, [storeKey]);
|
|
1639
|
+
return useSyncExternalStore(subscribe, getSnapshot);
|
|
1640
|
+
}
|
|
1641
|
+
function normalizeEditorTabKey(key) {
|
|
1642
|
+
return key.replace(/[^a-zA-Z0-9:_-]/g, "_");
|
|
1643
|
+
}
|
|
1644
|
+
function createExtensionViews(eventBus, workspaceEditorService) {
|
|
1645
|
+
return {
|
|
1646
|
+
openMain(viewId, props) {
|
|
1647
|
+
eventBus == null ? void 0 : eventBus.emit("workbench", "mainView.open", { viewId, props });
|
|
1648
|
+
},
|
|
1649
|
+
openEditor({ viewId, title, props = {}, key, split }) {
|
|
1650
|
+
if (!workspaceEditorService) {
|
|
1651
|
+
throw new Error("workspaceEditorService is not available in this runtime");
|
|
1652
|
+
}
|
|
1653
|
+
const file = workspaceEditorService.createViewFile(viewId, title, props, key);
|
|
1654
|
+
eventBus == null ? void 0 : eventBus.emit("workbench", "layout.forceOpen", {
|
|
1655
|
+
fileId: file.id,
|
|
1656
|
+
split
|
|
1657
|
+
});
|
|
1658
|
+
return file.id;
|
|
1659
|
+
}
|
|
1660
|
+
};
|
|
1661
|
+
}
|
|
1552
1662
|
const frontendTools = /* @__PURE__ */ new Map();
|
|
1553
1663
|
const frontendToolDeclarations = /* @__PURE__ */ new Map();
|
|
1554
1664
|
const frontendToolHandlers = /* @__PURE__ */ new Map();
|
|
1555
1665
|
const manifestToolDisposers = /* @__PURE__ */ new Map();
|
|
1666
|
+
const extensionBadgeDisposers = /* @__PURE__ */ new Map();
|
|
1667
|
+
function clearExtensionBadgesForOwner(extensionId) {
|
|
1668
|
+
const byKey = extensionBadgeDisposers.get(extensionId);
|
|
1669
|
+
if (!byKey) return;
|
|
1670
|
+
byKey.forEach((dispose) => {
|
|
1671
|
+
try {
|
|
1672
|
+
dispose();
|
|
1673
|
+
} catch {
|
|
1674
|
+
}
|
|
1675
|
+
});
|
|
1676
|
+
extensionBadgeDisposers.delete(extensionId);
|
|
1677
|
+
}
|
|
1556
1678
|
function registerFrontendToolDeclaration(tool) {
|
|
1557
1679
|
frontendToolDeclarations.set(tool.name, tool);
|
|
1558
1680
|
bindFrontendToolDeclaration(tool);
|
|
@@ -1728,6 +1850,25 @@ function createExtensionCapabilities(extensionRegistry, getActor, options = {})
|
|
|
1728
1850
|
GuardedComponent.displayName = `AccessGuard(${component.displayName || component.name || "ExtensionView"})`;
|
|
1729
1851
|
return GuardedComponent;
|
|
1730
1852
|
};
|
|
1853
|
+
const trackBadgeDispose = (storeKey, dispose) => {
|
|
1854
|
+
const extensionId = options.extensionId;
|
|
1855
|
+
if (!extensionId) return dispose;
|
|
1856
|
+
let byKey = extensionBadgeDisposers.get(extensionId);
|
|
1857
|
+
if (!byKey) {
|
|
1858
|
+
byKey = /* @__PURE__ */ new Map();
|
|
1859
|
+
extensionBadgeDisposers.set(extensionId, byKey);
|
|
1860
|
+
}
|
|
1861
|
+
byKey.set(storeKey, dispose);
|
|
1862
|
+
return () => {
|
|
1863
|
+
if (byKey.get(storeKey) === dispose) {
|
|
1864
|
+
byKey.delete(storeKey);
|
|
1865
|
+
if (byKey.size === 0) {
|
|
1866
|
+
extensionBadgeDisposers.delete(extensionId);
|
|
1867
|
+
}
|
|
1868
|
+
}
|
|
1869
|
+
dispose();
|
|
1870
|
+
};
|
|
1871
|
+
};
|
|
1731
1872
|
return {
|
|
1732
1873
|
registerSidebarView({ id, component, accessPolicy, routeKey }) {
|
|
1733
1874
|
const SidebarComponent = withAccessGuard(component, accessPolicy);
|
|
@@ -1815,28 +1956,64 @@ function createExtensionCapabilities(extensionRegistry, getActor, options = {})
|
|
|
1815
1956
|
return () => {
|
|
1816
1957
|
extensionRegistry.unregisterContribution(point, id);
|
|
1817
1958
|
};
|
|
1959
|
+
},
|
|
1960
|
+
setSidebarBadge({ viewId, badge }) {
|
|
1961
|
+
if (!viewId || !canRegister()) {
|
|
1962
|
+
return () => void 0;
|
|
1963
|
+
}
|
|
1964
|
+
const metadata = extensionRegistry.getSidebarViewMetadata(viewId);
|
|
1965
|
+
const owned = options.extensionId === void 0 ? Boolean(metadata) : Boolean(metadata && metadata.extensionId === options.extensionId);
|
|
1966
|
+
if (!owned) {
|
|
1967
|
+
return () => void 0;
|
|
1968
|
+
}
|
|
1969
|
+
return trackBadgeDispose(
|
|
1970
|
+
getExtensionBadgeStoreKey("sidebar", viewId),
|
|
1971
|
+
setExtensionBadge("sidebar", viewId, void 0, badge)
|
|
1972
|
+
);
|
|
1973
|
+
},
|
|
1974
|
+
setEditorTabBadge({ viewId, key, badge }) {
|
|
1975
|
+
if (!viewId || !canRegister()) {
|
|
1976
|
+
return () => void 0;
|
|
1977
|
+
}
|
|
1978
|
+
const metadata = extensionRegistry.getEditorViewMetadata(viewId) || extensionRegistry.getSidebarViewMetadata(viewId);
|
|
1979
|
+
const owned = options.extensionId === void 0 ? Boolean(metadata) : Boolean(metadata && metadata.extensionId === options.extensionId);
|
|
1980
|
+
if (!owned) {
|
|
1981
|
+
return () => void 0;
|
|
1982
|
+
}
|
|
1983
|
+
const normalizedTabKey = key ? normalizeEditorTabKey(key) : void 0;
|
|
1984
|
+
return trackBadgeDispose(
|
|
1985
|
+
getExtensionBadgeStoreKey("tab", viewId, normalizedTabKey),
|
|
1986
|
+
setExtensionBadge("tab", viewId, normalizedTabKey, badge)
|
|
1987
|
+
);
|
|
1818
1988
|
}
|
|
1819
1989
|
};
|
|
1820
1990
|
}
|
|
1821
1991
|
export {
|
|
1822
1992
|
BridgeEvent as B,
|
|
1823
1993
|
ClientToolRegistry as C,
|
|
1994
|
+
EXTENSION_BADGE_TONE_COLORS as E,
|
|
1824
1995
|
UIMimeType as U,
|
|
1825
1996
|
subscribeRuntimeActor as a,
|
|
1826
|
-
|
|
1997
|
+
createExtensionViews as b,
|
|
1827
1998
|
createExtensionCapabilities as c,
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1999
|
+
getRuntimeActor as d,
|
|
2000
|
+
getUIResourceRegistry as e,
|
|
2001
|
+
globalClientToolRegistry as f,
|
|
1831
2002
|
getRuntimeAccessToken as g,
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
2003
|
+
getUnifiedBridge as h,
|
|
2004
|
+
registerFrontendToolDeclarationsFromManifest as i,
|
|
2005
|
+
getRuntimeUserId as j,
|
|
2006
|
+
getRuntimeUserName as k,
|
|
2007
|
+
getRuntimeTenantId as l,
|
|
2008
|
+
getRuntimeSubjectId as m,
|
|
2009
|
+
normalizeEditorTabKey as n,
|
|
2010
|
+
clearExtensionBadgesForOwner as o,
|
|
2011
|
+
refreshRuntimeActorFromServer as p,
|
|
2012
|
+
formatBadgeCount as q,
|
|
1839
2013
|
registerFrontendToolDeclaration as r,
|
|
1840
|
-
setRuntimeActor as s
|
|
2014
|
+
setRuntimeActor as s,
|
|
2015
|
+
parseVirtualViewFileId as t,
|
|
2016
|
+
useExtensionBadge as u,
|
|
2017
|
+
getComponentLifecycleManager as v
|
|
1841
2018
|
};
|
|
1842
|
-
//# sourceMappingURL=pluginCapabilities-
|
|
2019
|
+
//# sourceMappingURL=pluginCapabilities-BkCT7QDO.js.map
|