@tutti-os/workspace-user-project 0.0.37 → 0.0.38

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.
@@ -56,8 +56,9 @@ async function prepareWorkspaceUserProjectSelection(api, input) {
56
56
  const response = await api.list();
57
57
  const projects = response.projects;
58
58
  const selectedPath = input.selectedPath?.trim() ?? "";
59
- const isSelectedPathMissing = input.projectLocked && selectedPath ? await checkWorkspaceUserProjectPathMissing(api, selectedPath) : false;
60
- if (!input.projectLocked && selectedPath && !projects.some((project) => project.path === selectedPath)) {
59
+ const isSelectedPathNoProject = selectedPath && api.isNoProjectPath?.({ path: selectedPath }) === true;
60
+ const isSelectedPathMissing = input.projectLocked && selectedPath && !isSelectedPathNoProject ? await checkWorkspaceUserProjectPathMissing(api, selectedPath) : false;
61
+ if (!input.projectLocked && selectedPath && !isSelectedPathNoProject && !projects.some((project) => project.path === selectedPath)) {
61
62
  await api.rememberDefaultSelection?.({ path: null });
62
63
  return {
63
64
  isSelectedPathMissing,
@@ -120,4 +121,4 @@ export {
120
121
  prepareWorkspaceUserProjectSelection,
121
122
  checkWorkspaceUserProjectPathMissing
122
123
  };
123
- //# sourceMappingURL=chunk-JKSIGLCI.js.map
124
+ //# sourceMappingURL=chunk-4VTT6WSG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectCreationErrorCode,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput\n} from \"../contracts/index.ts\";\n\nexport function upsertWorkspaceUserProject(\n projects: readonly WorkspaceUserProject[],\n project: WorkspaceUserProject\n): WorkspaceUserProject[] {\n const existingIndex = projects.findIndex(\n (item) => item.id === project.id || item.path === project.path\n );\n if (existingIndex < 0) {\n return [project, ...projects];\n }\n const next = [...projects];\n next[existingIndex] = project;\n return next;\n}\n\nexport function resolveWorkspaceUserProjectDisplayLabel(\n project: Pick<WorkspaceUserProject, \"id\" | \"label\" | \"path\">\n): string {\n const label = stripAbsolutePathFromWorkspaceUserProjectLabel(project.label);\n if (label) {\n return label;\n }\n return basenameWorkspaceUserProjectPath(project.path) || project.id;\n}\n\nexport function stripAbsolutePathFromWorkspaceUserProjectLabel(\n label: string\n): string {\n const trimmedLabel = label.trim();\n if (!trimmedLabel) {\n return \"\";\n }\n const pathStart = findAbsolutePathStart(trimmedLabel);\n if (pathStart < 0) {\n return trimmedLabel;\n }\n if (pathStart === 0) {\n return basenameWorkspaceUserProjectPath(trimmedLabel);\n }\n return trimmedLabel\n .slice(0, pathStart)\n .replace(/[\\s/\\\\|:()[\\]{}-]+$/u, \"\")\n .trim();\n}\n\nexport function basenameWorkspaceUserProjectPath(path: string): string {\n const normalizedPath = path.trim().replace(/[\\\\/]+$/u, \"\");\n if (!normalizedPath) {\n return \"\";\n }\n const segments = normalizedPath.split(/[\\\\/]+/u);\n return segments[segments.length - 1] ?? \"\";\n}\n\nexport function getWorkspaceUserProjectErrorCode(\n error: unknown\n): WorkspaceUserProjectCreationErrorCode | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const code = (error as { code?: unknown }).code;\n if (typeof code === \"string\") {\n return code;\n }\n\n return getWorkspaceUserProjectErrorCode((error as { cause?: unknown }).cause);\n}\n\nexport async function prepareWorkspaceUserProjectSelection(\n api: WorkspaceUserProjectApi,\n input: WorkspaceUserProjectSelectionPreparationInput\n): Promise<WorkspaceUserProjectSelectionPreparation> {\n if (api.prepareSelection) {\n return api.prepareSelection(input);\n }\n const response = await api.list();\n const projects = response.projects;\n const selectedPath = input.selectedPath?.trim() ?? \"\";\n const isSelectedPathNoProject =\n selectedPath && api.isNoProjectPath?.({ path: selectedPath }) === true;\n const isSelectedPathMissing =\n input.projectLocked && selectedPath && !isSelectedPathNoProject\n ? await checkWorkspaceUserProjectPathMissing(api, selectedPath)\n : false;\n\n if (\n !input.projectLocked &&\n selectedPath &&\n !isSelectedPathNoProject &&\n !projects.some((project) => project.path === selectedPath)\n ) {\n await api.rememberDefaultSelection?.({ path: null });\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"clear\",\n suppressedPath: selectedPath\n }\n };\n }\n\n if (input.projectLocked || selectedPath) {\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n }\n\n const defaultSelection = await api.getDefaultSelection?.();\n const defaultPath = defaultSelection?.path?.trim() ?? \"\";\n if (defaultPath && projects.some((project) => project.path === defaultPath)) {\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"select\",\n path: defaultPath\n }\n };\n }\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n}\n\nexport async function checkWorkspaceUserProjectPathMissing(\n api: Pick<WorkspaceUserProjectApi, \"checkPath\">,\n path: string\n): Promise<boolean> {\n try {\n const result = await api.checkPath?.({ path });\n return result ? !result.exists || !result.isDirectory : false;\n } catch {\n return false;\n }\n}\n\nfunction findAbsolutePathStart(value: string): number {\n const indexes = [\n value.search(/\\/[^\\s/]/u),\n value.search(/[A-Za-z]:[\\\\/]/u),\n value.search(/\\\\\\\\[^\\s\\\\]/u),\n value.search(/~[\\\\/]/u)\n ].filter((index) => index >= 0);\n return indexes.length > 0 ? Math.min(...indexes) : -1;\n}\n"],"mappings":"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","names":[]}
@@ -6,7 +6,7 @@ import {
6
6
  resolveWorkspaceUserProjectDisplayLabel,
7
7
  stripAbsolutePathFromWorkspaceUserProjectLabel,
8
8
  upsertWorkspaceUserProject
9
- } from "../chunk-JKSIGLCI.js";
9
+ } from "../chunk-4VTT6WSG.js";
10
10
  export {
11
11
  basenameWorkspaceUserProjectPath,
12
12
  checkWorkspaceUserProjectPathMissing,
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  resolveWorkspaceUserProjectDisplayLabel,
7
7
  stripAbsolutePathFromWorkspaceUserProjectLabel,
8
8
  upsertWorkspaceUserProject
9
- } from "./chunk-JKSIGLCI.js";
9
+ } from "./chunk-4VTT6WSG.js";
10
10
  import {
11
11
  createDefaultWorkspaceUserProjectI18nRuntime,
12
12
  createWorkspaceUserProjectI18nRuntime,
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { WorkspaceUserProjectApi, WorkspaceUserProjectService } from '../contracts/index.js';
2
+ import { WorkspaceUserProjectApi, WorkspaceUserProject, WorkspaceUserProjectService } from '../contracts/index.js';
3
3
  import { WorkspaceUserProjectI18nRuntime } from '../i18n/index.js';
4
4
  import '@tutti-os/ui-i18n-runtime';
5
5
 
@@ -43,6 +43,7 @@ interface WorkspaceUserProjectSelectProps {
43
43
  onProjectMissingChange?: (isMissing: boolean) => void;
44
44
  onProjectPathChange: (path: string | null, metadata?: {
45
45
  action: WorkspaceUserProjectSelectChangeAction;
46
+ project?: WorkspaceUserProject;
46
47
  }) => void;
47
48
  projectLocked?: boolean;
48
49
  renderAddProjectIcon?: () => ReactNode;
package/dist/ui/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  prepareWorkspaceUserProjectSelection,
5
5
  resolveWorkspaceUserProjectDisplayLabel,
6
6
  upsertWorkspaceUserProject
7
- } from "../chunk-JKSIGLCI.js";
7
+ } from "../chunk-4VTT6WSG.js";
8
8
  import {
9
9
  createDefaultWorkspaceUserProjectI18nRuntime
10
10
  } from "../chunk-LSYV5EMT.js";
@@ -156,6 +156,8 @@ function WorkspaceUserProjectSelect({
156
156
  () => resolveWorkspaceUserProjectSelectLabels(i18n, labels),
157
157
  [i18n, labels]
158
158
  );
159
+ const createProjectNameDescription = resolvedLabels.createProjectNameLabel.trim();
160
+ const createProjectNameInputLabel = createProjectNameDescription || resolvedLabels.createProjectNamePlaceholder.trim();
159
161
  const [apiProjects, setApiProjects] = useState([]);
160
162
  const [isApiLoading, setIsApiLoading] = useState(false);
161
163
  const [isApiUnavailable, setIsApiUnavailable] = useState(!effectiveApi);
@@ -176,7 +178,7 @@ function WorkspaceUserProjectSelect({
176
178
  const selectedPathLabel = basenameWorkspaceUserProjectPath(selectedPath) || selectedPath;
177
179
  const selectedProject = showKnownProjectOptions ? projects.find((project) => project.path === selectedPath) ?? null : null;
178
180
  const selectedProjectLabel = selectedProject ? resolveWorkspaceUserProjectDisplayLabel(selectedProject) : "";
179
- const isSelectedNoProjectPath = projectLocked && Boolean(selectedPath) && Boolean(effectiveApi?.isNoProjectPath?.({ path: selectedPath }));
181
+ const isSelectedNoProjectPath = Boolean(selectedPath) && Boolean(effectiveApi?.isNoProjectPath?.({ path: selectedPath }));
180
182
  const shouldShowMissingProjectNotice = isSelectedPathMissing;
181
183
  const shouldShowLockedProjectPath = projectLocked && selectedPath !== "" && !isSelectedNoProjectPath && !selectedProject && !isSelectedPathMissing;
182
184
  const selectValue = selectedProject ? selectedProject.path : noProjectOptionValue;
@@ -299,7 +301,7 @@ function WorkspaceUserProjectSelect({
299
301
  (current) => upsertWorkspaceUserProject(current, project)
300
302
  );
301
303
  setHasPinnedNoProjectSelection(false);
302
- onProjectPathChange(project.path, { action });
304
+ onProjectPathChange(project.path, { action, project });
303
305
  refreshPreparedSelection();
304
306
  } catch {
305
307
  setApiUnavailableUnlessService(setIsApiUnavailable, service);
@@ -324,7 +326,7 @@ function WorkspaceUserProjectSelect({
324
326
  const project = await effectiveApi.create({ name });
325
327
  setApiProjects((current) => upsertWorkspaceUserProject(current, project));
326
328
  setHasPinnedNoProjectSelection(false);
327
- onProjectPathChange(project.path, { action: "create_new" });
329
+ onProjectPathChange(project.path, { action: "create_new", project });
328
330
  setDraftProjectName("");
329
331
  setIsProjectDialogOpen(false);
330
332
  refreshPreparedSelection();
@@ -530,10 +532,10 @@ function WorkspaceUserProjectSelect({
530
532
  children: /* @__PURE__ */ jsxs("form", { className: "grid gap-4", onSubmit: submitProjectDialog, children: [
531
533
  /* @__PURE__ */ jsxs(DialogHeader, { children: [
532
534
  /* @__PURE__ */ jsx(DialogTitle, { children: resolvedLabels.createProjectTitle }),
533
- /* @__PURE__ */ jsx(DialogDescription, { children: resolvedLabels.createProjectNameLabel })
535
+ createProjectNameDescription ? /* @__PURE__ */ jsx(DialogDescription, { children: createProjectNameDescription }) : null
534
536
  ] }),
535
537
  /* @__PURE__ */ jsxs("label", { className: "grid gap-1.5", children: [
536
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: resolvedLabels.createProjectNameLabel }),
538
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: createProjectNameInputLabel }),
537
539
  /* @__PURE__ */ jsx(
538
540
  Input,
539
541
  {
@@ -669,7 +671,7 @@ function createWorkspaceUserProjectApiAdapter(api, service) {
669
671
  const apiUse = hasWorkspaceUserProjectMethod(api, "use") ? (input) => api.use(input) : void 0;
670
672
  return {
671
673
  checkPath: hasWorkspaceUserProjectMethod(service, "checkProjectPath") ? ({ path }) => service.checkProjectPath(path) : apiCheckPath,
672
- create: hasWorkspaceUserProjectMethod(service, "createProject") ? ({ name }) => service.createProject(name) : apiCreate,
674
+ create: apiCreate ?? (hasWorkspaceUserProjectMethod(service, "createProject") ? ({ name }) => service.createProject(name) : void 0),
673
675
  getDefaultSelection: hasWorkspaceUserProjectMethod(
674
676
  service,
675
677
  "getDefaultSelection"
@@ -684,7 +686,7 @@ function createWorkspaceUserProjectApiAdapter(api, service) {
684
686
  service,
685
687
  "rememberDefaultSelection"
686
688
  ) ? ({ path }) => service.rememberDefaultSelection({ path }) : apiRememberDefaultSelection,
687
- selectDirectory: hasWorkspaceUserProjectMethod(service, "selectDirectory") ? () => service.selectDirectory() : apiSelectDirectory,
689
+ selectDirectory: apiSelectDirectory ?? (hasWorkspaceUserProjectMethod(service, "selectDirectory") ? () => service.selectDirectory() : void 0),
688
690
  use: hasWorkspaceUserProjectMethod(service, "registerProjectPath") ? ({ path }) => service.registerProjectPath(path) : apiUse
689
691
  };
690
692
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/internal/project/WorkspaceUserProjectSelect.tsx"],"sourcesContent":["import {\n type FormEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport { proxy } from \"valtio/vanilla\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FolderIcon,\n Input,\n LinkIcon,\n NewWorkspaceLinedIcon,\n NoWorkspaceLinedIcon,\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput,\n WorkspaceUserProjectService\n} from \"../../../contracts/index.ts\";\nimport {\n basenameWorkspaceUserProjectPath,\n getWorkspaceUserProjectErrorCode,\n prepareWorkspaceUserProjectSelection,\n resolveWorkspaceUserProjectDisplayLabel,\n upsertWorkspaceUserProject\n} from \"../../../core/index.ts\";\nimport {\n createDefaultWorkspaceUserProjectI18nRuntime,\n type WorkspaceUserProjectI18nRuntime\n} from \"../../../i18n/index.ts\";\n\nexport type WorkspaceUserProjectSelectLabels = {\n addProject: string;\n createProjectCancel: string;\n createProjectConfirm: string;\n createProjectDocumentsUnavailable: string;\n createProjectFailed: string;\n createProjectNameConflict: string;\n createProjectNameInvalid: string;\n createProjectNameLabel: string;\n createProjectNamePlaceholder: string;\n createProjectNameRequired: string;\n createProjectPermissionDenied: string;\n createProjectTitle: string;\n linkExistingProject: string;\n loadingProjects: string;\n noProject: string;\n projectLabel: string;\n projectLocked: string;\n projectMissingTitle: string;\n projectUnavailable: string;\n};\n\nexport type WorkspaceUserProjectSelectLabelOverrides =\n Partial<WorkspaceUserProjectSelectLabels>;\n\nexport interface WorkspaceUserProjectSelectClassNames {\n content?: string;\n item?: string;\n trigger?: string;\n}\n\nexport type WorkspaceUserProjectSelectChangeAction =\n | \"clear\"\n | \"create_new\"\n | \"select_existing\";\n\nexport interface WorkspaceUserProjectSelectProps {\n api?: WorkspaceUserProjectApi | null;\n classNames?: WorkspaceUserProjectSelectClassNames;\n contentAlign?: \"center\" | \"end\" | \"start\";\n contentSide?: \"bottom\" | \"left\" | \"right\" | \"top\";\n contentSideOffset?: number;\n disabled?: boolean;\n i18n?: WorkspaceUserProjectI18nRuntime;\n labels?: WorkspaceUserProjectSelectLabelOverrides;\n onProjectMissingChange?: (isMissing: boolean) => void;\n onProjectPathChange: (\n path: string | null,\n metadata?: { action: WorkspaceUserProjectSelectChangeAction }\n ) => void;\n projectLocked?: boolean;\n renderAddProjectIcon?: () => ReactNode;\n shouldApplyPreparedSelection?: boolean;\n showKnownProjectOptions?: boolean;\n service?: WorkspaceUserProjectService | null;\n selectedProjectPath?: string | null;\n showCreateProjectAction?: boolean;\n showNoProjectAction?: boolean;\n unlistedProjectLabel?: string;\n}\n\nconst noProjectOptionValue = \"__tutti_no_project__\";\nconst addProjectOptionValue = \"__tutti_add_project__\";\nconst linkExistingProjectOptionValue = \"__tutti_link_existing_project__\";\nconst workspaceUserProjectOverflowLabelStyle = `\n@keyframes workspace-user-project-label-marquee {\n 0% {\n transform: translateX(0);\n }\n\n 44%,\n 56% {\n transform: translateX(var(--workspace-user-project-label-marquee-distance, 0px));\n }\n\n 88%,\n 100% {\n transform: translateX(0);\n }\n}\n\n.workspace-user-project-overflow-label {\n --workspace-user-project-label-marquee-distance: 0px;\n container-type: normal;\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.workspace-user-project-trigger-label {\n align-items: center;\n display: flex;\n flex: 1 1 auto;\n gap: 0.5rem;\n min-width: 0;\n}\n\n.workspace-user-project-overflow-label__content {\n display: block;\n max-width: 100%;\n min-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n transform: translateX(0);\n white-space: nowrap;\n width: max-content;\n}\n\n.workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n[data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: workspace-user-project-label-marquee 14s linear infinite;\n max-width: none;\n overflow: visible;\n text-overflow: clip;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n [data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: none;\n }\n}\n`;\nconst defaultWorkspaceUserProjectSelectI18n =\n createDefaultWorkspaceUserProjectI18nRuntime();\nconst emptyWorkspaceUserProjectServiceSnapshot = proxy({\n error: null,\n initialized: false,\n isLoading: false,\n projects: [],\n revision: 0\n});\n\nexport function WorkspaceUserProjectSelect({\n api,\n classNames,\n contentAlign = \"start\",\n contentSide = \"top\",\n contentSideOffset = 4,\n disabled: disabledProp = false,\n i18n = defaultWorkspaceUserProjectSelectI18n,\n labels,\n onProjectMissingChange,\n onProjectPathChange,\n projectLocked = false,\n renderAddProjectIcon,\n shouldApplyPreparedSelection = true,\n showKnownProjectOptions = true,\n service,\n selectedProjectPath,\n showCreateProjectAction = hasWorkspaceUserProjectMethod(\n service,\n \"createProject\"\n ) || hasWorkspaceUserProjectMethod(api, \"create\"),\n showNoProjectAction = true,\n unlistedProjectLabel\n}: WorkspaceUserProjectSelectProps): React.JSX.Element {\n \"use memo\";\n const serviceSnapshot = useSnapshot(\n service?.store ?? emptyWorkspaceUserProjectServiceSnapshot\n );\n const effectiveApi = useMemo(\n () => createWorkspaceUserProjectApiAdapter(api, service),\n [api, service]\n );\n const resolvedLabels = useMemo(\n () => resolveWorkspaceUserProjectSelectLabels(i18n, labels),\n [i18n, labels]\n );\n const [apiProjects, setApiProjects] = useState<WorkspaceUserProject[]>([]);\n const [isApiLoading, setIsApiLoading] = useState(false);\n const [isApiUnavailable, setIsApiUnavailable] = useState(!effectiveApi);\n const [isProjectDialogOpen, setIsProjectDialogOpen] = useState(false);\n const [isSelectOpen, setIsSelectOpen] = useState(false);\n const [draftProjectName, setDraftProjectName] = useState(\"\");\n const [projectCreationError, setProjectCreationError] = useState<\n string | null\n >(null);\n const [isCreatingProject, setIsCreatingProject] = useState(false);\n const [suppressedSelectedPath, setSuppressedSelectedPath] = useState<\n string | null\n >(null);\n const [hasPinnedNoProjectSelection, setHasPinnedNoProjectSelection] =\n useState(false);\n const [isSelectedPathMissing, setIsSelectedPathMissing] = useState(false);\n const rawSelectedPath = selectedProjectPath?.trim() ?? \"\";\n const selectedPath =\n rawSelectedPath && rawSelectedPath === suppressedSelectedPath\n ? \"\"\n : rawSelectedPath;\n const projects = service ? [...serviceSnapshot.projects] : apiProjects;\n const visibleProjects = showKnownProjectOptions ? projects : [];\n const isLoading = service\n ? serviceSnapshot.isLoading && !serviceSnapshot.initialized\n : isApiLoading;\n const isUnavailable = service\n ? Boolean(serviceSnapshot.error) && !serviceSnapshot.initialized\n : isApiUnavailable;\n const selectedPathLabel =\n basenameWorkspaceUserProjectPath(selectedPath) || selectedPath;\n const selectedProject = showKnownProjectOptions\n ? (projects.find((project) => project.path === selectedPath) ?? null)\n : null;\n const selectedProjectLabel = selectedProject\n ? resolveWorkspaceUserProjectDisplayLabel(selectedProject)\n : \"\";\n const isSelectedNoProjectPath =\n projectLocked &&\n Boolean(selectedPath) &&\n Boolean(effectiveApi?.isNoProjectPath?.({ path: selectedPath }));\n const shouldShowMissingProjectNotice = isSelectedPathMissing;\n const shouldShowLockedProjectPath =\n projectLocked &&\n selectedPath !== \"\" &&\n !isSelectedNoProjectPath &&\n !selectedProject &&\n !isSelectedPathMissing;\n const selectValue = selectedProject\n ? selectedProject.path\n : noProjectOptionValue;\n const triggerLabel = shouldShowMissingProjectNotice\n ? resolvedLabels.projectMissingTitle\n : isSelectedNoProjectPath\n ? resolvedLabels.noProject\n : shouldShowLockedProjectPath\n ? selectedPathLabel\n : selectedProject\n ? selectedProjectLabel\n : selectedPath\n ? unlistedProjectLabel || selectedPathLabel\n : isLoading\n ? resolvedLabels.loadingProjects\n : resolvedLabels.noProject;\n const shouldDisableWhileLoading =\n showKnownProjectOptions || shouldApplyPreparedSelection;\n const disabled =\n disabledProp ||\n projectLocked ||\n (shouldDisableWhileLoading && isLoading) ||\n !effectiveApi;\n const hasProjectActions =\n Boolean(effectiveApi?.selectDirectory) ||\n showCreateProjectAction ||\n showNoProjectAction;\n const showProjectActionDivider =\n visibleProjects.length > 0 && hasProjectActions;\n\n useEffect(() => {\n if (!disabled || !isSelectOpen) {\n return;\n }\n setIsSelectOpen(false);\n }, [disabled, isSelectOpen]);\n\n useEffect(() => {\n onProjectMissingChange?.(shouldShowMissingProjectNotice);\n }, [onProjectMissingChange, shouldShowMissingProjectNotice]);\n\n useEffect(() => {\n if (rawSelectedPath) {\n setHasPinnedNoProjectSelection(false);\n }\n if (\n suppressedSelectedPath &&\n (!rawSelectedPath || rawSelectedPath !== suppressedSelectedPath)\n ) {\n setSuppressedSelectedPath(null);\n }\n }, [rawSelectedPath, suppressedSelectedPath]);\n\n const applyPreparedSelection = useEffectEvent(\n (prepared: WorkspaceUserProjectSelectionPreparation): void => {\n if (!service) {\n setApiProjects(prepared.projects);\n }\n setIsSelectedPathMissing(prepared.isSelectedPathMissing);\n if (!shouldApplyPreparedSelection) {\n return;\n }\n if (prepared.selection.kind === \"clear\") {\n setHasPinnedNoProjectSelection(true);\n setSuppressedSelectedPath(prepared.selection.suppressedPath);\n onProjectPathChange(null);\n return;\n }\n if (prepared.selection.kind === \"select\") {\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(prepared.selection.path);\n }\n }\n );\n\n useEffect(() => {\n let canceled = false;\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (hasPinnedNoProjectSelection) {\n return;\n }\n setIsApiLoading(true);\n setApiUnavailableUnlessService(setIsApiUnavailable, service, false);\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input)\n .then((prepared) => {\n if (!canceled) {\n applyPreparedSelection(prepared);\n }\n })\n .catch(() => {\n if (!canceled) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n })\n .finally(() => {\n if (!canceled) {\n setIsApiLoading(false);\n }\n });\n return () => {\n canceled = true;\n };\n }, [\n effectiveApi,\n hasPinnedNoProjectSelection,\n projectLocked,\n selectedPath,\n serviceSnapshot.revision,\n service\n ]);\n\n const refreshPreparedSelection = useCallback((): void => {\n if (!effectiveApi) {\n return;\n }\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input).then(\n applyPreparedSelection,\n () => {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n );\n }, [\n effectiveApi,\n projectLocked,\n selectedPath,\n service,\n shouldApplyPreparedSelection\n ]);\n\n const useProjectPath = useCallback(\n async (\n path: string,\n action: WorkspaceUserProjectSelectChangeAction\n ): Promise<void> => {\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n try {\n const project =\n (await effectiveApi.use?.({ path })) ??\n ({\n id: path,\n label: path,\n path\n } satisfies WorkspaceUserProject);\n setApiProjects((current) =>\n upsertWorkspaceUserProject(current, project)\n );\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action });\n refreshPreparedSelection();\n } catch {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n },\n [effectiveApi, onProjectPathChange, refreshPreparedSelection, service]\n );\n\n const createProject = useCallback(async (): Promise<void> => {\n const name = draftProjectName.trim();\n if (!effectiveApi?.create) {\n setProjectCreationError(resolvedLabels.createProjectFailed);\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (!name) {\n setProjectCreationError(resolvedLabels.createProjectNameRequired);\n return;\n }\n setIsCreatingProject(true);\n setProjectCreationError(null);\n try {\n const project = await effectiveApi.create({ name });\n setApiProjects((current) => upsertWorkspaceUserProject(current, project));\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action: \"create_new\" });\n setDraftProjectName(\"\");\n setIsProjectDialogOpen(false);\n refreshPreparedSelection();\n } catch (error) {\n setProjectCreationError(\n resolveProjectCreationErrorLabel(error, resolvedLabels)\n );\n } finally {\n setIsCreatingProject(false);\n }\n }, [\n effectiveApi,\n draftProjectName,\n onProjectPathChange,\n refreshPreparedSelection,\n resolvedLabels,\n service\n ]);\n\n const submitProjectDialog = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void createProject();\n };\n\n const closeProjectDialog = (): void => {\n setIsProjectDialogOpen(false);\n setProjectCreationError(null);\n };\n\n const handleProjectValueChange = (nextValue: string): void => {\n if (!effectiveApi || projectLocked) {\n return;\n }\n if (nextValue === noProjectOptionValue) {\n void effectiveApi.rememberDefaultSelection?.({ path: null });\n setHasPinnedNoProjectSelection(true);\n onProjectPathChange(null, { action: \"clear\" });\n return;\n }\n if (nextValue === addProjectOptionValue) {\n setDraftProjectName(\"\");\n setProjectCreationError(null);\n setIsProjectDialogOpen(true);\n return;\n }\n if (nextValue === linkExistingProjectOptionValue) {\n void Promise.resolve(effectiveApi.selectDirectory?.())\n .then((selection) => {\n const path = selection?.path?.trim() ?? \"\";\n if (!path) {\n return;\n }\n void useProjectPath(path, \"select_existing\");\n })\n .catch(() => {});\n return;\n }\n const knownProject = projects.find((project) => project.path === nextValue);\n if (knownProject) {\n void effectiveApi.rememberDefaultSelection?.({ path: knownProject.path });\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(knownProject.path, { action: \"select_existing\" });\n return;\n }\n void useProjectPath(nextValue, \"select_existing\");\n };\n\n return (\n <>\n <style>{workspaceUserProjectOverflowLabelStyle}</style>\n <Select\n disabled={disabled}\n open={isSelectOpen}\n value={selectValue}\n onOpenChange={setIsSelectOpen}\n onValueChange={handleProjectValueChange}\n >\n <SelectTrigger\n aria-label={\n projectLocked\n ? resolvedLabels.projectLocked\n : isUnavailable\n ? resolvedLabels.projectUnavailable\n : resolvedLabels.projectLabel\n }\n className={classNames?.trigger}\n >\n <span\n className=\"workspace-user-project-trigger-label\"\n data-workspace-user-project-trigger-label=\"true\"\n >\n {selectedProject || shouldShowLockedProjectPath ? (\n <FolderIcon aria-hidden className=\"shrink-0\" size={15} />\n ) : (\n <NoWorkspaceLinedIcon\n aria-hidden\n className=\"shrink-0\"\n data-agent-project-trigger-no-workspace-icon=\"true\"\n size={15}\n />\n )}\n <WorkspaceUserProjectOverflowLabel label={triggerLabel} />\n </span>\n </SelectTrigger>\n {isSelectOpen ? (\n <SelectContent\n align={contentAlign}\n className={classNames?.content}\n collisionPadding={16}\n side={contentSide}\n sideOffset={contentSideOffset}\n >\n {visibleProjects.map((project) => {\n const projectLabel =\n resolveWorkspaceUserProjectDisplayLabel(project);\n return (\n <SelectItem\n className={classNames?.item}\n key={project.id || project.path}\n value={project.path}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <FolderIcon aria-hidden size={15} />\n <WorkspaceUserProjectOverflowLabel label={projectLabel} />\n </span>\n </SelectItem>\n );\n })}\n {showProjectActionDivider ? (\n <SelectSeparator\n className=\"mx-[12px] my-1 shrink-0 bg-[var(--line-2)]\"\n data-workspace-user-project-action-separator=\"true\"\n />\n ) : null}\n {hasProjectActions ? (\n <SelectGroup\n className=\"gap-0.5 p-0\"\n data-workspace-user-project-action-group=\"true\"\n >\n {effectiveApi?.selectDirectory ? (\n <SelectItem\n className={classNames?.item}\n value={linkExistingProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <LinkIcon aria-hidden size={15} />\n <span className=\"truncate\">\n {resolvedLabels.linkExistingProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showCreateProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={addProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n {renderAddProjectIcon?.() ?? (\n <NewWorkspaceLinedIcon\n aria-hidden\n data-workspace-user-project-add-icon=\"true\"\n size={15}\n />\n )}\n <span className=\"truncate\">\n {resolvedLabels.addProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showNoProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={noProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <NoWorkspaceLinedIcon\n aria-hidden\n data-agent-project-no-workspace-icon=\"true\"\n size={15}\n />\n <span className=\"truncate\">\n {resolvedLabels.noProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n </SelectGroup>\n ) : null}\n </SelectContent>\n ) : null}\n </Select>\n {isProjectDialogOpen ? (\n <Dialog\n open\n onOpenChange={(nextOpen) => !nextOpen && closeProjectDialog()}\n >\n <DialogContent\n className=\"w-[480px] max-w-[calc(100vw-32px)] sm:max-w-[480px]\"\n showCloseButton={false}\n >\n <form className=\"grid gap-4\" onSubmit={submitProjectDialog}>\n <DialogHeader>\n <DialogTitle>{resolvedLabels.createProjectTitle}</DialogTitle>\n <DialogDescription>\n {resolvedLabels.createProjectNameLabel}\n </DialogDescription>\n </DialogHeader>\n <label className=\"grid gap-1.5\">\n <span className=\"sr-only\">\n {resolvedLabels.createProjectNameLabel}\n </span>\n <Input\n autoFocus\n className=\"h-10\"\n disabled={isCreatingProject}\n placeholder={resolvedLabels.createProjectNamePlaceholder}\n value={draftProjectName}\n onChange={(event) => {\n setDraftProjectName(event.target.value);\n if (projectCreationError) {\n setProjectCreationError(null);\n }\n }}\n />\n </label>\n {projectCreationError ? (\n <p className=\"text-[13px] text-[var(--state-danger)]\">\n {projectCreationError}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n disabled={isCreatingProject}\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={closeProjectDialog}\n onPointerDown={(event) => {\n if (event.button === 0 && !isCreatingProject) {\n closeProjectDialog();\n }\n }}\n >\n {resolvedLabels.createProjectCancel}\n </Button>\n <Button\n disabled={isCreatingProject || !draftProjectName.trim()}\n size=\"dialog\"\n type=\"submit\"\n >\n {resolvedLabels.createProjectConfirm}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n ) : null}\n </>\n );\n}\n\nfunction WorkspaceUserProjectOverflowLabel({\n className,\n label\n}: {\n className?: string;\n label: string;\n}): React.JSX.Element {\n const rootRef = useRef<HTMLSpanElement | null>(null);\n const contentRef = useRef<HTMLSpanElement | null>(null);\n const updateMarqueeDistance = useCallback(() => {\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content) {\n return;\n }\n const overflowDistance = content.scrollWidth - root.clientWidth;\n if (overflowDistance <= 1) {\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n \"0px\"\n );\n root.removeAttribute(\"data-overflow\");\n return;\n }\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n `${-overflowDistance}px`\n );\n root.setAttribute(\"data-overflow\", \"true\");\n }, []);\n\n useEffect(() => {\n updateMarqueeDistance();\n\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content || typeof globalThis.ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new globalThis.ResizeObserver(updateMarqueeDistance);\n observer.observe(root);\n observer.observe(content);\n return () => observer.disconnect();\n }, [label, updateMarqueeDistance]);\n\n return (\n <span\n ref={rootRef}\n className={cn(\"workspace-user-project-overflow-label\", className)}\n data-workspace-user-project-overflow-label=\"true\"\n onFocus={updateMarqueeDistance}\n onPointerEnter={updateMarqueeDistance}\n >\n <span\n ref={contentRef}\n className=\"workspace-user-project-overflow-label__content\"\n >\n {label}\n </span>\n </span>\n );\n}\n\nfunction createWorkspaceUserProjectApiAdapter(\n api: WorkspaceUserProjectApi | null | undefined,\n service: WorkspaceUserProjectService | null | undefined\n): WorkspaceUserProjectApi | null {\n if (!service) {\n return api ?? null;\n }\n const apiCheckPath = hasWorkspaceUserProjectMethod(api, \"checkPath\")\n ? (input: { path: string }) => api!.checkPath!(input)\n : undefined;\n const apiCreate = hasWorkspaceUserProjectMethod(api, \"create\")\n ? (input: { name: string }) => api!.create!(input)\n : undefined;\n const apiGetDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"getDefaultSelection\"\n )\n ? () => api!.getDefaultSelection!()\n : undefined;\n const apiIsNoProjectPath = hasWorkspaceUserProjectMethod(\n api,\n \"isNoProjectPath\"\n )\n ? (input: { path: string }) => api!.isNoProjectPath!(input)\n : undefined;\n const apiRememberDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"rememberDefaultSelection\"\n )\n ? (input: { path: string | null }) => api!.rememberDefaultSelection!(input)\n : undefined;\n const apiSelectDirectory = hasWorkspaceUserProjectMethod(\n api,\n \"selectDirectory\"\n )\n ? () => api!.selectDirectory!()\n : undefined;\n const apiUse = hasWorkspaceUserProjectMethod(api, \"use\")\n ? (input: { path: string }) => api!.use!(input)\n : undefined;\n return {\n checkPath: hasWorkspaceUserProjectMethod(service, \"checkProjectPath\")\n ? ({ path }) => service.checkProjectPath!(path)\n : apiCheckPath,\n create: hasWorkspaceUserProjectMethod(service, \"createProject\")\n ? ({ name }) => service.createProject!(name)\n : apiCreate,\n getDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"getDefaultSelection\"\n )\n ? () => service.getDefaultSelection!()\n : apiGetDefaultSelection,\n isNoProjectPath: hasWorkspaceUserProjectMethod(service, \"isNoProjectPath\")\n ? ({ path }) => service.isNoProjectPath!(path)\n : apiIsNoProjectPath,\n list: async () => {\n await (service.ensureLoaded?.() ?? service.refresh());\n return { projects: [...service.store.projects] };\n },\n prepareSelection: (input) => service.prepareSelection(input),\n rememberDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"rememberDefaultSelection\"\n )\n ? ({ path }) => service.rememberDefaultSelection!({ path })\n : apiRememberDefaultSelection,\n selectDirectory: hasWorkspaceUserProjectMethod(service, \"selectDirectory\")\n ? () => service.selectDirectory!()\n : apiSelectDirectory,\n use: hasWorkspaceUserProjectMethod(service, \"registerProjectPath\")\n ? ({ path }) => service.registerProjectPath!(path)\n : apiUse\n };\n}\n\nfunction hasWorkspaceUserProjectMethod(\n value: object | null | undefined,\n key: string\n): boolean {\n return value ? typeof Reflect.get(value, key) === \"function\" : false;\n}\n\nfunction setApiUnavailableUnlessService(\n setIsApiUnavailable: (value: boolean) => void,\n service: WorkspaceUserProjectService | null | undefined,\n value = true\n): void {\n if (!service) {\n setIsApiUnavailable(value);\n }\n}\n\nexport function resolveWorkspaceUserProjectSelectLabels(\n i18n: WorkspaceUserProjectI18nRuntime = defaultWorkspaceUserProjectSelectI18n,\n overrides?: WorkspaceUserProjectSelectLabelOverrides\n): WorkspaceUserProjectSelectLabels {\n return {\n addProject: overrides?.addProject ?? i18n.t(\"projectSelect.addProject\"),\n createProjectCancel:\n overrides?.createProjectCancel ??\n i18n.t(\"projectSelect.createProjectCancel\"),\n createProjectConfirm:\n overrides?.createProjectConfirm ??\n i18n.t(\"projectSelect.createProjectConfirm\"),\n createProjectDocumentsUnavailable:\n overrides?.createProjectDocumentsUnavailable ??\n i18n.t(\"projectSelect.createProjectDocumentsUnavailable\"),\n createProjectFailed:\n overrides?.createProjectFailed ??\n i18n.t(\"projectSelect.createProjectFailed\"),\n createProjectNameConflict:\n overrides?.createProjectNameConflict ??\n i18n.t(\"projectSelect.createProjectNameConflict\"),\n createProjectNameInvalid:\n overrides?.createProjectNameInvalid ??\n i18n.t(\"projectSelect.createProjectNameInvalid\"),\n createProjectNameLabel:\n overrides?.createProjectNameLabel ??\n i18n.t(\"projectSelect.createProjectNameLabel\"),\n createProjectNamePlaceholder:\n overrides?.createProjectNamePlaceholder ??\n i18n.t(\"projectSelect.createProjectNamePlaceholder\"),\n createProjectNameRequired:\n overrides?.createProjectNameRequired ??\n i18n.t(\"projectSelect.createProjectNameRequired\"),\n createProjectPermissionDenied:\n overrides?.createProjectPermissionDenied ??\n i18n.t(\"projectSelect.createProjectPermissionDenied\"),\n createProjectTitle:\n overrides?.createProjectTitle ??\n i18n.t(\"projectSelect.createProjectTitle\"),\n linkExistingProject:\n overrides?.linkExistingProject ??\n i18n.t(\"projectSelect.linkExistingProject\"),\n loadingProjects:\n overrides?.loadingProjects ?? i18n.t(\"projectSelect.loadingProjects\"),\n noProject: overrides?.noProject ?? i18n.t(\"projectSelect.noProject\"),\n projectLabel:\n overrides?.projectLabel ?? i18n.t(\"projectSelect.projectLabel\"),\n projectLocked:\n overrides?.projectLocked ?? i18n.t(\"projectSelect.projectLocked\"),\n projectMissingTitle:\n overrides?.projectMissingTitle ??\n i18n.t(\"projectSelect.projectMissingTitle\"),\n projectUnavailable:\n overrides?.projectUnavailable ??\n i18n.t(\"projectSelect.projectUnavailable\")\n };\n}\n\nfunction resolveProjectCreationErrorLabel(\n error: unknown,\n labels: WorkspaceUserProjectSelectLabels\n): string {\n switch (getWorkspaceUserProjectErrorCode(error)) {\n case \"EEXIST\":\n case \"project_directory_already_exists\":\n return labels.createProjectNameConflict;\n case \"project_name_invalid\":\n return labels.createProjectNameInvalid;\n case \"EACCES\":\n case \"EPERM\":\n case \"project_directory_permission_denied\":\n return labels.createProjectPermissionDenied;\n case \"ENOENT\":\n case \"project_documents_unavailable\":\n return labels.createProjectDocumentsUnavailable;\n default:\n return labels.createProjectFailed;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAqfH,mBACE,KAkBI,YAnBN;AApaJ,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAC9B,IAAM,iCAAiC;AACvC,IAAM,yCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmE/C,IAAM,wCACJ,6CAA6C;AAC/C,IAAM,2CAA2C,MAAM;AAAA,EACrD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU,CAAC;AAAA,EACX,UAAU;AACZ,CAAC;AAEM,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,UAAU,eAAe;AAAA,EACzB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA,+BAA+B;AAAA,EAC/B,0BAA0B;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,0BAA0B;AAAA,IACxB;AAAA,IACA;AAAA,EACF,KAAK,8BAA8B,KAAK,QAAQ;AAAA,EAChD,sBAAsB;AAAA,EACtB;AACF,GAAuD;AACrD;AACA,QAAM,kBAAkB;AAAA,IACtB,SAAS,SAAS;AAAA,EACpB;AACA,QAAM,eAAe;AAAA,IACnB,MAAM,qCAAqC,KAAK,OAAO;AAAA,IACvD,CAAC,KAAK,OAAO;AAAA,EACf;AACA,QAAM,iBAAiB;AAAA,IACrB,MAAM,wCAAwC,MAAM,MAAM;AAAA,IAC1D,CAAC,MAAM,MAAM;AAAA,EACf;AACA,QAAM,CAAC,aAAa,cAAc,IAAI,SAAiC,CAAC,CAAC;AACzE,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,CAAC,YAAY;AACtE,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,KAAK;AACpE,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,EAAE;AAC3D,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAEtD,IAAI;AACN,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAChE,QAAM,CAAC,wBAAwB,yBAAyB,IAAI,SAE1D,IAAI;AACN,QAAM,CAAC,6BAA6B,8BAA8B,IAChE,SAAS,KAAK;AAChB,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAS,KAAK;AACxE,QAAM,kBAAkB,qBAAqB,KAAK,KAAK;AACvD,QAAM,eACJ,mBAAmB,oBAAoB,yBACnC,KACA;AACN,QAAM,WAAW,UAAU,CAAC,GAAG,gBAAgB,QAAQ,IAAI;AAC3D,QAAM,kBAAkB,0BAA0B,WAAW,CAAC;AAC9D,QAAM,YAAY,UACd,gBAAgB,aAAa,CAAC,gBAAgB,cAC9C;AACJ,QAAM,gBAAgB,UAClB,QAAQ,gBAAgB,KAAK,KAAK,CAAC,gBAAgB,cACnD;AACJ,QAAM,oBACJ,iCAAiC,YAAY,KAAK;AACpD,QAAM,kBAAkB,0BACnB,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,YAAY,KAAK,OAC9D;AACJ,QAAM,uBAAuB,kBACzB,wCAAwC,eAAe,IACvD;AACJ,QAAM,0BACJ,iBACA,QAAQ,YAAY,KACpB,QAAQ,cAAc,kBAAkB,EAAE,MAAM,aAAa,CAAC,CAAC;AACjE,QAAM,iCAAiC;AACvC,QAAM,8BACJ,iBACA,iBAAiB,MACjB,CAAC,2BACD,CAAC,mBACD,CAAC;AACH,QAAM,cAAc,kBAChB,gBAAgB,OAChB;AACJ,QAAM,eAAe,iCACjB,eAAe,sBACf,0BACE,eAAe,YACf,8BACE,oBACA,kBACE,uBACA,eACE,wBAAwB,oBACxB,YACE,eAAe,kBACf,eAAe;AAC7B,QAAM,4BACJ,2BAA2B;AAC7B,QAAM,WACJ,gBACA,iBACC,6BAA6B,aAC9B,CAAC;AACH,QAAM,oBACJ,QAAQ,cAAc,eAAe,KACrC,2BACA;AACF,QAAM,2BACJ,gBAAgB,SAAS,KAAK;AAEhC,YAAU,MAAM;AACd,QAAI,CAAC,YAAY,CAAC,cAAc;AAC9B;AAAA,IACF;AACA,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,UAAU,YAAY,CAAC;AAE3B,YAAU,MAAM;AACd,6BAAyB,8BAA8B;AAAA,EACzD,GAAG,CAAC,wBAAwB,8BAA8B,CAAC;AAE3D,YAAU,MAAM;AACd,QAAI,iBAAiB;AACnB,qCAA+B,KAAK;AAAA,IACtC;AACA,QACE,2BACC,CAAC,mBAAmB,oBAAoB,yBACzC;AACA,gCAA0B,IAAI;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,iBAAiB,sBAAsB,CAAC;AAE5C,QAAM,yBAAyB;AAAA,IAC7B,CAAC,aAA6D;AAC5D,UAAI,CAAC,SAAS;AACZ,uBAAe,SAAS,QAAQ;AAAA,MAClC;AACA,+BAAyB,SAAS,qBAAqB;AACvD,UAAI,CAAC,8BAA8B;AACjC;AAAA,MACF;AACA,UAAI,SAAS,UAAU,SAAS,SAAS;AACvC,uCAA+B,IAAI;AACnC,kCAA0B,SAAS,UAAU,cAAc;AAC3D,4BAAoB,IAAI;AACxB;AAAA,MACF;AACA,UAAI,SAAS,UAAU,SAAS,UAAU;AACxC,uCAA+B,KAAK;AACpC,4BAAoB,SAAS,UAAU,IAAI;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,WAAW;AACf,QAAI,CAAC,cAAc;AACjB,qCAA+B,qBAAqB,OAAO;AAC3D;AAAA,IACF;AACA,QAAI,6BAA6B;AAC/B;AAAA,IACF;AACA,oBAAgB,IAAI;AACpB,mCAA+B,qBAAqB,SAAS,KAAK;AAClE,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACA,SAAK,qCAAqC,cAAc,KAAK,EAC1D,KAAK,CAAC,aAAa;AAClB,UAAI,CAAC,UAAU;AACb,+BAAuB,QAAQ;AAAA,MACjC;AAAA,IACF,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,UAAU;AACb,uCAA+B,qBAAqB,OAAO;AAAA,MAC7D;AAAA,IACF,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,CAAC,UAAU;AACb,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF,CAAC;AACH,WAAO,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,EACF,CAAC;AAED,QAAM,2BAA2B,YAAY,MAAY;AACvD,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACA,SAAK,qCAAqC,cAAc,KAAK,EAAE;AAAA,MAC7D;AAAA,MACA,MAAM;AACJ,uCAA+B,qBAAqB,OAAO;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB;AAAA,IACrB,OACE,MACA,WACkB;AAClB,UAAI,CAAC,cAAc;AACjB,uCAA+B,qBAAqB,OAAO;AAC3D;AAAA,MACF;AACA,UAAI;AACF,cAAM,UACH,MAAM,aAAa,MAAM,EAAE,KAAK,CAAC,KACjC;AAAA,UACC,IAAI;AAAA,UACJ,OAAO;AAAA,UACP;AAAA,QACF;AACF;AAAA,UAAe,CAAC,YACd,2BAA2B,SAAS,OAAO;AAAA,QAC7C;AACA,uCAA+B,KAAK;AACpC,4BAAoB,QAAQ,MAAM,EAAE,OAAO,CAAC;AAC5C,iCAAyB;AAAA,MAC3B,QAAQ;AACN,uCAA+B,qBAAqB,OAAO;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,CAAC,cAAc,qBAAqB,0BAA0B,OAAO;AAAA,EACvE;AAEA,QAAM,gBAAgB,YAAY,YAA2B;AAC3D,UAAM,OAAO,iBAAiB,KAAK;AACnC,QAAI,CAAC,cAAc,QAAQ;AACzB,8BAAwB,eAAe,mBAAmB;AAC1D,qCAA+B,qBAAqB,OAAO;AAC3D;AAAA,IACF;AACA,QAAI,CAAC,MAAM;AACT,8BAAwB,eAAe,yBAAyB;AAChE;AAAA,IACF;AACA,yBAAqB,IAAI;AACzB,4BAAwB,IAAI;AAC5B,QAAI;AACF,YAAM,UAAU,MAAM,aAAa,OAAO,EAAE,KAAK,CAAC;AAClD,qBAAe,CAAC,YAAY,2BAA2B,SAAS,OAAO,CAAC;AACxE,qCAA+B,KAAK;AACpC,0BAAoB,QAAQ,MAAM,EAAE,QAAQ,aAAa,CAAC;AAC1D,0BAAoB,EAAE;AACtB,6BAAuB,KAAK;AAC5B,+BAAyB;AAAA,IAC3B,SAAS,OAAO;AACd;AAAA,QACE,iCAAiC,OAAO,cAAc;AAAA,MACxD;AAAA,IACF,UAAE;AACA,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,sBAAsB,CAAC,UAA4C;AACvE,UAAM,eAAe;AACrB,SAAK,cAAc;AAAA,EACrB;AAEA,QAAM,qBAAqB,MAAY;AACrC,2BAAuB,KAAK;AAC5B,4BAAwB,IAAI;AAAA,EAC9B;AAEA,QAAM,2BAA2B,CAAC,cAA4B;AAC5D,QAAI,CAAC,gBAAgB,eAAe;AAClC;AAAA,IACF;AACA,QAAI,cAAc,sBAAsB;AACtC,WAAK,aAAa,2BAA2B,EAAE,MAAM,KAAK,CAAC;AAC3D,qCAA+B,IAAI;AACnC,0BAAoB,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,cAAc,uBAAuB;AACvC,0BAAoB,EAAE;AACtB,8BAAwB,IAAI;AAC5B,6BAAuB,IAAI;AAC3B;AAAA,IACF;AACA,QAAI,cAAc,gCAAgC;AAChD,WAAK,QAAQ,QAAQ,aAAa,kBAAkB,CAAC,EAClD,KAAK,CAAC,cAAc;AACnB,cAAM,OAAO,WAAW,MAAM,KAAK,KAAK;AACxC,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AACA,aAAK,eAAe,MAAM,iBAAiB;AAAA,MAC7C,CAAC,EACA,MAAM,MAAM;AAAA,MAAC,CAAC;AACjB;AAAA,IACF;AACA,UAAM,eAAe,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,SAAS;AAC1E,QAAI,cAAc;AAChB,WAAK,aAAa,2BAA2B,EAAE,MAAM,aAAa,KAAK,CAAC;AACxE,qCAA+B,KAAK;AACpC,0BAAoB,aAAa,MAAM,EAAE,QAAQ,kBAAkB,CAAC;AACpE;AAAA,IACF;AACA,SAAK,eAAe,WAAW,iBAAiB;AAAA,EAClD;AAEA,SACE,iCACE;AAAA,wBAAC,WAAO,kDAAuC;AAAA,IAC/C;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM;AAAA,QACN,OAAO;AAAA,QACP,cAAc;AAAA,QACd,eAAe;AAAA,QAEf;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,cACE,gBACI,eAAe,gBACf,gBACE,eAAe,qBACf,eAAe;AAAA,cAEvB,WAAW,YAAY;AAAA,cAEvB;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,6CAA0C;AAAA,kBAEzC;AAAA,uCAAmB,8BAClB,oBAAC,cAAW,eAAW,MAAC,WAAU,YAAW,MAAM,IAAI,IAEvD;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW;AAAA,wBACX,WAAU;AAAA,wBACV,gDAA6C;AAAA,wBAC7C,MAAM;AAAA;AAAA,oBACR;AAAA,oBAEF,oBAAC,qCAAkC,OAAO,cAAc;AAAA;AAAA;AAAA,cAC1D;AAAA;AAAA,UACF;AAAA,UACC,eACC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,WAAW,YAAY;AAAA,cACvB,kBAAkB;AAAA,cAClB,MAAM;AAAA,cACN,YAAY;AAAA,cAEX;AAAA,gCAAgB,IAAI,CAAC,YAAY;AAChC,wBAAM,eACJ,wCAAwC,OAAO;AACjD,yBACE;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAW,YAAY;AAAA,sBAEvB,OAAO,QAAQ;AAAA,sBAEf,+BAAC,UAAK,WAAU,+CACd;AAAA,4CAAC,cAAW,eAAW,MAAC,MAAM,IAAI;AAAA,wBAClC,oBAAC,qCAAkC,OAAO,cAAc;AAAA,yBAC1D;AAAA;AAAA,oBANK,QAAQ,MAAM,QAAQ;AAAA,kBAO7B;AAAA,gBAEJ,CAAC;AAAA,gBACA,2BACC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,gDAA6C;AAAA;AAAA,gBAC/C,IACE;AAAA,gBACH,oBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,4CAAyC;AAAA,oBAExC;AAAA,oCAAc,kBACb;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAW,YAAY;AAAA,0BACvB,OAAO;AAAA,0BAEP,+BAAC,UAAK,WAAU,+CACd;AAAA,gDAAC,YAAS,eAAW,MAAC,MAAM,IAAI;AAAA,4BAChC,oBAAC,UAAK,WAAU,YACb,yBAAe,qBAClB;AAAA,6BACF;AAAA;AAAA,sBACF,IACE;AAAA,sBACH,0BACC;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAW,YAAY;AAAA,0BACvB,OAAO;AAAA,0BAEP,+BAAC,UAAK,WAAU,+CACb;AAAA,mDAAuB,KACtB;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAW;AAAA,gCACX,wCAAqC;AAAA,gCACrC,MAAM;AAAA;AAAA,4BACR;AAAA,4BAEF,oBAAC,UAAK,WAAU,YACb,yBAAe,YAClB;AAAA,6BACF;AAAA;AAAA,sBACF,IACE;AAAA,sBACH,sBACC;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAW,YAAY;AAAA,0BACvB,OAAO;AAAA,0BAEP,+BAAC,UAAK,WAAU,+CACd;AAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAW;AAAA,gCACX,wCAAqC;AAAA,gCACrC,MAAM;AAAA;AAAA,4BACR;AAAA,4BACA,oBAAC,UAAK,WAAU,YACb,yBAAe,WAClB;AAAA,6BACF;AAAA;AAAA,sBACF,IACE;AAAA;AAAA;AAAA,gBACN,IACE;AAAA;AAAA;AAAA,UACN,IACE;AAAA;AAAA;AAAA,IACN;AAAA,IACC,sBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAI;AAAA,QACJ,cAAc,CAAC,aAAa,CAAC,YAAY,mBAAmB;AAAA,QAE5D;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,iBAAiB;AAAA,YAEjB,+BAAC,UAAK,WAAU,cAAa,UAAU,qBACrC;AAAA,mCAAC,gBACC;AAAA,oCAAC,eAAa,yBAAe,oBAAmB;AAAA,gBAChD,oBAAC,qBACE,yBAAe,wBAClB;AAAA,iBACF;AAAA,cACA,qBAAC,WAAM,WAAU,gBACf;AAAA,oCAAC,UAAK,WAAU,WACb,yBAAe,wBAClB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAS;AAAA,oBACT,WAAU;AAAA,oBACV,UAAU;AAAA,oBACV,aAAa,eAAe;AAAA,oBAC5B,OAAO;AAAA,oBACP,UAAU,CAAC,UAAU;AACnB,0CAAoB,MAAM,OAAO,KAAK;AACtC,0BAAI,sBAAsB;AACxB,gDAAwB,IAAI;AAAA,sBAC9B;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cACC,uBACC,oBAAC,OAAE,WAAU,0CACV,gCACH,IACE;AAAA,cACJ,qBAAC,gBACC;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAU;AAAA,oBACV,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,eAAe,CAAC,UAAU;AACxB,0BAAI,MAAM,WAAW,KAAK,CAAC,mBAAmB;AAC5C,2CAAmB;AAAA,sBACrB;AAAA,oBACF;AAAA,oBAEC,yBAAe;AAAA;AAAA,gBAClB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAU,qBAAqB,CAAC,iBAAiB,KAAK;AAAA,oBACtD,MAAK;AAAA,oBACL,MAAK;AAAA,oBAEJ,yBAAe;AAAA;AAAA,gBAClB;AAAA,iBACF;AAAA,eACF;AAAA;AAAA,QACF;AAAA;AAAA,IACF,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,kCAAkC;AAAA,EACzC;AAAA,EACA;AACF,GAGsB;AACpB,QAAM,UAAU,OAA+B,IAAI;AACnD,QAAM,aAAa,OAA+B,IAAI;AACtD,QAAM,wBAAwB,YAAY,MAAM;AAC9C,UAAM,OAAO,QAAQ;AACrB,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,QAAQ,CAAC,SAAS;AACrB;AAAA,IACF;AACA,UAAM,mBAAmB,QAAQ,cAAc,KAAK;AACpD,QAAI,oBAAoB,GAAG;AACzB,WAAK,MAAM;AAAA,QACT;AAAA,QACA;AAAA,MACF;AACA,WAAK,gBAAgB,eAAe;AACpC;AAAA,IACF;AACA,SAAK,MAAM;AAAA,MACT;AAAA,MACA,GAAG,CAAC,gBAAgB;AAAA,IACtB;AACA,SAAK,aAAa,iBAAiB,MAAM;AAAA,EAC3C,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,0BAAsB;AAEtB,UAAM,OAAO,QAAQ;AACrB,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,QAAQ,CAAC,WAAW,OAAO,WAAW,mBAAmB,aAAa;AACzE;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,WAAW,eAAe,qBAAqB;AACpE,aAAS,QAAQ,IAAI;AACrB,aAAS,QAAQ,OAAO;AACxB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,OAAO,qBAAqB,CAAC;AAEjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,yCAAyC,SAAS;AAAA,MAChE,8CAA2C;AAAA,MAC3C,SAAS;AAAA,MACT,gBAAgB;AAAA,MAEhB;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UAET;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,qCACP,KACA,SACgC;AAChC,MAAI,CAAC,SAAS;AACZ,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,eAAe,8BAA8B,KAAK,WAAW,IAC/D,CAAC,UAA4B,IAAK,UAAW,KAAK,IAClD;AACJ,QAAM,YAAY,8BAA8B,KAAK,QAAQ,IACzD,CAAC,UAA4B,IAAK,OAAQ,KAAK,IAC/C;AACJ,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,IACI,MAAM,IAAK,oBAAqB,IAChC;AACJ,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,EACF,IACI,CAAC,UAA4B,IAAK,gBAAiB,KAAK,IACxD;AACJ,QAAM,8BAA8B;AAAA,IAClC;AAAA,IACA;AAAA,EACF,IACI,CAAC,UAAmC,IAAK,yBAA0B,KAAK,IACxE;AACJ,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,EACF,IACI,MAAM,IAAK,gBAAiB,IAC5B;AACJ,QAAM,SAAS,8BAA8B,KAAK,KAAK,IACnD,CAAC,UAA4B,IAAK,IAAK,KAAK,IAC5C;AACJ,SAAO;AAAA,IACL,WAAW,8BAA8B,SAAS,kBAAkB,IAChE,CAAC,EAAE,KAAK,MAAM,QAAQ,iBAAkB,IAAI,IAC5C;AAAA,IACJ,QAAQ,8BAA8B,SAAS,eAAe,IAC1D,CAAC,EAAE,KAAK,MAAM,QAAQ,cAAe,IAAI,IACzC;AAAA,IACJ,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,IACF,IACI,MAAM,QAAQ,oBAAqB,IACnC;AAAA,IACJ,iBAAiB,8BAA8B,SAAS,iBAAiB,IACrE,CAAC,EAAE,KAAK,MAAM,QAAQ,gBAAiB,IAAI,IAC3C;AAAA,IACJ,MAAM,YAAY;AAChB,aAAO,QAAQ,eAAe,KAAK,QAAQ,QAAQ;AACnD,aAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,MAAM,QAAQ,EAAE;AAAA,IACjD;AAAA,IACA,kBAAkB,CAAC,UAAU,QAAQ,iBAAiB,KAAK;AAAA,IAC3D,0BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,IACF,IACI,CAAC,EAAE,KAAK,MAAM,QAAQ,yBAA0B,EAAE,KAAK,CAAC,IACxD;AAAA,IACJ,iBAAiB,8BAA8B,SAAS,iBAAiB,IACrE,MAAM,QAAQ,gBAAiB,IAC/B;AAAA,IACJ,KAAK,8BAA8B,SAAS,qBAAqB,IAC7D,CAAC,EAAE,KAAK,MAAM,QAAQ,oBAAqB,IAAI,IAC/C;AAAA,EACN;AACF;AAEA,SAAS,8BACP,OACA,KACS;AACT,SAAO,QAAQ,OAAO,QAAQ,IAAI,OAAO,GAAG,MAAM,aAAa;AACjE;AAEA,SAAS,+BACP,qBACA,SACA,QAAQ,MACF;AACN,MAAI,CAAC,SAAS;AACZ,wBAAoB,KAAK;AAAA,EAC3B;AACF;AAEO,SAAS,wCACd,OAAwC,uCACxC,WACkC;AAClC,SAAO;AAAA,IACL,YAAY,WAAW,cAAc,KAAK,EAAE,0BAA0B;AAAA,IACtE,qBACE,WAAW,uBACX,KAAK,EAAE,mCAAmC;AAAA,IAC5C,sBACE,WAAW,wBACX,KAAK,EAAE,oCAAoC;AAAA,IAC7C,mCACE,WAAW,qCACX,KAAK,EAAE,iDAAiD;AAAA,IAC1D,qBACE,WAAW,uBACX,KAAK,EAAE,mCAAmC;AAAA,IAC5C,2BACE,WAAW,6BACX,KAAK,EAAE,yCAAyC;AAAA,IAClD,0BACE,WAAW,4BACX,KAAK,EAAE,wCAAwC;AAAA,IACjD,wBACE,WAAW,0BACX,KAAK,EAAE,sCAAsC;AAAA,IAC/C,8BACE,WAAW,gCACX,KAAK,EAAE,4CAA4C;AAAA,IACrD,2BACE,WAAW,6BACX,KAAK,EAAE,yCAAyC;AAAA,IAClD,+BACE,WAAW,iCACX,KAAK,EAAE,6CAA6C;AAAA,IACtD,oBACE,WAAW,sBACX,KAAK,EAAE,kCAAkC;AAAA,IAC3C,qBACE,WAAW,uBACX,KAAK,EAAE,mCAAmC;AAAA,IAC5C,iBACE,WAAW,mBAAmB,KAAK,EAAE,+BAA+B;AAAA,IACtE,WAAW,WAAW,aAAa,KAAK,EAAE,yBAAyB;AAAA,IACnE,cACE,WAAW,gBAAgB,KAAK,EAAE,4BAA4B;AAAA,IAChE,eACE,WAAW,iBAAiB,KAAK,EAAE,6BAA6B;AAAA,IAClE,qBACE,WAAW,uBACX,KAAK,EAAE,mCAAmC;AAAA,IAC5C,oBACE,WAAW,sBACX,KAAK,EAAE,kCAAkC;AAAA,EAC7C;AACF;AAEA,SAAS,iCACP,OACA,QACQ;AACR,UAAQ,iCAAiC,KAAK,GAAG;AAAA,IAC/C,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,IAChB;AACE,aAAO,OAAO;AAAA,EAClB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/internal/project/WorkspaceUserProjectSelect.tsx"],"sourcesContent":["import {\n type FormEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport { proxy } from \"valtio/vanilla\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FolderIcon,\n Input,\n LinkIcon,\n NewWorkspaceLinedIcon,\n NoWorkspaceLinedIcon,\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput,\n WorkspaceUserProjectService\n} from \"../../../contracts/index.ts\";\nimport {\n basenameWorkspaceUserProjectPath,\n getWorkspaceUserProjectErrorCode,\n prepareWorkspaceUserProjectSelection,\n resolveWorkspaceUserProjectDisplayLabel,\n upsertWorkspaceUserProject\n} from \"../../../core/index.ts\";\nimport {\n createDefaultWorkspaceUserProjectI18nRuntime,\n type WorkspaceUserProjectI18nRuntime\n} from \"../../../i18n/index.ts\";\n\nexport type WorkspaceUserProjectSelectLabels = {\n addProject: string;\n createProjectCancel: string;\n createProjectConfirm: string;\n createProjectDocumentsUnavailable: string;\n createProjectFailed: string;\n createProjectNameConflict: string;\n createProjectNameInvalid: string;\n createProjectNameLabel: string;\n createProjectNamePlaceholder: string;\n createProjectNameRequired: string;\n createProjectPermissionDenied: string;\n createProjectTitle: string;\n linkExistingProject: string;\n loadingProjects: string;\n noProject: string;\n projectLabel: string;\n projectLocked: string;\n projectMissingTitle: string;\n projectUnavailable: string;\n};\n\nexport type WorkspaceUserProjectSelectLabelOverrides =\n Partial<WorkspaceUserProjectSelectLabels>;\n\nexport interface WorkspaceUserProjectSelectClassNames {\n content?: string;\n item?: string;\n trigger?: string;\n}\n\nexport type WorkspaceUserProjectSelectChangeAction =\n | \"clear\"\n | \"create_new\"\n | \"select_existing\";\n\nexport interface WorkspaceUserProjectSelectProps {\n api?: WorkspaceUserProjectApi | null;\n classNames?: WorkspaceUserProjectSelectClassNames;\n contentAlign?: \"center\" | \"end\" | \"start\";\n contentSide?: \"bottom\" | \"left\" | \"right\" | \"top\";\n contentSideOffset?: number;\n disabled?: boolean;\n i18n?: WorkspaceUserProjectI18nRuntime;\n labels?: WorkspaceUserProjectSelectLabelOverrides;\n onProjectMissingChange?: (isMissing: boolean) => void;\n onProjectPathChange: (\n path: string | null,\n metadata?: {\n action: WorkspaceUserProjectSelectChangeAction;\n project?: WorkspaceUserProject;\n }\n ) => void;\n projectLocked?: boolean;\n renderAddProjectIcon?: () => ReactNode;\n shouldApplyPreparedSelection?: boolean;\n showKnownProjectOptions?: boolean;\n service?: WorkspaceUserProjectService | null;\n selectedProjectPath?: string | null;\n showCreateProjectAction?: boolean;\n showNoProjectAction?: boolean;\n unlistedProjectLabel?: string;\n}\n\nconst noProjectOptionValue = \"__tutti_no_project__\";\nconst addProjectOptionValue = \"__tutti_add_project__\";\nconst linkExistingProjectOptionValue = \"__tutti_link_existing_project__\";\nconst workspaceUserProjectOverflowLabelStyle = `\n@keyframes workspace-user-project-label-marquee {\n 0% {\n transform: translateX(0);\n }\n\n 44%,\n 56% {\n transform: translateX(var(--workspace-user-project-label-marquee-distance, 0px));\n }\n\n 88%,\n 100% {\n transform: translateX(0);\n }\n}\n\n.workspace-user-project-overflow-label {\n --workspace-user-project-label-marquee-distance: 0px;\n container-type: normal;\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.workspace-user-project-trigger-label {\n align-items: center;\n display: flex;\n flex: 1 1 auto;\n gap: 0.5rem;\n min-width: 0;\n}\n\n.workspace-user-project-overflow-label__content {\n display: block;\n max-width: 100%;\n min-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n transform: translateX(0);\n white-space: nowrap;\n width: max-content;\n}\n\n.workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n[data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: workspace-user-project-label-marquee 14s linear infinite;\n max-width: none;\n overflow: visible;\n text-overflow: clip;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n [data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: none;\n }\n}\n`;\nconst defaultWorkspaceUserProjectSelectI18n =\n createDefaultWorkspaceUserProjectI18nRuntime();\nconst emptyWorkspaceUserProjectServiceSnapshot = proxy({\n error: null,\n initialized: false,\n isLoading: false,\n projects: [],\n revision: 0\n});\n\nexport function WorkspaceUserProjectSelect({\n api,\n classNames,\n contentAlign = \"start\",\n contentSide = \"top\",\n contentSideOffset = 4,\n disabled: disabledProp = false,\n i18n = defaultWorkspaceUserProjectSelectI18n,\n labels,\n onProjectMissingChange,\n onProjectPathChange,\n projectLocked = false,\n renderAddProjectIcon,\n shouldApplyPreparedSelection = true,\n showKnownProjectOptions = true,\n service,\n selectedProjectPath,\n showCreateProjectAction = hasWorkspaceUserProjectMethod(\n service,\n \"createProject\"\n ) || hasWorkspaceUserProjectMethod(api, \"create\"),\n showNoProjectAction = true,\n unlistedProjectLabel\n}: WorkspaceUserProjectSelectProps): React.JSX.Element {\n \"use memo\";\n const serviceSnapshot = useSnapshot(\n service?.store ?? emptyWorkspaceUserProjectServiceSnapshot\n );\n const effectiveApi = useMemo(\n () => createWorkspaceUserProjectApiAdapter(api, service),\n [api, service]\n );\n const resolvedLabels = useMemo(\n () => resolveWorkspaceUserProjectSelectLabels(i18n, labels),\n [i18n, labels]\n );\n const createProjectNameDescription =\n resolvedLabels.createProjectNameLabel.trim();\n const createProjectNameInputLabel =\n createProjectNameDescription ||\n resolvedLabels.createProjectNamePlaceholder.trim();\n const [apiProjects, setApiProjects] = useState<WorkspaceUserProject[]>([]);\n const [isApiLoading, setIsApiLoading] = useState(false);\n const [isApiUnavailable, setIsApiUnavailable] = useState(!effectiveApi);\n const [isProjectDialogOpen, setIsProjectDialogOpen] = useState(false);\n const [isSelectOpen, setIsSelectOpen] = useState(false);\n const [draftProjectName, setDraftProjectName] = useState(\"\");\n const [projectCreationError, setProjectCreationError] = useState<\n string | null\n >(null);\n const [isCreatingProject, setIsCreatingProject] = useState(false);\n const [suppressedSelectedPath, setSuppressedSelectedPath] = useState<\n string | null\n >(null);\n const [hasPinnedNoProjectSelection, setHasPinnedNoProjectSelection] =\n useState(false);\n const [isSelectedPathMissing, setIsSelectedPathMissing] = useState(false);\n const rawSelectedPath = selectedProjectPath?.trim() ?? \"\";\n const selectedPath =\n rawSelectedPath && rawSelectedPath === suppressedSelectedPath\n ? \"\"\n : rawSelectedPath;\n const projects = service ? [...serviceSnapshot.projects] : apiProjects;\n const visibleProjects = showKnownProjectOptions ? projects : [];\n const isLoading = service\n ? serviceSnapshot.isLoading && !serviceSnapshot.initialized\n : isApiLoading;\n const isUnavailable = service\n ? Boolean(serviceSnapshot.error) && !serviceSnapshot.initialized\n : isApiUnavailable;\n const selectedPathLabel =\n basenameWorkspaceUserProjectPath(selectedPath) || selectedPath;\n const selectedProject = showKnownProjectOptions\n ? (projects.find((project) => project.path === selectedPath) ?? null)\n : null;\n const selectedProjectLabel = selectedProject\n ? resolveWorkspaceUserProjectDisplayLabel(selectedProject)\n : \"\";\n const isSelectedNoProjectPath =\n Boolean(selectedPath) &&\n Boolean(effectiveApi?.isNoProjectPath?.({ path: selectedPath }));\n const shouldShowMissingProjectNotice = isSelectedPathMissing;\n const shouldShowLockedProjectPath =\n projectLocked &&\n selectedPath !== \"\" &&\n !isSelectedNoProjectPath &&\n !selectedProject &&\n !isSelectedPathMissing;\n const selectValue = selectedProject\n ? selectedProject.path\n : noProjectOptionValue;\n const triggerLabel = shouldShowMissingProjectNotice\n ? resolvedLabels.projectMissingTitle\n : isSelectedNoProjectPath\n ? resolvedLabels.noProject\n : shouldShowLockedProjectPath\n ? selectedPathLabel\n : selectedProject\n ? selectedProjectLabel\n : selectedPath\n ? unlistedProjectLabel || selectedPathLabel\n : isLoading\n ? resolvedLabels.loadingProjects\n : resolvedLabels.noProject;\n const shouldDisableWhileLoading =\n showKnownProjectOptions || shouldApplyPreparedSelection;\n const disabled =\n disabledProp ||\n projectLocked ||\n (shouldDisableWhileLoading && isLoading) ||\n !effectiveApi;\n const hasProjectActions =\n Boolean(effectiveApi?.selectDirectory) ||\n showCreateProjectAction ||\n showNoProjectAction;\n const showProjectActionDivider =\n visibleProjects.length > 0 && hasProjectActions;\n\n useEffect(() => {\n if (!disabled || !isSelectOpen) {\n return;\n }\n setIsSelectOpen(false);\n }, [disabled, isSelectOpen]);\n\n useEffect(() => {\n onProjectMissingChange?.(shouldShowMissingProjectNotice);\n }, [onProjectMissingChange, shouldShowMissingProjectNotice]);\n\n useEffect(() => {\n if (rawSelectedPath) {\n setHasPinnedNoProjectSelection(false);\n }\n if (\n suppressedSelectedPath &&\n (!rawSelectedPath || rawSelectedPath !== suppressedSelectedPath)\n ) {\n setSuppressedSelectedPath(null);\n }\n }, [rawSelectedPath, suppressedSelectedPath]);\n\n const applyPreparedSelection = useEffectEvent(\n (prepared: WorkspaceUserProjectSelectionPreparation): void => {\n if (!service) {\n setApiProjects(prepared.projects);\n }\n setIsSelectedPathMissing(prepared.isSelectedPathMissing);\n if (!shouldApplyPreparedSelection) {\n return;\n }\n if (prepared.selection.kind === \"clear\") {\n setHasPinnedNoProjectSelection(true);\n setSuppressedSelectedPath(prepared.selection.suppressedPath);\n onProjectPathChange(null);\n return;\n }\n if (prepared.selection.kind === \"select\") {\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(prepared.selection.path);\n }\n }\n );\n\n useEffect(() => {\n let canceled = false;\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (hasPinnedNoProjectSelection) {\n return;\n }\n setIsApiLoading(true);\n setApiUnavailableUnlessService(setIsApiUnavailable, service, false);\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input)\n .then((prepared) => {\n if (!canceled) {\n applyPreparedSelection(prepared);\n }\n })\n .catch(() => {\n if (!canceled) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n })\n .finally(() => {\n if (!canceled) {\n setIsApiLoading(false);\n }\n });\n return () => {\n canceled = true;\n };\n }, [\n effectiveApi,\n hasPinnedNoProjectSelection,\n projectLocked,\n selectedPath,\n serviceSnapshot.revision,\n service\n ]);\n\n const refreshPreparedSelection = useCallback((): void => {\n if (!effectiveApi) {\n return;\n }\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input).then(\n applyPreparedSelection,\n () => {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n );\n }, [\n effectiveApi,\n projectLocked,\n selectedPath,\n service,\n shouldApplyPreparedSelection\n ]);\n\n const useProjectPath = useCallback(\n async (\n path: string,\n action: WorkspaceUserProjectSelectChangeAction\n ): Promise<void> => {\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n try {\n const project =\n (await effectiveApi.use?.({ path })) ??\n ({\n id: path,\n label: path,\n path\n } satisfies WorkspaceUserProject);\n setApiProjects((current) =>\n upsertWorkspaceUserProject(current, project)\n );\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action, project });\n refreshPreparedSelection();\n } catch {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n },\n [effectiveApi, onProjectPathChange, refreshPreparedSelection, service]\n );\n\n const createProject = useCallback(async (): Promise<void> => {\n const name = draftProjectName.trim();\n if (!effectiveApi?.create) {\n setProjectCreationError(resolvedLabels.createProjectFailed);\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (!name) {\n setProjectCreationError(resolvedLabels.createProjectNameRequired);\n return;\n }\n setIsCreatingProject(true);\n setProjectCreationError(null);\n try {\n const project = await effectiveApi.create({ name });\n setApiProjects((current) => upsertWorkspaceUserProject(current, project));\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action: \"create_new\", project });\n setDraftProjectName(\"\");\n setIsProjectDialogOpen(false);\n refreshPreparedSelection();\n } catch (error) {\n setProjectCreationError(\n resolveProjectCreationErrorLabel(error, resolvedLabels)\n );\n } finally {\n setIsCreatingProject(false);\n }\n }, [\n effectiveApi,\n draftProjectName,\n onProjectPathChange,\n refreshPreparedSelection,\n resolvedLabels,\n service\n ]);\n\n const submitProjectDialog = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void createProject();\n };\n\n const closeProjectDialog = (): void => {\n setIsProjectDialogOpen(false);\n setProjectCreationError(null);\n };\n\n const handleProjectValueChange = (nextValue: string): void => {\n if (!effectiveApi || projectLocked) {\n return;\n }\n if (nextValue === noProjectOptionValue) {\n void effectiveApi.rememberDefaultSelection?.({ path: null });\n setHasPinnedNoProjectSelection(true);\n onProjectPathChange(null, { action: \"clear\" });\n return;\n }\n if (nextValue === addProjectOptionValue) {\n setDraftProjectName(\"\");\n setProjectCreationError(null);\n setIsProjectDialogOpen(true);\n return;\n }\n if (nextValue === linkExistingProjectOptionValue) {\n void Promise.resolve(effectiveApi.selectDirectory?.())\n .then((selection) => {\n const path = selection?.path?.trim() ?? \"\";\n if (!path) {\n return;\n }\n void useProjectPath(path, \"select_existing\");\n })\n .catch(() => {});\n return;\n }\n const knownProject = projects.find((project) => project.path === nextValue);\n if (knownProject) {\n void effectiveApi.rememberDefaultSelection?.({ path: knownProject.path });\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(knownProject.path, { action: \"select_existing\" });\n return;\n }\n void useProjectPath(nextValue, \"select_existing\");\n };\n\n return (\n <>\n <style>{workspaceUserProjectOverflowLabelStyle}</style>\n <Select\n disabled={disabled}\n open={isSelectOpen}\n value={selectValue}\n onOpenChange={setIsSelectOpen}\n onValueChange={handleProjectValueChange}\n >\n <SelectTrigger\n aria-label={\n projectLocked\n ? resolvedLabels.projectLocked\n : isUnavailable\n ? resolvedLabels.projectUnavailable\n : resolvedLabels.projectLabel\n }\n className={classNames?.trigger}\n >\n <span\n className=\"workspace-user-project-trigger-label\"\n data-workspace-user-project-trigger-label=\"true\"\n >\n {selectedProject || shouldShowLockedProjectPath ? (\n <FolderIcon aria-hidden className=\"shrink-0\" size={15} />\n ) : (\n <NoWorkspaceLinedIcon\n aria-hidden\n className=\"shrink-0\"\n data-agent-project-trigger-no-workspace-icon=\"true\"\n size={15}\n />\n )}\n <WorkspaceUserProjectOverflowLabel label={triggerLabel} />\n </span>\n </SelectTrigger>\n {isSelectOpen ? (\n <SelectContent\n align={contentAlign}\n className={classNames?.content}\n collisionPadding={16}\n side={contentSide}\n sideOffset={contentSideOffset}\n >\n {visibleProjects.map((project) => {\n const projectLabel =\n resolveWorkspaceUserProjectDisplayLabel(project);\n return (\n <SelectItem\n className={classNames?.item}\n key={project.id || project.path}\n value={project.path}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <FolderIcon aria-hidden size={15} />\n <WorkspaceUserProjectOverflowLabel label={projectLabel} />\n </span>\n </SelectItem>\n );\n })}\n {showProjectActionDivider ? (\n <SelectSeparator\n className=\"mx-[12px] my-1 shrink-0 bg-[var(--line-2)]\"\n data-workspace-user-project-action-separator=\"true\"\n />\n ) : null}\n {hasProjectActions ? (\n <SelectGroup\n className=\"gap-0.5 p-0\"\n data-workspace-user-project-action-group=\"true\"\n >\n {effectiveApi?.selectDirectory ? (\n <SelectItem\n className={classNames?.item}\n value={linkExistingProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <LinkIcon aria-hidden size={15} />\n <span className=\"truncate\">\n {resolvedLabels.linkExistingProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showCreateProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={addProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n {renderAddProjectIcon?.() ?? (\n <NewWorkspaceLinedIcon\n aria-hidden\n data-workspace-user-project-add-icon=\"true\"\n size={15}\n />\n )}\n <span className=\"truncate\">\n {resolvedLabels.addProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showNoProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={noProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <NoWorkspaceLinedIcon\n aria-hidden\n data-agent-project-no-workspace-icon=\"true\"\n size={15}\n />\n <span className=\"truncate\">\n {resolvedLabels.noProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n </SelectGroup>\n ) : null}\n </SelectContent>\n ) : null}\n </Select>\n {isProjectDialogOpen ? (\n <Dialog\n open\n onOpenChange={(nextOpen) => !nextOpen && closeProjectDialog()}\n >\n <DialogContent\n className=\"w-[480px] max-w-[calc(100vw-32px)] sm:max-w-[480px]\"\n showCloseButton={false}\n >\n <form className=\"grid gap-4\" onSubmit={submitProjectDialog}>\n <DialogHeader>\n <DialogTitle>{resolvedLabels.createProjectTitle}</DialogTitle>\n {createProjectNameDescription ? (\n <DialogDescription>\n {createProjectNameDescription}\n </DialogDescription>\n ) : null}\n </DialogHeader>\n <label className=\"grid gap-1.5\">\n <span className=\"sr-only\">{createProjectNameInputLabel}</span>\n <Input\n autoFocus\n className=\"h-10\"\n disabled={isCreatingProject}\n placeholder={resolvedLabels.createProjectNamePlaceholder}\n value={draftProjectName}\n onChange={(event) => {\n setDraftProjectName(event.target.value);\n if (projectCreationError) {\n setProjectCreationError(null);\n }\n }}\n />\n </label>\n {projectCreationError ? (\n <p className=\"text-[13px] text-[var(--state-danger)]\">\n {projectCreationError}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n disabled={isCreatingProject}\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={closeProjectDialog}\n onPointerDown={(event) => {\n if (event.button === 0 && !isCreatingProject) {\n closeProjectDialog();\n }\n }}\n >\n {resolvedLabels.createProjectCancel}\n </Button>\n <Button\n disabled={isCreatingProject || !draftProjectName.trim()}\n size=\"dialog\"\n type=\"submit\"\n >\n {resolvedLabels.createProjectConfirm}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n ) : null}\n </>\n );\n}\n\nfunction WorkspaceUserProjectOverflowLabel({\n className,\n label\n}: {\n className?: string;\n label: string;\n}): React.JSX.Element {\n const rootRef = useRef<HTMLSpanElement | null>(null);\n const contentRef = useRef<HTMLSpanElement | null>(null);\n const updateMarqueeDistance = useCallback(() => {\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content) {\n return;\n }\n const overflowDistance = content.scrollWidth - root.clientWidth;\n if (overflowDistance <= 1) {\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n \"0px\"\n );\n root.removeAttribute(\"data-overflow\");\n return;\n }\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n `${-overflowDistance}px`\n );\n root.setAttribute(\"data-overflow\", \"true\");\n }, []);\n\n useEffect(() => {\n updateMarqueeDistance();\n\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content || typeof globalThis.ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new globalThis.ResizeObserver(updateMarqueeDistance);\n observer.observe(root);\n observer.observe(content);\n return () => observer.disconnect();\n }, [label, updateMarqueeDistance]);\n\n return (\n <span\n ref={rootRef}\n className={cn(\"workspace-user-project-overflow-label\", className)}\n data-workspace-user-project-overflow-label=\"true\"\n onFocus={updateMarqueeDistance}\n onPointerEnter={updateMarqueeDistance}\n >\n <span\n ref={contentRef}\n className=\"workspace-user-project-overflow-label__content\"\n >\n {label}\n </span>\n </span>\n );\n}\n\nfunction createWorkspaceUserProjectApiAdapter(\n api: WorkspaceUserProjectApi | null | undefined,\n service: WorkspaceUserProjectService | null | undefined\n): WorkspaceUserProjectApi | null {\n if (!service) {\n return api ?? null;\n }\n const apiCheckPath = hasWorkspaceUserProjectMethod(api, \"checkPath\")\n ? (input: { path: string }) => api!.checkPath!(input)\n : undefined;\n const apiCreate = hasWorkspaceUserProjectMethod(api, \"create\")\n ? (input: { name: string }) => api!.create!(input)\n : undefined;\n const apiGetDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"getDefaultSelection\"\n )\n ? () => api!.getDefaultSelection!()\n : undefined;\n const apiIsNoProjectPath = hasWorkspaceUserProjectMethod(\n api,\n \"isNoProjectPath\"\n )\n ? (input: { path: string }) => api!.isNoProjectPath!(input)\n : undefined;\n const apiRememberDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"rememberDefaultSelection\"\n )\n ? (input: { path: string | null }) => api!.rememberDefaultSelection!(input)\n : undefined;\n const apiSelectDirectory = hasWorkspaceUserProjectMethod(\n api,\n \"selectDirectory\"\n )\n ? () => api!.selectDirectory!()\n : undefined;\n const apiUse = hasWorkspaceUserProjectMethod(api, \"use\")\n ? (input: { path: string }) => api!.use!(input)\n : undefined;\n return {\n checkPath: hasWorkspaceUserProjectMethod(service, \"checkProjectPath\")\n ? ({ path }) => service.checkProjectPath!(path)\n : apiCheckPath,\n create:\n apiCreate ??\n (hasWorkspaceUserProjectMethod(service, \"createProject\")\n ? ({ name }) => service.createProject!(name)\n : undefined),\n getDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"getDefaultSelection\"\n )\n ? () => service.getDefaultSelection!()\n : apiGetDefaultSelection,\n isNoProjectPath: hasWorkspaceUserProjectMethod(service, \"isNoProjectPath\")\n ? ({ path }) => service.isNoProjectPath!(path)\n : apiIsNoProjectPath,\n list: async () => {\n await (service.ensureLoaded?.() ?? service.refresh());\n return { projects: [...service.store.projects] };\n },\n prepareSelection: (input) => service.prepareSelection(input),\n rememberDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"rememberDefaultSelection\"\n )\n ? ({ path }) => service.rememberDefaultSelection!({ path })\n : apiRememberDefaultSelection,\n selectDirectory:\n apiSelectDirectory ??\n (hasWorkspaceUserProjectMethod(service, \"selectDirectory\")\n ? () => service.selectDirectory!()\n : undefined),\n use: hasWorkspaceUserProjectMethod(service, \"registerProjectPath\")\n ? ({ path }) => service.registerProjectPath!(path)\n : apiUse\n };\n}\n\nfunction hasWorkspaceUserProjectMethod(\n value: object | null | undefined,\n key: string\n): boolean {\n return value ? typeof Reflect.get(value, key) === \"function\" : false;\n}\n\nfunction setApiUnavailableUnlessService(\n setIsApiUnavailable: (value: boolean) => void,\n service: WorkspaceUserProjectService | null | undefined,\n value = true\n): void {\n if (!service) {\n setIsApiUnavailable(value);\n }\n}\n\nexport function resolveWorkspaceUserProjectSelectLabels(\n i18n: WorkspaceUserProjectI18nRuntime = defaultWorkspaceUserProjectSelectI18n,\n overrides?: WorkspaceUserProjectSelectLabelOverrides\n): WorkspaceUserProjectSelectLabels {\n return {\n addProject: overrides?.addProject ?? i18n.t(\"projectSelect.addProject\"),\n createProjectCancel:\n overrides?.createProjectCancel ??\n i18n.t(\"projectSelect.createProjectCancel\"),\n createProjectConfirm:\n overrides?.createProjectConfirm ??\n i18n.t(\"projectSelect.createProjectConfirm\"),\n createProjectDocumentsUnavailable:\n overrides?.createProjectDocumentsUnavailable ??\n i18n.t(\"projectSelect.createProjectDocumentsUnavailable\"),\n createProjectFailed:\n overrides?.createProjectFailed ??\n i18n.t(\"projectSelect.createProjectFailed\"),\n createProjectNameConflict:\n overrides?.createProjectNameConflict ??\n i18n.t(\"projectSelect.createProjectNameConflict\"),\n createProjectNameInvalid:\n overrides?.createProjectNameInvalid ??\n i18n.t(\"projectSelect.createProjectNameInvalid\"),\n createProjectNameLabel:\n overrides?.createProjectNameLabel ??\n i18n.t(\"projectSelect.createProjectNameLabel\"),\n createProjectNamePlaceholder:\n overrides?.createProjectNamePlaceholder ??\n i18n.t(\"projectSelect.createProjectNamePlaceholder\"),\n createProjectNameRequired:\n overrides?.createProjectNameRequired ??\n i18n.t(\"projectSelect.createProjectNameRequired\"),\n createProjectPermissionDenied:\n overrides?.createProjectPermissionDenied ??\n i18n.t(\"projectSelect.createProjectPermissionDenied\"),\n createProjectTitle:\n overrides?.createProjectTitle ??\n i18n.t(\"projectSelect.createProjectTitle\"),\n linkExistingProject:\n overrides?.linkExistingProject ??\n i18n.t(\"projectSelect.linkExistingProject\"),\n loadingProjects:\n overrides?.loadingProjects ?? i18n.t(\"projectSelect.loadingProjects\"),\n noProject: overrides?.noProject ?? i18n.t(\"projectSelect.noProject\"),\n projectLabel:\n overrides?.projectLabel ?? i18n.t(\"projectSelect.projectLabel\"),\n projectLocked:\n overrides?.projectLocked ?? i18n.t(\"projectSelect.projectLocked\"),\n projectMissingTitle:\n overrides?.projectMissingTitle ??\n i18n.t(\"projectSelect.projectMissingTitle\"),\n projectUnavailable:\n overrides?.projectUnavailable ??\n i18n.t(\"projectSelect.projectUnavailable\")\n };\n}\n\nfunction resolveProjectCreationErrorLabel(\n error: unknown,\n labels: WorkspaceUserProjectSelectLabels\n): string {\n switch (getWorkspaceUserProjectErrorCode(error)) {\n case \"EEXIST\":\n case \"project_directory_already_exists\":\n return labels.createProjectNameConflict;\n case \"project_name_invalid\":\n return labels.createProjectNameInvalid;\n case \"EACCES\":\n case \"EPERM\":\n case \"project_directory_permission_denied\":\n return labels.createProjectPermissionDenied;\n case \"ENOENT\":\n case \"project_documents_unavailable\":\n return labels.createProjectDocumentsUnavailable;\n default:\n return labels.createProjectFailed;\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workspace-user-project",
3
- "version": "0.0.37",
3
+ "version": "0.0.38",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -36,8 +36,8 @@
36
36
  "directory": "packages/workspace/user-project"
37
37
  },
38
38
  "dependencies": {
39
- "@tutti-os/ui-i18n-runtime": "0.0.37",
40
- "@tutti-os/ui-system": "0.0.37",
39
+ "@tutti-os/ui-i18n-runtime": "0.0.38",
40
+ "@tutti-os/ui-system": "0.0.38",
41
41
  "valtio": "^2.3.2"
42
42
  },
43
43
  "devDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectCreationErrorCode,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput\n} from \"../contracts/index.ts\";\n\nexport function upsertWorkspaceUserProject(\n projects: readonly WorkspaceUserProject[],\n project: WorkspaceUserProject\n): WorkspaceUserProject[] {\n const existingIndex = projects.findIndex(\n (item) => item.id === project.id || item.path === project.path\n );\n if (existingIndex < 0) {\n return [project, ...projects];\n }\n const next = [...projects];\n next[existingIndex] = project;\n return next;\n}\n\nexport function resolveWorkspaceUserProjectDisplayLabel(\n project: Pick<WorkspaceUserProject, \"id\" | \"label\" | \"path\">\n): string {\n const label = stripAbsolutePathFromWorkspaceUserProjectLabel(project.label);\n if (label) {\n return label;\n }\n return basenameWorkspaceUserProjectPath(project.path) || project.id;\n}\n\nexport function stripAbsolutePathFromWorkspaceUserProjectLabel(\n label: string\n): string {\n const trimmedLabel = label.trim();\n if (!trimmedLabel) {\n return \"\";\n }\n const pathStart = findAbsolutePathStart(trimmedLabel);\n if (pathStart < 0) {\n return trimmedLabel;\n }\n if (pathStart === 0) {\n return basenameWorkspaceUserProjectPath(trimmedLabel);\n }\n return trimmedLabel\n .slice(0, pathStart)\n .replace(/[\\s/\\\\|:()[\\]{}-]+$/u, \"\")\n .trim();\n}\n\nexport function basenameWorkspaceUserProjectPath(path: string): string {\n const normalizedPath = path.trim().replace(/[\\\\/]+$/u, \"\");\n if (!normalizedPath) {\n return \"\";\n }\n const segments = normalizedPath.split(/[\\\\/]+/u);\n return segments[segments.length - 1] ?? \"\";\n}\n\nexport function getWorkspaceUserProjectErrorCode(\n error: unknown\n): WorkspaceUserProjectCreationErrorCode | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const code = (error as { code?: unknown }).code;\n if (typeof code === \"string\") {\n return code;\n }\n\n return getWorkspaceUserProjectErrorCode((error as { cause?: unknown }).cause);\n}\n\nexport async function prepareWorkspaceUserProjectSelection(\n api: WorkspaceUserProjectApi,\n input: WorkspaceUserProjectSelectionPreparationInput\n): Promise<WorkspaceUserProjectSelectionPreparation> {\n if (api.prepareSelection) {\n return api.prepareSelection(input);\n }\n const response = await api.list();\n const projects = response.projects;\n const selectedPath = input.selectedPath?.trim() ?? \"\";\n const isSelectedPathMissing =\n input.projectLocked && selectedPath\n ? await checkWorkspaceUserProjectPathMissing(api, selectedPath)\n : false;\n\n if (\n !input.projectLocked &&\n selectedPath &&\n !projects.some((project) => project.path === selectedPath)\n ) {\n await api.rememberDefaultSelection?.({ path: null });\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"clear\",\n suppressedPath: selectedPath\n }\n };\n }\n\n if (input.projectLocked || selectedPath) {\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n }\n\n const defaultSelection = await api.getDefaultSelection?.();\n const defaultPath = defaultSelection?.path?.trim() ?? \"\";\n if (defaultPath && projects.some((project) => project.path === defaultPath)) {\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"select\",\n path: defaultPath\n }\n };\n }\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n}\n\nexport async function checkWorkspaceUserProjectPathMissing(\n api: Pick<WorkspaceUserProjectApi, \"checkPath\">,\n path: string\n): Promise<boolean> {\n try {\n const result = await api.checkPath?.({ path });\n return result ? !result.exists || !result.isDirectory : false;\n } catch {\n return false;\n }\n}\n\nfunction findAbsolutePathStart(value: string): number {\n const indexes = [\n value.search(/\\/[^\\s/]/u),\n value.search(/[A-Za-z]:[\\\\/]/u),\n value.search(/\\\\\\\\[^\\s\\\\]/u),\n value.search(/~[\\\\/]/u)\n ].filter((index) => index >= 0);\n return indexes.length > 0 ? Math.min(...indexes) : -1;\n}\n"],"mappings":"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","names":[]}