@shipfox/client-projects 22.0.3 → 24.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +45 -0
- package/dist/core/definition.d.ts +4 -2
- package/dist/core/definition.d.ts.map +1 -1
- package/dist/core/definition.js.map +1 -1
- package/dist/hooks/api/mappers.d.ts.map +1 -1
- package/dist/hooks/api/mappers.js +9 -5
- package/dist/hooks/api/mappers.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pages/projects-hub-page.d.ts.map +1 -1
- package/dist/pages/projects-hub-page.js +3 -0
- package/dist/pages/projects-hub-page.js.map +1 -1
- package/dist/pages/projects-hub-page.stories.d.ts.map +1 -1
- package/dist/pages/projects-hub-page.stories.js +22 -15
- package/dist/pages/projects-hub-page.stories.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/core/definition.ts +4 -2
- package/src/hooks/api/mappers.test.ts +22 -4
- package/src/hooks/api/mappers.ts +6 -4
- package/src/index.ts +6 -1
- package/src/pages/projects-hub-page.stories.tsx +17 -9
- package/src/pages/projects-hub-page.test.tsx +25 -0
- package/src/pages/projects-hub-page.tsx +3 -0
- package/test/pages.tsx +15 -6
- package/tsconfig.build.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$ shipfox-swc
|
|
2
|
-
Successfully compiled: 28 files with swc (
|
|
2
|
+
Successfully compiled: 28 files with swc (422.77ms)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# @shipfox/client-projects
|
|
2
2
|
|
|
3
|
+
## 24.0.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [a7804a8]
|
|
8
|
+
- Updated dependencies [989eb11]
|
|
9
|
+
- @shipfox/api-definitions-dto@15.0.0
|
|
10
|
+
- @shipfox/client-agent@24.0.0
|
|
11
|
+
- @shipfox/api-common-dto@15.0.0
|
|
12
|
+
- @shipfox/api-integration-core-dto@15.0.0
|
|
13
|
+
- @shipfox/client-ui@24.0.0
|
|
14
|
+
- @shipfox/api-projects-dto@15.0.0
|
|
15
|
+
- @shipfox/client-auth@24.0.0
|
|
16
|
+
- @shipfox/client-integrations@24.0.0
|
|
17
|
+
- @shipfox/client-shell@24.0.0
|
|
18
|
+
|
|
19
|
+
## 23.0.0
|
|
20
|
+
|
|
21
|
+
### Minor Changes
|
|
22
|
+
|
|
23
|
+
- 693e656: Adds the workspace-setup chrome slots (including a first-panel checklist slot on the projects hub), the ClientAnalytics seam, and the shell-owned setup-checklist dismissal flag.
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- f7b3db8: Replaces published definition warning exports and the sync `warnings` field with severity-aware diagnostics, including workflow file paths for the workflows UI.
|
|
28
|
+
|
|
29
|
+
Consumers must migrate from `warnings` to `diagnostics`; this release does not provide a legacy-field fallback.
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [693e656]
|
|
32
|
+
- Updated dependencies [c0fc35b]
|
|
33
|
+
- Updated dependencies [f7b3db8]
|
|
34
|
+
- Updated dependencies [4f30864]
|
|
35
|
+
- Updated dependencies [18e9bad]
|
|
36
|
+
- Updated dependencies [a4df8d9]
|
|
37
|
+
- Updated dependencies [aeaa0de]
|
|
38
|
+
- Updated dependencies [c44641f]
|
|
39
|
+
- Updated dependencies [1b71a66]
|
|
40
|
+
- @shipfox/client-shell@23.0.0
|
|
41
|
+
- @shipfox/api-definitions-dto@14.0.0
|
|
42
|
+
- @shipfox/api-integration-core-dto@14.0.0
|
|
43
|
+
- @shipfox/api-projects-dto@14.0.0
|
|
44
|
+
- @shipfox/client-agent@23.0.0
|
|
45
|
+
- @shipfox/client-auth@23.0.0
|
|
46
|
+
- @shipfox/client-integrations@23.0.0
|
|
47
|
+
|
|
3
48
|
## 22.0.3
|
|
4
49
|
|
|
5
50
|
### Patch Changes
|
|
@@ -23,12 +23,14 @@ export interface DefinitionSyncSummary {
|
|
|
23
23
|
finishedAt: string | null;
|
|
24
24
|
lastErrorCode: string | null;
|
|
25
25
|
lastErrorMessage: string | null;
|
|
26
|
-
|
|
26
|
+
diagnostics: DefinitionSyncDiagnostic[];
|
|
27
27
|
}
|
|
28
|
-
export interface
|
|
28
|
+
export interface DefinitionSyncDiagnostic {
|
|
29
29
|
code: string;
|
|
30
30
|
message: string;
|
|
31
31
|
path?: string | undefined;
|
|
32
|
+
filePath?: string | undefined;
|
|
33
|
+
severity: 'error' | 'warning';
|
|
32
34
|
}
|
|
33
35
|
export interface DefinitionList {
|
|
34
36
|
definitions: Definition[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/core/definition.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/core/definition.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,wBAAwB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/definition.ts"],"sourcesContent":["export interface Definition {\n id: string;\n projectId: string;\n configPath: string | null;\n source: 'manual' | 'vcs';\n sha: string | null;\n ref: string | null;\n name: string;\n workflowDocument: unknown;\n workflowModel: unknown;\n manualTrigger: {name: string} | null;\n fetchedAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DefinitionSyncSummary {\n ref: string | null;\n status: 'pending' | 'syncing' | 'succeeded' | 'failed';\n lastSyncAt: string;\n startedAt: string | null;\n finishedAt: string | null;\n lastErrorCode: string | null;\n lastErrorMessage: string | null;\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/definition.ts"],"sourcesContent":["export interface Definition {\n id: string;\n projectId: string;\n configPath: string | null;\n source: 'manual' | 'vcs';\n sha: string | null;\n ref: string | null;\n name: string;\n workflowDocument: unknown;\n workflowModel: unknown;\n manualTrigger: {name: string} | null;\n fetchedAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DefinitionSyncSummary {\n ref: string | null;\n status: 'pending' | 'syncing' | 'succeeded' | 'failed';\n lastSyncAt: string;\n startedAt: string | null;\n finishedAt: string | null;\n lastErrorCode: string | null;\n lastErrorMessage: string | null;\n diagnostics: DefinitionSyncDiagnostic[];\n}\n\nexport interface DefinitionSyncDiagnostic {\n code: string;\n message: string;\n path?: string | undefined;\n filePath?: string | undefined;\n severity: 'error' | 'warning';\n}\n\nexport interface DefinitionList {\n definitions: Definition[];\n sync: DefinitionSyncSummary | null;\n nextCursor: string | null;\n}\n"],"names":[],"mappings":"AAmCA,WAIC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AAC1F,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,KAAK,EAAC,OAAO,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE3D,wBAAgB,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAa1D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,WAAW,CAEd;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CAgB3D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,wBAAwB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AAC1F,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,KAAK,EAAC,OAAO,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE3D,wBAAgB,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAa1D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,WAAW,CAEd;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CAgB3D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,wBAAwB,GAAG,qBAAqB,CAiB5F;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,cAAc,CAMjB"}
|
|
@@ -44,11 +44,15 @@ export function toDefinitionSyncSummary(dto) {
|
|
|
44
44
|
finishedAt: dto.finished_at,
|
|
45
45
|
lastErrorCode: dto.last_error_code,
|
|
46
46
|
lastErrorMessage: dto.last_error_message,
|
|
47
|
-
|
|
48
|
-
code:
|
|
49
|
-
message:
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
diagnostics: dto.diagnostics.map((diagnostic)=>({
|
|
48
|
+
code: diagnostic.code,
|
|
49
|
+
message: diagnostic.message,
|
|
50
|
+
severity: diagnostic.severity,
|
|
51
|
+
...diagnostic.path === undefined ? {} : {
|
|
52
|
+
path: diagnostic.path
|
|
53
|
+
},
|
|
54
|
+
...diagnostic.file_path === undefined ? {} : {
|
|
55
|
+
filePath: diagnostic.file_path
|
|
52
56
|
}
|
|
53
57
|
}))
|
|
54
58
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/mappers.ts"],"sourcesContent":["import type {DefinitionDto, DefinitionSyncSummaryDto} from '@shipfox/api-definitions-dto';\nimport type {ProjectResponseDto} from '@shipfox/api-projects-dto';\nimport type {Definition, DefinitionList, DefinitionSyncSummary} from '#core/definition.js';\nimport type {Project, ProjectList} from '#core/project.js';\n\nexport function toProject(dto: ProjectResponseDto): Project {\n return {\n id: dto.id,\n workspaceId: dto.workspace_id,\n name: dto.name,\n slug: dto.slug,\n source: {\n connectionId: dto.source.connection_id,\n externalRepositoryId: dto.source.external_repository_id,\n },\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toProjectList(dto: {\n projects: ProjectResponseDto[];\n next_cursor: string | null;\n}): ProjectList {\n return {projects: dto.projects.map(toProject), nextCursor: dto.next_cursor};\n}\n\nexport function toDefinition(dto: DefinitionDto): Definition {\n return {\n id: dto.id,\n projectId: dto.project_id,\n configPath: dto.config_path,\n source: dto.source,\n sha: dto.sha,\n ref: dto.ref,\n name: dto.name,\n workflowDocument: dto.workflow_document,\n workflowModel: dto.workflow_model,\n manualTrigger: dto.manual_trigger,\n fetchedAt: dto.fetched_at,\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toDefinitionSyncSummary(dto: DefinitionSyncSummaryDto): DefinitionSyncSummary {\n return {\n ref: dto.ref,\n status: dto.status,\n lastSyncAt: dto.last_sync_at,\n startedAt: dto.started_at,\n finishedAt: dto.finished_at,\n lastErrorCode: dto.last_error_code,\n lastErrorMessage: dto.last_error_message,\n
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/mappers.ts"],"sourcesContent":["import type {DefinitionDto, DefinitionSyncSummaryDto} from '@shipfox/api-definitions-dto';\nimport type {ProjectResponseDto} from '@shipfox/api-projects-dto';\nimport type {Definition, DefinitionList, DefinitionSyncSummary} from '#core/definition.js';\nimport type {Project, ProjectList} from '#core/project.js';\n\nexport function toProject(dto: ProjectResponseDto): Project {\n return {\n id: dto.id,\n workspaceId: dto.workspace_id,\n name: dto.name,\n slug: dto.slug,\n source: {\n connectionId: dto.source.connection_id,\n externalRepositoryId: dto.source.external_repository_id,\n },\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toProjectList(dto: {\n projects: ProjectResponseDto[];\n next_cursor: string | null;\n}): ProjectList {\n return {projects: dto.projects.map(toProject), nextCursor: dto.next_cursor};\n}\n\nexport function toDefinition(dto: DefinitionDto): Definition {\n return {\n id: dto.id,\n projectId: dto.project_id,\n configPath: dto.config_path,\n source: dto.source,\n sha: dto.sha,\n ref: dto.ref,\n name: dto.name,\n workflowDocument: dto.workflow_document,\n workflowModel: dto.workflow_model,\n manualTrigger: dto.manual_trigger,\n fetchedAt: dto.fetched_at,\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toDefinitionSyncSummary(dto: DefinitionSyncSummaryDto): DefinitionSyncSummary {\n return {\n ref: dto.ref,\n status: dto.status,\n lastSyncAt: dto.last_sync_at,\n startedAt: dto.started_at,\n finishedAt: dto.finished_at,\n lastErrorCode: dto.last_error_code,\n lastErrorMessage: dto.last_error_message,\n diagnostics: dto.diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n message: diagnostic.message,\n severity: diagnostic.severity,\n ...(diagnostic.path === undefined ? {} : {path: diagnostic.path}),\n ...(diagnostic.file_path === undefined ? {} : {filePath: diagnostic.file_path}),\n })),\n };\n}\n\nexport function toDefinitionList(dto: {\n definitions: DefinitionDto[];\n sync: DefinitionSyncSummaryDto | null;\n next_cursor: string | null;\n}): DefinitionList {\n return {\n definitions: dto.definitions.map(toDefinition),\n sync: dto.sync && toDefinitionSyncSummary(dto.sync),\n nextCursor: dto.next_cursor,\n };\n}\n"],"names":["toProject","dto","id","workspaceId","workspace_id","name","slug","source","connectionId","connection_id","externalRepositoryId","external_repository_id","createdAt","created_at","updatedAt","updated_at","toProjectList","projects","map","nextCursor","next_cursor","toDefinition","projectId","project_id","configPath","config_path","sha","ref","workflowDocument","workflow_document","workflowModel","workflow_model","manualTrigger","manual_trigger","fetchedAt","fetched_at","toDefinitionSyncSummary","status","lastSyncAt","last_sync_at","startedAt","started_at","finishedAt","finished_at","lastErrorCode","last_error_code","lastErrorMessage","last_error_message","diagnostics","diagnostic","code","message","severity","path","undefined","file_path","filePath","toDefinitionList","definitions","sync"],"mappings":"AAKA,OAAO,SAASA,UAAUC,GAAuB;IAC/C,OAAO;QACLC,IAAID,IAAIC,EAAE;QACVC,aAAaF,IAAIG,YAAY;QAC7BC,MAAMJ,IAAII,IAAI;QACdC,MAAML,IAAIK,IAAI;QACdC,QAAQ;YACNC,cAAcP,IAAIM,MAAM,CAACE,aAAa;YACtCC,sBAAsBT,IAAIM,MAAM,CAACI,sBAAsB;QACzD;QACAC,WAAWX,IAAIY,UAAU;QACzBC,WAAWb,IAAIc,UAAU;IAC3B;AACF;AAEA,OAAO,SAASC,cAAcf,GAG7B;IACC,OAAO;QAACgB,UAAUhB,IAAIgB,QAAQ,CAACC,GAAG,CAAClB;QAAYmB,YAAYlB,IAAImB,WAAW;IAAA;AAC5E;AAEA,OAAO,SAASC,aAAapB,GAAkB;IAC7C,OAAO;QACLC,IAAID,IAAIC,EAAE;QACVoB,WAAWrB,IAAIsB,UAAU;QACzBC,YAAYvB,IAAIwB,WAAW;QAC3BlB,QAAQN,IAAIM,MAAM;QAClBmB,KAAKzB,IAAIyB,GAAG;QACZC,KAAK1B,IAAI0B,GAAG;QACZtB,MAAMJ,IAAII,IAAI;QACduB,kBAAkB3B,IAAI4B,iBAAiB;QACvCC,eAAe7B,IAAI8B,cAAc;QACjCC,eAAe/B,IAAIgC,cAAc;QACjCC,WAAWjC,IAAIkC,UAAU;QACzBvB,WAAWX,IAAIY,UAAU;QACzBC,WAAWb,IAAIc,UAAU;IAC3B;AACF;AAEA,OAAO,SAASqB,wBAAwBnC,GAA6B;IACnE,OAAO;QACL0B,KAAK1B,IAAI0B,GAAG;QACZU,QAAQpC,IAAIoC,MAAM;QAClBC,YAAYrC,IAAIsC,YAAY;QAC5BC,WAAWvC,IAAIwC,UAAU;QACzBC,YAAYzC,IAAI0C,WAAW;QAC3BC,eAAe3C,IAAI4C,eAAe;QAClCC,kBAAkB7C,IAAI8C,kBAAkB;QACxCC,aAAa/C,IAAI+C,WAAW,CAAC9B,GAAG,CAAC,CAAC+B,aAAgB,CAAA;gBAChDC,MAAMD,WAAWC,IAAI;gBACrBC,SAASF,WAAWE,OAAO;gBAC3BC,UAAUH,WAAWG,QAAQ;gBAC7B,GAAIH,WAAWI,IAAI,KAAKC,YAAY,CAAC,IAAI;oBAACD,MAAMJ,WAAWI,IAAI;gBAAA,CAAC;gBAChE,GAAIJ,WAAWM,SAAS,KAAKD,YAAY,CAAC,IAAI;oBAACE,UAAUP,WAAWM,SAAS;gBAAA,CAAC;YAChF,CAAA;IACF;AACF;AAEA,OAAO,SAASE,iBAAiBxD,GAIhC;IACC,OAAO;QACLyD,aAAazD,IAAIyD,WAAW,CAACxC,GAAG,CAACG;QACjCsC,MAAM1D,IAAI0D,IAAI,IAAIvB,wBAAwBnC,IAAI0D,IAAI;QAClDxC,YAAYlB,IAAImB,WAAW;IAC7B;AACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { Definition, DefinitionList, DefinitionSyncSummary } from '#core/definition.js';
|
|
1
|
+
export type { Definition, DefinitionList, DefinitionSyncDiagnostic, DefinitionSyncSummary, } from '#core/definition.js';
|
|
2
2
|
export { type CreateProjectCommand, type Project, type ProjectList, type ProjectSource, projectNameFromRepository, selectProjectSource, type UpdateProjectCommand, } from '#core/project.js';
|
|
3
3
|
export { ProjectBreadcrumb, resolveProjectSlug, useActiveProject, useMaybeActiveProject, useMaybeActiveProjectQuery, } from './chrome.js';
|
|
4
4
|
export { ProjectCrumb, type ProjectCrumbProps } from './components/project-crumb.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,YAAY,EAAE,KAAK,iBAAiB,EAAC,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAC,eAAe,EAAE,KAAK,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AAC5F,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AACzD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {Definition
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {\n Definition,\n DefinitionList,\n DefinitionSyncDiagnostic,\n DefinitionSyncSummary,\n} from '#core/definition.js';\nexport {\n type CreateProjectCommand,\n type Project,\n type ProjectList,\n type ProjectSource,\n projectNameFromRepository,\n selectProjectSource,\n type UpdateProjectCommand,\n} from '#core/project.js';\nexport {\n ProjectBreadcrumb,\n resolveProjectSlug,\n useActiveProject,\n useMaybeActiveProject,\n useMaybeActiveProjectQuery,\n} from './chrome.js';\nexport {ProjectCrumb, type ProjectCrumbProps} from './components/project-crumb.js';\nexport {ProjectSwitcher, type ProjectSwitcherProps} from './components/project-switcher.js';\nexport {SourceStrip} from './components/source-strip.js';\nexport * from './hooks/api/definitions.js';\nexport * from './hooks/api/projects.js';\nexport * from './pages/create-project-page.js';\nexport * from './pages/home-router.js';\nexport {ProjectSettingsPage} from './pages/project-settings-page.js';\nexport * from './pages/projects-hub-page.js';\nexport * from './project-error.js';\n"],"names":["projectNameFromRepository","selectProjectSource","ProjectBreadcrumb","resolveProjectSlug","useActiveProject","useMaybeActiveProject","useMaybeActiveProjectQuery","ProjectCrumb","ProjectSwitcher","SourceStrip","ProjectSettingsPage"],"mappings":"AAMA,SAKEA,yBAAyB,EACzBC,mBAAmB,QAEd,mBAAmB;AAC1B,SACEC,iBAAiB,EACjBC,kBAAkB,EAClBC,gBAAgB,EAChBC,qBAAqB,EACrBC,0BAA0B,QACrB,cAAc;AACrB,SAAQC,YAAY,QAA+B,gCAAgC;AACnF,SAAQC,eAAe,QAAkC,mCAAmC;AAC5F,SAAQC,WAAW,QAAO,+BAA+B;AACzD,cAAc,6BAA6B;AAC3C,cAAc,0BAA0B;AACxC,cAAc,iCAAiC;AAC/C,cAAc,yBAAyB;AACvC,SAAQC,mBAAmB,QAAO,mCAAmC;AACrE,cAAc,+BAA+B;AAC7C,cAAc,qBAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-hub-page.d.ts","sourceRoot":"","sources":["../../src/pages/projects-hub-page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projects-hub-page.d.ts","sourceRoot":"","sources":["../../src/pages/projects-hub-page.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,eAAe,CAAC,EAAC,MAAW,EAAC,EAAE;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,+BA0H/D"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useActiveWorkspace } from '@shipfox/client-auth';
|
|
3
3
|
import { ConnectionStatusBadge, IntegrationIcon, useIntegrationConnectionsQuery } from '@shipfox/client-integrations';
|
|
4
|
+
import { useChrome } from '@shipfox/client-shell/runtime';
|
|
4
5
|
import { QueryLoadError } from '@shipfox/client-ui';
|
|
5
6
|
import { Button } from '@shipfox/react-ui/button';
|
|
6
7
|
import { Callout } from '@shipfox/react-ui/callout';
|
|
@@ -15,6 +16,7 @@ import { ModelProviderReminderBanner } from '#components/model-provider-reminder
|
|
|
15
16
|
import { useProjectsInfiniteQuery } from '#hooks/api/projects.js';
|
|
16
17
|
export function ProjectsHubPage({ search = '' }) {
|
|
17
18
|
const workspace = useActiveWorkspace();
|
|
19
|
+
const { WorkspaceSetupChecklist } = useChrome();
|
|
18
20
|
const navigate = useNavigate();
|
|
19
21
|
const query = useProjectsInfiniteQuery(workspace.id, search || undefined);
|
|
20
22
|
const projects = query.data?.pages.flatMap((page)=>page.projects) ?? [];
|
|
@@ -32,6 +34,7 @@ export function ProjectsHubPage({ search = '' }) {
|
|
|
32
34
|
return /*#__PURE__*/ _jsxs("div", {
|
|
33
35
|
className: "flex w-full flex-col gap-section",
|
|
34
36
|
children: [
|
|
37
|
+
WorkspaceSetupChecklist ? /*#__PURE__*/ _jsx(WorkspaceSetupChecklist, {}) : null,
|
|
35
38
|
/*#__PURE__*/ _jsx(ModelProviderReminderBanner, {
|
|
36
39
|
workspaceId: workspace.id
|
|
37
40
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/projects-hub-page.tsx"],"sourcesContent":["import {useActiveWorkspace} from '@shipfox/client-auth';\nimport {\n ConnectionStatusBadge,\n type IntegrationConnection,\n IntegrationIcon,\n useIntegrationConnectionsQuery,\n} from '@shipfox/client-integrations';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Input} from '@shipfox/react-ui/input';\nimport {\n Panel,\n PanelActions,\n PanelBody,\n PanelCell,\n PanelCellAction,\n PanelGrid,\n PanelHeader,\n} from '@shipfox/react-ui/panel';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link, useNavigate} from '@tanstack/react-router';\nimport {ModelProviderReminderBanner} from '#components/model-provider-reminder-banner.js';\nimport type {Project} from '#core/project.js';\nimport {useProjectsInfiniteQuery} from '#hooks/api/projects.js';\n\nexport function ProjectsHubPage({search = ''}: {search?: string}) {\n const workspace = useActiveWorkspace();\n const navigate = useNavigate();\n const query = useProjectsInfiniteQuery(workspace.id, search || undefined);\n const projects = query.data?.pages.flatMap((page) => page.projects) ?? [];\n\n // The provider logo and connection health live on the integration connection,\n // not the project, so resolve them once for the whole list and index by id.\n // Skip the fetch when there are no cards to annotate.\n const connectionsQuery = useIntegrationConnectionsQuery(\n projects.length > 0 ? workspace.id : undefined,\n );\n const connectionsById = new Map(\n (connectionsQuery.data ?? []).map((connection) => [connection.id, connection]),\n );\n\n const isInitialLoading = query.isPending;\n const isSearching = Boolean(search) && query.isFetching && !query.isFetchingNextPage;\n const hasNoData = !query.data;\n\n return (\n <div className=\"flex w-full flex-col gap-section\">\n <ModelProviderReminderBanner workspaceId={workspace.id} />\n\n <section aria-label=\"Projects\">\n <Panel>\n <PanelHeader className=\"flex-wrap max-[640px]:items-stretch\">\n <div className=\"min-w-0 flex-1 max-[640px]:basis-full\">\n <Input\n type=\"search\"\n value={search}\n onChange={(event) => {\n const next = event.target.value.trim();\n navigate({search: (next ? {search: next} : {}) as never, replace: true});\n }}\n placeholder=\"Search projects…\"\n aria-label=\"Search projects\"\n iconLeft={<Icon name=\"searchLine\" className=\"size-16\" />}\n iconRight={\n isSearching ? (\n <Icon\n name=\"spinner\"\n size={16}\n className=\"text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n ) : undefined\n }\n />\n </div>\n <PanelActions className=\"max-[640px]:ml-0 max-[640px]:w-full\">\n <Button asChild iconLeft=\"addLine\" className=\"max-[640px]:w-full\">\n <Link to=\"/w/$workspaceSlug/projects/new\" params={{workspaceSlug: workspace.slug}}>\n New project\n </Link>\n </Button>\n </PanelActions>\n </PanelHeader>\n\n <PanelBody>\n {isInitialLoading || (search && hasNoData && query.isFetching) ? (\n <ProjectsSkeleton />\n ) : null}\n\n {query.isError && hasNoData ? (\n <QueryLoadError query={query} subject=\"projects\" variant=\"panel\" />\n ) : null}\n\n {!isInitialLoading && !query.isError && projects.length === 0 && !search ? (\n <EmptyProjects workspaceSlug={workspace.slug} />\n ) : null}\n\n {!query.isFetching && !query.isError && projects.length === 0 && search ? (\n <NoSearchResults\n search={search}\n onClear={() => navigate({search: {} as never, replace: true})}\n />\n ) : null}\n\n {projects.length > 0 ? (\n <>\n <PanelGrid aria-label=\"Projects list\">\n {projects.map((project) => (\n <ProjectCell\n project={project}\n connection={connectionsById.get(project.source.connectionId)}\n connectionsResolved={connectionsQuery.isSuccess}\n connectionsSettled={connectionsQuery.isSuccess || connectionsQuery.isError}\n key={project.id}\n workspaceSlug={workspace.slug}\n />\n ))}\n </PanelGrid>\n {query.error && query.data ? (\n <div className=\"border-t border-border-neutral-base p-panel-compact\">\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">\n Could not load the next page. Existing projects are still shown.\n </Text>\n </Callout>\n </div>\n ) : null}\n {query.hasNextPage ? (\n <div className=\"flex justify-center border-t border-border-neutral-base p-panel-compact\">\n <Button\n variant=\"secondary\"\n isLoading={query.isFetchingNextPage}\n onClick={() => query.fetchNextPage()}\n >\n Load more\n </Button>\n </div>\n ) : null}\n </>\n ) : null}\n </PanelBody>\n </Panel>\n </section>\n </div>\n );\n}\n\nfunction ProjectsSkeleton() {\n return (\n <PanelGrid role=\"status\" aria-label=\"Loading projects\">\n {[0, 1, 2, 3, 4, 5].map((row) => (\n <PanelCell key={row}>\n <div className=\"flex items-center gap-cluster px-row py-row\">\n <Skeleton className=\"size-24 shrink-0\" />\n <Skeleton className=\"h-16 w-1/2\" />\n </div>\n </PanelCell>\n ))}\n </PanelGrid>\n );\n}\n\nfunction EmptyProjects({workspaceSlug}: {workspaceSlug: string}) {\n return (\n <EmptyState\n icon=\"folderLine\"\n title=\"Create your first project\"\n description=\"Connect a repository-backed project to start building workflows.\"\n variant=\"panel\"\n action={\n <Button asChild iconRight=\"chevronRight\">\n <Link to=\"/w/$workspaceSlug/projects/new\" params={{workspaceSlug}}>\n Create project\n </Link>\n </Button>\n }\n />\n );\n}\n\nfunction NoSearchResults({search, onClear}: {search: string; onClear: () => void}) {\n return (\n <EmptyState\n icon=\"searchLine\"\n title={`No projects match “${search}”`}\n description=\"Try a different search, or clear it to see all projects.\"\n variant=\"panel\"\n action={\n <Button size=\"sm\" variant=\"secondary\" onClick={onClear}>\n Clear search\n </Button>\n }\n />\n );\n}\n\nfunction ProjectCell({\n project,\n connection,\n connectionsResolved,\n connectionsSettled,\n workspaceSlug,\n}: {\n project: Project;\n connection: IntegrationConnection | undefined;\n connectionsResolved: boolean;\n connectionsSettled: boolean;\n workspaceSlug: string;\n}) {\n // On a resolved fetch, `active` carries no badge while a missing connection\n // reads as an error so a broken source is still flagged. An unresolved or\n // failed fetch shows nothing, so a fetch failure never flags every card.\n const status = connectionsResolved ? (connection?.lifecycleStatus ?? 'error') : undefined;\n\n return (\n <PanelCell>\n <PanelCellAction asChild>\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug\"\n params={{workspaceSlug, projectSlug: project.slug}}\n >\n {/* Settle on success or error: a failed fetch falls back to the\n neutral provider icon rather than spinning forever. */}\n {connectionsSettled ? (\n <IntegrationIcon\n source={connection?.provider}\n aria-hidden\n className=\"size-24 shrink-0 text-foreground-neutral-base\"\n />\n ) : (\n <Skeleton className=\"size-24 shrink-0\" />\n )}\n <span className=\"flex min-w-0 flex-1 items-center gap-inline\">\n <Text as=\"span\" size=\"md\" bold className=\"truncate\">\n {project.name}\n </Text>\n {status ? <ConnectionStatusBadge status={status} className=\"shrink-0\" /> : null}\n </span>\n </Link>\n </PanelCellAction>\n </PanelCell>\n );\n}\n"],"names":["useActiveWorkspace","ConnectionStatusBadge","IntegrationIcon","useIntegrationConnectionsQuery","QueryLoadError","Button","Callout","EmptyState","Icon","Input","Panel","PanelActions","PanelBody","PanelCell","PanelCellAction","PanelGrid","PanelHeader","Skeleton","Text","Link","useNavigate","ModelProviderReminderBanner","useProjectsInfiniteQuery","ProjectsHubPage","search","workspace","navigate","query","id","undefined","projects","data","pages","flatMap","page","connectionsQuery","length","connectionsById","Map","map","connection","isInitialLoading","isPending","isSearching","Boolean","isFetching","isFetchingNextPage","hasNoData","div","className","workspaceId","section","aria-label","type","value","onChange","event","next","target","trim","replace","placeholder","iconLeft","name","iconRight","size","aria-hidden","asChild","to","params","workspaceSlug","slug","ProjectsSkeleton","isError","subject","variant","EmptyProjects","NoSearchResults","onClear","project","ProjectCell","get","source","connectionId","connectionsResolved","isSuccess","connectionsSettled","error","role","hasNextPage","isLoading","onClick","fetchNextPage","row","icon","title","description","action","status","lifecycleStatus","projectSlug","provider","span","as","bold"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/pages/projects-hub-page.tsx"],"sourcesContent":["import {useActiveWorkspace} from '@shipfox/client-auth';\nimport {\n ConnectionStatusBadge,\n type IntegrationConnection,\n IntegrationIcon,\n useIntegrationConnectionsQuery,\n} from '@shipfox/client-integrations';\nimport {useChrome} from '@shipfox/client-shell/runtime';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Input} from '@shipfox/react-ui/input';\nimport {\n Panel,\n PanelActions,\n PanelBody,\n PanelCell,\n PanelCellAction,\n PanelGrid,\n PanelHeader,\n} from '@shipfox/react-ui/panel';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link, useNavigate} from '@tanstack/react-router';\nimport {ModelProviderReminderBanner} from '#components/model-provider-reminder-banner.js';\nimport type {Project} from '#core/project.js';\nimport {useProjectsInfiniteQuery} from '#hooks/api/projects.js';\n\nexport function ProjectsHubPage({search = ''}: {search?: string}) {\n const workspace = useActiveWorkspace();\n const {WorkspaceSetupChecklist} = useChrome();\n const navigate = useNavigate();\n const query = useProjectsInfiniteQuery(workspace.id, search || undefined);\n const projects = query.data?.pages.flatMap((page) => page.projects) ?? [];\n\n // The provider logo and connection health live on the integration connection,\n // not the project, so resolve them once for the whole list and index by id.\n // Skip the fetch when there are no cards to annotate.\n const connectionsQuery = useIntegrationConnectionsQuery(\n projects.length > 0 ? workspace.id : undefined,\n );\n const connectionsById = new Map(\n (connectionsQuery.data ?? []).map((connection) => [connection.id, connection]),\n );\n\n const isInitialLoading = query.isPending;\n const isSearching = Boolean(search) && query.isFetching && !query.isFetchingNextPage;\n const hasNoData = !query.data;\n\n return (\n <div className=\"flex w-full flex-col gap-section\">\n {WorkspaceSetupChecklist ? <WorkspaceSetupChecklist /> : null}\n <ModelProviderReminderBanner workspaceId={workspace.id} />\n\n <section aria-label=\"Projects\">\n <Panel>\n <PanelHeader className=\"flex-wrap max-[640px]:items-stretch\">\n <div className=\"min-w-0 flex-1 max-[640px]:basis-full\">\n <Input\n type=\"search\"\n value={search}\n onChange={(event) => {\n const next = event.target.value.trim();\n navigate({search: (next ? {search: next} : {}) as never, replace: true});\n }}\n placeholder=\"Search projects…\"\n aria-label=\"Search projects\"\n iconLeft={<Icon name=\"searchLine\" className=\"size-16\" />}\n iconRight={\n isSearching ? (\n <Icon\n name=\"spinner\"\n size={16}\n className=\"text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n ) : undefined\n }\n />\n </div>\n <PanelActions className=\"max-[640px]:ml-0 max-[640px]:w-full\">\n <Button asChild iconLeft=\"addLine\" className=\"max-[640px]:w-full\">\n <Link to=\"/w/$workspaceSlug/projects/new\" params={{workspaceSlug: workspace.slug}}>\n New project\n </Link>\n </Button>\n </PanelActions>\n </PanelHeader>\n\n <PanelBody>\n {isInitialLoading || (search && hasNoData && query.isFetching) ? (\n <ProjectsSkeleton />\n ) : null}\n\n {query.isError && hasNoData ? (\n <QueryLoadError query={query} subject=\"projects\" variant=\"panel\" />\n ) : null}\n\n {!isInitialLoading && !query.isError && projects.length === 0 && !search ? (\n <EmptyProjects workspaceSlug={workspace.slug} />\n ) : null}\n\n {!query.isFetching && !query.isError && projects.length === 0 && search ? (\n <NoSearchResults\n search={search}\n onClear={() => navigate({search: {} as never, replace: true})}\n />\n ) : null}\n\n {projects.length > 0 ? (\n <>\n <PanelGrid aria-label=\"Projects list\">\n {projects.map((project) => (\n <ProjectCell\n project={project}\n connection={connectionsById.get(project.source.connectionId)}\n connectionsResolved={connectionsQuery.isSuccess}\n connectionsSettled={connectionsQuery.isSuccess || connectionsQuery.isError}\n key={project.id}\n workspaceSlug={workspace.slug}\n />\n ))}\n </PanelGrid>\n {query.error && query.data ? (\n <div className=\"border-t border-border-neutral-base p-panel-compact\">\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">\n Could not load the next page. Existing projects are still shown.\n </Text>\n </Callout>\n </div>\n ) : null}\n {query.hasNextPage ? (\n <div className=\"flex justify-center border-t border-border-neutral-base p-panel-compact\">\n <Button\n variant=\"secondary\"\n isLoading={query.isFetchingNextPage}\n onClick={() => query.fetchNextPage()}\n >\n Load more\n </Button>\n </div>\n ) : null}\n </>\n ) : null}\n </PanelBody>\n </Panel>\n </section>\n </div>\n );\n}\n\nfunction ProjectsSkeleton() {\n return (\n <PanelGrid role=\"status\" aria-label=\"Loading projects\">\n {[0, 1, 2, 3, 4, 5].map((row) => (\n <PanelCell key={row}>\n <div className=\"flex items-center gap-cluster px-row py-row\">\n <Skeleton className=\"size-24 shrink-0\" />\n <Skeleton className=\"h-16 w-1/2\" />\n </div>\n </PanelCell>\n ))}\n </PanelGrid>\n );\n}\n\nfunction EmptyProjects({workspaceSlug}: {workspaceSlug: string}) {\n return (\n <EmptyState\n icon=\"folderLine\"\n title=\"Create your first project\"\n description=\"Connect a repository-backed project to start building workflows.\"\n variant=\"panel\"\n action={\n <Button asChild iconRight=\"chevronRight\">\n <Link to=\"/w/$workspaceSlug/projects/new\" params={{workspaceSlug}}>\n Create project\n </Link>\n </Button>\n }\n />\n );\n}\n\nfunction NoSearchResults({search, onClear}: {search: string; onClear: () => void}) {\n return (\n <EmptyState\n icon=\"searchLine\"\n title={`No projects match “${search}”`}\n description=\"Try a different search, or clear it to see all projects.\"\n variant=\"panel\"\n action={\n <Button size=\"sm\" variant=\"secondary\" onClick={onClear}>\n Clear search\n </Button>\n }\n />\n );\n}\n\nfunction ProjectCell({\n project,\n connection,\n connectionsResolved,\n connectionsSettled,\n workspaceSlug,\n}: {\n project: Project;\n connection: IntegrationConnection | undefined;\n connectionsResolved: boolean;\n connectionsSettled: boolean;\n workspaceSlug: string;\n}) {\n // On a resolved fetch, `active` carries no badge while a missing connection\n // reads as an error so a broken source is still flagged. An unresolved or\n // failed fetch shows nothing, so a fetch failure never flags every card.\n const status = connectionsResolved ? (connection?.lifecycleStatus ?? 'error') : undefined;\n\n return (\n <PanelCell>\n <PanelCellAction asChild>\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug\"\n params={{workspaceSlug, projectSlug: project.slug}}\n >\n {/* Settle on success or error: a failed fetch falls back to the\n neutral provider icon rather than spinning forever. */}\n {connectionsSettled ? (\n <IntegrationIcon\n source={connection?.provider}\n aria-hidden\n className=\"size-24 shrink-0 text-foreground-neutral-base\"\n />\n ) : (\n <Skeleton className=\"size-24 shrink-0\" />\n )}\n <span className=\"flex min-w-0 flex-1 items-center gap-inline\">\n <Text as=\"span\" size=\"md\" bold className=\"truncate\">\n {project.name}\n </Text>\n {status ? <ConnectionStatusBadge status={status} className=\"shrink-0\" /> : null}\n </span>\n </Link>\n </PanelCellAction>\n </PanelCell>\n );\n}\n"],"names":["useActiveWorkspace","ConnectionStatusBadge","IntegrationIcon","useIntegrationConnectionsQuery","useChrome","QueryLoadError","Button","Callout","EmptyState","Icon","Input","Panel","PanelActions","PanelBody","PanelCell","PanelCellAction","PanelGrid","PanelHeader","Skeleton","Text","Link","useNavigate","ModelProviderReminderBanner","useProjectsInfiniteQuery","ProjectsHubPage","search","workspace","WorkspaceSetupChecklist","navigate","query","id","undefined","projects","data","pages","flatMap","page","connectionsQuery","length","connectionsById","Map","map","connection","isInitialLoading","isPending","isSearching","Boolean","isFetching","isFetchingNextPage","hasNoData","div","className","workspaceId","section","aria-label","type","value","onChange","event","next","target","trim","replace","placeholder","iconLeft","name","iconRight","size","aria-hidden","asChild","to","params","workspaceSlug","slug","ProjectsSkeleton","isError","subject","variant","EmptyProjects","NoSearchResults","onClear","project","ProjectCell","get","source","connectionId","connectionsResolved","isSuccess","connectionsSettled","error","role","hasNextPage","isLoading","onClick","fetchNextPage","row","icon","title","description","action","status","lifecycleStatus","projectSlug","provider","span","as","bold"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-hub-page.stories.d.ts","sourceRoot":"","sources":["../../src/pages/projects-hub-page.stories.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projects-hub-page.stories.d.ts","sourceRoot":"","sources":["../../src/pages/projects-hub-page.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAO,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAiBrD,KAAK,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAcvD,iBAAS,oBAAoB,CAAC,EAAC,QAAQ,EAAC,EAAE;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAC,+BAoC7D;AAED,QAAA,MAAM,IAAI;;;;QAGK,MAAM;;;;;CAEwB,CAAC;eAE/B,IAAI;AACnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAAU,CAAC;AAEpC,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { configureApiClient } from '@shipfox/client-api';
|
|
3
3
|
import { authStateAtom } from '@shipfox/client-auth';
|
|
4
|
+
import { ChromeProvider } from '@shipfox/client-shell/runtime';
|
|
4
5
|
import { Toaster } from '@shipfox/react-ui/toast';
|
|
5
6
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
6
7
|
import { createMemoryHistory, createRootRoute, createRoute, createRouter, Outlet, RouterProvider } from '@tanstack/react-router';
|
|
@@ -45,22 +46,28 @@ function ProjectsHubPageStory({ scenario }) {
|
|
|
45
46
|
return nextStore;
|
|
46
47
|
}, []);
|
|
47
48
|
const router = useMemo(()=>createStoryRouter(), []);
|
|
48
|
-
return /*#__PURE__*/ _jsx(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
return /*#__PURE__*/ _jsx(ChromeProvider, {
|
|
50
|
+
chrome: {
|
|
51
|
+
ProjectBreadcrumb: ()=>null,
|
|
52
|
+
projectSlugResolver: async ()=>undefined
|
|
53
|
+
},
|
|
54
|
+
children: /*#__PURE__*/ _jsx(QueryClientProvider, {
|
|
55
|
+
client: queryClient,
|
|
56
|
+
children: /*#__PURE__*/ _jsxs(JotaiProvider, {
|
|
57
|
+
store: store,
|
|
58
|
+
children: [
|
|
59
|
+
/*#__PURE__*/ _jsx("div", {
|
|
60
|
+
className: "min-h-screen bg-background-subtle-base px-24 py-32",
|
|
61
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
62
|
+
className: "mx-auto w-full max-w-[1120px]",
|
|
63
|
+
children: /*#__PURE__*/ _jsx(RouterProvider, {
|
|
64
|
+
router: router
|
|
65
|
+
})
|
|
59
66
|
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
}),
|
|
68
|
+
/*#__PURE__*/ _jsx(Toaster, {})
|
|
69
|
+
]
|
|
70
|
+
})
|
|
64
71
|
})
|
|
65
72
|
});
|
|
66
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/projects-hub-page.stories.tsx"],"sourcesContent":["import {configureApiClient} from '@shipfox/client-api';\nimport {type AuthState, authStateAtom} from '@shipfox/client-auth';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {\n createMemoryHistory,\n createRootRoute,\n createRoute,\n createRouter,\n Outlet,\n RouterProvider,\n} from '@tanstack/react-router';\nimport {createStore, Provider as JotaiProvider} from 'jotai';\nimport {useMemo} from 'react';\nimport {ProjectsHubPage} from './projects-hub-page.js';\n\nconst WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';\nconst CONNECTION_ID = '33333333-3333-4333-8333-333333333333';\n\ntype Scenario = 'list' | 'empty' | 'loading' | 'error';\n\nconst authState: AuthState = {\n status: 'authenticated',\n token: 'token',\n user: {\n id: '22222222-2222-4222-8222-222222222222',\n email: 'platform@example.com',\n name: 'Platform Engineer',\n emailVerifiedAt: '2026-01-01T00:00:00.000Z',\n },\n workspaces: [{id: WORKSPACE_ID, name: 'Acme', slug: 'acme', membershipId: 'membership-1'}],\n};\n\nfunction ProjectsHubPageStory({scenario}: {scenario: Scenario}) {\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: fetchForScenario(scenario),\n });\n\n const queryClient = useMemo(\n () => new QueryClient({defaultOptions: {queries: {retry: false}}}),\n [],\n );\n const store = useMemo(() => {\n const nextStore = createStore();\n nextStore.set(authStateAtom, authState);\n return nextStore;\n }, []);\n const router = useMemo(() => createStoryRouter(), []);\n\n return (\n <QueryClientProvider client={queryClient}>\n <JotaiProvider store={store}>\n <div className=\"min-h-screen bg-background-subtle-base px-24 py-32\">\n <div className=\"mx-auto w-full max-w-[1120px]\">\n <RouterProvider router={router} />\n </div>\n </div>\n <Toaster />\n </JotaiProvider>\n </QueryClientProvider>\n );\n}\n\nconst meta = {\n title: 'Projects/ProjectsHubPage',\n component: ProjectsHubPageStory,\n parameters: {layout: 'fullscreen'},\n args: {scenario: 'list'},\n} satisfies Meta<typeof ProjectsHubPageStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {};\n\nexport const Empty: Story = {\n args: {scenario: 'empty'},\n};\n\nexport const Loading: Story = {\n args: {scenario: 'loading'},\n};\n\nexport const ErrorState: Story = {\n args: {scenario: 'error'},\n};\n\nfunction createStoryRouter() {\n const rootRoute = createRootRoute({component: Outlet});\n const workspaceRoute = createRoute({\n getParentRoute: () => rootRoute,\n path: '/w/$workspaceSlug',\n component: ProjectsHubPage,\n });\n\n return createRouter({\n history: createMemoryHistory({initialEntries: ['/w/acme']}),\n routeTree: rootRoute.addChildren([workspaceRoute]),\n });\n}\n\nfunction fetchForScenario(scenario: Scenario): typeof fetch {\n return (input) => {\n const url = requestUrl(input);\n\n if (url.pathname.endsWith('/agent/model-providers')) {\n return Promise.resolve(\n jsonResponse({\n configs: [\n {\n kind: 'builtin',\n provider_id: 'anthropic',\n default_model: null,\n created_at: '2026-01-01T00:00:00.000Z',\n updated_at: '2026-01-01T00:00:00.000Z',\n },\n ],\n default_provider_id: 'anthropic',\n default_harness_id: null,\n }),\n );\n }\n\n if (url.pathname === '/integration-connections') {\n return Promise.resolve(\n jsonResponse({\n connections: [\n {\n id: CONNECTION_ID,\n workspace_id: WORKSPACE_ID,\n provider: 'github',\n external_account_id: 'octo',\n slug: 'github_octo',\n display_name: 'Acme GitHub',\n lifecycle_status: 'active',\n capabilities: ['source_control'],\n created_at: '2026-01-01T00:00:00.000Z',\n updated_at: '2026-01-01T00:00:00.000Z',\n },\n ],\n }),\n );\n }\n\n if (url.pathname === '/projects') {\n if (scenario === 'loading') {\n return new Promise<Response>(() => {\n // Keep the request pending to show the initial skeleton.\n });\n }\n if (scenario === 'error') {\n return Promise.resolve(jsonResponse({code: 'server-error'}, {status: 500}));\n }\n if (scenario === 'empty') {\n return Promise.resolve(jsonResponse({projects: [], next_cursor: null}));\n }\n\n return Promise.resolve(\n jsonResponse({\n projects: [\n projectForStory('Platform', '11111111-1111-4111-8111-111111111112'),\n projectForStory('Agent', '11111111-1111-4111-8111-111111111113'),\n projectForStory('Workflows', '11111111-1111-4111-8111-111111111114'),\n ],\n next_cursor: null,\n }),\n );\n }\n\n return Promise.resolve(jsonResponse({}, {status: 404}));\n };\n}\n\nfunction projectForStory(name: string, id: string) {\n return {\n id,\n workspace_id: WORKSPACE_ID,\n name,\n slug: name.toLowerCase(),\n source: {\n connection_id: CONNECTION_ID,\n external_repository_id: `github:octo/${name.toLowerCase()}`,\n },\n created_at: '2026-01-01T00:00:00.000Z',\n updated_at: '2026-01-01T00:00:00.000Z',\n };\n}\n\nfunction requestUrl(input: RequestInfo | URL): URL {\n if (input instanceof Request) return new URL(input.url);\n if (input instanceof URL) return input;\n return new URL(input, 'https://api.example.test');\n}\n\nfunction jsonResponse(body: unknown, init: ResponseInit = {}) {\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {'content-type': 'application/json'},\n ...init,\n });\n}\n"],"names":["configureApiClient","authStateAtom","Toaster","QueryClient","QueryClientProvider","createMemoryHistory","createRootRoute","createRoute","createRouter","Outlet","RouterProvider","createStore","Provider","JotaiProvider","useMemo","ProjectsHubPage","WORKSPACE_ID","CONNECTION_ID","authState","status","token","user","id","email","name","emailVerifiedAt","workspaces","slug","membershipId","ProjectsHubPageStory","scenario","baseUrl","fetchImpl","fetchForScenario","queryClient","defaultOptions","queries","retry","store","nextStore","set","router","createStoryRouter","client","div","className","meta","title","component","parameters","layout","args","Playground","Empty","Loading","ErrorState","rootRoute","workspaceRoute","getParentRoute","path","history","initialEntries","routeTree","addChildren","input","url","requestUrl","pathname","endsWith","Promise","resolve","jsonResponse","configs","kind","provider_id","default_model","created_at","updated_at","default_provider_id","default_harness_id","connections","workspace_id","provider","external_account_id","display_name","lifecycle_status","capabilities","code","projects","next_cursor","projectForStory","toLowerCase","source","connection_id","external_repository_id","Request","URL","body","init","Response","JSON","stringify","headers"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/pages/projects-hub-page.stories.tsx"],"sourcesContent":["import {configureApiClient} from '@shipfox/client-api';\nimport {type AuthState, authStateAtom} from '@shipfox/client-auth';\nimport {ChromeProvider} from '@shipfox/client-shell/runtime';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {\n createMemoryHistory,\n createRootRoute,\n createRoute,\n createRouter,\n Outlet,\n RouterProvider,\n} from '@tanstack/react-router';\nimport {createStore, Provider as JotaiProvider} from 'jotai';\nimport {useMemo} from 'react';\nimport {ProjectsHubPage} from './projects-hub-page.js';\n\nconst WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';\nconst CONNECTION_ID = '33333333-3333-4333-8333-333333333333';\n\ntype Scenario = 'list' | 'empty' | 'loading' | 'error';\n\nconst authState: AuthState = {\n status: 'authenticated',\n token: 'token',\n user: {\n id: '22222222-2222-4222-8222-222222222222',\n email: 'platform@example.com',\n name: 'Platform Engineer',\n emailVerifiedAt: '2026-01-01T00:00:00.000Z',\n },\n workspaces: [{id: WORKSPACE_ID, name: 'Acme', slug: 'acme', membershipId: 'membership-1'}],\n};\n\nfunction ProjectsHubPageStory({scenario}: {scenario: Scenario}) {\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: fetchForScenario(scenario),\n });\n\n const queryClient = useMemo(\n () => new QueryClient({defaultOptions: {queries: {retry: false}}}),\n [],\n );\n const store = useMemo(() => {\n const nextStore = createStore();\n nextStore.set(authStateAtom, authState);\n return nextStore;\n }, []);\n const router = useMemo(() => createStoryRouter(), []);\n\n return (\n <ChromeProvider\n chrome={{\n ProjectBreadcrumb: () => null,\n projectSlugResolver: async () => undefined,\n }}\n >\n <QueryClientProvider client={queryClient}>\n <JotaiProvider store={store}>\n <div className=\"min-h-screen bg-background-subtle-base px-24 py-32\">\n <div className=\"mx-auto w-full max-w-[1120px]\">\n <RouterProvider router={router} />\n </div>\n </div>\n <Toaster />\n </JotaiProvider>\n </QueryClientProvider>\n </ChromeProvider>\n );\n}\n\nconst meta = {\n title: 'Projects/ProjectsHubPage',\n component: ProjectsHubPageStory,\n parameters: {layout: 'fullscreen'},\n args: {scenario: 'list'},\n} satisfies Meta<typeof ProjectsHubPageStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {};\n\nexport const Empty: Story = {\n args: {scenario: 'empty'},\n};\n\nexport const Loading: Story = {\n args: {scenario: 'loading'},\n};\n\nexport const ErrorState: Story = {\n args: {scenario: 'error'},\n};\n\nfunction createStoryRouter() {\n const rootRoute = createRootRoute({component: Outlet});\n const workspaceRoute = createRoute({\n getParentRoute: () => rootRoute,\n path: '/w/$workspaceSlug',\n component: ProjectsHubPage,\n });\n\n return createRouter({\n history: createMemoryHistory({initialEntries: ['/w/acme']}),\n routeTree: rootRoute.addChildren([workspaceRoute]),\n });\n}\n\nfunction fetchForScenario(scenario: Scenario): typeof fetch {\n return (input) => {\n const url = requestUrl(input);\n\n if (url.pathname.endsWith('/agent/model-providers')) {\n return Promise.resolve(\n jsonResponse({\n configs: [\n {\n kind: 'builtin',\n provider_id: 'anthropic',\n default_model: null,\n created_at: '2026-01-01T00:00:00.000Z',\n updated_at: '2026-01-01T00:00:00.000Z',\n },\n ],\n default_provider_id: 'anthropic',\n default_harness_id: null,\n }),\n );\n }\n\n if (url.pathname === '/integration-connections') {\n return Promise.resolve(\n jsonResponse({\n connections: [\n {\n id: CONNECTION_ID,\n workspace_id: WORKSPACE_ID,\n provider: 'github',\n external_account_id: 'octo',\n slug: 'github_octo',\n display_name: 'Acme GitHub',\n lifecycle_status: 'active',\n capabilities: ['source_control'],\n created_at: '2026-01-01T00:00:00.000Z',\n updated_at: '2026-01-01T00:00:00.000Z',\n },\n ],\n }),\n );\n }\n\n if (url.pathname === '/projects') {\n if (scenario === 'loading') {\n return new Promise<Response>(() => {\n // Keep the request pending to show the initial skeleton.\n });\n }\n if (scenario === 'error') {\n return Promise.resolve(jsonResponse({code: 'server-error'}, {status: 500}));\n }\n if (scenario === 'empty') {\n return Promise.resolve(jsonResponse({projects: [], next_cursor: null}));\n }\n\n return Promise.resolve(\n jsonResponse({\n projects: [\n projectForStory('Platform', '11111111-1111-4111-8111-111111111112'),\n projectForStory('Agent', '11111111-1111-4111-8111-111111111113'),\n projectForStory('Workflows', '11111111-1111-4111-8111-111111111114'),\n ],\n next_cursor: null,\n }),\n );\n }\n\n return Promise.resolve(jsonResponse({}, {status: 404}));\n };\n}\n\nfunction projectForStory(name: string, id: string) {\n return {\n id,\n workspace_id: WORKSPACE_ID,\n name,\n slug: name.toLowerCase(),\n source: {\n connection_id: CONNECTION_ID,\n external_repository_id: `github:octo/${name.toLowerCase()}`,\n },\n created_at: '2026-01-01T00:00:00.000Z',\n updated_at: '2026-01-01T00:00:00.000Z',\n };\n}\n\nfunction requestUrl(input: RequestInfo | URL): URL {\n if (input instanceof Request) return new URL(input.url);\n if (input instanceof URL) return input;\n return new URL(input, 'https://api.example.test');\n}\n\nfunction jsonResponse(body: unknown, init: ResponseInit = {}) {\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {'content-type': 'application/json'},\n ...init,\n });\n}\n"],"names":["configureApiClient","authStateAtom","ChromeProvider","Toaster","QueryClient","QueryClientProvider","createMemoryHistory","createRootRoute","createRoute","createRouter","Outlet","RouterProvider","createStore","Provider","JotaiProvider","useMemo","ProjectsHubPage","WORKSPACE_ID","CONNECTION_ID","authState","status","token","user","id","email","name","emailVerifiedAt","workspaces","slug","membershipId","ProjectsHubPageStory","scenario","baseUrl","fetchImpl","fetchForScenario","queryClient","defaultOptions","queries","retry","store","nextStore","set","router","createStoryRouter","chrome","ProjectBreadcrumb","projectSlugResolver","undefined","client","div","className","meta","title","component","parameters","layout","args","Playground","Empty","Loading","ErrorState","rootRoute","workspaceRoute","getParentRoute","path","history","initialEntries","routeTree","addChildren","input","url","requestUrl","pathname","endsWith","Promise","resolve","jsonResponse","configs","kind","provider_id","default_model","created_at","updated_at","default_provider_id","default_harness_id","connections","workspace_id","provider","external_account_id","display_name","lifecycle_status","capabilities","code","projects","next_cursor","projectForStory","toLowerCase","source","connection_id","external_repository_id","Request","URL","body","init","Response","JSON","stringify","headers"],"mappings":";AAAA,SAAQA,kBAAkB,QAAO,sBAAsB;AACvD,SAAwBC,aAAa,QAAO,uBAAuB;AACnE,SAAQC,cAAc,QAAO,gCAAgC;AAC7D,SAAQC,OAAO,QAAO,0BAA0B;AAEhD,SAAQC,WAAW,EAAEC,mBAAmB,QAAO,wBAAwB;AACvE,SACEC,mBAAmB,EACnBC,eAAe,EACfC,WAAW,EACXC,YAAY,EACZC,MAAM,EACNC,cAAc,QACT,yBAAyB;AAChC,SAAQC,WAAW,EAAEC,YAAYC,aAAa,QAAO,QAAQ;AAC7D,SAAQC,OAAO,QAAO,QAAQ;AAC9B,SAAQC,eAAe,QAAO,yBAAyB;AAEvD,MAAMC,eAAe;AACrB,MAAMC,gBAAgB;AAItB,MAAMC,YAAuB;IAC3BC,QAAQ;IACRC,OAAO;IACPC,MAAM;QACJC,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,iBAAiB;IACnB;IACAC,YAAY;QAAC;YAACJ,IAAIN;YAAcQ,MAAM;YAAQG,MAAM;YAAQC,cAAc;QAAc;KAAE;AAC5F;AAEA,SAASC,qBAAqB,EAACC,QAAQ,EAAuB;IAC5D/B,mBAAmB;QACjBgC,SAAS;QACTC,WAAWC,iBAAiBH;IAC9B;IAEA,MAAMI,cAAcpB,QAClB,IAAM,IAAIX,YAAY;YAACgC,gBAAgB;gBAACC,SAAS;oBAACC,OAAO;gBAAK;YAAC;QAAC,IAChE,EAAE;IAEJ,MAAMC,QAAQxB,QAAQ;QACpB,MAAMyB,YAAY5B;QAClB4B,UAAUC,GAAG,CAACxC,eAAekB;QAC7B,OAAOqB;IACT,GAAG,EAAE;IACL,MAAME,SAAS3B,QAAQ,IAAM4B,qBAAqB,EAAE;IAEpD,qBACE,KAACzC;QACC0C,QAAQ;YACNC,mBAAmB,IAAM;YACzBC,qBAAqB,UAAYC;QACnC;kBAEA,cAAA,KAAC1C;YAAoB2C,QAAQb;sBAC3B,cAAA,MAACrB;gBAAcyB,OAAOA;;kCACpB,KAACU;wBAAIC,WAAU;kCACb,cAAA,KAACD;4BAAIC,WAAU;sCACb,cAAA,KAACvC;gCAAe+B,QAAQA;;;;kCAG5B,KAACvC;;;;;AAKX;AAEA,MAAMgD,OAAO;IACXC,OAAO;IACPC,WAAWvB;IACXwB,YAAY;QAACC,QAAQ;IAAY;IACjCC,MAAM;QAACzB,UAAU;IAAM;AACzB;AAEA,eAAeoB,KAAK;AAGpB,OAAO,MAAMM,aAAoB,CAAC,EAAE;AAEpC,OAAO,MAAMC,QAAe;IAC1BF,MAAM;QAACzB,UAAU;IAAO;AAC1B,EAAE;AAEF,OAAO,MAAM4B,UAAiB;IAC5BH,MAAM;QAACzB,UAAU;IAAS;AAC5B,EAAE;AAEF,OAAO,MAAM6B,aAAoB;IAC/BJ,MAAM;QAACzB,UAAU;IAAO;AAC1B,EAAE;AAEF,SAASY;IACP,MAAMkB,YAAYtD,gBAAgB;QAAC8C,WAAW3C;IAAM;IACpD,MAAMoD,iBAAiBtD,YAAY;QACjCuD,gBAAgB,IAAMF;QACtBG,MAAM;QACNX,WAAWrC;IACb;IAEA,OAAOP,aAAa;QAClBwD,SAAS3D,oBAAoB;YAAC4D,gBAAgB;gBAAC;aAAU;QAAA;QACzDC,WAAWN,UAAUO,WAAW,CAAC;YAACN;SAAe;IACnD;AACF;AAEA,SAAS5B,iBAAiBH,QAAkB;IAC1C,OAAO,CAACsC;QACN,MAAMC,MAAMC,WAAWF;QAEvB,IAAIC,IAAIE,QAAQ,CAACC,QAAQ,CAAC,2BAA2B;YACnD,OAAOC,QAAQC,OAAO,CACpBC,aAAa;gBACXC,SAAS;oBACP;wBACEC,MAAM;wBACNC,aAAa;wBACbC,eAAe;wBACfC,YAAY;wBACZC,YAAY;oBACd;iBACD;gBACDC,qBAAqB;gBACrBC,oBAAoB;YACtB;QAEJ;QAEA,IAAId,IAAIE,QAAQ,KAAK,4BAA4B;YAC/C,OAAOE,QAAQC,OAAO,CACpBC,aAAa;gBACXS,aAAa;oBACX;wBACE9D,IAAIL;wBACJoE,cAAcrE;wBACdsE,UAAU;wBACVC,qBAAqB;wBACrB5D,MAAM;wBACN6D,cAAc;wBACdC,kBAAkB;wBAClBC,cAAc;4BAAC;yBAAiB;wBAChCV,YAAY;wBACZC,YAAY;oBACd;iBACD;YACH;QAEJ;QAEA,IAAIZ,IAAIE,QAAQ,KAAK,aAAa;YAChC,IAAIzC,aAAa,WAAW;gBAC1B,OAAO,IAAI2C,QAAkB;gBAC3B,yDAAyD;gBAC3D;YACF;YACA,IAAI3C,aAAa,SAAS;gBACxB,OAAO2C,QAAQC,OAAO,CAACC,aAAa;oBAACgB,MAAM;gBAAc,GAAG;oBAACxE,QAAQ;gBAAG;YAC1E;YACA,IAAIW,aAAa,SAAS;gBACxB,OAAO2C,QAAQC,OAAO,CAACC,aAAa;oBAACiB,UAAU,EAAE;oBAAEC,aAAa;gBAAI;YACtE;YAEA,OAAOpB,QAAQC,OAAO,CACpBC,aAAa;gBACXiB,UAAU;oBACRE,gBAAgB,YAAY;oBAC5BA,gBAAgB,SAAS;oBACzBA,gBAAgB,aAAa;iBAC9B;gBACDD,aAAa;YACf;QAEJ;QAEA,OAAOpB,QAAQC,OAAO,CAACC,aAAa,CAAC,GAAG;YAACxD,QAAQ;QAAG;IACtD;AACF;AAEA,SAAS2E,gBAAgBtE,IAAY,EAAEF,EAAU;IAC/C,OAAO;QACLA;QACA+D,cAAcrE;QACdQ;QACAG,MAAMH,KAAKuE,WAAW;QACtBC,QAAQ;YACNC,eAAehF;YACfiF,wBAAwB,CAAC,YAAY,EAAE1E,KAAKuE,WAAW,IAAI;QAC7D;QACAf,YAAY;QACZC,YAAY;IACd;AACF;AAEA,SAASX,WAAWF,KAAwB;IAC1C,IAAIA,iBAAiB+B,SAAS,OAAO,IAAIC,IAAIhC,MAAMC,GAAG;IACtD,IAAID,iBAAiBgC,KAAK,OAAOhC;IACjC,OAAO,IAAIgC,IAAIhC,OAAO;AACxB;AAEA,SAASO,aAAa0B,IAAa,EAAEC,OAAqB,CAAC,CAAC;IAC1D,OAAO,IAAIC,SAASC,KAAKC,SAAS,CAACJ,OAAO;QACxClF,QAAQ;QACRuF,SAAS;YAAC,gBAAgB;QAAkB;QAC5C,GAAGJ,IAAI;IACT;AACF"}
|