@burdenoff/fluidgrids-fe-sdk 2026.803.3 → 2026.804.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/ExecutionDetailPage-FCY3S336.js +1 -1
  2. package/dist/ExecutionsListPage-IZJPACQV.js +8 -0
  3. package/dist/{ExecutionsListPage-5S7FYMT3.js.map → ExecutionsListPage-IZJPACQV.js.map} +1 -1
  4. package/dist/MissingNodesInstallModal-OT3LJZ4M.js +184 -0
  5. package/dist/MissingNodesInstallModal-OT3LJZ4M.js.map +1 -0
  6. package/dist/{TemplateConfigurationModal-MTR7VP6G.js → TemplateConfigurationModal-7OT6QBEA.js} +4 -3
  7. package/dist/TemplateConfigurationModal-7OT6QBEA.js.map +1 -0
  8. package/dist/WorkflowBuilder-42S2S3PO.js +16 -0
  9. package/dist/{WorkflowBuilder-UVG6GJ6F.js.map → WorkflowBuilder-42S2S3PO.js.map} +1 -1
  10. package/dist/WorkflowsList-L7EJW54K.js +10 -0
  11. package/dist/{WorkflowsList-HNXWE56Q.js.map → WorkflowsList-L7EJW54K.js.map} +1 -1
  12. package/dist/{chunk-MRVS73S2.js → chunk-BRMURCHH.js} +4 -22
  13. package/dist/chunk-BRMURCHH.js.map +1 -0
  14. package/dist/{chunk-WWKY5CJ4.js → chunk-CN3VSAYR.js} +11349 -419
  15. package/dist/chunk-CN3VSAYR.js.map +1 -0
  16. package/dist/{chunk-3CIPVKE4.js → chunk-CQAHXNT2.js} +3 -3
  17. package/dist/{chunk-3CIPVKE4.js.map → chunk-CQAHXNT2.js.map} +1 -1
  18. package/dist/{chunk-ZM4SSEVI.js → chunk-JPHK5LAL.js} +195 -3
  19. package/dist/chunk-JPHK5LAL.js.map +1 -0
  20. package/dist/{chunk-WZBJIBUX.js → chunk-MH4AHYK3.js} +3 -3
  21. package/dist/{chunk-WZBJIBUX.js.map → chunk-MH4AHYK3.js.map} +1 -1
  22. package/dist/chunk-P5PKRQAO.js +25 -0
  23. package/dist/chunk-P5PKRQAO.js.map +1 -0
  24. package/dist/{chunk-FIREEQYQ.js → chunk-S7FNNFPU.js} +23 -6
  25. package/dist/chunk-S7FNNFPU.js.map +1 -0
  26. package/dist/index.js +108 -73
  27. package/dist/index.js.map +1 -1
  28. package/package.json +1 -1
  29. package/dist/ExecutionsListPage-5S7FYMT3.js +0 -8
  30. package/dist/TemplateConfigurationModal-MTR7VP6G.js.map +0 -1
  31. package/dist/WorkflowBuilder-UVG6GJ6F.js +0 -17
  32. package/dist/WorkflowsList-HNXWE56Q.js +0 -11
  33. package/dist/blocks-LFAFGFT4.js +0 -11
  34. package/dist/blocks-LFAFGFT4.js.map +0 -1
  35. package/dist/chunk-CN6MX457.js +0 -10897
  36. package/dist/chunk-CN6MX457.js.map +0 -1
  37. package/dist/chunk-F2CI6H7E.js +0 -177
  38. package/dist/chunk-F2CI6H7E.js.map +0 -1
  39. package/dist/chunk-FIREEQYQ.js.map +0 -1
  40. package/dist/chunk-MRVS73S2.js.map +0 -1
  41. package/dist/chunk-WWKY5CJ4.js.map +0 -1
  42. package/dist/chunk-ZM4SSEVI.js.map +0 -1
@@ -1,177 +0,0 @@
1
- import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, WorkflowDefinitionsTagsDocument } from './chunk-V5UEEB74.js';
2
- import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
3
- import { useState, useCallback, useEffect } from 'react';
4
-
5
- var FLUIDGRIDS_ENTITY_TYPES = ["FLUIDGRIDS_WORKFLOW"];
6
- function tagLabel(assignment) {
7
- return assignment.tagInfo?.label ?? assignment.tagInfo?.key ?? assignment.tagId.slice(0, 8);
8
- }
9
- function useEntityTags(entityType, entityId) {
10
- const [tags, setTags] = useState([]);
11
- const [loading, setLoading] = useState(false);
12
- const [error, setError] = useState(null);
13
- const refetch = useCallback(async () => {
14
- if (!entityId) {
15
- setTags([]);
16
- return [];
17
- }
18
- setLoading(true);
19
- setError(null);
20
- try {
21
- const { data } = await getFluidGridsClient().query({
22
- query: FluidgridsEntityTagsDocument,
23
- variables: { input: { entityType, entityId } },
24
- fetchPolicy: "network-only"
25
- });
26
- const next = data?.fluidgridsEntityTags ?? [];
27
- setTags(next);
28
- return next;
29
- } catch (err) {
30
- setError(err);
31
- return [];
32
- } finally {
33
- setLoading(false);
34
- }
35
- }, [entityType, entityId]);
36
- useEffect(() => {
37
- void refetch();
38
- }, [refetch]);
39
- return { tags, loading, error, refetch };
40
- }
41
- function useAvailableTags(limit = 50, options = {}) {
42
- const [availableTags, setAvailableTags] = useState([]);
43
- const [loading, setLoading] = useState(false);
44
- const skip = options.skip ?? false;
45
- const fetchTags = useCallback(async () => {
46
- if (skip) return;
47
- setLoading(true);
48
- try {
49
- const { data } = await getFluidGridsClient().query({
50
- query: AvailableFluidgridsTagsDocument,
51
- variables: { limit },
52
- fetchPolicy: "network-only"
53
- });
54
- setAvailableTags(data?.availableFluidgridsTags ?? []);
55
- } catch {
56
- setAvailableTags([]);
57
- } finally {
58
- setLoading(false);
59
- }
60
- }, [limit, skip]);
61
- useEffect(() => {
62
- void fetchTags();
63
- }, [fetchTags]);
64
- return { availableTags, loading, refetch: fetchTags };
65
- }
66
- function useSearchTags() {
67
- return useCallback(
68
- async (query, limit = 20) => {
69
- if (!query.trim()) return [];
70
- try {
71
- const { data } = await getFluidGridsClient().query({
72
- query: SearchFluidgridsTagsDocument,
73
- variables: { query, limit },
74
- fetchPolicy: "network-only"
75
- });
76
- return data?.searchFluidgridsTags ?? [];
77
- } catch {
78
- return [];
79
- }
80
- },
81
- []
82
- );
83
- }
84
- function useTagEntity() {
85
- return useCallback(
86
- async (entityType, entityId, tagId) => {
87
- const { data } = await getFluidGridsClient().mutate({
88
- mutation: TagFluidgridsEntityDocument,
89
- variables: { input: { entityType, entityId, tagId, source: "MANUAL" } }
90
- });
91
- return Boolean(data?.tagFluidgridsEntity);
92
- },
93
- []
94
- );
95
- }
96
- function useUntagEntity() {
97
- return useCallback(
98
- async (entityType, entityId, tagId) => {
99
- const { data } = await getFluidGridsClient().mutate({
100
- mutation: UntagFluidgridsEntityDocument,
101
- variables: { input: { entityType, entityId, tagId } }
102
- });
103
- return Boolean(data?.untagFluidgridsEntity);
104
- },
105
- []
106
- );
107
- }
108
- function useReplaceEntityTags() {
109
- return useCallback(
110
- async (entityType, entityId, tagIds) => {
111
- const { data } = await getFluidGridsClient().mutate({
112
- mutation: ReplaceFluidgridsEntityTagsDocument,
113
- variables: { input: { entityType, entityId, tagIds } }
114
- });
115
- return data?.replaceFluidgridsEntityTags ?? [];
116
- },
117
- []
118
- );
119
- }
120
- function useCreateTag() {
121
- return useCallback(
122
- async (label, color) => {
123
- const { data } = await getFluidGridsClient().mutate({
124
- mutation: CreateFluidgridsTagDocument,
125
- variables: { input: { label, color } }
126
- });
127
- return data?.createFluidgridsTag ?? null;
128
- },
129
- []
130
- );
131
- }
132
- function useDraftEntityTags(entityType) {
133
- const [draftTagIds, setDraftTagIds] = useState([]);
134
- const tagEntity = useTagEntity();
135
- const flushTags = useCallback(
136
- async (entityId) => {
137
- if (!entityId || draftTagIds.length === 0) return;
138
- await Promise.all(
139
- draftTagIds.map(
140
- (tagId) => tagEntity(entityType, entityId, tagId).catch(() => false)
141
- )
142
- );
143
- },
144
- [draftTagIds, entityType, tagEntity]
145
- );
146
- return { draftTagIds, setDraftTagIds, flushTags };
147
- }
148
- function useWorkflowTagOverlay(limit = 100) {
149
- const [tagsByKey, setTagsByKey] = useState({});
150
- const fetchOverlay = useCallback(async () => {
151
- try {
152
- const { data } = await getFluidGridsClient().query({
153
- query: WorkflowDefinitionsTagsDocument,
154
- variables: { input: { limit } },
155
- fetchPolicy: "network-only"
156
- });
157
- const next = {};
158
- for (const item of data?.workflowDefinitions?.items ?? []) {
159
- const assignments = item.tagAssignments ?? [];
160
- if (assignments.length > 0 && !next[item.workflowKey]) {
161
- next[item.workflowKey] = assignments;
162
- }
163
- }
164
- setTagsByKey(next);
165
- } catch {
166
- setTagsByKey({});
167
- }
168
- }, [limit]);
169
- useEffect(() => {
170
- void fetchOverlay();
171
- }, [fetchOverlay]);
172
- return { tagsByKey, refetch: fetchOverlay };
173
- }
174
-
175
- export { FLUIDGRIDS_ENTITY_TYPES, tagLabel, useAvailableTags, useCreateTag, useDraftEntityTags, useEntityTags, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTagOverlay };
176
- //# sourceMappingURL=chunk-F2CI6H7E.js.map
177
- //# sourceMappingURL=chunk-F2CI6H7E.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/useEntityTags.ts"],"names":[],"mappings":"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","file":"chunk-F2CI6H7E.js","sourcesContent":["/**\n * Entity tag hooks — thin wrappers over the generic FluidGrids tag API\n * (wspace-workflow-svc `tags` module → wspace-tags-svc).\n *\n * Uses the shared Apollo client directly rather than generated hooks, matching\n * the convention in useWorkflows.ts (works in embeds and other contexts that\n * mount the SDK without an ApolloProvider above them).\n */\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { getFluidGridsClient } from \"../graphql/client\";\nimport {\n AvailableFluidgridsTagsDocument,\n CreateFluidgridsTagDocument,\n FluidgridsEntityTagsDocument,\n ReplaceFluidgridsEntityTagsDocument,\n SearchFluidgridsTagsDocument,\n TagFluidgridsEntityDocument,\n UntagFluidgridsEntityDocument,\n WorkflowDefinitionsTagsDocument,\n} from \"../generated/operations\";\n\n/** Entity types accepted by the FluidGrids tag API. */\nexport const FLUIDGRIDS_ENTITY_TYPES = [\"FLUIDGRIDS_WORKFLOW\"] as const;\nexport type FluidgridsEntityType = (typeof FLUIDGRIDS_ENTITY_TYPES)[number];\n\nexport interface EntityTagAssignment {\n id: string;\n tagId: string;\n entityType: string;\n entityId: string;\n source: string;\n assignedAt?: string | null;\n tagInfo?: {\n id: string;\n key?: string | null;\n label?: string | null;\n color?: string | null;\n } | null;\n}\n\nexport interface AvailableTag {\n id: string;\n key: string;\n label: string;\n color?: string | null;\n}\n\n/** Display label for an assignment, degrading to the tag id when tags-svc omits the projection. */\nexport function tagLabel(assignment: EntityTagAssignment): string {\n return (\n assignment.tagInfo?.label ??\n assignment.tagInfo?.key ??\n assignment.tagId.slice(0, 8)\n );\n}\n\n/** Tags currently assigned to an entity. */\nexport function useEntityTags(entityType: string, entityId?: string) {\n const [tags, setTags] = useState<EntityTagAssignment[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const refetch = useCallback(async (): Promise<EntityTagAssignment[]> => {\n if (!entityId) {\n setTags([]);\n return [];\n }\n setLoading(true);\n setError(null);\n try {\n const { data } = await getFluidGridsClient().query<{\n fluidgridsEntityTags: EntityTagAssignment[];\n }>({\n query: FluidgridsEntityTagsDocument,\n variables: { input: { entityType, entityId } },\n fetchPolicy: \"network-only\",\n });\n const next = data?.fluidgridsEntityTags ?? [];\n setTags(next);\n return next;\n } catch (err) {\n setError(err as Error);\n return [];\n } finally {\n setLoading(false);\n }\n }, [entityType, entityId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { tags, loading, error, refetch };\n}\n\n/** All assignable tags in the workspace. */\nexport function useAvailableTags(limit = 50, options: { skip?: boolean } = {}) {\n const [availableTags, setAvailableTags] = useState<AvailableTag[]>([]);\n const [loading, setLoading] = useState(false);\n const skip = options.skip ?? false;\n\n const fetchTags = useCallback(async () => {\n if (skip) return;\n setLoading(true);\n try {\n const { data } = await getFluidGridsClient().query<{\n availableFluidgridsTags: AvailableTag[];\n }>({\n query: AvailableFluidgridsTagsDocument,\n variables: { limit },\n fetchPolicy: \"network-only\",\n });\n setAvailableTags(data?.availableFluidgridsTags ?? []);\n } catch {\n // Non-fatal: the picker still allows inline creation.\n setAvailableTags([]);\n } finally {\n setLoading(false);\n }\n }, [limit, skip]);\n\n useEffect(() => {\n void fetchTags();\n }, [fetchTags]);\n\n return { availableTags, loading, refetch: fetchTags };\n}\n\n/** Search assignable tags by label. */\nexport function useSearchTags() {\n return useCallback(\n async (query: string, limit = 20): Promise<AvailableTag[]> => {\n if (!query.trim()) return [];\n try {\n const { data } = await getFluidGridsClient().query<{\n searchFluidgridsTags: AvailableTag[];\n }>({\n query: SearchFluidgridsTagsDocument,\n variables: { query, limit },\n fetchPolicy: \"network-only\",\n });\n return data?.searchFluidgridsTags ?? [];\n } catch {\n return [];\n }\n },\n [],\n );\n}\n\n/** Assign a tag to an entity. */\nexport function useTagEntity() {\n return useCallback(\n async (\n entityType: string,\n entityId: string,\n tagId: string,\n ): Promise<boolean> => {\n const { data } = await getFluidGridsClient().mutate<{\n tagFluidgridsEntity: EntityTagAssignment;\n }>({\n mutation: TagFluidgridsEntityDocument,\n variables: { input: { entityType, entityId, tagId, source: \"MANUAL\" } },\n });\n return Boolean(data?.tagFluidgridsEntity);\n },\n [],\n );\n}\n\n/** Remove a tag from an entity. */\nexport function useUntagEntity() {\n return useCallback(\n async (\n entityType: string,\n entityId: string,\n tagId: string,\n ): Promise<boolean> => {\n const { data } = await getFluidGridsClient().mutate<{\n untagFluidgridsEntity: boolean;\n }>({\n mutation: UntagFluidgridsEntityDocument,\n variables: { input: { entityType, entityId, tagId } },\n });\n return Boolean(data?.untagFluidgridsEntity);\n },\n [],\n );\n}\n\n/** Replace the full tag set on an entity. */\nexport function useReplaceEntityTags() {\n return useCallback(\n async (entityType: string, entityId: string, tagIds: string[]) => {\n const { data } = await getFluidGridsClient().mutate<{\n replaceFluidgridsEntityTags: EntityTagAssignment[];\n }>({\n mutation: ReplaceFluidgridsEntityTagsDocument,\n variables: { input: { entityType, entityId, tagIds } },\n });\n return data?.replaceFluidgridsEntityTags ?? [];\n },\n [],\n );\n}\n\n/** Create a new assignable tag (inline creation from the picker). */\nexport function useCreateTag() {\n return useCallback(\n async (label: string, color?: string): Promise<AvailableTag | null> => {\n const { data } = await getFluidGridsClient().mutate<{\n createFluidgridsTag: AvailableTag;\n }>({\n mutation: CreateFluidgridsTagDocument,\n variables: { input: { label, color } },\n });\n return data?.createFluidgridsTag ?? null;\n },\n [],\n );\n}\n\n/**\n * Create-time tagging: collect tag ids while the entity does not exist yet,\n * then flush them once it does.\n *\n * The flush is best-effort — the entity already exists by then, so a tag\n * failure must never block navigation; the detail-surface picker lets the\n * user retry.\n */\nexport function useDraftEntityTags(entityType: FluidgridsEntityType) {\n const [draftTagIds, setDraftTagIds] = useState<string[]>([]);\n const tagEntity = useTagEntity();\n\n const flushTags = useCallback(\n async (entityId: string) => {\n if (!entityId || draftTagIds.length === 0) return;\n await Promise.all(\n draftTagIds.map((tagId) =>\n tagEntity(entityType, entityId, tagId).catch(() => false),\n ),\n );\n },\n [draftTagIds, entityType, tagEntity],\n );\n\n return { draftTagIds, setDraftTagIds, flushTags };\n}\n\n/**\n * Tag overlay for the workflow list: workflowKey -> assignments.\n *\n * Deliberately a separate query from WorkflowDefinitions. If `tagAssignments`\n * is missing from the supergraph (backend not yet deployed, Hive CDN still\n * reconciling) this query fails on its own and the list still renders — it\n * just shows no chips and no tag filter.\n */\nexport function useWorkflowTagOverlay(limit = 100) {\n const [tagsByKey, setTagsByKey] = useState<\n Record<string, EntityTagAssignment[]>\n >({});\n\n const fetchOverlay = useCallback(async () => {\n try {\n const { data } = await getFluidGridsClient().query<{\n workflowDefinitions: {\n items: Array<{\n workflowKey: string;\n tagAssignments?: EntityTagAssignment[] | null;\n }>;\n };\n }>({\n query: WorkflowDefinitionsTagsDocument,\n variables: { input: { limit } },\n fetchPolicy: \"network-only\",\n });\n const next: Record<string, EntityTagAssignment[]> = {};\n for (const item of data?.workflowDefinitions?.items ?? []) {\n const assignments = item.tagAssignments ?? [];\n // Rows are per version and every version shares the workflowKey's tag\n // set — first non-empty wins.\n if (assignments.length > 0 && !next[item.workflowKey]) {\n next[item.workflowKey] = assignments;\n }\n }\n setTagsByKey(next);\n } catch {\n // Tags are decoration — never let this break the list.\n setTagsByKey({});\n }\n }, [limit]);\n\n useEffect(() => {\n void fetchOverlay();\n }, [fetchOverlay]);\n\n return { tagsByKey, refetch: fetchOverlay };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/SharePopup.tsx","../src/builder/components/ui/card-workflow.tsx","../src/pages/WorkflowsList.tsx"],"names":["useState","toast","jsxs","jsx","Button","useNavigate","uuidv4","Icon","cn"],"mappings":"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","file":"chunk-FIREEQYQ.js","sourcesContent":["import { useState } from \"react\";\nimport { Copy, Share2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { config } from \"../config\";\n\ninterface SharePopupProps {\n url: string;\n embedSrc: string;\n}\n\nexport default function SharePopup({\n url = window.location.href,\n embedSrc = `${config.fluidgridFrontendUrl}/workflow-view/565201ec-e803-4281-ad39-a135c46daa89/1.0`,\n}: SharePopupProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [width, setWidth] = useState(600);\n const [height, setHeight] = useState(400);\n const [activeTab, setActiveTab] = useState<\"link\" | \"embed\">(\"link\");\n\n const embedCode = `<iframe src=\"${embedSrc}\" width=\"${width}\" height=\"${height}\"></iframe>`;\n\n const copyToClipboard = (text: string, message: string) => {\n navigator.clipboard.writeText(text);\n toast.success(message);\n };\n\n if (!isOpen) {\n return (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setIsOpen(true)}>\n <Share2 className=\"h-4 w-4\" />\n <span className=\"sr-only\">Share</span>\n </Button>\n );\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n onClick={() => setIsOpen(false)}\n >\n <div\n className=\"bg-card rounded-lg p-6 max-w-md w-full mx-4\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex justify-between items-center mb-4\">\n <h2 className=\"text-lg font-semibold\">Share</h2>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setIsOpen(false)}>\n &times;\n </Button>\n </div>\n\n <div className=\"flex gap-2 mb-4\">\n <Button\n variant={activeTab === \"link\" ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => setActiveTab(\"link\")}\n >\n Share Link\n </Button>\n <Button\n variant={activeTab === \"embed\" ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => setActiveTab(\"embed\")}\n >\n Embed\n </Button>\n </div>\n\n {activeTab === \"link\" && (\n <div className=\"flex items-center space-x-2\">\n <input\n readOnly\n value={url}\n className=\"flex-1 h-9 px-3 rounded-md border bg-background text-sm\"\n />\n <Button\n size=\"sm\"\n onClick={() => copyToClipboard(url, \"Link copied to clipboard\")}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n\n {activeTab === \"embed\" && (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Width</label>\n <input\n type=\"number\"\n value={width}\n onChange={(e) => setWidth(Number(e.target.value))}\n className=\"w-full h-9 px-3 rounded-md border bg-background text-sm mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Height</label>\n <input\n type=\"number\"\n value={height}\n onChange={(e) => setHeight(Number(e.target.value))}\n className=\"w-full h-9 px-3 rounded-md border bg-background text-sm mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Embed Code</label>\n <div className=\"relative mt-1\">\n <input\n readOnly\n value={embedCode}\n className=\"w-full h-9 px-3 pr-12 rounded-md border bg-background text-sm font-mono\"\n />\n <Button\n size=\"sm\"\n className=\"absolute right-1 top-1/2 -translate-y-1/2 h-7\"\n onClick={() =>\n copyToClipboard(embedCode, \"Embed code copied to clipboard\")\n }\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Card,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from \"@burdenoff/fe-libs/ui\";\nimport { TagBadge } from \"@burdenoff/fe-libs/tag\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useFlowStore } from \"../../stores/flow-store\";\nimport { useNavigate } from \"react-router\";\nimport { config } from \"../../../config\";\nimport SharePopup from \"../../../components/SharePopup\";\nimport {\n useDuplicateWorkflow,\n useDeleteWorkflow,\n} from \"../../../hooks/useWorkflows\";\nimport { SdkPermissionGate } from \"../../../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../../../permissions/constants\";\n\ninterface WorkflowTagChip {\n id: string;\n label: string;\n color?: string;\n}\n\ninterface WorkflowData {\n id?: string;\n workflow_key: string;\n version: string;\n name: string;\n description?: string;\n status?: string;\n alias?: string;\n updated_at?: string;\n created_at?: string;\n total_versions?: number;\n /** Resolved tag assignments, rendered as read-only chips. */\n tags?: WorkflowTagChip[];\n}\n\n/** Status pill: colored dot + label, calmer than a filled badge. */\nconst STATUS_STYLES: Record<string, { label: string; dotClass: string }> = {\n DRAFT: { label: \"Draft\", dotClass: \"bg-muted-foreground/60\" },\n ACTIVE: {\n label: \"Active\",\n dotClass: \"bg-[var(--color-status-success-text)]\",\n },\n ARCHIVED: { label: \"Archived\", dotClass: \"bg-muted-foreground/30\" },\n DEPRECATED: {\n label: \"Deprecated\",\n dotClass: \"bg-[var(--color-status-error-text)]\",\n },\n};\n\n/** Compact relative timestamp (\"2h ago\"); absolute date beyond a week. */\nfunction relativeTime(iso?: string): string {\n if (!iso) return \"—\";\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return \"—\";\n const mins = Math.floor((Date.now() - then) / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n if (days < 7) return `${days}d ago`;\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(new Date(then));\n}\n\nexport const CardWorkflow = ({\n workflow,\n onUpdateSuccess,\n}: {\n workflow: WorkflowData;\n onUpdateSuccess: () => void;\n}) => {\n const navigate = useNavigate();\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { duplicateWorkflow: duplicateWorkflowMutation } =\n useDuplicateWorkflow();\n const { deleteWorkflow: deleteWorkflowMutation } = useDeleteWorkflow();\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n\n async function handleDuplicateWorkflow() {\n try {\n // Reset the store first to clear any existing state\n resetWorkflow();\n\n const result = await duplicateWorkflowMutation(\n workflow.workflow_key,\n workflow.version,\n {\n newWorkflowKey: `${workflow.workflow_key}_copy_${Date.now()}`,\n },\n );\n\n if (result?.success && result.workflow) {\n navigate(\n `../workflow/${result.workflow.workflowKey}/${result.workflow.version}`,\n );\n } else {\n throw new Error(result?.message || \"Failed to duplicate workflow\");\n }\n } catch (error) {\n console.error(\"Error duplicating workflow:\", error);\n toast.error(\n `Error duplicating workflow: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n const handleDeleteWorkflow = async (): Promise<void> => {\n if (!workflow.workflow_key) {\n console.error(\"Workflow ID is required to delete.\");\n return;\n }\n setIsDeleting(true);\n try {\n // Omit version to delete ALL versions of this workflow\n const success = await deleteWorkflowMutation(workflow.workflow_key);\n if (success) {\n setShowDeleteDialog(false);\n }\n } catch (error) {\n console.error(\"Error deleting workflow:\", error);\n toast.error(\n `Error deleting workflow: ${error instanceof Error ? error.message : String(error)}`,\n );\n } finally {\n setIsDeleting(false);\n setShowDeleteDialog(false);\n onUpdateSuccess();\n }\n };\n\n const handleOnEdit = () => {\n navigate(\"../workflow/\" + workflow.workflow_key + \"/\" + workflow.version);\n };\n\n /**\n * The whole card opens the builder (n8n-style). Inner controls — action\n * buttons, the share overlay (a non-portaled `fixed` div whose clicks bubble\n * through the card), and the dialog — must not trigger navigation.\n */\n const handleCardClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const el = e.target as HTMLElement;\n if (el.closest(\"button, a, input, [role='dialog'], .fixed\")) return;\n handleOnEdit();\n };\n\n const statusInfo =\n STATUS_STYLES[workflow.status ?? \"DRAFT\"] ?? STATUS_STYLES.DRAFT;\n const updatedExact = workflow.updated_at\n ? new Date(workflow.updated_at).toLocaleString()\n : undefined;\n\n return (\n <TooltipProvider>\n <Card\n role=\"button\"\n tabIndex={0}\n aria-label={`Open workflow ${workflow.name}`}\n onClick={handleCardClick}\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n handleOnEdit();\n }\n }}\n className={cn(\n \"group relative flex min-h-44 cursor-pointer flex-col gap-0 rounded-xl border-border bg-card p-0\",\n \"transition-all duration-150 hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-lg\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50\",\n )}\n >\n {/* Header: icon square + name/description + status pill */}\n <div className=\"flex flex-1 items-start gap-3 p-4\">\n <div className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-primary/20 bg-primary/10 text-primary\">\n <Icon icon=\"mdi:transit-connection-variant\" className=\"size-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3 className=\"truncate font-semibold leading-6 text-card-foreground\">\n {workflow?.name}\n </h3>\n <span className=\"mt-0.5 inline-flex shrink-0 items-center gap-1.5 rounded-full border border-border px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n <span\n className={cn(\"size-1.5 rounded-full\", statusInfo.dotClass)}\n />\n {statusInfo.label}\n </span>\n </div>\n <p className=\"mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground\">\n {workflow.description || \"No description\"}\n </p>\n {workflow.tags && workflow.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap items-center gap-1\">\n {workflow.tags.slice(0, 3).map((tag) => (\n <TagBadge\n key={tag.id}\n id={tag.id}\n label={tag.label}\n color={tag.color}\n size=\"sm\"\n />\n ))}\n {workflow.tags.length > 3 && (\n <span className=\"text-[11px] text-muted-foreground\">\n +{workflow.tags.length - 3}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Footer: metadata + actions (actions brighten on hover/focus) */}\n <div className=\"flex items-center justify-between gap-2 border-t border-border px-4 py-1.5\">\n <div\n className=\"flex min-w-0 items-center gap-1.5 text-[11px] text-muted-foreground\"\n title={updatedExact}\n >\n <Icon icon=\"mdi:clock-outline\" className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">\n Updated {relativeTime(workflow.updated_at)}\n </span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"shrink-0 font-mono\">\n {workflow.version}\n {workflow.alias ? ` (${workflow.alias})` : \"\"}\n </span>\n {workflow.total_versions && workflow.total_versions > 1 ? (\n <span className=\"shrink-0\">\n · {workflow.total_versions} versions\n </span>\n ) : null}\n </div>\n\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-60 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n onClick={handleOnEdit}\n aria-label=\"Edit workflow\"\n >\n <Icon icon=\"mynaui:edit\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Edit workflow</p>\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <SharePopup\n url={`${config.fluidgridFrontendUrl}/workflow-view/${workflow.workflow_key}/${workflow.version}`}\n embedSrc={`${config.fluidgridFrontendUrl}/workflow-view/${workflow.workflow_key}/${workflow.version}`}\n />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Share workflow</p>\n </TooltipContent>\n </Tooltip>\n <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n onClick={() => handleDuplicateWorkflow()}\n aria-label=\"Duplicate workflow\"\n >\n <Icon icon=\"mynaui:copy\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Duplicate workflow</p>\n </TooltipContent>\n </Tooltip>\n </SdkPermissionGate>\n <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.WORKFLOW_DELETE}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 text-[var(--color-status-error-text)] hover:text-[var(--color-status-error-text)]\"\n onClick={() => setShowDeleteDialog(true)}\n aria-label=\"Delete workflow\"\n >\n <Icon icon=\"mynaui:trash\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Delete workflow</p>\n </TooltipContent>\n </Tooltip>\n </SdkPermissionGate>\n </div>\n </div>\n </Card>\n\n <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Workflow</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete workflow &quot;{workflow.name}\n &quot; and all its versions? This action cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleDeleteWorkflow}\n disabled={isDeleting}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </TooltipProvider>\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Icon } from \"@iconify/react\";\n\nimport {\n Badge,\n Button,\n IllustratedEmptyState,\n Input,\n Skeleton,\n} from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { CardWorkflow } from \"../builder/components/ui/card-workflow\";\nimport { useWorkflowDefinitions } from \"../hooks/useWorkflows\";\nimport { useWorkflowTagOverlay } from \"../hooks/useEntityTags\";\nimport { SdkPermissionButton } from \"../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../permissions/constants\";\n\n/** Display order + labels for the status filter chips. */\nconst STATUS_FILTERS: Array<{ value: string; label: string }> = [\n { value: \"ACTIVE\", label: \"Active\" },\n { value: \"DRAFT\", label: \"Draft\" },\n { value: \"ARCHIVED\", label: \"Archived\" },\n { value: \"DEPRECATED\", label: \"Deprecated\" },\n];\n\nfunction SkeletonCard() {\n return (\n <div className=\"flex min-h-40 flex-col justify-between rounded-xl border border-border bg-card p-6\">\n <div className=\"space-y-2.5\">\n <Skeleton className=\"h-6 w-2/3 bg-card-foreground/15\" />\n <Skeleton className=\"h-4 w-full bg-card-foreground/10\" />\n </div>\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"mr-4 h-6 w-full bg-card-foreground/10\" />\n <Skeleton className=\"h-6 w-8 bg-card-foreground/10\" />\n <Skeleton className=\"h-6 w-8 bg-card-foreground/10\" />\n </div>\n </div>\n );\n}\n\nexport function WorkflowsList() {\n const navigate = useNavigate();\n const { workflows, loading, error, refetch } = useWorkflowDefinitions({\n limit: 100,\n latestOnly: true,\n });\n\n const [search, setSearch] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState<string | null>(null);\n const [tagFilter, setTagFilter] = useState<string | null>(null);\n // Fetched separately from the workflow list so a missing/lagging\n // tagAssignments field can never blank the list itself.\n const { tagsByKey } = useWorkflowTagOverlay();\n\n // Only offer chips for statuses that actually occur in this workspace.\n const presentStatuses = useMemo(() => {\n const seen = new Set<string>(workflows.map((w) => w.status ?? \"DRAFT\"));\n return STATUS_FILTERS.filter((s) => seen.has(s.value));\n }, [workflows]);\n\n // Tags present across the listed workflows, for the filter chips. Tag ids\n // come from the assignments so the filter works on ids, not labels\n // (two vocabularies can share a label).\n const presentTags = useMemo(() => {\n const byId = new Map<string, { id: string; label: string }>();\n for (const w of workflows) {\n for (const a of tagsByKey[w.workflowKey] ?? []) {\n if (!byId.has(a.tagId)) {\n byId.set(a.tagId, {\n id: a.tagId,\n label: a.tagInfo?.label ?? a.tagInfo?.key ?? \"Tag\",\n });\n }\n }\n }\n return [...byId.values()].sort((a, b) => a.label.localeCompare(b.label));\n }, [workflows, tagsByKey]);\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n return workflows.filter((w) => {\n if (statusFilter && (w.status ?? \"DRAFT\") !== statusFilter) return false;\n // Tags come from the separate overlay query, not from the workflow row:\n // tagAssignments was removed from the list query so a missing field can\n // never blank the list. Reading it here left the filter always empty.\n if (\n tagFilter &&\n !(tagsByKey[w.workflowKey] ?? []).some((a) => a.tagId === tagFilter)\n )\n return false;\n if (!q) return true;\n return [w.name, w.description, w.alias]\n .filter((v): v is string => typeof v === \"string\")\n .some((v) => v.toLowerCase().includes(q));\n });\n }, [workflows, search, statusFilter, tagFilter, tagsByKey]);\n\n const hasFilters =\n search.trim() !== \"\" || statusFilter !== null || tagFilter !== null;\n\n const createButton = (\n <SdkPermissionButton\n permission={FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE}\n deniedTooltip=\"You don't have permission to create workflows\"\n >\n <Button\n variant=\"default\"\n size=\"default\"\n className=\"font-bold text-primary-foreground\"\n onClick={() => navigate(`../workflow/${uuidv4()}/v1`)}\n >\n <Icon icon=\"mynaui:plus\" className=\"size-5 text-primary-foreground\" />\n Create Workflow\n </Button>\n </SdkPermissionButton>\n );\n\n return (\n // min-h-screen (matching the sibling pages) makes short content still fill\n // the viewport, keeping the shell footer below the fold.\n <main className=\"flex min-h-screen w-full flex-col bg-background-primary\">\n <div className=\"flex flex-1 flex-col gap-5 p-4 sm:p-6\">\n {/* Page header */}\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2.5\">\n <h1 className=\"text-2xl font-bold tracking-tight\">Workflows</h1>\n {!loading && !error && (\n <Badge variant=\"secondary\" className=\"font-mono\">\n {workflows.length}\n </Badge>\n )}\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Build, run, and manage your automations. Open a workflow to edit\n it in the visual builder.\n </p>\n </div>\n {createButton}\n </div>\n\n {/* Toolbar: search + status chips (only useful once something exists) */}\n {!loading && !error && workflows.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"relative w-full max-w-xs\">\n <Icon\n icon=\"mynaui:search\"\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\"\n />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search workflows…\"\n aria-label=\"Search workflows\"\n className=\"pl-8\"\n />\n </div>\n {presentStatuses.length > 1 && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={() => setStatusFilter(null)}\n className={cn(\n \"rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n statusFilter === null\n ? \"border-transparent bg-primary text-primary-foreground\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n All\n </button>\n {presentStatuses.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n onClick={() =>\n setStatusFilter((cur) =>\n cur === s.value ? null : s.value,\n )\n }\n className={cn(\n \"rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n statusFilter === s.value\n ? \"border-transparent bg-primary text-primary-foreground\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {s.label}\n </button>\n ))}\n </div>\n )}\n {presentTags.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Icon\n icon=\"mdi:tag-outline\"\n className=\"size-4 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n {presentTags.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n onClick={() =>\n setTagFilter((cur) => (cur === t.id ? null : t.id))\n }\n className={cn(\n \"rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n tagFilter === t.id\n ? \"border-transparent bg-primary text-primary-foreground\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {t.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Content */}\n {loading ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {Array.from({ length: 6 }, (_, i) => (\n <SkeletonCard key={i} />\n ))}\n </div>\n ) : error ? (\n <div className=\"grid flex-1 place-items-center\">\n <div className=\"flex max-w-md flex-col items-center gap-3 rounded-xl border border-border bg-card p-8 text-center\">\n <Icon\n icon=\"mynaui:danger-triangle\"\n className=\"size-8 text-destructive\"\n />\n <div>\n <p className=\"font-semibold\">Couldn't load workflows</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {error.message}\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\n <Icon icon=\"mynaui:refresh\" className=\"size-4\" />\n Try again\n </Button>\n </div>\n </div>\n ) : workflows.length === 0 ? (\n <div className=\"grid flex-1 place-items-center\">\n <IllustratedEmptyState\n illustration=\"onboarding\"\n title=\"Create your first workflow\"\n description=\"Workflows automate multi-step processes — sync signups into your CRM, post alerts to Slack, or transform data between apps. Start from a blank canvas or a template.\"\n action={createButton}\n />\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"grid flex-1 place-items-center\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Icon\n icon=\"mynaui:search\"\n className=\"size-8 text-muted-foreground\"\n />\n <p className=\"font-medium\">No workflows match your filters</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setSearch(\"\");\n setStatusFilter(null);\n setTagFilter(null);\n }}\n >\n Clear filters\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {filtered.map((workflow) => (\n <CardWorkflow\n key={workflow.id}\n workflow={{\n id: workflow.id,\n workflow_key: workflow.workflowKey,\n version: workflow.version,\n name: workflow.name,\n description: workflow.description ?? undefined,\n status: workflow.status ?? undefined,\n alias: workflow.alias ?? undefined,\n updated_at: workflow.updatedAt ?? undefined,\n created_at: workflow.createdAt ?? undefined,\n total_versions: workflow.totalVersions ?? undefined,\n tags: (tagsByKey[workflow.workflowKey] ?? []).map((a) => ({\n id: a.tagId,\n label: a.tagInfo?.label ?? a.tagInfo?.key ?? \"Tag\",\n color: a.tagInfo?.color ?? undefined,\n })),\n }}\n onUpdateSuccess={() => refetch()}\n />\n ))}\n </div>\n )}\n </div>\n </main>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/input.tsx","../src/ui/dialog.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-MRVS73S2.js","sourcesContent":["import { forwardRef, type InputHTMLAttributes } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n size?: \"default\" | \"lg\" | \"xl\" | \"full\";\n}) {\n const sizeClasses = {\n default: \"sm:max-w-lg\",\n lg: \"sm:max-w-3xl\",\n xl: \"sm:max-w-[1400px] w-[90vw]\",\n full: \"sm:max-w-[95vw] w-[95vw]\",\n };\n\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none\",\n sizeClasses[size],\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\"\n >\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n"]}