@futo-org/backups-orchestrator-ui 0.27.0 → 0.30.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 (163) hide show
  1. package/dist/components/backends/BackendItem.svelte +28 -24
  2. package/dist/components/backends/BackendsList.svelte +33 -34
  3. package/dist/components/backends/BackendsList.svelte.d.ts +1 -0
  4. package/dist/components/backends/dialogs/SelectBackendModal.svelte +44 -55
  5. package/dist/components/backups/BackupItem.svelte +33 -26
  6. package/dist/components/backups/BackupStatus.svelte +200 -0
  7. package/dist/components/backups/BackupStatus.svelte.d.ts +19 -0
  8. package/dist/components/backups/BackupsList.svelte +17 -11
  9. package/dist/components/backups/dialogs/RestoreSnapshotModal.svelte +2 -2
  10. package/dist/components/backups/dialogs/SelectRepositoryModal.svelte +26 -36
  11. package/dist/components/backups/dialogs/ViewStatusModal.svelte +175 -0
  12. package/dist/components/backups/dialogs/ViewStatusModal.svelte.d.ts +8 -0
  13. package/dist/components/backups/run-history/RepositoryRunHistory.svelte +23 -12
  14. package/dist/components/backups/run-history/RepositoryRunHistory.svelte.d.ts +2 -0
  15. package/dist/components/backups/run-history/RepositoryRunHistoryItem.svelte +46 -20
  16. package/dist/components/backups/run-history/RepositoryRunHistoryPage.svelte +136 -0
  17. package/dist/components/backups/run-history/RepositoryRunHistoryPage.svelte.d.ts +8 -0
  18. package/dist/components/backups/run-history/RunHistoryModal.svelte +2 -2
  19. package/dist/components/backups/snapshots-list/RepositorySnapshotsList.svelte +22 -10
  20. package/dist/components/backups/snapshots-list/RepositorySnapshotsList.svelte.d.ts +2 -0
  21. package/dist/components/backups/snapshots-list/RepositorySnapshotsListItem.svelte +23 -21
  22. package/dist/components/backups/snapshots-list/RepositorySnapshotsPage.svelte +115 -0
  23. package/dist/components/backups/snapshots-list/RepositorySnapshotsPage.svelte.d.ts +9 -0
  24. package/dist/components/backups/snapshots-list/SnapshotsListModal.svelte +2 -2
  25. package/dist/components/dashboard/Dashboard.svelte +14 -7
  26. package/dist/components/dashboard/Dashboard.svelte.d.ts +1 -1
  27. package/dist/components/dashboard/DashboardAvgBackupTime.svelte +1 -1
  28. package/dist/components/dashboard/DashboardBackupHealth.svelte +5 -9
  29. package/dist/components/dashboard/DashboardBackupHealth.svelte.d.ts +1 -1
  30. package/dist/components/dashboard/DashboardCurrentUsage.svelte +1 -1
  31. package/dist/components/dashboard/DashboardDailyBackupTime.svelte +1 -1
  32. package/dist/components/dashboard/DashboardInstall.svelte +1 -1
  33. package/dist/components/dashboard/DashboardRecentBackups.svelte +47 -78
  34. package/dist/components/dashboard/DashboardTotalStored.svelte +1 -1
  35. package/dist/components/integrations/immich/ImmichBackupSettings.svelte +12 -0
  36. package/dist/components/integrations/immich/ImmichBackupSettings.svelte.d.ts +18 -0
  37. package/dist/components/integrations/immich/ImmichBackupsCard.svelte +109 -0
  38. package/dist/components/integrations/immich/ImmichBackupsCard.svelte.d.ts +13 -0
  39. package/dist/components/integrations/immich/ImmichBackupsNavButton.svelte +55 -0
  40. package/dist/components/integrations/immich/ImmichBackupsNavButton.svelte.d.ts +10 -0
  41. package/dist/components/integrations/immich/ImmichBackupsPage.svelte +16 -3
  42. package/dist/components/integrations/immich/ImmichBackupsPage.svelte.d.ts +8 -1
  43. package/dist/components/integrations/immich/ImmichBackupsSidebarItem.svelte +102 -0
  44. package/dist/components/integrations/immich/ImmichBackupsSidebarItem.svelte.d.ts +8 -0
  45. package/dist/components/integrations/immich/ImmichManageBackup.svelte +53 -14
  46. package/dist/components/integrations/immich/ImmichManageBackupOverview.svelte +45 -71
  47. package/dist/components/integrations/immich/ImmichOnboardingSetupFlow.svelte +123 -82
  48. package/dist/components/integrations/immich/ImmichOnboardingSetupFlow.svelte.d.ts +1 -1
  49. package/dist/components/integrations/immich/settings/ImmichSettingsBackupContents.svelte +313 -0
  50. package/dist/components/integrations/immich/settings/ImmichSettingsBackupContents.svelte.d.ts +3 -0
  51. package/dist/components/integrations/immich/settings/ImmichSettingsSchedule.svelte +218 -0
  52. package/dist/components/integrations/immich/settings/ImmichSettingsSchedule.svelte.d.ts +3 -0
  53. package/dist/components/integrations/immich/settings/ImmichSettingsStorage.svelte +207 -0
  54. package/dist/components/integrations/immich/settings/ImmichSettingsStorage.svelte.d.ts +3 -0
  55. package/dist/components/onboarding/RecoveryKeyDisplay.svelte +34 -20
  56. package/dist/components/onboarding/SampleOnboarding.svelte +57 -38
  57. package/dist/components/onboarding/stages/OnboardingStageBackupServices.svelte +10 -24
  58. package/dist/components/onboarding/steps/OnboardingStep1FinishSetup.svelte +44 -0
  59. package/dist/components/onboarding/steps/OnboardingStep1FinishSetup.svelte.d.ts +7 -0
  60. package/dist/components/onboarding/steps/OnboardingStep2ConnectAccount.svelte +50 -0
  61. package/dist/components/onboarding/steps/OnboardingStep2ConnectAccount.svelte.d.ts +7 -0
  62. package/dist/components/onboarding/steps/OnboardingStep3SaveRecoveryKey.svelte +45 -0
  63. package/dist/components/onboarding/steps/OnboardingStep3SaveRecoveryKey.svelte.d.ts +8 -0
  64. package/dist/components/onboarding/steps/OnboardingStep4FirstBackup.svelte +67 -0
  65. package/dist/components/onboarding/steps/OnboardingStep4FirstBackup.svelte.d.ts +9 -0
  66. package/dist/components/onboarding/steps/OnboardingStepLayout.svelte +58 -0
  67. package/dist/components/onboarding/steps/OnboardingStepLayout.svelte.d.ts +19 -0
  68. package/dist/components/onboarding/upsell/UpsellBackupFeaturesGrid.svelte +52 -0
  69. package/dist/components/onboarding/upsell/UpsellBackupFeaturesGrid.svelte.d.ts +18 -0
  70. package/dist/components/onboarding/upsell/UpsellExplainFutoBackups.svelte +33 -0
  71. package/dist/components/onboarding/upsell/UpsellExplainFutoBackups.svelte.d.ts +8 -0
  72. package/dist/components/onboarding/upsell/UpsellFrequentlyAskedQuestions.svelte +32 -0
  73. package/dist/components/onboarding/upsell/UpsellFrequentlyAskedQuestions.svelte.d.ts +11 -0
  74. package/dist/components/onboarding/upsell/UpsellFutoBackupsBadge.svelte +7 -0
  75. package/dist/components/onboarding/upsell/UpsellFutoBackupsBadge.svelte.d.ts +18 -0
  76. package/dist/components/onboarding/upsell/UpsellHowItWorks.svelte +46 -0
  77. package/dist/components/onboarding/upsell/UpsellHowItWorks.svelte.d.ts +6 -0
  78. package/dist/components/onboarding/upsell/UpsellModal.svelte +43 -0
  79. package/dist/components/onboarding/upsell/UpsellModal.svelte.d.ts +9 -0
  80. package/dist/components/onboarding/upsell/UpsellPage.svelte +40 -0
  81. package/dist/components/onboarding/upsell/UpsellPage.svelte.d.ts +14 -0
  82. package/dist/components/onboarding/upsell/UpsellProtectYourImmichLibrary.svelte +58 -0
  83. package/dist/components/onboarding/upsell/UpsellProtectYourImmichLibrary.svelte.d.ts +8 -0
  84. package/dist/components/schedules/RepositoryPicker.svelte +45 -38
  85. package/dist/components/schedules/ScheduleItem.svelte +32 -26
  86. package/dist/components/schedules/ScheduleList.svelte +16 -10
  87. package/dist/components/settings/GlobalSettings.svelte +8 -0
  88. package/dist/components/settings/GlobalSettings.svelte.d.ts +18 -0
  89. package/dist/components/settings/SettingsBackends.svelte +16 -0
  90. package/dist/components/settings/SettingsBackends.svelte.d.ts +18 -0
  91. package/dist/components/settings/SettingsBilling.svelte +69 -0
  92. package/dist/components/settings/SettingsBilling.svelte.d.ts +6 -0
  93. package/dist/components/settings/SettingsNotifications.svelte +47 -0
  94. package/dist/components/settings/SettingsNotifications.svelte.d.ts +6 -0
  95. package/dist/components/test/ImmichTestUi.svelte +143 -27
  96. package/dist/components/test/TestUi.svelte +4 -4
  97. package/dist/components/test/dashboard/ActiveJobs.svelte +2 -2
  98. package/dist/components/test/immich/MockImmichHideBackupsReminder.svelte +12 -0
  99. package/dist/components/test/immich/MockImmichHideBackupsReminder.svelte.d.ts +3 -0
  100. package/dist/components/test/immich/MockImmichPhotos.svelte +36 -0
  101. package/dist/components/test/immich/MockImmichPhotos.svelte.d.ts +18 -0
  102. package/dist/components/test/immich/MockImmichPurchaseInfo.svelte +29 -0
  103. package/dist/components/test/immich/MockImmichPurchaseInfo.svelte.d.ts +18 -0
  104. package/dist/components/test/immich/MockImmichServerStatus.svelte +9 -0
  105. package/dist/components/test/immich/MockImmichServerStatus.svelte.d.ts +18 -0
  106. package/dist/components/test/immich/MockImmichSidebar.svelte +20 -0
  107. package/dist/components/test/immich/MockImmichSidebar.svelte.d.ts +7 -0
  108. package/dist/components/test/immich/MockImmichStorageSpace.svelte +25 -0
  109. package/dist/components/test/immich/MockImmichStorageSpace.svelte.d.ts +7 -0
  110. package/dist/components/ui/Accordion.svelte +67 -0
  111. package/dist/components/ui/Accordion.svelte.d.ts +11 -0
  112. package/dist/components/ui/ListToolbar.svelte +60 -0
  113. package/dist/components/ui/ListToolbar.svelte.d.ts +16 -0
  114. package/dist/components/ui/PageLayout.svelte +21 -9
  115. package/dist/components/ui/PageLayout.svelte.d.ts +1 -0
  116. package/dist/components/ui/Pagination.svelte +80 -0
  117. package/dist/components/ui/Pagination.svelte.d.ts +8 -0
  118. package/dist/components/ui/PathListField.svelte +17 -14
  119. package/dist/components/ui/StackList.svelte +18 -18
  120. package/dist/components/ui/StackList.svelte.d.ts +6 -27
  121. package/dist/components/ui/StackListItem.svelte +47 -25
  122. package/dist/components/ui/StackListItem.svelte.d.ts +5 -2
  123. package/dist/components/ui/StackListOption.svelte +33 -0
  124. package/dist/components/ui/StackListOption.svelte.d.ts +11 -0
  125. package/dist/components/ui/StackListPlaceholder.svelte +12 -0
  126. package/dist/components/ui/StackListPlaceholder.svelte.d.ts +7 -0
  127. package/dist/components/ui/StepNumber.svelte +20 -0
  128. package/dist/components/ui/StepNumber.svelte.d.ts +7 -0
  129. package/dist/components/util/Suspense.svelte +7 -3
  130. package/dist/components/util/YuccaContext.svelte +1 -1
  131. package/dist/events.js +1 -1
  132. package/dist/fetch-client.d.ts +2 -0
  133. package/dist/index.d.ts +6 -1
  134. package/dist/index.js +6 -1
  135. package/dist/services/backend.service.js +3 -0
  136. package/dist/services/immich.integration.service.d.ts +1 -1
  137. package/dist/services/immich.integration.service.js +2 -3
  138. package/dist/services/integrations.service.d.ts +1 -0
  139. package/dist/services/integrations.service.js +2 -1
  140. package/dist/services/log.service.svelte.d.ts +12 -0
  141. package/dist/services/log.service.svelte.js +15 -1
  142. package/dist/services/repository.service.js +9 -3
  143. package/dist/services/runHistory.service.d.ts +1 -1
  144. package/dist/services/runHistory.service.js +5 -4
  145. package/dist/utils/format.d.ts +1 -1
  146. package/dist/utils/format.js +2 -2
  147. package/package.json +3 -3
  148. package/dist/components/backups/dialogs/ViewLogModal.svelte +0 -208
  149. package/dist/components/backups/dialogs/ViewLogModal.svelte.d.ts +0 -7
  150. package/dist/components/integrations/immich/ImmichConfigureBackup.svelte +0 -403
  151. package/dist/components/integrations/immich/ImmichConfigureBackup.svelte.d.ts +0 -9
  152. package/dist/components/integrations/immich/ImmichConfirmDefaultBackup.svelte +0 -80
  153. package/dist/components/integrations/immich/ImmichConfirmDefaultBackup.svelte.d.ts +0 -8
  154. package/dist/components/onboarding/stages/OnboardingStageKeyConfirm.svelte +0 -56
  155. package/dist/components/onboarding/stages/OnboardingStageKeyConfirm.svelte.d.ts +0 -9
  156. package/dist/components/onboarding/stages/OnboardingStageKeyIntro.svelte +0 -50
  157. package/dist/components/onboarding/stages/OnboardingStageKeyIntro.svelte.d.ts +0 -7
  158. package/dist/components/onboarding/stages/OnboardingStageKeySave.svelte +0 -44
  159. package/dist/components/onboarding/stages/OnboardingStageKeySave.svelte.d.ts +0 -8
  160. package/dist/components/onboarding/stages/OnboardingStageWelcome.svelte +0 -56
  161. package/dist/components/onboarding/stages/OnboardingStageWelcome.svelte.d.ts +0 -9
  162. package/dist/components/util/TimedButton.svelte +0 -37
  163. package/dist/components/util/TimedButton.svelte.d.ts +0 -7
@@ -4,26 +4,42 @@
4
4
  Button,
5
5
  ContextMenuButton,
6
6
  HStack,
7
+ IconButton,
7
8
  type ActionItem,
8
9
  } from "@immich/ui";
10
+ import { mdiArrowLeft } from "@mdi/js";
9
11
  import type { Snippet } from "svelte";
10
12
 
11
13
  type Props = {
12
14
  title?: string;
13
15
  actions?: ActionItem[];
16
+ onBack?: () => void;
14
17
  children?: Snippet;
15
18
  };
16
19
 
17
- const { title, actions = [], children }: Props = $props();
20
+ const { title, actions = [], onBack, children }: Props = $props();
18
21
  const { demoPadding } = options;
22
+
23
+ const hasHeader = $derived(Boolean(title) || actions.length > 0 || Boolean(onBack));
19
24
  </script>
20
25
 
21
- <main class="absolute inset-0">
22
- {#if title || actions.length > 0}
26
+ <main class="flex h-full w-full flex-col">
27
+ {#if hasHeader}
23
28
  <div
24
- class="absolute top-0 left-0 flex h-16 w-full place-items-center justify-between border-b p-2 text-dark"
29
+ class="flex h-16 shrink-0 place-items-center justify-between border-b p-2 text-dark"
25
30
  >
26
31
  <div class="flex gap-2 items-center">
32
+ {#if onBack}
33
+ <IconButton
34
+ icon={mdiArrowLeft}
35
+ aria-label="Back"
36
+ variant="ghost"
37
+ color="secondary"
38
+ shape="round"
39
+ onclick={onBack}
40
+ />
41
+ {/if}
42
+
27
43
  {#if title}
28
44
  <div class="outline-none pe-8">{title}</div>
29
45
  {/if}
@@ -57,11 +73,7 @@
57
73
  </div>
58
74
  {/if}
59
75
 
60
- <div
61
- class="absolute left-0 w-full overflow-y-auto {title || actions.length > 0
62
- ? 'top-16 h-[calc(100%-4rem)]'
63
- : 'top-0 h-full'} {$demoPadding ? 'p-4' : ''}"
64
- >
76
+ <div class="min-h-0 grow overflow-y-auto {$demoPadding ? 'p-4' : ''}">
65
77
  {@render children?.()}
66
78
  </div>
67
79
  </main>
@@ -3,6 +3,7 @@ import type { Snippet } from "svelte";
3
3
  type Props = {
4
4
  title?: string;
5
5
  actions?: ActionItem[];
6
+ onBack?: () => void;
6
7
  children?: Snippet;
7
8
  };
8
9
  declare const PageLayout: import("svelte").Component<Props, {}, "">;
@@ -0,0 +1,80 @@
1
+ <script lang="ts">
2
+ import { Button, HStack, IconButton, Text } from "@immich/ui";
3
+ import { mdiChevronLeft, mdiChevronRight } from "@mdi/js";
4
+
5
+ type Props = {
6
+ page: number;
7
+ pageCount: number;
8
+ onChange: (page: number) => void;
9
+ };
10
+
11
+ const { page, pageCount, onChange }: Props = $props();
12
+
13
+ const boundaryCount = 2;
14
+ const siblingCount = 0;
15
+
16
+ const range = (from: number, to: number) =>
17
+ Array.from({ length: Math.max(to - from + 1, 0) }, (_, index) => from + index);
18
+
19
+ const pages = $derived.by(() => {
20
+ const shown = new Set([
21
+ ...range(1, Math.min(boundaryCount, pageCount)),
22
+ ...range(Math.max(pageCount - boundaryCount + 1, 1), pageCount),
23
+ ...range(
24
+ Math.max(page - siblingCount, 1),
25
+ Math.min(page + siblingCount, pageCount),
26
+ ),
27
+ ]);
28
+
29
+ const items: (number | "ellipsis")[] = [];
30
+ for (const candidate of range(1, pageCount)) {
31
+ if (shown.has(candidate)) {
32
+ items.push(candidate);
33
+ } else if (items.at(-1) !== "ellipsis") {
34
+ items.push("ellipsis");
35
+ }
36
+ }
37
+
38
+ return items;
39
+ });
40
+ </script>
41
+
42
+ <HStack class="items-center justify-between">
43
+ <IconButton
44
+ icon={mdiChevronLeft}
45
+ aria-label="Previous page"
46
+ variant="ghost"
47
+ color="secondary"
48
+ disabled={page <= 1}
49
+ onclick={() => onChange(page - 1)}
50
+ />
51
+
52
+ <HStack gap={1} class="items-center">
53
+ {#each pages as item, index (index)}
54
+ {#if item === "ellipsis"}
55
+ <Text class="w-8 text-center" color="muted">&hellip;</Text>
56
+ {:else}
57
+ <Button
58
+ size="small"
59
+ variant="ghost"
60
+ color="secondary"
61
+ class={item === page ? "bg-subtle" : undefined}
62
+ aria-label={`Page ${item}`}
63
+ aria-current={item === page ? "page" : undefined}
64
+ onclick={() => onChange(item)}
65
+ >
66
+ {item}
67
+ </Button>
68
+ {/if}
69
+ {/each}
70
+ </HStack>
71
+
72
+ <IconButton
73
+ icon={mdiChevronRight}
74
+ aria-label="Next page"
75
+ variant="ghost"
76
+ color="secondary"
77
+ disabled={page >= pageCount}
78
+ onclick={() => onChange(page + 1)}
79
+ />
80
+ </HStack>
@@ -0,0 +1,8 @@
1
+ type Props = {
2
+ page: number;
3
+ pageCount: number;
4
+ onChange: (page: number) => void;
5
+ };
6
+ declare const Pagination: import("svelte").Component<Props, {}, "">;
7
+ type Pagination = ReturnType<typeof Pagination>;
8
+ export default Pagination;
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
2
  import StackList from "./StackList.svelte";
3
+ import StackListItem from "./StackListItem.svelte";
3
4
  import type { FilesystemListingResponseDto } from "../../fetch-client";
4
5
  import {
5
6
  Button,
6
- HStack,
7
7
  IconButton,
8
8
  modalManager,
9
9
  Text,
@@ -58,26 +58,29 @@
58
58
 
59
59
  {#if paths.size > 0}
60
60
  {#each [...paths] as path (path)}
61
- <HStack gap={2} class="px-4 py-3">
61
+ <StackListItem>
62
62
  <Text class="grow truncate" title={path}>{path}</Text>
63
- <IconButton
64
- icon={mdiClose}
65
- aria-label="Remove"
66
- size="tiny"
67
- variant="ghost"
68
- onclick={() => paths.delete(path)}
69
- />
70
- </HStack>
63
+
64
+ {#snippet trailing()}
65
+ <IconButton
66
+ icon={mdiClose}
67
+ aria-label="Remove"
68
+ size="tiny"
69
+ variant="ghost"
70
+ onclick={() => paths.delete(path)}
71
+ />
72
+ {/snippet}
73
+ </StackListItem>
71
74
  {/each}
72
75
  {:else if empty}
73
- <HStack class="px-4 py-3">
76
+ <StackListItem>
74
77
  <Text color="secondary">{@render empty()}</Text>
75
- </HStack>
78
+ </StackListItem>
76
79
  {/if}
77
80
 
78
- <HStack class="px-4 py-2">
81
+ <StackListItem>
79
82
  <Button size="small" variant="ghost" onclick={openPicker}>
80
83
  {paths.size > 0 ? addLabel : manageLabel}
81
84
  </Button>
82
- </HStack>
85
+ </StackListItem>
83
86
  </StackList>
@@ -1,30 +1,30 @@
1
- <script lang="ts" generics="T">
2
- import { getReadableErrorMessage } from "../../utils/handle-error";
3
- import { Alert, Heading, LoadingSpinner, Stack } from "@immich/ui";
4
- import type { CreateQueryResult } from "@tanstack/svelte-query";
1
+ <script lang="ts">
2
+ import { Card, CardBody, Heading, HStack, Stack } from "@immich/ui";
5
3
  import type { Snippet } from "svelte";
6
4
 
7
5
  type Props = {
8
6
  title?: Snippet;
9
- query?: CreateQueryResult<T>;
10
- children: Snippet<[T]>;
7
+ action?: Snippet;
8
+ children?: Snippet;
11
9
  };
12
10
 
13
- const { title, query, children }: Props = $props();
11
+ const { title, action, children }: Props = $props();
14
12
  </script>
15
13
 
16
14
  <Stack gap={2}>
17
- {#if title}
18
- <Heading class="px-1" size="tiny">{@render title()}</Heading>
19
- {/if}
15
+ {#if title || action}
16
+ <HStack class="items-center justify-between px-1">
17
+ {#if title}
18
+ <Heading size="tiny">{@render title()}</Heading>
19
+ {/if}
20
20
 
21
- {#if query?.isLoading}
22
- <LoadingSpinner />
23
- {:else if query?.isError}
24
- <Alert color="danger">{getReadableErrorMessage(query.error)}</Alert>
25
- {:else}
26
- <Stack gap={0} class="divide-y rounded-2xl border overflow-hidden">
27
- {@render children(query?.data as T)}
28
- </Stack>
21
+ {@render action?.()}
22
+ </HStack>
29
23
  {/if}
24
+
25
+ <Card class="border-primary-100 shadow-none">
26
+ <CardBody class="divide-y p-0">
27
+ {@render children?.()}
28
+ </CardBody>
29
+ </Card>
30
30
  </Stack>
@@ -1,30 +1,9 @@
1
- import type { CreateQueryResult } from "@tanstack/svelte-query";
2
1
  import type { Snippet } from "svelte";
3
- declare function $$render<T>(): {
4
- props: {
5
- title?: Snippet;
6
- query?: CreateQueryResult<T>;
7
- children: Snippet<[T]>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ title?: Snippet;
4
+ action?: Snippet;
5
+ children?: Snippet;
13
6
  };
14
- declare class __sveltets_Render<T> {
15
- props(): ReturnType<typeof $$render<T>>['props'];
16
- events(): ReturnType<typeof $$render<T>>['events'];
17
- slots(): ReturnType<typeof $$render<T>>['slots'];
18
- bindings(): "";
19
- exports(): {};
20
- }
21
- interface $$IsomorphicComponent {
22
- new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
23
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
24
- } & ReturnType<__sveltets_Render<T>['exports']>;
25
- <T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
27
- }
28
- declare const StackList: $$IsomorphicComponent;
29
- type StackList<T> = InstanceType<typeof StackList<T>>;
7
+ declare const StackList: import("svelte").Component<Props, {}, "">;
8
+ type StackList = ReturnType<typeof StackList>;
30
9
  export default StackList;
@@ -1,43 +1,69 @@
1
1
  <script lang="ts">
2
2
  import { hasActions } from "../../utils/actions";
3
- import { ContextMenuButton, HStack, type ActionItem } from "@immich/ui";
3
+ import {
4
+ ContextMenuButton,
5
+ HStack,
6
+ Stack,
7
+ Text,
8
+ type ActionItem,
9
+ } from "@immich/ui";
4
10
  import { mdiDotsVertical } from "@mdi/js";
5
11
  import type { Snippet } from "svelte";
6
12
 
13
+ type Color = "primary" | "success" | "warning" | "danger";
14
+
7
15
  type Props = {
8
16
  class?: string;
17
+ title?: string;
18
+ color?: Color;
9
19
  icon?: Snippet;
10
20
  children: Snippet;
11
21
  trailing?: Snippet;
22
+ footer?: Snippet;
23
+ footerColor?: Color;
12
24
  actions?: ActionItem[];
13
- disabled?: boolean;
14
- onclick?: () => void;
15
25
  };
16
26
 
17
27
  const {
18
28
  class: className,
29
+ title,
30
+ color = "primary",
19
31
  icon,
20
32
  children,
21
33
  trailing,
34
+ footer,
35
+ footerColor = "primary",
22
36
  actions = [],
23
- disabled = false,
24
- onclick,
25
37
  }: Props = $props();
38
+
39
+ const tints: Record<Color, string> = {
40
+ primary: "bg-primary-50 text-primary",
41
+ success: "bg-success-50 text-success-700",
42
+ warning: "bg-warning-50 text-warning-800",
43
+ danger: "bg-danger-50 text-danger-700",
44
+ };
26
45
  </script>
27
46
 
28
- {#snippet body()}
29
- <HStack gap={4} class={`${className} items-center px-4 py-3`}>
47
+ <div>
48
+ <HStack gap={4} class={`${className} items-center px-5 py-4`}>
30
49
  {#if icon}
31
50
  <div
32
- class="flex p-2 items-center justify-center rounded-lg bg-subtle text-lg"
51
+ class={`flex size-10 shrink-0 items-center justify-center rounded-lg text-xl ${tints[color]}`}
33
52
  >
34
- {@render icon?.()}
53
+ {@render icon()}
35
54
  </div>
36
55
  {/if}
37
56
 
38
- <HStack gap={1} class="flex-1 items-baseline">
39
- {@render children()}
40
- </HStack>
57
+ {#if title}
58
+ <Stack gap={0} class="flex-1 min-w-0">
59
+ <Text class="truncate">{title}</Text>
60
+ <Text size="small" color="muted">{@render children()}</Text>
61
+ </Stack>
62
+ {:else}
63
+ <HStack gap={1} class="flex-1 items-baseline">
64
+ {@render children()}
65
+ </HStack>
66
+ {/if}
41
67
 
42
68
  {@render trailing?.()}
43
69
 
@@ -51,17 +77,13 @@
51
77
  />
52
78
  {/if}
53
79
  </HStack>
54
- {/snippet}
55
80
 
56
- {#if onclick}
57
- <button
58
- {onclick}
59
- {disabled}
60
- type="button"
61
- class="block w-full text-left rounded-lg hover:bg-subtle focus-visible:outline-2 focus-visible:outline-primary-500 cursor-pointer disabled:cursor-not-allowed disabled:opacity-60"
62
- >
63
- {@render body()}
64
- </button>
65
- {:else}
66
- {@render body()}
67
- {/if}
81
+ {#if footer}
82
+ <HStack
83
+ gap={2}
84
+ class={`items-center border-t px-5 py-3 ${tints[footerColor]}`}
85
+ >
86
+ {@render footer()}
87
+ </HStack>
88
+ {/if}
89
+ </div>
@@ -1,13 +1,16 @@
1
1
  import { type ActionItem } from "@immich/ui";
2
2
  import type { Snippet } from "svelte";
3
+ type Color = "primary" | "success" | "warning" | "danger";
3
4
  type Props = {
4
5
  class?: string;
6
+ title?: string;
7
+ color?: Color;
5
8
  icon?: Snippet;
6
9
  children: Snippet;
7
10
  trailing?: Snippet;
11
+ footer?: Snippet;
12
+ footerColor?: Color;
8
13
  actions?: ActionItem[];
9
- disabled?: boolean;
10
- onclick?: () => void;
11
14
  };
12
15
  declare const StackListItem: import("svelte").Component<Props, {}, "">;
13
16
  type StackListItem = ReturnType<typeof StackListItem>;
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { Icon } from "@immich/ui";
3
+ import { mdiChevronRight } from "@mdi/js";
4
+ import type { Snippet } from "svelte";
5
+ import StackListItem from "./StackListItem.svelte";
6
+
7
+ type Props = {
8
+ title: string;
9
+ icon?: Snippet;
10
+ children: Snippet;
11
+ disabled?: boolean;
12
+ onclick: () => void;
13
+ };
14
+
15
+ const { title, icon, children, disabled = false, onclick }: Props = $props();
16
+ </script>
17
+
18
+ <button
19
+ type="button"
20
+ {disabled}
21
+ {onclick}
22
+ class="block w-full cursor-pointer text-left hover:bg-subtle focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-primary-500 disabled:cursor-not-allowed disabled:opacity-60"
23
+ >
24
+ <StackListItem {title} {icon}>
25
+ {@render children()}
26
+
27
+ {#snippet trailing()}
28
+ {#if !disabled}
29
+ <Icon icon={mdiChevronRight} />
30
+ {/if}
31
+ {/snippet}
32
+ </StackListItem>
33
+ </button>
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from "svelte";
2
+ type Props = {
3
+ title: string;
4
+ icon?: Snippet;
5
+ children: Snippet;
6
+ disabled?: boolean;
7
+ onclick: () => void;
8
+ };
9
+ declare const StackListOption: import("svelte").Component<Props, {}, "">;
10
+ type StackListOption = ReturnType<typeof StackListOption>;
11
+ export default StackListOption;
@@ -0,0 +1,12 @@
1
+ <script lang="ts">
2
+ import { Text } from "@immich/ui";
3
+ import type { Snippet } from "svelte";
4
+
5
+ type Props = {
6
+ children: Snippet;
7
+ };
8
+
9
+ const { children }: Props = $props();
10
+ </script>
11
+
12
+ <Text class="block text-center py-8" color="muted">{@render children()}</Text>
@@ -0,0 +1,7 @@
1
+ import type { Snippet } from "svelte";
2
+ type Props = {
3
+ children: Snippet;
4
+ };
5
+ declare const StackListPlaceholder: import("svelte").Component<Props, {}, "">;
6
+ type StackListPlaceholder = ReturnType<typeof StackListPlaceholder>;
7
+ export default StackListPlaceholder;
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ type Props = {
3
+ step: number;
4
+ size?: "small" | "medium";
5
+ };
6
+
7
+ const { step, size = "medium" }: Props = $props();
8
+
9
+ const sizes = {
10
+ small: "size-5 text-xs",
11
+ medium: "size-8 text-lg",
12
+ };
13
+ </script>
14
+
15
+ <span
16
+ class={`bg-primary text-light flex shrink-0 items-center justify-center rounded-full tabular-nums ${sizes[size]}`}
17
+ aria-hidden="true"
18
+ >
19
+ {step}
20
+ </span>
@@ -0,0 +1,7 @@
1
+ type Props = {
2
+ step: number;
3
+ size?: "small" | "medium";
4
+ };
5
+ declare const StepNumber: import("svelte").Component<Props, {}, "">;
6
+ type StepNumber = ReturnType<typeof StepNumber>;
7
+ export default StepNumber;
@@ -1,6 +1,6 @@
1
1
  <script lang="ts" generics="T extends object">
2
2
  import { getReadableErrorMessage } from "../../utils/handle-error";
3
- import { Alert, LoadingSpinner } from "@immich/ui";
3
+ import { Alert, HStack, LoadingSpinner } from "@immich/ui";
4
4
  import type { CreateQueryResult } from "@tanstack/svelte-query";
5
5
  import type { Snippet } from "svelte";
6
6
 
@@ -13,9 +13,13 @@
13
13
  </script>
14
14
 
15
15
  {#if query.isLoading}
16
- <LoadingSpinner />
16
+ <HStack class="justify-center p-8">
17
+ <LoadingSpinner />
18
+ </HStack>
17
19
  {:else if query.isError}
18
- <Alert color="danger">{getReadableErrorMessage(query.error)}</Alert>
20
+ <div class="p-4">
21
+ <Alert color="danger">{getReadableErrorMessage(query.error)}</Alert>
22
+ </div>
19
23
  {:else if query.isSuccess}
20
24
  {@render children(query.data)}
21
25
  {/if}
@@ -12,7 +12,7 @@
12
12
  const { baseUrl, children }: Props = $props();
13
13
 
14
14
  // svelte-ignore state_referenced_locally
15
- if (baseUrl) {
15
+ if (typeof baseUrl === "string") {
16
16
  orchestrationDefaults.baseUrl = baseUrl;
17
17
  }
18
18
 
package/dist/events.js CHANGED
@@ -10,7 +10,7 @@ export class SocketEvent extends Event {
10
10
  }
11
11
  }
12
12
  function createSocket() {
13
- socket = io(defaults.baseUrl, {
13
+ socket = io(defaults.baseUrl || undefined, {
14
14
  path: '/api/yucca/socket.io',
15
15
  transports: ['websocket'],
16
16
  autoConnect: false,
@@ -81,6 +81,7 @@ export type ConfigureImmichIntegrationRequestDto = {
81
81
  backupConfiguration: boolean;
82
82
  libraries: "all" | string[];
83
83
  retentionPolicy?: (RetentionPolicyDto) | null;
84
+ paused?: boolean;
84
85
  };
85
86
  export type ImmichRollbackRequestDto = {
86
87
  repositoryId: string;
@@ -185,6 +186,7 @@ export type RepositoryInspectResponseDto = {
185
186
  };
186
187
  export type RepositoryUpdateRequestDto = {
187
188
  name?: string;
189
+ worm?: boolean;
188
190
  paths?: string[];
189
191
  retentionPolicy?: (RetentionPolicyDto) | null;
190
192
  };
package/dist/index.d.ts CHANGED
@@ -1,13 +1,18 @@
1
1
  export { default as BackendsList } from './components/backends/BackendsList.svelte';
2
2
  export { default as BackupsList } from './components/backups/BackupsList.svelte';
3
- export { default as ViewLogModal } from './components/backups/dialogs/ViewLogModal.svelte';
3
+ export { default as ViewStatusModal } from './components/backups/dialogs/ViewStatusModal.svelte';
4
4
  export { default as Dashboard } from './components/dashboard/Dashboard.svelte';
5
+ export { default as ImmichBackupsNavButton } from './components/integrations/immich/ImmichBackupsNavButton.svelte';
5
6
  export { default as ImmichBackupsPage } from './components/integrations/immich/ImmichBackupsPage.svelte';
7
+ export { default as ImmichBackupsSidebarItem } from './components/integrations/immich/ImmichBackupsSidebarItem.svelte';
6
8
  export { default as ImmichManageBackup } from './components/integrations/immich/ImmichManageBackup.svelte';
7
9
  export { default as ImmichOnboardingRestoreFlow } from './components/integrations/immich/ImmichOnboardingRestoreFlow.svelte';
8
10
  export { default as ImmichOnboardingSetupFlow } from './components/integrations/immich/ImmichOnboardingSetupFlow.svelte';
9
11
  export { default as OnboardingGate } from './components/onboarding/OnboardingGate.svelte';
12
+ export { default as UpsellModal } from './components/onboarding/upsell/UpsellModal.svelte';
13
+ export { default as UpsellPage } from './components/onboarding/upsell/UpsellPage.svelte';
10
14
  export { default as ScheduleList } from './components/schedules/ScheduleList.svelte';
15
+ export { default as GlobalSettings } from './components/settings/GlobalSettings.svelte';
11
16
  export { default as VisualisationGauge } from './components/ui/VisualisationGauge.svelte';
12
17
  export { default as VisualisationSegmentedBar } from './components/ui/VisualisationSegmentedBar.svelte';
13
18
  export { default as OnEvents } from './components/util/OnEvents.svelte';
package/dist/index.js CHANGED
@@ -1,13 +1,18 @@
1
1
  export { default as BackendsList } from './components/backends/BackendsList.svelte';
2
2
  export { default as BackupsList } from './components/backups/BackupsList.svelte';
3
- export { default as ViewLogModal } from './components/backups/dialogs/ViewLogModal.svelte';
3
+ export { default as ViewStatusModal } from './components/backups/dialogs/ViewStatusModal.svelte';
4
4
  export { default as Dashboard } from './components/dashboard/Dashboard.svelte';
5
+ export { default as ImmichBackupsNavButton } from './components/integrations/immich/ImmichBackupsNavButton.svelte';
5
6
  export { default as ImmichBackupsPage } from './components/integrations/immich/ImmichBackupsPage.svelte';
7
+ export { default as ImmichBackupsSidebarItem } from './components/integrations/immich/ImmichBackupsSidebarItem.svelte';
6
8
  export { default as ImmichManageBackup } from './components/integrations/immich/ImmichManageBackup.svelte';
7
9
  export { default as ImmichOnboardingRestoreFlow } from './components/integrations/immich/ImmichOnboardingRestoreFlow.svelte';
8
10
  export { default as ImmichOnboardingSetupFlow } from './components/integrations/immich/ImmichOnboardingSetupFlow.svelte';
9
11
  export { default as OnboardingGate } from './components/onboarding/OnboardingGate.svelte';
12
+ export { default as UpsellModal } from './components/onboarding/upsell/UpsellModal.svelte';
13
+ export { default as UpsellPage } from './components/onboarding/upsell/UpsellPage.svelte';
10
14
  export { default as ScheduleList } from './components/schedules/ScheduleList.svelte';
15
+ export { default as GlobalSettings } from './components/settings/GlobalSettings.svelte';
11
16
  export { default as VisualisationGauge } from './components/ui/VisualisationGauge.svelte';
12
17
  export { default as VisualisationSegmentedBar } from './components/ui/VisualisationSegmentedBar.svelte';
13
18
  export { default as OnEvents } from './components/util/OnEvents.svelte';
@@ -23,8 +23,11 @@ export const useDeviceFlow = (uid) => createQuery(() => ({
23
23
  window.open(response.verificationUri, '_blank');
24
24
  return response;
25
25
  },
26
+ gcTime: Infinity,
27
+ retry: 0,
26
28
  refetchOnReconnect: false,
27
29
  refetchOnWindowFocus: false,
30
+ refetchOnMount: true,
28
31
  }), () => queryClient);
29
32
  export const useBackendEventHandler = () => {
30
33
  return {
@@ -1,5 +1,5 @@
1
1
  import { type ActionItem } from '@immich/ui';
2
- export declare const getBackupPageActions: (repositoryId?: string) => {
2
+ export declare const getBackupPageActions: (repositoryId: string | undefined, onConfigure: () => void) => {
3
3
  Configure: ActionItem;
4
4
  ViewRecoveryKey: ActionItem;
5
5
  BackUpNow: ActionItem;