From 62d731aeb9df055b6c8a41a46121f14f493cd829 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 13:05:26 -0800 Subject: [PATCH 01/15] update prettier config --- .prettierrc.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.prettierrc.js b/.prettierrc.js index a522c7ba5..9ff10ff1d 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -7,8 +7,7 @@ module.exports = { bracketSameLine: false, semi: true, quoteProps: 'consistent', - importOrder: ['^[./]', '^@sd/interface/(.*)$', '^@sd/client/(.*)$', '^@sd/ui/(.*)$'], - importOrderSeparation: true, + importOrder: ['^\\w', '^@sd/(interface|client|ui)(/.*)?$', '^[\\./~]'], importOrderSortSpecifiers: true, plugins: ['@trivago/prettier-plugin-sort-imports'] }; From fc2e1e3ae53ca7965fb94d310f0545b0d82bfff8 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 13:06:56 -0800 Subject: [PATCH 02/15] integrate lefthook precommit formatting --- lefthook.yml | 22 ++++++++++++++-------- package.json | 1 + 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lefthook.yml b/lefthook.yml index fd196e7db..074085a91 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -3,12 +3,18 @@ # https://github.com/evilmartians/lefthook/blob/master/docs/full_guide.md # ######################################################################################################################## -pre-push: - parallel: true +pre-commit: commands: - lint: - glob: '*.{ts,tsx}' - run: pnpm eslint {staged_files} - markdown-link-check: - glob: '*.md' - run: pnpm markdown-link-check {staged_files} + # automatically format files, ✨magically✨ + prettier: + glob: '[^pnpm-lock]*.{js,jsx,ts,tsx,html,json,yml,yaml,css,scss,md}' + run: pnpm prettier --write {staged_files} && git add {staged_files} +# pre-push: +# parallel: true +# commands: +# lint: +# glob: '*.{ts,tsx}' +# run: pnpm eslint {staged_files} +# markdown-link-check: +# glob: '*.md' +# run: pnpm markdown-link-check {staged_files} diff --git a/package.json b/package.json index c6ab4f0c4..d4e3c4c08 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { + "postinstall": "lefthook install", "prep": "pnpm gen:prisma && cargo test -p sd-core api::tests::test_and_export_rspc_bindings -- --exact", "build": "turbo run build", "landing-web": "turbo run dev --parallel --filter=@sd/landing --filter=@sd/web", From cfbd0d16aa6e0e4401282604af5effe9a0fa80db Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 18:30:59 -0800 Subject: [PATCH 03/15] better sort packages by external/package/local --- .prettierrc.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.prettierrc.js b/.prettierrc.js index 9ff10ff1d..d441b6004 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -7,7 +7,16 @@ module.exports = { bracketSameLine: false, semi: true, quoteProps: 'consistent', - importOrder: ['^\\w', '^@sd/(interface|client|ui)(/.*)?$', '^[\\./~]'], + importOrder: [ + // external packages + '^([A-Za-z]|@[^s/])', + // spacedrive packages + '^@sd/(interface|client|ui)(/.*)?$', + // this package + '^~/', + // relative + '^\\.' + ], importOrderSortSpecifiers: true, plugins: ['@trivago/prettier-plugin-sort-imports'] }; From 289fc109fd71fc533401b667a9bef5dfb1c32374 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 19:15:33 -0800 Subject: [PATCH 04/15] i love lint-staged --- .lintstagedrc.json | 3 +++ lefthook.yml | 14 ++------------ 2 files changed, 5 insertions(+), 12 deletions(-) create mode 100644 .lintstagedrc.json diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 000000000..59c8ccb43 --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,3 @@ +{ + "*.{js,jsx,ts,tsx,html,json,yml,yaml,css,scss,md}": ["prettier --write"] +} diff --git a/lefthook.yml b/lefthook.yml index 074085a91..1769cc630 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -6,15 +6,5 @@ pre-commit: commands: # automatically format files, ✨magically✨ - prettier: - glob: '[^pnpm-lock]*.{js,jsx,ts,tsx,html,json,yml,yaml,css,scss,md}' - run: pnpm prettier --write {staged_files} && git add {staged_files} -# pre-push: -# parallel: true -# commands: -# lint: -# glob: '*.{ts,tsx}' -# run: pnpm eslint {staged_files} -# markdown-link-check: -# glob: '*.md' -# run: pnpm markdown-link-check {staged_files} + lint-staged: + run: pnpm lint-staged From edfccd9f547230be1fa8034f61db8520b5f4e9df Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Jan 2023 11:17:56 +0800 Subject: [PATCH 05/15] update prettierignore --- .prettierignore | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.prettierignore b/.prettierignore index 69a352b81..3696e573f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,5 @@ -/target -.build \ No newline at end of file +target/ +dist/ +.build/ +Pods/ +*.d.ts From 58dacf5eef20c7e9e5725058d05a968ca1e12e1c Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 19:19:19 -0800 Subject: [PATCH 06/15] prettier: ignore pnpm lockfile --- .prettierignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index 69a352b81..c34320881 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,3 @@ /target -.build \ No newline at end of file +.build +pnpm-lock.yaml From 7268495b6f57fa623a454565bdca5fe13e479715 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 19:19:35 -0800 Subject: [PATCH 07/15] install lint-staged --- package.json | 1 + pnpm-lock.yaml | Bin 785866 -> 792810 bytes 2 files changed, 1 insertion(+) diff --git a/package.json b/package.json index d4e3c4c08..c40ed7c9b 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@evilmartians/lefthook": "^1.1.1", "@trivago/prettier-plugin-sort-imports": "^3.3.0", "cspell": "^6.12.0", + "lint-staged": "^13.1.0", "markdown-link-check": "^3.10.3", "prettier": "^2.7.1", "turbo": "^1.5.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81f10029703bbb58aeeb225203bf97f036cf593a..acdec2435bde8e0e62a6b9df5a06f8010ca87538 100644 GIT binary patch delta 4241 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 delta 372 zcmV-)0gL|Xu`tT}FR(KKlg0uSvtt2C0fWW@hsFW{hsFW|hsFW}hsFW~x5femTqKi1 zfD^YSCk5{Vx6&&Gb^^BsF9pUVw~AB+x{d=fE;N@x5DPX{N=i#^IYm=JQfW>_LPAnx zR8vqwIWJRpVNhZ#cWE&>L`_&PayUX(Q+aSPWOztnGfH_?cwsU}QEEk2VP`dRLTM{c zGjL2cG*wzKSZHohb4_|HGnbJQ1RlCw~X=z!Ns={xd#e125w_?X>V?qkcS5=w-@jStQEJJ1_(1&w<}=?;SaYw zatPXBx6#uG!85m$2nlQ#x8WcOSTMKrQ3=osw~<~6!05N^M+ylJmseK`5Vyrv3d1nB z;))8=D7SXB3cUfB;vNMPw`8{pEef}I!V2dDw Date: Thu, 19 Jan 2023 19:27:10 -0800 Subject: [PATCH 08/15] ensure more things are ignored by prettier --- .prettierignore | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.prettierignore b/.prettierignore index 689098de5..c578c60eb 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,7 +4,10 @@ dist/ # macOS/iOS product/cache .build/ Pods/ -# prettier sometimes can't parse .d.ts files +# just in case it tries to parse for some reason +*.rs +# prettier sometimes can't parse these *.d.ts -# this one ... we just don't need the spam fr +packages/interface/scripts/generateSvgImports.mjs +# we plainly don't need a lockfile to look nice pnpm-lock.yaml From 5e7e484753ed348435d60d736c05a483d65f8d99 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 19:27:46 -0800 Subject: [PATCH 09/15] let prettier determine its own supported types --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c40ed7c9b..591e220b6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "landing-web": "turbo run dev --parallel --filter=@sd/landing --filter=@sd/web", "gen:migrations": "cd core && cargo prisma migrate dev", "gen:prisma": "cd core && cargo prisma generate", - "format": "prettier --config .prettierrc.js --write \"**/*.{ts,tsx,html,scss,json,yml,md}\"", + "format": "prettier --write .", "desktop": "pnpm --filter @sd/desktop --", "web": "pnpm --filter @sd/web -- ", "mobile": "pnpm --filter @sd/mobile --", From 62bcd3e0f696baa10e6cfe168d581d3c8e62eb84 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 19:30:55 -0800 Subject: [PATCH 10/15] don't let prettier ruin vite config :( --- apps/landing/vite.config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/landing/vite.config.ts b/apps/landing/vite.config.ts index c6db53bed..c833a4f9d 100644 --- a/apps/landing/vite.config.ts +++ b/apps/landing/vite.config.ts @@ -8,6 +8,8 @@ import ssr from 'vite-plugin-ssr/plugin'; import svg from 'vite-plugin-svgr'; export default defineConfig({ + // prettier-ignore + // Prettier reeeally wants to one-line this -- I AM PUTTING MY FOOT DOWN AND SAYING NO! plugins: [ react(), ssr({ prerender: true }), From ec4352a30a537031172d4e74a1f9fb7325e923ea Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 19:32:35 -0800 Subject: [PATCH 11/15] cleanup(don't hate me): prettier format everything --- .github/actions/cache-rust-deps/action.yaml | 1 - apps/desktop/src/App.tsx | 7 +- apps/desktop/src/index.tsx | 8 +- apps/desktop/tsconfig.json | 4 +- apps/desktop/vite.config.ts | 2 +- apps/landing/public/site.webmanifest | 18 +- apps/landing/src/App.tsx | 4 +- apps/landing/src/components/AppEmbed.tsx | 1 - apps/landing/src/components/DocsLayout.tsx | 3 +- apps/landing/src/components/DocsSidebar.tsx | 3 +- apps/landing/src/components/Footer.tsx | 2 +- apps/landing/src/components/HomeCTA.tsx | 4 +- apps/landing/src/components/Markdown.tsx | 1 - apps/landing/src/components/NavBar.tsx | 5 +- apps/landing/src/pages/blog/index.page.tsx | 1 - .../src/pages/blog/post.page.server.ts | 1 - apps/landing/src/pages/blog/post.page.tsx | 1 - apps/landing/src/pages/careers.page.tsx | 2 +- apps/landing/src/pages/docs/api.ts | 1 - .../landing/src/pages/docs/doc.page.server.ts | 1 - apps/landing/src/pages/docs/doc.page.tsx | 1 - apps/landing/src/pages/docs/docs.ts | 1 - apps/landing/src/pages/docs/index.page.tsx | 1 - apps/landing/src/pages/index.page.tsx | 1 - apps/landing/src/pages/team.page.tsx | 1 - .../src/renderer/_default.page.client.tsx | 1 - .../src/renderer/_default.page.server.tsx | 1 - apps/landing/src/renderer/_error.page.tsx | 3 +- apps/landing/src/renderer/usePageContext.tsx | 1 - apps/landing/src/style.scss | 2 +- apps/landing/tsconfig.json | 4 +- apps/mobile/eas.json | 42 +- apps/mobile/index.js | 1 - apps/mobile/src/App.tsx | 15 +- apps/mobile/src/components/device/Device.tsx | 3 +- .../src/components/explorer/Explorer.tsx | 5 +- .../src/components/explorer/FileItem.tsx | 3 +- .../src/components/explorer/FileRow.tsx | 3 +- .../src/components/explorer/FileThumb.tsx | 3 +- .../src/components/layout/CollapsibleView.tsx | 1 - apps/mobile/src/components/layout/Dialog.tsx | 1 - apps/mobile/src/containers/OverviewStats.tsx | 3 +- .../containers/dialog/CreateLibraryDialog.tsx | 2 +- .../containers/dialog/DeleteLibraryDialog.tsx | 2 +- .../dialog/DeleteLocationDialog.tsx | 2 +- .../containers/dialog/tag/CreateTagDialog.tsx | 2 +- .../containers/dialog/tag/DeleteTagDialog.tsx | 2 +- .../containers/dialog/tag/UpdateTagDialog.tsx | 2 +- .../src/containers/drawer/DrawerContent.tsx | 1 - .../drawer/DrawerLibraryManager.tsx | 1 - .../src/containers/drawer/DrawerLocations.tsx | 3 +- .../src/containers/drawer/DrawerTags.tsx | 3 +- .../mobile/src/containers/modal/FileModal.tsx | 1 - .../src/containers/modal/ImportModal.tsx | 2 +- .../mobile/src/navigation/DrawerNavigator.tsx | 1 - .../src/navigation/LinkingConfiguration.ts | 1 - apps/mobile/src/navigation/TabNavigator.tsx | 1 - apps/mobile/src/navigation/index.tsx | 1 - .../mobile/src/navigation/tabs/NodesStack.tsx | 1 - .../src/navigation/tabs/OverviewStack.tsx | 1 - .../src/navigation/tabs/SpacesStack.tsx | 1 - apps/mobile/src/screens/Location.tsx | 2 +- apps/mobile/src/screens/Tag.tsx | 2 +- .../settings/client/GeneralSettings.tsx | 2 +- .../settings/client/LibrarySettings.tsx | 2 +- .../library/LibraryGeneralSettings.tsx | 2 +- .../settings/library/LocationSettings.tsx | 2 +- .../screens/settings/library/TagsSettings.tsx | 2 +- apps/mobile/src/stores/explorerStore.ts | 2 +- apps/mobile/src/stores/modalStore.ts | 2 +- apps/mobile/tsconfig.json | 4 +- apps/web/src/App.tsx | 2 +- apps/web/src/index.html | 2 +- apps/web/src/index.tsx | 8 +- apps/web/tsconfig.json | 4 +- apps/web/vite.config.ts | 5 +- crates/sync/example/README.md | 2 +- crates/sync/example/web/index.html | 22 +- crates/sync/example/web/package.json | 50 +- crates/sync/example/web/postcss.config.js | 10 +- crates/sync/example/web/src/App.tsx | 1 - crates/sync/example/web/src/index.tsx | 11 +- crates/sync/example/web/src/test.ts | 60 +- crates/sync/example/web/src/utils/bindings.ts | 89 ++- crates/sync/example/web/src/utils/rspc.ts | 19 +- crates/sync/example/web/tailwind.config.js | 15 +- crates/sync/example/web/tsconfig.json | 24 +- crates/sync/example/web/vite.config.ts | 2 +- cspell.config.yaml | 2 +- docs/company/legal/privacy.md | 6 +- docs/developers/architecture/sync.md | 16 +- packages/assets/lottie/loading-pulse.json | 739 +++++++++++++++++- packages/client/src/core.ts | 646 +++++++++++---- .../client/src/hooks/useCurrentLibrary.tsx | 1 - packages/client/src/normi/index.ts | 1 - packages/client/src/rspc.ts | 1 - packages/client/src/stores/debugState.ts | 1 - packages/client/src/stores/themeStore.ts | 1 - packages/client/tsconfig.json | 4 +- packages/config/app.tsconfig.json | 2 +- packages/config/base.tsconfig.json | 7 +- packages/config/vite/index.js | 20 +- packages/interface/src/App.tsx | 7 +- packages/interface/src/AppLayout.tsx | 4 +- packages/interface/src/AppRouter.tsx | 5 +- packages/interface/src/ErrorFallback.tsx | 2 +- packages/interface/src/NotFound.tsx | 2 +- .../src/components/device/Device.tsx | 5 +- .../components/dialog/AddLocationDialog.tsx | 1 - .../src/components/dialog/AlertDialog.tsx | 3 +- .../components/dialog/BackupRestoreDialog.tsx | 4 +- .../components/dialog/CreateLibraryDialog.tsx | 7 +- .../components/dialog/DecryptFileDialog.tsx | 8 +- .../components/dialog/DeleteFileDialog.tsx | 1 - .../components/dialog/DeleteLibraryDialog.tsx | 2 +- .../components/dialog/EncryptFileDialog.tsx | 4 +- .../src/components/dialog/EraseFileDialog.tsx | 6 +- .../src/components/dialog/KeyViewerDialog.tsx | 10 +- .../dialog/MasterPasswordChangeDialog.tsx | 8 +- .../src/components/explorer/Explorer.tsx | 3 +- .../explorer/ExplorerContextMenu.tsx | 7 +- .../explorer/ExplorerOptionsPanel.tsx | 3 +- .../components/explorer/ExplorerTopBar.tsx | 3 +- .../src/components/explorer/FileItem.tsx | 5 +- .../src/components/explorer/FileRow.tsx | 3 +- .../src/components/explorer/FileThumb.tsx | 3 +- .../src/components/explorer/Inspector.tsx | 5 +- .../components/explorer/VirtualizedList.tsx | 3 +- .../explorer/inspector/FavoriteButton.tsx | 4 +- .../components/explorer/inspector/Note.tsx | 5 +- .../src/components/items/DriveListItem.tsx | 1 - .../src/components/jobs/JobManager.tsx | 7 +- packages/interface/src/components/key/Key.tsx | 5 +- .../interface/src/components/key/KeyList.tsx | 3 +- .../src/components/key/KeyManager.tsx | 5 +- .../src/components/key/KeyMounter.tsx | 5 +- .../interface/src/components/layout/Modal.tsx | 2 +- .../src/components/layout/Sidebar.tsx | 9 +- .../components/location/LocationListItem.tsx | 10 +- .../src/components/onboarding/Onboarding.tsx | 3 +- .../src/components/os/TrafficLights.tsx | 6 +- .../components/primitive/InputContainer.tsx | 1 - .../components/primitive/PopoverPicker.tsx | 1 - .../src/components/primitive/Shortcut.tsx | 1 - .../src/components/primitive/Tag.tsx | 1 - .../src/components/primitive/Toasts.tsx | 1 - .../components/settings/SettingsContainer.tsx | 1 - .../components/settings/SettingsSidebar.tsx | 1 - .../interface/src/hooks/useDebouncedForm.ts | 2 +- .../interface/src/hooks/useExplorerStore.tsx | 3 +- .../interface/src/hooks/useKeyboardHandler.ts | 1 - .../interface/src/hooks/useOperatingSystem.ts | 1 - packages/interface/src/screens/Debug.tsx | 1 - .../src/screens/LocationExplorer.tsx | 3 +- packages/interface/src/screens/Overview.tsx | 5 +- .../interface/src/screens/TagExplorer.tsx | 3 +- .../src/screens/settings/Settings.tsx | 1 - .../settings/client/AppearanceSettings.tsx | 3 +- .../settings/client/ExtensionsSettings.tsx | 3 +- .../settings/client/GeneralSettings.tsx | 3 +- .../settings/client/KeybindingSettings.tsx | 3 +- .../settings/client/PrivacySettings.tsx | 3 +- .../screens/settings/info/AboutSpacedrive.tsx | 1 - .../screens/settings/library/KeysSetting.tsx | 4 +- .../library/LibraryGeneralSettings.tsx | 3 +- .../settings/library/LocationSettings.tsx | 2 +- .../screens/settings/library/TagsSettings.tsx | 7 +- .../settings/node/ExperimentalSettings.tsx | 1 - .../settings/node/LibrariesSettings.tsx | 2 +- .../src/screens/settings/node/P2PSettings.tsx | 1 - packages/interface/src/style.scss | 1 - packages/interface/tsconfig.json | 13 +- packages/ui/src/Button.stories.tsx | 1 - packages/ui/src/Dialog.tsx | 1 - packages/ui/src/Dropdown.stories.tsx | 1 - packages/ui/src/Dropdown.tsx | 3 +- packages/ui/src/Select.tsx | 2 +- packages/ui/src/Tabs.tsx | 1 - packages/ui/src/forms/CheckBox.tsx | 1 - packages/ui/src/forms/Input.tsx | 1 - packages/ui/src/forms/Switch.tsx | 1 - packages/ui/style/colors.scss | 186 ++--- packages/ui/style/style.scss | 11 +- packages/ui/tsconfig.json | 4 +- turbo.json | 8 +- 185 files changed, 1731 insertions(+), 738 deletions(-) diff --git a/.github/actions/cache-rust-deps/action.yaml b/.github/actions/cache-rust-deps/action.yaml index 36ab07b8a..af740ea8a 100644 --- a/.github/actions/cache-rust-deps/action.yaml +++ b/.github/actions/cache-rust-deps/action.yaml @@ -1,4 +1,3 @@ - name: Cache Rust Dependencies description: Caches Rust dependencies runs: diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx index 89a516fa0..879c976ec 100644 --- a/apps/desktop/src/App.tsx +++ b/apps/desktop/src/App.tsx @@ -1,12 +1,11 @@ import { loggerLink } from '@rspc/client'; import { tauriLink } from '@rspc/tauri'; -import { getDebugState, hooks, queryClient } from '@sd/client'; -import SpacedriveInterface, { OperatingSystem, Platform, PlatformProvider } from '@sd/interface'; -import { KeybindEvent } from '@sd/interface'; import { dialog, invoke, os, shell } from '@tauri-apps/api'; import { listen } from '@tauri-apps/api/event'; import { useEffect } from 'react'; - +import { getDebugState, hooks, queryClient } from '@sd/client'; +import SpacedriveInterface, { OperatingSystem, Platform, PlatformProvider } from '@sd/interface'; +import { KeybindEvent } from '@sd/interface'; import '@sd/ui/style'; const client = hooks.createClient({ diff --git a/apps/desktop/src/index.tsx b/apps/desktop/src/index.tsx index 78f120dd6..907828be7 100644 --- a/apps/desktop/src/index.tsx +++ b/apps/desktop/src/index.tsx @@ -1,12 +1,10 @@ // WARNING: BE CAREFUL SAVING THIS FILE WITH A FORMATTER ENABLED. The import order is important and goes against prettier's recommendations. - import React, { Suspense } from 'react'; import ReactDOM from 'react-dom/client'; - -import './patches'; // THIS MUST GO BEFORE importing the App -import App from './App'; - import '@sd/ui/style'; +// THIS MUST GO BEFORE importing the App +import App from './App'; +import './patches'; const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); root.render( diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json index 38bb99819..3f7f1295b 100644 --- a/apps/desktop/tsconfig.json +++ b/apps/desktop/tsconfig.json @@ -4,9 +4,7 @@ "rootDir": "src", "declarationDir": "dist" }, - "include": [ - "src" - ], + "include": ["src"], "references": [ { "path": "../../packages/interface" diff --git a/apps/desktop/vite.config.ts b/apps/desktop/vite.config.ts index dad709ff1..14438007d 100644 --- a/apps/desktop/vite.config.ts +++ b/apps/desktop/vite.config.ts @@ -1,8 +1,8 @@ +import { relativeAliasResolver } from '@sd/config/vite'; import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; import svgr from 'vite-plugin-svgr'; import tsconfigPaths from 'vite-tsconfig-paths'; -import { relativeAliasResolver } from "@sd/config/vite" import { name, version } from './package.json'; // https://vitejs.dev/config/ diff --git a/apps/landing/public/site.webmanifest b/apps/landing/public/site.webmanifest index 4536bfc15..a1a17d753 100644 --- a/apps/landing/public/site.webmanifest +++ b/apps/landing/public/site.webmanifest @@ -1,11 +1,11 @@ { - "name": "Spacedrive", - "short_name": "", - "icons": [ - { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, - { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" + "name": "Spacedrive", + "short_name": "", + "icons": [ + { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" } diff --git a/apps/landing/src/App.tsx b/apps/landing/src/App.tsx index dcfe8d8db..d8209d17b 100644 --- a/apps/landing/src/App.tsx +++ b/apps/landing/src/App.tsx @@ -1,13 +1,11 @@ import React, { PropsWithChildren } from 'react'; import { PageContextBuiltIn } from 'vite-plugin-ssr'; - +import '@sd/ui/style'; import { Footer } from './components/Footer'; import NavBar from './components/NavBar'; import { PageContextProvider } from './renderer/usePageContext'; import './style.scss'; -import '@sd/ui/style'; - export default function App({ children, pageContext diff --git a/apps/landing/src/components/AppEmbed.tsx b/apps/landing/src/components/AppEmbed.tsx index 359474db2..0ec9f674e 100644 --- a/apps/landing/src/components/AppEmbed.tsx +++ b/apps/landing/src/components/AppEmbed.tsx @@ -1,7 +1,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ import clsx from 'clsx'; import { useEffect, useRef, useState } from 'react'; - import { getWindow } from '../utils'; const AppEmbed = () => { diff --git a/apps/landing/src/components/DocsLayout.tsx b/apps/landing/src/components/DocsLayout.tsx index e285e10b6..6f5758a6d 100644 --- a/apps/landing/src/components/DocsLayout.tsx +++ b/apps/landing/src/components/DocsLayout.tsx @@ -1,8 +1,7 @@ -import { Button } from '@sd/ui'; import { CaretRight, List, X } from 'phosphor-react'; import { PropsWithChildren, useState } from 'react'; import pkg from 'react-burger-menu'; - +import { Button } from '@sd/ui'; import { Doc, DocsNavigation, toTitleCase } from '../pages/docs/api'; import DocsSidebar from './DocsSidebar'; diff --git a/apps/landing/src/components/DocsSidebar.tsx b/apps/landing/src/components/DocsSidebar.tsx index 1c76d8bbd..33ea5676b 100644 --- a/apps/landing/src/components/DocsSidebar.tsx +++ b/apps/landing/src/components/DocsSidebar.tsx @@ -1,7 +1,6 @@ -import { Input } from '@sd/ui'; import clsx from 'clsx'; import { MagnifyingGlass } from 'phosphor-react'; - +import { Input } from '@sd/ui'; import { DocsNavigation } from '../pages/docs/api'; import config from '../pages/docs/docs'; diff --git a/apps/landing/src/components/Footer.tsx b/apps/landing/src/components/Footer.tsx index 74f3ac2f7..8c01ee31a 100644 --- a/apps/landing/src/components/Footer.tsx +++ b/apps/landing/src/components/Footer.tsx @@ -1,3 +1,4 @@ +import AppLogo from '@sd/assets/images/logo.png'; import { Discord, Github, @@ -6,7 +7,6 @@ import { Twitch, Twitter } from '@icons-pack/react-simple-icons'; -import AppLogo from '@sd/assets/images/logo.png'; import { PropsWithChildren } from 'react'; function FooterLink(props: PropsWithChildren<{ link: string; blank?: boolean }>) { diff --git a/apps/landing/src/components/HomeCTA.tsx b/apps/landing/src/components/HomeCTA.tsx index 701b3b6df..0f63d7f94 100644 --- a/apps/landing/src/components/HomeCTA.tsx +++ b/apps/landing/src/components/HomeCTA.tsx @@ -1,11 +1,11 @@ -import { Github } from '@icons-pack/react-simple-icons'; import { ReactComponent as Alert } from '@sd/assets/svgs/alert.svg'; import { ReactComponent as Info } from '@sd/assets/svgs/info.svg'; import { ReactComponent as Spinner } from '@sd/assets/svgs/spinner.svg'; -import { Button, Input } from '@sd/ui'; +import { Github } from '@icons-pack/react-simple-icons'; import clsx from 'clsx'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; +import { Button, Input } from '@sd/ui'; interface WaitlistInputs { email: string; diff --git a/apps/landing/src/components/Markdown.tsx b/apps/landing/src/components/Markdown.tsx index cc130e616..7641cc971 100644 --- a/apps/landing/src/components/Markdown.tsx +++ b/apps/landing/src/components/Markdown.tsx @@ -3,7 +3,6 @@ import Prism from 'prismjs'; import 'prismjs/components/prism-rust'; import 'prismjs/components/prism-typescript'; import { PropsWithChildren, useEffect } from 'react'; - import '../atom-one.css'; interface MarkdownPageProps { diff --git a/apps/landing/src/components/NavBar.tsx b/apps/landing/src/components/NavBar.tsx index 3efb58821..2cdae2412 100644 --- a/apps/landing/src/components/NavBar.tsx +++ b/apps/landing/src/components/NavBar.tsx @@ -1,11 +1,10 @@ -import { Academia, Discord, Github } from '@icons-pack/react-simple-icons'; import AppLogo from '@sd/assets/images/logo.png'; -import { Button, Dropdown } from '@sd/ui'; +import { Academia, Discord, Github } from '@icons-pack/react-simple-icons'; import clsx from 'clsx'; import { Book, Chat, DotsThreeVertical, MapPin, User } from 'phosphor-react'; import { PropsWithChildren, useEffect, useState } from 'react'; import * as router from 'vite-plugin-ssr/client/router'; - +import { Button, Dropdown } from '@sd/ui'; import { positions } from '../pages/careers.page'; import { getWindow } from '../utils'; diff --git a/apps/landing/src/pages/blog/index.page.tsx b/apps/landing/src/pages/blog/index.page.tsx index 7a5c699da..316f71208 100644 --- a/apps/landing/src/pages/blog/index.page.tsx +++ b/apps/landing/src/pages/blog/index.page.tsx @@ -1,6 +1,5 @@ import { PostOrPage, Tag } from '@tryghost/content-api'; import { Helmet } from 'react-helmet'; - import { BlogTag } from '../../components/BlogTag'; import { getWindow } from '../../utils'; import { blogEnabled } from './blog'; diff --git a/apps/landing/src/pages/blog/post.page.server.ts b/apps/landing/src/pages/blog/post.page.server.ts index 39f4f9e34..bcb4aff8a 100644 --- a/apps/landing/src/pages/blog/post.page.server.ts +++ b/apps/landing/src/pages/blog/post.page.server.ts @@ -1,5 +1,4 @@ import { PageContextBuiltIn } from 'vite-plugin-ssr'; - import { getPost } from './blog'; export async function onBeforeRender(pageContext: PageContextBuiltIn) { diff --git a/apps/landing/src/pages/blog/post.page.tsx b/apps/landing/src/pages/blog/post.page.tsx index 1253eb72c..4eb4be801 100644 --- a/apps/landing/src/pages/blog/post.page.tsx +++ b/apps/landing/src/pages/blog/post.page.tsx @@ -3,7 +3,6 @@ import Prism from 'prismjs'; import 'prismjs/components/prism-rust'; import { useEffect } from 'react'; import { Helmet } from 'react-helmet'; - import '../../atom-one.css'; import { BlogTag } from '../../components/BlogTag'; diff --git a/apps/landing/src/pages/careers.page.tsx b/apps/landing/src/pages/careers.page.tsx index 3613a5f19..8e5210d5e 100644 --- a/apps/landing/src/pages/careers.page.tsx +++ b/apps/landing/src/pages/careers.page.tsx @@ -1,4 +1,3 @@ -import { Button } from '@sd/ui'; import { Clock, CurrencyDollar, @@ -12,6 +11,7 @@ import { } from 'phosphor-react'; import { useRef } from 'react'; import { Helmet } from 'react-helmet'; +import { Button } from '@sd/ui'; interface PositionPosting { name: string; diff --git a/apps/landing/src/pages/docs/api.ts b/apps/landing/src/pages/docs/api.ts index ceebb3844..cec5c52cd 100644 --- a/apps/landing/src/pages/docs/api.ts +++ b/apps/landing/src/pages/docs/api.ts @@ -1,5 +1,4 @@ import { Component } from 'react'; - import { parseMarkdown } from '../../utils/markdownParse'; export interface Doc { diff --git a/apps/landing/src/pages/docs/doc.page.server.ts b/apps/landing/src/pages/docs/doc.page.server.ts index a3bc6d9a2..5a1b245a4 100644 --- a/apps/landing/src/pages/docs/doc.page.server.ts +++ b/apps/landing/src/pages/docs/doc.page.server.ts @@ -1,5 +1,4 @@ import { PageContextBuiltIn } from 'vite-plugin-ssr'; - import { getDoc } from './api'; import config from './docs'; diff --git a/apps/landing/src/pages/docs/doc.page.tsx b/apps/landing/src/pages/docs/doc.page.tsx index 876be0fb7..ee6ed4b0b 100644 --- a/apps/landing/src/pages/docs/doc.page.tsx +++ b/apps/landing/src/pages/docs/doc.page.tsx @@ -2,7 +2,6 @@ import { Github } from '@icons-pack/react-simple-icons'; import { CaretRight } from 'phosphor-react'; import { PropsWithChildren } from 'react'; import { Helmet } from 'react-helmet'; - import '../../atom-one.css'; import DocsLayout from '../../components/DocsLayout'; import Markdown from '../../components/Markdown'; diff --git a/apps/landing/src/pages/docs/docs.ts b/apps/landing/src/pages/docs/docs.ts index 57135be5c..f4a864739 100644 --- a/apps/landing/src/pages/docs/docs.ts +++ b/apps/landing/src/pages/docs/docs.ts @@ -1,5 +1,4 @@ import { Circle, Cube, Sparkle, Star } from 'phosphor-react'; - import { DocsConfig } from './api'; export function loadDocs() { diff --git a/apps/landing/src/pages/docs/index.page.tsx b/apps/landing/src/pages/docs/index.page.tsx index 789abaf70..80ac2fb16 100644 --- a/apps/landing/src/pages/docs/index.page.tsx +++ b/apps/landing/src/pages/docs/index.page.tsx @@ -1,5 +1,4 @@ import { Helmet } from 'react-helmet'; - import DocsLayout from '../../components/DocsLayout'; import Markdown from '../../components/Markdown'; import { DocsNavigation } from './api'; diff --git a/apps/landing/src/pages/index.page.tsx b/apps/landing/src/pages/index.page.tsx index 20c3b606d..cc52d3299 100644 --- a/apps/landing/src/pages/index.page.tsx +++ b/apps/landing/src/pages/index.page.tsx @@ -2,7 +2,6 @@ import { ReactComponent as Info } from '@sd/assets/svgs/info.svg'; import clsx from 'clsx'; import { useEffect, useState } from 'react'; import { Helmet } from 'react-helmet'; - import AppEmbed, { AppEmbedPlaceholder } from '../components/AppEmbed'; import { Bubbles } from '../components/Bubbles'; // import { Bubbles } from '../components/Bubbles'; diff --git a/apps/landing/src/pages/team.page.tsx b/apps/landing/src/pages/team.page.tsx index ecdd97cc8..28a7296e1 100644 --- a/apps/landing/src/pages/team.page.tsx +++ b/apps/landing/src/pages/team.page.tsx @@ -1,6 +1,5 @@ import { ReactComponent as ArrowRight } from '@sd/assets/svgs/arrow-right.svg'; import { Helmet } from 'react-helmet'; - import Markdown from '../components/Markdown'; import { TeamMember, TeamMemberProps } from '../components/TeamMember'; import { resolveFilesGlob } from '../utils'; diff --git a/apps/landing/src/renderer/_default.page.client.tsx b/apps/landing/src/renderer/_default.page.client.tsx index 7a1b736b5..f430feb4b 100644 --- a/apps/landing/src/renderer/_default.page.client.tsx +++ b/apps/landing/src/renderer/_default.page.client.tsx @@ -1,6 +1,5 @@ import { hydrateRoot } from 'react-dom/client'; import type { PageContextBuiltInClient } from 'vite-plugin-ssr/client'; - import App from '../App'; import type { PageContext } from './types'; diff --git a/apps/landing/src/renderer/_default.page.server.tsx b/apps/landing/src/renderer/_default.page.server.tsx index 5517578f8..9cb529cd5 100644 --- a/apps/landing/src/renderer/_default.page.server.tsx +++ b/apps/landing/src/renderer/_default.page.server.tsx @@ -2,7 +2,6 @@ import ReactDOMServer from 'react-dom/server'; import { Helmet } from 'react-helmet'; import { dangerouslySkipEscape, escapeInject } from 'vite-plugin-ssr'; import type { PageContextBuiltIn } from 'vite-plugin-ssr'; - import App from '../App'; import type { PageContext } from './types'; diff --git a/apps/landing/src/renderer/_error.page.tsx b/apps/landing/src/renderer/_error.page.tsx index cc1ba5e93..96d375d55 100644 --- a/apps/landing/src/renderer/_error.page.tsx +++ b/apps/landing/src/renderer/_error.page.tsx @@ -1,7 +1,6 @@ -import { Button } from '@sd/ui'; import { SmileyXEyes } from 'phosphor-react'; import { Helmet } from 'react-helmet'; - +import { Button } from '@sd/ui'; import Markdown from '../components/Markdown'; import { getWindow } from '../utils'; diff --git a/apps/landing/src/renderer/usePageContext.tsx b/apps/landing/src/renderer/usePageContext.tsx index 92558a969..1ef048c01 100644 --- a/apps/landing/src/renderer/usePageContext.tsx +++ b/apps/landing/src/renderer/usePageContext.tsx @@ -2,7 +2,6 @@ // More infos: https://vite-plugin-ssr.com/pageContext-anywhere import { PropsWithChildren, ReactNode, createContext, useContext } from 'react'; import { PageContextBuiltIn } from 'vite-plugin-ssr'; - import type { PageContext } from './types'; export { PageContextProvider }; diff --git a/apps/landing/src/style.scss b/apps/landing/src/style.scss index 63a5656f5..429889cab 100644 --- a/apps/landing/src/style.scss +++ b/apps/landing/src/style.scss @@ -237,6 +237,6 @@ html { @apply bg-[#00000006] dark:bg-[#00000030] my-[10px] rounded-[6px]; } &::-webkit-scrollbar-thumb { - @apply rounded-[6px] bg-app-selected + @apply rounded-[6px] bg-app-selected; } } diff --git a/apps/landing/tsconfig.json b/apps/landing/tsconfig.json index 81aff2726..59b27623a 100644 --- a/apps/landing/tsconfig.json +++ b/apps/landing/tsconfig.json @@ -1,8 +1,6 @@ { "extends": "../../packages/config/app.tsconfig.json", - "include": [ - "src" - ], + "include": ["src"], "ts-node": { "transpileOnly": true, "compilerOptions": {} diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json index 05122d5ba..db9ce9aca 100644 --- a/apps/mobile/eas.json +++ b/apps/mobile/eas.json @@ -1,23 +1,23 @@ { - "cli": { - "version": ">= 0.56.0" - }, - "build": { - "development": { - "distribution": "internal", - "android": { - "gradleCommand": ":app:assembleDebug" - }, - "ios": { - "buildConfiguration": "Debug" - } - }, - "preview": { - "distribution": "internal" - }, - "production": {} - }, - "submit": { - "production": {} - } + "cli": { + "version": ">= 0.56.0" + }, + "build": { + "development": { + "distribution": "internal", + "android": { + "gradleCommand": ":app:assembleDebug" + }, + "ios": { + "buildConfiguration": "Debug" + } + }, + "preview": { + "distribution": "internal" + }, + "production": {} + }, + "submit": { + "production": {} + } } diff --git a/apps/mobile/index.js b/apps/mobile/index.js index 24dcab9df..fc44ce41d 100644 --- a/apps/mobile/index.js +++ b/apps/mobile/index.js @@ -1,5 +1,4 @@ import { registerRootComponent } from 'expo'; - import { AppWrapper } from './src/main'; // registerRootComponent calls AppRegistry.registerComponent('main', () => App); diff --git a/apps/mobile/src/App.tsx b/apps/mobile/src/App.tsx index f08972ab4..0f464cbd2 100644 --- a/apps/mobile/src/App.tsx +++ b/apps/mobile/src/App.tsx @@ -1,6 +1,13 @@ import { BottomSheetModalProvider } from '@gorhom/bottom-sheet'; import { DefaultTheme, NavigationContainer, Theme } from '@react-navigation/native'; import { loggerLink } from '@rspc/client'; +import * as SplashScreen from 'expo-splash-screen'; +import { StatusBar } from 'expo-status-bar'; +import { useEffect } from 'react'; +import { GestureHandlerRootView } from 'react-native-gesture-handler'; +import { MenuProvider } from 'react-native-popup-menu'; +import { SafeAreaProvider } from 'react-native-safe-area-context'; +import { useDeviceContext } from 'twrnc'; import { LibraryContextProvider, getDebugState, @@ -9,14 +16,6 @@ import { useCurrentLibrary, useInvalidateQuery } from '@sd/client'; -import * as SplashScreen from 'expo-splash-screen'; -import { StatusBar } from 'expo-status-bar'; -import { useEffect } from 'react'; -import { GestureHandlerRootView } from 'react-native-gesture-handler'; -import { MenuProvider } from 'react-native-popup-menu'; -import { SafeAreaProvider } from 'react-native-safe-area-context'; -import { useDeviceContext } from 'twrnc'; - import { GlobalModals } from './containers/modal/GlobalModals'; import { reactNativeLink } from './lib/rspcReactNativeTransport'; import tw from './lib/tailwind'; diff --git a/apps/mobile/src/components/device/Device.tsx b/apps/mobile/src/components/device/Device.tsx index bc6fae92c..afd59e784 100644 --- a/apps/mobile/src/components/device/Device.tsx +++ b/apps/mobile/src/components/device/Device.tsx @@ -1,8 +1,7 @@ -import { ExplorerItem } from '@sd/client'; import { Cloud, Desktop, DeviceMobileCamera, Laptop, Lock } from 'phosphor-react-native'; import { FlatList, Text, View } from 'react-native'; +import { ExplorerItem } from '@sd/client'; import tw from '~/lib/tailwind'; - import FileItem from '../explorer/FileItem'; const placeholderFileItems: ExplorerItem[] = [ diff --git a/apps/mobile/src/components/explorer/Explorer.tsx b/apps/mobile/src/components/explorer/Explorer.tsx index 0d581bf27..115f488f8 100644 --- a/apps/mobile/src/components/explorer/Explorer.tsx +++ b/apps/mobile/src/components/explorer/Explorer.tsx @@ -1,9 +1,9 @@ -import { useNavigation } from '@react-navigation/native'; -import { ExplorerData, ExplorerItem } from '@sd/client'; import { FlashList } from '@shopify/flash-list'; +import { useNavigation } from '@react-navigation/native'; import { Rows, SquaresFour } from 'phosphor-react-native'; import { useEffect, useState } from 'react'; import { Pressable, View } from 'react-native'; +import { ExplorerData, ExplorerItem } from '@sd/client'; import Layout from '~/constants/Layout'; import SortByMenu from '~/containers/menu/SortByMenu'; import tw from '~/lib/tailwind'; @@ -11,7 +11,6 @@ import { SharedScreenProps } from '~/navigation/SharedScreens'; import { getExplorerStore } from '~/stores/explorerStore'; import { useFileModalStore } from '~/stores/modalStore'; import { isPath } from '~/types/helper'; - import FileItem from './FileItem'; import FileRow from './FileRow'; diff --git a/apps/mobile/src/components/explorer/FileItem.tsx b/apps/mobile/src/components/explorer/FileItem.tsx index 389e5d597..c8a281025 100644 --- a/apps/mobile/src/components/explorer/FileItem.tsx +++ b/apps/mobile/src/components/explorer/FileItem.tsx @@ -1,8 +1,7 @@ -import { ExplorerItem, isVideoExt } from '@sd/client'; import { Text, View } from 'react-native'; +import { ExplorerItem, isVideoExt } from '@sd/client'; import Layout from '~/constants/Layout'; import { getExplorerStore } from '~/stores/explorerStore'; - import tw from '../../lib/tailwind'; import FileThumb from './FileThumb'; diff --git a/apps/mobile/src/components/explorer/FileRow.tsx b/apps/mobile/src/components/explorer/FileRow.tsx index 6ac068c45..f77c05527 100644 --- a/apps/mobile/src/components/explorer/FileRow.tsx +++ b/apps/mobile/src/components/explorer/FileRow.tsx @@ -1,9 +1,8 @@ -import { ExplorerItem, isVideoExt } from '@sd/client'; import React from 'react'; import { Text, View } from 'react-native'; +import { ExplorerItem, isVideoExt } from '@sd/client'; import tw from '~/lib/tailwind'; import { getExplorerStore } from '~/stores/explorerStore'; - import FileThumb from './FileThumb'; type FileRowProps = { diff --git a/apps/mobile/src/components/explorer/FileThumb.tsx b/apps/mobile/src/components/explorer/FileThumb.tsx index 5f2bab84d..e6e8d694b 100644 --- a/apps/mobile/src/components/explorer/FileThumb.tsx +++ b/apps/mobile/src/components/explorer/FileThumb.tsx @@ -1,9 +1,8 @@ -import { ExplorerItem } from '@sd/client'; import { Image, View } from 'react-native'; import { DocumentDirectoryPath } from 'react-native-fs'; +import { ExplorerItem } from '@sd/client'; import { useExplorerStore } from '~/stores/explorerStore'; import { isObject, isPath } from '~/types/helper'; - // import icons from '../../assets/icons/file'; import tw from '../../lib/tailwind'; import FolderIcon from '../icons/FolderIcon'; diff --git a/apps/mobile/src/components/layout/CollapsibleView.tsx b/apps/mobile/src/components/layout/CollapsibleView.tsx index 43814f6e4..0356b3997 100644 --- a/apps/mobile/src/components/layout/CollapsibleView.tsx +++ b/apps/mobile/src/components/layout/CollapsibleView.tsx @@ -3,7 +3,6 @@ import { CaretRight } from 'phosphor-react-native'; import { PropsWithChildren, useReducer } from 'react'; import { Pressable, StyleProp, Text, TextStyle, View, ViewStyle } from 'react-native'; import tw from '~/lib/tailwind'; - import { AnimatedHeight } from '../animation/layout'; type CollapsibleViewProps = PropsWithChildren<{ diff --git a/apps/mobile/src/components/layout/Dialog.tsx b/apps/mobile/src/components/layout/Dialog.tsx index de7a8c9e5..04f437df3 100644 --- a/apps/mobile/src/components/layout/Dialog.tsx +++ b/apps/mobile/src/components/layout/Dialog.tsx @@ -2,7 +2,6 @@ import { MotiView } from 'moti'; import { ReactNode, useState } from 'react'; import { KeyboardAvoidingView, Modal, Platform, Pressable, Text, View } from 'react-native'; import tw from '~/lib/tailwind'; - import { PulseAnimation } from '../animation/lottie'; import { Button } from '../primitive/Button'; diff --git a/apps/mobile/src/containers/OverviewStats.tsx b/apps/mobile/src/containers/OverviewStats.tsx index 49d880d0a..0362837af 100644 --- a/apps/mobile/src/containers/OverviewStats.tsx +++ b/apps/mobile/src/containers/OverviewStats.tsx @@ -1,9 +1,8 @@ -import { Statistics, useLibraryQuery } from '@sd/client'; import byteSize from 'byte-size'; import { FC, useEffect, useState } from 'react'; import { ScrollView, Text, View } from 'react-native'; import RNFS from 'react-native-fs'; - +import { Statistics, useLibraryQuery } from '@sd/client'; import useCounter from '../hooks/useCounter'; import tw from '../lib/tailwind'; diff --git a/apps/mobile/src/containers/dialog/CreateLibraryDialog.tsx b/apps/mobile/src/containers/dialog/CreateLibraryDialog.tsx index 4350d51f3..cc3a08098 100644 --- a/apps/mobile/src/containers/dialog/CreateLibraryDialog.tsx +++ b/apps/mobile/src/containers/dialog/CreateLibraryDialog.tsx @@ -1,5 +1,5 @@ -import { queryClient, useBridgeMutation, useCurrentLibrary } from '@sd/client'; import { useState } from 'react'; +import { queryClient, useBridgeMutation, useCurrentLibrary } from '@sd/client'; import Dialog from '~/components/layout/Dialog'; import { Input } from '~/components/primitive/Input'; diff --git a/apps/mobile/src/containers/dialog/DeleteLibraryDialog.tsx b/apps/mobile/src/containers/dialog/DeleteLibraryDialog.tsx index 48992e6c8..bdcb2c2b0 100644 --- a/apps/mobile/src/containers/dialog/DeleteLibraryDialog.tsx +++ b/apps/mobile/src/containers/dialog/DeleteLibraryDialog.tsx @@ -1,5 +1,5 @@ -import { queryClient, useBridgeMutation } from '@sd/client'; import { useState } from 'react'; +import { queryClient, useBridgeMutation } from '@sd/client'; import Dialog from '~/components/layout/Dialog'; type Props = { diff --git a/apps/mobile/src/containers/dialog/DeleteLocationDialog.tsx b/apps/mobile/src/containers/dialog/DeleteLocationDialog.tsx index e4b4d1155..c2363b182 100644 --- a/apps/mobile/src/containers/dialog/DeleteLocationDialog.tsx +++ b/apps/mobile/src/containers/dialog/DeleteLocationDialog.tsx @@ -1,5 +1,5 @@ -import { useLibraryMutation } from '@sd/client'; import { useState } from 'react'; +import { useLibraryMutation } from '@sd/client'; import Dialog from '~/components/layout/Dialog'; type Props = { diff --git a/apps/mobile/src/containers/dialog/tag/CreateTagDialog.tsx b/apps/mobile/src/containers/dialog/tag/CreateTagDialog.tsx index 9194fb194..d3301a807 100644 --- a/apps/mobile/src/containers/dialog/tag/CreateTagDialog.tsx +++ b/apps/mobile/src/containers/dialog/tag/CreateTagDialog.tsx @@ -1,7 +1,7 @@ -import { queryClient, useLibraryMutation } from '@sd/client'; import React, { useState } from 'react'; import { Pressable, View } from 'react-native'; import ColorPicker from 'react-native-wheel-color-picker'; +import { queryClient, useLibraryMutation } from '@sd/client'; import Dialog from '~/components/layout/Dialog'; import { Input } from '~/components/primitive/Input'; import tw from '~/lib/tailwind'; diff --git a/apps/mobile/src/containers/dialog/tag/DeleteTagDialog.tsx b/apps/mobile/src/containers/dialog/tag/DeleteTagDialog.tsx index 71a30c04c..72f3e863e 100644 --- a/apps/mobile/src/containers/dialog/tag/DeleteTagDialog.tsx +++ b/apps/mobile/src/containers/dialog/tag/DeleteTagDialog.tsx @@ -1,5 +1,5 @@ -import { useLibraryMutation } from '@sd/client'; import { useState } from 'react'; +import { useLibraryMutation } from '@sd/client'; import Dialog from '~/components/layout/Dialog'; type Props = { diff --git a/apps/mobile/src/containers/dialog/tag/UpdateTagDialog.tsx b/apps/mobile/src/containers/dialog/tag/UpdateTagDialog.tsx index 1228d0a91..25ec22531 100644 --- a/apps/mobile/src/containers/dialog/tag/UpdateTagDialog.tsx +++ b/apps/mobile/src/containers/dialog/tag/UpdateTagDialog.tsx @@ -1,7 +1,7 @@ -import { Tag, queryClient, useLibraryMutation } from '@sd/client'; import React, { useState } from 'react'; import { Pressable, Text, View } from 'react-native'; import ColorPicker from 'react-native-wheel-color-picker'; +import { Tag, queryClient, useLibraryMutation } from '@sd/client'; import Dialog from '~/components/layout/Dialog'; import { Input } from '~/components/primitive/Input'; import tw from '~/lib/tailwind'; diff --git a/apps/mobile/src/containers/drawer/DrawerContent.tsx b/apps/mobile/src/containers/drawer/DrawerContent.tsx index 0b88252a9..46c61ce06 100644 --- a/apps/mobile/src/containers/drawer/DrawerContent.tsx +++ b/apps/mobile/src/containers/drawer/DrawerContent.tsx @@ -5,7 +5,6 @@ import { Image, Platform, Pressable, Text, View } from 'react-native'; import Layout from '~/constants/Layout'; import tw from '~/lib/tailwind'; import { getStackNameFromState } from '~/utils/nav'; - import Divider from '../../components/primitive/Divider'; import DrawerLibraryManager from './DrawerLibraryManager'; import DrawerLocations from './DrawerLocations'; diff --git a/apps/mobile/src/containers/drawer/DrawerLibraryManager.tsx b/apps/mobile/src/containers/drawer/DrawerLibraryManager.tsx index 21eaa4533..539074e7f 100644 --- a/apps/mobile/src/containers/drawer/DrawerLibraryManager.tsx +++ b/apps/mobile/src/containers/drawer/DrawerLibraryManager.tsx @@ -6,7 +6,6 @@ import { useEffect, useState } from 'react'; import { Pressable, Text, View } from 'react-native'; import { useCurrentLibrary } from '~/../../../packages/client/src'; import tw from '~/lib/tailwind'; - import { AnimatedHeight } from '../../components/animation/layout'; import Divider from '../../components/primitive/Divider'; import CreateLibraryDialog from '../dialog/CreateLibraryDialog'; diff --git a/apps/mobile/src/containers/drawer/DrawerLocations.tsx b/apps/mobile/src/containers/drawer/DrawerLocations.tsx index 5db6a1c40..e5239073d 100644 --- a/apps/mobile/src/containers/drawer/DrawerLocations.tsx +++ b/apps/mobile/src/containers/drawer/DrawerLocations.tsx @@ -1,11 +1,10 @@ import { BottomSheetModal } from '@gorhom/bottom-sheet'; import { DrawerNavigationHelpers } from '@react-navigation/drawer/lib/typescript/src/types'; import { useNavigation } from '@react-navigation/native'; -import { useLibraryQuery } from '@sd/client'; import { useRef } from 'react'; import { Pressable, Text, View } from 'react-native'; +import { useLibraryQuery } from '@sd/client'; import tw from '~/lib/tailwind'; - import FolderIcon from '../../components/icons/FolderIcon'; import CollapsibleView from '../../components/layout/CollapsibleView'; import ImportModal from '../modal/ImportModal'; diff --git a/apps/mobile/src/containers/drawer/DrawerTags.tsx b/apps/mobile/src/containers/drawer/DrawerTags.tsx index 1ee8e803f..f4817b53f 100644 --- a/apps/mobile/src/containers/drawer/DrawerTags.tsx +++ b/apps/mobile/src/containers/drawer/DrawerTags.tsx @@ -1,9 +1,8 @@ import { DrawerNavigationHelpers } from '@react-navigation/drawer/lib/typescript/src/types'; import { useNavigation } from '@react-navigation/native'; -import { useLibraryQuery } from '@sd/client'; import { ColorValue, Pressable, Text, View } from 'react-native'; +import { useLibraryQuery } from '@sd/client'; import tw from '~/lib/tailwind'; - import CollapsibleView from '../../components/layout/CollapsibleView'; import CreateTagDialog from '../dialog/tag/CreateTagDialog'; diff --git a/apps/mobile/src/containers/modal/FileModal.tsx b/apps/mobile/src/containers/modal/FileModal.tsx index e7384b589..936513de4 100644 --- a/apps/mobile/src/containers/modal/FileModal.tsx +++ b/apps/mobile/src/containers/modal/FileModal.tsx @@ -3,7 +3,6 @@ import dayjs from 'dayjs'; import { CaretLeft } from 'phosphor-react-native'; import { useRef } from 'react'; import { Button, Pressable, Text, View } from 'react-native'; - import { default as FileIcon, default as FileThumb } from '../../components/explorer/FileThumb'; import { Modal } from '../../components/layout/Modal'; import Divider from '../../components/primitive/Divider'; diff --git a/apps/mobile/src/containers/modal/ImportModal.tsx b/apps/mobile/src/containers/modal/ImportModal.tsx index 5e5d7e725..5a8ca9590 100644 --- a/apps/mobile/src/containers/modal/ImportModal.tsx +++ b/apps/mobile/src/containers/modal/ImportModal.tsx @@ -1,9 +1,9 @@ import { BottomSheetModal } from '@gorhom/bottom-sheet'; -import { useLibraryMutation } from '@sd/client'; import * as ML from 'expo-media-library'; import { forwardRef, useCallback } from 'react'; import { Alert, Platform, Text, View } from 'react-native'; import DocumentPicker from 'react-native-document-picker'; +import { useLibraryMutation } from '@sd/client'; // import RFS from 'react-native-fs'; import { Modal } from '~/components/layout/Modal'; import { Button } from '~/components/primitive/Button'; diff --git a/apps/mobile/src/navigation/DrawerNavigator.tsx b/apps/mobile/src/navigation/DrawerNavigator.tsx index 5ef3792f0..2525532ae 100644 --- a/apps/mobile/src/navigation/DrawerNavigator.tsx +++ b/apps/mobile/src/navigation/DrawerNavigator.tsx @@ -3,7 +3,6 @@ import { CompositeScreenProps, NavigatorScreenParams } from '@react-navigation/n import { StackScreenProps } from '@react-navigation/stack'; import DrawerContent from '~/containers/drawer/DrawerContent'; import tw from '~/lib/tailwind'; - import type { RootStackParamList } from '.'; import type { TabParamList } from './TabNavigator'; import TabNavigator from './TabNavigator'; diff --git a/apps/mobile/src/navigation/LinkingConfiguration.ts b/apps/mobile/src/navigation/LinkingConfiguration.ts index 215e73003..68fd12cd1 100644 --- a/apps/mobile/src/navigation/LinkingConfiguration.ts +++ b/apps/mobile/src/navigation/LinkingConfiguration.ts @@ -1,6 +1,5 @@ import { LinkingOptions } from '@react-navigation/native'; import * as Linking from 'expo-linking'; - import { RootStackParamList } from '.'; /** diff --git a/apps/mobile/src/navigation/TabNavigator.tsx b/apps/mobile/src/navigation/TabNavigator.tsx index b978c97d9..076f33f6c 100644 --- a/apps/mobile/src/navigation/TabNavigator.tsx +++ b/apps/mobile/src/navigation/TabNavigator.tsx @@ -3,7 +3,6 @@ import { CompositeScreenProps, NavigatorScreenParams } from '@react-navigation/n import { CirclesFour, Planet, ShareNetwork } from 'phosphor-react-native'; import React from 'react'; import tw from '~/lib/tailwind'; - import type { HomeDrawerScreenProps } from './DrawerNavigator'; import NodesStack, { NodesStackParamList } from './tabs/NodesStack'; import OverviewStack, { OverviewStackParamList } from './tabs/OverviewStack'; diff --git a/apps/mobile/src/navigation/index.tsx b/apps/mobile/src/navigation/index.tsx index 9e323a754..5df36ac98 100644 --- a/apps/mobile/src/navigation/index.tsx +++ b/apps/mobile/src/navigation/index.tsx @@ -3,7 +3,6 @@ import { StackScreenProps, createStackNavigator } from '@react-navigation/stack' import tw from '~/lib/tailwind'; import NotFoundScreen from '~/screens/NotFound'; import SearchScreen from '~/screens/Search'; - import type { DrawerNavParamList } from './DrawerNavigator'; import DrawerNavigator from './DrawerNavigator'; import SettingsNavigator, { SettingsStackParamList } from './SettingsNavigator'; diff --git a/apps/mobile/src/navigation/tabs/NodesStack.tsx b/apps/mobile/src/navigation/tabs/NodesStack.tsx index 46c21f109..c1ee75d13 100644 --- a/apps/mobile/src/navigation/tabs/NodesStack.tsx +++ b/apps/mobile/src/navigation/tabs/NodesStack.tsx @@ -3,7 +3,6 @@ import { StackScreenProps, createStackNavigator } from '@react-navigation/stack' import Header from '~/components/header/Header'; import tw from '~/lib/tailwind'; import NodesScreen from '~/screens/Nodes'; - import { SharedScreens, SharedScreensParamList } from '../SharedScreens'; import { TabScreenProps } from '../TabNavigator'; diff --git a/apps/mobile/src/navigation/tabs/OverviewStack.tsx b/apps/mobile/src/navigation/tabs/OverviewStack.tsx index a52fa4ea0..1614ec7aa 100644 --- a/apps/mobile/src/navigation/tabs/OverviewStack.tsx +++ b/apps/mobile/src/navigation/tabs/OverviewStack.tsx @@ -1,7 +1,6 @@ import { CompositeScreenProps } from '@react-navigation/native'; import { StackScreenProps, TransitionPresets, createStackNavigator } from '@react-navigation/stack'; import tw from '~/lib/tailwind'; - import Header from '../../components/header/Header'; import OverviewScreen from '../../screens/Overview'; import { SharedScreens, SharedScreensParamList } from '../SharedScreens'; diff --git a/apps/mobile/src/navigation/tabs/SpacesStack.tsx b/apps/mobile/src/navigation/tabs/SpacesStack.tsx index 9b056f952..7f3a9f724 100644 --- a/apps/mobile/src/navigation/tabs/SpacesStack.tsx +++ b/apps/mobile/src/navigation/tabs/SpacesStack.tsx @@ -1,7 +1,6 @@ import { CompositeScreenProps } from '@react-navigation/native'; import { StackScreenProps, TransitionPresets, createStackNavigator } from '@react-navigation/stack'; import tw from '~/lib/tailwind'; - import Header from '../../components/header/Header'; import SpacesScreen from '../../screens/Spaces'; import { SharedScreens, SharedScreensParamList } from '../SharedScreens'; diff --git a/apps/mobile/src/screens/Location.tsx b/apps/mobile/src/screens/Location.tsx index d55160610..6c82b04c2 100644 --- a/apps/mobile/src/screens/Location.tsx +++ b/apps/mobile/src/screens/Location.tsx @@ -1,5 +1,5 @@ -import { useLibraryQuery } from '@sd/client'; import { useEffect } from 'react'; +import { useLibraryQuery } from '@sd/client'; import Explorer from '~/components/explorer/Explorer'; import { SharedScreenProps } from '~/navigation/SharedScreens'; import { getExplorerStore } from '~/stores/explorerStore'; diff --git a/apps/mobile/src/screens/Tag.tsx b/apps/mobile/src/screens/Tag.tsx index 1a5cf56c7..f2004ed3b 100644 --- a/apps/mobile/src/screens/Tag.tsx +++ b/apps/mobile/src/screens/Tag.tsx @@ -1,5 +1,5 @@ -import { useLibraryQuery } from '@sd/client'; import { Text, View } from 'react-native'; +import { useLibraryQuery } from '@sd/client'; import Explorer from '~/components/explorer/Explorer'; import tw from '~/lib/tailwind'; import { SharedScreenProps } from '~/navigation/SharedScreens'; diff --git a/apps/mobile/src/screens/settings/client/GeneralSettings.tsx b/apps/mobile/src/screens/settings/client/GeneralSettings.tsx index 52da53636..56b1f711f 100644 --- a/apps/mobile/src/screens/settings/client/GeneralSettings.tsx +++ b/apps/mobile/src/screens/settings/client/GeneralSettings.tsx @@ -1,6 +1,6 @@ -import { useBridgeQuery } from '@sd/client'; import React from 'react'; import { Text, View } from 'react-native'; +import { useBridgeQuery } from '@sd/client'; import Card from '~/components/layout/Card'; import Divider from '~/components/primitive/Divider'; import { Input } from '~/components/primitive/Input'; diff --git a/apps/mobile/src/screens/settings/client/LibrarySettings.tsx b/apps/mobile/src/screens/settings/client/LibrarySettings.tsx index e2819fab9..96af43d0e 100644 --- a/apps/mobile/src/screens/settings/client/LibrarySettings.tsx +++ b/apps/mobile/src/screens/settings/client/LibrarySettings.tsx @@ -1,8 +1,8 @@ -import { LibraryConfigWrapped, useBridgeQuery } from '@sd/client'; import { CaretRight, Pen, Trash } from 'phosphor-react-native'; import React from 'react'; import { Animated, FlatList, Text, View } from 'react-native'; import { Swipeable } from 'react-native-gesture-handler'; +import { LibraryConfigWrapped, useBridgeQuery } from '@sd/client'; import { AnimatedButton } from '~/components/primitive/Button'; import DeleteLibraryDialog from '~/containers/dialog/DeleteLibraryDialog'; import tw from '~/lib/tailwind'; diff --git a/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx b/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx index c3d095d2a..6360d6f7e 100644 --- a/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx +++ b/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx @@ -1,8 +1,8 @@ -import { useBridgeMutation, useCurrentLibrary } from '@sd/client'; import { Trash } from 'phosphor-react-native'; import React from 'react'; import { Controller, useForm } from 'react-hook-form'; import { Alert, Text, View } from 'react-native'; +import { useBridgeMutation, useCurrentLibrary } from '@sd/client'; import { Button } from '~/components/primitive/Button'; import { Input } from '~/components/primitive/Input'; import { Switch } from '~/components/primitive/Switch'; diff --git a/apps/mobile/src/screens/settings/library/LocationSettings.tsx b/apps/mobile/src/screens/settings/library/LocationSettings.tsx index 6013cff96..b6440b1e3 100644 --- a/apps/mobile/src/screens/settings/library/LocationSettings.tsx +++ b/apps/mobile/src/screens/settings/library/LocationSettings.tsx @@ -1,7 +1,7 @@ -import { Location, Node, useLibraryMutation, useLibraryQuery } from '@sd/client'; import { CaretRight, Repeat, Trash } from 'phosphor-react-native'; import { Animated, FlatList, Pressable, Text, View } from 'react-native'; import { Swipeable } from 'react-native-gesture-handler'; +import { Location, Node, useLibraryMutation, useLibraryQuery } from '@sd/client'; import FolderIcon from '~/components/icons/FolderIcon'; import DeleteLocationDialog from '~/containers/dialog/DeleteLocationDialog'; import tw from '~/lib/tailwind'; diff --git a/apps/mobile/src/screens/settings/library/TagsSettings.tsx b/apps/mobile/src/screens/settings/library/TagsSettings.tsx index a50272002..49db704ce 100644 --- a/apps/mobile/src/screens/settings/library/TagsSettings.tsx +++ b/apps/mobile/src/screens/settings/library/TagsSettings.tsx @@ -1,7 +1,7 @@ -import { Tag, useLibraryQuery } from '@sd/client'; import { CaretRight, Pen, Trash } from 'phosphor-react-native'; import { Animated, FlatList, Text, View } from 'react-native'; import { Swipeable } from 'react-native-gesture-handler'; +import { Tag, useLibraryQuery } from '@sd/client'; import { AnimatedButton } from '~/components/primitive/Button'; import DeleteTagDialog from '~/containers/dialog/tag/DeleteTagDialog'; import UpdateTagDialog from '~/containers/dialog/tag/UpdateTagDialog'; diff --git a/apps/mobile/src/stores/explorerStore.ts b/apps/mobile/src/stores/explorerStore.ts index e71743f44..d2edb639c 100644 --- a/apps/mobile/src/stores/explorerStore.ts +++ b/apps/mobile/src/stores/explorerStore.ts @@ -1,5 +1,5 @@ -import { resetStore } from '@sd/client'; import { proxy, useSnapshot } from 'valtio'; +import { resetStore } from '@sd/client'; // TODO: Add "media" export type ExplorerLayoutMode = 'list' | 'grid'; diff --git a/apps/mobile/src/stores/modalStore.ts b/apps/mobile/src/stores/modalStore.ts index 113a91aef..501759804 100644 --- a/apps/mobile/src/stores/modalStore.ts +++ b/apps/mobile/src/stores/modalStore.ts @@ -1,7 +1,7 @@ import { BottomSheetModal } from '@gorhom/bottom-sheet'; -import { ExplorerItem } from '@sd/client'; import { createRef } from 'react'; import { proxy, ref, useSnapshot } from 'valtio'; +import { ExplorerItem } from '@sd/client'; export const fileModalStore = proxy({ fileRef: ref(createRef()), diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 56e6f7f3c..7d8e6d327 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -5,9 +5,7 @@ "module": "ESNext", "noEmit": true, "paths": { - "~/*": [ - "./src/*" - ] + "~/*": ["./src/*"] }, "jsx": "react-native" }, diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index a4a534684..ca30c9482 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,7 +1,7 @@ import { createWSClient, loggerLink, wsLink } from '@rspc/client'; +import { useEffect } from 'react'; import { getDebugState, hooks, queryClient } from '@sd/client'; import SpacedriveInterface, { Platform, PlatformProvider } from '@sd/interface'; -import { useEffect } from 'react'; globalThis.isDev = import.meta.env.DEV; diff --git a/apps/web/src/index.html b/apps/web/src/index.html index ce6f82f41..21964564d 100644 --- a/apps/web/src/index.html +++ b/apps/web/src/index.html @@ -3,7 +3,7 @@ Spacedrive - + diff --git a/apps/web/src/index.tsx b/apps/web/src/index.tsx index 78f120dd6..907828be7 100644 --- a/apps/web/src/index.tsx +++ b/apps/web/src/index.tsx @@ -1,12 +1,10 @@ // WARNING: BE CAREFUL SAVING THIS FILE WITH A FORMATTER ENABLED. The import order is important and goes against prettier's recommendations. - import React, { Suspense } from 'react'; import ReactDOM from 'react-dom/client'; - -import './patches'; // THIS MUST GO BEFORE importing the App -import App from './App'; - import '@sd/ui/style'; +// THIS MUST GO BEFORE importing the App +import App from './App'; +import './patches'; const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); root.render( diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 38bb99819..3f7f1295b 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -4,9 +4,7 @@ "rootDir": "src", "declarationDir": "dist" }, - "include": [ - "src" - ], + "include": ["src"], "references": [ { "path": "../../packages/interface" diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 92fd8f948..1e046b1f3 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -1,11 +1,10 @@ +import { relativeAliasResolver } from '@sd/config/vite'; import react from '@vitejs/plugin-react'; // import { visualizer } from 'rollup-plugin-visualizer'; import { defineConfig } from 'vite'; import { createHtmlPlugin } from 'vite-plugin-html'; import svg from 'vite-plugin-svgr'; import tsconfigPaths from 'vite-tsconfig-paths'; -import { relativeAliasResolver } from "@sd/config/vite" - import { name, version } from './package.json'; // https://vitejs.dev/config/ @@ -19,7 +18,7 @@ export default defineConfig({ svg({ svgrOptions: { icon: true } }), createHtmlPlugin({ minify: true - }), + }) // visualizer({ // gzipSize: true, // brotliSize: true diff --git a/crates/sync/example/README.md b/crates/sync/example/README.md index 59296dd69..c3adc9cab 100644 --- a/crates/sync/example/README.md +++ b/crates/sync/example/README.md @@ -15,4 +15,4 @@ cd api/ cargo prisma generate cargo prisma db push cargo run -``` \ No newline at end of file +``` diff --git a/crates/sync/example/web/index.html b/crates/sync/example/web/index.html index 1905a0429..0afc97f47 100644 --- a/crates/sync/example/web/index.html +++ b/crates/sync/example/web/index.html @@ -1,15 +1,15 @@ - - - - - Solid App - - - -
+ + + + + Solid App + + + +
- - + + diff --git a/crates/sync/example/web/package.json b/crates/sync/example/web/package.json index 15cece3d6..32617cec0 100644 --- a/crates/sync/example/web/package.json +++ b/crates/sync/example/web/package.json @@ -1,27 +1,27 @@ { - "name": "example-2", - "version": "0.0.0", - "description": "", - "scripts": { - "dev": "vite", - "build": "vite build", - "serve": "vite preview", - "typecheck": "tsc --noEmit" - }, - "license": "MIT", - "devDependencies": { - "@rspc/client": "^0.0.0-main-7c0a67c1", - "@rspc/react": "^0.0.0-main-7c0a67c1", - "@tanstack/react-query": "^4.10.1", - "@vitejs/plugin-react": "^2.1.0", - "typescript": "^4.8.2", - "vite": "^3.0.9" - }, - "dependencies": { - "clsx": "^1.2.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "solid-js": "^1.5.1", - "tailwindcss": "^3.1.8" - } + "name": "example-2", + "version": "0.0.0", + "description": "", + "scripts": { + "dev": "vite", + "build": "vite build", + "serve": "vite preview", + "typecheck": "tsc --noEmit" + }, + "license": "MIT", + "devDependencies": { + "@rspc/client": "^0.0.0-main-7c0a67c1", + "@rspc/react": "^0.0.0-main-7c0a67c1", + "@tanstack/react-query": "^4.10.1", + "@vitejs/plugin-react": "^2.1.0", + "typescript": "^4.8.2", + "vite": "^3.0.9" + }, + "dependencies": { + "clsx": "^1.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "solid-js": "^1.5.1", + "tailwindcss": "^3.1.8" + } } diff --git a/crates/sync/example/web/postcss.config.js b/crates/sync/example/web/postcss.config.js index 33ad091d2..054c147cb 100644 --- a/crates/sync/example/web/postcss.config.js +++ b/crates/sync/example/web/postcss.config.js @@ -1,6 +1,6 @@ module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/crates/sync/example/web/src/App.tsx b/crates/sync/example/web/src/App.tsx index 2ea420bc2..13c4e5d1c 100644 --- a/crates/sync/example/web/src/App.tsx +++ b/crates/sync/example/web/src/App.tsx @@ -1,6 +1,5 @@ import clsx from 'clsx'; import { Suspense, useState } from 'react'; - import { tests } from './test'; import { CRDTOperationType, rspc } from './utils/rspc'; diff --git a/crates/sync/example/web/src/index.tsx b/crates/sync/example/web/src/index.tsx index a44849e5a..e5c505c26 100644 --- a/crates/sync/example/web/src/index.tsx +++ b/crates/sync/example/web/src/index.tsx @@ -1,15 +1,14 @@ /* @refresh reload */ import { Suspense } from 'react'; import { createRoot } from 'react-dom/client'; - import { App } from './App'; import './index.css'; import { queryClient, rspc, rspcClient } from './utils/rspc'; createRoot(document.getElementById('root') as HTMLElement).render( - - - - - + + + + + ); diff --git a/crates/sync/example/web/src/test.ts b/crates/sync/example/web/src/test.ts index b042a5d37..49c369eba 100644 --- a/crates/sync/example/web/src/test.ts +++ b/crates/sync/example/web/src/test.ts @@ -1,45 +1,45 @@ import { queryClient, rspcClient } from './utils/rspc'; function test(fn: () => Promise) { - return async () => { - await fn(); - queryClient.invalidateQueries(); - }; + return async () => { + await fn(); + queryClient.invalidateQueries(); + }; } const wait = (ms: number) => new Promise((res) => setTimeout(res, ms)); export const tests = { - three: { - name: 'Three', - run: test(async () => { - const [db1, db2, db3] = await Promise.all([ - rspcClient.mutation(['createDatabase', ' ']), - rspcClient.mutation(['createDatabase', ' ']), - rspcClient.mutation(['createDatabase', ' ']) - ]); + three: { + name: 'Three', + run: test(async () => { + const [db1, db2, db3] = await Promise.all([ + rspcClient.mutation(['createDatabase', ' ']), + rspcClient.mutation(['createDatabase', ' ']), + rspcClient.mutation(['createDatabase', ' ']) + ]); - const dbs = await rspcClient.query(['dbs', 'cringe']); + const dbs = await rspcClient.query(['dbs', 'cringe']); - for (const db of dbs) { - await rspcClient.mutation(['file_path.create', db]); - } + for (const db of dbs) { + await rspcClient.mutation(['file_path.create', db]); + } - for (const db of dbs) { - await rspcClient.mutation(['pullOperations', db]); - } + for (const db of dbs) { + await rspcClient.mutation(['pullOperations', db]); + } - await rspcClient.mutation(['file_path.create', dbs[0]]); - await rspcClient.mutation(['file_path.create', dbs[0]]); + await rspcClient.mutation(['file_path.create', dbs[0]]); + await rspcClient.mutation(['file_path.create', dbs[0]]); - for (const db of dbs) { - await rspcClient.mutation(['pullOperations', db]); - } + for (const db of dbs) { + await rspcClient.mutation(['pullOperations', db]); + } - await rspcClient.mutation(['pullOperations', dbs[1]]); - await rspcClient.mutation(['pullOperations', dbs[1]]); - await rspcClient.mutation(['pullOperations', dbs[1]]); - await rspcClient.mutation(['pullOperations', dbs[1]]); - }) - } + await rspcClient.mutation(['pullOperations', dbs[1]]); + await rspcClient.mutation(['pullOperations', dbs[1]]); + await rspcClient.mutation(['pullOperations', dbs[1]]); + await rspcClient.mutation(['pullOperations', dbs[1]]); + }) + } }; diff --git a/crates/sync/example/web/src/utils/bindings.ts b/crates/sync/example/web/src/utils/bindings.ts index 6e5d28620..3d31e95bb 100644 --- a/crates/sync/example/web/src/utils/bindings.ts +++ b/crates/sync/example/web/src/utils/bindings.ts @@ -1,43 +1,80 @@ // This file was generated by [rspc](https://github.com/oscartbeaumont/rspc). Do not edit this file manually. export type Procedures = { - queries: - { key: "db.tags", input: string, result: Record } | - { key: "dbs", input: string, result: Array } | - { key: "file_path.list", input: string, result: Array } | - { key: "message.list", input: string, result: Array } | - { key: "operations", input: string, result: Array }, - mutations: - { key: "createDatabase", input: string, result: string } | - { key: "file_path.create", input: string, result: FilePath } | - { key: "pullOperations", input: string, result: null } | - { key: "removeDatabases", input: string, result: null } | - { key: "testCreate", input: string, result: null }, - subscriptions: never + queries: + | { key: 'db.tags'; input: string; result: Record } + | { key: 'dbs'; input: string; result: Array } + | { key: 'file_path.list'; input: string; result: Array } + | { key: 'message.list'; input: string; result: Array } + | { key: 'operations'; input: string; result: Array }; + mutations: + | { key: 'createDatabase'; input: string; result: string } + | { key: 'file_path.create'; input: string; result: FilePath } + | { key: 'pullOperations'; input: string; result: null } + | { key: 'removeDatabases'; input: string; result: null } + | { key: 'testCreate'; input: string; result: null }; + subscriptions: never; }; -export interface CRDTOperation { node: string, timestamp: bigint, id: string, typ: CRDTOperationType } +export interface CRDTOperation { + node: string; + timestamp: bigint; + id: string; + typ: CRDTOperationType; +} -export type CRDTOperationType = SharedOperation | RelationOperation | OwnedOperation +export type CRDTOperationType = SharedOperation | RelationOperation | OwnedOperation; -export interface Color { red: number, green: number, blue: number } +export interface Color { + red: number; + green: number; + blue: number; +} -export interface FilePath { id: string, path: string, file: string | null } +export interface FilePath { + id: string; + path: string; + file: string | null; +} -export interface OwnedOperation { model: string, items: Array } +export interface OwnedOperation { + model: string; + items: Array; +} -export type OwnedOperationData = { Create: Record } | { Update: Record } | "Delete" +export type OwnedOperationData = + | { Create: Record } + | { Update: Record } + | 'Delete'; -export interface OwnedOperationItem { id: any, data: OwnedOperationData } +export interface OwnedOperationItem { + id: any; + data: OwnedOperationData; +} -export interface RelationOperation { relation_item: string, relation_group: string, relation: string, data: RelationOperationData } +export interface RelationOperation { + relation_item: string; + relation_group: string; + relation: string; + data: RelationOperationData; +} -export type RelationOperationData = "Create" | { Update: { field: string, value: any } } | "Delete" +export type RelationOperationData = 'Create' | { Update: { field: string; value: any } } | 'Delete'; -export interface SharedOperation { record_id: string, model: string, data: SharedOperationData } +export interface SharedOperation { + record_id: string; + model: string; + data: SharedOperationData; +} -export type SharedOperationCreateData = { Unique: Record } | "Atomic" +export type SharedOperationCreateData = { Unique: Record } | 'Atomic'; -export type SharedOperationData = { Create: SharedOperationCreateData } | { Update: { field: string, value: any } } | "Delete" +export type SharedOperationData = + | { Create: SharedOperationCreateData } + | { Update: { field: string; value: any } } + | 'Delete'; -export interface Tag { color: Color, name: string } +export interface Tag { + color: Color; + name: string; +} diff --git a/crates/sync/example/web/src/utils/rspc.ts b/crates/sync/example/web/src/utils/rspc.ts index 1e1ae004a..519ea9f52 100644 --- a/crates/sync/example/web/src/utils/rspc.ts +++ b/crates/sync/example/web/src/utils/rspc.ts @@ -1,7 +1,6 @@ import { createClient, httpLink } from '@rspc/client'; import { createReactHooks } from '@rspc/react'; import { QueryClient } from '@tanstack/react-query'; - import type { Procedures } from './bindings'; export * from './bindings'; @@ -11,18 +10,18 @@ export * from './bindings'; const rspc = createReactHooks(); const rspcClient = rspc.createClient({ - links: [httpLink({ url: 'http://localhost:9000/rspc' })] + links: [httpLink({ url: 'http://localhost:9000/rspc' })] }); const queryClient = new QueryClient({ - defaultOptions: { - queries: { - suspense: true - }, - mutations: { - onSuccess: () => queryClient.invalidateQueries() - } - } + defaultOptions: { + queries: { + suspense: true + }, + mutations: { + onSuccess: () => queryClient.invalidateQueries() + } + } }); export { rspc, rspcClient, queryClient }; diff --git a/crates/sync/example/web/tailwind.config.js b/crates/sync/example/web/tailwind.config.js index 1c3b7e1b3..7cf6cc57b 100644 --- a/crates/sync/example/web/tailwind.config.js +++ b/crates/sync/example/web/tailwind.config.js @@ -1,11 +1,8 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: [ - "./index.html", - "./src/**/*.{js,ts,jsx,tsx}", - ], - theme: { - extend: {}, - }, - plugins: [], -} + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {} + }, + plugins: [] +}; diff --git a/crates/sync/example/web/tsconfig.json b/crates/sync/example/web/tsconfig.json index 2c19fda6d..1d5d18140 100644 --- a/crates/sync/example/web/tsconfig.json +++ b/crates/sync/example/web/tsconfig.json @@ -1,15 +1,13 @@ { - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "types": [ - "vite/client" - ], - "noEmit": true, - "isolatedModules": true - } + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "types": ["vite/client"], + "noEmit": true, + "isolatedModules": true + } } diff --git a/crates/sync/example/web/vite.config.ts b/crates/sync/example/web/vite.config.ts index aa9c9e3ca..29f022f92 100644 --- a/crates/sync/example/web/vite.config.ts +++ b/crates/sync/example/web/vite.config.ts @@ -1,5 +1,5 @@ -import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; export default defineConfig({ plugins: [react()], diff --git a/cspell.config.yaml b/cspell.config.yaml index ae63422ac..a70b5f525 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -17,4 +17,4 @@ dictionaries: ignorePaths: - 'node_modules' - '.cspell' - - 'target' \ No newline at end of file + - 'target' diff --git a/docs/company/legal/privacy.md b/docs/company/legal/privacy.md index 7c150af3f..da833ae4c 100644 --- a/docs/company/legal/privacy.md +++ b/docs/company/legal/privacy.md @@ -1,3 +1,3 @@ -# Privacy Policy - -*This page has yet to be written out in full. Please check back later!* +# Privacy Policy + +_This page has yet to be written out in full. Please check back later!_ diff --git a/docs/developers/architecture/sync.md b/docs/developers/architecture/sync.md index edac531e3..587f6db7d 100644 --- a/docs/developers/architecture/sync.md +++ b/docs/developers/architecture/sync.md @@ -41,6 +41,7 @@ and that node can inform all other nodes about the correct state of the paths. Used for Locations, Paths, and Volumes. `@owned(owner: String, id?: String)` + - `owner` - Field that identifies the owner of this model. If a scalar, will directly use that value in sync operations. If a relation, the Sync ID of the related model will be resolved for sync operations. @@ -54,15 +55,16 @@ Updates are applied per-field using a last-write-wins strategy. Used for Objects, Tags, Spaces, and Jobs. `@shared(create: SharedCreateType, id?: String)` + - `id` - Scalar field to override the default Sync ID. - `create` - How the model should be created. - `Unique` (default): Model can be created with many required arguemnts, - but ID provided _must_ be unique across all nodes. - Useful for Tags since their IDs are non-deterministic. + but ID provided _must_ be unique across all nodes. + Useful for Tags since their IDs are non-deterministic. - `Atomic`: Require the model to have no required arguments apart from ID and apply all create arguments as atomic updates. - Necessary for models with the same ID that can be created on multiple nodes. - Useful for Objects since their ID is dependent on their content, - and could be the same across nodes. + Necessary for models with the same ID that can be created on multiple nodes. + Useful for Objects since their ID is dependent on their content, + and could be the same across nodes. ### Relation Records @@ -72,12 +74,12 @@ Sync ID is the combination of `item` and `group` Sync IDs. Used for TagOnFile and FileInSpace. `@relation(item: String, group: String)` + - `item` - Field that identifies the item that the relation is connecting. Similar to the `owner` argument of `@owned`. - `group` - Field that identifies the group that the item should be connected to. Similar to the `owner` argument of `@owned`. - ## Other Prisma Attributes `@node` @@ -85,4 +87,4 @@ Used for TagOnFile and FileInSpace. Indicates that a relation field should be set to the current node. This could be done manually, but `@node` allows `node_id` fields to be resolved from the `node_id` field of a `CRDTOperation`, -saving on bandwidth \ No newline at end of file +saving on bandwidth diff --git a/packages/assets/lottie/loading-pulse.json b/packages/assets/lottie/loading-pulse.json index 4ce72c311..6220538fd 100644 --- a/packages/assets/lottie/loading-pulse.json +++ b/packages/assets/lottie/loading-pulse.json @@ -1 +1,738 @@ -{"v":"5.6.10","fr":30,"ip":0,"op":137,"w":1000,"h":1000,"nm":"Composizione 11","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":120,"s":[100]},{"t":209,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":120,"s":[1,1,100]},{"t":210,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":120.302734375,"st":120,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":179,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":90,"s":[1,1,100]},{"t":180,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":120,"st":90,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":60,"s":[1,1,100]},{"t":150,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":120,"st":60,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":30,"s":[1,1,100]},{"t":120,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":120,"st":30,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[1,1,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-30,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":-30,"s":[1,1,100]},{"t":60,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":-30,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-60,"s":[100]},{"t":29,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":-60,"s":[1,1,100]},{"t":30,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":-60,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-90,"s":[100]},{"t":-1,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":-90,"s":[1,1,100]},{"t":0,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1000,1000],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1450980392156863,0.6,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":-90,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"pulse","refId":"comp_0","sr":1.15,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[502,496,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":138,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{ + "v": "5.6.10", + "fr": 30, + "ip": 0, + "op": 137, + "w": 1000, + "h": 1000, + "nm": "Composizione 11", + "ddd": 0, + "assets": [ + { + "id": "comp_0", + "layers": [ + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Shape Layer 8", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 120, + "s": [100] + }, + { "t": 209, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": 120, + "s": [1, 1, 100] + }, + { "t": 210, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 120, + "op": 120.302734375, + "st": 120, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Shape Layer 7", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 90, + "s": [100] + }, + { "t": 179, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": 90, + "s": [1, 1, 100] + }, + { "t": 180, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 90, + "op": 120, + "st": 90, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Shape Layer 6", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 60, + "s": [100] + }, + { "t": 149, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": 60, + "s": [1, 1, 100] + }, + { "t": 150, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 60, + "op": 120, + "st": 60, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Shape Layer 5", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 30, + "s": [100] + }, + { "t": 119, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": 30, + "s": [1, 1, 100] + }, + { "t": 120, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 30, + "op": 120, + "st": 30, + "bm": 0 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Shape Layer 4", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 0, + "s": [100] + }, + { "t": 89, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": 0, + "s": [1, 1, 100] + }, + { "t": 90, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 120, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Shape Layer 3", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": -30, + "s": [100] + }, + { "t": 59, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": -30, + "s": [1, 1, 100] + }, + { "t": 60, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 120, + "st": -30, + "bm": 0 + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Shape Layer 2", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": -60, + "s": [100] + }, + { "t": 29, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": -60, + "s": [1, 1, 100] + }, + { "t": 30, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 120, + "st": -60, + "bm": 0 + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Shape Layer 1", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": -90, + "s": [100] + }, + { "t": -1, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [500, 500, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0.167, 0.167, 0] }, + "t": -90, + "s": [1, 1, 100] + }, + { "t": 0, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { "a": 0, "k": [1000, 1000], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.1450980392156863, 0.6, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Trasformazione" + } + ], + "nm": "Ellipse 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 120, + "st": -90, + "bm": 0 + } + ] + } + ], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 0, + "nm": "pulse", + "refId": "comp_0", + "sr": 1.15, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [502, 496, 0], "ix": 2 }, + "a": { "a": 0, "k": [500, 500, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "w": 1000, + "h": 1000, + "ip": 0, + "op": 138, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} diff --git a/packages/client/src/core.ts b/packages/client/src/core.ts index ad754226f..cdb2b6b0c 100644 --- a/packages/client/src/core.ts +++ b/packages/client/src/core.ts @@ -2,194 +2,576 @@ // This file was generated by [rspc](https://github.com/oscartbeaumont/rspc). Do not edit this file manually. export type Procedures = { - queries: - { key: "buildInfo", input: never, result: BuildInfo } | - { key: "files.get", input: LibraryArgs, result: { id: number, cas_id: string, integrity_checksum: string | null, name: string | null, extension: string | null, kind: number, size_in_bytes: string, key_id: number | null, hidden: boolean, favorite: boolean, important: boolean, has_thumbnail: boolean, has_thumbstrip: boolean, has_video_preview: boolean, ipfs_id: string | null, note: string | null, date_created: string, date_modified: string, date_indexed: string, file_paths: Array, media_data: MediaData | null } | null } | - { key: "jobs.getHistory", input: LibraryArgs, result: Array } | - { key: "jobs.getRunning", input: LibraryArgs, result: Array } | - { key: "jobs.isRunning", input: LibraryArgs, result: boolean } | - { key: "keys.getDefault", input: LibraryArgs, result: string | null } | - { key: "keys.getKey", input: LibraryArgs, result: string } | - { key: "keys.hasMasterPassword", input: LibraryArgs, result: boolean } | - { key: "keys.isKeyManagerUnlocking", input: LibraryArgs, result: boolean } | - { key: "keys.list", input: LibraryArgs, result: Array } | - { key: "keys.listMounted", input: LibraryArgs, result: Array } | - { key: "library.getStatistics", input: LibraryArgs, result: Statistics } | - { key: "library.list", input: never, result: Array } | - { key: "locations.getById", input: LibraryArgs, result: Location | null } | - { key: "locations.getExplorerData", input: LibraryArgs, result: ExplorerData } | - { key: "locations.indexer_rules.get", input: LibraryArgs, result: IndexerRule } | - { key: "locations.indexer_rules.list", input: LibraryArgs, result: Array } | - { key: "locations.list", input: LibraryArgs, result: Array<{ id: number, pub_id: Array, node_id: number, name: string | null, local_path: string | null, total_capacity: number | null, available_capacity: number | null, filesystem: string | null, disk_type: number | null, is_removable: boolean | null, is_online: boolean, is_archived: boolean, date_created: string, node: Node }> } | - { key: "nodeState", input: never, result: NodeState } | - { key: "normi.composite", input: never, result: NormalisedCompositeId } | - { key: "normi.org", input: never, result: NormalisedOrganisation } | - { key: "normi.user", input: never, result: NormalisedUser } | - { key: "normi.userSync", input: never, result: NormalisedUser } | - { key: "normi.version", input: never, result: string } | - { key: "tags.get", input: LibraryArgs, result: Tag | null } | - { key: "tags.getExplorerData", input: LibraryArgs, result: ExplorerData } | - { key: "tags.getForObject", input: LibraryArgs, result: Array } | - { key: "tags.list", input: LibraryArgs, result: Array } | - { key: "volumes.list", input: never, result: Array }, - mutations: - { key: "files.decryptFiles", input: LibraryArgs, result: null } | - { key: "files.delete", input: LibraryArgs, result: null } | - { key: "files.deleteFiles", input: LibraryArgs, result: null } | - { key: "files.encryptFiles", input: LibraryArgs, result: null } | - { key: "files.eraseFiles", input: LibraryArgs, result: null } | - { key: "files.setFavorite", input: LibraryArgs, result: null } | - { key: "files.setNote", input: LibraryArgs, result: null } | - { key: "jobs.clearAll", input: LibraryArgs, result: null } | - { key: "jobs.generateThumbsForLocation", input: LibraryArgs, result: null } | - { key: "jobs.identifyUniqueFiles", input: LibraryArgs, result: null } | - { key: "jobs.objectValidator", input: LibraryArgs, result: null } | - { key: "keys.add", input: LibraryArgs, result: null } | - { key: "keys.backupKeystore", input: LibraryArgs, result: null } | - { key: "keys.changeMasterPassword", input: LibraryArgs, result: null } | - { key: "keys.clearMasterPassword", input: LibraryArgs, result: null } | - { key: "keys.deleteFromLibrary", input: LibraryArgs, result: null } | - { key: "keys.mount", input: LibraryArgs, result: null } | - { key: "keys.restoreKeystore", input: LibraryArgs, result: number } | - { key: "keys.setDefault", input: LibraryArgs, result: null } | - { key: "keys.setMasterPassword", input: LibraryArgs, result: null } | - { key: "keys.syncKeyToLibrary", input: LibraryArgs, result: null } | - { key: "keys.unmount", input: LibraryArgs, result: null } | - { key: "keys.unmountAll", input: LibraryArgs, result: null } | - { key: "keys.updateAutomountStatus", input: LibraryArgs, result: null } | - { key: "library.create", input: CreateLibraryArgs, result: LibraryConfigWrapped } | - { key: "library.delete", input: string, result: null } | - { key: "library.edit", input: EditLibraryArgs, result: null } | - { key: "locations.addLibrary", input: LibraryArgs, result: null } | - { key: "locations.create", input: LibraryArgs, result: null } | - { key: "locations.delete", input: LibraryArgs, result: null } | - { key: "locations.fullRescan", input: LibraryArgs, result: null } | - { key: "locations.indexer_rules.create", input: LibraryArgs, result: IndexerRule } | - { key: "locations.indexer_rules.delete", input: LibraryArgs, result: null } | - { key: "locations.quickRescan", input: LibraryArgs, result: null } | - { key: "locations.relink", input: LibraryArgs, result: null } | - { key: "locations.update", input: LibraryArgs, result: null } | - { key: "tags.assign", input: LibraryArgs, result: null } | - { key: "tags.create", input: LibraryArgs, result: Tag } | - { key: "tags.delete", input: LibraryArgs, result: null } | - { key: "tags.update", input: LibraryArgs, result: null }, - subscriptions: - { key: "invalidateQuery", input: never, result: InvalidateOperationEvent } | - { key: "jobs.newThumbnail", input: LibraryArgs, result: string } + queries: + | { key: 'buildInfo'; input: never; result: BuildInfo } + | { + key: 'files.get'; + input: LibraryArgs; + result: { + id: number; + cas_id: string; + integrity_checksum: string | null; + name: string | null; + extension: string | null; + kind: number; + size_in_bytes: string; + key_id: number | null; + hidden: boolean; + favorite: boolean; + important: boolean; + has_thumbnail: boolean; + has_thumbstrip: boolean; + has_video_preview: boolean; + ipfs_id: string | null; + note: string | null; + date_created: string; + date_modified: string; + date_indexed: string; + file_paths: Array; + media_data: MediaData | null; + } | null; + } + | { key: 'jobs.getHistory'; input: LibraryArgs; result: Array } + | { key: 'jobs.getRunning'; input: LibraryArgs; result: Array } + | { key: 'jobs.isRunning'; input: LibraryArgs; result: boolean } + | { key: 'keys.getDefault'; input: LibraryArgs; result: string | null } + | { key: 'keys.getKey'; input: LibraryArgs; result: string } + | { key: 'keys.hasMasterPassword'; input: LibraryArgs; result: boolean } + | { key: 'keys.isKeyManagerUnlocking'; input: LibraryArgs; result: boolean } + | { key: 'keys.list'; input: LibraryArgs; result: Array } + | { key: 'keys.listMounted'; input: LibraryArgs; result: Array } + | { key: 'library.getStatistics'; input: LibraryArgs; result: Statistics } + | { key: 'library.list'; input: never; result: Array } + | { key: 'locations.getById'; input: LibraryArgs; result: Location | null } + | { + key: 'locations.getExplorerData'; + input: LibraryArgs; + result: ExplorerData; + } + | { key: 'locations.indexer_rules.get'; input: LibraryArgs; result: IndexerRule } + | { key: 'locations.indexer_rules.list'; input: LibraryArgs; result: Array } + | { + key: 'locations.list'; + input: LibraryArgs; + result: Array<{ + id: number; + pub_id: Array; + node_id: number; + name: string | null; + local_path: string | null; + total_capacity: number | null; + available_capacity: number | null; + filesystem: string | null; + disk_type: number | null; + is_removable: boolean | null; + is_online: boolean; + is_archived: boolean; + date_created: string; + node: Node; + }>; + } + | { key: 'nodeState'; input: never; result: NodeState } + | { key: 'normi.composite'; input: never; result: NormalisedCompositeId } + | { key: 'normi.org'; input: never; result: NormalisedOrganisation } + | { key: 'normi.user'; input: never; result: NormalisedUser } + | { key: 'normi.userSync'; input: never; result: NormalisedUser } + | { key: 'normi.version'; input: never; result: string } + | { key: 'tags.get'; input: LibraryArgs; result: Tag | null } + | { key: 'tags.getExplorerData'; input: LibraryArgs; result: ExplorerData } + | { key: 'tags.getForObject'; input: LibraryArgs; result: Array } + | { key: 'tags.list'; input: LibraryArgs; result: Array } + | { key: 'volumes.list'; input: never; result: Array }; + mutations: + | { key: 'files.decryptFiles'; input: LibraryArgs; result: null } + | { key: 'files.delete'; input: LibraryArgs; result: null } + | { key: 'files.deleteFiles'; input: LibraryArgs; result: null } + | { key: 'files.encryptFiles'; input: LibraryArgs; result: null } + | { key: 'files.eraseFiles'; input: LibraryArgs; result: null } + | { key: 'files.setFavorite'; input: LibraryArgs; result: null } + | { key: 'files.setNote'; input: LibraryArgs; result: null } + | { key: 'jobs.clearAll'; input: LibraryArgs; result: null } + | { + key: 'jobs.generateThumbsForLocation'; + input: LibraryArgs; + result: null; + } + | { key: 'jobs.identifyUniqueFiles'; input: LibraryArgs; result: null } + | { key: 'jobs.objectValidator'; input: LibraryArgs; result: null } + | { key: 'keys.add'; input: LibraryArgs; result: null } + | { key: 'keys.backupKeystore'; input: LibraryArgs; result: null } + | { + key: 'keys.changeMasterPassword'; + input: LibraryArgs; + result: null; + } + | { key: 'keys.clearMasterPassword'; input: LibraryArgs; result: null } + | { key: 'keys.deleteFromLibrary'; input: LibraryArgs; result: null } + | { key: 'keys.mount'; input: LibraryArgs; result: null } + | { key: 'keys.restoreKeystore'; input: LibraryArgs; result: number } + | { key: 'keys.setDefault'; input: LibraryArgs; result: null } + | { key: 'keys.setMasterPassword'; input: LibraryArgs; result: null } + | { key: 'keys.syncKeyToLibrary'; input: LibraryArgs; result: null } + | { key: 'keys.unmount'; input: LibraryArgs; result: null } + | { key: 'keys.unmountAll'; input: LibraryArgs; result: null } + | { key: 'keys.updateAutomountStatus'; input: LibraryArgs; result: null } + | { key: 'library.create'; input: CreateLibraryArgs; result: LibraryConfigWrapped } + | { key: 'library.delete'; input: string; result: null } + | { key: 'library.edit'; input: EditLibraryArgs; result: null } + | { key: 'locations.addLibrary'; input: LibraryArgs; result: null } + | { key: 'locations.create'; input: LibraryArgs; result: null } + | { key: 'locations.delete'; input: LibraryArgs; result: null } + | { key: 'locations.fullRescan'; input: LibraryArgs; result: null } + | { + key: 'locations.indexer_rules.create'; + input: LibraryArgs; + result: IndexerRule; + } + | { key: 'locations.indexer_rules.delete'; input: LibraryArgs; result: null } + | { key: 'locations.quickRescan'; input: LibraryArgs; result: null } + | { key: 'locations.relink'; input: LibraryArgs; result: null } + | { key: 'locations.update'; input: LibraryArgs; result: null } + | { key: 'tags.assign'; input: LibraryArgs; result: null } + | { key: 'tags.create'; input: LibraryArgs; result: Tag } + | { key: 'tags.delete'; input: LibraryArgs; result: null } + | { key: 'tags.update'; input: LibraryArgs; result: null }; + subscriptions: + | { key: 'invalidateQuery'; input: never; result: InvalidateOperationEvent } + | { key: 'jobs.newThumbnail'; input: LibraryArgs; result: string }; }; -export type Algorithm = "XChaCha20Poly1305" | "Aes256Gcm" +export type Algorithm = 'XChaCha20Poly1305' | 'Aes256Gcm'; -export interface AutomountUpdateArgs { uuid: string, status: boolean } +export interface AutomountUpdateArgs { + uuid: string; + status: boolean; +} -export interface BuildInfo { version: string, commit: string } +export interface BuildInfo { + version: string; + commit: string; +} -export interface ConfigMetadata { version: string | null } +export interface ConfigMetadata { + version: string | null; +} -export interface CreateLibraryArgs { name: string, password: string, secret_key: string | null, algorithm: Algorithm, hashing_algorithm: HashingAlgorithm } +export interface CreateLibraryArgs { + name: string; + password: string; + secret_key: string | null; + algorithm: Algorithm; + hashing_algorithm: HashingAlgorithm; +} -export interface EditLibraryArgs { id: string, name: string | null, description: string | null } +export interface EditLibraryArgs { + id: string; + name: string | null; + description: string | null; +} -export type ExplorerContext = { type: "Location" } & Location | { type: "Tag" } & Tag +export type ExplorerContext = ({ type: 'Location' } & Location) | ({ type: 'Tag' } & Tag); -export interface ExplorerData { context: ExplorerContext, items: Array } +export interface ExplorerData { + context: ExplorerContext; + items: Array; +} -export type ExplorerItem = { type: "Path" } & FilePathWithObject | { type: "Object" } & ObjectWithFilePaths +export type ExplorerItem = + | ({ type: 'Path' } & FilePathWithObject) + | ({ type: 'Object' } & ObjectWithFilePaths); -export interface FileDecryptorJobInit { location_id: number, path_id: number, output_path: string | null, password: string | null, save_to_library: boolean | null } +export interface FileDecryptorJobInit { + location_id: number; + path_id: number; + output_path: string | null; + password: string | null; + save_to_library: boolean | null; +} -export interface FileDeleterJobInit { location_id: number, path_id: number } +export interface FileDeleterJobInit { + location_id: number; + path_id: number; +} -export interface FileEncryptorJobInit { location_id: number, path_id: number, key_uuid: string, algorithm: Algorithm, metadata: boolean, preview_media: boolean, output_path: string | null } +export interface FileEncryptorJobInit { + location_id: number; + path_id: number; + key_uuid: string; + algorithm: Algorithm; + metadata: boolean; + preview_media: boolean; + output_path: string | null; +} -export interface FileEraserJobInit { location_id: number, path_id: number, passes: number } +export interface FileEraserJobInit { + location_id: number; + path_id: number; + passes: number; +} -export interface FilePath { id: number, is_dir: boolean, location_id: number, materialized_path: string, name: string, extension: string | null, object_id: number | null, parent_id: number | null, key_id: number | null, date_created: string, date_modified: string, date_indexed: string } +export interface FilePath { + id: number; + is_dir: boolean; + location_id: number; + materialized_path: string; + name: string; + extension: string | null; + object_id: number | null; + parent_id: number | null; + key_id: number | null; + date_created: string; + date_modified: string; + date_indexed: string; +} -export interface GenerateThumbsForLocationArgs { id: number, path: string } +export interface GenerateThumbsForLocationArgs { + id: number; + path: string; +} -export interface GetArgs { id: number } +export interface GetArgs { + id: number; +} -export type HashingAlgorithm = { name: "Argon2id", params: Params } | { name: "BalloonBlake3", params: Params } +export type HashingAlgorithm = + | { name: 'Argon2id'; params: Params } + | { name: 'BalloonBlake3'; params: Params }; -export interface IdentifyUniqueFilesArgs { id: number, path: string } +export interface IdentifyUniqueFilesArgs { + id: number; + path: string; +} -export interface IndexerRule { id: number, kind: number, name: string, parameters: Array, date_created: string, date_modified: string } +export interface IndexerRule { + id: number; + kind: number; + name: string; + parameters: Array; + date_created: string; + date_modified: string; +} -export interface IndexerRuleCreateArgs { kind: RuleKind, name: string, parameters: Array } +export interface IndexerRuleCreateArgs { + kind: RuleKind; + name: string; + parameters: Array; +} -export interface InvalidateOperationEvent { key: string, arg: any } +export interface InvalidateOperationEvent { + key: string; + arg: any; +} -export interface JobReport { id: string, name: string, data: Array | null, metadata: any | null, date_created: string, date_modified: string, status: JobStatus, task_count: number, completed_task_count: number, message: string, seconds_elapsed: number } +export interface JobReport { + id: string; + name: string; + data: Array | null; + metadata: any | null; + date_created: string; + date_modified: string; + status: JobStatus; + task_count: number; + completed_task_count: number; + message: string; + seconds_elapsed: number; +} -export type JobStatus = "Queued" | "Running" | "Completed" | "Canceled" | "Failed" | "Paused" +export type JobStatus = 'Queued' | 'Running' | 'Completed' | 'Canceled' | 'Failed' | 'Paused'; -export interface KeyAddArgs { algorithm: Algorithm, hashing_algorithm: HashingAlgorithm, key: string, library_sync: boolean, automount: boolean } +export interface KeyAddArgs { + algorithm: Algorithm; + hashing_algorithm: HashingAlgorithm; + key: string; + library_sync: boolean; + automount: boolean; +} -export interface LibraryArgs { library_id: string, arg: T } +export interface LibraryArgs { + library_id: string; + arg: T; +} -export interface LibraryConfig { version: string | null, name: string, description: string } +export interface LibraryConfig { + version: string | null; + name: string; + description: string; +} -export interface LibraryConfigWrapped { uuid: string, config: LibraryConfig } +export interface LibraryConfigWrapped { + uuid: string; + config: LibraryConfig; +} -export interface Location { id: number, pub_id: Array, node_id: number, name: string | null, local_path: string | null, total_capacity: number | null, available_capacity: number | null, filesystem: string | null, disk_type: number | null, is_removable: boolean | null, is_online: boolean, is_archived: boolean, date_created: string } +export interface Location { + id: number; + pub_id: Array; + node_id: number; + name: string | null; + local_path: string | null; + total_capacity: number | null; + available_capacity: number | null; + filesystem: string | null; + disk_type: number | null; + is_removable: boolean | null; + is_online: boolean; + is_archived: boolean; + date_created: string; +} -export interface LocationCreateArgs { path: string, indexer_rules_ids: Array } +export interface LocationCreateArgs { + path: string; + indexer_rules_ids: Array; +} -export interface LocationExplorerArgs { location_id: number, path: string, limit: number, cursor: string | null } +export interface LocationExplorerArgs { + location_id: number; + path: string; + limit: number; + cursor: string | null; +} -export interface LocationUpdateArgs { id: number, name: string | null, indexer_rules_ids: Array } +export interface LocationUpdateArgs { + id: number; + name: string | null; + indexer_rules_ids: Array; +} -export interface MasterPasswordChangeArgs { password: string, secret_key: string | null, algorithm: Algorithm, hashing_algorithm: HashingAlgorithm } +export interface MasterPasswordChangeArgs { + password: string; + secret_key: string | null; + algorithm: Algorithm; + hashing_algorithm: HashingAlgorithm; +} -export interface MediaData { id: number, pixel_width: number | null, pixel_height: number | null, longitude: number | null, latitude: number | null, fps: number | null, capture_device_make: string | null, capture_device_model: string | null, capture_device_software: string | null, duration_seconds: number | null, codecs: string | null, streams: number | null } +export interface MediaData { + id: number; + pixel_width: number | null; + pixel_height: number | null; + longitude: number | null; + latitude: number | null; + fps: number | null; + capture_device_make: string | null; + capture_device_model: string | null; + capture_device_software: string | null; + duration_seconds: number | null; + codecs: string | null; + streams: number | null; +} -export interface Node { id: number, pub_id: Array, name: string, platform: number, version: string | null, last_seen: string, timezone: string | null, date_created: string } +export interface Node { + id: number; + pub_id: Array; + name: string; + platform: number; + version: string | null; + last_seen: string; + timezone: string | null; + date_created: string; +} -export interface NodeConfig { version: string | null, id: string, name: string, p2p_port: number | null } +export interface NodeConfig { + version: string | null; + id: string; + name: string; + p2p_port: number | null; +} -export interface NodeState { version: string | null, id: string, name: string, p2p_port: number | null, data_path: string } +export interface NodeState { + version: string | null; + id: string; + name: string; + p2p_port: number | null; + data_path: string; +} -export interface NormalisedCompositeId { $type: string, $id: any, org_id: string, user_id: string } +export interface NormalisedCompositeId { + $type: string; + $id: any; + org_id: string; + user_id: string; +} -export interface NormalisedOrganisation { $type: string, $id: any, id: string, name: string, users: NormalizedVec, owner: NormalisedUser, non_normalised_data: Array } +export interface NormalisedOrganisation { + $type: string; + $id: any; + id: string; + name: string; + users: NormalizedVec; + owner: NormalisedUser; + non_normalised_data: Array; +} -export interface NormalisedUser { $type: string, $id: any, id: string, name: string } +export interface NormalisedUser { + $type: string; + $id: any; + id: string; + name: string; +} -export interface NormalizedVec { $type: string, edges: Array } +export interface NormalizedVec { + $type: string; + edges: Array; +} -export interface Object { id: number, cas_id: string, integrity_checksum: string | null, name: string | null, extension: string | null, kind: number, size_in_bytes: string, key_id: number | null, hidden: boolean, favorite: boolean, important: boolean, has_thumbnail: boolean, has_thumbstrip: boolean, has_video_preview: boolean, ipfs_id: string | null, note: string | null, date_created: string, date_modified: string, date_indexed: string } +export interface Object { + id: number; + cas_id: string; + integrity_checksum: string | null; + name: string | null; + extension: string | null; + kind: number; + size_in_bytes: string; + key_id: number | null; + hidden: boolean; + favorite: boolean; + important: boolean; + has_thumbnail: boolean; + has_thumbstrip: boolean; + has_video_preview: boolean; + ipfs_id: string | null; + note: string | null; + date_created: string; + date_modified: string; + date_indexed: string; +} -export interface ObjectValidatorArgs { id: number, path: string } +export interface ObjectValidatorArgs { + id: number; + path: string; +} -export type Params = "Standard" | "Hardened" | "Paranoid" +export type Params = 'Standard' | 'Hardened' | 'Paranoid'; -export interface RestoreBackupArgs { password: string, secret_key: string | null, path: string } +export interface RestoreBackupArgs { + password: string; + secret_key: string | null; + path: string; +} -export type RuleKind = "AcceptFilesByGlob" | "RejectFilesByGlob" | "AcceptIfChildrenDirectoriesArePresent" | "RejectIfChildrenDirectoriesArePresent" +export type RuleKind = + | 'AcceptFilesByGlob' + | 'RejectFilesByGlob' + | 'AcceptIfChildrenDirectoriesArePresent' + | 'RejectIfChildrenDirectoriesArePresent'; -export interface SetFavoriteArgs { id: number, favorite: boolean } +export interface SetFavoriteArgs { + id: number; + favorite: boolean; +} -export interface SetMasterPasswordArgs { password: string, secret_key: string | null } +export interface SetMasterPasswordArgs { + password: string; + secret_key: string | null; +} -export interface SetNoteArgs { id: number, note: string | null } +export interface SetNoteArgs { + id: number; + note: string | null; +} -export interface Statistics { id: number, date_captured: string, total_object_count: number, library_db_size: string, total_bytes_used: string, total_bytes_capacity: string, total_unique_bytes: string, total_bytes_free: string, preview_media_bytes: string } +export interface Statistics { + id: number; + date_captured: string; + total_object_count: number; + library_db_size: string; + total_bytes_used: string; + total_bytes_capacity: string; + total_unique_bytes: string; + total_bytes_free: string; + preview_media_bytes: string; +} -export interface StoredKey { uuid: string, version: StoredKeyVersion, algorithm: Algorithm, hashing_algorithm: HashingAlgorithm, content_salt: Array, master_key: Array, master_key_nonce: Array, key_nonce: Array, key: Array, salt: Array, memory_only: boolean, automount: boolean } +export interface StoredKey { + uuid: string; + version: StoredKeyVersion; + algorithm: Algorithm; + hashing_algorithm: HashingAlgorithm; + content_salt: Array; + master_key: Array; + master_key_nonce: Array; + key_nonce: Array; + key: Array; + salt: Array; + memory_only: boolean; + automount: boolean; +} -export type StoredKeyVersion = "V1" +export type StoredKeyVersion = 'V1'; -export interface Tag { id: number, pub_id: Array, name: string | null, color: string | null, total_objects: number | null, redundancy_goal: number | null, date_created: string, date_modified: string } +export interface Tag { + id: number; + pub_id: Array; + name: string | null; + color: string | null; + total_objects: number | null; + redundancy_goal: number | null; + date_created: string; + date_modified: string; +} -export interface TagAssignArgs { object_id: number, tag_id: number, unassign: boolean } +export interface TagAssignArgs { + object_id: number; + tag_id: number; + unassign: boolean; +} -export interface TagCreateArgs { name: string, color: string } +export interface TagCreateArgs { + name: string; + color: string; +} -export interface TagUpdateArgs { id: number, name: string | null, color: string | null } +export interface TagUpdateArgs { + id: number; + name: string | null; + color: string | null; +} -export interface Volume { name: string, mount_point: string, total_capacity: bigint, available_capacity: bigint, is_removable: boolean, disk_type: string | null, file_system: string | null, is_root_filesystem: boolean } +export interface Volume { + name: string; + mount_point: string; + total_capacity: bigint; + available_capacity: bigint; + is_removable: boolean; + disk_type: string | null; + file_system: string | null; + is_root_filesystem: boolean; +} -export interface FilePathWithObject { id: number, is_dir: boolean, location_id: number, materialized_path: string, name: string, extension: string | null, object_id: number | null, parent_id: number | null, key_id: number | null, date_created: string, date_modified: string, date_indexed: string, object: Object | null } +export interface FilePathWithObject { + id: number; + is_dir: boolean; + location_id: number; + materialized_path: string; + name: string; + extension: string | null; + object_id: number | null; + parent_id: number | null; + key_id: number | null; + date_created: string; + date_modified: string; + date_indexed: string; + object: Object | null; +} -export interface ObjectWithFilePaths { id: number, cas_id: string, integrity_checksum: string | null, name: string | null, extension: string | null, kind: number, size_in_bytes: string, key_id: number | null, hidden: boolean, favorite: boolean, important: boolean, has_thumbnail: boolean, has_thumbstrip: boolean, has_video_preview: boolean, ipfs_id: string | null, note: string | null, date_created: string, date_modified: string, date_indexed: string, file_paths: Array } +export interface ObjectWithFilePaths { + id: number; + cas_id: string; + integrity_checksum: string | null; + name: string | null; + extension: string | null; + kind: number; + size_in_bytes: string; + key_id: number | null; + hidden: boolean; + favorite: boolean; + important: boolean; + has_thumbnail: boolean; + has_thumbstrip: boolean; + has_video_preview: boolean; + ipfs_id: string | null; + note: string | null; + date_created: string; + date_modified: string; + date_indexed: string; + file_paths: Array; +} diff --git a/packages/client/src/hooks/useCurrentLibrary.tsx b/packages/client/src/hooks/useCurrentLibrary.tsx index be13e387a..d20a6679e 100644 --- a/packages/client/src/hooks/useCurrentLibrary.tsx +++ b/packages/client/src/hooks/useCurrentLibrary.tsx @@ -1,6 +1,5 @@ import { PropsWithChildren, createContext, useCallback, useContext, useMemo } from 'react'; import { subscribe, useSnapshot } from 'valtio'; - import { useBridgeQuery } from '../rspc'; import { valtioPersist } from '../stores'; diff --git a/packages/client/src/normi/index.ts b/packages/client/src/normi/index.ts index 515af3039..0ec6324ee 100644 --- a/packages/client/src/normi/index.ts +++ b/packages/client/src/normi/index.ts @@ -3,7 +3,6 @@ import { CustomHooks } from '@rspc/client'; // @ts-expect-error: // TODO(@Oscar): Fix types import { __useMutation, __useQuery } from '@rspc/react/internal'; import { useMemo } from 'react'; - import { NormiOptions, getNormiCache, loadDataFromCache } from './utils'; export function normiCustomHooks( diff --git a/packages/client/src/rspc.ts b/packages/client/src/rspc.ts index 9211518f2..38948c622 100644 --- a/packages/client/src/rspc.ts +++ b/packages/client/src/rspc.ts @@ -1,7 +1,6 @@ import { ProcedureDef } from '@rspc/client'; import { internal_createReactHooksFactory } from '@rspc/react'; import { QueryClient } from '@tanstack/react-query'; - import { LibraryArgs, Procedures } from './core'; import { getLibraryIdRaw } from './index'; import { normiCustomHooks } from './normi'; diff --git a/packages/client/src/stores/debugState.ts b/packages/client/src/stores/debugState.ts index 7778e553f..4bffee19a 100644 --- a/packages/client/src/stores/debugState.ts +++ b/packages/client/src/stores/debugState.ts @@ -1,5 +1,4 @@ import { useSnapshot } from 'valtio'; - import { valtioPersist } from './util'; export const debugState = valtioPersist('sd-debugState', { diff --git a/packages/client/src/stores/themeStore.ts b/packages/client/src/stores/themeStore.ts index 37dfb42a4..fdeb349f0 100644 --- a/packages/client/src/stores/themeStore.ts +++ b/packages/client/src/stores/themeStore.ts @@ -1,5 +1,4 @@ import { useSnapshot } from 'valtio'; - import { valtioPersist } from './util'; const appThemeStore = valtioPersist('appTheme', { diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json index 4677b60a1..8e080d56b 100644 --- a/packages/client/tsconfig.json +++ b/packages/client/tsconfig.json @@ -4,7 +4,5 @@ "rootDir": "src", "declarationDir": "dist" }, - "include": [ - "src" - ] + "include": ["src"] } diff --git a/packages/config/app.tsconfig.json b/packages/config/app.tsconfig.json index e89847c31..e17622d5a 100644 --- a/packages/config/app.tsconfig.json +++ b/packages/config/app.tsconfig.json @@ -2,6 +2,6 @@ "extends": "./base.tsconfig.json", "compilerOptions": { "noEmit": true, - "emitDeclarationOnly": false, + "emitDeclarationOnly": false } } diff --git a/packages/config/base.tsconfig.json b/packages/config/base.tsconfig.json index 565c83610..cd0eefbe6 100644 --- a/packages/config/base.tsconfig.json +++ b/packages/config/base.tsconfig.json @@ -21,9 +21,6 @@ "module": "ESNext", "target": "ESNext", // Extra types - "types": [ - "vite-plugin-svgr/client", - "vite/client" - ] - }, + "types": ["vite-plugin-svgr/client", "vite/client"] + } } diff --git a/packages/config/vite/index.js b/packages/config/vite/index.js index c07f8b42b..7b9b1f0be 100644 --- a/packages/config/vite/index.js +++ b/packages/config/vite/index.js @@ -1,24 +1,24 @@ -const fs = require("fs/promises") -const path = require("path") +const fs = require('fs/promises'); +const path = require('path'); // only supports files rn module.exports = { relativeAliasResolver: { find: /^(~\/.+)/, - replacement: "$1", + replacement: '$1', async customResolver(source, importer) { - const [repo, filePath] = importer.split("/packages/"); - const [pkg] = filePath.split("/src/") + const [repo, filePath] = importer.split('/packages/'); + const [pkg] = filePath.split('/src/'); - const sourcePath = source.substring(2) + const sourcePath = source.substring(2); const absolutePath = `${repo}/packages/${pkg}/src/${sourcePath}`; - const folderItems = await fs.readdir(path.join(absolutePath, "../")); + const folderItems = await fs.readdir(path.join(absolutePath, '../')); - const item = folderItems.find(i => i.startsWith(sourcePath.split("/").at(-1))) + const item = folderItems.find((i) => i.startsWith(sourcePath.split('/').at(-1))); - return absolutePath + path.extname(item) + return absolutePath + path.extname(item); } } -} +}; diff --git a/packages/interface/src/App.tsx b/packages/interface/src/App.tsx index 4fbb5cf31..776ba8c16 100644 --- a/packages/interface/src/App.tsx +++ b/packages/interface/src/App.tsx @@ -1,11 +1,9 @@ -import '@fontsource/inter/variable.css'; -import { LibraryContextProvider, queryClient, useDebugState } from '@sd/client'; -import { Dialogs } from '@sd/ui'; import { Dedupe as DedupeIntegration, HttpContext as HttpContextIntegration, init } from '@sentry/browser'; +import '@fontsource/inter/variable.css'; import { QueryClientProvider, defaultContext } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import dayjs from 'dayjs'; @@ -14,7 +12,8 @@ import duration from 'dayjs/plugin/duration'; import relativeTime from 'dayjs/plugin/relativeTime'; import { ErrorBoundary } from 'react-error-boundary'; import { MemoryRouter, useNavigate } from 'react-router-dom'; - +import { LibraryContextProvider, queryClient, useDebugState } from '@sd/client'; +import { Dialogs } from '@sd/ui'; import { AppRouter } from './AppRouter'; import { ErrorFallback } from './ErrorFallback'; import './style.scss'; diff --git a/packages/interface/src/AppLayout.tsx b/packages/interface/src/AppLayout.tsx index 881d9c1c9..f9de5823c 100644 --- a/packages/interface/src/AppLayout.tsx +++ b/packages/interface/src/AppLayout.tsx @@ -1,8 +1,8 @@ -import { useCurrentLibrary } from '@sd/client'; -import { Dialogs } from '@sd/ui'; import clsx from 'clsx'; import { Suspense } from 'react'; import { Outlet } from 'react-router-dom'; +import { useCurrentLibrary } from '@sd/client'; +import { Dialogs } from '@sd/ui'; import { Sidebar } from '~/components/layout/Sidebar'; import { Toasts } from '~/components/primitive/Toasts'; import { useOperatingSystem } from '~/hooks/useOperatingSystem'; diff --git a/packages/interface/src/AppRouter.tsx b/packages/interface/src/AppRouter.tsx index f31e8dbf0..777478bce 100644 --- a/packages/interface/src/AppRouter.tsx +++ b/packages/interface/src/AppRouter.tsx @@ -1,9 +1,8 @@ import { lazy } from '@loadable/component'; -import { useCurrentLibrary, useInvalidateQuery } from '@sd/client'; import { Navigate, Route, Routes } from 'react-router-dom'; - -import { AppLayout } from './AppLayout'; +import { useCurrentLibrary, useInvalidateQuery } from '@sd/client'; import { useKeybindHandler } from '~/hooks/useKeyboardHandler'; +import { AppLayout } from './AppLayout'; // Using React.lazy breaks hot reload so we don't use it. const DebugScreen = lazy(() => import('./screens/Debug')); diff --git a/packages/interface/src/ErrorFallback.tsx b/packages/interface/src/ErrorFallback.tsx index 2cb9bf350..bbeb8ff2f 100644 --- a/packages/interface/src/ErrorFallback.tsx +++ b/packages/interface/src/ErrorFallback.tsx @@ -1,6 +1,6 @@ -import { Button } from '@sd/ui'; import { captureException } from '@sentry/browser'; import { FallbackProps } from 'react-error-boundary'; +import { Button } from '@sd/ui'; export function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) { const onClick = () => { diff --git a/packages/interface/src/NotFound.tsx b/packages/interface/src/NotFound.tsx index 662d48361..fae7a7b93 100644 --- a/packages/interface/src/NotFound.tsx +++ b/packages/interface/src/NotFound.tsx @@ -1,5 +1,5 @@ -import { Button } from '@sd/ui'; import { useNavigate } from 'react-router'; +import { Button } from '@sd/ui'; export default function NotFound() { const navigate = useNavigate(); diff --git a/packages/interface/src/components/device/Device.tsx b/packages/interface/src/components/device/Device.tsx index 408f81195..350cfab40 100644 --- a/packages/interface/src/components/device/Device.tsx +++ b/packages/interface/src/components/device/Device.tsx @@ -1,5 +1,3 @@ -import { Button } from '@sd/ui'; -import { Loader } from '@sd/ui'; import { Cloud, Desktop, @@ -11,7 +9,8 @@ import { Lock } from 'phosphor-react'; import { useState } from 'react'; - +import { Button } from '@sd/ui'; +import { Loader } from '@sd/ui'; import FileItem from '../explorer/FileItem'; import ProgressBar from '../primitive/ProgressBar'; import { Tooltip } from '../tooltip/Tooltip'; diff --git a/packages/interface/src/components/dialog/AddLocationDialog.tsx b/packages/interface/src/components/dialog/AddLocationDialog.tsx index c10802aea..ad02c59a5 100644 --- a/packages/interface/src/components/dialog/AddLocationDialog.tsx +++ b/packages/interface/src/components/dialog/AddLocationDialog.tsx @@ -1,6 +1,5 @@ import { useLibraryMutation } from '@sd/client'; import { Dialog, UseDialogProps, useDialog } from '@sd/ui'; - import { Input, useZodForm, z } from '@sd/ui/src/forms'; const schema = z.object({ path: z.string() }); diff --git a/packages/interface/src/components/dialog/AlertDialog.tsx b/packages/interface/src/components/dialog/AlertDialog.tsx index 0781a6544..7706e868e 100644 --- a/packages/interface/src/components/dialog/AlertDialog.tsx +++ b/packages/interface/src/components/dialog/AlertDialog.tsx @@ -1,6 +1,5 @@ -import { Button, Dialog, Input, UseDialogProps, useDialog } from '@sd/ui'; import { Clipboard } from 'phosphor-react'; - +import { Button, Dialog, Input, UseDialogProps, useDialog } from '@sd/ui'; import { useZodForm, z } from '@sd/ui/src/forms'; export interface AlertDialogProps extends UseDialogProps { diff --git a/packages/interface/src/components/dialog/BackupRestoreDialog.tsx b/packages/interface/src/components/dialog/BackupRestoreDialog.tsx index 4bc5fd42b..a39defc3e 100644 --- a/packages/interface/src/components/dialog/BackupRestoreDialog.tsx +++ b/packages/interface/src/components/dialog/BackupRestoreDialog.tsx @@ -1,8 +1,8 @@ +import { Eye, EyeSlash } from 'phosphor-react'; +import { useState } from 'react'; import { useLibraryMutation } from '@sd/client'; import { Button, Dialog, UseDialogProps, useDialog } from '@sd/ui'; import { forms } from '@sd/ui'; -import { Eye, EyeSlash } from 'phosphor-react'; -import { useState } from 'react'; import { usePlatform } from '~/util/Platform'; import { showAlertDialog } from '~/util/dialog'; diff --git a/packages/interface/src/components/dialog/CreateLibraryDialog.tsx b/packages/interface/src/components/dialog/CreateLibraryDialog.tsx index b2356203b..e07eecb50 100644 --- a/packages/interface/src/components/dialog/CreateLibraryDialog.tsx +++ b/packages/interface/src/components/dialog/CreateLibraryDialog.tsx @@ -1,12 +1,11 @@ -import { Algorithm, useBridgeMutation } from '@sd/client'; -import { Button, Dialog, Select, SelectOption, UseDialogProps, useDialog } from '@sd/ui'; -import { forms } from '@sd/ui'; import { useQueryClient } from '@tanstack/react-query'; import cryptoRandomString from 'crypto-random-string'; import { ArrowsClockwise, Clipboard, Eye, EyeSlash } from 'phosphor-react'; import { useState } from 'react'; +import { Algorithm, useBridgeMutation } from '@sd/client'; +import { Button, Dialog, Select, SelectOption, UseDialogProps, useDialog } from '@sd/ui'; +import { forms } from '@sd/ui'; import { getHashingAlgorithmSettings } from '~/screens/settings/library/KeysSetting'; - import { generatePassword } from '../key/KeyMounter'; import { PasswordMeter } from '../key/PasswordMeter'; diff --git a/packages/interface/src/components/dialog/DecryptFileDialog.tsx b/packages/interface/src/components/dialog/DecryptFileDialog.tsx index 90162cea1..040dea257 100644 --- a/packages/interface/src/components/dialog/DecryptFileDialog.tsx +++ b/packages/interface/src/components/dialog/DecryptFileDialog.tsx @@ -1,15 +1,13 @@ import { RadioGroup } from '@headlessui/react'; -import { useLibraryMutation, useLibraryQuery } from '@sd/client'; -import { Button, Dialog, UseDialogProps, useDialog } from '@sd/ui'; import { Eye, EyeSlash, Info } from 'phosphor-react'; import { useState } from 'react'; +import { useLibraryMutation, useLibraryQuery } from '@sd/client'; +import { Button, Dialog, UseDialogProps, useDialog } from '@sd/ui'; +import { Input, Switch, useZodForm, z } from '@sd/ui/src/forms'; import { showAlertDialog } from '~/util/dialog'; - import { usePlatform } from '../../util/Platform'; import { Tooltip } from '../tooltip/Tooltip'; -import { Input, Switch, useZodForm, z } from '@sd/ui/src/forms'; - interface DecryptDialogProps extends UseDialogProps { location_id: number; path_id: number; diff --git a/packages/interface/src/components/dialog/DeleteFileDialog.tsx b/packages/interface/src/components/dialog/DeleteFileDialog.tsx index ab46cd058..0599c0b8d 100644 --- a/packages/interface/src/components/dialog/DeleteFileDialog.tsx +++ b/packages/interface/src/components/dialog/DeleteFileDialog.tsx @@ -1,6 +1,5 @@ import { useLibraryMutation } from '@sd/client'; import { Dialog, UseDialogProps, useDialog } from '@sd/ui'; - import { useZodForm, z } from '@sd/ui/src/forms'; interface DeleteDialogProps extends UseDialogProps { diff --git a/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx b/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx index a417f83fa..ae5454f1a 100644 --- a/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx +++ b/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx @@ -1,7 +1,7 @@ +import { useQueryClient } from '@tanstack/react-query'; import { useBridgeMutation } from '@sd/client'; import { Dialog, UseDialogProps, useDialog } from '@sd/ui'; import { forms } from '@sd/ui'; -import { useQueryClient } from '@tanstack/react-query'; const { useZodForm, z } = forms; diff --git a/packages/interface/src/components/dialog/EncryptFileDialog.tsx b/packages/interface/src/components/dialog/EncryptFileDialog.tsx index 1ebe20728..b92558540 100644 --- a/packages/interface/src/components/dialog/EncryptFileDialog.tsx +++ b/packages/interface/src/components/dialog/EncryptFileDialog.tsx @@ -1,13 +1,11 @@ import { Algorithm, useLibraryMutation, useLibraryQuery } from '@sd/client'; import { Button, Dialog, Select, SelectOption, UseDialogProps, useDialog } from '@sd/ui'; +import { CheckBox, useZodForm, z } from '@sd/ui/src/forms'; import { getHashingAlgorithmString } from '~/screens/settings/library/KeysSetting'; import { usePlatform } from '~/util/Platform'; import { showAlertDialog } from '~/util/dialog'; - import { SelectOptionKeyList } from '../key/KeyList'; -import { CheckBox, useZodForm, z } from '@sd/ui/src/forms'; - interface EncryptDialogProps extends UseDialogProps { location_id: number; path_id: number; diff --git a/packages/interface/src/components/dialog/EraseFileDialog.tsx b/packages/interface/src/components/dialog/EraseFileDialog.tsx index d10f161e5..da377fa6b 100644 --- a/packages/interface/src/components/dialog/EraseFileDialog.tsx +++ b/packages/interface/src/components/dialog/EraseFileDialog.tsx @@ -1,10 +1,8 @@ +import { useState } from 'react'; import { useLibraryMutation } from '@sd/client'; import { Dialog, UseDialogProps, useDialog } from '@sd/ui'; -import { useState } from 'react'; - -import Slider from '../primitive/Slider'; - import { useZodForm, z } from '@sd/ui/src/forms'; +import Slider from '../primitive/Slider'; interface EraseDialogProps extends UseDialogProps { location_id: number; diff --git a/packages/interface/src/components/dialog/KeyViewerDialog.tsx b/packages/interface/src/components/dialog/KeyViewerDialog.tsx index 1e7d4f452..e5b8615bd 100644 --- a/packages/interface/src/components/dialog/KeyViewerDialog.tsx +++ b/packages/interface/src/components/dialog/KeyViewerDialog.tsx @@ -1,13 +1,11 @@ -import { useLibraryQuery } from '@sd/client'; -import { Button, Dialog, Input, Select, SelectOption, UseDialogProps, useDialog } from '@sd/ui'; import { Buffer } from 'buffer'; import { Clipboard } from 'phosphor-react'; import { useState } from 'react'; -import { getHashingAlgorithmString } from '~/screens/settings/library/KeysSetting'; - -import { SelectOptionKeyList } from '../key/KeyList'; - +import { useLibraryQuery } from '@sd/client'; +import { Button, Dialog, Input, Select, SelectOption, UseDialogProps, useDialog } from '@sd/ui'; import { useZodForm, z } from '@sd/ui/src/forms'; +import { getHashingAlgorithmString } from '~/screens/settings/library/KeysSetting'; +import { SelectOptionKeyList } from '../key/KeyList'; interface KeyViewerDialogProps extends UseDialogProps {} diff --git a/packages/interface/src/components/dialog/MasterPasswordChangeDialog.tsx b/packages/interface/src/components/dialog/MasterPasswordChangeDialog.tsx index ced27ec72..17c1b102f 100644 --- a/packages/interface/src/components/dialog/MasterPasswordChangeDialog.tsx +++ b/packages/interface/src/components/dialog/MasterPasswordChangeDialog.tsx @@ -1,16 +1,14 @@ -import { Algorithm, useLibraryMutation } from '@sd/client'; -import { Button, Dialog, Input, Select, SelectOption, UseDialogProps, useDialog } from '@sd/ui'; import cryptoRandomString from 'crypto-random-string'; import { ArrowsClockwise, Clipboard, Eye, EyeSlash } from 'phosphor-react'; import { useState } from 'react'; +import { Algorithm, useLibraryMutation } from '@sd/client'; +import { Button, Dialog, Input, Select, SelectOption, UseDialogProps, useDialog } from '@sd/ui'; +import { useZodForm, z } from '@sd/ui/src/forms'; import { getHashingAlgorithmSettings } from '~/screens/settings/library/KeysSetting'; import { showAlertDialog } from '~/util/dialog'; - import { generatePassword } from '../key/KeyMounter'; import { PasswordMeter } from '../key/PasswordMeter'; -import { useZodForm, z } from '@sd/ui/src/forms'; - export interface MasterPasswordChangeDialogProps extends UseDialogProps {} const schema = z.object({ diff --git a/packages/interface/src/components/explorer/Explorer.tsx b/packages/interface/src/components/explorer/Explorer.tsx index a18308da0..2b476e791 100644 --- a/packages/interface/src/components/explorer/Explorer.tsx +++ b/packages/interface/src/components/explorer/Explorer.tsx @@ -1,7 +1,6 @@ -import { ExplorerData, rspc, useCurrentLibrary } from '@sd/client'; import { useEffect, useState } from 'react'; +import { ExplorerData, rspc, useCurrentLibrary } from '@sd/client'; import { useExplorerStore } from '~/hooks/useExplorerStore'; - import { Inspector } from '../explorer/Inspector'; import { ExplorerContextMenu } from './ExplorerContextMenu'; import { TopBar } from './ExplorerTopBar'; diff --git a/packages/interface/src/components/explorer/ExplorerContextMenu.tsx b/packages/interface/src/components/explorer/ExplorerContextMenu.tsx index 0937a27d6..5fa4272b0 100644 --- a/packages/interface/src/components/explorer/ExplorerContextMenu.tsx +++ b/packages/interface/src/components/explorer/ExplorerContextMenu.tsx @@ -1,6 +1,3 @@ -import { ExplorerItem, useLibraryMutation, useLibraryQuery } from '@sd/client'; -import { ContextMenu as CM } from '@sd/ui'; -import { dialogManager } from '@sd/ui'; import { ArrowBendUpRight, Image, @@ -16,11 +13,13 @@ import { TrashSimple } from 'phosphor-react'; import { PropsWithChildren, useMemo } from 'react'; +import { ExplorerItem, useLibraryMutation, useLibraryQuery } from '@sd/client'; +import { ContextMenu as CM } from '@sd/ui'; +import { dialogManager } from '@sd/ui'; import { getExplorerStore, useExplorerStore } from '~/hooks/useExplorerStore'; import { useOperatingSystem } from '~/hooks/useOperatingSystem'; import { usePlatform } from '~/util/Platform'; import { showAlertDialog } from '~/util/dialog'; - import { DecryptFileDialog } from '../dialog/DecryptFileDialog'; import { DeleteFileDialog } from '../dialog/DeleteFileDialog'; import { EncryptFileDialog } from '../dialog/EncryptFileDialog'; diff --git a/packages/interface/src/components/explorer/ExplorerOptionsPanel.tsx b/packages/interface/src/components/explorer/ExplorerOptionsPanel.tsx index 63e965703..e334e4fda 100644 --- a/packages/interface/src/components/explorer/ExplorerOptionsPanel.tsx +++ b/packages/interface/src/components/explorer/ExplorerOptionsPanel.tsx @@ -1,6 +1,5 @@ -import { Select, SelectOption } from '@sd/ui'; import { PropsWithChildren, useState } from 'react'; - +import { Select, SelectOption } from '@sd/ui'; import Slider from '../primitive/Slider'; function Heading({ children }: PropsWithChildren) { diff --git a/packages/interface/src/components/explorer/ExplorerTopBar.tsx b/packages/interface/src/components/explorer/ExplorerTopBar.tsx index acc12291a..52b55c630 100644 --- a/packages/interface/src/components/explorer/ExplorerTopBar.tsx +++ b/packages/interface/src/components/explorer/ExplorerTopBar.tsx @@ -1,4 +1,3 @@ -import { Button, Input, OverlayPanel, cva } from '@sd/ui'; import clsx from 'clsx'; import { ArrowsClockwise, @@ -16,7 +15,7 @@ import { import { forwardRef, useEffect, useRef } from 'react'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; - +import { Button, Input, OverlayPanel, cva } from '@sd/ui'; import { getExplorerStore, useExplorerStore } from '../../hooks/useExplorerStore'; import { useOperatingSystem } from '../../hooks/useOperatingSystem'; import { KeybindEvent } from '../../util/keybind'; diff --git a/packages/interface/src/components/explorer/FileItem.tsx b/packages/interface/src/components/explorer/FileItem.tsx index 1becf3dda..fdd6478ea 100644 --- a/packages/interface/src/components/explorer/FileItem.tsx +++ b/packages/interface/src/components/explorer/FileItem.tsx @@ -1,9 +1,8 @@ -import { ExplorerItem, isVideoExt } from '@sd/client'; -import { cva, tw } from '@sd/ui'; import clsx from 'clsx'; import { HTMLAttributes } from 'react'; +import { ExplorerItem, isVideoExt } from '@sd/client'; +import { cva, tw } from '@sd/ui'; import { getExplorerStore } from '~/hooks/useExplorerStore'; - import { FileItemContextMenu } from './ExplorerContextMenu'; import FileThumb from './FileThumb'; import { isObject } from './utils'; diff --git a/packages/interface/src/components/explorer/FileRow.tsx b/packages/interface/src/components/explorer/FileRow.tsx index 5f1832559..d4f15750e 100644 --- a/packages/interface/src/components/explorer/FileRow.tsx +++ b/packages/interface/src/components/explorer/FileRow.tsx @@ -1,7 +1,6 @@ -import { ExplorerItem } from '@sd/client'; import clsx from 'clsx'; import { HTMLAttributes } from 'react'; - +import { ExplorerItem } from '@sd/client'; import FileThumb from './FileThumb'; interface Props extends HTMLAttributes { diff --git a/packages/interface/src/components/explorer/FileThumb.tsx b/packages/interface/src/components/explorer/FileThumb.tsx index 653133261..60fff105b 100644 --- a/packages/interface/src/components/explorer/FileThumb.tsx +++ b/packages/interface/src/components/explorer/FileThumb.tsx @@ -3,12 +3,11 @@ import documentPdf from '@sd/assets/images/Document_pdf.png'; import executable from '@sd/assets/images/Executable.png'; import file from '@sd/assets/images/File.png'; import video from '@sd/assets/images/Video.png'; -import { ExplorerItem } from '@sd/client'; import clsx from 'clsx'; import { Suspense, lazy, useMemo } from 'react'; +import { ExplorerItem } from '@sd/client'; import { useExplorerStore } from '~/hooks/useExplorerStore'; import { usePlatform } from '~/util/Platform'; - import { Folder } from '../icons/Folder'; import { isObject, isPath } from './utils'; diff --git a/packages/interface/src/components/explorer/Inspector.tsx b/packages/interface/src/components/explorer/Inspector.tsx index 18a4e6bd4..393947b8a 100644 --- a/packages/interface/src/components/explorer/Inspector.tsx +++ b/packages/interface/src/components/explorer/Inspector.tsx @@ -1,11 +1,10 @@ // import types from '../../constants/file-types.json'; -import { ExplorerContext, ExplorerItem, useLibraryQuery } from '@sd/client'; -import { Button, tw } from '@sd/ui'; import clsx from 'clsx'; import dayjs from 'dayjs'; import { Barcode, CircleWavyCheck, Clock, Cube, Link, Lock, Snowflake } from 'phosphor-react'; import { useEffect, useState } from 'react'; - +import { ExplorerContext, ExplorerItem, useLibraryQuery } from '@sd/client'; +import { Button, tw } from '@sd/ui'; import { ObjectKind } from '../../util/kind'; import { DefaultProps } from '../primitive/types'; import { Tooltip } from '../tooltip/Tooltip'; diff --git a/packages/interface/src/components/explorer/VirtualizedList.tsx b/packages/interface/src/components/explorer/VirtualizedList.tsx index 96baf328e..4bab217d9 100644 --- a/packages/interface/src/components/explorer/VirtualizedList.tsx +++ b/packages/interface/src/components/explorer/VirtualizedList.tsx @@ -1,10 +1,9 @@ -import { ExplorerContext, ExplorerItem } from '@sd/client'; import { useVirtualizer } from '@tanstack/react-virtual'; import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; import { useKey, useOnWindowResize } from 'rooks'; +import { ExplorerContext, ExplorerItem } from '@sd/client'; import { ExplorerLayoutMode, getExplorerStore, useExplorerStore } from '~/hooks/useExplorerStore'; - import FileItem from './FileItem'; import FileRow from './FileRow'; import { isPath } from './utils'; diff --git a/packages/interface/src/components/explorer/inspector/FavoriteButton.tsx b/packages/interface/src/components/explorer/inspector/FavoriteButton.tsx index a0227545c..a420fdaa6 100644 --- a/packages/interface/src/components/explorer/inspector/FavoriteButton.tsx +++ b/packages/interface/src/components/explorer/inspector/FavoriteButton.tsx @@ -1,8 +1,8 @@ +import { Heart } from 'phosphor-react'; +import { useEffect, useState } from 'react'; import { useLibraryMutation } from '@sd/client'; import { Object as SDObject } from '@sd/client'; import { Button } from '@sd/ui'; -import { Heart } from 'phosphor-react'; -import { useEffect, useState } from 'react'; interface Props { data: SDObject; diff --git a/packages/interface/src/components/explorer/inspector/Note.tsx b/packages/interface/src/components/explorer/inspector/Note.tsx index 339d36e45..514a7ded7 100644 --- a/packages/interface/src/components/explorer/inspector/Note.tsx +++ b/packages/interface/src/components/explorer/inspector/Note.tsx @@ -1,9 +1,8 @@ +import { useCallback, useState } from 'react'; +import { useDebouncedCallback } from 'use-debounce'; import { useLibraryMutation } from '@sd/client'; import { Object as SDObject } from '@sd/client'; import { TextArea } from '@sd/ui'; -import { useCallback, useState } from 'react'; -import { useDebouncedCallback } from 'use-debounce'; - import { MetaContainer, MetaTitle } from '../Inspector'; import { Divider } from './Divider'; diff --git a/packages/interface/src/components/items/DriveListItem.tsx b/packages/interface/src/components/items/DriveListItem.tsx index 3f7036ae9..26463757a 100644 --- a/packages/interface/src/components/items/DriveListItem.tsx +++ b/packages/interface/src/components/items/DriveListItem.tsx @@ -1,5 +1,4 @@ import clsx from 'clsx'; - import { DefaultProps } from '../primitive/types'; export interface DriveListItemProps extends DefaultProps { diff --git a/packages/interface/src/components/jobs/JobManager.tsx b/packages/interface/src/components/jobs/JobManager.tsx index 2b7b01639..e84105f69 100644 --- a/packages/interface/src/components/jobs/JobManager.tsx +++ b/packages/interface/src/components/jobs/JobManager.tsx @@ -1,6 +1,3 @@ -import { useLibraryMutation, useLibraryQuery } from '@sd/client'; -import { JobReport } from '@sd/client'; -import { Button, CategoryHeading, tw } from '@sd/ui'; import clsx from 'clsx'; import dayjs from 'dayjs'; import { @@ -19,7 +16,9 @@ import { TrashSimple, X } from 'phosphor-react'; - +import { useLibraryMutation, useLibraryQuery } from '@sd/client'; +import { JobReport } from '@sd/client'; +import { Button, CategoryHeading, tw } from '@sd/ui'; import ProgressBar from '../primitive/ProgressBar'; import { Tooltip } from '../tooltip/Tooltip'; diff --git a/packages/interface/src/components/key/Key.tsx b/packages/interface/src/components/key/Key.tsx index 58cb522d6..1d189d365 100644 --- a/packages/interface/src/components/key/Key.tsx +++ b/packages/interface/src/components/key/Key.tsx @@ -1,11 +1,10 @@ import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; -import { useLibraryMutation } from '@sd/client'; -import { Button } from '@sd/ui'; import clsx from 'clsx'; import { DotsThree, Eye, Key as KeyIcon } from 'phosphor-react'; import { MutableRefObject, PropsWithChildren, useState } from 'react'; import { animated, useTransition } from 'react-spring'; - +import { useLibraryMutation } from '@sd/client'; +import { Button } from '@sd/ui'; import { DefaultProps } from '../primitive/types'; import { Tooltip } from '../tooltip/Tooltip'; diff --git a/packages/interface/src/components/key/KeyList.tsx b/packages/interface/src/components/key/KeyList.tsx index e58564598..e78de4e85 100644 --- a/packages/interface/src/components/key/KeyList.tsx +++ b/packages/interface/src/components/key/KeyList.tsx @@ -1,7 +1,6 @@ +import { useMemo, useRef } from 'react'; import { useLibraryMutation, useLibraryQuery } from '@sd/client'; import { Button, SelectOption } from '@sd/ui'; -import { useMemo, useRef } from 'react'; - import { DefaultProps } from '../primitive/types'; import { DummyKey, Key } from './Key'; diff --git a/packages/interface/src/components/key/KeyManager.tsx b/packages/interface/src/components/key/KeyManager.tsx index 682e30362..e9d594b8b 100644 --- a/packages/interface/src/components/key/KeyManager.tsx +++ b/packages/interface/src/components/key/KeyManager.tsx @@ -1,8 +1,7 @@ -import { useLibraryMutation, useLibraryQuery } from '@sd/client'; -import { Button, ButtonLink, Input, Tabs } from '@sd/ui'; import { Eye, EyeSlash, Gear, Lock } from 'phosphor-react'; import { useState } from 'react'; - +import { useLibraryMutation, useLibraryQuery } from '@sd/client'; +import { Button, ButtonLink, Input, Tabs } from '@sd/ui'; import { DefaultProps } from '../primitive/types'; import { KeyList } from './KeyList'; import { KeyMounter } from './KeyMounter'; diff --git a/packages/interface/src/components/key/KeyMounter.tsx b/packages/interface/src/components/key/KeyMounter.tsx index 95b397f6d..c3c82d445 100644 --- a/packages/interface/src/components/key/KeyMounter.tsx +++ b/packages/interface/src/components/key/KeyMounter.tsx @@ -1,9 +1,8 @@ -import { Algorithm, useLibraryMutation, useLibraryQuery } from '@sd/client'; -import { Button, CategoryHeading, Input, Select, SelectOption, Switch, cva, tw } from '@sd/ui'; import cryptoRandomString from 'crypto-random-string'; import { Eye, EyeSlash, Info } from 'phosphor-react'; import { useEffect, useRef, useState } from 'react'; - +import { Algorithm, useLibraryMutation, useLibraryQuery } from '@sd/client'; +import { Button, CategoryHeading, Input, Select, SelectOption, Switch, cva, tw } from '@sd/ui'; import { getHashingAlgorithmSettings } from '../../screens/settings/library/KeysSetting'; import Slider from '../primitive/Slider'; import { Tooltip } from '../tooltip/Tooltip'; diff --git a/packages/interface/src/components/layout/Modal.tsx b/packages/interface/src/components/layout/Modal.tsx index 42c39efc9..95f7c50f6 100644 --- a/packages/interface/src/components/layout/Modal.tsx +++ b/packages/interface/src/components/layout/Modal.tsx @@ -1,8 +1,8 @@ import { Transition } from '@headlessui/react'; -import { ButtonLink } from '@sd/ui'; import clsx from 'clsx'; import { X } from 'phosphor-react'; import { PropsWithChildren } from 'react'; +import { ButtonLink } from '@sd/ui'; export function Model( props: PropsWithChildren<{ diff --git a/packages/interface/src/components/layout/Sidebar.tsx b/packages/interface/src/components/layout/Sidebar.tsx index aca50d83d..611294dbc 100644 --- a/packages/interface/src/components/layout/Sidebar.tsx +++ b/packages/interface/src/components/layout/Sidebar.tsx @@ -1,4 +1,8 @@ import { ReactComponent as Ellipsis } from '@sd/assets/svgs/ellipsis.svg'; +import clsx from 'clsx'; +import { CheckCircle, CirclesFour, Gear, Lock, Planet, Plus } from 'phosphor-react'; +import React, { PropsWithChildren } from 'react'; +import { NavLink, NavLinkProps } from 'react-router-dom'; import { LocationCreateArgs, getDebugState, @@ -22,13 +26,8 @@ import { dialogManager, tw } from '@sd/ui'; -import clsx from 'clsx'; -import { CheckCircle, CirclesFour, Gear, Lock, Planet, Plus } from 'phosphor-react'; -import React, { PropsWithChildren } from 'react'; -import { NavLink, NavLinkProps } from 'react-router-dom'; import { useOperatingSystem } from '~/hooks/useOperatingSystem'; import { usePlatform } from '~/util/Platform'; - import AddLocationDialog from '../dialog/AddLocationDialog'; import CreateLibraryDialog from '../dialog/CreateLibraryDialog'; import { Folder } from '../icons/Folder'; diff --git a/packages/interface/src/components/location/LocationListItem.tsx b/packages/interface/src/components/location/LocationListItem.tsx index 8afb50f94..8c62a56ad 100644 --- a/packages/interface/src/components/location/LocationListItem.tsx +++ b/packages/interface/src/components/location/LocationListItem.tsx @@ -1,15 +1,13 @@ -import { useLibraryMutation } from '@sd/client'; -import { Location, Node } from '@sd/client'; -import { Button, Card, Dialog, UseDialogProps, dialogManager, useDialog } from '@sd/ui'; import clsx from 'clsx'; import { Repeat, Trash } from 'phosphor-react'; import { useState } from 'react'; - +import { useLibraryMutation } from '@sd/client'; +import { Location, Node } from '@sd/client'; +import { Button, Card, Dialog, UseDialogProps, dialogManager, useDialog } from '@sd/ui'; +import { useZodForm, z } from '@sd/ui/src/forms'; import { Folder } from '../icons/Folder'; import { Tooltip } from '../tooltip/Tooltip'; -import { useZodForm, z } from '@sd/ui/src/forms'; - interface LocationListItemProps { location: Location & { node: Node }; } diff --git a/packages/interface/src/components/onboarding/Onboarding.tsx b/packages/interface/src/components/onboarding/Onboarding.tsx index 993e1738d..724d07db6 100644 --- a/packages/interface/src/components/onboarding/Onboarding.tsx +++ b/packages/interface/src/components/onboarding/Onboarding.tsx @@ -1,6 +1,5 @@ -import { Button, dialogManager } from '@sd/ui'; import { useNavigate } from 'react-router'; - +import { Button, dialogManager } from '@sd/ui'; import CreateLibraryDialog from '../dialog/CreateLibraryDialog'; // TODO: This page requires styling for now it is just a placeholder. diff --git a/packages/interface/src/components/os/TrafficLights.tsx b/packages/interface/src/components/os/TrafficLights.tsx index 6a9265424..60981bdb1 100644 --- a/packages/interface/src/components/os/TrafficLights.tsx +++ b/packages/interface/src/components/os/TrafficLights.tsx @@ -3,7 +3,6 @@ import fullscreenIconPath from '@sd/assets/svgs/macos_fullscreen.svg'; import minimizeIconPath from '@sd/assets/svgs/macos_minimize.svg'; import clsx from 'clsx'; import { HTMLAttributes, useEffect, useRef } from 'react'; - import { useFocusState } from '~/hooks/useFocusState'; import { DefaultProps } from '../primitive/types'; @@ -18,10 +17,7 @@ export function MacTrafficLights(props: TrafficLightsProps) { const [focused] = useFocusState(); return ( -
+
diff --git a/packages/interface/src/components/primitive/InputContainer.tsx b/packages/interface/src/components/primitive/InputContainer.tsx index 0876ff562..82b1c63d5 100644 --- a/packages/interface/src/components/primitive/InputContainer.tsx +++ b/packages/interface/src/components/primitive/InputContainer.tsx @@ -1,6 +1,5 @@ import clsx from 'clsx'; import { PropsWithChildren } from 'react'; - import { DefaultProps } from './types'; interface InputContainerProps extends DefaultProps { diff --git a/packages/interface/src/components/primitive/PopoverPicker.tsx b/packages/interface/src/components/primitive/PopoverPicker.tsx index a6e6719fd..dfa8bfcd9 100644 --- a/packages/interface/src/components/primitive/PopoverPicker.tsx +++ b/packages/interface/src/components/primitive/PopoverPicker.tsx @@ -2,7 +2,6 @@ import clsx from 'clsx'; import { useCallback, useRef, useState } from 'react'; import { HexColorPicker } from 'react-colorful'; import { UseControllerProps, useController } from 'react-hook-form'; - import useClickOutside from '../../hooks/useClickOutside'; interface PopoverPickerProps extends UseControllerProps { diff --git a/packages/interface/src/components/primitive/Shortcut.tsx b/packages/interface/src/components/primitive/Shortcut.tsx index c0edfd6ec..7bc0cbe16 100644 --- a/packages/interface/src/components/primitive/Shortcut.tsx +++ b/packages/interface/src/components/primitive/Shortcut.tsx @@ -1,5 +1,4 @@ import clsx from 'clsx'; - import { DefaultProps } from './types'; export interface ShortcutProps extends DefaultProps { diff --git a/packages/interface/src/components/primitive/Tag.tsx b/packages/interface/src/components/primitive/Tag.tsx index 6e5c1d674..d1972b7fd 100644 --- a/packages/interface/src/components/primitive/Tag.tsx +++ b/packages/interface/src/components/primitive/Tag.tsx @@ -1,6 +1,5 @@ import clsx from 'clsx'; import { PropsWithChildren, ReactNode } from 'react'; - import { DefaultProps } from './types'; export interface TagProps extends DefaultProps { diff --git a/packages/interface/src/components/primitive/Toasts.tsx b/packages/interface/src/components/primitive/Toasts.tsx index 9f81018a4..d7cbcbf1f 100644 --- a/packages/interface/src/components/primitive/Toasts.tsx +++ b/packages/interface/src/components/primitive/Toasts.tsx @@ -1,6 +1,5 @@ import * as ToastPrimitive from '@radix-ui/react-toast'; import clsx from 'clsx'; - import { useToasts } from '../../hooks/useToasts'; export function Toasts() { diff --git a/packages/interface/src/components/settings/SettingsContainer.tsx b/packages/interface/src/components/settings/SettingsContainer.tsx index 302881c39..03ea8433c 100644 --- a/packages/interface/src/components/settings/SettingsContainer.tsx +++ b/packages/interface/src/components/settings/SettingsContainer.tsx @@ -1,6 +1,5 @@ import clsx from 'clsx'; import { PropsWithChildren } from 'react'; - import { useOperatingSystem } from '../../hooks/useOperatingSystem'; export const SettingsContainer = ({ children }: PropsWithChildren) => { diff --git a/packages/interface/src/components/settings/SettingsSidebar.tsx b/packages/interface/src/components/settings/SettingsSidebar.tsx index 8cb1d81dd..90f060d30 100644 --- a/packages/interface/src/components/settings/SettingsSidebar.tsx +++ b/packages/interface/src/components/settings/SettingsSidebar.tsx @@ -13,7 +13,6 @@ import { ShieldCheck, TagSimple } from 'phosphor-react'; - import { useOperatingSystem } from '../../hooks/useOperatingSystem'; import { SidebarLink } from '../layout/Sidebar'; import { SettingsHeading, SettingsIcon } from './SettingsHeader'; diff --git a/packages/interface/src/hooks/useDebouncedForm.ts b/packages/interface/src/hooks/useDebouncedForm.ts index 39cbf9549..5189e8ebe 100644 --- a/packages/interface/src/hooks/useDebouncedForm.ts +++ b/packages/interface/src/hooks/useDebouncedForm.ts @@ -1,7 +1,7 @@ -import { useCurrentLibrary } from '@sd/client'; import { useEffect } from 'react'; import { FieldValues, UseFormReturn } from 'react-hook-form'; import { useDebouncedCallback } from 'use-debounce'; +import { useCurrentLibrary } from '@sd/client'; export function useDebouncedForm( form: UseFormReturn<{ id: string } & object, TContext>, diff --git a/packages/interface/src/hooks/useExplorerStore.tsx b/packages/interface/src/hooks/useExplorerStore.tsx index 77019de9c..15e957cf3 100644 --- a/packages/interface/src/hooks/useExplorerStore.tsx +++ b/packages/interface/src/hooks/useExplorerStore.tsx @@ -1,6 +1,5 @@ -import { onLibraryChange } from '@sd/client'; import { proxy, useSnapshot } from 'valtio'; - +import { onLibraryChange } from '@sd/client'; import { resetStore } from '@sd/client/src/stores/util'; export type ExplorerLayoutMode = 'list' | 'grid' | 'columns' | 'media'; diff --git a/packages/interface/src/hooks/useKeyboardHandler.ts b/packages/interface/src/hooks/useKeyboardHandler.ts index 82e848636..852bb2773 100644 --- a/packages/interface/src/hooks/useKeyboardHandler.ts +++ b/packages/interface/src/hooks/useKeyboardHandler.ts @@ -1,6 +1,5 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router'; - import { KeybindEvent } from '../util/keybind'; export function useKeybindHandler() { diff --git a/packages/interface/src/hooks/useOperatingSystem.ts b/packages/interface/src/hooks/useOperatingSystem.ts index b09da3921..907954800 100644 --- a/packages/interface/src/hooks/useOperatingSystem.ts +++ b/packages/interface/src/hooks/useOperatingSystem.ts @@ -1,5 +1,4 @@ import { useQuery } from '@tanstack/react-query'; - import { OperatingSystem, usePlatform } from '../util/Platform'; export function guessOperatingSystem(): OperatingSystem { diff --git a/packages/interface/src/screens/Debug.tsx b/packages/interface/src/screens/Debug.tsx index 88014d464..befab2ed7 100644 --- a/packages/interface/src/screens/Debug.tsx +++ b/packages/interface/src/screens/Debug.tsx @@ -1,5 +1,4 @@ import { useBridgeQuery, useLibraryMutation, useLibraryQuery } from '@sd/client'; - import CodeBlock from '~/components/primitive/Codeblock'; import { usePlatform } from '~/util/Platform'; diff --git a/packages/interface/src/screens/LocationExplorer.tsx b/packages/interface/src/screens/LocationExplorer.tsx index 951887c0b..941d8f6a4 100644 --- a/packages/interface/src/screens/LocationExplorer.tsx +++ b/packages/interface/src/screens/LocationExplorer.tsx @@ -1,7 +1,6 @@ -import { useCurrentLibrary, useLibraryQuery } from '@sd/client'; import { useEffect } from 'react'; import { useParams, useSearchParams } from 'react-router-dom'; - +import { useCurrentLibrary, useLibraryQuery } from '@sd/client'; import Explorer from '~/components/explorer/Explorer'; import { getExplorerStore } from '~/hooks/useExplorerStore'; diff --git a/packages/interface/src/screens/Overview.tsx b/packages/interface/src/screens/Overview.tsx index 27a68c149..a597babc0 100644 --- a/packages/interface/src/screens/Overview.tsx +++ b/packages/interface/src/screens/Overview.tsx @@ -1,12 +1,11 @@ -import { onLibraryChange, queryClient, useCurrentLibrary, useLibraryQuery } from '@sd/client'; -import { Statistics } from '@sd/client'; import byteSize from 'byte-size'; import clsx from 'clsx'; import { useEffect } from 'react'; import Skeleton from 'react-loading-skeleton'; import 'react-loading-skeleton/dist/skeleton.css'; import { proxy } from 'valtio'; - +import { onLibraryChange, queryClient, useCurrentLibrary, useLibraryQuery } from '@sd/client'; +import { Statistics } from '@sd/client'; import useCounter from '~/hooks/useCounter'; import { usePlatform } from '~/util/Platform'; diff --git a/packages/interface/src/screens/TagExplorer.tsx b/packages/interface/src/screens/TagExplorer.tsx index 674bcfb0b..ed88e8bed 100644 --- a/packages/interface/src/screens/TagExplorer.tsx +++ b/packages/interface/src/screens/TagExplorer.tsx @@ -1,6 +1,5 @@ -import { useCurrentLibrary, useLibraryQuery } from '@sd/client'; import { useParams } from 'react-router-dom'; - +import { useCurrentLibrary, useLibraryQuery } from '@sd/client'; import Explorer from '~/components/explorer/Explorer'; export default function TagExplorer() { diff --git a/packages/interface/src/screens/settings/Settings.tsx b/packages/interface/src/screens/settings/Settings.tsx index 223b89e70..eef0cb955 100644 --- a/packages/interface/src/screens/settings/Settings.tsx +++ b/packages/interface/src/screens/settings/Settings.tsx @@ -1,6 +1,5 @@ import { Suspense } from 'react'; import { Outlet } from 'react-router'; - import { SettingsSidebar } from '~/components/settings/SettingsSidebar'; export default function SettingsScreen() { diff --git a/packages/interface/src/screens/settings/client/AppearanceSettings.tsx b/packages/interface/src/screens/settings/client/AppearanceSettings.tsx index a13853e7f..1b80d3c76 100644 --- a/packages/interface/src/screens/settings/client/AppearanceSettings.tsx +++ b/packages/interface/src/screens/settings/client/AppearanceSettings.tsx @@ -1,6 +1,5 @@ -import { Switch } from '@sd/ui'; import { useState } from 'react'; - +import { Switch } from '@sd/ui'; import { InputContainer } from '~/components/primitive/InputContainer'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; diff --git a/packages/interface/src/screens/settings/client/ExtensionsSettings.tsx b/packages/interface/src/screens/settings/client/ExtensionsSettings.tsx index 83e13010e..637d2f43f 100644 --- a/packages/interface/src/screens/settings/client/ExtensionsSettings.tsx +++ b/packages/interface/src/screens/settings/client/ExtensionsSettings.tsx @@ -1,6 +1,5 @@ -import { Button, Card, GridLayout, Input } from '@sd/ui'; import { MagnifyingGlass } from 'phosphor-react'; - +import { Button, Card, GridLayout, Input } from '@sd/ui'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; diff --git a/packages/interface/src/screens/settings/client/GeneralSettings.tsx b/packages/interface/src/screens/settings/client/GeneralSettings.tsx index 55641550c..adad66ca8 100644 --- a/packages/interface/src/screens/settings/client/GeneralSettings.tsx +++ b/packages/interface/src/screens/settings/client/GeneralSettings.tsx @@ -1,7 +1,6 @@ +import { Database } from 'phosphor-react'; import { getDebugState, useBridgeQuery, useDebugState } from '@sd/client'; import { Card, Input, Switch, tw } from '@sd/ui'; -import { Database } from 'phosphor-react'; - import { InputContainer } from '~/components/primitive/InputContainer'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; diff --git a/packages/interface/src/screens/settings/client/KeybindingSettings.tsx b/packages/interface/src/screens/settings/client/KeybindingSettings.tsx index 7394c1874..cbf33b32c 100644 --- a/packages/interface/src/screens/settings/client/KeybindingSettings.tsx +++ b/packages/interface/src/screens/settings/client/KeybindingSettings.tsx @@ -1,6 +1,5 @@ -import { Switch } from '@sd/ui'; import { useState } from 'react'; - +import { Switch } from '@sd/ui'; import { InputContainer } from '~/components/primitive/InputContainer'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; diff --git a/packages/interface/src/screens/settings/client/PrivacySettings.tsx b/packages/interface/src/screens/settings/client/PrivacySettings.tsx index b31f82cc6..33714ac36 100644 --- a/packages/interface/src/screens/settings/client/PrivacySettings.tsx +++ b/packages/interface/src/screens/settings/client/PrivacySettings.tsx @@ -1,6 +1,5 @@ -import { Switch } from '@sd/ui'; import { useState } from 'react'; - +import { Switch } from '@sd/ui'; import { InputContainer } from '~/components/primitive/InputContainer'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; diff --git a/packages/interface/src/screens/settings/info/AboutSpacedrive.tsx b/packages/interface/src/screens/settings/info/AboutSpacedrive.tsx index 446432f07..f11f77056 100644 --- a/packages/interface/src/screens/settings/info/AboutSpacedrive.tsx +++ b/packages/interface/src/screens/settings/info/AboutSpacedrive.tsx @@ -1,6 +1,5 @@ import Logo from '@sd/assets/images/logo.png'; import { useBridgeQuery } from '@sd/client'; - import { SettingsContainer } from '../../../components/settings/SettingsContainer'; import { SettingsHeader } from '../../../components/settings/SettingsHeader'; diff --git a/packages/interface/src/screens/settings/library/KeysSetting.tsx b/packages/interface/src/screens/settings/library/KeysSetting.tsx index d5e91679f..c4c828c49 100644 --- a/packages/interface/src/screens/settings/library/KeysSetting.tsx +++ b/packages/interface/src/screens/settings/library/KeysSetting.tsx @@ -1,10 +1,10 @@ import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; -import { HashingAlgorithm, useLibraryMutation, useLibraryQuery } from '@sd/client'; -import { Button, Input, dialogManager } from '@sd/ui'; import clsx from 'clsx'; import { Eye, EyeSlash, Lock, Plus } from 'phosphor-react'; import { PropsWithChildren, useState } from 'react'; import { animated, useTransition } from 'react-spring'; +import { HashingAlgorithm, useLibraryMutation, useLibraryQuery } from '@sd/client'; +import { Button, Input, dialogManager } from '@sd/ui'; import { BackupRestoreDialog } from '~/components/dialog/BackupRestoreDialog'; import { KeyViewerDialog } from '~/components/dialog/KeyViewerDialog'; import { MasterPasswordChangeDialog } from '~/components/dialog/MasterPasswordChangeDialog'; diff --git a/packages/interface/src/screens/settings/library/LibraryGeneralSettings.tsx b/packages/interface/src/screens/settings/library/LibraryGeneralSettings.tsx index 00d4e6b99..e8e12facc 100644 --- a/packages/interface/src/screens/settings/library/LibraryGeneralSettings.tsx +++ b/packages/interface/src/screens/settings/library/LibraryGeneralSettings.tsx @@ -1,8 +1,7 @@ +import { useForm } from 'react-hook-form'; import { useBridgeMutation } from '@sd/client'; import { useCurrentLibrary } from '@sd/client'; import { Button, Input, Switch } from '@sd/ui'; -import { useForm } from 'react-hook-form'; - import { InputContainer } from '~/components/primitive/InputContainer'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; diff --git a/packages/interface/src/screens/settings/library/LocationSettings.tsx b/packages/interface/src/screens/settings/library/LocationSettings.tsx index 3d4e2cd56..263502c4e 100644 --- a/packages/interface/src/screens/settings/library/LocationSettings.tsx +++ b/packages/interface/src/screens/settings/library/LocationSettings.tsx @@ -1,7 +1,7 @@ +import { MagnifyingGlass } from 'phosphor-react'; import { useLibraryMutation, useLibraryQuery } from '@sd/client'; import { LocationCreateArgs } from '@sd/client'; import { Button, Input, dialogManager } from '@sd/ui'; -import { MagnifyingGlass } from 'phosphor-react'; import AddLocationDialog from '~/components/dialog/AddLocationDialog'; import LocationListItem from '~/components/location/LocationListItem'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; diff --git a/packages/interface/src/screens/settings/library/TagsSettings.tsx b/packages/interface/src/screens/settings/library/TagsSettings.tsx index 4b627a439..deeb7c9f0 100644 --- a/packages/interface/src/screens/settings/library/TagsSettings.tsx +++ b/packages/interface/src/screens/settings/library/TagsSettings.tsx @@ -1,17 +1,16 @@ -import { Tag, useLibraryMutation, useLibraryQuery } from '@sd/client'; -import { Button, Card, Dialog, Switch, UseDialogProps, dialogManager, useDialog } from '@sd/ui'; import clsx from 'clsx'; import { Trash } from 'phosphor-react'; import { useCallback, useEffect, useState } from 'react'; import { useDebounce } from 'rooks'; +import { Tag, useLibraryMutation, useLibraryQuery } from '@sd/client'; +import { Button, Card, Dialog, Switch, UseDialogProps, dialogManager, useDialog } from '@sd/ui'; +import { Form, Input, useZodForm, z } from '@sd/ui/src/forms'; import { InputContainer } from '~/components/primitive/InputContainer'; import { PopoverPicker } from '~/components/primitive/PopoverPicker'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; import { Tooltip } from '~/components/tooltip/Tooltip'; -import { Form, Input, useZodForm, z } from '@sd/ui/src/forms'; - export default function TagsSettings() { const tags = useLibraryQuery(['tags.list']); diff --git a/packages/interface/src/screens/settings/node/ExperimentalSettings.tsx b/packages/interface/src/screens/settings/node/ExperimentalSettings.tsx index a1b718fa0..76405906f 100644 --- a/packages/interface/src/screens/settings/node/ExperimentalSettings.tsx +++ b/packages/interface/src/screens/settings/node/ExperimentalSettings.tsx @@ -1,5 +1,4 @@ import { Switch } from '@sd/ui'; - import { useNodeStore } from '~/components/device/Stores'; import { InputContainer } from '~/components/primitive/InputContainer'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; diff --git a/packages/interface/src/screens/settings/node/LibrariesSettings.tsx b/packages/interface/src/screens/settings/node/LibrariesSettings.tsx index 2e433573c..3378b3340 100644 --- a/packages/interface/src/screens/settings/node/LibrariesSettings.tsx +++ b/packages/interface/src/screens/settings/node/LibrariesSettings.tsx @@ -1,7 +1,7 @@ +import { Database, DotsSixVertical, Pencil, Trash } from 'phosphor-react'; import { useBridgeQuery, useCurrentLibrary } from '@sd/client'; import { LibraryConfigWrapped } from '@sd/client'; import { Button, ButtonLink, Card, dialogManager, tw } from '@sd/ui'; -import { Database, DotsSixVertical, Pencil, Trash } from 'phosphor-react'; import CreateLibraryDialog from '~/components/dialog/CreateLibraryDialog'; import DeleteLibraryDialog from '~/components/dialog/DeleteLibraryDialog'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; diff --git a/packages/interface/src/screens/settings/node/P2PSettings.tsx b/packages/interface/src/screens/settings/node/P2PSettings.tsx index b90308693..d4ba32f03 100644 --- a/packages/interface/src/screens/settings/node/P2PSettings.tsx +++ b/packages/interface/src/screens/settings/node/P2PSettings.tsx @@ -1,5 +1,4 @@ import { Input, Switch } from '@sd/ui'; - import { InputContainer } from '~/components/primitive/InputContainer'; import { SettingsContainer } from '~/components/settings/SettingsContainer'; import { SettingsHeader } from '~/components/settings/SettingsHeader'; diff --git a/packages/interface/src/style.scss b/packages/interface/src/style.scss index 1d042278d..f5d78a984 100644 --- a/packages/interface/src/style.scss +++ b/packages/interface/src/style.scss @@ -45,7 +45,6 @@ body { } &::-webkit-scrollbar-thumb { @apply rounded-[6px] bg-transparent; - } &:hover { &::-webkit-scrollbar-thumb { diff --git a/packages/interface/tsconfig.json b/packages/interface/tsconfig.json index e5764d9f4..924e7526d 100644 --- a/packages/interface/tsconfig.json +++ b/packages/interface/tsconfig.json @@ -4,18 +4,11 @@ "rootDir": "src", "declarationDir": "dist", "paths": { - "~/*": [ - "./src/*" - ] + "~/*": ["./src/*"] }, - "types": [ - "vite-plugin-svgr/client", - "vite/client" - ] + "types": ["vite-plugin-svgr/client", "vite/client"] }, - "include": [ - "src" - ], + "include": ["src"], "references": [ { "path": "../ui" diff --git a/packages/ui/src/Button.stories.tsx b/packages/ui/src/Button.stories.tsx index d5518c370..077f11080 100644 --- a/packages/ui/src/Button.stories.tsx +++ b/packages/ui/src/Button.stories.tsx @@ -1,5 +1,4 @@ import { ComponentMeta, ComponentStory } from '@storybook/react'; - import { Button } from './Button'; export default { diff --git a/packages/ui/src/Dialog.tsx b/packages/ui/src/Dialog.tsx index 58dc9dc69..c4f2505f1 100644 --- a/packages/ui/src/Dialog.tsx +++ b/packages/ui/src/Dialog.tsx @@ -4,7 +4,6 @@ import { ReactElement, ReactNode, useEffect } from 'react'; import { FieldValues } from 'react-hook-form'; import { animated, useTransition } from 'react-spring'; import { proxy, ref, subscribe, useSnapshot } from 'valtio'; - import { Button, Loader } from '../'; import { Form, FormProps } from './forms/Form'; diff --git a/packages/ui/src/Dropdown.stories.tsx b/packages/ui/src/Dropdown.stories.tsx index 94f4a6915..c262d6a77 100644 --- a/packages/ui/src/Dropdown.stories.tsx +++ b/packages/ui/src/Dropdown.stories.tsx @@ -1,5 +1,4 @@ import { ComponentMeta, ComponentStory } from '@storybook/react'; - import { Root } from './Dropdown'; export default { diff --git a/packages/ui/src/Dropdown.tsx b/packages/ui/src/Dropdown.tsx index 16fc5ee9b..285ede473 100644 --- a/packages/ui/src/Dropdown.tsx +++ b/packages/ui/src/Dropdown.tsx @@ -1,10 +1,9 @@ -import { Menu, Transition } from '@headlessui/react'; import { ReactComponent as CaretDown } from '@sd/assets/svgs/caret.svg'; +import { Menu, Transition } from '@headlessui/react'; import { VariantProps, cva } from 'class-variance-authority'; import clsx from 'clsx'; import { Fragment, PropsWithChildren } from 'react'; import { Link } from 'react-router-dom'; - import * as UI from '.'; import { tw } from './utils'; diff --git a/packages/ui/src/Select.tsx b/packages/ui/src/Select.tsx index 3469db813..3a4c1806e 100644 --- a/packages/ui/src/Select.tsx +++ b/packages/ui/src/Select.tsx @@ -1,5 +1,5 @@ -import * as SelectPrimitive from '@radix-ui/react-select'; import { ReactComponent as ChevronDouble } from '@sd/assets/svgs/chevron-double.svg'; +import * as SelectPrimitive from '@radix-ui/react-select'; import clsx from 'clsx'; import { CaretDown, Check } from 'phosphor-react'; import { PropsWithChildren } from 'react'; diff --git a/packages/ui/src/Tabs.tsx b/packages/ui/src/Tabs.tsx index 4b5503c55..cf56f7cf3 100644 --- a/packages/ui/src/Tabs.tsx +++ b/packages/ui/src/Tabs.tsx @@ -1,5 +1,4 @@ import * as TabsPrimitive from '@radix-ui/react-tabs'; - import { tw } from './utils'; export const Root = tw(TabsPrimitive.Root)` diff --git a/packages/ui/src/forms/CheckBox.tsx b/packages/ui/src/forms/CheckBox.tsx index c2274a2c3..af5fb0ed4 100644 --- a/packages/ui/src/forms/CheckBox.tsx +++ b/packages/ui/src/forms/CheckBox.tsx @@ -1,5 +1,4 @@ import { forwardRef } from 'react'; - import { CheckBox as Root } from '../CheckBox'; import { FormField, UseFormFieldProps, useFormField } from './FormField'; diff --git a/packages/ui/src/forms/Input.tsx b/packages/ui/src/forms/Input.tsx index bb8638d9f..adb3485e0 100644 --- a/packages/ui/src/forms/Input.tsx +++ b/packages/ui/src/forms/Input.tsx @@ -1,5 +1,4 @@ import { forwardRef } from 'react'; - import * as Root from '../Input'; import { FormField, UseFormFieldProps, useFormField } from './FormField'; diff --git a/packages/ui/src/forms/Switch.tsx b/packages/ui/src/forms/Switch.tsx index 67d6e7eaa..0c9b3bd6f 100644 --- a/packages/ui/src/forms/Switch.tsx +++ b/packages/ui/src/forms/Switch.tsx @@ -1,6 +1,5 @@ import { forwardRef } from 'react'; import { useController } from 'react-hook-form'; - import * as Root from '../Switch'; import { FormField, UseFormFieldProps, useFormField } from './FormField'; diff --git a/packages/ui/style/colors.scss b/packages/ui/style/colors.scss index a77397e5e..5c83a35de 100644 --- a/packages/ui/style/colors.scss +++ b/packages/ui/style/colors.scss @@ -1,100 +1,100 @@ :root { - --dark-hue: 235; //300, 295 - --light-hue: 235; + --dark-hue: 235; //300, 295 + --light-hue: 235; - // global - --color-black: 0, 0%, 0%; - --color-white: 0, 0%, 100%; - // accent theme colors - --color-accent: 208, 100%, 57%; - --color-accent-faint: 208, 100%, 64%; - --color-accent-deep: 208, 100%, 47%; - // text - --color-ink: var(--dark-hue), 0%, 100%; - --color-ink-dull: var(--dark-hue), 10%, 70%; - --color-ink-faint: var(--dark-hue), 10%, 55%; - // sidebar - --color-sidebar: var(--dark-hue), 15%, 7%; - --color-sidebar-box: var(--dark-hue), 15%, 16%; - --color-sidebar-line: var(--dark-hue), 15%, 23%; - --color-sidebar-divider: var(--dark-hue), 15%, 17%; - --color-sidebar-button: var(--dark-hue), 15%, 18%; - --color-sidebar-selected: var(--dark-hue), 15%, 24%; - --color-sidebar-shade: var(--dark-hue), 15%, 23%; - // main - --color-app: var(--dark-hue), 15%, 13%; - --color-app-box: var(--dark-hue), 15%, 18%; - --color-app-overlay: var(--dark-hue), 15%, 17%; - --color-app-input: var(--dark-hue), 15%, 20%; - --color-app-focus: var(--dark-hue), 15%, 10%; - --color-app-line: var(--dark-hue), 15%, 23%; - --color-app-divider: var(--dark-hue), 15%, 5%; - --color-app-button: var(--dark-hue), 15%, 23%; - --color-app-hover: var(--dark-hue), 15%, 25%; - --color-app-selected: var(--dark-hue), 15%, 26%; - --color-app-active: var(--dark-hue), 15%, 30%; - --color-app-shade: var(--dark-hue), 15%, 0%; - --color-app-frame: var(--dark-hue), 15%, 25%; - // menu - --color-menu: var(--dark-hue), 25%, 5%; - --color-menu-line: var(--dark-hue), 15%, 7%; - --color-menu-ink: var(--dark-hue), 5%, 100%; - --color-menu-faint: var(--dark-hue), 5%, 80%; - --color-menu-hover: var(--dark-hue), 15%, 30%; - --color-menu-selected: var(--dark-hue), 5%, 30%; - --color-menu-shade: var(--dark-hue), 5%, 0%; + // global + --color-black: 0, 0%, 0%; + --color-white: 0, 0%, 100%; + // accent theme colors + --color-accent: 208, 100%, 57%; + --color-accent-faint: 208, 100%, 64%; + --color-accent-deep: 208, 100%, 47%; + // text + --color-ink: var(--dark-hue), 0%, 100%; + --color-ink-dull: var(--dark-hue), 10%, 70%; + --color-ink-faint: var(--dark-hue), 10%, 55%; + // sidebar + --color-sidebar: var(--dark-hue), 15%, 7%; + --color-sidebar-box: var(--dark-hue), 15%, 16%; + --color-sidebar-line: var(--dark-hue), 15%, 23%; + --color-sidebar-divider: var(--dark-hue), 15%, 17%; + --color-sidebar-button: var(--dark-hue), 15%, 18%; + --color-sidebar-selected: var(--dark-hue), 15%, 24%; + --color-sidebar-shade: var(--dark-hue), 15%, 23%; + // main + --color-app: var(--dark-hue), 15%, 13%; + --color-app-box: var(--dark-hue), 15%, 18%; + --color-app-overlay: var(--dark-hue), 15%, 17%; + --color-app-input: var(--dark-hue), 15%, 20%; + --color-app-focus: var(--dark-hue), 15%, 10%; + --color-app-line: var(--dark-hue), 15%, 23%; + --color-app-divider: var(--dark-hue), 15%, 5%; + --color-app-button: var(--dark-hue), 15%, 23%; + --color-app-hover: var(--dark-hue), 15%, 25%; + --color-app-selected: var(--dark-hue), 15%, 26%; + --color-app-active: var(--dark-hue), 15%, 30%; + --color-app-shade: var(--dark-hue), 15%, 0%; + --color-app-frame: var(--dark-hue), 15%, 25%; + // menu + --color-menu: var(--dark-hue), 25%, 5%; + --color-menu-line: var(--dark-hue), 15%, 7%; + --color-menu-ink: var(--dark-hue), 5%, 100%; + --color-menu-faint: var(--dark-hue), 5%, 80%; + --color-menu-hover: var(--dark-hue), 15%, 30%; + --color-menu-selected: var(--dark-hue), 5%, 30%; + --color-menu-shade: var(--dark-hue), 5%, 0%; } @media (prefers-color-scheme: light) { -.vanilla-theme { - // global - --color-black: 0, 0%, 0%; - --color-white: 0, 0%, 100%; - // accent theme colors - --color-accent: 208, 100%, 57%; - --color-accent-faint: 208, 100%, 67%; - --color-accent-deep: 208, 100%, 47%; - // text - --color-ink: var(--light-hue), 5%, 20%; - --color-ink-dull: var(--light-hue), 5%, 30%; - --color-ink-faint: var(--light-hue), 5%, 40%; - // sidebar - --color-sidebar: var(--light-hue), 5%, 96%; - --color-sidebar-box: var(--light-hue), 5%, 100%; - --color-sidebar-line: var(--light-hue), 10%, 85%; - --color-sidebar-divider: var(--light-hue), 15%, 93%; - --color-sidebar-button: var(--light-hue), 15%, 100%; - --color-sidebar-selected: var(--light-hue), 10%, 80%; - --color-sidebar-shade: var(--light-hue), 15%, 100%; - // main - --color-app: var(--light-hue), 5%, 100%; - --color-app-box: var(--light-hue), 5%, 98%; - --color-app-overlay: var(--light-hue), 5%, 100%; - --color-app-input: var(--light-hue), 5%, 100%; - --color-app-focus: var(--light-hue), 5%, 98%; - --color-app-line: var(--light-hue), 5%, 90%; - --color-app-button: var(--light-hue), 5%, 100%; - --color-app-divider: var(--light-hue), 5%, 80%; - --color-app-selected: var(--light-hue), 5%, 93%; - --color-app-hover: var(--light-hue), 5%, 97%; - --color-app-active: var(--light-hue), 5%, 87%; - --color-app-shade: var(--light-hue), 15%, 50%; - --color-app-frame: 0, 0%, 100%; - // menu - --color-menu: var(--light-hue), 16%, 0%; - --color-menu-line: var(--light-hue), 5%, 18%; - --color-menu-ink: var(--light-hue), 5%, 100%; - --color-menu-faint: var(--light-hue), 5%, 80%; - --color-menu-hover: var(--light-hue), 15%, 20%; - --color-menu-selected: var(--light-hue), 5%, 30%; - --color-menu-shade: var(--light-hue), 5%, 0%; + .vanilla-theme { + // global + --color-black: 0, 0%, 0%; + --color-white: 0, 0%, 100%; + // accent theme colors + --color-accent: 208, 100%, 57%; + --color-accent-faint: 208, 100%, 67%; + --color-accent-deep: 208, 100%, 47%; + // text + --color-ink: var(--light-hue), 5%, 20%; + --color-ink-dull: var(--light-hue), 5%, 30%; + --color-ink-faint: var(--light-hue), 5%, 40%; + // sidebar + --color-sidebar: var(--light-hue), 5%, 96%; + --color-sidebar-box: var(--light-hue), 5%, 100%; + --color-sidebar-line: var(--light-hue), 10%, 85%; + --color-sidebar-divider: var(--light-hue), 15%, 93%; + --color-sidebar-button: var(--light-hue), 15%, 100%; + --color-sidebar-selected: var(--light-hue), 10%, 80%; + --color-sidebar-shade: var(--light-hue), 15%, 100%; + // main + --color-app: var(--light-hue), 5%, 100%; + --color-app-box: var(--light-hue), 5%, 98%; + --color-app-overlay: var(--light-hue), 5%, 100%; + --color-app-input: var(--light-hue), 5%, 100%; + --color-app-focus: var(--light-hue), 5%, 98%; + --color-app-line: var(--light-hue), 5%, 90%; + --color-app-button: var(--light-hue), 5%, 100%; + --color-app-divider: var(--light-hue), 5%, 80%; + --color-app-selected: var(--light-hue), 5%, 93%; + --color-app-hover: var(--light-hue), 5%, 97%; + --color-app-active: var(--light-hue), 5%, 87%; + --color-app-shade: var(--light-hue), 15%, 50%; + --color-app-frame: 0, 0%, 100%; + // menu + --color-menu: var(--light-hue), 16%, 0%; + --color-menu-line: var(--light-hue), 5%, 18%; + --color-menu-ink: var(--light-hue), 5%, 100%; + --color-menu-faint: var(--light-hue), 5%, 80%; + --color-menu-hover: var(--light-hue), 15%, 20%; + --color-menu-selected: var(--light-hue), 5%, 30%; + --color-menu-shade: var(--light-hue), 5%, 0%; - // --color-menu: var(--light-hue), 16%, 99%; - // --color-menu-line: var(--light-hue), 5%, 90%; - // --color-menu-ink: var(--light-hue), 5%, 30%; - // --color-menu-faint: var(--light-hue), 5%, 80%; - // --color-menu-hover: var(--light-hue), 15%, 20%; - // --color-menu-selected: var(--light-hue), 5%, 30%; - // --color-menu-shade: var(--light-hue), 5%, 0%; -} + // --color-menu: var(--light-hue), 16%, 99%; + // --color-menu-line: var(--light-hue), 5%, 90%; + // --color-menu-ink: var(--light-hue), 5%, 30%; + // --color-menu-faint: var(--light-hue), 5%, 80%; + // --color-menu-hover: var(--light-hue), 15%, 20%; + // --color-menu-selected: var(--light-hue), 5%, 30%; + // --color-menu-shade: var(--light-hue), 5%, 0%; + } } diff --git a/packages/ui/style/style.scss b/packages/ui/style/style.scss index 37371d807..f0ccf48d0 100644 --- a/packages/ui/style/style.scss +++ b/packages/ui/style/style.scss @@ -1,4 +1,4 @@ -@import "./colors.scss"; +@import './colors.scss'; @tailwind base; @tailwind components; @@ -27,16 +27,15 @@ } .mask-fade-out { - // -webkit-mask-image: linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1)); - mask-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100px); + // -webkit-mask-image: linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1)); + mask-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100px); } - .cool-shadow { box-shadow: rgb(0 0 0 / 9%) 0px 3px 12px; } // Without this Tauri displays button differently to web -[type="button"] { +[type='button'] { -webkit-appearance: none; -} \ No newline at end of file +} diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 4677b60a1..8e080d56b 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -4,7 +4,5 @@ "rootDir": "src", "declarationDir": "dist" }, - "include": [ - "src" - ] + "include": ["src"] } diff --git a/turbo.json b/turbo.json index 2d6866d22..1d8239406 100644 --- a/turbo.json +++ b/turbo.json @@ -2,12 +2,8 @@ "$schema": "https://turborepo.org/schema.json", "pipeline": { "build": { - "dependsOn": [ - "^build" - ], - "outputs": [ - "dist/**" - ] + "dependsOn": ["^build"], + "outputs": ["dist/**"] }, "lint": { "outputs": [] From cda8236de64e49879d3de17b9d19750b2c74c6c4 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 19:58:49 -0800 Subject: [PATCH 12/15] prefix lefthook install with pnpm because executability is broken --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 591e220b6..1ce98ce92 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "postinstall": "lefthook install", + "postinstall": "pnpm lefthook install", "prep": "pnpm gen:prisma && cargo test -p sd-core api::tests::test_and_export_rspc_bindings -- --exact", "build": "turbo run build", "landing-web": "turbo run dev --parallel --filter=@sd/landing --filter=@sd/web", From 9903625d15d800856c6eaba0de08cdd4c83bbad5 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 20:29:32 -0800 Subject: [PATCH 13/15] don't use symlinked binaries (pnpm bugfix!) --- .npmrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.npmrc b/.npmrc index 728956208..89f147e1d 100644 --- a/.npmrc +++ b/.npmrc @@ -1,5 +1,7 @@ ; make all engine requirements (e.g. node version) strictly kept engine-strict=true +; tempfix for pnpm#5909: https://github.com/pnpm/pnpm/issues/5909#issuecomment-1397758156 +prefer-symlinked-executables=false ; necessary for metro + mobile strict-peer-dependencies=false node-linker=hoisted From 7a107f134cf6474a2026bf9493334a03154a99c4 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Thu, 19 Jan 2023 20:29:51 -0800 Subject: [PATCH 14/15] refresh pnpm lockfile --- pnpm-lock.yaml | Bin 792810 -> 786344 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acdec2435bde8e0e62a6b9df5a06f8010ca87538..4296912a84279a6b549beb965cbd695d9e659273 100644 GIT binary patch delta 60742 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 S@;*F{ympy%>^}h?{X`M~ delta 64271 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 X;a7eSCeKfN Date: Thu, 19 Jan 2023 20:31:35 -0800 Subject: [PATCH 15/15] rm not-strictly-necessary `pnpm` before lefthook install --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ce98ce92..591e220b6 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "postinstall": "pnpm lefthook install", + "postinstall": "lefthook install", "prep": "pnpm gen:prisma && cargo test -p sd-core api::tests::test_and_export_rspc_bindings -- --exact", "build": "turbo run build", "landing-web": "turbo run dev --parallel --filter=@sd/landing --filter=@sd/web",