├── .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 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/audio-ogg.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/audio-wav.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/bicep.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/binary.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/blade.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/bsconfig.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/bundler.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/c.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/cert.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/cheader.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/cli.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/compodoc.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/cshtml.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/erb.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/folder-open.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/folder.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
7 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/html.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/image-gif.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/image-ico.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/image-jpg.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/image-png.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/image-webp.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/info.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/ipynb.svg:
--------------------------------------------------------------------------------
1 |
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 |
6 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/karma.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/key.svg:
--------------------------------------------------------------------------------
1 |
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 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/mp4.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/netlify.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/nginx.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/nim.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/njk.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/npm-lock.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/npm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/nuxt.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/qt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/readme.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/rescript.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/smarty.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/sol.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/tmpl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/toml.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/ui.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/user.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/vercel.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/video.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/webpack.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/windi.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/icons/yarn.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/svg/macos_fullscreen.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/packages/interface/src/assets/svg/macos_minimize.svg:
--------------------------------------------------------------------------------
1 |
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 |
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) => ;
21 |
22 | export const Default = Template.bind({});
23 | Default.args = {
24 | variant: 'default'
25 | };
26 |
27 | export const Primary = Template.bind({});
28 | Primary.args = {
29 | variant: 'primary'
30 | };
31 |
32 | export const PrimarySmall = Template.bind({});
33 | PrimarySmall.args = {
34 | variant: 'primary',
35 | size: 'sm'
36 | };
37 |
--------------------------------------------------------------------------------
/packages/ui/src/ContextMenu.stories.tsx:
--------------------------------------------------------------------------------
1 | import { ComponentMeta, ComponentStory } from '@storybook/react';
2 | import { FileText, Plus, Trash } from 'phosphor-react';
3 | import React from 'react';
4 |
5 | import { ContextMenu } from './ContextMenu';
6 |
7 | export default {
8 | title: 'UI/Context Menu',
9 | component: ContextMenu,
10 | argTypes: {},
11 | parameters: {},
12 | args: {}
13 | } as ComponentMeta;
14 |
15 | const Template: ComponentStory = (args) => ;
16 |
17 | export const Default = Template.bind({});
18 | Default.args = {
19 | items: [
20 | [
21 | {
22 | label: 'New Item',
23 | icon: Plus,
24 | onClick: () => {}
25 | }
26 | ],
27 | [
28 | {
29 | label: 'View Info',
30 | icon: FileText,
31 | onClick: () => {}
32 | },
33 | {
34 | label: 'Delete',
35 | icon: Trash,
36 | danger: true,
37 | onClick: () => {}
38 | }
39 | ]
40 | ]
41 | };
42 |
--------------------------------------------------------------------------------
/packages/ui/src/Dropdown.stories.tsx:
--------------------------------------------------------------------------------
1 | import { ViewListIcon } from '@heroicons/react/solid';
2 | import { ComponentMeta, ComponentStory } from '@storybook/react';
3 | import React from 'react';
4 |
5 | import { Dropdown } from './Dropdown';
6 |
7 | export default {
8 | title: 'UI/Dropdown',
9 | component: Dropdown,
10 | argTypes: {},
11 | parameters: {
12 | backgrounds: {
13 | default: 'dark'
14 | }
15 | }
16 | } as ComponentMeta;
17 |
18 | const Template: ComponentStory = (args) => ;
19 |
20 | export const Default = Template.bind({});
21 | Default.args = {
22 | buttonText: 'Item 1',
23 | items: [
24 | [
25 | {
26 | name: 'Item 1',
27 | selected: true
28 | },
29 | {
30 | name: 'Item 2',
31 | selected: false
32 | }
33 | ]
34 | ]
35 | };
36 |
--------------------------------------------------------------------------------
/packages/ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './Button';
2 | export * from './Dropdown';
3 | export * from './ContextMenu';
4 | export * from './Input';
5 |
--------------------------------------------------------------------------------
/packages/ui/style/index.js:
--------------------------------------------------------------------------------
1 | import './style.scss';
2 |
--------------------------------------------------------------------------------
/packages/ui/style/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = require('../postcss.config');
2 |
--------------------------------------------------------------------------------
/packages/ui/style/style.scss:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 | @tailwind variants;
5 |
6 | .html {
7 | background: #404040;
8 | }
9 |
10 | .backdrop-blur {
11 | backdrop-filter: blur(18px);
12 | -webkit-backdrop-filter: blur(18px);
13 | }
14 |
15 | .inset-center {
16 | position: absolute;
17 | top: 50%;
18 | left: 50%;
19 | transform: translate(-50%, -50%);
20 | }
21 |
--------------------------------------------------------------------------------
/packages/ui/style/tailwind.pcss:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 | @tailwind variants;
5 |
--------------------------------------------------------------------------------
/packages/ui/tailwind.config.js:
--------------------------------------------------------------------------------
1 | // const colors = require('tailwindcss/colors');
2 | // const plugin = require('tailwindcss/plugin');
3 | // const defaultTheme = require('tailwindcss/defaultTheme');
4 |
5 | module.exports = require('./style/tailwind')();
6 |
--------------------------------------------------------------------------------
/packages/ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../config/base.tsconfig.json",
3 | "include": ["src"],
4 | "compilerOptions": {
5 | "outDir": "./dist"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
1 | packages:
2 | - 'packages/*'
3 | - 'apps/*'
4 | - 'core'
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | {
5 | "path": "apps/desktop"
6 | },
7 | {
8 | "path": "apps/web"
9 | },
10 | {
11 | "path": "apps/landing"
12 | },
13 | {
14 | "path": "packages/client"
15 | },
16 | {
17 | "path": "packages/interface"
18 | },
19 | {
20 | "path": "packages/ui"
21 | }
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------