├── .cargo └── config.toml ├── .github ├── CODEOWNERS ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ └── config.yml ├── actions │ └── publish-artifacts │ │ └── action.yaml ├── pull_request_template.md ├── scripts │ ├── setup-system.ps1 │ └── setup-system.sh └── workflows │ ├── ci.yml │ ├── clippy.yml │ ├── diagram.yml.disabled │ └── org-readme.yml ├── .gitignore ├── .prettierrc.cli.js ├── .prettierrc.json ├── .rustfmt.toml ├── .vscode ├── .todo └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── apps ├── desktop │ ├── app-icon.png │ ├── dist │ │ └── .placeholder │ ├── package.json │ ├── postcss.config.js │ ├── src-tauri │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ ├── build.rs │ │ ├── icons │ │ │ ├── 128x128.png │ │ │ ├── 128x128@2x.png │ │ │ ├── 32x32.png │ │ │ ├── Square107x107Logo.png │ │ │ ├── Square142x142Logo.png │ │ │ ├── Square150x150Logo.png │ │ │ ├── Square284x284Logo.png │ │ │ ├── Square30x30Logo.png │ │ │ ├── Square310x310Logo.png │ │ │ ├── Square44x44Logo.png │ │ │ ├── Square71x71Logo.png │ │ │ ├── Square89x89Logo.png │ │ │ ├── StoreLogo.png │ │ │ ├── icon-pre-alpha.icns │ │ │ ├── icon.icns │ │ │ ├── icon.ico │ │ │ └── icon.png │ │ ├── native │ │ │ └── macos │ │ │ │ ├── .gitignore │ │ │ │ ├── Package.resolved │ │ │ │ ├── Package.swift │ │ │ │ └── Sources │ │ │ │ └── sd-desktop-macos │ │ │ │ ├── webview.swift │ │ │ │ └── window.swift │ │ ├── rustfmt.toml │ │ ├── src │ │ │ ├── macos │ │ │ │ ├── mod.rs │ │ │ │ ├── native.rs │ │ │ │ ├── webview.rs │ │ │ │ └── window.rs │ │ │ ├── main.rs │ │ │ └── menu.rs │ │ ├── tauri.conf.json │ │ └── tauri.linux.conf.json │ ├── src │ │ ├── index.html │ │ ├── index.tsx │ │ └── vite-env.d.ts │ ├── tailwind.config.js │ ├── tsconfig.json │ └── vite.config.ts ├── landing │ ├── .gitignore │ ├── package.json │ ├── postcss.config.js │ ├── public │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── app.png │ │ ├── apple-touch-icon.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── robots.txt │ │ └── site.webmanifest │ ├── server │ │ ├── index.ts │ │ └── tsconfig.json │ ├── src │ │ ├── App.tsx │ │ ├── assets │ │ │ └── images │ │ │ │ ├── investors │ │ │ │ ├── TOM.jpg │ │ │ │ ├── augusto.jpg │ │ │ │ ├── austen.jpg │ │ │ │ ├── davidmytton.jpg │ │ │ │ ├── guillermo.jpg │ │ │ │ ├── haoyuan.jpg │ │ │ │ ├── josephjacks.jpg │ │ │ │ ├── justinhoffman.jpg │ │ │ │ ├── lesterlee.jpg │ │ │ │ ├── naval.jpg │ │ │ │ ├── naveen.jpg │ │ │ │ ├── neha.jpg │ │ │ │ ├── peer.jpg │ │ │ │ ├── rywalker.jpg │ │ │ │ ├── sanjay.jpg │ │ │ │ ├── tobiaslutke.jpg │ │ │ │ ├── vijay.jpg │ │ │ │ └── zacharysmith.jpg │ │ │ │ ├── logo.png │ │ │ │ └── team │ │ │ │ ├── benja.jpg │ │ │ │ ├── brendan.jpg │ │ │ │ ├── haden.jpg │ │ │ │ ├── haris.jpg │ │ │ │ ├── jamie.jpg │ │ │ │ └── oscar.jpg │ │ ├── atom-one.css │ │ ├── components │ │ │ ├── AppEmbed.tsx │ │ │ ├── BlogTag.tsx │ │ │ ├── Bubbles.tsx │ │ │ ├── Footer.tsx │ │ │ ├── HomeCTA.tsx │ │ │ ├── Markdown.tsx │ │ │ ├── NavBar.tsx │ │ │ ├── NewBanner.tsx │ │ │ └── TeamMember.tsx │ │ ├── pages │ │ │ ├── blog │ │ │ │ ├── api.ts │ │ │ │ ├── index.page.server.ts │ │ │ │ ├── index.page.tsx │ │ │ │ ├── post.page.route.ts │ │ │ │ ├── post.page.server.ts │ │ │ │ ├── post.page.tsx │ │ │ │ └── posts.ts │ │ │ ├── careers.page.tsx │ │ │ ├── changelog.page.tsx │ │ │ ├── docs │ │ │ │ └── architecture │ │ │ │ │ └── distributed-data-sync.tsx │ │ │ ├── faq.page.tsx │ │ │ ├── index.page.tsx │ │ │ ├── roadmap.page.tsx │ │ │ └── team.page.tsx │ │ ├── renderer │ │ │ ├── _default.page.client.tsx │ │ │ ├── _default.page.server.tsx │ │ │ ├── _error.page.tsx │ │ │ ├── types.ts │ │ │ └── usePageContext.tsx │ │ ├── style.scss │ │ ├── utils │ │ │ └── index.ts │ │ └── vite-env.d.ts │ ├── tailwind.config.js │ ├── tsconfig.json │ └── vite.config.ts ├── mobile │ └── package.json ├── server │ ├── Cargo.toml │ ├── Dockerfile │ ├── k8s │ │ ├── infrastructure.yaml │ │ └── sdserver.yaml │ ├── package.json │ └── src │ │ └── main.rs └── web │ ├── README.md │ ├── package.json │ ├── postcss.config.js │ ├── public │ ├── manifest.json │ └── robots.txt │ ├── src │ ├── App.tsx │ ├── env.d.ts │ ├── index.html │ └── index.tsx │ ├── tailwind.config.js │ ├── tsconfig.json │ ├── vercel.json │ └── vite.config.ts ├── core ├── .gitignore ├── .rustfmt.toml ├── Cargo.toml ├── bindings │ ├── Client.ts │ ├── ClientCommand.ts │ ├── ClientQuery.ts │ ├── ClientState.ts │ ├── CoreEvent.ts │ ├── CoreResource.ts │ ├── CoreResponse.ts │ ├── DirectoryWithContents.ts │ ├── EncryptionAlgorithm.ts │ ├── File.ts │ ├── FileKind.ts │ ├── FilePath.ts │ ├── JobReport.ts │ ├── JobStatus.ts │ ├── LibraryNode.ts │ ├── LibraryState.ts │ ├── LocationResource.ts │ ├── NodeState.ts │ ├── Platform.ts │ ├── Statistics.ts │ └── Volume.ts ├── derive │ ├── Cargo.toml │ └── src │ │ └── lib.rs ├── index.ts ├── package.json ├── prisma │ ├── Cargo.toml │ ├── migrations │ │ ├── 20220526035100_init │ │ │ └── migration.sql │ │ ├── migration_lock.toml │ │ └── migration_table │ │ │ └── migration.sql │ ├── schema.prisma │ └── src │ │ └── main.rs ├── scripts │ ├── bindingsIndex.ts │ └── tsconfig.json └── src │ ├── encode │ ├── metadata.rs │ ├── mod.rs │ └── thumb.rs │ ├── file │ ├── cas │ │ ├── checksum.rs │ │ ├── identifier.rs │ │ └── mod.rs │ ├── explorer │ │ ├── mod.rs │ │ └── open.rs │ ├── indexer │ │ ├── mod.rs │ │ └── scan.rs │ └── mod.rs │ ├── job │ ├── jobs.rs │ ├── mod.rs │ └── worker.rs │ ├── lib.rs │ ├── library │ ├── loader.rs │ ├── mod.rs │ └── statistics.rs │ ├── node │ ├── mod.rs │ └── state.rs │ ├── sys │ ├── locations.rs │ ├── mod.rs │ └── volumes.rs │ └── util │ ├── db.rs │ └── mod.rs ├── docs ├── architecture │ ├── database.md │ ├── distributed-data-sync.md │ ├── extensions.md │ ├── jobs.md │ ├── rust-typescript-messaging.md │ └── virtual-filesystem.md ├── changelog │ ├── 10-4-22_0.1.0.md │ └── index.md └── product │ ├── assets │ └── roadmap │ │ └── folder.png │ ├── credits.md │ ├── faq.md │ ├── ideas.md │ ├── introduction.md │ ├── marketing.md │ ├── privacy.md │ ├── roadmap.md │ └── security.md ├── extensions ├── apple-photos │ └── README.md └── twitter-history │ ├── Cargo.toml │ └── prisma │ └── schema.prisma ├── package.json ├── packages ├── client │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── src │ │ ├── ClientProvider.tsx │ │ ├── bridge.ts │ │ ├── files │ │ │ ├── index.ts │ │ │ ├── query.ts │ │ │ └── state.ts │ │ ├── index.ts │ │ └── window.d.ts │ └── tsconfig.json ├── config │ ├── base.tsconfig.json │ ├── eslint-preset.js │ ├── interface.tsconfig.json │ └── package.json ├── interface │ ├── package.json │ ├── scripts │ │ └── generateSvgImports.mjs │ ├── src │ │ ├── App.tsx │ │ ├── AppLayout.tsx │ │ ├── AppPropsContext.tsx │ │ ├── AppRouter.tsx │ │ ├── ErrorFallback.tsx │ │ ├── NotFound.tsx │ │ ├── assets │ │ │ ├── icons │ │ │ │ ├── ai.svg │ │ │ │ ├── angular.svg │ │ │ │ ├── audio-mp3.svg │ │ │ │ ├── audio-ogg.svg │ │ │ │ ├── audio-wav.svg │ │ │ │ ├── audio.svg │ │ │ │ ├── babel.svg │ │ │ │ ├── bat.svg │ │ │ │ ├── bicep.svg │ │ │ │ ├── binary.svg │ │ │ │ ├── blade.svg │ │ │ │ ├── browserslist.svg │ │ │ │ ├── bsconfig.svg │ │ │ │ ├── bundler.svg │ │ │ │ ├── c.svg │ │ │ │ ├── cert.svg │ │ │ │ ├── cheader.svg │ │ │ │ ├── cli.svg │ │ │ │ ├── compodoc.svg │ │ │ │ ├── composer.svg │ │ │ │ ├── conf.svg │ │ │ │ ├── cpp.svg │ │ │ │ ├── csharp.svg │ │ │ │ ├── cshtml.svg │ │ │ │ ├── css-map.svg │ │ │ │ ├── css.svg │ │ │ │ ├── csv.svg │ │ │ │ ├── dartlang.svg │ │ │ │ ├── docker-debug.svg │ │ │ │ ├── docker-ignore.svg │ │ │ │ ├── docker.svg │ │ │ │ ├── editorconfig.svg │ │ │ │ ├── eex.svg │ │ │ │ ├── elixir.svg │ │ │ │ ├── elm.svg │ │ │ │ ├── env.svg │ │ │ │ ├── erb.svg │ │ │ │ ├── erlang.svg │ │ │ │ ├── eslint.svg │ │ │ │ ├── exs.svg │ │ │ │ ├── exx.svg │ │ │ │ ├── file.svg │ │ │ │ ├── folder-light.svg │ │ │ │ ├── folder-open.svg │ │ │ │ ├── folder.svg │ │ │ │ ├── font-otf.svg │ │ │ │ ├── font-ttf.svg │ │ │ │ ├── font-woff.svg │ │ │ │ ├── font-woff2.svg │ │ │ │ ├── git.svg │ │ │ │ ├── go-package.svg │ │ │ │ ├── go.svg │ │ │ │ ├── gradle.svg │ │ │ │ ├── graphql.svg │ │ │ │ ├── groovy.svg │ │ │ │ ├── grunt.svg │ │ │ │ ├── gulp.svg │ │ │ │ ├── haml.svg │ │ │ │ ├── handlebars.svg │ │ │ │ ├── haskell.svg │ │ │ │ ├── html.svg │ │ │ │ ├── image-gif.svg │ │ │ │ ├── image-ico.svg │ │ │ │ ├── image-jpg.svg │ │ │ │ ├── image-png.svg │ │ │ │ ├── image-webp.svg │ │ │ │ ├── image.svg │ │ │ │ ├── index.ts │ │ │ │ ├── info.svg │ │ │ │ ├── ipynb.svg │ │ │ │ ├── java.svg │ │ │ │ ├── jenkins.svg │ │ │ │ ├── jest.svg │ │ │ │ ├── jinja.svg │ │ │ │ ├── js-map.svg │ │ │ │ ├── js.svg │ │ │ │ ├── json.svg │ │ │ │ ├── jsp.svg │ │ │ │ ├── julia.svg │ │ │ │ ├── karma.svg │ │ │ │ ├── key.svg │ │ │ │ ├── less.svg │ │ │ │ ├── license.svg │ │ │ │ ├── lighteditorconfig.svg │ │ │ │ ├── liquid.svg │ │ │ │ ├── llvm.svg │ │ │ │ ├── log.svg │ │ │ │ ├── lua.svg │ │ │ │ ├── m.svg │ │ │ │ ├── markdown.svg │ │ │ │ ├── mint.svg │ │ │ │ ├── mov.svg │ │ │ │ ├── mp4.svg │ │ │ │ ├── nestjs-controller.svg │ │ │ │ ├── nestjs-decorator.svg │ │ │ │ ├── nestjs-filter.svg │ │ │ │ ├── nestjs-guard.svg │ │ │ │ ├── nestjs-module.svg │ │ │ │ ├── nestjs-service.svg │ │ │ │ ├── nestjs.svg │ │ │ │ ├── netlify.svg │ │ │ │ ├── nginx.svg │ │ │ │ ├── nim.svg │ │ │ │ ├── njk.svg │ │ │ │ ├── nodemon.svg │ │ │ │ ├── npm-lock.svg │ │ │ │ ├── npm.svg │ │ │ │ ├── nuxt.svg │ │ │ │ ├── nvm.svg │ │ │ │ ├── opengl.svg │ │ │ │ ├── pdf.svg │ │ │ │ ├── photoshop.svg │ │ │ │ ├── php.svg │ │ │ │ ├── postcss-config.svg │ │ │ │ ├── powershell-data.svg │ │ │ │ ├── powershell-module.svg │ │ │ │ ├── powershell.svg │ │ │ │ ├── prettier.svg │ │ │ │ ├── prisma.svg │ │ │ │ ├── prolog.svg │ │ │ │ ├── pug.svg │ │ │ │ ├── python.svg │ │ │ │ ├── qt.svg │ │ │ │ ├── razor.svg │ │ │ │ ├── react-js.svg │ │ │ │ ├── react-ts.svg │ │ │ │ ├── readme.svg │ │ │ │ ├── rescript.svg │ │ │ │ ├── rjson.svg │ │ │ │ ├── robots.svg │ │ │ │ ├── rollup.svg │ │ │ │ ├── ruby.svg │ │ │ │ ├── rust.svg │ │ │ │ ├── sass.svg │ │ │ │ ├── scss.svg │ │ │ │ ├── shell.svg │ │ │ │ ├── smarty.svg │ │ │ │ ├── sol.svg │ │ │ │ ├── sql.svg │ │ │ │ ├── storybook.svg │ │ │ │ ├── stylelint.svg │ │ │ │ ├── stylus.svg │ │ │ │ ├── svelte.svg │ │ │ │ ├── svg.svg │ │ │ │ ├── swift.svg │ │ │ │ ├── symfony.svg │ │ │ │ ├── tailwind.svg │ │ │ │ ├── test-js.svg │ │ │ │ ├── test-ts.svg │ │ │ │ ├── tmpl.svg │ │ │ │ ├── toml.svg │ │ │ │ ├── travis.svg │ │ │ │ ├── tsconfig.svg │ │ │ │ ├── tsx.svg │ │ │ │ ├── twig.svg │ │ │ │ ├── txt.svg │ │ │ │ ├── typescript-def.svg │ │ │ │ ├── typescript.svg │ │ │ │ ├── ui.svg │ │ │ │ ├── user.svg │ │ │ │ ├── vercel.svg │ │ │ │ ├── video.svg │ │ │ │ ├── vite.svg │ │ │ │ ├── vscode.svg │ │ │ │ ├── vue.svg │ │ │ │ ├── wasm.svg │ │ │ │ ├── webpack.svg │ │ │ │ ├── windi.svg │ │ │ │ ├── xml.svg │ │ │ │ ├── yaml.svg │ │ │ │ ├── yarn-error.svg │ │ │ │ ├── yarn.svg │ │ │ │ └── zip.svg │ │ │ ├── images │ │ │ │ ├── spacedrive_logo.png │ │ │ │ ├── spacedrive_screenshot.png │ │ │ │ └── spacedrive_screenshot_2.jpg │ │ │ ├── spline │ │ │ │ ├── scene.json │ │ │ │ └── windows.json │ │ │ └── svg │ │ │ │ ├── alert.svg │ │ │ │ ├── arrow-right.svg │ │ │ │ ├── drive.svg │ │ │ │ ├── folder-white.svg │ │ │ │ ├── folder.svg │ │ │ │ ├── info.svg │ │ │ │ ├── macos_close.svg │ │ │ │ ├── macos_fullscreen.svg │ │ │ │ ├── macos_minimize.svg │ │ │ │ └── spinner.svg │ │ ├── components │ │ │ ├── device │ │ │ │ ├── Device.tsx │ │ │ │ └── Stores.tsx │ │ │ ├── dialog │ │ │ │ └── DemoDialog.tsx │ │ │ ├── file │ │ │ │ ├── FileItem.tsx │ │ │ │ ├── FileList.tsx │ │ │ │ ├── FileThumb.tsx │ │ │ │ ├── Icon.tsx │ │ │ │ ├── Inspector.tsx │ │ │ │ └── Sidebar.tsx │ │ │ ├── icons │ │ │ │ └── Folder.tsx │ │ │ ├── items │ │ │ │ └── DriveListItem.tsx │ │ │ ├── jobs │ │ │ │ └── RunningJobsWidget.tsx │ │ │ ├── layout │ │ │ │ ├── Dialog.tsx │ │ │ │ ├── MenuOverlay.tsx │ │ │ │ ├── Modal.tsx │ │ │ │ └── TopBar.tsx │ │ │ ├── os │ │ │ │ └── TrafficLights.tsx │ │ │ ├── primitive │ │ │ │ ├── Checkbox.tsx │ │ │ │ ├── Codeblock.tsx │ │ │ │ ├── InputContainer.tsx │ │ │ │ ├── Listbox.tsx │ │ │ │ ├── ProgressBar.tsx │ │ │ │ ├── Shortcut.tsx │ │ │ │ ├── Slider.tsx │ │ │ │ ├── Tag.tsx │ │ │ │ ├── Toggle.tsx │ │ │ │ ├── Variants.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── settings │ │ │ │ ├── SettingsContainer.tsx │ │ │ │ └── SettingsHeader.tsx │ │ │ └── transitions │ │ │ │ └── SlideUp.tsx │ │ ├── constants │ │ │ ├── demo-data.json │ │ │ └── file-types.json │ │ ├── hooks │ │ │ ├── useCoreEvents.tsx │ │ │ ├── useExplorerState.ts │ │ │ ├── useFocusState.tsx │ │ │ └── useInputState.tsx │ │ ├── index.ts │ │ ├── screens │ │ │ ├── Content.tsx │ │ │ ├── Debug.tsx │ │ │ ├── Explorer.tsx │ │ │ ├── Overview.tsx │ │ │ ├── Photos.tsx │ │ │ ├── Redirect.tsx │ │ │ ├── Settings.tsx │ │ │ ├── Tag.tsx │ │ │ └── settings │ │ │ │ ├── AppearanceSettings.tsx │ │ │ │ ├── ContactsSettings.tsx │ │ │ │ ├── ExperimentalSettings.tsx │ │ │ │ ├── GeneralSettings.tsx │ │ │ │ ├── KeysSetting.tsx │ │ │ │ ├── LibrarySettings.tsx │ │ │ │ ├── LocationSettings.tsx │ │ │ │ ├── SecuritySettings.tsx │ │ │ │ ├── SharingSettings.tsx │ │ │ │ ├── SyncSettings.tsx │ │ │ │ └── TagsSettings.tsx │ │ └── style.scss │ └── tsconfig.json ├── macos │ ├── .gitignore │ ├── .swiftpm │ │ └── xcode │ │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── swift-lib.xcscheme │ ├── Package.resolved │ ├── Package.swift │ ├── README.md │ ├── TestPlan.xctestplan │ └── src │ │ └── lib.swift └── ui │ ├── .storybook │ ├── main.js │ └── preview.js │ ├── package.json │ ├── postcss.config.js │ ├── src │ ├── Button.stories.tsx │ ├── Button.tsx │ ├── ContextMenu.stories.tsx │ ├── ContextMenu.tsx │ ├── Dropdown.stories.tsx │ ├── Dropdown.tsx │ ├── Input.tsx │ └── index.ts │ ├── style │ ├── index.js │ ├── postcss.config.js │ ├── style.scss │ ├── tailwind.js │ └── tailwind.pcss │ ├── tailwind.config.js │ └── tsconfig.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml └── tsconfig.json /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [alias] 2 | prisma = "run -p prisma-cli --" 3 | 4 | [target.x86_64-apple-darwin] 5 | rustflags = [ 6 | "-C", "link-arg=-undefined", 7 | "-C", "link-arg=dynamic_lookup", 8 | ] 9 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | open_collective: spacedrive 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | # tell yaml plugin that this is the config file and not a template of its own: 2 | # yaml-language-server: $schema=https://json.schemastore.org/github-issue-config.json 3 | blank_issues_enabled: false 4 | contact_links: 5 | - name: 📝 Report Typo 6 | url: https://github.com/spacedriveapp/spacedrive/discussions/142 7 | about: If you find a typo, let us know in the typos discussion thread. 8 | - name: 🙏 Get Help 9 | url: https://github.com/spacedriveapp/spacedrive/discussions/new?category=help 10 | about: If you can't get something to work the way you expect, open a question in our discussion forums. 11 | - name: 💡 Feature Request 12 | url: https://github.com/spacedriveapp/spacedrive/discussions/new?category=ideas 13 | about: Suggest any ideas you have using our discussion forums. 14 | - name: 💬 Discord Chat 15 | url: https://discord.gg/gTaF2Z44f5 16 | about: Ask questions and talk to other Spacedrive users and the maintainers 17 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | Closes #(issue) 10 | -------------------------------------------------------------------------------- /.github/scripts/setup-system.ps1: -------------------------------------------------------------------------------- 1 | Write-Host "This script is currently being used by CI and will need some more work before anyone can use it like the 'setup-system.sh' script for macOS and Linux!" 2 | 3 | $VCINSTALLDIR = $(& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath) 4 | Add-Content $env:GITHUB_ENV "LIBCLANG_PATH=${VCINSTALLDIR}\VC\Tools\LLVM\x64\bin`n" 5 | Invoke-WebRequest "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full-shared.7z" -OutFile ffmpeg-release-full-shared.7z 6 | 7z x ffmpeg-release-full-shared.7z 7 | mkdir ffmpeg 8 | mv ffmpeg-*/* ffmpeg/ 9 | Add-Content $env:GITHUB_ENV "FFMPEG_DIR=${pwd}\ffmpeg`n" 10 | Add-Content $env:GITHUB_PATH "${pwd}\ffmpeg\bin`n" -------------------------------------------------------------------------------- /.github/workflows/diagram.yml.disabled: -------------------------------------------------------------------------------- 1 | name: Create diagram 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | get_data: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout code 14 | uses: actions/checkout@v3 15 | 16 | - name: Update diagram 17 | uses: githubocto/repo-visualizer@main 18 | with: 19 | excluded_paths: '.github' 20 | -------------------------------------------------------------------------------- /.github/workflows/org-readme.yml: -------------------------------------------------------------------------------- 1 | name: Update Org README 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - README.md 9 | workflow_dispatch: 10 | 11 | jobs: 12 | update-readme: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v3 17 | 18 | - name: Update README 19 | uses: dmnemec/copy_file_to_another_repo_action@main 20 | env: 21 | API_TOKEN_GITHUB: ${{ secrets.REPOS_PAT }} 22 | with: 23 | source_file: 'README.md' 24 | destination_repo: 'spacedriveapp/.github' 25 | destination_folder: 'profile' 26 | user_email: 'actions@spacedrive.com' 27 | user_name: 'GH Actions' 28 | commit_message: 'Update README' 29 | -------------------------------------------------------------------------------- /.prettierrc.cli.js: -------------------------------------------------------------------------------- 1 | var mainConfig = require('./.prettierrc.json'); 2 | 3 | module.exports = { 4 | ...mainConfig, 5 | plugins: ['@trivago/prettier-plugin-sort-imports'] 6 | }; 7 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "pluginSearchDirs": ["."], 3 | "useTabs": true, 4 | "printWidth": 100, 5 | "singleQuote": true, 6 | "trailingComma": "none", 7 | "bracketSameLine": false, 8 | "semi": true, 9 | "quoteProps": "consistent", 10 | "importOrder": [ 11 | "^@sd/core/(.*)$", 12 | "^@sd/interface/(.*)$", 13 | "^@sd/client/(.*)$", 14 | "^@sd/ui/(.*)$", 15 | "^[./]" 16 | ], 17 | "importOrderSeparation": true, 18 | "importOrderSortSpecifiers": true 19 | } 20 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | hard_tabs = true 2 | match_block_trailing_comma = true 3 | max_width = 90 4 | newline_style = "Unix" 5 | use_field_init_shorthand = true 6 | use_try_shorthand = true -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "actix", 4 | "bpfrpt", 5 | "consts", 6 | "countup", 7 | "creationdate", 8 | "fontsource", 9 | "ipfs", 10 | "Keepsafe", 11 | "pathctx", 12 | "prismjs", 13 | "proptype", 14 | "quicktime", 15 | "repr", 16 | "Roadmap", 17 | "subpackage", 18 | "svgr", 19 | "tailwindcss", 20 | "titlebar", 21 | "trivago", 22 | "tsparticles", 23 | "unlisten", 24 | "upsert" 25 | ], 26 | "[rust]": { 27 | "editor.defaultFormatter": "rust-lang.rust-analyzer" 28 | }, 29 | "rust-analyzer.procMacro.enable": true, 30 | "rust-analyzer.diagnostics.experimental.enable": false 31 | } 32 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "apps/desktop/src-tauri", 4 | "core", 5 | "core/prisma", 6 | "core/derive", 7 | "apps/server" 8 | ] 9 | -------------------------------------------------------------------------------- /apps/desktop/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/app-icon.png -------------------------------------------------------------------------------- /apps/desktop/dist/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/dist/.placeholder -------------------------------------------------------------------------------- /apps/desktop/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require('@sd/ui/postcss'); 2 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | WixTools 5 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | #[cfg(target_os = "macos")] 3 | { 4 | use swift_rs::build::{link_swift, link_swift_package}; 5 | 6 | link_swift("10.15"); // macOS Catalina. Earliest version that is officially supported by Apple. 7 | link_swift_package("sd-desktop-macos", "./native/macos/"); 8 | } 9 | 10 | tauri_build::build(); 11 | } 12 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/icon-pre-alpha.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/icon-pre-alpha.icns -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /apps/desktop/src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/desktop/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /apps/desktop/src-tauri/native/macos/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/native/macos/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "SwiftRs", 6 | "repositoryURL": "https://github.com/brendonovich/swift-rs.git", 7 | "state": { 8 | "branch": "autorelease", 9 | "revision": "b16ba936ca2330bb27c6b9b7a84ad0d583ef0caa", 10 | "version": null 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/native/macos/Sources/sd-desktop-macos/webview.swift: -------------------------------------------------------------------------------- 1 | import WebKit 2 | 3 | @_cdecl("reload_webview") 4 | public func reloadWebview(webview: WKWebView) -> () { 5 | webview.window!.orderOut(webview); 6 | webview.reload(); 7 | webview.window!.makeKey(); 8 | } 9 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 100 2 | hard_tabs = true 3 | newline_style = "Auto" 4 | use_small_heuristics = "Default" 5 | reorder_imports = true 6 | reorder_modules = true 7 | remove_nested_parens = true 8 | edition = "2018" 9 | merge_derives = true 10 | use_try_shorthand = false 11 | use_field_init_shorthand = false 12 | force_explicit_abi = true 13 | imports_granularity = "Crate" 14 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/src/macos/mod.rs: -------------------------------------------------------------------------------- 1 | mod native; 2 | 3 | mod window; 4 | pub use window::*; 5 | 6 | mod webview; 7 | pub use webview::*; 8 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/src/macos/native.rs: -------------------------------------------------------------------------------- 1 | use std::ffi::c_void; 2 | 3 | pub type NSObject = *mut c_void; 4 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/src/macos/webview.rs: -------------------------------------------------------------------------------- 1 | use super::native::NSObject; 2 | use swift_rs::*; 3 | 4 | pub_swift_fn!(reload_webview(webview: NSObject)); 5 | -------------------------------------------------------------------------------- /apps/desktop/src-tauri/src/macos/window.rs: -------------------------------------------------------------------------------- 1 | use super::native::NSObject; 2 | use swift_rs::*; 3 | 4 | pub_swift_fn!(lock_app_theme(theme_type: Int)); 5 | pub_swift_fn!(blur_window_background(window: NSObject)); 6 | pub_swift_fn!(set_invisible_toolbar(window: NSObject, shown: Bool)); 7 | pub_swift_fn!(set_titlebar_style( 8 | window: NSObject, 9 | transparent: Bool, 10 | large: Bool 11 | )); 12 | 13 | #[allow(dead_code)] 14 | pub enum AppThemeType { 15 | Light = 0 as Int, 16 | Dark = 1 as Int, 17 | } 18 | -------------------------------------------------------------------------------- /apps/desktop/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Spacedrive 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/desktop/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare interface ImportMetaEnv { 4 | VITE_OS: string; 5 | } 6 | 7 | declare module '@babel/core' {} 8 | -------------------------------------------------------------------------------- /apps/desktop/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require('@sd/ui/tailwind')('desktop'); 2 | -------------------------------------------------------------------------------- /apps/desktop/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../packages/config/interface.tsconfig.json", 3 | "compilerOptions": {}, 4 | "include": ["src"] 5 | } 6 | -------------------------------------------------------------------------------- /apps/desktop/vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react'; 2 | import { defineConfig } from 'vite'; 3 | import svgr from 'vite-plugin-svgr'; 4 | 5 | import { name, version } from './package.json'; 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | server: { 10 | port: 8001 11 | }, 12 | plugins: [ 13 | react({ 14 | jsxRuntime: 'classic' 15 | }), 16 | svgr({ 17 | svgrOptions: { 18 | icon: true 19 | } 20 | }) 21 | ], 22 | root: 'src', 23 | publicDir: '../../packages/interface/src/assets', 24 | define: { 25 | pkgJson: { name, version } 26 | }, 27 | build: { 28 | outDir: '../dist', 29 | assetsDir: '.' 30 | } 31 | }); 32 | -------------------------------------------------------------------------------- /apps/landing/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | -------------------------------------------------------------------------------- /apps/landing/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require('@sd/ui/postcss'); 2 | -------------------------------------------------------------------------------- /apps/landing/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /apps/landing/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /apps/landing/public/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/public/app.png -------------------------------------------------------------------------------- /apps/landing/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/public/apple-touch-icon.png -------------------------------------------------------------------------------- /apps/landing/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/public/favicon-16x16.png -------------------------------------------------------------------------------- /apps/landing/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/public/favicon-32x32.png -------------------------------------------------------------------------------- /apps/landing/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/public/favicon.ico -------------------------------------------------------------------------------- /apps/landing/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | -------------------------------------------------------------------------------- /apps/landing/public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Spacedrive", 3 | "short_name": "", 4 | "icons": [ 5 | { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, 6 | { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } 7 | ], 8 | "theme_color": "#ffffff", 9 | "background_color": "#ffffff", 10 | "display": "standalone" 11 | } 12 | -------------------------------------------------------------------------------- /apps/landing/server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ESNext"], 4 | "declaration": false, 5 | "noEmit": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "inlineSources": false, 9 | "isolatedModules": false, 10 | "module": "CommonJS", 11 | "target": "ES5", 12 | "moduleResolution": "node", 13 | "noUnusedLocals": false, 14 | "noUnusedParameters": false, 15 | "preserveWatchOutput": true, 16 | "skipLibCheck": false, 17 | "strict": true, 18 | "allowSyntheticDefaultImports": true, 19 | "resolveJsonModule": true 20 | }, 21 | "exclude": ["node_modules"] 22 | } 23 | -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/TOM.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/TOM.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/augusto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/augusto.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/austen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/austen.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/davidmytton.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/davidmytton.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/guillermo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/guillermo.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/haoyuan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/haoyuan.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/josephjacks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/josephjacks.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/justinhoffman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/justinhoffman.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/lesterlee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/lesterlee.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/naval.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/naval.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/naveen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/naveen.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/neha.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/neha.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/peer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/peer.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/rywalker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/rywalker.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/sanjay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/sanjay.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/tobiaslutke.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/tobiaslutke.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/vijay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/vijay.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/investors/zacharysmith.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/investors/zacharysmith.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/logo.png -------------------------------------------------------------------------------- /apps/landing/src/assets/images/team/benja.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/team/benja.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/team/brendan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/team/brendan.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/team/haden.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/team/haden.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/team/haris.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/team/haris.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/team/jamie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/team/jamie.jpg -------------------------------------------------------------------------------- /apps/landing/src/assets/images/team/oscar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/apps/landing/src/assets/images/team/oscar.jpg -------------------------------------------------------------------------------- /apps/landing/src/components/BlogTag.tsx: -------------------------------------------------------------------------------- 1 | import { Tag } from '@tryghost/content-api'; 2 | import clsx from 'clsx'; 3 | import React from 'react'; 4 | 5 | export interface BlogTagProps { 6 | tag: Tag; 7 | } 8 | 9 | export const BlogTag = (props: BlogTagProps) => { 10 | return ( 11 | 0xffffff / 2 ? '#000' : '#fff' 16 | }} 17 | > 18 | {props.tag.name} 19 | 20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /apps/landing/src/components/Markdown.tsx: -------------------------------------------------------------------------------- 1 | import Prism from 'prismjs'; 2 | import 'prismjs/components/prism-rust'; 3 | import React, { useEffect } from 'react'; 4 | 5 | import '../atom-one.css'; 6 | 7 | interface MarkdownPageProps { 8 | children: React.ReactNode; 9 | } 10 | 11 | function MarkdownPage(props: MarkdownPageProps) { 12 | useEffect(() => { 13 | Prism.highlightAll(); 14 | }, []); 15 | return ( 16 |
17 |
18 | {props.children} 19 |
20 |
21 | ); 22 | } 23 | 24 | export default MarkdownPage; 25 | -------------------------------------------------------------------------------- /apps/landing/src/components/NewBanner.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export interface NewBannerProps { 4 | headline: string; 5 | href: string; 6 | link: string; 7 | } 8 | 9 | const NewBanner: React.FC = (props) => { 10 | const { headline, href, link } = props; 11 | 12 | return ( 13 | 26 | ); 27 | }; 28 | 29 | export default NewBanner; 30 | -------------------------------------------------------------------------------- /apps/landing/src/pages/blog/api.ts: -------------------------------------------------------------------------------- 1 | import GhostContentAPI from '@tryghost/content-api'; 2 | 3 | // Ghost key is a public key 4 | const ghostKey = import.meta.env.VITE_CONTENT_API_KEY; 5 | const ghostURL = import.meta.env.VITE_API_URL; 6 | 7 | export const blogEnabled = !!(ghostURL && ghostKey); 8 | 9 | export const api = blogEnabled 10 | ? new GhostContentAPI({ 11 | url: ghostURL, 12 | key: ghostKey, 13 | version: 'v4' 14 | }) 15 | : null; 16 | 17 | export async function getPosts() { 18 | if (!api) { 19 | return []; 20 | } 21 | const posts = await api.posts 22 | .browse({ 23 | include: ['tags', 'authors'] 24 | }) 25 | .catch(() => []); 26 | return posts; 27 | } 28 | 29 | export async function getPost(slug: string) { 30 | if (!api) { 31 | return null; 32 | } 33 | return await api.posts 34 | .read( 35 | { slug }, 36 | { 37 | include: ['tags', 'authors'] 38 | } 39 | ) 40 | .catch(() => null); 41 | } 42 | -------------------------------------------------------------------------------- /apps/landing/src/pages/blog/index.page.server.ts: -------------------------------------------------------------------------------- 1 | import { getPosts } from './api'; 2 | 3 | export async function onBeforeRender() { 4 | const posts = await getPosts(); 5 | 6 | return { 7 | pageContext: { 8 | pageProps: { 9 | posts 10 | } 11 | } 12 | }; 13 | } 14 | 15 | export async function prerender() { 16 | const posts = await getPosts(); 17 | 18 | const postPages = posts.map((post) => ({ 19 | url: `/blog/${post.slug}`, 20 | pageContext: { pageProps: { post } } 21 | })); 22 | 23 | const postListPage = { 24 | url: '/blog', 25 | pageContext: { pageProps: { posts } } 26 | }; 27 | 28 | return [postListPage, ...postPages]; 29 | } 30 | -------------------------------------------------------------------------------- /apps/landing/src/pages/blog/post.page.route.ts: -------------------------------------------------------------------------------- 1 | export default '/blog/:slug'; 2 | -------------------------------------------------------------------------------- /apps/landing/src/pages/blog/post.page.server.ts: -------------------------------------------------------------------------------- 1 | import { PageContextBuiltIn } from 'vite-plugin-ssr'; 2 | 3 | import { getPost } from './api'; 4 | 5 | export async function onBeforeRender(pageContext: PageContextBuiltIn) { 6 | const post = await getPost(pageContext.routeParams['slug']); 7 | 8 | return { 9 | pageContext: { 10 | pageProps: { 11 | post 12 | } 13 | } 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /apps/landing/src/pages/blog/posts.ts: -------------------------------------------------------------------------------- 1 | import GhostContentAPI from '@tryghost/content-api'; 2 | 3 | // Ghost key is a public key 4 | const ghostKey = import.meta.env.VITE_CONTENT_API_KEY; 5 | const ghostURL = import.meta.env.VITE_API_URL; 6 | 7 | export const blogEnabled = ghostURL && ghostKey; 8 | 9 | export const api = blogEnabled 10 | ? new GhostContentAPI({ 11 | url: ghostURL, 12 | key: ghostKey, 13 | version: 'v4' 14 | }) 15 | : null; 16 | 17 | export async function getPosts() { 18 | if (!api) { 19 | return []; 20 | } 21 | const posts = await api.posts 22 | .browse({ 23 | include: ['tags', 'authors'] 24 | }) 25 | .catch(() => []); 26 | return posts; 27 | } 28 | 29 | export async function getPost(slug: string) { 30 | if (!api) { 31 | return null; 32 | } 33 | return await api.posts 34 | .read( 35 | { slug }, 36 | { 37 | include: ['tags', 'authors'] 38 | } 39 | ) 40 | .catch(() => null); 41 | } 42 | -------------------------------------------------------------------------------- /apps/landing/src/pages/changelog.page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Helmet } from 'react-helmet'; 3 | import { ReactComponent as Content } from '~/docs/changelog/index.md'; 4 | 5 | import Markdown from '../components/Markdown'; 6 | 7 | function Page() { 8 | return ( 9 | 10 | 11 | Changelog - Spacedrive 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | 19 | export default Page; 20 | -------------------------------------------------------------------------------- /apps/landing/src/pages/docs/architecture/distributed-data-sync.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Helmet } from 'react-helmet'; 3 | import { ReactComponent as Content } from '~/docs/architecture/distributed-data-sync.md'; 4 | 5 | import Markdown from '../../../components/Markdown'; 6 | 7 | function Page() { 8 | return ( 9 | 10 | 11 | Distributed Data Sync - Spacedrive Documentation 12 | 16 | 17 | 18 | 19 | ); 20 | } 21 | 22 | export default Page; 23 | -------------------------------------------------------------------------------- /apps/landing/src/pages/faq.page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Helmet } from 'react-helmet'; 3 | import { ReactComponent as Content } from '~/docs/product/faq.md'; 4 | 5 | import Markdown from '../components/Markdown'; 6 | 7 | function Page() { 8 | return ( 9 | 10 | 11 | FAQ - Spacedrive 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | 19 | export default Page; 20 | -------------------------------------------------------------------------------- /apps/landing/src/pages/roadmap.page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Helmet } from 'react-helmet'; 3 | import { ReactComponent as Content } from '~/docs/product/roadmap.md'; 4 | 5 | import { Folder } from '../../../../packages/interface/src/components/icons/Folder'; 6 | import Markdown from '../components/Markdown'; 7 | 8 | function Page() { 9 | return ( 10 | 11 | 12 | Roadmap - Spacedrive 13 | 14 | 15 |
16 | 17 |
18 | 19 |
20 | ); 21 | } 22 | 23 | export default Page; 24 | -------------------------------------------------------------------------------- /apps/landing/src/renderer/types.ts: -------------------------------------------------------------------------------- 1 | export type PageProps = {} 2 | // The `pageContext` that are available in both on the server-side and browser-side 3 | export type PageContext = { 4 | Page: (pageProps: PageProps) => React.ReactElement 5 | pageProps: PageProps 6 | urlPathname: string 7 | documentProps?: { 8 | title?: string 9 | description?: string 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/landing/src/renderer/usePageContext.tsx: -------------------------------------------------------------------------------- 1 | // `usePageContext` allows us to access `pageContext` in any React component. 2 | // More infos: https://vite-plugin-ssr.com/pageContext-anywhere 3 | import React, { useContext } from 'react'; 4 | import { PageContextBuiltIn } from 'vite-plugin-ssr'; 5 | 6 | import type { PageContext } from './types'; 7 | 8 | export { PageContextProvider }; 9 | export { usePageContext }; 10 | 11 | const Context = React.createContext(undefined as any); 12 | 13 | function PageContextProvider({ 14 | pageContext, 15 | children 16 | }: { 17 | pageContext: PageContextBuiltIn; 18 | children: React.ReactNode; 19 | }) { 20 | return {children}; 21 | } 22 | 23 | function usePageContext() { 24 | const pageContext = useContext(Context); 25 | return pageContext; 26 | } 27 | -------------------------------------------------------------------------------- /apps/landing/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Accessor for the browser's `window` object, so that `window` is 3 | * not access during SSG. 4 | */ 5 | export function getWindow(): (Window & typeof globalThis) | null { 6 | return typeof window !== 'undefined' ? window : null; 7 | } 8 | 9 | const FILE_NAME_REGEX = /^.*[\\\/]/; 10 | 11 | 12 | /** 13 | * Extracts the file name including its extension from a file path 14 | */ 15 | export function filename(path: string) { 16 | return path.replace(FILE_NAME_REGEX, ''); 17 | } 18 | 19 | /** 20 | * Takes the result of `import.meta.globEager` and returns an object 21 | * with the keys being the file names and the values being the imported file. 22 | * 23 | * Does not work with directories. 24 | */ 25 | export function resolveFilesGlob(files: Record): Record { 26 | return Object.entries(files).reduce( 27 | (acc, [name, val]) => ({ ...acc, [filename(name)]: val.default }), 28 | {} 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /apps/landing/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | readonly VITE_SDWEB_BASE_URL: string; 5 | } 6 | 7 | interface ImportMeta { 8 | readonly env: ImportMetaEnv; 9 | } 10 | 11 | declare module '*.md' { 12 | // "unknown" would be more detailed depends on how you structure frontmatter 13 | const attributes: Record; 14 | 15 | // When "Mode.TOC" is requested 16 | const toc: { level: string; content: string }[]; 17 | 18 | // When "Mode.HTML" is requested 19 | const html: string; 20 | 21 | // When "Mode.React" is requested. VFC could take a generic like React.VFC<{ MyComponent: TypeOfMyComponent }> 22 | import React from 'react'; 23 | const ReactComponent: React.VFC; 24 | } 25 | -------------------------------------------------------------------------------- /apps/landing/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require('@sd/ui/tailwind')('landing'); 2 | -------------------------------------------------------------------------------- /apps/landing/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../packages/config/interface.tsconfig.json", 3 | "compilerOptions": { 4 | "paths": { 5 | "~/docs/*": ["../../docs/*"] 6 | } 7 | }, 8 | "include": ["src"] 9 | } 10 | -------------------------------------------------------------------------------- /apps/landing/vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react'; 2 | import { defineConfig } from 'vite'; 3 | import md, { Mode } from 'vite-plugin-markdown'; 4 | import ssr from 'vite-plugin-ssr/plugin'; 5 | import svg from 'vite-plugin-svgr'; 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | // @ts-ignore 10 | plugins: [react(), ssr(), svg(), md({ mode: [Mode.REACT] })], 11 | resolve: { 12 | alias: { 13 | '~/docs': __dirname + '../../../docs' 14 | } 15 | }, 16 | server: { 17 | port: 8003 18 | }, 19 | publicDir: 'public' 20 | }); 21 | -------------------------------------------------------------------------------- /apps/mobile/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mobile", 3 | "version": "0.0.0", 4 | "main": "index.js", 5 | "license": "GPL-3.0-only" 6 | } 7 | -------------------------------------------------------------------------------- /apps/server/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "server" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | actix = "0.13.0" 8 | actix-web = "4.0.1" 9 | actix-web-actors = "4.1.0" 10 | sdcore = { path = "../../core", features = [] } 11 | serde = "1.0.136" 12 | serde_json = "1.0.79" 13 | tokio = { version = "1.17.0", features = ["sync", "rt"] } -------------------------------------------------------------------------------- /apps/server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:stable-slim 2 | 3 | # Arguments and labels 4 | ARG USER=spaceboy 5 | LABEL org.opencontainers.image.title="Spacedrive Server" 6 | LABEL org.opencontainers.image.source="https://github.com/spacedriveapp/spacedrive" 7 | 8 | # Install dependencies 9 | RUN apt-get update && apt-get install -y libavdevice-dev libavfilter-dev libavformat-dev libavcodec-dev libavutil-dev 10 | 11 | # Copy the compiled server CLI into the container 12 | COPY ./server /sdserver 13 | 14 | # Expose webserver 15 | EXPOSE 8080 16 | 17 | # Create the data directory to store the database 18 | RUN mkdir /data 19 | ENV DATA_DIR /data 20 | 21 | # Drop privledges to non-root user 22 | RUN groupadd -g 1001 $USER && \ 23 | adduser --system --no-create-home --shell /usr/sbin/nologin --uid 1001 --gid 1001 $USER && \ 24 | chown -R $USER /data && \ 25 | chmod -R 770 /data 26 | USER $USER 27 | 28 | # Run the CLI when the container is started 29 | ENTRYPOINT [ "/sdserver" ] -------------------------------------------------------------------------------- /apps/server/k8s/infrastructure.yaml: -------------------------------------------------------------------------------- 1 | # Infrastructure setups up the Kubernetes cluster for Spacedrive! 2 | # 3 | # To get the service account token use the following: 4 | # ```bash 5 | # TOKENNAME=`kubectl -n spacedrive get sa/spacedrive-ci -o jsonpath='{.secrets[0].name}'` 6 | # kubectl -n spacedrive get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 -d 7 | # ``` 8 | 9 | apiVersion: v1 10 | kind: Namespace 11 | metadata: 12 | name: spacedrive 13 | --- 14 | apiVersion: v1 15 | kind: ServiceAccount 16 | metadata: 17 | name: spacedrive-ci 18 | namespace: spacedrive 19 | --- 20 | apiVersion: rbac.authorization.k8s.io/v1 21 | kind: Role 22 | metadata: 23 | name: spacedrive-ns-full 24 | namespace: spacedrive 25 | rules: 26 | - apiGroups: ['apps'] 27 | resources: ['deployments'] 28 | verbs: ['get', 'patch'] 29 | --- 30 | apiVersion: rbac.authorization.k8s.io/v1 31 | kind: RoleBinding 32 | metadata: 33 | name: spacedrive-ci-rb 34 | namespace: spacedrive 35 | subjects: 36 | - kind: ServiceAccount 37 | name: spacedrive-ci 38 | namespace: spacedrive 39 | roleRef: 40 | apiGroup: rbac.authorization.k8s.io 41 | kind: Role 42 | name: spacedrive-ns-full 43 | -------------------------------------------------------------------------------- /apps/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sd/server", 3 | "version": "0.0.0", 4 | "main": "index.js", 5 | "license": "GPL-3.0-only" 6 | } 7 | -------------------------------------------------------------------------------- /apps/web/README.md: -------------------------------------------------------------------------------- 1 | # Spacedrive Webapp 2 | -------------------------------------------------------------------------------- /apps/web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sd/web", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@fontsource/inter": "^4.5.10", 12 | "@sd/client": "workspace:*", 13 | "@sd/core": "workspace:*", 14 | "@sd/interface": "workspace:*", 15 | "@sd/ui": "workspace:*", 16 | "react": "^18.1.0", 17 | "react-dom": "^18.1.0" 18 | }, 19 | "devDependencies": { 20 | "@types/react": "^18.0.9", 21 | "@types/react-dom": "^18.0.5", 22 | "@vitejs/plugin-react": "^1.3.2", 23 | "autoprefixer": "^10.4.7", 24 | "postcss": "^8.4.14", 25 | "tailwind": "^4.0.0", 26 | "typescript": "^4.7.2", 27 | "vite": "^2.9.9", 28 | "vite-plugin-svgr": "^2.1.0", 29 | "vite-plugin-tsconfig-paths": "^1.0.5" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /apps/web/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require('@sd/ui/postcss'); 2 | -------------------------------------------------------------------------------- /apps/web/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Spacedrive", 3 | "name": "Spacedrive", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /apps/web/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /apps/web/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | readonly VITE_SDSERVER_BASE_URL: string; 5 | } 6 | 7 | interface ImportMeta { 8 | readonly env: ImportMetaEnv; 9 | } 10 | -------------------------------------------------------------------------------- /apps/web/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Spacedrive 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /apps/web/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | 4 | import '@sd/ui/style'; 5 | 6 | import App from './App'; 7 | 8 | const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); 9 | root.render( 10 | 11 | 12 | 13 | ); 14 | -------------------------------------------------------------------------------- /apps/web/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require('@sd/ui/tailwind')('web'); 2 | -------------------------------------------------------------------------------- /apps/web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../packages/config/interface.tsconfig.json", 3 | "compilerOptions": {}, 4 | "include": ["src"] 5 | } 6 | -------------------------------------------------------------------------------- /apps/web/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "rewrites": [{ "source": "/(.*)", "destination": "/" }] 3 | } 4 | -------------------------------------------------------------------------------- /apps/web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react'; 2 | import { defineConfig } from 'vite'; 3 | import svg from 'vite-plugin-svgr'; 4 | import tsconfigPaths from 'vite-plugin-tsconfig-paths'; 5 | 6 | import { name, version } from './package.json'; 7 | 8 | // https://vitejs.dev/config/ 9 | export default defineConfig({ 10 | server: { 11 | port: 8002 12 | }, 13 | plugins: [ 14 | // @ts-ignore 15 | react({ 16 | jsxRuntime: 'classic' 17 | }), 18 | svg({ svgrOptions: { icon: true } }), 19 | tsconfigPaths() 20 | ], 21 | root: 'src', 22 | publicDir: '../../packages/interface/src/assets', 23 | define: { 24 | pkgJson: { name, version } 25 | }, 26 | build: { 27 | outDir: '../dist', 28 | assetsDir: '.' 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /core/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /types 3 | *.db* 4 | /src/prisma.rs -------------------------------------------------------------------------------- /core/.rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 100 2 | hard_tabs = true 3 | newline_style = "Unix" 4 | use_small_heuristics = "Default" 5 | reorder_imports = true 6 | reorder_modules = true 7 | remove_nested_parens = true 8 | edition = "2021" 9 | merge_derives = true 10 | use_try_shorthand = false 11 | use_field_init_shorthand = false 12 | force_explicit_abi = true 13 | # normalize_comments = true 14 | normalize_doc_attributes = true -------------------------------------------------------------------------------- /core/bindings/Client.ts: -------------------------------------------------------------------------------- 1 | import type { Platform } from './Platform'; 2 | 3 | export interface Client { 4 | uuid: string; 5 | name: string; 6 | platform: Platform; 7 | tcp_address: string; 8 | last_seen: string; 9 | last_synchronized: string; 10 | } 11 | -------------------------------------------------------------------------------- /core/bindings/ClientCommand.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export type ClientCommand = { key: "FileReadMetaData", params: { id: number, } } | { key: "FileDelete", params: { id: number, } } | { key: "LibDelete", params: { id: number, } } | { key: "TagCreate", params: { name: string, color: string, } } | { key: "TagUpdate", params: { name: string, color: string, } } | { key: "TagAssign", params: { file_id: number, tag_id: number, } } | { key: "TagDelete", params: { id: number, } } | { key: "LocCreate", params: { path: string, } } | { key: "LocUpdate", params: { id: number, name: string | null, } } | { key: "LocDelete", params: { id: number, } } | { key: "SysVolumeUnmount", params: { id: number, } } | { key: "GenerateThumbsForLocation", params: { id: number, path: string, } } | { key: "IdentifyUniqueFiles", params: { id: number, path: string, } }; -------------------------------------------------------------------------------- /core/bindings/ClientQuery.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export type ClientQuery = { key: "NodeGetState" } | { key: "SysGetVolumes" } | { key: "LibGetTags" } | { key: "JobGetRunning" } | { key: "JobGetHistory" } | { key: "SysGetLocations" } | { key: "SysGetLocation", params: { id: number, } } | { key: "LibGetExplorerDir", params: { location_id: number, path: string, limit: number, } } | { key: "GetLibraryStatistics" } | { key: "GetNodes" }; -------------------------------------------------------------------------------- /core/bindings/ClientState.ts: -------------------------------------------------------------------------------- 1 | import type { LibraryState } from './LibraryState'; 2 | 3 | export interface ClientState { 4 | client_uuid: string; 5 | client_id: number; 6 | client_name: string; 7 | data_path: string; 8 | tcp_port: number; 9 | libraries: Array; 10 | current_library_uuid: string; 11 | } 12 | -------------------------------------------------------------------------------- /core/bindings/CoreEvent.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { ClientQuery } from "./ClientQuery"; 3 | import type { CoreResource } from "./CoreResource"; 4 | 5 | export type CoreEvent = { key: "InvalidateQuery", data: ClientQuery } | { key: "InvalidateQueryDebounced", data: ClientQuery } | { key: "InvalidateResource", data: CoreResource } | { key: "NewThumbnail", data: { cas_id: string, } } | { key: "Log", data: { message: string, } } | { key: "DatabaseDisconnected", data: { reason: string | null, } }; -------------------------------------------------------------------------------- /core/bindings/CoreResource.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { File } from "./File"; 3 | import type { JobReport } from "./JobReport"; 4 | import type { LocationResource } from "./LocationResource"; 5 | 6 | export type CoreResource = "Client" | "Library" | { Location: LocationResource } | { File: File } | { Job: JobReport } | "Tag"; -------------------------------------------------------------------------------- /core/bindings/CoreResponse.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { DirectoryWithContents } from "./DirectoryWithContents"; 3 | import type { JobReport } from "./JobReport"; 4 | import type { LocationResource } from "./LocationResource"; 5 | import type { NodeState } from "./NodeState"; 6 | import type { Statistics } from "./Statistics"; 7 | import type { Volume } from "./Volume"; 8 | 9 | export type CoreResponse = { key: "Success", data: null } | { key: "SysGetVolumes", data: Array } | { key: "SysGetLocation", data: LocationResource } | { key: "SysGetLocations", data: Array } | { key: "LibGetExplorerDir", data: DirectoryWithContents } | { key: "NodeGetState", data: NodeState } | { key: "LocCreate", data: LocationResource } | { key: "JobGetRunning", data: Array } | { key: "JobGetHistory", data: Array } | { key: "GetLibraryStatistics", data: Statistics }; -------------------------------------------------------------------------------- /core/bindings/DirectoryWithContents.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { FilePath } from "./FilePath"; 3 | 4 | export interface DirectoryWithContents { directory: FilePath, contents: Array, } -------------------------------------------------------------------------------- /core/bindings/EncryptionAlgorithm.ts: -------------------------------------------------------------------------------- 1 | 2 | export type EncryptionAlgorithm = "None" | "AES128" | "AES192" | "AES256"; -------------------------------------------------------------------------------- /core/bindings/File.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { FileKind } from "./FileKind"; 3 | import type { FilePath } from "./FilePath"; 4 | 5 | export interface File { id: number, cas_id: string, integrity_checksum: string | null, size_in_bytes: string, kind: FileKind, hidden: boolean, favorite: boolean, important: boolean, has_thumbnail: boolean, has_thumbstrip: boolean, has_video_preview: boolean, ipfs_id: string | null, comment: string | null, date_created: string, date_modified: string, date_indexed: string, paths: Array, } -------------------------------------------------------------------------------- /core/bindings/FileKind.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export type FileKind = "Unknown" | "Directory" | "Package" | "Archive" | "Image" | "Video" | "Audio" | "Plaintext" | "Alias"; -------------------------------------------------------------------------------- /core/bindings/FilePath.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { File } from "./File"; 3 | 4 | export interface FilePath { id: number, is_dir: boolean, location_id: number, materialized_path: string, name: string, extension: string | null, file_id: number | null, parent_id: number | null, date_created: string, date_modified: string, date_indexed: string, file: File | null, } -------------------------------------------------------------------------------- /core/bindings/JobReport.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { JobStatus } from "./JobStatus"; 3 | 4 | export interface JobReport { id: string, name: string, date_created: string, date_modified: string, status: JobStatus, task_count: number, completed_task_count: number, message: string, seconds_elapsed: string, } -------------------------------------------------------------------------------- /core/bindings/JobStatus.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export type JobStatus = "Queued" | "Running" | "Completed" | "Canceled" | "Failed"; -------------------------------------------------------------------------------- /core/bindings/LibraryNode.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { Platform } from "./Platform"; 3 | 4 | export interface LibraryNode { uuid: string, name: string, platform: Platform, tcp_address: string, last_seen: string, last_synchronized: string, } -------------------------------------------------------------------------------- /core/bindings/LibraryState.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface LibraryState { library_uuid: string, library_id: number, library_path: string, offline: boolean, } -------------------------------------------------------------------------------- /core/bindings/LocationResource.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface LocationResource { id: number, name: string | null, path: string | null, total_capacity: number | null, available_capacity: number | null, is_removable: boolean | null, is_online: boolean, date_created: string, } -------------------------------------------------------------------------------- /core/bindings/NodeState.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { LibraryState } from "./LibraryState"; 3 | 4 | export interface NodeState { node_pub_id: string, node_id: number, node_name: string, data_path: string, tcp_port: number, libraries: Array, current_library_uuid: string, } -------------------------------------------------------------------------------- /core/bindings/Platform.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export type Platform = "Unknown" | "Windows" | "MacOS" | "Linux" | "IOS" | "Android"; -------------------------------------------------------------------------------- /core/bindings/Statistics.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface Statistics { total_file_count: number, total_bytes_used: string, total_bytes_capacity: string, total_bytes_free: string, total_unique_bytes: string, preview_media_bytes: string, library_db_size: string, } -------------------------------------------------------------------------------- /core/bindings/Volume.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | 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, } -------------------------------------------------------------------------------- /core/derive/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "core-derive" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | proc-macro = true 8 | 9 | [dependencies] 10 | quote = "1.0.18" 11 | syn = "1.0.91" -------------------------------------------------------------------------------- /core/index.ts: -------------------------------------------------------------------------------- 1 | export * from './bindings/Client'; 2 | export * from './bindings/ClientCommand'; 3 | export * from './bindings/ClientQuery'; 4 | export * from './bindings/ClientState'; 5 | export * from './bindings/CoreEvent'; 6 | export * from './bindings/CoreResource'; 7 | export * from './bindings/CoreResponse'; 8 | export * from './bindings/DirectoryWithContents'; 9 | export * from './bindings/EncryptionAlgorithm'; 10 | export * from './bindings/File'; 11 | export * from './bindings/FileKind'; 12 | export * from './bindings/FilePath'; 13 | export * from './bindings/JobReport'; 14 | export * from './bindings/JobStatus'; 15 | export * from './bindings/LibraryNode'; 16 | export * from './bindings/LibraryState'; 17 | export * from './bindings/LocationResource'; 18 | export * from './bindings/NodeState'; 19 | export * from './bindings/Platform'; 20 | export * from './bindings/Statistics'; 21 | export * from './bindings/Volume'; 22 | -------------------------------------------------------------------------------- /core/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sd/core", 3 | "version": "0.0.0", 4 | "main": "index.js", 5 | "license": "GPL-3.0-only", 6 | "scripts": { 7 | "codegen": "cargo test && ts-node ./scripts/bindingsIndex.ts", 8 | "build": "cargo build", 9 | "test": "cargo test", 10 | "test:log": "cargo test -- --nocapture", 11 | "prisma": "cargo prisma" 12 | }, 13 | "devDependencies": { 14 | "@types/node": "^17.0.36", 15 | "ts-node": "^10.8.0", 16 | "typescript": "^4.7.2" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /core/prisma/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "prisma-cli" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.5.0" } -------------------------------------------------------------------------------- /core/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "sqlite" -------------------------------------------------------------------------------- /core/prisma/migrations/migration_table/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "_migrations" ( 3 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 4 | "name" TEXT NOT NULL, 5 | "checksum" TEXT NOT NULL, 6 | "steps_applied" INTEGER NOT NULL DEFAULT 0, 7 | "applied_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP 8 | ); 9 | -- CreateIndex 10 | CREATE UNIQUE INDEX "_migrations_checksum_key" ON "_migrations"("checksum"); -------------------------------------------------------------------------------- /core/prisma/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | prisma_client_rust_cli::run(); 3 | } 4 | -------------------------------------------------------------------------------- /core/scripts/bindingsIndex.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs/promises'; 2 | import * as path from 'path'; 3 | 4 | (async function main() { 5 | async function exists(path: string) { 6 | try { 7 | await fs.access(path); 8 | return true; 9 | } catch { 10 | return false; 11 | } 12 | } 13 | 14 | const files = await fs.readdir(path.join(__dirname, '../bindings')); 15 | const bindings = files.filter((f) => f.endsWith('.ts')); 16 | let str = ''; 17 | // str += `export * from './types';\n`; 18 | 19 | for (let binding of bindings) { 20 | str += `export * from './bindings/${binding.split('.')[0]}';\n`; 21 | } 22 | 23 | let indexExists = await exists(path.join(__dirname, '../index.ts')); 24 | 25 | if (indexExists) { 26 | await fs.rm(path.join(__dirname, '../index.ts')); 27 | } 28 | 29 | await fs.writeFile(path.join(__dirname, '../index.ts'), str); 30 | })(); 31 | -------------------------------------------------------------------------------- /core/scripts/tsconfig.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/core/scripts/tsconfig.json -------------------------------------------------------------------------------- /core/src/encode/mod.rs: -------------------------------------------------------------------------------- 1 | mod metadata; 2 | mod thumb; 3 | 4 | pub use metadata::*; 5 | pub use thumb::*; 6 | -------------------------------------------------------------------------------- /core/src/file/cas/mod.rs: -------------------------------------------------------------------------------- 1 | mod checksum; 2 | mod identifier; 3 | 4 | pub use checksum::*; 5 | pub use identifier::*; 6 | -------------------------------------------------------------------------------- /core/src/file/explorer/mod.rs: -------------------------------------------------------------------------------- 1 | mod open; 2 | 3 | pub use open::*; 4 | -------------------------------------------------------------------------------- /core/src/job/mod.rs: -------------------------------------------------------------------------------- 1 | use std::fmt::Debug; 2 | use thiserror::Error; 3 | 4 | use crate::prisma; 5 | 6 | mod jobs; 7 | mod worker; 8 | 9 | pub use jobs::*; 10 | pub use worker::*; 11 | 12 | #[derive(Error, Debug)] 13 | pub enum JobError { 14 | #[error("Failed to create job (job_id {job_id:?})")] 15 | CreateFailure { job_id: String }, 16 | #[error("Database error")] 17 | DatabaseError(#[from] prisma::QueryError), 18 | } 19 | -------------------------------------------------------------------------------- /core/src/library/mod.rs: -------------------------------------------------------------------------------- 1 | mod loader; 2 | mod statistics; 3 | 4 | pub use loader::*; 5 | pub use statistics::*; 6 | 7 | use thiserror::Error; 8 | 9 | use crate::{prisma, sys::SysError}; 10 | 11 | #[derive(Error, Debug)] 12 | pub enum LibraryError { 13 | #[error("Missing library")] 14 | LibraryNotFound, 15 | #[error("Database error")] 16 | DatabaseError(#[from] prisma::QueryError), 17 | #[error("System error")] 18 | SysError(#[from] SysError), 19 | } 20 | -------------------------------------------------------------------------------- /core/src/sys/mod.rs: -------------------------------------------------------------------------------- 1 | mod locations; 2 | mod volumes; 3 | 4 | pub use locations::*; 5 | pub use volumes::*; 6 | 7 | use thiserror::Error; 8 | 9 | use crate::{job, prisma}; 10 | 11 | #[derive(Error, Debug)] 12 | pub enum SysError { 13 | #[error("Location error")] 14 | LocationError(#[from] LocationError), 15 | #[error("Error with system volumes")] 16 | VolumeError(String), 17 | #[error("Error from job runner")] 18 | JobError(#[from] job::JobError), 19 | #[error("Database error")] 20 | DatabaseError(#[from] prisma::QueryError), 21 | } 22 | -------------------------------------------------------------------------------- /core/src/util/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod db; 2 | -------------------------------------------------------------------------------- /docs/architecture/database.md: -------------------------------------------------------------------------------- 1 | ## Database backup 2 | 3 | ## Database migrations 4 | 5 | Currently migrations are applied on app launch with no visual feedback, backup or error handling. 6 | 7 | It doesn't appear that migrations are applied succesfully 8 | 9 | ## 10 | -------------------------------------------------------------------------------- /docs/architecture/extensions.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/docs/architecture/extensions.md -------------------------------------------------------------------------------- /docs/architecture/jobs.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/docs/architecture/jobs.md -------------------------------------------------------------------------------- /docs/architecture/rust-typescript-messaging.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/docs/architecture/rust-typescript-messaging.md -------------------------------------------------------------------------------- /docs/changelog/10-4-22_0.1.0.md: -------------------------------------------------------------------------------- 1 | # `0.1.0` 2 | 3 | **Sunday, April 10th 2022** 4 | 5 | A change happened. 6 | 7 | - A very specific change. 8 | - Another extremely specific change. 9 | - I love change. 10 | -------------------------------------------------------------------------------- /docs/changelog/index.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | No releases yet. 4 | -------------------------------------------------------------------------------- /docs/product/assets/roadmap/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/docs/product/assets/roadmap/folder.png -------------------------------------------------------------------------------- /docs/product/credits.md: -------------------------------------------------------------------------------- 1 | # Spacedrive 2 | 3 | Copyright © 2022-present Spacedrive Technology Inc. 4 | 5 | ## Business contact 6 | 7 | jamie@spacedrive.com 8 | 9 | ## Developers 10 | 11 | Jamie Pine, Brendan Allan, Oscar Beaumont, Haden Fletcher, Benjamin Akar, Haris Mehrzad, and all other contributors displayed below! 12 | 13 | ## Contributors 14 | 15 | 16 | Avatars of the top contributors the the Spacedrive repository. Follow link for names and data. 20 | 21 | -------------------------------------------------------------------------------- /docs/product/ideas.md: -------------------------------------------------------------------------------- 1 | # Core view 2 | 3 | The primary screen in the Spacedrive app is of your entire virtual network, every "core" is a device under your full command. It is presented in a large panel list view, featuring bold visuals and quick interactions with your fleet. 4 | 5 | Recent files, recent locations and settings are part of these panels, that can be customized at will. 6 | Visual indicators report the live status of this device. 7 | 8 | Key statistics of this devices are also present on these panels. 9 | 10 | A "Core" represents a device in your "Space". 11 | -------------------------------------------------------------------------------- /docs/product/introduction.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/docs/product/introduction.md -------------------------------------------------------------------------------- /docs/product/marketing.md: -------------------------------------------------------------------------------- 1 | ### One space, all your drives. 2 | 3 | ### The file explorer from the future. 4 | 5 | ### The file explorer of the future. 6 | 7 | ### All your files in one space. 8 | -------------------------------------------------------------------------------- /docs/product/privacy.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/docs/product/privacy.md -------------------------------------------------------------------------------- /docs/product/security.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/docs/product/security.md -------------------------------------------------------------------------------- /extensions/apple-photos/README.md: -------------------------------------------------------------------------------- 1 | This extension must first register an indexer context to prevent the indexer from scanning the photo library 2 | 3 | ```rust 4 | struct IndexerContext { 5 | key: String, 6 | is_dir: bool, 7 | extension: Option, 8 | must_contain: Vec, 9 | always_ignored: Option 10 | scan: bool, 11 | } 12 | ``` 13 | 14 | ```rust 15 | core.register_context(IndexerContext { 16 | key: "apple-photo-library", 17 | is_dir: false, 18 | extension: ".photoslibrary", 19 | must_contain: vec!["database", "originals"], 20 | always_ignored: None, 21 | scan: false, // apple-photos extension takes care of scan 22 | }); 23 | 24 | core.register_context(IndexerContext { 25 | key: "github-repository", 26 | is_dir: true, 27 | extension: None, 28 | must_contain: vec![".git"], 29 | always_ignored: Some("node_modules", "target") 30 | scan: true, 31 | }); 32 | ``` 33 | 34 | For Apple Photos we need: 35 | 36 | - Hidden/Favorite items 37 | - Live photo support 38 | - Original creation date 39 | - Edited photos 40 | - Albums 41 | -------------------------------------------------------------------------------- /extensions/twitter-history/Cargo.toml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/extensions/twitter-history/Cargo.toml -------------------------------------------------------------------------------- /extensions/twitter-history/prisma/schema.prisma: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/extensions/twitter-history/prisma/schema.prisma -------------------------------------------------------------------------------- /packages/client/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/client/.gitignore -------------------------------------------------------------------------------- /packages/client/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/client/README.md -------------------------------------------------------------------------------- /packages/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sd/client", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./src/index.ts", 6 | "files": [ 7 | "dist/**" 8 | ], 9 | "scripts": { 10 | "test": "jest", 11 | "dev": "tsc -w", 12 | "build": "tsc", 13 | "lint": "TIMING=1 eslint src --fix", 14 | "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist" 15 | }, 16 | "devDependencies": { 17 | "@types/react": "^18.0.9", 18 | "scripts": "*", 19 | "tsconfig": "*", 20 | "typescript": "^4.7.2" 21 | }, 22 | "jest": { 23 | "preset": "scripts/jest/node" 24 | }, 25 | "dependencies": { 26 | "@sd/config": "workspace:*", 27 | "@sd/core": "workspace:*", 28 | "eventemitter3": "^4.0.7", 29 | "immer": "^9.0.14", 30 | "react-query": "^3.39.1", 31 | "zustand": "4.0.0-rc.1" 32 | }, 33 | "peerDependencies": { 34 | "react": "^18.0.0", 35 | "react-query": "^3.34.19" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /packages/client/src/ClientProvider.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { QueryClientProvider, QueryClientProviderProps } from 'react-query'; 3 | 4 | export interface ClientProviderProps extends Omit { 5 | children?: React.ReactNode; 6 | } 7 | 8 | // The ClientProvider injects the React-query context into the "context store" of the current package. This is needed due to the fact the repository is a monorepo. 9 | // This is a pretty hacky solution and a better solution should probably be found to replace it. 10 | export const ClientProvider: React.FC = ({ children, ...props }) => { 11 | return ( 12 | // This exists to add the QueryClientProvider to the current subpackage '@sd/client'. 13 | // The ReactQueryClient is fetched from the window object (which is set in the parent application). 14 | 15 | {children} 16 | 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /packages/client/src/files/index.ts: -------------------------------------------------------------------------------- 1 | export * from './query'; 2 | export * from './state'; 3 | -------------------------------------------------------------------------------- /packages/client/src/files/query.ts: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import { useQuery } from 'react-query'; 3 | 4 | import { useBridgeCommand, useBridgeQuery } from '../bridge'; 5 | import { useFileExplorerState } from './state'; 6 | 7 | // this hook initializes the explorer state and queries the core 8 | export function useFileExplorer(initialPath = '/', initialLocation: number | null = null) { 9 | const fileState = useFileExplorerState(); 10 | // file explorer hooks maintain their own local state relative to exploration 11 | const [path, setPath] = useState(initialPath); 12 | const [locationId, setLocationId] = useState(initialPath); 13 | 14 | // const { data: volumes } = useQuery(['sys_get_volumes'], () => bridge('sys_get_volumes')); 15 | 16 | return { setPath, setLocationId }; 17 | } 18 | 19 | // export function useVolumes() { 20 | // return useQuery(['SysGetVolumes'], () => bridge('SysGetVolumes')); 21 | // } 22 | -------------------------------------------------------------------------------- /packages/client/src/files/state.ts: -------------------------------------------------------------------------------- 1 | import produce from 'immer'; 2 | import create from 'zustand'; 3 | 4 | export interface FileExplorerState { 5 | current_location_id: number | null; 6 | row_limit: number; 7 | } 8 | 9 | interface FileExplorerStore extends FileExplorerState { 10 | update_row_limit: (new_limit: number) => void; 11 | } 12 | 13 | export const useFileExplorerState = create((set, get) => ({ 14 | current_location_id: null, 15 | row_limit: 10, 16 | update_row_limit: (new_limit: number) => { 17 | set((store) => 18 | produce(store, (draft) => { 19 | draft.row_limit = new_limit; 20 | }) 21 | ); 22 | } 23 | })); 24 | -------------------------------------------------------------------------------- /packages/client/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './bridge'; 2 | export * from './files'; 3 | export * from './ClientProvider'; 4 | -------------------------------------------------------------------------------- /packages/client/src/window.d.ts: -------------------------------------------------------------------------------- 1 | import type { QueryClient } from 'react-query/types'; 2 | 3 | declare global { 4 | interface Window { 5 | ReactQueryClient: QueryClient; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../config/base.tsconfig.json", 3 | "compilerOptions": {}, 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/config/base.tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Default", 4 | "compilerOptions": { 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "declaration": false, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "inlineSources": false, 11 | "isolatedModules": false, 12 | "module": "ESNext", 13 | "target": "ES6", 14 | "moduleResolution": "node", 15 | "noUnusedLocals": false, 16 | "noUnusedParameters": false, 17 | "preserveWatchOutput": true, 18 | "skipLibCheck": false, 19 | "strict": true, 20 | "allowSyntheticDefaultImports": true, 21 | "resolveJsonModule": true, 22 | "jsx": "react", 23 | "paths": { 24 | "@sd/interface": ["../../packages/interface"], 25 | "@sd/ui": ["../../packages/ui"], 26 | "@sd/client": ["../../packages/client"] 27 | } 28 | }, 29 | "exclude": ["node_modules"] 30 | } 31 | -------------------------------------------------------------------------------- /packages/config/eslint-preset.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['next', 'prettier'], 3 | settings: { 4 | next: { 5 | rootDir: ['apps/*/', 'packages/*/'] 6 | } 7 | }, 8 | rules: { 9 | 'no-html-link-for-pages': 'off' 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /packages/config/interface.tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./base.tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["vite-plugin-svgr/client", "vite/client", "@sd/client/src/window"] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /packages/config/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sd/config", 3 | "version": "0.0.0", 4 | "main": "index.js", 5 | "license": "GPL-3.0-only", 6 | "files": [ 7 | "eslint-preset.js" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /packages/interface/src/AppPropsContext.tsx: -------------------------------------------------------------------------------- 1 | import { BaseTransport } from '@sd/client'; 2 | import { createContext } from 'react'; 3 | 4 | export const AppPropsContext = createContext(null); 5 | 6 | export type Platform = 'browser' | 'macOS' | 'windows' | 'linux'; 7 | 8 | export interface AppProps { 9 | transport: BaseTransport; 10 | platform: Platform; 11 | convertFileSrc: (url: string) => string; 12 | openDialog: (options: { directory?: boolean }) => Promise; 13 | onClose?: () => void; 14 | onMinimize?: () => void; 15 | onFullscreen?: () => void; 16 | onOpen?: (path: string) => void; 17 | isFocused?: boolean; 18 | demoMode?: boolean; 19 | } 20 | -------------------------------------------------------------------------------- /packages/interface/src/ErrorFallback.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@sd/ui'; 2 | import React from 'react'; 3 | import { FallbackProps } from 'react-error-boundary'; 4 | 5 | export function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) { 6 | return ( 7 |
12 |

APP CRASHED

13 |

We're past the event horizon...

14 |
Error: {error.message}
15 |
16 | 19 | 22 |
23 |
24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /packages/interface/src/NotFound.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@sd/ui'; 2 | import React from 'react'; 3 | import { useNavigate } from 'react-router'; 4 | 5 | export function NotFound() { 6 | const navigate = useNavigate(); 7 | return ( 8 |
13 |

Error: 404

14 |

You chose nothingness.

15 |
16 | 19 |
20 |
21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/ai.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/angular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/audio-mp3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/audio-ogg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/audio-wav.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/audio.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/babel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/bat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/bicep.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/binary.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/blade.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/bsconfig.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/bundler.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/c.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/cert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/cheader.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/cli.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/compodoc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/composer.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/conf.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/cpp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/csharp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/cshtml.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/css-map.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/css.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/dartlang.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/docker.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/editorconfig.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/eex.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/elixir.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/elm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/env.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/erb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/erlang.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/eslint.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/exs.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/exx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/folder-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/folder-open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/git.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/go-package.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/go.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/graphql.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/groovy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/gulp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/handlebars.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/haskell.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/html.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/image-gif.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/image-ico.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/image-jpg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/image-png.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/image-webp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/image.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/ipynb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/jest.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/json.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/julia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/karma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/key.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/less.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/license.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/lighteditorconfig.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/liquid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/log.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/lua.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/m.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/markdown.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/mint.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/mov.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/mp4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/netlify.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/nginx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/nim.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/njk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/npm-lock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/npm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/nuxt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/nvm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/pdf.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/php.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/postcss-config.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/prettier.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/prisma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/qt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/readme.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/rescript.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/rjson.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/robots.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/ruby.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/rust.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/sass.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/scss.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/shell.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/smarty.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/sol.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/sql.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/stylelint.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/stylus.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/svg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/swift.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/tailwind.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/tmpl.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/toml.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/tsx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/twig.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/txt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/ui.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/vercel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/video.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/vscode.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/wasm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/webpack.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/windi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/xml.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/yaml.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/yarn-error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/yarn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/assets/icons/zip.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/interface/src/assets/images/spacedrive_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/interface/src/assets/images/spacedrive_logo.png -------------------------------------------------------------------------------- /packages/interface/src/assets/images/spacedrive_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/interface/src/assets/images/spacedrive_screenshot.png -------------------------------------------------------------------------------- /packages/interface/src/assets/images/spacedrive_screenshot_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/interface/src/assets/images/spacedrive_screenshot_2.jpg -------------------------------------------------------------------------------- /packages/interface/src/assets/svg/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/svg/drive.svg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/interface/src/assets/svg/drive.svg -------------------------------------------------------------------------------- /packages/interface/src/assets/svg/macos_close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/svg/macos_fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/interface/src/assets/svg/macos_minimize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/interface/src/components/device/Stores.tsx: -------------------------------------------------------------------------------- 1 | import create from 'zustand'; 2 | 3 | const getLocalStorage = (key: string) => JSON.parse(window.localStorage.getItem(key) || '{}'); 4 | const setLocalStorage = (key: string, value: any) => 5 | window.localStorage.setItem(key, JSON.stringify(value)); 6 | 7 | type NodeState = { 8 | isExperimental: boolean; 9 | setIsExperimental: (experimental: boolean) => void; 10 | }; 11 | 12 | export const useNodeStore = create((set) => ({ 13 | isExperimental: (getLocalStorage('isExperimental') as boolean) === true || false, 14 | setIsExperimental: (experimental: boolean) => 15 | set((state) => { 16 | setLocalStorage('isExperimental', experimental); 17 | return { ...state, isExperimental: experimental }; 18 | }) 19 | })); 20 | -------------------------------------------------------------------------------- /packages/interface/src/components/dialog/DemoDialog.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/interface/src/components/dialog/DemoDialog.tsx -------------------------------------------------------------------------------- /packages/interface/src/components/file/Icon.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/interface/src/components/file/Icon.tsx -------------------------------------------------------------------------------- /packages/interface/src/components/icons/Folder.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import folderWhiteSvg from '../../assets/svg/folder-white.svg'; 4 | import folderSvg from '../../assets/svg/folder.svg'; 5 | 6 | interface FolderProps { 7 | /** 8 | * Append additional classes to the underlying SVG 9 | */ 10 | className?: string; 11 | 12 | /** 13 | * Render a white folder icon 14 | */ 15 | white?: boolean; 16 | 17 | /** 18 | * The size of the icon to show -- uniform width and height 19 | */ 20 | size?: number; 21 | } 22 | 23 | export function Folder(props: FolderProps) { 24 | const { size = 24 } = props; 25 | 26 | return ( 27 | Folder icon 34 | ); 35 | } 36 | -------------------------------------------------------------------------------- /packages/interface/src/components/items/DriveListItem.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import React from 'react'; 3 | 4 | import { DefaultProps } from '../primitive/types'; 5 | 6 | export interface DriveListItemProps extends DefaultProps { 7 | name: string; 8 | } 9 | 10 | export const DriveListItem: React.FC = (props) => { 11 | return ( 12 |
18 | ); 19 | }; 20 | -------------------------------------------------------------------------------- /packages/interface/src/components/layout/MenuOverlay.tsx: -------------------------------------------------------------------------------- 1 | import { ContextMenu, ContextMenuProps, Root, Trigger } from '@sd/ui'; 2 | import React, { ComponentProps } from 'react'; 3 | 4 | export const WithContextMenu: React.FC<{ 5 | menu: ContextMenuProps['items']; 6 | children: ComponentProps['children']; 7 | }> = (props) => { 8 | const { menu: sections = [], children } = props; 9 | 10 | return ( 11 | 12 | {children} 13 | 14 | 15 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/Checkbox.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import React from 'react'; 3 | 4 | export interface CheckboxProps extends React.InputHTMLAttributes { 5 | containerClasname?: string; 6 | } 7 | 8 | export const Checkbox: React.FC = (props) => { 9 | return ( 10 | 40 | ); 41 | }; 42 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/Codeblock.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactJson, { ReactJsonViewProps } from 'react-json-view'; 3 | 4 | export interface CodeBlockProps extends ReactJsonViewProps {} 5 | 6 | export default function CodeBlock(props: CodeBlockProps) { 7 | return ( 8 | 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/InputContainer.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import React from 'react'; 3 | 4 | import { DefaultProps } from './types'; 5 | 6 | interface InputContainerProps extends DefaultProps { 7 | title: string; 8 | description?: string; 9 | children: React.ReactNode; 10 | mini?: boolean; 11 | } 12 | 13 | export const InputContainer: React.FC = (props) => { 14 | return ( 15 |
16 |
20 |

{props.title}

21 | {!!props.description &&

{props.description}

} 22 | {!props.mini && props.children} 23 |
24 | {props.mini && props.children} 25 |
26 | ); 27 | }; 28 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/ProgressBar.tsx: -------------------------------------------------------------------------------- 1 | import * as ProgressPrimitive from '@radix-ui/react-progress'; 2 | import React, { useEffect } from 'react'; 3 | 4 | interface Props { 5 | value: number; 6 | total: number; 7 | } 8 | 9 | const ProgressBar = (props: Props) => { 10 | const percentage = Math.round((props.value / props.total) * 100); 11 | return ( 12 | 16 | 20 | 21 | ); 22 | }; 23 | 24 | export default ProgressBar; 25 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/Shortcut.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import React from 'react'; 3 | 4 | import { DefaultProps } from './types'; 5 | 6 | export interface ShortcutProps extends DefaultProps { 7 | chars: string; 8 | } 9 | 10 | export const Shortcut: React.FC = (props) => { 11 | return ( 12 | 31 | {props.chars} 32 | 33 | ); 34 | }; 35 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/Slider.tsx: -------------------------------------------------------------------------------- 1 | import * as SliderPrimitive from '@radix-ui/react-slider'; 2 | import React from 'react'; 3 | 4 | const Slider = (props: SliderPrimitive.SliderProps) => ( 5 | 6 | 7 | 8 | 9 | 13 | 14 | ); 15 | 16 | export default Slider; 17 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/Tag.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import React, { ReactNode } from 'react'; 3 | 4 | import { DefaultProps } from './types'; 5 | 6 | export interface TagProps extends DefaultProps { 7 | children: ReactNode; 8 | color: 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'purple' | 'pink'; 9 | } 10 | 11 | export const Tag: React.FC = (props) => { 12 | return ( 13 |
28 | {props.children} 29 |
30 | ); 31 | }; 32 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/Variants.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface StyleState { 4 | active: string[]; 5 | hover: string[]; 6 | normal: string[]; 7 | } 8 | 9 | interface Variant { 10 | base: string; 11 | light: StyleState; 12 | dark: StyleState; 13 | } 14 | 15 | function tw(variant: Variant): string { 16 | return `${variant.base} ${variant.light}`; 17 | } 18 | 19 | const variants: Record = { 20 | default: tw({ 21 | base: 'shadow-sm', 22 | light: { 23 | normal: ['bg-gray-50', 'border-gray-100', 'text-gray-700'], 24 | hover: ['bg-gray-100', 'border-gray-200', 'text-gray-900'], 25 | active: ['bg-gray-50', 'border-gray-200', 'text-gray-600'] 26 | }, 27 | dark: { 28 | normal: ['bg-gray-800 ', 'border-gray-100', ' text-gray-200'], 29 | active: ['bg-gray-700 ', 'border-gray-200 ', 'text-white'], 30 | hover: ['bg-gray-700 ', 'border-gray-600 ', 'text-white'] 31 | } 32 | }) 33 | }; 34 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './Toggle'; 2 | -------------------------------------------------------------------------------- /packages/interface/src/components/primitive/types.ts: -------------------------------------------------------------------------------- 1 | export interface DefaultProps { 2 | className?: string; 3 | } 4 | -------------------------------------------------------------------------------- /packages/interface/src/components/settings/SettingsContainer.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface SettingsContainerProps { 4 | children: React.ReactNode; 5 | } 6 | 7 | export const SettingsContainer: React.FC = (props) => { 8 | return
{props.children}
; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/interface/src/components/settings/SettingsHeader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface SettingsHeaderProps { 4 | title: string; 5 | description: string; 6 | } 7 | 8 | export const SettingsHeader: React.FC = (props) => { 9 | return ( 10 |
11 |

{props.title}

12 |

{props.description}

13 |
14 |
15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /packages/interface/src/components/transitions/SlideUp.tsx: -------------------------------------------------------------------------------- 1 | import { Transition } from '@headlessui/react'; 2 | import React from 'react'; 3 | 4 | export default function SlideUp(props: { children: React.ReactNode }) { 5 | return ( 6 | 17 | {props.children} 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /packages/interface/src/hooks/useExplorerState.ts: -------------------------------------------------------------------------------- 1 | import create from 'zustand'; 2 | 3 | type ExplorerState = { 4 | selectedRowIndex: number; 5 | setSelectedRowIndex: (index: number) => void; 6 | locationId: number; 7 | setLocationId: (index: number) => void; 8 | newThumbnails: Record; 9 | addNewThumbnail: (cas_id: string) => void; 10 | }; 11 | 12 | export const useExplorerState = create((set) => ({ 13 | selectedRowIndex: 1, 14 | setSelectedRowIndex: (index) => set((state) => ({ ...state, selectedRowIndex: index })), 15 | locationId: -1, 16 | setLocationId: (id: number) => set((state) => ({ ...state, locationId: id })), 17 | newThumbnails: {}, 18 | addNewThumbnail: (cas_id: string) => 19 | set((state) => ({ 20 | ...state, 21 | newThumbnails: { ...state.newThumbnails, [cas_id]: true } 22 | })) 23 | })); 24 | -------------------------------------------------------------------------------- /packages/interface/src/hooks/useFocusState.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | 3 | export function useFocusState() { 4 | const [focused, setFocused] = useState(true); 5 | const focus = () => setFocused(true); 6 | const blur = () => setFocused(false); 7 | useEffect(() => { 8 | window.addEventListener('focus', focus); 9 | window.addEventListener('blur', blur); 10 | return () => { 11 | window.removeEventListener('focus', focus); 12 | window.removeEventListener('blur', blur); 13 | }; 14 | }, []); 15 | 16 | return [focused]; 17 | } 18 | -------------------------------------------------------------------------------- /packages/interface/src/hooks/useInputState.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | 3 | export function useInputState(initialValue: T) { 4 | const [value, setValue] = useState(initialValue); 5 | return { 6 | onChange: (event: React.ChangeEvent) => 7 | setValue(event.target.value as unknown as T), 8 | value 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /packages/interface/src/index.ts: -------------------------------------------------------------------------------- 1 | import App from './App'; 2 | import { AppProps, Platform } from './AppPropsContext'; 3 | 4 | export type { AppProps, Platform }; 5 | 6 | export default App; 7 | -------------------------------------------------------------------------------- /packages/interface/src/screens/Content.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const ContentScreen: React.FC<{}> = (props) => { 4 | return ( 5 |
6 |
7 |

8 | Note: This is a pre-alpha build of Spacedrive, many features are yet to be 9 | functional. 10 |

11 |
12 |
13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /packages/interface/src/screens/Photos.tsx: -------------------------------------------------------------------------------- 1 | // import { useBridgeCommand, useBridgeQuery } from '@sd/client'; 2 | import React from 'react'; 3 | 4 | export const PhotosScreen: React.FC<{}> = (props) => { 5 | return ( 6 |
7 |
8 |

9 | Note: This is a pre-alpha build of Spacedrive, many features are yet to be 10 | functional. 11 |

12 |
13 |
14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /packages/interface/src/screens/Redirect.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | import { useLocation, useNavigate } from 'react-router'; 3 | 4 | export interface RedirectPageProps { 5 | to: string; 6 | } 7 | 8 | export const RedirectPage: React.FC = (props) => { 9 | const { to: destination } = props; 10 | 11 | const navigate = useNavigate(); 12 | 13 | useEffect(() => { 14 | navigate(destination); 15 | }, []); 16 | 17 | return null; 18 | }; 19 | -------------------------------------------------------------------------------- /packages/interface/src/screens/Tag.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | import { useParams, useSearchParams } from 'react-router-dom'; 3 | 4 | export const TagScreen: React.FC<{}> = () => { 5 | let [searchParams] = useSearchParams(); 6 | let path = searchParams.get('path') || ''; 7 | 8 | let { id } = useParams(); 9 | 10 | return ( 11 |
12 |

{id}

13 |
14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/AppearanceSettings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 4 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 5 | 6 | export default function AppearanceSettings() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/ContactsSettings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 4 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 5 | 6 | export default function ContactsSettings() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/KeysSetting.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 4 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 5 | 6 | export default function KeysSettings() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/LocationSettings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { InputContainer } from '../../components/primitive/InputContainer'; 4 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 5 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 6 | 7 | // const exampleLocations = [ 8 | // { option: 'Macintosh HD', key: 'macintosh_hd' }, 9 | // { option: 'LaCie External', key: 'lacie_external' }, 10 | // { option: 'Seagate 8TB', key: 'seagate_8tb' } 11 | // ]; 12 | 13 | export default function LocationSettings() { 14 | // const locations = useBridgeQuery("SysGetLocation") 15 | 16 | return ( 17 | 18 | {/**/} 19 | 20 | 24 |
25 |
26 |
27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/SecuritySettings.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@sd/ui'; 2 | import React from 'react'; 3 | 4 | import { InputContainer } from '../../components/primitive/InputContainer'; 5 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 6 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 7 | 8 | export default function SecuritySettings() { 9 | return ( 10 | 11 | 12 | 16 |
17 | 18 | {/**/} 19 |
20 |
21 |
22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/SharingSettings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 4 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 5 | 6 | export default function SharingSettings() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/SyncSettings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 4 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 5 | 6 | export default function SyncSettings() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/interface/src/screens/settings/TagsSettings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SettingsContainer } from '../../components/settings/SettingsContainer'; 4 | import { SettingsHeader } from '../../components/settings/SettingsHeader'; 5 | 6 | export default function TagsSettings() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/interface/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../config/interface.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./dist" 5 | }, 6 | "include": ["src"] 7 | } 8 | -------------------------------------------------------------------------------- /packages/macos/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | -------------------------------------------------------------------------------- /packages/macos/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "SwiftRs", 6 | "repositoryURL": "https://github.com/Brendonovich/swift-rs", 7 | "state": { 8 | "branch": null, 9 | "revision": "e47a9e8186f6e25be6fae40d3cc3c272abea63a2", 10 | "version": "0.3.0" 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /packages/macos/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstop125/spacedrive/55e52eb2ec1c7bb6165d5e37d3b04ac189d7eed4/packages/macos/README.md -------------------------------------------------------------------------------- /packages/macos/TestPlan.xctestplan: -------------------------------------------------------------------------------- 1 | { 2 | "configurations" : [ 3 | { 4 | "id" : "217668D6-0AB1-4124-9035-478908965985", 5 | "name" : "Configuration 1", 6 | "options" : { 7 | 8 | } 9 | } 10 | ], 11 | "defaultOptions" : { 12 | "testTimeoutsEnabled" : true 13 | }, 14 | "testTargets" : [ 15 | 16 | ], 17 | "version" : 1 18 | } 19 | -------------------------------------------------------------------------------- /packages/ui/.storybook/main.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], 3 | addons: [ 4 | '@storybook/addon-links', 5 | '@storybook/addon-essentials', 6 | '@storybook/addon-interactions', 7 | '@storybook/preset-scss', 8 | { 9 | name: '@storybook/addon-postcss', 10 | options: { 11 | postcssLoaderOptions: { 12 | implementation: require('postcss') 13 | } 14 | } 15 | }, 16 | 'storybook-tailwind-dark-mode' 17 | ], 18 | webpackFinal: async (config) => { 19 | config.module.rules.push({ 20 | test: /\.scss$/, 21 | use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'] 22 | }); 23 | config.module.rules.push({ 24 | test: /\.pcss$/, 25 | use: ['style-loader', 'css-loader', 'postcss-loader'] 26 | }); 27 | 28 | return config; 29 | }, 30 | core: { 31 | builder: '@storybook/builder-webpack5' 32 | }, 33 | framework: '@storybook/react' 34 | }; 35 | -------------------------------------------------------------------------------- /packages/ui/.storybook/preview.js: -------------------------------------------------------------------------------- 1 | import '../style/tailwind.pcss'; 2 | 3 | export const parameters = { 4 | actions: { argTypesRegex: '^on[A-Z].*' }, 5 | controls: { 6 | matchers: { 7 | color: /(background|color)$/i, 8 | date: /Date$/ 9 | } 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /packages/ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [require('tailwindcss'), require('autoprefixer')] 3 | }; 4 | -------------------------------------------------------------------------------- /packages/ui/src/Button.stories.tsx: -------------------------------------------------------------------------------- 1 | import { ComponentMeta, ComponentStory } from '@storybook/react'; 2 | import React from 'react'; 3 | 4 | import { Button } from './Button'; 5 | 6 | export default { 7 | title: 'UI/Button', 8 | component: Button, 9 | argTypes: {}, 10 | parameters: { 11 | backgrounds: { 12 | default: 'dark' 13 | } 14 | }, 15 | args: { 16 | children: 'Button' 17 | } 18 | } as ComponentMeta; 19 | 20 | const Template: ComponentStory = (args) =>