@shipfox/client-integrations 16.0.0 → 21.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.
Files changed (86) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +31 -0
  3. package/dist/components/callback-status-shell.js +2 -2
  4. package/dist/components/callback-status-shell.js.map +1 -1
  5. package/dist/components/integration-gallery.stories.js +1 -1
  6. package/dist/components/integration-gallery.stories.js.map +1 -1
  7. package/dist/components/provider-grid.js +4 -4
  8. package/dist/components/provider-grid.js.map +1 -1
  9. package/dist/components/repository-picker.js +1 -1
  10. package/dist/components/repository-picker.js.map +1 -1
  11. package/dist/components/webhook/webhook-modals.stories.js +1 -1
  12. package/dist/components/webhook/webhook-modals.stories.js.map +1 -1
  13. package/dist/pages/gitea-install-page.js +1 -1
  14. package/dist/pages/gitea-install-page.js.map +1 -1
  15. package/dist/pages/jira-callback-page.js +4 -4
  16. package/dist/pages/jira-callback-page.js.map +1 -1
  17. package/dist/pages/sentry-callback-page.js +4 -4
  18. package/dist/pages/sentry-callback-page.js.map +1 -1
  19. package/dist/pages/source-control-onboarding-page.js +1 -1
  20. package/dist/pages/source-control-onboarding-page.js.map +1 -1
  21. package/dist/routes/gitea.d.ts +3 -0
  22. package/dist/routes/gitea.js +3 -0
  23. package/dist/routes/gitea.js.map +1 -1
  24. package/dist/routes/github-callback.d.ts +3 -0
  25. package/dist/routes/github-callback.d.ts.map +1 -1
  26. package/dist/routes/github-callback.js +3 -0
  27. package/dist/routes/github-callback.js.map +1 -1
  28. package/dist/routes/github.d.ts +3 -0
  29. package/dist/routes/github.js +3 -0
  30. package/dist/routes/github.js.map +1 -1
  31. package/dist/routes/integrations-settings.d.ts +3 -0
  32. package/dist/routes/integrations-settings.js +3 -0
  33. package/dist/routes/integrations-settings.js.map +1 -1
  34. package/dist/routes/integrations.d.ts +3 -0
  35. package/dist/routes/integrations.js +3 -0
  36. package/dist/routes/integrations.js.map +1 -1
  37. package/dist/routes/jira-callback.d.ts +3 -0
  38. package/dist/routes/jira-callback.js +3 -0
  39. package/dist/routes/jira-callback.js.map +1 -1
  40. package/dist/routes/jira.d.ts +3 -0
  41. package/dist/routes/jira.js +3 -0
  42. package/dist/routes/jira.js.map +1 -1
  43. package/dist/routes/linear-callback.d.ts +3 -0
  44. package/dist/routes/linear-callback.js +3 -0
  45. package/dist/routes/linear-callback.js.map +1 -1
  46. package/dist/routes/linear.d.ts +3 -0
  47. package/dist/routes/linear.js +3 -0
  48. package/dist/routes/linear.js.map +1 -1
  49. package/dist/routes/sentry-callback.d.ts +3 -0
  50. package/dist/routes/sentry-callback.js +3 -0
  51. package/dist/routes/sentry-callback.js.map +1 -1
  52. package/dist/routes/sentry.d.ts +3 -0
  53. package/dist/routes/sentry.js +3 -0
  54. package/dist/routes/sentry.js.map +1 -1
  55. package/dist/routes/slack-callback.d.ts +3 -0
  56. package/dist/routes/slack-callback.js +3 -0
  57. package/dist/routes/slack-callback.js.map +1 -1
  58. package/dist/routes/slack.d.ts +3 -0
  59. package/dist/routes/slack.js +3 -0
  60. package/dist/routes/slack.js.map +1 -1
  61. package/dist/tsconfig.test.tsbuildinfo +1 -1
  62. package/package.json +8 -8
  63. package/src/components/callback-status-shell.tsx +2 -2
  64. package/src/components/integration-gallery.stories.tsx +1 -1
  65. package/src/components/integration-gallery.test.tsx +1 -0
  66. package/src/components/provider-grid.tsx +5 -5
  67. package/src/components/repository-picker.tsx +1 -1
  68. package/src/components/webhook/webhook-modals.stories.tsx +1 -1
  69. package/src/pages/gitea-install-page.tsx +1 -1
  70. package/src/pages/jira-callback-page.tsx +5 -5
  71. package/src/pages/sentry-callback-page.tsx +5 -7
  72. package/src/pages/source-control-onboarding-page.tsx +1 -1
  73. package/src/routes/gitea.tsx +4 -1
  74. package/src/routes/github-callback.tsx +1 -0
  75. package/src/routes/github.tsx +4 -1
  76. package/src/routes/integrations-settings.tsx +4 -1
  77. package/src/routes/integrations.tsx +4 -1
  78. package/src/routes/jira-callback.tsx +1 -0
  79. package/src/routes/jira.tsx +4 -1
  80. package/src/routes/linear-callback.tsx +1 -0
  81. package/src/routes/linear.tsx +4 -1
  82. package/src/routes/sentry-callback.tsx +1 -0
  83. package/src/routes/sentry.tsx +4 -1
  84. package/src/routes/slack-callback.tsx +1 -0
  85. package/src/routes/slack.tsx +4 -1
  86. package/tsconfig.build.tsbuildinfo +1 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shipfox/client-integrations",
3
3
  "license": "MIT",
4
- "version": "16.0.0",
4
+ "version": "21.0.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/ShipfoxHQ/shipfox.git",
@@ -30,17 +30,17 @@
30
30
  "@shipfox/api-integration-core-dto": "12.2.0",
31
31
  "@shipfox/api-integration-gitea-dto": "12.2.0",
32
32
  "@shipfox/api-integration-github-dto": "12.2.0",
33
- "@shipfox/api-integration-linear-dto": "12.2.0",
34
33
  "@shipfox/api-integration-jira-dto": "12.2.0",
34
+ "@shipfox/api-integration-linear-dto": "12.2.0",
35
35
  "@shipfox/api-integration-slack-dto": "12.2.0",
36
- "@shipfox/api-integration-webhook-dto": "12.2.0",
37
36
  "@shipfox/api-integration-sentry-dto": "12.2.0",
37
+ "@shipfox/api-integration-webhook-dto": "12.2.0",
38
38
  "@shipfox/client-api": "6.0.1",
39
- "@shipfox/client-auth": "16.0.0",
40
- "@shipfox/client-shell": "16.0.0",
41
- "@shipfox/client-ui": "16.0.0",
42
- "@shipfox/react-ui": "1.1.0",
43
- "@shipfox/integration-icons": "0.3.2"
39
+ "@shipfox/client-auth": "21.0.0",
40
+ "@shipfox/client-shell": "21.0.0",
41
+ "@shipfox/client-ui": "21.0.0",
42
+ "@shipfox/integration-icons": "0.3.4",
43
+ "@shipfox/react-ui": "2.0.0"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@tanstack/react-query": "^5.101.0",
@@ -43,8 +43,8 @@ export function CallbackStatusShell({
43
43
  : undefined;
44
44
 
45
45
  return (
46
- <main className="flex min-h-screen bg-background-subtle-base px-row py-frame">
47
- <div className="mx-auto flex w-full max-w-[480px] flex-col justify-center gap-section">
46
+ <main className="flex min-h-screen px-row py-frame">
47
+ <div className="mx-auto flex w-full flex-col justify-center gap-section">
48
48
  <h2 ref={headingRef} tabIndex={-1} className="text-24 font-semibold outline-none">
49
49
  {title}
50
50
  </h2>
@@ -82,7 +82,7 @@ function IntegrationGalleryStory({scenario}: IntegrationGalleryStoryProps) {
82
82
  getParentRoute: () => workspaceRoute,
83
83
  path: 'settings/integrations',
84
84
  component: () => (
85
- <div className="mx-auto w-full max-w-[760px] bg-background-neutral-background p-24">
85
+ <div className="mx-auto w-full max-w-[760px] bg-background-subtle-base p-24">
86
86
  <IntegrationGallery workspaceId={WORKSPACE_ID} />
87
87
  </div>
88
88
  ),
@@ -601,6 +601,7 @@ describe('IntegrationGallery: available section', () => {
601
601
  const link = await screen.findByRole('link', {name: 'Install GitHub'});
602
602
 
603
603
  expect(link).toHaveClass('focus-visible:shadow-button-neutral-focus');
604
+ expect(link).toHaveClass('shadow-button-neutral');
604
605
  expect(link.className).not.toContain('shadow-button-secondary');
605
606
  expect(within(link).getByText('Install')).toBeVisible();
606
607
  expect(within(link).queryByRole('button')).not.toBeInTheDocument();
@@ -1,8 +1,8 @@
1
1
  import {QueryLoadError} from '@shipfox/client-ui';
2
2
  import {IntegrationIcon} from '@shipfox/integration-icons';
3
- import {Card} from '@shipfox/react-ui/card';
4
3
  import {EmptyState} from '@shipfox/react-ui/empty-state';
5
4
  import {Icon} from '@shipfox/react-ui/icon';
5
+ import {Panel} from '@shipfox/react-ui/panel';
6
6
  import {Skeleton} from '@shipfox/react-ui/skeleton';
7
7
  import {Text} from '@shipfox/react-ui/typography';
8
8
  import {cn} from '@shipfox/react-ui/utils';
@@ -106,7 +106,7 @@ function ProviderCard({
106
106
  type="button"
107
107
  aria-label={`Add ${provider.displayName}`}
108
108
  onClick={() => onOpenProvider?.(provider.provider)}
109
- className="group flex h-full w-full min-w-0 items-center justify-between gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact text-left transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none"
109
+ className="group flex h-full w-full min-w-0 items-center justify-between gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact text-left shadow-button-neutral transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none"
110
110
  >
111
111
  <ProviderCardContent provider={provider} action="Add" />
112
112
  </button>
@@ -118,7 +118,7 @@ function ProviderCard({
118
118
  to={catalog.setupPath}
119
119
  params={{workspaceSlug}}
120
120
  aria-label={`Install ${provider.displayName}`}
121
- className="group flex h-full min-w-0 items-center justify-between gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none"
121
+ className="group flex h-full min-w-0 items-center justify-between gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none"
122
122
  >
123
123
  <ProviderCardContent provider={provider} action="Install" />
124
124
  </Link>
@@ -159,7 +159,7 @@ function ProviderGridSkeleton({label}: {label: string}) {
159
159
  <ul role="status" aria-label={label} className={PROVIDER_GRID_CLASS}>
160
160
  {[0, 1, 2, 3].map((tile) => (
161
161
  <li key={tile}>
162
- <Card className="h-full p-panel-compact">
162
+ <Panel className="h-full p-panel-compact">
163
163
  <div className="flex items-center justify-between gap-cluster">
164
164
  <div className="flex min-w-0 items-center gap-cluster">
165
165
  <Skeleton className="size-24 shrink-0" />
@@ -167,7 +167,7 @@ function ProviderGridSkeleton({label}: {label: string}) {
167
167
  </div>
168
168
  <Skeleton className="h-16 w-64 shrink-0" />
169
169
  </div>
170
- </Card>
170
+ </Panel>
171
171
  </li>
172
172
  ))}
173
173
  </ul>
@@ -60,7 +60,7 @@ export function RepositoryPicker({
60
60
  {isLoading ? <RepositoryLoadingState /> : null}
61
61
 
62
62
  {!isLoading && repositories.length === 0 ? (
63
- <div className="rounded-8 border border-border-neutral-base bg-background-subtle-base p-panel-compact">
63
+ <div className="rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact">
64
64
  <Text size="sm">{emptyMessage}</Text>
65
65
  </div>
66
66
  ) : null}
@@ -126,7 +126,7 @@ export const CopyableValueState: Story = {
126
126
 
127
127
  function StorySurface({scenario}: {scenario: Scenario}) {
128
128
  return (
129
- <div className="min-h-screen bg-background-neutral-background p-24">
129
+ <div className="min-h-screen bg-background-subtle-base p-24">
130
130
  {scenario === 'create-form' ? (
131
131
  <WebhookCreateModal
132
132
  workspaceId={WORKSPACE_ID}
@@ -40,7 +40,7 @@ export function GiteaInstallPage() {
40
40
  });
41
41
 
42
42
  return (
43
- <div className="mx-auto flex w-full max-w-[480px] flex-col gap-section">
43
+ <div className="mx-auto flex w-full flex-col gap-section">
44
44
  <header className="flex flex-col gap-inline">
45
45
  <Header variant="h1">Install Gitea</Header>
46
46
  <Text size="md" className="text-foreground-neutral-muted">
@@ -3,8 +3,8 @@ import {useRouteSearch} from '@shipfox/client-shell/runtime';
3
3
  import {sessionStorageOrUndefined} from '@shipfox/client-ui';
4
4
  import {Button, ButtonLink} from '@shipfox/react-ui/button';
5
5
  import {Callout} from '@shipfox/react-ui/callout';
6
- import {Card} from '@shipfox/react-ui/card';
7
6
  import {FullPageLoader} from '@shipfox/react-ui/loader';
7
+ import {Panel} from '@shipfox/react-ui/panel';
8
8
  import {toast} from '@shipfox/react-ui/toast';
9
9
  import {Header, Text} from '@shipfox/react-ui/typography';
10
10
  import {useQueryClient} from '@tanstack/react-query';
@@ -300,8 +300,8 @@ function JiraSiteSelectionPage({
300
300
  onSelect: (site: JiraSite) => void;
301
301
  }) {
302
302
  return (
303
- <main className="flex min-h-screen bg-background-subtle-base px-row py-frame">
304
- <div className="mx-auto flex w-full max-w-[480px] flex-col justify-center gap-section">
303
+ <main className="flex min-h-screen px-row py-frame">
304
+ <div className="mx-auto flex w-full flex-col justify-center gap-section">
305
305
  <header className="flex flex-col gap-inline">
306
306
  <Header variant="h2">Choose a Jira site</Header>
307
307
  <Text size="sm" className="text-foreground-neutral-muted">
@@ -317,7 +317,7 @@ function JiraSiteSelectionPage({
317
317
 
318
318
  <section className="flex flex-col gap-inline" aria-label="Choose a Jira site">
319
319
  {sites.map((site) => (
320
- <Card key={site.cloudId} className="p-panel-compact">
320
+ <Panel key={site.cloudId} className="p-panel-compact">
321
321
  <div className="flex items-center justify-between gap-cluster">
322
322
  <div className="min-w-0">
323
323
  <Text size="md" bold className="truncate">
@@ -336,7 +336,7 @@ function JiraSiteSelectionPage({
336
336
  Connect
337
337
  </Button>
338
338
  </div>
339
- </Card>
339
+ </Panel>
340
340
  ))}
341
341
  </section>
342
342
 
@@ -3,8 +3,8 @@ import {useRouteSearch} from '@shipfox/client-shell/runtime';
3
3
  import {createSingleFlight, sessionStorageOrUndefined} from '@shipfox/client-ui';
4
4
  import {Button, ButtonLink} from '@shipfox/react-ui/button';
5
5
  import {Callout} from '@shipfox/react-ui/callout';
6
- import {Card} from '@shipfox/react-ui/card';
7
6
  import {FullPageLoader} from '@shipfox/react-ui/loader';
7
+ import {Panel} from '@shipfox/react-ui/panel';
8
8
  import {toast} from '@shipfox/react-ui/toast';
9
9
  import {Header, Text} from '@shipfox/react-ui/typography';
10
10
  import {useQueryClient} from '@tanstack/react-query';
@@ -212,7 +212,7 @@ export function SentryCallbackPage() {
212
212
 
213
213
  <section className="flex flex-col gap-inline" aria-label="Choose a workspace">
214
214
  {orderedWorkspaces.map((workspace) => (
215
- <Card key={workspace.id} className="p-panel-compact">
215
+ <Panel key={workspace.id} className="p-panel-compact">
216
216
  <div className="flex items-center justify-between gap-cluster">
217
217
  <Text size="md" bold className="truncate">
218
218
  {workspace.name}
@@ -226,7 +226,7 @@ export function SentryCallbackPage() {
226
226
  Install
227
227
  </Button>
228
228
  </div>
229
- </Card>
229
+ </Panel>
230
230
  ))}
231
231
  </section>
232
232
 
@@ -246,10 +246,8 @@ export function SentryCallbackPage() {
246
246
 
247
247
  function CallbackColumn({children}: {children: React.ReactNode}) {
248
248
  return (
249
- <main className="flex min-h-screen bg-background-subtle-base px-row py-frame">
250
- <div className="mx-auto flex w-full max-w-[480px] flex-col justify-center gap-section">
251
- {children}
252
- </div>
249
+ <main className="flex min-h-screen px-row py-frame">
250
+ <div className="mx-auto flex w-full flex-col justify-center gap-section">{children}</div>
253
251
  </main>
254
252
  );
255
253
  }
@@ -8,7 +8,7 @@ export function SourceControlOnboardingPage() {
8
8
  const providersQuery = useIntegrationProvidersQuery({capability: 'source_control'});
9
9
 
10
10
  return (
11
- <div className="mx-auto flex w-full max-w-[640px] flex-col gap-section">
11
+ <div className="mx-auto flex w-full flex-col gap-section">
12
12
  <header className="flex flex-col gap-inline">
13
13
  <Header variant="h1">Install source control</Header>
14
14
  <Text size="md" className="text-foreground-neutral-muted">
@@ -1,4 +1,7 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {GiteaInstallPage} from '#pages/gitea-install-page.js';
3
3
 
4
- export default defineRoute({component: GiteaInstallPage});
4
+ export default defineRoute({
5
+ staticData: {frame: 'focused'},
6
+ component: GiteaInstallPage,
7
+ });
@@ -29,6 +29,7 @@ const callbackRequests = createSingleFlight<string, void>({maxTerminalResults: 3
29
29
  const toastedCallbacks = new Set<string>();
30
30
 
31
31
  export default defineRoute({
32
+ staticData: {frame: 'focused'},
32
33
  validateSearch: validateGithubCallbackSearch,
33
34
  component: GithubCallbackRoute,
34
35
  });
@@ -1,4 +1,7 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {GithubInstallPage} from '#pages/github-install-page.js';
3
3
 
4
- export default defineRoute({component: GithubInstallPage});
4
+ export default defineRoute({
5
+ staticData: {frame: 'focused'},
6
+ component: GithubInstallPage,
7
+ });
@@ -1,4 +1,7 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {IntegrationGallery} from '#index.js';
3
3
 
4
- export default defineRoute({component: IntegrationGallery});
4
+ export default defineRoute({
5
+ staticData: {frame: 'content'},
6
+ component: IntegrationGallery,
7
+ });
@@ -1,4 +1,7 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {SourceControlOnboardingPage} from '#pages/source-control-onboarding-page.js';
3
3
 
4
- export default defineRoute({component: SourceControlOnboardingPage});
4
+ export default defineRoute({
5
+ staticData: {frame: 'focused'},
6
+ component: SourceControlOnboardingPage,
7
+ });
@@ -3,6 +3,7 @@ import {JiraCallbackPage} from '#pages/jira-callback-page.js';
3
3
  import {parseJiraCallbackQuery} from '../jira-callback.js';
4
4
 
5
5
  export default defineRoute({
6
+ staticData: {frame: 'focused'},
6
7
  validateSearch: parseJiraCallbackQuery,
7
8
  component: JiraCallbackPage,
8
9
  });
@@ -1,4 +1,7 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {JiraInstallPage} from '#pages/jira-install-page.js';
3
3
 
4
- export default defineRoute({component: JiraInstallPage});
4
+ export default defineRoute({
5
+ staticData: {frame: 'focused'},
6
+ component: JiraInstallPage,
7
+ });
@@ -3,6 +3,7 @@ import {LinearCallbackPage} from '#pages/linear-callback-page.js';
3
3
  import {parseLinearCallbackQuery} from '../linear-callback.js';
4
4
 
5
5
  export default defineRoute({
6
+ staticData: {frame: 'focused'},
6
7
  validateSearch: parseLinearCallbackQuery,
7
8
  component: LinearCallbackPage,
8
9
  });
@@ -1,4 +1,7 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {LinearInstallPage} from '#pages/linear-install-page.js';
3
3
 
4
- export default defineRoute({component: LinearInstallPage});
4
+ export default defineRoute({
5
+ staticData: {frame: 'focused'},
6
+ component: LinearInstallPage,
7
+ });
@@ -3,6 +3,7 @@ import {SentryCallbackPage} from '#pages/sentry-callback-page.js';
3
3
  import {parseSentryCallbackParams} from '../sentry-callback.js';
4
4
 
5
5
  export default defineRoute({
6
+ staticData: {frame: 'focused'},
6
7
  validateSearch: parseSentryCallbackParams,
7
8
  component: SentryCallbackPage,
8
9
  });
@@ -1,4 +1,7 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {SentryInstallPage} from '#pages/sentry-install-page.js';
3
3
 
4
- export default defineRoute({component: SentryInstallPage});
4
+ export default defineRoute({
5
+ staticData: {frame: 'focused'},
6
+ component: SentryInstallPage,
7
+ });
@@ -3,6 +3,7 @@ import {SlackCallbackPage} from '#pages/slack-callback-page.js';
3
3
  import {parseSlackCallbackQuery} from '../slack-callback.js';
4
4
 
5
5
  export default defineRoute({
6
+ staticData: {frame: 'focused'},
6
7
  validateSearch: parseSlackCallbackQuery,
7
8
  component: SlackCallbackPage,
8
9
  });
@@ -1,3 +1,6 @@
1
1
  import {defineRoute} from '@shipfox/client-shell/runtime';
2
2
  import {SlackInstallPage} from '#pages/slack-install-page.js';
3
- export default defineRoute({component: SlackInstallPage});
3
+ export default defineRoute({
4
+ staticData: {frame: 'focused'},
5
+ component: SlackInstallPage,
6
+ });