@agent-native/core 0.106.3 → 0.107.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +13 -0
- package/corpus/core/docs/content/integrations.mdx +597 -0
- package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
- package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
- package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
- package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
- package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
- package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
- package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
- package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
- package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
- package/corpus/core/docs/content/mcp-clients.mdx +51 -1
- package/corpus/core/docs/content/organizations-teams-permissions.mdx +413 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/AssistantChat.tsx +13 -1
- package/corpus/core/src/client/chat/message-components.tsx +41 -0
- package/corpus/core/src/client/composer/TiptapComposer.tsx +45 -8
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +30 -11
- package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +240 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +159 -40
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +433 -4
- package/corpus/core/src/client/resources/mcp-integration-logos.ts +108 -0
- package/corpus/core/src/deploy/build.ts +32 -0
- package/corpus/core/src/extensions/html-shell.ts +33 -1
- package/corpus/core/src/ingestion/office.ts +1 -2
- package/corpus/core/src/ingestion/pptx.ts +2 -4
- package/corpus/core/src/localization/default-messages.ts +126 -1
- package/corpus/core/src/mcp/actions/call-mcp-tool.ts +1 -0
- package/corpus/core/src/server/index.ts +4 -0
- package/corpus/core/src/server/org-admin.ts +28 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
- package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +64 -0
- package/corpus/templates/analytics/AGENTS.md +5 -0
- package/corpus/templates/analytics/actions/clone-creative-context-dashboard.ts +86 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/analytics/app/i18n-data.ts +1 -0
- package/corpus/templates/analytics/app/pages/Ask.tsx +8 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +59 -0
- package/corpus/templates/analytics/app/routes/agent.tsx +7 -1
- package/corpus/templates/analytics/changelog/2026-07-17-library-now-flags-published-dashboards-with-newer-versions-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/analytics/package.json +1 -0
- package/corpus/templates/analytics/server/lib/native-creative-context.ts +158 -0
- package/corpus/templates/analytics/server/plugins/creative-context.ts +10 -0
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -3
- package/corpus/templates/assets/AGENTS.md +5 -0
- package/corpus/templates/assets/actions/clone-creative-context-asset.ts +74 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +308 -178
- package/corpus/templates/assets/app/routes/library.tsx +5 -11
- package/corpus/templates/assets/changelog/2026-07-17-library-now-flags-published-assets-with-newer-versions-and-l.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/assets/server/lib/native-creative-context.ts +198 -0
- package/corpus/templates/assets/server/plugins/creative-context.ts +4 -0
- package/corpus/templates/brain/actions/provider-api-request.ts +1 -0
- package/corpus/templates/calendar/actions/provider-api-request.ts +1 -0
- package/corpus/templates/clips/actions/get-recording-insights.ts +7 -4
- package/corpus/templates/clips/actions/list-recordings.ts +48 -0
- package/corpus/templates/clips/actions/list-viewers.ts +2 -1
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +3 -1
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -3
- package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +11 -6
- package/corpus/templates/clips/app/hooks/use-view-tracking.ts +6 -1
- package/corpus/templates/clips/app/lib/ffmpeg-export.ts +4 -2
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -3
- package/corpus/templates/clips/changelog/2026-07-17-dictation-keeps-sentence-spacing-and-no-longer-crashes-when-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-shared-clips-now-preserve-editor-access-and-show-editor-insi.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-stitching-clips-no-longer-fails-when-editor-media-metadata-i.md +6 -0
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -8
- package/corpus/templates/clips/shared/view-analytics.ts +4 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +12 -3
- package/corpus/templates/content/AGENTS.md +5 -0
- package/corpus/templates/content/actions/clone-creative-context-document.ts +61 -0
- package/corpus/templates/content/actions/provider-api-request.ts +1 -0
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +21 -0
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +29 -0
- package/corpus/templates/content/changelog/2026-07-17-library-now-flags-published-documents-with-newer-versions-an.md +6 -0
- package/corpus/templates/content/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/content/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +1 -0
- package/corpus/templates/content/server/lib/native-creative-context.ts +191 -0
- package/corpus/templates/content/server/plugins/creative-context.ts +8 -1
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -3
- package/corpus/templates/design/AGENTS.md +5 -0
- package/corpus/templates/design/actions/clone-creative-context-design-native.ts +111 -0
- package/corpus/templates/design/actions/provider-api-request.ts +1 -0
- package/corpus/templates/design/app/pages/Index.tsx +44 -0
- package/corpus/templates/design/app/pages/design-editor/types.ts +1 -0
- package/corpus/templates/design/changelog/2026-07-17-library-now-flags-published-designs-with-newer-versions-and-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/design/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/design/server/lib/native-creative-context.ts +265 -0
- package/corpus/templates/design/server/plugins/creative-context.ts +8 -1
- package/corpus/templates/dispatch/actions/provider-api-request.ts +1 -0
- package/corpus/templates/mail/actions/provider-api-request.ts +1 -0
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +11 -3
- package/corpus/templates/slides/AGENTS.md +5 -0
- package/corpus/templates/slides/actions/clone-creative-context-deck.ts +96 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +3 -2
- package/corpus/templates/slides/actions/import-file.ts +3 -2
- package/corpus/templates/slides/actions/provider-api-request.ts +1 -0
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +27 -0
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -0
- package/corpus/templates/slides/changelog/2026-07-17-library-now-flags-published-decks-with-newer-versions-and-le.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-pdf-and-powerpoint-imports-now-work-reliably-in-hosted-decks.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/slides/server/lib/native-creative-context.ts +288 -0
- package/corpus/templates/slides/server/plugins/creative-context.ts +4 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +8 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +35 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +7 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +37 -8
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +3 -2
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.d.ts +9 -0
- package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -0
- package/dist/client/resources/McpConnectionSuggestion.js +115 -0
- package/dist/client/resources/McpConnectionSuggestion.js.map +1 -0
- package/dist/client/resources/McpIntegrationDialog.d.ts +2 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +48 -20
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts +9 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +387 -4
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/resources/mcp-integration-logos.d.ts +2 -0
- package/dist/client/resources/mcp-integration-logos.d.ts.map +1 -0
- package/dist/client/resources/mcp-integration-logos.js +109 -0
- package/dist/client/resources/mcp-integration-logos.js.map +1 -0
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +23 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js +33 -1
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/ingestion/office.d.ts.map +1 -1
- package/dist/ingestion/office.js +1 -2
- package/dist/ingestion/office.js.map +1 -1
- package/dist/ingestion/pptx.js +2 -4
- package/dist/ingestion/pptx.js.map +1 -1
- package/dist/localization/default-messages.d.ts +98 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +99 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/actions/call-mcp-tool.js +1 -0
- package/dist/mcp/actions/call-mcp-tool.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/org-admin.d.ts +3 -0
- package/dist/server/org-admin.d.ts.map +1 -0
- package/dist/server/org-admin.js +24 -0
- package/dist/server/org-admin.js.map +1 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
- package/docs/content/integrations.mdx +597 -0
- package/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
- package/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
- package/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
- package/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
- package/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
- package/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
- package/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
- package/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
- package/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
- package/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
- package/docs/content/mcp-clients.mdx +51 -1
- package/docs/content/organizations-teams-permissions.mdx +413 -0
- package/package.json +1 -1
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
- package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
useActionMutation,
|
|
10
10
|
useActionQuery,
|
|
11
11
|
} from "@agent-native/core/client";
|
|
12
|
+
import { CreativeContextShareSheet } from "@agent-native/creative-context/client";
|
|
12
13
|
import {
|
|
13
14
|
IconCheck,
|
|
14
15
|
IconClipboard,
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
20
21
|
IconFolderPlus,
|
|
21
22
|
IconLayoutBottombar,
|
|
22
23
|
IconLayoutGrid,
|
|
24
|
+
IconLink,
|
|
23
25
|
IconMessageCircle,
|
|
24
26
|
IconPencil,
|
|
25
27
|
IconPhoto,
|
|
@@ -311,7 +313,8 @@ export default function BrandKitDetailRedirect() {
|
|
|
311
313
|
}
|
|
312
314
|
|
|
313
315
|
function libraryTabFromValue(value: unknown): LibraryTab | null {
|
|
314
|
-
return value === "
|
|
316
|
+
return value === "drafts" ||
|
|
317
|
+
value === "references" ||
|
|
315
318
|
value === "generated" ||
|
|
316
319
|
value === "runs" ||
|
|
317
320
|
value === "settings"
|
|
@@ -361,7 +364,7 @@ export function BrandKitDetailRoute({
|
|
|
361
364
|
useState<HTMLElement | null>(null);
|
|
362
365
|
const [activeFolderId, setActiveFolderId] = useState<string | null>("all");
|
|
363
366
|
const [activeTab, setActiveTab] = useState<LibraryTab>(
|
|
364
|
-
() => urlTab ?? "
|
|
367
|
+
() => urlTab ?? "generated",
|
|
365
368
|
);
|
|
366
369
|
const [assetViewMode, setAssetViewMode] = useState<AssetViewMode>("cards");
|
|
367
370
|
const [assetScope, setAssetScope] = useState<AssetLibraryScope>("all");
|
|
@@ -735,7 +738,7 @@ export function BrandKitDetailRoute({
|
|
|
735
738
|
|
|
736
739
|
useEffect(() => {
|
|
737
740
|
const selectableAssets =
|
|
738
|
-
activeTab === "runs" || activeTab === "settings"
|
|
741
|
+
activeTab === "runs" || activeTab === "settings" || activeTab === "drafts"
|
|
739
742
|
? []
|
|
740
743
|
: libraryBoardAssets;
|
|
741
744
|
const selectableIds = new Set(selectableAssets.map((asset) => asset.id));
|
|
@@ -1028,9 +1031,112 @@ export function BrandKitDetailRoute({
|
|
|
1028
1031
|
);
|
|
1029
1032
|
}
|
|
1030
1033
|
const assetById = new Map(assets.map((asset) => [asset.id, asset]));
|
|
1031
|
-
const
|
|
1034
|
+
const surfaceTab: LibraryTab =
|
|
1035
|
+
activeTab === "settings" ? "generated" : activeTab;
|
|
1036
|
+
const draftsCount = liveCandidateSlots.length + draftCandidateAssets.length;
|
|
1032
1037
|
const hideEmptyLanes =
|
|
1033
1038
|
activeFolderId !== "all" || mediaFilter !== "all" || search.trim() !== "";
|
|
1039
|
+
const assetsToolbar = (
|
|
1040
|
+
<section className="space-y-3">
|
|
1041
|
+
<div className="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
|
|
1042
|
+
<div className="flex min-w-0 flex-wrap items-center gap-2">
|
|
1043
|
+
<FolderChip
|
|
1044
|
+
active={activeFolderId === "all"}
|
|
1045
|
+
label={t("library.allAssets")}
|
|
1046
|
+
count={libraryAssets.length}
|
|
1047
|
+
onClick={() => setActiveFolderId("all")}
|
|
1048
|
+
/>
|
|
1049
|
+
<FolderChip
|
|
1050
|
+
active={activeFolderId === null}
|
|
1051
|
+
label={t("library.unfiled")}
|
|
1052
|
+
count={unfiledCount}
|
|
1053
|
+
onClick={() => setActiveFolderId(null)}
|
|
1054
|
+
/>
|
|
1055
|
+
{folders.map((folder) => (
|
|
1056
|
+
<FolderChip
|
|
1057
|
+
key={folder.id}
|
|
1058
|
+
active={activeFolderId === folder.id}
|
|
1059
|
+
label={folder.title}
|
|
1060
|
+
count={
|
|
1061
|
+
libraryAssets.filter((asset) => asset.folderId === folder.id)
|
|
1062
|
+
.length
|
|
1063
|
+
}
|
|
1064
|
+
onClick={() => setActiveFolderId(folder.id)}
|
|
1065
|
+
/>
|
|
1066
|
+
))}
|
|
1067
|
+
</div>
|
|
1068
|
+
<div className="flex flex-col gap-2 sm:flex-row sm:items-center">
|
|
1069
|
+
<div className="relative">
|
|
1070
|
+
<IconSearch className="pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
|
|
1071
|
+
<Input
|
|
1072
|
+
value={search}
|
|
1073
|
+
onChange={(event) => setSearch(event.target.value)}
|
|
1074
|
+
placeholder={t("library.searchAssets")}
|
|
1075
|
+
className="h-9 w-full pl-8 pr-8 sm:w-64"
|
|
1076
|
+
/>
|
|
1077
|
+
{search && (
|
|
1078
|
+
<button
|
|
1079
|
+
type="button"
|
|
1080
|
+
aria-label={t("library.clearSearch")}
|
|
1081
|
+
className="absolute right-2 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground"
|
|
1082
|
+
onClick={() => setSearch("")}
|
|
1083
|
+
>
|
|
1084
|
+
<IconX className="h-3.5 w-3.5" />
|
|
1085
|
+
</button>
|
|
1086
|
+
)}
|
|
1087
|
+
</div>
|
|
1088
|
+
<Select
|
|
1089
|
+
value={mediaFilter}
|
|
1090
|
+
onValueChange={(value) =>
|
|
1091
|
+
setMediaFilter(value as "all" | "image" | "video")
|
|
1092
|
+
}
|
|
1093
|
+
>
|
|
1094
|
+
<SelectTrigger className="h-9 w-full sm:w-32">
|
|
1095
|
+
<SelectValue />
|
|
1096
|
+
</SelectTrigger>
|
|
1097
|
+
<SelectContent>
|
|
1098
|
+
<SelectItem value="all">
|
|
1099
|
+
{t("brandKitDetail.allMedia")}
|
|
1100
|
+
</SelectItem>
|
|
1101
|
+
<SelectItem value="image">
|
|
1102
|
+
{t("brandKitDetail.images")}
|
|
1103
|
+
</SelectItem>
|
|
1104
|
+
<SelectItem value="video">
|
|
1105
|
+
{t("brandKitDetail.videos")}
|
|
1106
|
+
</SelectItem>
|
|
1107
|
+
</SelectContent>
|
|
1108
|
+
</Select>
|
|
1109
|
+
</div>
|
|
1110
|
+
</div>
|
|
1111
|
+
</section>
|
|
1112
|
+
);
|
|
1113
|
+
const renderAssetsBoard = (boardAssets: any[], uploads: PendingUpload[]) => (
|
|
1114
|
+
<AssetSwimlaneBoard
|
|
1115
|
+
libraryId={libraryId}
|
|
1116
|
+
viewMode={assetViewMode}
|
|
1117
|
+
onViewModeChange={setAssetViewMode}
|
|
1118
|
+
scope="all"
|
|
1119
|
+
onScopeChange={setAssetScope}
|
|
1120
|
+
showScopeToggle={false}
|
|
1121
|
+
hideEmptyLanes={hideEmptyLanes}
|
|
1122
|
+
assets={boardAssets}
|
|
1123
|
+
pendingUploads={uploads}
|
|
1124
|
+
folders={folders}
|
|
1125
|
+
promotingReferenceKeys={promotingReferenceKeys}
|
|
1126
|
+
onUploadClick={() => fileInputRef.current?.click()}
|
|
1127
|
+
onDrop={(files) => void upload(files)}
|
|
1128
|
+
onMoveToReferences={(asset, slot) => {
|
|
1129
|
+
void handleMoveToReferences(asset, slot);
|
|
1130
|
+
}}
|
|
1131
|
+
onRemoveFromReferences={(asset) => {
|
|
1132
|
+
void handleRemoveFromReferences(asset);
|
|
1133
|
+
}}
|
|
1134
|
+
selectedIds={selectedAssetIds}
|
|
1135
|
+
onSelectedIdsChange={setSelectedAssetIds}
|
|
1136
|
+
onOptimisticDelete={markAssetsOptimisticallyDeleted}
|
|
1137
|
+
onRestoreOptimisticDelete={restoreOptimisticallyDeletedAssets}
|
|
1138
|
+
/>
|
|
1139
|
+
);
|
|
1034
1140
|
const uploadAction = (
|
|
1035
1141
|
<Button
|
|
1036
1142
|
variant="outline"
|
|
@@ -1252,117 +1358,65 @@ export function BrandKitDetailRoute({
|
|
|
1252
1358
|
</div>
|
|
1253
1359
|
)}
|
|
1254
1360
|
<Tabs
|
|
1255
|
-
value={
|
|
1256
|
-
onValueChange={(value) =>
|
|
1257
|
-
setActiveTab(
|
|
1258
|
-
value === "assets" ? "references" : (value as LibraryTab),
|
|
1259
|
-
)
|
|
1260
|
-
}
|
|
1361
|
+
value={surfaceTab}
|
|
1362
|
+
onValueChange={(value) => setActiveTab(value as LibraryTab)}
|
|
1261
1363
|
className="space-y-4"
|
|
1262
1364
|
>
|
|
1263
1365
|
<TabsList>
|
|
1264
|
-
<TabsTrigger value="
|
|
1366
|
+
<TabsTrigger value="drafts" className="gap-1.5">
|
|
1367
|
+
{t("library.drafts")}
|
|
1368
|
+
{draftsCount > 0 ? (
|
|
1369
|
+
<span className="rounded-full bg-muted px-1.5 py-0.5 text-[10px] leading-none text-muted-foreground">
|
|
1370
|
+
{draftsCount}
|
|
1371
|
+
</span>
|
|
1372
|
+
) : null}
|
|
1373
|
+
</TabsTrigger>
|
|
1374
|
+
<TabsTrigger value="generated">
|
|
1375
|
+
{t("library.generated")}
|
|
1376
|
+
</TabsTrigger>
|
|
1377
|
+
<TabsTrigger value="references">
|
|
1378
|
+
{t("library.references")}
|
|
1379
|
+
</TabsTrigger>
|
|
1265
1380
|
<TabsTrigger value="runs">{t("library.runs")}</TabsTrigger>
|
|
1266
1381
|
</TabsList>
|
|
1267
1382
|
|
|
1268
|
-
<TabsContent value="
|
|
1269
|
-
|
|
1270
|
-
<
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
).length
|
|
1293
|
-
}
|
|
1294
|
-
onClick={() => setActiveFolderId(folder.id)}
|
|
1295
|
-
/>
|
|
1296
|
-
))}
|
|
1297
|
-
</div>
|
|
1298
|
-
<div className="flex flex-col gap-2 sm:flex-row sm:items-center">
|
|
1299
|
-
<div className="relative">
|
|
1300
|
-
<IconSearch className="pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
|
|
1301
|
-
<Input
|
|
1302
|
-
value={search}
|
|
1303
|
-
onChange={(event) => setSearch(event.target.value)}
|
|
1304
|
-
placeholder={t("library.searchAssets")}
|
|
1305
|
-
className="h-9 w-full pl-8 pr-8 sm:w-64"
|
|
1306
|
-
/>
|
|
1307
|
-
{search && (
|
|
1308
|
-
<button
|
|
1309
|
-
type="button"
|
|
1310
|
-
aria-label={t("library.clearSearch")}
|
|
1311
|
-
className="absolute right-2 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground"
|
|
1312
|
-
onClick={() => setSearch("")}
|
|
1313
|
-
>
|
|
1314
|
-
<IconX className="h-3.5 w-3.5" />
|
|
1315
|
-
</button>
|
|
1316
|
-
)}
|
|
1317
|
-
</div>
|
|
1318
|
-
<Select
|
|
1319
|
-
value={mediaFilter}
|
|
1320
|
-
onValueChange={(value) =>
|
|
1321
|
-
setMediaFilter(value as "all" | "image" | "video")
|
|
1322
|
-
}
|
|
1323
|
-
>
|
|
1324
|
-
<SelectTrigger className="h-9 w-full sm:w-32">
|
|
1325
|
-
<SelectValue />
|
|
1326
|
-
</SelectTrigger>
|
|
1327
|
-
<SelectContent>
|
|
1328
|
-
<SelectItem value="all">
|
|
1329
|
-
{t("brandKitDetail.allMedia")}
|
|
1330
|
-
</SelectItem>
|
|
1331
|
-
<SelectItem value="image">
|
|
1332
|
-
{t("brandKitDetail.images")}
|
|
1333
|
-
</SelectItem>
|
|
1334
|
-
<SelectItem value="video">
|
|
1335
|
-
{t("brandKitDetail.videos")}
|
|
1336
|
-
</SelectItem>
|
|
1337
|
-
</SelectContent>
|
|
1338
|
-
</Select>
|
|
1383
|
+
<TabsContent value="drafts" className="space-y-4">
|
|
1384
|
+
{draftsCount > 0 ? (
|
|
1385
|
+
<LiveCandidatesStage
|
|
1386
|
+
slots={liveCandidateSlots}
|
|
1387
|
+
draftAssets={draftCandidateAssets}
|
|
1388
|
+
libraryId={libraryId}
|
|
1389
|
+
folders={folders}
|
|
1390
|
+
savingSlotId={savingCandidateSlotId}
|
|
1391
|
+
promotingReferenceKeys={promotingReferenceKeys}
|
|
1392
|
+
onSave={(slot, folderId) => {
|
|
1393
|
+
void handleSaveLiveCandidate(slot, folderId);
|
|
1394
|
+
}}
|
|
1395
|
+
onSaveDraft={(asset, folderId) => {
|
|
1396
|
+
void handleSaveDraftCandidate(asset, folderId);
|
|
1397
|
+
}}
|
|
1398
|
+
onMoveToReferences={handleMoveLiveCandidateToReferences}
|
|
1399
|
+
onMoveDraftToReferences={(asset) => {
|
|
1400
|
+
void handleMoveToReferences(asset);
|
|
1401
|
+
}}
|
|
1402
|
+
/>
|
|
1403
|
+
) : (
|
|
1404
|
+
<div className="flex min-h-64 items-center justify-center rounded-lg border border-dashed border-border bg-muted/20 p-8 text-center">
|
|
1405
|
+
<div className="max-w-sm text-sm text-muted-foreground">
|
|
1406
|
+
{t("library.noDrafts")}
|
|
1339
1407
|
</div>
|
|
1340
1408
|
</div>
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
promotingReferenceKeys={promotingReferenceKeys}
|
|
1353
|
-
onUploadClick={() => fileInputRef.current?.click()}
|
|
1354
|
-
onDrop={(files) => void upload(files)}
|
|
1355
|
-
onMoveToReferences={(asset, slot) => {
|
|
1356
|
-
void handleMoveToReferences(asset, slot);
|
|
1357
|
-
}}
|
|
1358
|
-
onRemoveFromReferences={(asset) => {
|
|
1359
|
-
void handleRemoveFromReferences(asset);
|
|
1360
|
-
}}
|
|
1361
|
-
selectedIds={selectedAssetIds}
|
|
1362
|
-
onSelectedIdsChange={setSelectedAssetIds}
|
|
1363
|
-
onOptimisticDelete={markAssetsOptimisticallyDeleted}
|
|
1364
|
-
onRestoreOptimisticDelete={restoreOptimisticallyDeletedAssets}
|
|
1365
|
-
/>
|
|
1409
|
+
)}
|
|
1410
|
+
</TabsContent>
|
|
1411
|
+
|
|
1412
|
+
<TabsContent value="generated" className="space-y-5">
|
|
1413
|
+
{assetsToolbar}
|
|
1414
|
+
{renderAssetsBoard(saved, pendingVisibleUploads)}
|
|
1415
|
+
</TabsContent>
|
|
1416
|
+
|
|
1417
|
+
<TabsContent value="references" className="space-y-5">
|
|
1418
|
+
{assetsToolbar}
|
|
1419
|
+
{renderAssetsBoard(references, [])}
|
|
1366
1420
|
</TabsContent>
|
|
1367
1421
|
|
|
1368
1422
|
<TabsContent value="runs">
|
|
@@ -1439,7 +1493,7 @@ type PendingUpload = {
|
|
|
1439
1493
|
status: "uploading" | "checking";
|
|
1440
1494
|
};
|
|
1441
1495
|
|
|
1442
|
-
type LibraryTab = "references" | "generated" | "runs" | "settings";
|
|
1496
|
+
type LibraryTab = "drafts" | "references" | "generated" | "runs" | "settings";
|
|
1443
1497
|
type AssetViewMode = "lanes" | "cards";
|
|
1444
1498
|
type AssetLibraryScope = "all" | "references";
|
|
1445
1499
|
|
|
@@ -2012,6 +2066,7 @@ function AssetSwimlaneBoard({
|
|
|
2012
2066
|
onViewModeChange,
|
|
2013
2067
|
scope,
|
|
2014
2068
|
onScopeChange,
|
|
2069
|
+
showScopeToggle = true,
|
|
2015
2070
|
hideEmptyLanes,
|
|
2016
2071
|
assets,
|
|
2017
2072
|
pendingUploads,
|
|
@@ -2031,6 +2086,7 @@ function AssetSwimlaneBoard({
|
|
|
2031
2086
|
onViewModeChange: (mode: AssetViewMode) => void;
|
|
2032
2087
|
scope: AssetLibraryScope;
|
|
2033
2088
|
onScopeChange: (scope: AssetLibraryScope) => void;
|
|
2089
|
+
showScopeToggle?: boolean;
|
|
2034
2090
|
hideEmptyLanes: boolean;
|
|
2035
2091
|
assets: any[];
|
|
2036
2092
|
pendingUploads: PendingUpload[];
|
|
@@ -2046,6 +2102,7 @@ function AssetSwimlaneBoard({
|
|
|
2046
2102
|
onRestoreOptimisticDelete?: (ids: string[]) => void;
|
|
2047
2103
|
}) {
|
|
2048
2104
|
const t = useT();
|
|
2105
|
+
const [bulkContextOpen, setBulkContextOpen] = useState(false);
|
|
2049
2106
|
const deleteAsset = useActionMutation("delete-asset");
|
|
2050
2107
|
const deleteAssets = useActionMutation("delete-assets");
|
|
2051
2108
|
const updateAsset = useActionMutation("update-asset");
|
|
@@ -2517,12 +2574,14 @@ function AssetSwimlaneBoard({
|
|
|
2517
2574
|
) : null}
|
|
2518
2575
|
</div>
|
|
2519
2576
|
<div className="flex shrink-0 flex-wrap items-center gap-2">
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2577
|
+
{showScopeToggle ? (
|
|
2578
|
+
<AssetScopeToggle
|
|
2579
|
+
value={scope}
|
|
2580
|
+
onChange={onScopeChange}
|
|
2581
|
+
allCount={assets.length}
|
|
2582
|
+
referenceCount={referenceAssets.length}
|
|
2583
|
+
/>
|
|
2584
|
+
) : null}
|
|
2526
2585
|
<AssetViewModeToggle value={viewMode} onChange={onViewModeChange} />
|
|
2527
2586
|
</div>
|
|
2528
2587
|
</div>
|
|
@@ -2594,6 +2653,17 @@ function AssetSwimlaneBoard({
|
|
|
2594
2653
|
{t("brandKitDetail.removeFromReferences")}
|
|
2595
2654
|
</Button>
|
|
2596
2655
|
) : null}
|
|
2656
|
+
<Button
|
|
2657
|
+
type="button"
|
|
2658
|
+
variant="outline"
|
|
2659
|
+
size="sm"
|
|
2660
|
+
onClick={() => setBulkContextOpen(true)}
|
|
2661
|
+
disabled={deleting || changingReference}
|
|
2662
|
+
>
|
|
2663
|
+
<IconLink className="h-4 w-4" />
|
|
2664
|
+
Add to context
|
|
2665
|
+
{/* i18n-ignore assets template UI is raw-English pending template i18n pass */}
|
|
2666
|
+
</Button>
|
|
2597
2667
|
<Button
|
|
2598
2668
|
type="button"
|
|
2599
2669
|
variant="ghost"
|
|
@@ -2622,6 +2692,18 @@ function AssetSwimlaneBoard({
|
|
|
2622
2692
|
) : null}
|
|
2623
2693
|
</div>
|
|
2624
2694
|
)}
|
|
2695
|
+
<CreativeContextShareSheet
|
|
2696
|
+
open={bulkContextOpen}
|
|
2697
|
+
onOpenChange={setBulkContextOpen}
|
|
2698
|
+
resources={selectedAssets.map((asset) => ({
|
|
2699
|
+
appId: "assets",
|
|
2700
|
+
resourceType: "asset",
|
|
2701
|
+
resourceId: asset.id,
|
|
2702
|
+
title: assetDisplayTitle(asset),
|
|
2703
|
+
updatedAt: asset.updatedAt,
|
|
2704
|
+
preview: { kind: "document" as const, label: "Asset" },
|
|
2705
|
+
}))}
|
|
2706
|
+
/>
|
|
2625
2707
|
|
|
2626
2708
|
{viewMode === "cards" ? (
|
|
2627
2709
|
<AssetCardsView items={visibleGalleryItems} />
|
|
@@ -3229,90 +3311,115 @@ function AssetActionsMenu({
|
|
|
3229
3311
|
onRemoveFromReferences?: () => void;
|
|
3230
3312
|
}) {
|
|
3231
3313
|
const t = useT();
|
|
3314
|
+
const [contextOpen, setContextOpen] = useState(false);
|
|
3232
3315
|
return (
|
|
3233
|
-
|
|
3234
|
-
<
|
|
3235
|
-
<
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
<IconDotsVertical className="h-4 w-4" />
|
|
3244
|
-
</Button>
|
|
3245
|
-
</DropdownMenuTrigger>
|
|
3246
|
-
<DropdownMenuContent align="end">
|
|
3247
|
-
<DropdownMenuItem asChild>
|
|
3248
|
-
<Link to={`/asset/${asset.id}`}>
|
|
3249
|
-
<IconArrowUpRight className="mr-2 h-4 w-4 shrink-0" />
|
|
3250
|
-
{t("library.viewDetails")}
|
|
3251
|
-
</Link>
|
|
3252
|
-
</DropdownMenuItem>
|
|
3253
|
-
{onMoveToReferences ? (
|
|
3254
|
-
<DropdownMenuItem
|
|
3255
|
-
onSelect={(event) => {
|
|
3256
|
-
event.preventDefault();
|
|
3257
|
-
onMoveToReferences();
|
|
3258
|
-
}}
|
|
3316
|
+
<>
|
|
3317
|
+
<DropdownMenu>
|
|
3318
|
+
<DropdownMenuTrigger asChild>
|
|
3319
|
+
<Button
|
|
3320
|
+
type="button"
|
|
3321
|
+
variant="secondary"
|
|
3322
|
+
size="icon"
|
|
3323
|
+
className="h-8 w-8 shadow-sm"
|
|
3324
|
+
aria-label={t("library.assetActions")}
|
|
3325
|
+
disabled={busy}
|
|
3259
3326
|
>
|
|
3260
|
-
<
|
|
3261
|
-
|
|
3327
|
+
<IconDotsVertical className="h-4 w-4" />
|
|
3328
|
+
</Button>
|
|
3329
|
+
</DropdownMenuTrigger>
|
|
3330
|
+
<DropdownMenuContent align="end">
|
|
3331
|
+
<DropdownMenuItem asChild>
|
|
3332
|
+
<Link to={`/asset/${asset.id}`}>
|
|
3333
|
+
<IconArrowUpRight className="mr-2 h-4 w-4 shrink-0" />
|
|
3334
|
+
{t("library.viewDetails")}
|
|
3335
|
+
</Link>
|
|
3262
3336
|
</DropdownMenuItem>
|
|
3263
|
-
) : null}
|
|
3264
|
-
{onRemoveFromReferences ? (
|
|
3265
3337
|
<DropdownMenuItem
|
|
3266
3338
|
onSelect={(event) => {
|
|
3267
3339
|
event.preventDefault();
|
|
3268
|
-
|
|
3340
|
+
setContextOpen(true);
|
|
3269
3341
|
}}
|
|
3270
3342
|
>
|
|
3271
|
-
<
|
|
3272
|
-
|
|
3343
|
+
<IconLink className="mr-2 h-4 w-4 shrink-0" />
|
|
3344
|
+
Add to context
|
|
3345
|
+
{/* i18n-ignore assets template UI is raw-English pending template i18n pass */}
|
|
3273
3346
|
</DropdownMenuItem>
|
|
3274
|
-
|
|
3275
|
-
<DropdownMenuSub>
|
|
3276
|
-
<DropdownMenuSubTrigger>
|
|
3277
|
-
<IconFolder className="mr-2 h-4 w-4 shrink-0" />
|
|
3278
|
-
{t("library.moveTo")}
|
|
3279
|
-
</DropdownMenuSubTrigger>
|
|
3280
|
-
<DropdownMenuSubContent>
|
|
3347
|
+
{onMoveToReferences ? (
|
|
3281
3348
|
<DropdownMenuItem
|
|
3282
|
-
onSelect={() =>
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3349
|
+
onSelect={(event) => {
|
|
3350
|
+
event.preventDefault();
|
|
3351
|
+
onMoveToReferences();
|
|
3352
|
+
}}
|
|
3353
|
+
>
|
|
3354
|
+
<IconPhotoPlus className="mr-2 h-4 w-4 shrink-0" />
|
|
3355
|
+
{t("library.addToReferences")}
|
|
3356
|
+
</DropdownMenuItem>
|
|
3357
|
+
) : null}
|
|
3358
|
+
{onRemoveFromReferences ? (
|
|
3359
|
+
<DropdownMenuItem
|
|
3360
|
+
onSelect={(event) => {
|
|
3361
|
+
event.preventDefault();
|
|
3362
|
+
onRemoveFromReferences();
|
|
3363
|
+
}}
|
|
3288
3364
|
>
|
|
3289
|
-
|
|
3365
|
+
<IconX className="mr-2 h-4 w-4 shrink-0" />
|
|
3366
|
+
{t("library.removeFromReferences")}
|
|
3290
3367
|
</DropdownMenuItem>
|
|
3291
|
-
|
|
3368
|
+
) : null}
|
|
3369
|
+
<DropdownMenuSub>
|
|
3370
|
+
<DropdownMenuSubTrigger>
|
|
3371
|
+
<IconFolder className="mr-2 h-4 w-4 shrink-0" />
|
|
3372
|
+
{t("library.moveTo")}
|
|
3373
|
+
</DropdownMenuSubTrigger>
|
|
3374
|
+
<DropdownMenuSubContent>
|
|
3292
3375
|
<DropdownMenuItem
|
|
3293
|
-
key={folder.id}
|
|
3294
3376
|
onSelect={() =>
|
|
3295
3377
|
updateAsset.mutate({
|
|
3296
3378
|
id: asset.id,
|
|
3297
|
-
folderId:
|
|
3379
|
+
folderId: null,
|
|
3298
3380
|
})
|
|
3299
3381
|
}
|
|
3300
3382
|
>
|
|
3301
|
-
{
|
|
3383
|
+
{t("library.unfiled")}
|
|
3302
3384
|
</DropdownMenuItem>
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3385
|
+
{folders.map((folder) => (
|
|
3386
|
+
<DropdownMenuItem
|
|
3387
|
+
key={folder.id}
|
|
3388
|
+
onSelect={() =>
|
|
3389
|
+
updateAsset.mutate({
|
|
3390
|
+
id: asset.id,
|
|
3391
|
+
folderId: folder.id,
|
|
3392
|
+
})
|
|
3393
|
+
}
|
|
3394
|
+
>
|
|
3395
|
+
{folder.title}
|
|
3396
|
+
</DropdownMenuItem>
|
|
3397
|
+
))}
|
|
3398
|
+
</DropdownMenuSubContent>
|
|
3399
|
+
</DropdownMenuSub>
|
|
3400
|
+
<DropdownMenuSeparator />
|
|
3401
|
+
<DropdownMenuItem
|
|
3402
|
+
className="text-destructive focus:bg-destructive/10 focus:text-destructive"
|
|
3403
|
+
onSelect={onDelete}
|
|
3404
|
+
>
|
|
3405
|
+
<IconTrash className="mr-2 h-4 w-4 shrink-0" />
|
|
3406
|
+
{t("assetDetail.delete")}
|
|
3407
|
+
</DropdownMenuItem>
|
|
3408
|
+
</DropdownMenuContent>
|
|
3409
|
+
</DropdownMenu>
|
|
3410
|
+
<CreativeContextShareSheet
|
|
3411
|
+
open={contextOpen}
|
|
3412
|
+
onOpenChange={setContextOpen}
|
|
3413
|
+
resource={{
|
|
3414
|
+
appId: "assets",
|
|
3415
|
+
resourceType: "asset",
|
|
3416
|
+
resourceId: asset.id,
|
|
3417
|
+
title: assetDisplayTitle(asset),
|
|
3418
|
+
updatedAt: asset.updatedAt,
|
|
3419
|
+
preview: { kind: "document", label: "Asset" },
|
|
3420
|
+
}}
|
|
3421
|
+
/>
|
|
3422
|
+
</>
|
|
3316
3423
|
);
|
|
3317
3424
|
}
|
|
3318
3425
|
|
|
@@ -3369,6 +3476,7 @@ function AssetLaneTile({
|
|
|
3369
3476
|
onMoveToReferences?: () => void;
|
|
3370
3477
|
}) {
|
|
3371
3478
|
const t = useT();
|
|
3479
|
+
const [contextOpen, setContextOpen] = useState(false);
|
|
3372
3480
|
const displayTitle = assetDisplayTitle(asset);
|
|
3373
3481
|
const sourceText = assetLineageSourceText(asset);
|
|
3374
3482
|
const canMoveToReferences = Boolean(onMoveToReferences);
|
|
@@ -3419,6 +3527,16 @@ function AssetLaneTile({
|
|
|
3419
3527
|
{t("library.viewDetails")}
|
|
3420
3528
|
</Link>
|
|
3421
3529
|
</DropdownMenuItem>
|
|
3530
|
+
<DropdownMenuItem
|
|
3531
|
+
onSelect={(event) => {
|
|
3532
|
+
event.preventDefault();
|
|
3533
|
+
setContextOpen(true);
|
|
3534
|
+
}}
|
|
3535
|
+
>
|
|
3536
|
+
<IconLink className="mr-2 h-4 w-4 shrink-0" />
|
|
3537
|
+
Add to context
|
|
3538
|
+
{/* i18n-ignore assets template UI is raw-English pending template i18n pass */}
|
|
3539
|
+
</DropdownMenuItem>
|
|
3422
3540
|
{canMoveToReferences ? (
|
|
3423
3541
|
<DropdownMenuItem
|
|
3424
3542
|
onSelect={(event) => {
|
|
@@ -3548,6 +3666,18 @@ function AssetLaneTile({
|
|
|
3548
3666
|
</div>
|
|
3549
3667
|
</div>
|
|
3550
3668
|
) : null}
|
|
3669
|
+
<CreativeContextShareSheet
|
|
3670
|
+
open={contextOpen}
|
|
3671
|
+
onOpenChange={setContextOpen}
|
|
3672
|
+
resource={{
|
|
3673
|
+
appId: "assets",
|
|
3674
|
+
resourceType: "asset",
|
|
3675
|
+
resourceId: asset.id,
|
|
3676
|
+
title: displayTitle,
|
|
3677
|
+
updatedAt: asset.updatedAt,
|
|
3678
|
+
preview: { kind: "document", label: "Asset" },
|
|
3679
|
+
}}
|
|
3680
|
+
/>
|
|
3551
3681
|
</div>
|
|
3552
3682
|
);
|
|
3553
3683
|
}
|
|
@@ -1011,7 +1011,7 @@ function LibraryKitSelector({
|
|
|
1011
1011
|
type="button"
|
|
1012
1012
|
className="-ml-1.5 inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-md px-1.5 py-1 text-left text-xl font-semibold leading-tight tracking-tight transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
|
|
1013
1013
|
>
|
|
1014
|
-
<span className="block min-w-0
|
|
1014
|
+
<span className="block min-w-0 break-words">
|
|
1015
1015
|
{triggerLabel ?? selectedLibrary?.title ?? t("library.allAssets")}
|
|
1016
1016
|
</span>
|
|
1017
1017
|
<IconChevronDown className="h-4 w-4 shrink-0 text-muted-foreground" />
|
|
@@ -2155,16 +2155,10 @@ export function LibraryWorkspace({
|
|
|
2155
2155
|
) : routeSelectedLibraryId || hasLibraries ? (
|
|
2156
2156
|
<div className="min-w-0">
|
|
2157
2157
|
{routeSelectedLibraryId ? (
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
/>
|
|
2163
|
-
<BrandKitDetailRoute
|
|
2164
|
-
libraryId={routeSelectedLibraryId}
|
|
2165
|
-
headerMode="actions"
|
|
2166
|
-
/>
|
|
2167
|
-
</>
|
|
2158
|
+
<BrandKitDetailRoute
|
|
2159
|
+
libraryId={routeSelectedLibraryId}
|
|
2160
|
+
headerMode="actions"
|
|
2161
|
+
/>
|
|
2168
2162
|
) : (
|
|
2169
2163
|
<AllAssetsBrowser foldersByLibraryId={foldersByLibraryId} />
|
|
2170
2164
|
)}
|