@jiggai/kitchen 0.5.10 โ 0.5.11
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +3 -3
- package/.next/server/app/channels.segments/_full.segment.rsc +3 -3
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +2 -2
- package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +3 -3
- package/.next/server/app/goals/new.segments/_full.segment.rsc +3 -3
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +3 -3
- package/.next/server/app/goals.segments/_full.segment.rsc +3 -3
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +2 -2
- package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/teams/[teamId]/deliverables/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__7af8e528._.js +9 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7af8e528._.js.map +1 -0
- package/.next/server/chunks/ssr/_15bc566e._.js +9 -0
- package/.next/server/chunks/ssr/_15bc566e._.js.map +1 -0
- package/.next/server/chunks/ssr/{_835573ec._.js โ _3d6d3f59._.js} +8 -2
- package/.next/server/chunks/ssr/_3d6d3f59._.js.map +1 -0
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +1 -7
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js.map +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2a86fa0c3d9177c5.js +7 -0
- package/.next/static/chunks/4a57b795d958b061.js +1 -0
- package/.next/static/chunks/67a9a9a3c6dd4aa4.js +7 -0
- package/.next/static/chunks/a683f58aaf4f41e9.css +3 -0
- package/.next/static/chunks/{212477db59154fa7.js โ b641409c1c9d8c3e.js} +3 -3
- package/.next/static/chunks/{fac5526bd312cf6e.js โ b8722104d0ceb74d.js} +9 -3
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js.map +0 -1
- package/.next/server/chunks/ssr/_835573ec._.js.map +0 -1
- package/.next/static/chunks/24ac17715eb2614d.js +0 -1
- package/.next/static/chunks/8b99ae14a606b607.css +0 -3
- package/.next/static/chunks/d593ea5e91e81b45.js +0 -1
- package/.next/static/chunks/ff661b5e599f8d74.js +0 -7
- /package/.next/static/{3JkH3_7LqC0wr-k7JoZl9 โ LRt6kweldrLHTF1HgLgu2}/_buildManifest.js +0 -0
- /package/.next/static/{3JkH3_7LqC0wr-k7JoZl9 โ LRt6kweldrLHTF1HgLgu2}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{3JkH3_7LqC0wr-k7JoZl9 โ LRt6kweldrLHTF1HgLgu2}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-dom.ts","../../../../src/lib/errors.ts","../../../../src/components/ConfirmationModal.tsx","../../../../src/components/DeleteEntityModal.tsx","../../../../src/components/delete-modals.tsx","../../../../src/components/RunLoadingOverlay.tsx","../../../../src/components/Modal.tsx","../../../../src/app/teams/%5BteamId%5D/deliverables/deliverables-client.tsx"],"sourcesContent":["module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactDOM\n","/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\n/** Shared confirmation modal shell: overlay, title, body, optional error, Cancel + Confirm buttons. */\nexport function ConfirmationModal({\n open,\n onClose,\n title,\n children,\n error,\n confirmLabel,\n confirmBusyLabel,\n onConfirm,\n confirmDisabled,\n busy,\n confirmButtonClassName,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n /** Optional error message to show above footer */\n error?: string | null;\n confirmLabel: string;\n confirmBusyLabel?: string;\n onConfirm: () => void;\n confirmDisabled?: boolean;\n busy?: boolean;\n /** Override confirm button styles (default: accent red) */\n confirmButtonClassName?: string;\n}) {\n if (!open) return null;\n\n const isDisabled = confirmDisabled ?? false;\n const isBusy = busy ?? false;\n const btnLabel = isBusy && confirmBusyLabel ? confirmBusyLabel : confirmLabel;\n const confirmClass =\n confirmButtonClassName ??\n \"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\";\n\n const titleId = \"confirmation-modal-title\";\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]\">\n <h2 id={titleId} className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">{title}</h2>\n {children}\n\n {error ? (\n <div className=\"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={isDisabled || isBusy}\n onClick={onConfirm}\n className={confirmClass}\n >\n {btnLabel}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"./ConfirmationModal\";\n\n/** Shared delete confirmation modal: title, entity label in code, body text. */\nexport function DeleteEntityModal({\n open,\n onClose,\n title,\n entityLabel,\n bodyText,\n onConfirm,\n busy,\n error,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n entityLabel: string;\n bodyText: string;\n onConfirm: () => void;\n busy?: boolean;\n error?: string | null;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title={title}\n confirmLabel=\"Delete\"\n confirmBusyLabel=\"Deletingโฆ\"\n onConfirm={onConfirm}\n busy={busy}\n error={error ?? undefined}\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n {title} <code className=\"font-mono\">{entityLabel}</code>? {bodyText}\n </p>\n </ConfirmationModal>\n );\n}\n","\"use client\";\n\nimport { DeleteEntityModal } from \"./DeleteEntityModal\";\n\ntype EntityLabelKey = \"agentId\" | \"teamId\" | \"recipeId\" | \"jobLabel\";\n\ntype BaseProps = {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n busy?: boolean;\n error?: string | null;\n};\n\nfunction createDeleteModal<K extends EntityLabelKey>(config: {\n title: string;\n bodyText: string;\n entityLabelKey: K;\n}) {\n return function DeleteModal(props: BaseProps & Record<K, string>) {\n const entityLabel = props[config.entityLabelKey];\n return (\n <DeleteEntityModal\n open={props.open}\n onClose={props.onClose}\n title={config.title}\n entityLabel={entityLabel}\n bodyText={config.bodyText}\n onConfirm={props.onConfirm}\n busy={props.busy}\n error={props.error}\n />\n );\n };\n}\n\nexport const DeleteAgentModal = createDeleteModal({\n title: \"Delete agent\",\n bodyText: \"This will remove its workspace/state.\",\n entityLabelKey: \"agentId\",\n});\n\nexport const DeleteTeamModal = createDeleteModal({\n title: \"Delete Team\",\n bodyText: \"This will remove the team workspace, agents, and stamped cron jobs.\",\n entityLabelKey: \"teamId\",\n});\n\nexport const DeleteRecipeModal = createDeleteModal({\n title: \"Delete recipe\",\n bodyText: \"This removes the markdown file from your workspace.\",\n entityLabelKey: \"recipeId\",\n});\n\nexport const DeleteCronJobModal = createDeleteModal({\n title: \"Delete cron job\",\n bodyText: \"This removes it from the Gateway scheduler. You can recreate it later.\",\n entityLabelKey: \"jobLabel\",\n});\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function RunLoadingOverlay({ open }: { open: boolean }) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n <div className=\"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none\" />\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-md rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-xl font-semibold text-[color:var(--ck-text-primary)]\">\n Gathering your ingredients..\n </div>\n\n <div className=\"mt-6 h-1.5 w-full overflow-hidden rounded-full bg-white/10\">\n <div className=\"h-full w-1/3 animate-[loading-bar_1.5s_ease-in-out_infinite] rounded-full bg-[var(--ck-accent-red)]\" />\n </div>\n </div>\n </div>\n\n <style>{`\n @keyframes loading-bar {\n 0% { transform: translateX(-100%); }\n 50% { transform: translateX(200%); }\n 100% { transform: translateX(-100%); }\n }\n `}</style>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function Modal({\n open,\n onClose,\n title,\n children,\n size = \"md\",\n hideTitle = false,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n hideTitle?: boolean;\n}) {\n if (!open) return null;\n\n const sizeClasses = {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-6xl\"\n };\n\n const titleId = \"modal-title\";\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className={`w-full ${sizeClasses[size]} rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-6 shadow-[var(--ck-shadow-2)]`}>\n {hideTitle ? <h2 id={titleId} className=\"sr-only\">{title}</h2> : <h2 id={titleId} className=\"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4\">{title}</h2>}\n {children}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}","\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport { useMemo, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\nimport type { WorkflowDeliverable } from \"@/app/api/teams/workflow-deliverables/route\";\nimport { isImageFile } from \"@/lib/media-file-utils\";\nimport { DeliverablePreviewPanel } from \"@/components/DeliverablePreviewPanel\";\n\nfunction deliverableFileUrl(teamId: string, d: WorkflowDeliverable): string {\n return `/api/teams/workflow-deliverables/file?teamId=${encodeURIComponent(teamId)}&runId=${encodeURIComponent(d.runId)}&path=${encodeURIComponent(d.relativePath)}`;\n}\n\nfunction formatBytes(bytes: number) {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + \" \" + sizes[i];\n}\n\nfunction formatDate(dateString: string) {\n try {\n return new Date(dateString).toLocaleString();\n } catch {\n return dateString;\n }\n}\n\nfunction getFileIcon(fileName: string) {\n const ext = fileName.toLowerCase().split(\".\").pop();\n switch (ext) {\n case \"md\":\n return \"๐\";\n case \"json\":\n return \"๐ง\";\n case \"txt\":\n return \"๐\";\n case \"html\":\n case \"htm\":\n return \"๐\";\n case \"css\":\n return \"๐จ\";\n case \"js\":\n case \"ts\":\n case \"tsx\":\n case \"jsx\":\n return \"โ๏ธ\";\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"webp\":\n return \"๐ผ๏ธ\";\n case \"pdf\":\n return \"๐\";\n case \"zip\":\n case \"tar\":\n case \"gz\":\n return \"๐ฆ\";\n default:\n return \"๐\";\n }\n}\n\nexport default function DeliverablesClient({\n teamId,\n deliverables,\n workflows,\n}: {\n teamId: string;\n deliverables: WorkflowDeliverable[];\n workflows: Record<string, { id: string; name?: string }>;\n}) {\n const router = useRouter();\n const [workflowFilter, setWorkflowFilter] = useState<string>(\"\");\n const [runFilter, setRunFilter] = useState<string>(\"\");\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const [selectedDeliverable, setSelectedDeliverable] = useState<WorkflowDeliverable | null>(null);\n\n const filteredDeliverables = useMemo(() => {\n const needle = searchQuery.trim().toLowerCase();\n return deliverables.filter((d) => {\n if (workflowFilter && d.workflowId !== workflowFilter) return false;\n if (runFilter && d.runId !== runFilter) return false;\n if (!needle) return true;\n \n const wfName = workflows[d.workflowId]?.name ?? \"\";\n return (\n d.fileName.toLowerCase().includes(needle) ||\n d.workflowId.toLowerCase().includes(needle) ||\n d.runId.toLowerCase().includes(needle) ||\n wfName.toLowerCase().includes(needle) ||\n (d.contentPreview && d.contentPreview.toLowerCase().includes(needle))\n );\n });\n }, [deliverables, searchQuery, workflowFilter, runFilter, workflows]);\n\n const workflowOptions = useMemo(() => {\n const ids = Array.from(new Set(deliverables.map((d) => d.workflowId).filter(Boolean))).sort();\n return ids;\n }, [deliverables]);\n\n const runOptions = useMemo(() => {\n const filtered = workflowFilter \n ? deliverables.filter(d => d.workflowId === workflowFilter)\n : deliverables;\n const ids = Array.from(new Set(filtered.map((d) => d.runId).filter(Boolean))).sort();\n return ids;\n }, [deliverables, workflowFilter]);\n\n const downloadDeliverable = async (deliverable: WorkflowDeliverable) => {\n try {\n if (deliverable.isText && deliverable.contentPreview) {\n await navigator.clipboard.writeText(deliverable.contentPreview);\n alert(\"Content copied to clipboard!\");\n } else {\n // Download binary files via the file API\n const url = deliverableFileUrl(teamId, deliverable);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = deliverable.fileName;\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n } catch {\n alert(\"Failed to download file\");\n }\n };\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"rounded-3xl border border-white/10 bg-black/10 p-4\">\n <div className=\"flex flex-wrap items-end justify-between gap-3\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">workflow</div>\n <select\n value={workflowFilter}\n onChange={(e) => {\n setWorkflowFilter(e.target.value || \"\");\n setRunFilter(\"\"); // Reset run filter when workflow changes\n }}\n className=\"mt-1 w-64 max-w-full rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">All workflows</option>\n {workflowOptions.map((id) => (\n <option key={id} value={id}>\n {workflows[id]?.name ? `${workflows[id]?.name} (${id})` : id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">run</div>\n <select\n value={runFilter}\n onChange={(e) => setRunFilter(e.target.value || \"\")}\n className=\"mt-1 w-56 max-w-full rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">All runs</option>\n {runOptions.map((id) => (\n <option key={id} value={id}>\n {id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">search</div>\n <input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"filename / content\"\n className=\"mt-1 w-72 max-w-full rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </label>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => router.refresh()}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Refresh\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n {/* Deliverables List */}\n <div className=\"lg:col-span-2 rounded-3xl border border-white/10 bg-black/10 p-4\">\n <h2 className=\"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4\">\n Workflow Deliverables\n </h2>\n\n {filteredDeliverables.length > 0 ? (\n <div className=\"space-y-2\">\n {filteredDeliverables.map((deliverable, idx) => {\n const isSelected = selectedDeliverable?.absolutePath === deliverable.absolutePath;\n const wfName = workflows[deliverable.workflowId]?.name || deliverable.workflowId;\n \n return (\n <div\n key={`${deliverable.runId}-${deliverable.relativePath}`}\n className={`cursor-pointer rounded-lg border p-3 transition-colors ${\n isSelected\n ? \"border-white/20 bg-white/10\"\n : \"border-white/5 bg-black/5 hover:bg-white/5\"\n }`}\n onClick={() => setSelectedDeliverable(deliverable)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n {isImageFile(deliverable.fileName) && (\n <div className=\"flex-shrink-0 w-12 h-12 rounded overflow-hidden bg-white/5 border border-white/10\">\n <Image\n src={deliverableFileUrl(teamId, deliverable)}\n alt={deliverable.fileName}\n width={48}\n height={48}\n className=\"w-full h-full object-cover\"\n unoptimized\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg\">{getFileIcon(deliverable.fileName)}</span>\n <span className=\"font-medium text-[color:var(--ck-text-primary)] truncate\">\n {deliverable.fileName}\n </span>\n {deliverable.isText && (\n <span className=\"text-xs bg-green-500/20 text-green-400 px-1.5 py-0.5 rounded\">\n TEXT\n </span>\n )}\n </div>\n \n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{wfName}</span>\n {\" ยท \"}\n <span className=\"font-mono\">{deliverable.runId}</span>\n </div>\n \n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n {deliverable.relativePath !== deliverable.fileName && (\n <span>{deliverable.relativePath} ยท </span>\n )}\n {formatBytes(deliverable.size)} ยท {formatDate(deliverable.mtime)}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n downloadDeliverable(deliverable);\n }}\n className=\"text-xs px-2 py-1 border border-white/10 rounded hover:bg-white/5 text-[color:var(--ck-text-secondary)]\"\n >\n {deliverable.isText ? \"Copy\" : \"Download\"}\n </button>\n <Link\n href={`/teams/${teamId}/runs/${deliverable.workflowId}/${deliverable.runId}`}\n onClick={(e) => e.stopPropagation()}\n className=\"text-xs px-2 py-1 border border-white/10 rounded hover:bg-white/5 text-[color:var(--ck-text-secondary)]\"\n >\n View Run โ\n </Link>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"text-center py-8 text-[color:var(--ck-text-secondary)]\">\n <div className=\"text-4xl mb-2\">๐</div>\n <div className=\"text-lg mb-1\">No deliverables found</div>\n <div className=\"text-sm\">\n Workflow runs will create deliverables that appear here when they complete.\n </div>\n </div>\n )}\n\n {filteredDeliverables.length > 0 && (\n <div className=\"mt-4 text-xs text-[color:var(--ck-text-tertiary)]\">\n Showing {filteredDeliverables.length} of {deliverables.length} deliverables.\n </div>\n )}\n </div>\n\n {/* Preview Panel */}\n <div className=\"lg:col-span-1 rounded-3xl border border-white/10 bg-black/10 p-4\">\n <h3 className=\"text-sm font-semibold text-[color:var(--ck-text-primary)] mb-3\">\n Preview\n </h3>\n\n {selectedDeliverable ? (\n <div>\n <div className=\"mb-3 pb-3 border-b border-white/10\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-lg\">{getFileIcon(selectedDeliverable.fileName)}</span>\n <span className=\"font-medium text-[color:var(--ck-text-primary)] text-sm break-all\">\n {selectedDeliverable.fileName}\n </span>\n </div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)] space-y-1\">\n <div>Size: {formatBytes(selectedDeliverable.size)}</div>\n <div>Modified: {formatDate(selectedDeliverable.mtime)}</div>\n <div>Path: {selectedDeliverable.relativePath}</div>\n </div>\n </div>\n\n <DeliverablePreviewPanel\n deliverable={selectedDeliverable}\n fileUrl={deliverableFileUrl(teamId, selectedDeliverable)}\n maxMediaHeight=\"500px\"\n onDownload={() => downloadDeliverable(selectedDeliverable)}\n />\n </div>\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)] italic\">\n Select a deliverable to preview\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}"],"names":["module","exports","require","vendored","ReactDOM"],"mappings":"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","ignoreList":[0]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module.exports=[35112,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactDOM},66063,a=>{"use strict";var b=a.i(87924),c=a.i(35112);function d({open:a,onClose:d,title:e,children:f,error:g,confirmLabel:h,confirmBusyLabel:i,onConfirm:j,confirmDisabled:k,busy:l,confirmButtonClassName:m}){if(!a)return null;let n=l??!1,o=n&&i?i:h,p="confirmation-modal-title";return(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:d,"aria-hidden":"true"}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":p,children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("h2",{id:p,className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:e}),f,g?(0,b.jsx)("div",{className:"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:g}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:d,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:(k??!1)||n,onClick:j,className:m??"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:o})]})]})})})]}),document.body)}a.s(["ConfirmationModal",()=>d])},86732,a=>{"use strict";var b=a.i(87924),c=a.i(35112);function d({open:a}){return a?(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none"}),(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-md rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-xl font-semibold text-[color:var(--ck-text-primary)]",children:"Gathering your ingredients.."}),(0,b.jsx)("div",{className:"mt-6 h-1.5 w-full overflow-hidden rounded-full bg-white/10",children:(0,b.jsx)("div",{className:"h-full w-1/3 animate-[loading-bar_1.5s_ease-in-out_infinite] rounded-full bg-[var(--ck-accent-red)]"})})]})}),(0,b.jsx)("style",{children:`
|
|
2
|
+
@keyframes loading-bar {
|
|
3
|
+
0% { transform: translateX(-100%); }
|
|
4
|
+
50% { transform: translateX(200%); }
|
|
5
|
+
100% { transform: translateX(-100%); }
|
|
6
|
+
}
|
|
7
|
+
`})]}),document.body):null}a.s(["RunLoadingOverlay",()=>d])}];
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=_15bc566e._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-dom.ts","../../../../src/components/ConfirmationModal.tsx","../../../../src/components/RunLoadingOverlay.tsx"],"sourcesContent":["module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactDOM\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\n/** Shared confirmation modal shell: overlay, title, body, optional error, Cancel + Confirm buttons. */\nexport function ConfirmationModal({\n open,\n onClose,\n title,\n children,\n error,\n confirmLabel,\n confirmBusyLabel,\n onConfirm,\n confirmDisabled,\n busy,\n confirmButtonClassName,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n /** Optional error message to show above footer */\n error?: string | null;\n confirmLabel: string;\n confirmBusyLabel?: string;\n onConfirm: () => void;\n confirmDisabled?: boolean;\n busy?: boolean;\n /** Override confirm button styles (default: accent red) */\n confirmButtonClassName?: string;\n}) {\n if (!open) return null;\n\n const isDisabled = confirmDisabled ?? false;\n const isBusy = busy ?? false;\n const btnLabel = isBusy && confirmBusyLabel ? confirmBusyLabel : confirmLabel;\n const confirmClass =\n confirmButtonClassName ??\n \"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\";\n\n const titleId = \"confirmation-modal-title\";\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]\">\n <h2 id={titleId} className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">{title}</h2>\n {children}\n\n {error ? (\n <div className=\"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={isDisabled || isBusy}\n onClick={onConfirm}\n className={confirmClass}\n >\n {btnLabel}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function RunLoadingOverlay({ open }: { open: boolean }) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n <div className=\"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none\" />\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-md rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-xl font-semibold text-[color:var(--ck-text-primary)]\">\n Gathering your ingredients..\n </div>\n\n <div className=\"mt-6 h-1.5 w-full overflow-hidden rounded-full bg-white/10\">\n <div className=\"h-full w-1/3 animate-[loading-bar_1.5s_ease-in-out_infinite] rounded-full bg-[var(--ck-accent-red)]\" />\n </div>\n </div>\n </div>\n\n <style>{`\n @keyframes loading-bar {\n 0% { transform: translateX(-100%); }\n 50% { transform: translateX(200%); }\n 100% { transform: translateX(-100%); }\n }\n `}</style>\n </div>,\n document.body,\n );\n}\n"],"names":["module","exports","require","vendored","ReactDOM"],"mappings":"6CAAAA,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRC,QAAQ,CAAC,YAAY,CAAEC,QAAQ,0CCAjC,EAAA,EAAA,CAAA,CAAA,OAGO,SAAS,EAAkB,MAChC,CAAI,CACJ,SAAO,OACP,CAAK,UACL,CAAQ,OACR,CAAK,cACL,CAAY,kBACZ,CAAgB,WAChB,CAAS,iBACT,CAAe,MACf,CAAI,wBACJ,CAAsB,CAevB,EACC,GAAI,CAAC,EAAM,OAAO,KAGlB,IAAM,EAAS,IAAQ,EACjB,EAAW,GAAU,EAAmB,EAAmB,EAK3D,EAAU,2BAChB,MAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EACjB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4BAA4B,QAAS,EAAS,cAAY,SACzE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCAAgC,KAAK,SAAS,aAAW,OAAO,kBAAiB,WAC9F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4HACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,GAAI,EAAS,UAAU,qEAA6D,IACvF,EAEA,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FACZ,IAED,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,UAAU,4IACX,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,CAjCL,IAAmB,CAAA,GAiCA,EACxB,QAAS,EACT,UA/BZ,CA+BuB,EA9BvB,iMAgCa,iBAOb,SAAS,IAAI,CAEjB,2EC9EA,EAAA,EAAA,CAAA,CAAA,OAEO,SAAS,EAAkB,MAAE,CAAI,CAAqB,SACtD,AAAL,EAEO,CAAA,CAFH,CAEG,CAFI,CAEJ,YAAA,AAAY,EACjB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEAEf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oIACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,iCAI3E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+GAKrB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,UAAO,CAAC;;;;;;MAMT,CAAC,MAEH,SAAS,IAAI,EA1BG,IA4BpB","ignoreList":[0]}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
module.exports=[35112,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactDOM},74621,a=>{"use strict";function b(a){return a instanceof Error?a.message:String(a)}a.s(["errorMessage",()=>b])},66063,a=>{"use strict";var b=a.i(87924),c=a.i(35112);function d({open:a,onClose:d,title:e,children:f,error:g,confirmLabel:h,confirmBusyLabel:i,onConfirm:j,confirmDisabled:k,busy:l,confirmButtonClassName:m}){if(!a)return null;let n=l??!1,o=n&&i?i:h,p="confirmation-modal-title";return(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:d,"aria-hidden":"true"}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":p,children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("h2",{id:p,className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:e}),f,g?(0,b.jsx)("div",{className:"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:g}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:d,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:(k??!1)||n,onClick:j,className:m??"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:o})]})]})})})]}),document.body)}a.s(["ConfirmationModal",()=>d])}]
|
|
1
|
+
module.exports=[35112,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactDOM},74621,a=>{"use strict";function b(a){return a instanceof Error?a.message:String(a)}a.s(["errorMessage",()=>b])},66063,a=>{"use strict";var b=a.i(87924),c=a.i(35112);function d({open:a,onClose:d,title:e,children:f,error:g,confirmLabel:h,confirmBusyLabel:i,onConfirm:j,confirmDisabled:k,busy:l,confirmButtonClassName:m}){if(!a)return null;let n=l??!1,o=n&&i?i:h,p="confirmation-modal-title";return(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:d,"aria-hidden":"true"}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":p,children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("h2",{id:p,className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:e}),f,g?(0,b.jsx)("div",{className:"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:g}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:d,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:(k??!1)||n,onClick:j,className:m??"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:o})]})]})})})]}),document.body)}a.s(["ConfirmationModal",()=>d])},86732,a=>{"use strict";var b=a.i(87924),c=a.i(35112);function d({open:a}){return a?(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none"}),(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-md rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-xl font-semibold text-[color:var(--ck-text-primary)]",children:"Gathering your ingredients.."}),(0,b.jsx)("div",{className:"mt-6 h-1.5 w-full overflow-hidden rounded-full bg-white/10",children:(0,b.jsx)("div",{className:"h-full w-1/3 animate-[loading-bar_1.5s_ease-in-out_infinite] rounded-full bg-[var(--ck-accent-red)]"})})]})}),(0,b.jsx)("style",{children:`
|
|
2
|
+
@keyframes loading-bar {
|
|
3
|
+
0% { transform: translateX(-100%); }
|
|
4
|
+
50% { transform: translateX(200%); }
|
|
5
|
+
100% { transform: translateX(-100%); }
|
|
6
|
+
}
|
|
7
|
+
`})]}),document.body):null}a.s(["RunLoadingOverlay",()=>d])}];
|
|
2
8
|
|
|
3
|
-
//# sourceMappingURL=
|
|
9
|
+
//# sourceMappingURL=_3d6d3f59._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-dom.ts","../../../../src/lib/errors.ts","../../../../src/components/ConfirmationModal.tsx","../../../../src/components/RunLoadingOverlay.tsx"],"sourcesContent":["module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactDOM\n","/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\n/** Shared confirmation modal shell: overlay, title, body, optional error, Cancel + Confirm buttons. */\nexport function ConfirmationModal({\n open,\n onClose,\n title,\n children,\n error,\n confirmLabel,\n confirmBusyLabel,\n onConfirm,\n confirmDisabled,\n busy,\n confirmButtonClassName,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n /** Optional error message to show above footer */\n error?: string | null;\n confirmLabel: string;\n confirmBusyLabel?: string;\n onConfirm: () => void;\n confirmDisabled?: boolean;\n busy?: boolean;\n /** Override confirm button styles (default: accent red) */\n confirmButtonClassName?: string;\n}) {\n if (!open) return null;\n\n const isDisabled = confirmDisabled ?? false;\n const isBusy = busy ?? false;\n const btnLabel = isBusy && confirmBusyLabel ? confirmBusyLabel : confirmLabel;\n const confirmClass =\n confirmButtonClassName ??\n \"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\";\n\n const titleId = \"confirmation-modal-title\";\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]\">\n <h2 id={titleId} className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">{title}</h2>\n {children}\n\n {error ? (\n <div className=\"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={isDisabled || isBusy}\n onClick={onConfirm}\n className={confirmClass}\n >\n {btnLabel}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function RunLoadingOverlay({ open }: { open: boolean }) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n <div className=\"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none\" />\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-md rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-xl font-semibold text-[color:var(--ck-text-primary)]\">\n Gathering your ingredients..\n </div>\n\n <div className=\"mt-6 h-1.5 w-full overflow-hidden rounded-full bg-white/10\">\n <div className=\"h-full w-1/3 animate-[loading-bar_1.5s_ease-in-out_infinite] rounded-full bg-[var(--ck-accent-red)]\" />\n </div>\n </div>\n </div>\n\n <style>{`\n @keyframes loading-bar {\n 0% { transform: translateX(-100%); }\n 50% { transform: translateX(200%); }\n 100% { transform: translateX(-100%); }\n }\n `}</style>\n </div>,\n document.body,\n );\n}\n"],"names":["module","exports","require","vendored","ReactDOM"],"mappings":"6CAAAA,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRC,QAAQ,CAAC,YAAY,CAAEC,QAAQ,yBCE1B,SAAS,EAAa,CAAU,EACrC,OAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EACjD,sECJA,EAAA,EAAA,CAAA,CAAA,OAGO,SAAS,EAAkB,MAChC,CAAI,SACJ,CAAO,OACP,CAAK,UACL,CAAQ,OACR,CAAK,cACL,CAAY,kBACZ,CAAgB,WAChB,CAAS,iBACT,CAAe,MACf,CAAI,wBACJ,CAAsB,CAevB,EACC,GAAI,CAAC,EAAM,OAAO,KAGlB,IAAM,EAAS,GAAQ,GACjB,EAAW,GAAU,EAAmB,EAAmB,EAK3D,EAAU,2BAChB,MAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EACjB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4BAA4B,QAAS,EAAS,cAAY,SACzE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCAAgC,KAAK,SAAS,aAAW,OAAO,kBAAiB,WAC9F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4HACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,GAAI,EAAS,UAAU,qEAA6D,IACvF,EAEA,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FACZ,IAED,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,UAAU,4IACX,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAjCK,AAiCK,KAjCc,CAAA,GAiCA,EACxB,QAAS,EACT,UA/BZ,CA+BuB,EA9BvB,iMAgCa,iBAOb,SAAS,IAAI,CAEjB,2EC9EA,EAAA,EAAA,CAAA,CAAA,OAEO,SAAS,EAAkB,MAAE,CAAI,CAAqB,SAC3D,AAAK,EAEE,CAAA,CAFH,CAEG,CAFI,CAEJ,YAAA,AAAY,EACjB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEAEf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oIACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,iCAI3E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+GAKrB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,UAAO,CAAC;;;;;;MAMT,CAAC,MAEH,SAAS,IAAI,EA1BG,IA4BpB","ignoreList":[0]}
|