@tutti-os/workspace-user-project 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -72,7 +72,7 @@ declare const workspaceUserProjectValtioStoreBrand: unique symbol;
72
72
  type WorkspaceUserProjectValtioStore = WorkspaceUserProjectServiceSnapshot & {
73
73
  readonly [workspaceUserProjectValtioStoreBrand]: true;
74
74
  };
75
- interface WorkspaceUserProjectServiceLike {
75
+ interface WorkspaceUserProjectService {
76
76
  checkProjectPath?(path: string): Promise<WorkspaceUserProjectPathCheck>;
77
77
  createProject?(name: string): Promise<WorkspaceUserProject>;
78
78
  ensureLoaded?(): Promise<void>;
@@ -98,4 +98,4 @@ interface WorkspaceUserProjectServiceLike {
98
98
  }
99
99
  type WorkspaceUserProjectCreationErrorCode = "EACCES" | "EEXIST" | "ENOENT" | "EPERM" | "project_directory_already_exists" | "project_directory_permission_denied" | "project_documents_unavailable" | "project_name_invalid" | (string & {});
100
100
 
101
- export type { WorkspaceUserProject, WorkspaceUserProjectApi, WorkspaceUserProjectCreationErrorCode, WorkspaceUserProjectDefaultSelection, WorkspaceUserProjectPathCheck, WorkspaceUserProjectSelectionPreparation, WorkspaceUserProjectSelectionPreparationInput, WorkspaceUserProjectServiceLike, WorkspaceUserProjectServiceSnapshot, WorkspaceUserProjectValtioStore };
101
+ export type { WorkspaceUserProject, WorkspaceUserProjectApi, WorkspaceUserProjectCreationErrorCode, WorkspaceUserProjectDefaultSelection, WorkspaceUserProjectPathCheck, WorkspaceUserProjectSelectionPreparation, WorkspaceUserProjectSelectionPreparationInput, WorkspaceUserProjectService, WorkspaceUserProjectServiceSnapshot, WorkspaceUserProjectValtioStore };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { WorkspaceUserProject, WorkspaceUserProjectApi, WorkspaceUserProjectCreationErrorCode, WorkspaceUserProjectDefaultSelection, WorkspaceUserProjectPathCheck, WorkspaceUserProjectSelectionPreparation, WorkspaceUserProjectSelectionPreparationInput, WorkspaceUserProjectServiceLike, WorkspaceUserProjectServiceSnapshot, WorkspaceUserProjectValtioStore } from './contracts/index.js';
1
+ export { WorkspaceUserProject, WorkspaceUserProjectApi, WorkspaceUserProjectCreationErrorCode, WorkspaceUserProjectDefaultSelection, WorkspaceUserProjectPathCheck, WorkspaceUserProjectSelectionPreparation, WorkspaceUserProjectSelectionPreparationInput, WorkspaceUserProjectService, WorkspaceUserProjectServiceSnapshot, WorkspaceUserProjectValtioStore } from './contracts/index.js';
2
2
  export { basenameWorkspaceUserProjectPath, checkWorkspaceUserProjectPathMissing, getWorkspaceUserProjectErrorCode, prepareWorkspaceUserProjectSelection, resolveWorkspaceUserProjectDisplayLabel, stripAbsolutePathFromWorkspaceUserProjectLabel, upsertWorkspaceUserProject } from './core/index.js';
3
3
  export { WorkspaceUserProjectI18nKey, WorkspaceUserProjectI18nRuntime, createDefaultWorkspaceUserProjectI18nRuntime, createWorkspaceUserProjectI18nRuntime, workspaceUserProjectI18nModule, workspaceUserProjectI18nNamespace, workspaceUserProjectI18nResources } from './i18n/index.js';
4
4
  import '@tutti-os/ui-i18n-runtime';
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { WorkspaceUserProjectApi, WorkspaceUserProjectServiceLike } from '../contracts/index.js';
2
+ import { WorkspaceUserProjectApi, WorkspaceUserProjectService } from '../contracts/index.js';
3
3
  import { WorkspaceUserProjectI18nRuntime } from '../i18n/index.js';
4
4
  import '@tutti-os/ui-i18n-runtime';
5
5
 
@@ -48,7 +48,7 @@ interface WorkspaceUserProjectSelectProps {
48
48
  renderAddProjectIcon?: () => ReactNode;
49
49
  shouldApplyPreparedSelection?: boolean;
50
50
  showKnownProjectOptions?: boolean;
51
- service?: WorkspaceUserProjectServiceLike | null;
51
+ service?: WorkspaceUserProjectService | null;
52
52
  selectedProjectPath?: string | null;
53
53
  showCreateProjectAction?: boolean;
54
54
  showNoProjectAction?: boolean;
package/dist/ui/index.js CHANGED
@@ -36,12 +36,65 @@ import {
36
36
  SelectContent,
37
37
  SelectItem,
38
38
  SelectSeparator,
39
- SelectTrigger
39
+ SelectTrigger,
40
+ cn
40
41
  } from "@tutti-os/ui-system";
41
42
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
42
43
  var noProjectOptionValue = "__nextop_no_project__";
43
44
  var addProjectOptionValue = "__nextop_add_project__";
44
45
  var linkExistingProjectOptionValue = "__nextop_link_existing_project__";
46
+ var workspaceUserProjectOverflowLabelStyle = `
47
+ @keyframes workspace-user-project-label-marquee {
48
+ 0% {
49
+ transform: translateX(0);
50
+ }
51
+
52
+ 44%,
53
+ 56% {
54
+ transform: translateX(min(0px, calc(100cqw - 100%)));
55
+ }
56
+
57
+ 88%,
58
+ 100% {
59
+ transform: translateX(0);
60
+ }
61
+ }
62
+
63
+ .workspace-user-project-overflow-label {
64
+ container-type: inline-size;
65
+ display: block;
66
+ flex: 1 1 0%;
67
+ min-width: 0;
68
+ overflow: hidden;
69
+ white-space: nowrap;
70
+ }
71
+
72
+ .workspace-user-project-overflow-label__content {
73
+ display: block;
74
+ max-width: 100%;
75
+ min-width: 100%;
76
+ overflow: hidden;
77
+ text-overflow: ellipsis;
78
+ transform: translateX(0);
79
+ white-space: nowrap;
80
+ width: max-content;
81
+ }
82
+
83
+ .workspace-user-project-overflow-label:hover
84
+ .workspace-user-project-overflow-label__content {
85
+ animation: workspace-user-project-label-marquee 14s linear infinite;
86
+ max-width: none;
87
+ overflow: visible;
88
+ text-overflow: clip;
89
+ }
90
+
91
+ @media (prefers-reduced-motion: reduce) {
92
+ .workspace-user-project-overflow-label:hover
93
+ .workspace-user-project-overflow-label__content {
94
+ animation: none;
95
+ }
96
+ }
97
+ `;
45
98
  var defaultWorkspaceUserProjectSelectI18n = createDefaultWorkspaceUserProjectI18nRuntime();
46
99
  var emptyWorkspaceUserProjectServiceSnapshot = proxy({
47
100
  error: null,
@@ -302,6 +355,7 @@ function WorkspaceUserProjectSelect({
302
355
  void useProjectPath(nextValue, "select_existing");
303
356
  };
304
357
  return /* @__PURE__ */ jsxs(Fragment, { children: [
358
+ /* @__PURE__ */ jsx("style", { children: workspaceUserProjectOverflowLabelStyle }),
305
359
  /* @__PURE__ */ jsxs(
306
360
  Select,
307
361
  {
@@ -324,7 +378,7 @@ function WorkspaceUserProjectSelect({
324
378
  size: 15
325
379
  }
326
380
  ),
327
- /* @__PURE__ */ jsx("span", { className: "truncate", children: triggerLabel })
381
+ /* @__PURE__ */ jsx(WorkspaceUserProjectOverflowLabel, { label: triggerLabel })
328
382
  ] })
329
383
  }
330
384
  ),
@@ -346,7 +400,7 @@ function WorkspaceUserProjectSelect({
346
400
  value: project.path,
347
401
  children: /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2 pr-1", children: [
348
402
  /* @__PURE__ */ jsx(FolderIcon, { "aria-hidden": true, size: 15 }),
349
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: /* @__PURE__ */ jsx("span", { children: projectLabel }) })
403
+ /* @__PURE__ */ jsx(WorkspaceUserProjectOverflowLabel, { label: projectLabel })
350
404
  ] })
351
405
  },
352
406
  project.id || project.path
@@ -475,6 +529,19 @@ function WorkspaceUserProjectSelect({
475
529
  ) : null
476
530
  ] });
477
531
  }
532
+ function WorkspaceUserProjectOverflowLabel({
533
+ className,
534
+ label
535
+ }) {
536
+ return /* @__PURE__ */ jsx(
537
+ "span",
538
+ {
539
+ className: cn("workspace-user-project-overflow-label", className),
540
+ "data-workspace-user-project-overflow-label": "true",
541
+ children: /* @__PURE__ */ jsx("span", { className: "workspace-user-project-overflow-label__content", children: label })
542
+ }
543
+ );
544
+ }
478
545
  function createWorkspaceUserProjectApiAdapter(api, service) {
479
546
  if (!service) {
480
547
  return api ?? null;
@@ -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 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 SelectItem,\n SelectSeparator,\n SelectTrigger\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput,\n WorkspaceUserProjectServiceLike\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?: WorkspaceUserProjectServiceLike | null;\n selectedProjectPath?: string | null;\n showCreateProjectAction?: boolean;\n showNoProjectAction?: boolean;\n unlistedProjectLabel?: string;\n}\n\nconst noProjectOptionValue = \"__nextop_no_project__\";\nconst addProjectOptionValue = \"__nextop_add_project__\";\nconst linkExistingProjectOptionValue = \"__nextop_link_existing_project__\";\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 [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\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 void useProjectPath(nextValue, \"select_existing\");\n };\n\n return (\n <>\n <Select\n disabled={disabled}\n value={selectValue}\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 className=\"flex min-w-0 flex-1 items-center gap-2\">\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 <span className=\"truncate\">{triggerLabel}</span>\n </span>\n </SelectTrigger>\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 <span className=\"min-w-0 flex-1 truncate\">\n <span>{projectLabel}</span>\n </span>\n </span>\n </SelectItem>\n );\n })}\n {visibleProjects.length > 0 ? <SelectSeparator /> : null}\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\">{resolvedLabels.addProject}</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\">{resolvedLabels.noProject}</span>\n </span>\n </SelectItem>\n ) : null}\n </SelectContent>\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 createWorkspaceUserProjectApiAdapter(\n api: WorkspaceUserProjectApi | null | undefined,\n service: WorkspaceUserProjectServiceLike | 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: WorkspaceUserProjectServiceLike | 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":[]}
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 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 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 = \"__nextop_no_project__\";\nconst addProjectOptionValue = \"__nextop_add_project__\";\nconst linkExistingProjectOptionValue = \"__nextop_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(min(0px, calc(100cqw - 100%)));\n }\n\n 88%,\n 100% {\n transform: translateX(0);\n }\n}\n\n.workspace-user-project-overflow-label {\n container-type: inline-size;\n display: block;\n flex: 1 1 0%;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\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:hover\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:hover\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 [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\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 void useProjectPath(nextValue, \"select_existing\");\n };\n\n return (\n <>\n <style>{workspaceUserProjectOverflowLabelStyle}</style>\n <Select\n disabled={disabled}\n value={selectValue}\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 className=\"flex min-w-0 flex-1 items-center gap-2\">\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 <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 {visibleProjects.length > 0 ? <SelectSeparator /> : null}\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\">{resolvedLabels.addProject}</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\">{resolvedLabels.noProject}</span>\n </span>\n </SelectItem>\n ) : null}\n </SelectContent>\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 return (\n <span\n className={cn(\"workspace-user-project-overflow-label\", className)}\n data-workspace-user-project-overflow-label=\"true\"\n >\n <span className=\"workspace-user-project-overflow-label__content\">\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,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,OACK;AAidH,mBACE,KAgBI,YAjBN;AAhYJ,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;AAoD/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,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;AAEH,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,SAAK,eAAe,WAAW,iBAAiB;AAAA,EAClD;AAEA,SACE,iCACE;AAAA,wBAAC,WAAO,kDAAuC;AAAA,IAC/C;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP,eAAe;AAAA,QAEf;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,cACE,gBACI,eAAe,gBACf,gBACE,eAAe,qBACf,eAAe;AAAA,cAEvB,WAAW,YAAY;AAAA,cAEvB,+BAAC,UAAK,WAAU,0CACb;AAAA,mCAAmB,8BAClB,oBAAC,cAAW,eAAW,MAAC,WAAU,YAAW,MAAM,IAAI,IAEvD;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW;AAAA,oBACX,WAAU;AAAA,oBACV,gDAA6C;AAAA,oBAC7C,MAAM;AAAA;AAAA,gBACR;AAAA,gBAEF,oBAAC,qCAAkC,OAAO,cAAc;AAAA,iBAC1D;AAAA;AAAA,UACF;AAAA,UACA;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,gBAAgB,SAAS,IAAI,oBAAC,mBAAgB,IAAK;AAAA,gBACnD,cAAc,kBACb;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,YAAY;AAAA,oBACvB,OAAO;AAAA,oBAEP,+BAAC,UAAK,WAAU,+CACd;AAAA,0CAAC,YAAS,eAAW,MAAC,MAAM,IAAI;AAAA,sBAChC,oBAAC,UAAK,WAAU,YACb,yBAAe,qBAClB;AAAA,uBACF;AAAA;AAAA,gBACF,IACE;AAAA,gBACH,0BACC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,YAAY;AAAA,oBACvB,OAAO;AAAA,oBAEP,+BAAC,UAAK,WAAU,+CACb;AAAA,6CAAuB,KACtB;AAAA,wBAAC;AAAA;AAAA,0BACC,eAAW;AAAA,0BACX,wCAAqC;AAAA,0BACrC,MAAM;AAAA;AAAA,sBACR;AAAA,sBAEF,oBAAC,UAAK,WAAU,YAAY,yBAAe,YAAW;AAAA,uBACxD;AAAA;AAAA,gBACF,IACE;AAAA,gBACH,sBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,YAAY;AAAA,oBACvB,OAAO;AAAA,oBAEP,+BAAC,UAAK,WAAU,+CACd;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,eAAW;AAAA,0BACX,wCAAqC;AAAA,0BACrC,MAAM;AAAA;AAAA,sBACR;AAAA,sBACA,oBAAC,UAAK,WAAU,YAAY,yBAAe,WAAU;AAAA,uBACvD;AAAA;AAAA,gBACF,IACE;AAAA;AAAA;AAAA,UACN;AAAA;AAAA;AAAA,IACF;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,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,yCAAyC,SAAS;AAAA,MAChE,8CAA2C;AAAA,MAE3C,8BAAC,UAAK,WAAU,kDACb,iBACH;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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workspace-user-project",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
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.6",
40
- "@tutti-os/ui-system": "0.0.6",
39
+ "@tutti-os/ui-i18n-runtime": "0.0.8",
40
+ "@tutti-os/ui-system": "0.0.8",
41
41
  "valtio": "^2.3.2"
42
42
  },
43
43
  "devDependencies": {