Compare commits
3 Commits
main
...
feature/ne
Author | SHA1 | Date |
---|---|---|
Nikolas Rimikis | ebc20a1a4c | 1 year ago |
Nikolas Rimikis | 23efce9d23 | 1 year ago |
Nikolas Rimikis | adab3c1722 | 1 year ago |
@ -1,13 +0,0 @@ |
|||||||
autofocus |
|
||||||
cupertino |
|
||||||
endtemplate |
|
||||||
expando |
|
||||||
gapless |
|
||||||
goldens |
|
||||||
lerp |
|
||||||
pubspec |
|
||||||
sublist |
|
||||||
todos |
|
||||||
unawaited |
|
||||||
unfocus |
|
||||||
writeln |
|
@ -1,11 +0,0 @@ |
|||||||
browsable |
|
||||||
cleartext |
|
||||||
deeplinking |
|
||||||
flathub |
|
||||||
foss |
|
||||||
fullscreen |
|
||||||
playstore |
|
||||||
postmarket |
|
||||||
provokateurin |
|
||||||
subroutes |
|
||||||
uncategorized |
|
@ -1,20 +0,0 @@ |
|||||||
crypton |
|
||||||
exportables |
|
||||||
fcmup |
|
||||||
filesize |
|
||||||
gotify |
|
||||||
heckel |
|
||||||
mocktail |
|
||||||
nextpush |
|
||||||
noprovider |
|
||||||
ntfy |
|
||||||
oled |
|
||||||
oledas |
|
||||||
rxdart |
|
||||||
seti |
|
||||||
siacs |
|
||||||
sqflite |
|
||||||
underspecified |
|
||||||
updateshouldnotify |
|
||||||
wakelock |
|
||||||
zxing |
|
@ -1,79 +0,0 @@ |
|||||||
apirequest |
|
||||||
applist |
|
||||||
apppassword |
|
||||||
approximative |
|
||||||
appstore |
|
||||||
bigfilechunking |
|
||||||
bools |
|
||||||
bulkupload |
|
||||||
commenters |
|
||||||
csapi |
|
||||||
datetime |
|
||||||
deletedshares |
|
||||||
dialin |
|
||||||
dialout |
|
||||||
displayname |
|
||||||
etag |
|
||||||
fediverse |
|
||||||
getapppassword |
|
||||||
groupid |
|
||||||
hostedsignalingserver |
|
||||||
hovercard |
|
||||||
iscustomavatar |
|
||||||
itemsperpage |
|
||||||
keepalive |
|
||||||
keypair |
|
||||||
lastmod |
|
||||||
licence |
|
||||||
logfile |
|
||||||
logoheader |
|
||||||
matterbridge |
|
||||||
mimetypes |
|
||||||
mountpoint |
|
||||||
navigations |
|
||||||
nextcloud |
|
||||||
nextcloud's |
|
||||||
openlocaleditor |
|
||||||
organisation |
|
||||||
prio |
|
||||||
productname |
|
||||||
publicpreview |
|
||||||
publicshare |
|
||||||
publicshareauth |
|
||||||
replyable |
|
||||||
requesttrial |
|
||||||
reshares |
|
||||||
resharing |
|
||||||
rgdnvw |
|
||||||
setsip |
|
||||||
shareapi |
|
||||||
sharebymail |
|
||||||
sharee |
|
||||||
shareesapi |
|
||||||
shareinfo |
|
||||||
statuscode |
|
||||||
stime |
|
||||||
stunservers |
|
||||||
stylesheet |
|
||||||
subadmin |
|
||||||
subadmins |
|
||||||
subfiles |
|
||||||
subline |
|
||||||
tasktypes |
|
||||||
textprocessing |
|
||||||
totalitems |
|
||||||
transferownership |
|
||||||
trashbin |
|
||||||
turnservers |
|
||||||
undelete |
|
||||||
unifiedpush |
|
||||||
unsharing |
|
||||||
unstar |
|
||||||
updatenotification |
|
||||||
uppush |
|
||||||
usercount |
|
||||||
usergroup |
|
||||||
userid |
|
||||||
userroom |
|
||||||
versionstring |
|
||||||
whatsnew |
|
@ -1,72 +0,0 @@ |
|||||||
aarch |
|
||||||
allprojects |
|
||||||
appindicator |
|
||||||
autoptr |
|
||||||
buildscript |
|
||||||
buildsystem |
|
||||||
buildx |
|
||||||
cest |
|
||||||
classpath |
|
||||||
cloc |
|
||||||
commitlint |
|
||||||
dapplication |
|
||||||
dartdoc |
|
||||||
dists |
|
||||||
dockerenv |
|
||||||
endforeach |
|
||||||
endfunction |
|
||||||
endlegend |
|
||||||
endswith |
|
||||||
enduml |
|
||||||
euxo |
|
||||||
exiftool |
|
||||||
extglob |
|
||||||
fehguy |
|
||||||
freedesktop |
|
||||||
fullpath |
|
||||||
gboolean |
|
||||||
gchar |
|
||||||
genhtml |
|
||||||
hicolor |
|
||||||
icudtl |
|
||||||
inkscape |
|
||||||
intellij |
|
||||||
jetbrains |
|
||||||
jsonpatch |
|
||||||
jvmargs |
|
||||||
klass |
|
||||||
lcov |
|
||||||
libapp |
|
||||||
libappindicator |
|
||||||
libayatana |
|
||||||
libflutter |
|
||||||
libgtk |
|
||||||
libindicator |
|
||||||
libsqlite |
|
||||||
mipmap |
|
||||||
ndebug |
|
||||||
nodoc |
|
||||||
nonintegers |
|
||||||
nproc |
|
||||||
openrelay |
|
||||||
openrelayprojectsecret |
|
||||||
palo |
|
||||||
petstore |
|
||||||
plantuml |
|
||||||
precache |
|
||||||
puml |
|
||||||
rpath |
|
||||||
signoff |
|
||||||
startuml |
|
||||||
staticauth |
|
||||||
stdlib |
|
||||||
strconcat |
|
||||||
strdupv |
|
||||||
strfreev |
|
||||||
subprojects |
|
||||||
sysroot |
|
||||||
tsvg |
|
||||||
werror |
|
||||||
workdir |
|
||||||
xxxh |
|
||||||
xxxhdpi |
|
@ -1,50 +0,0 @@ |
|||||||
copymove |
|
||||||
dasl |
|
||||||
davgetcontentlength |
|
||||||
davgetcontenttype |
|
||||||
davgetetag |
|
||||||
davgetlastmodified |
|
||||||
davresourcetype |
|
||||||
fileid |
|
||||||
getcontentlength |
|
||||||
getcontenttype |
|
||||||
getetag |
|
||||||
getlastmodified |
|
||||||
largefile |
|
||||||
mkcol |
|
||||||
multistatus |
|
||||||
nccreationtime |
|
||||||
ncdatafingerprint |
|
||||||
nchaspreview |
|
||||||
ncisencrypted |
|
||||||
ncmetadataetag |
|
||||||
ncmounttype |
|
||||||
ncnote |
|
||||||
ncrichworkspace |
|
||||||
ncuploadtime |
|
||||||
nodestcoll |
|
||||||
noncoll |
|
||||||
noparent |
|
||||||
occommentscount |
|
||||||
occommentshref |
|
||||||
occommentsunread |
|
||||||
ocdownloadurl |
|
||||||
ocfavorite |
|
||||||
ocfileid |
|
||||||
ocid |
|
||||||
ocmsharepermissions |
|
||||||
ocownerdisplayname |
|
||||||
ocownerid |
|
||||||
ocpermissions |
|
||||||
ocsize |
|
||||||
ocssharepermissions |
|
||||||
owncloud |
|
||||||
propertyupdate |
|
||||||
propfind |
|
||||||
proppatch |
|
||||||
propstat |
|
||||||
propstats |
|
||||||
resourcetype |
|
||||||
sharees |
|
||||||
systemtag |
|
||||||
webdav |
|
@ -1,4 +1,4 @@ |
|||||||
{ |
{ |
||||||
"flutterSdkVersion": "3.16.0", |
"flutterSdkVersion": "3.13.0@stable", |
||||||
"flavors": {} |
"flavors": {} |
||||||
} |
} |
@ -0,0 +1,86 @@ |
|||||||
|
version: 2 |
||||||
|
updates: |
||||||
|
- package-ecosystem: "github-actions" |
||||||
|
directory: "/" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "gradle" |
||||||
|
directory: "/packages/app/android" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/app" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/dynamite/dynamite" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/dynamite/dynamite_runtime" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/file_icons" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/neon/neon" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/neon/neon_files" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/neon/neon_news" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/neon/neon_notes" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/neon/neon_notifications" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/nextcloud" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
||||||
|
- package-ecosystem: "pub" |
||||||
|
directory: "/packages/sort_box" |
||||||
|
schedule: |
||||||
|
interval: "daily" |
||||||
|
labels: |
||||||
|
- "dependencies" |
@ -1,64 +0,0 @@ |
|||||||
{ |
|
||||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json", |
|
||||||
"extends": [ |
|
||||||
"config:best-practices" |
|
||||||
], |
|
||||||
"labels": [ |
|
||||||
"dependencies" |
|
||||||
], |
|
||||||
"rangeStrategy": "bump", |
|
||||||
"lockFileMaintenance": { |
|
||||||
"enabled": true, |
|
||||||
"automerge": true |
|
||||||
}, |
|
||||||
"packageRules": [ |
|
||||||
{ |
|
||||||
"matchManagers": ["pub"], |
|
||||||
"matchDatasources": ["dart-version", "flutter-version"], |
|
||||||
"matchUpdateTypes": [ |
|
||||||
"minor", |
|
||||||
"patch" |
|
||||||
], |
|
||||||
"enabled": false |
|
||||||
}, |
|
||||||
{ |
|
||||||
"matchManagers": ["pub"], |
|
||||||
"matchDepTypes": ["dependencies"], |
|
||||||
"matchUpdateTypes": [ |
|
||||||
"minor", |
|
||||||
"patch" |
|
||||||
], |
|
||||||
"enabled": false |
|
||||||
}, |
|
||||||
{ |
|
||||||
"groupName": "built_value", |
|
||||||
"matchPackagePatterns": "^built" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"groupName": "go_router", |
|
||||||
"matchPackagePatterns": "^go_router" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"groupName": "sqflite", |
|
||||||
"matchPackagePatterns": "^sqflite" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"groupName": "unifiedpush", |
|
||||||
"matchPackagePatterns": "^unifiedpush" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"groupName": "xml_serializable", |
|
||||||
"matchPackageNames": [ |
|
||||||
"xml_annotation", |
|
||||||
"xml_serializable" |
|
||||||
] |
|
||||||
}, |
|
||||||
{ |
|
||||||
"groupName": "json_serializable", |
|
||||||
"matchPackageNames": [ |
|
||||||
"json_annotation", |
|
||||||
"json_serializable" |
|
||||||
] |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
@ -1,94 +0,0 @@ |
|||||||
name: Generate |
|
||||||
on: |
|
||||||
pull_request: |
|
||||||
|
|
||||||
concurrency: |
|
||||||
group: generate-${{ github.head_ref || github.run_id }} |
|
||||||
cancel-in-progress: true |
|
||||||
|
|
||||||
jobs: |
|
||||||
changes: |
|
||||||
name: Check changes |
|
||||||
runs-on: ubuntu-22.04 |
|
||||||
outputs: |
|
||||||
src: ${{ steps.changes.outputs.src}} |
|
||||||
steps: |
|
||||||
- uses: dorny/paths-filter@v2 |
|
||||||
id: changes |
|
||||||
continue-on-error: true |
|
||||||
with: |
|
||||||
filters: | |
|
||||||
src: |
|
||||||
- external/** |
|
||||||
- tool/** |
|
||||||
- packages/dynamite/** |
|
||||||
- packages/nextcloud/** |
|
||||||
|
|
||||||
dart: |
|
||||||
name: Dart |
|
||||||
runs-on: ubuntu-22.04 |
|
||||||
needs: changes |
|
||||||
if: needs.changes.outputs.src != 'false' |
|
||||||
steps: |
|
||||||
- name: Checkout |
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 |
|
||||||
with: |
|
||||||
fetch-depth: 0 |
|
||||||
- name: Submodules |
|
||||||
run: git submodule update --init --depth 0 |
|
||||||
|
|
||||||
- name: Install dart |
|
||||||
uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d # v1 |
|
||||||
- name: Setup |
|
||||||
run: ./tool/setup.sh |
|
||||||
|
|
||||||
- name: Generate dynamite end to end test |
|
||||||
run: | |
|
||||||
./tool/generate-dynamite-e2e-test.sh |
|
||||||
if [ -n "$(git status --porcelain)" ]; then |
|
||||||
git --no-pager diff |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
|
|
||||||
- name: Generate dynamite petstore example |
|
||||||
run: | |
|
||||||
./tool/generate-dynamite-petstore-example.sh |
|
||||||
if [ -n "$(git status --porcelain)" ]; then |
|
||||||
git --no-pager diff |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
|
|
||||||
- name: Generate nextcloud |
|
||||||
run: | |
|
||||||
./tool/generate-nextcloud.sh |
|
||||||
if [ -n "$(git status --porcelain)" ]; then |
|
||||||
git --no-pager diff |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
|
|
||||||
openapi: |
|
||||||
name: OpenAPI |
|
||||||
runs-on: ubuntu-22.04 |
|
||||||
needs: changes |
|
||||||
if: needs.changes.outputs.src != 'false' |
|
||||||
steps: |
|
||||||
- name: Checkout |
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 |
|
||||||
with: |
|
||||||
fetch-depth: 0 |
|
||||||
- name: Submodules |
|
||||||
run: git submodule update --init --depth 0 |
|
||||||
|
|
||||||
- name: Install php |
|
||||||
uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # v2 |
|
||||||
with: |
|
||||||
php-version: '8.1' |
|
||||||
tools: composer |
|
||||||
|
|
||||||
- name: Generate specs |
|
||||||
run: | |
|
||||||
./tool/generate-specs.sh |
|
||||||
if [ -n "$(git status --porcelain)" ]; then |
|
||||||
git --no-pager diff |
|
||||||
exit 1 |
|
||||||
fi |
|
@ -1,28 +0,0 @@ |
|||||||
name: Neon |
|
||||||
on: |
|
||||||
pull_request: |
|
||||||
|
|
||||||
concurrency: |
|
||||||
group: neon-${{ github.head_ref || github.run_id }} |
|
||||||
cancel-in-progress: true |
|
||||||
|
|
||||||
jobs: |
|
||||||
untested-apis: |
|
||||||
name: Untested APIs |
|
||||||
runs-on: ubuntu-22.04 |
|
||||||
steps: |
|
||||||
- name: Checkout repository |
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 |
|
||||||
|
|
||||||
- name: Find untested Neon APIs |
|
||||||
run: ./tool/find-untested-neon-apis.sh |
|
||||||
|
|
||||||
dart-io-usage: |
|
||||||
name: dart:io usage |
|
||||||
runs-on: ubuntu-22.04 |
|
||||||
steps: |
|
||||||
- name: Checkout repository |
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 |
|
||||||
|
|
||||||
- name: Find dart:io usage |
|
||||||
run: ./tool/find-dart-io-usage.sh |
|
@ -1,12 +0,0 @@ |
|||||||
name: 'Check spelling' |
|
||||||
on: |
|
||||||
pull_request: |
|
||||||
|
|
||||||
jobs: |
|
||||||
spellcheck: |
|
||||||
runs-on: ubuntu-22.04 |
|
||||||
steps: |
|
||||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 |
|
||||||
- uses: streetsidesoftware/cspell-action@52cba17693dc12d7d8f521631037008a17c93e53 # v5 |
|
||||||
with: |
|
||||||
incremental_files_only: false |
|
@ -1,17 +1,6 @@ |
|||||||
.dart_tool |
/.dart_tool/ |
||||||
pubspec.lock |
/pubspec.lock |
||||||
|
|
||||||
packages/**/.idea |
|
||||||
packages/**/*.iml |
|
||||||
packages/**/*.symbols |
|
||||||
packages/**/*.log |
|
||||||
packages/**/.flutter-plugins |
|
||||||
packages/**/.flutter-plugins-dependencies |
|
||||||
packages/**/coverage |
packages/**/coverage |
||||||
packages/**/build |
|
||||||
packages/**/doc/api |
|
||||||
|
|
||||||
!packages/app/pubspec.lock |
|
||||||
|
|
||||||
# Melos reccomends not adding them to vcs but we need them as we don't use melos in CI |
# Melos reccomends not adding them to vcs but we need them as we don't use melos in CI |
||||||
# **/pubspec_overrides.yaml |
# **/pubspec_overrides.yaml |
||||||
|
@ -1,24 +1,24 @@ |
|||||||
[submodule "external/nextcloud-server"] |
[submodule "external/nextcloud-server"] |
||||||
path = external/nextcloud-server |
path = external/nextcloud-server |
||||||
url = https://github.com/nextcloud/server.git |
url = https://github.com/nextcloud/server.git |
||||||
|
[submodule "external/nextcloud-news"] |
||||||
|
path = external/nextcloud-news |
||||||
|
url = https://github.com/nextcloud/news.git |
||||||
[submodule "external/seti-ui"] |
[submodule "external/seti-ui"] |
||||||
path = external/seti-ui |
path = external/seti-ui |
||||||
url = https://github.com/jesseweed/seti-ui.git |
url = https://github.com/jesseweed/seti-ui.git |
||||||
|
[submodule "external/nextcloud-notes"] |
||||||
|
path = external/nextcloud-notes |
||||||
|
url = https://github.com/nextcloud/notes.git |
||||||
[submodule "external/nextcloud-notifications"] |
[submodule "external/nextcloud-notifications"] |
||||||
path = external/nextcloud-notifications |
path = external/nextcloud-notifications |
||||||
url = https://github.com/nextcloud/notifications.git |
url = https://github.com/nextcloud/notifications.git |
||||||
|
[submodule "external/nextcloud-uppush"] |
||||||
|
path = external/nextcloud-uppush |
||||||
|
url = https://github.com/UP-NextPush/server-app.git |
||||||
[submodule "external/flathub-shared-modules"] |
[submodule "external/flathub-shared-modules"] |
||||||
path = external/flathub-shared-modules |
path = external/flathub-shared-modules |
||||||
url = https://github.com/flathub/shared-modules.git |
url = https://github.com/flathub/shared-modules.git |
||||||
[submodule "external/nextcloud-spreed"] |
[submodule "external/nextcloud-openapi-extractor"] |
||||||
path = external/nextcloud-spreed |
path = external/nextcloud-openapi-extractor |
||||||
url = https://github.com/nextcloud/spreed |
url = https://github.com/nextcloud/openapi-extractor |
||||||
[submodule "external/nextcloud-news"] |
|
||||||
path = external/nextcloud-news |
|
||||||
url = https://github.com/nextcloud/news |
|
||||||
[submodule "external/nextcloud-notes"] |
|
||||||
path = external/nextcloud-notes |
|
||||||
url = https://github.com/nextcloud/notes |
|
||||||
[submodule "external/openapi-specification"] |
|
||||||
path = external/openapi-specification |
|
||||||
url = https://github.com/OAI/OpenAPI-Specification.git |
|
||||||
|
@ -1,4 +1,4 @@ |
|||||||
#!/usr/bin/env sh |
#!/usr/bin/env sh |
||||||
. "$(dirname -- "$0")/_/husky.sh" |
. "$(dirname -- "$0")/_/husky.sh" |
||||||
|
|
||||||
fvm dart run commitlint_cli --edit "$1" |
dart run commitlint_cli --edit "$1" |
||||||
|
@ -1,9 +0,0 @@ |
|||||||
{ |
|
||||||
"recommendations": [ |
|
||||||
"dart-code.dart-code", |
|
||||||
"dart-code.flutter", |
|
||||||
"jebbs.plantuml", |
|
||||||
"redhat.vscode-yaml", |
|
||||||
"streetsidesoftware.code-spell-checker" |
|
||||||
] |
|
||||||
} |
|
@ -1,74 +1,70 @@ |
|||||||
# Neon |
# neon |
||||||
|
|
||||||
<img src="assets/logo.svg" alt="Neon logo" width="200"/> |
<img src="assets/logo.svg" alt="Neon logo" width="200"/> |
||||||
|
|
||||||
A framework for building convergent cross-platform Nextcloud clients using Flutter. |
A framework for building convergent cross-platform Nextcloud clients using Flutter. |
||||||
|
|
||||||
## The goals of Neon |
## Features |
||||||
|
|
||||||
The Neon project has three main goals: |
See [here](packages/app/README.md) for screenshots. |
||||||
|
|
||||||
1. The [Neon framework](packages/neon/neon) does the heavy lifting for Nextcloud client developers. Neon already handles the authentication flow and manages data requests and caching. This means that developers can reuse a lot of the code and do not need to reinvent the wheel. |
- :heavy_check_mark: Supported |
||||||
2. The [Neon app](packages/app) is a cross-platform Nextcloud client that runs on iOS, Android, macOS, Windows, Linux and Web. We already support Android and Linux with the other platforms being work in progress. |
- :rocket: Planned |
||||||
3. The [Neon app](packages/app) is a multi client app. This means that you can have multiple clients in the same mobile app. It enables seamless switching between multiple apps as Nextcloud users have enjoyed on the web forever. |
|
||||||
|
| App | Status | |
||||||
|
|---------------|--------------------| |
||||||
|
| Files | :heavy_check_mark: | |
||||||
|
| News | :heavy_check_mark: | |
||||||
|
| Notes | :heavy_check_mark: | |
||||||
|
| Notifications | :heavy_check_mark: | |
||||||
|
| Activity | :rocket: | |
||||||
|
| Calendar | :rocket: | |
||||||
|
| Contacts | :rocket: | |
||||||
|
| Cookbook | :rocket: | |
||||||
|
| Dashboard | :rocket: | |
||||||
|
| Photos | :rocket: | |
||||||
|
| Talk | :rocket: | |
||||||
|
| Tasks | :rocket: | |
||||||
|
|
||||||
|
## Problems with other clients and how this project tries to solve them |
||||||
|
|
||||||
### Current problems with other clients |
### Current problems with other clients |
||||||
|
|
||||||
|
_Excerpt from my job application to Nextcloud:_ |
||||||
|
|
||||||
- There are many clients that are designed to run exclusively on a single platform or device type. They all have different code bases, which makes feature parity and maintenance much more difficult. |
- There are many clients that are designed to run exclusively on a single platform or device type. They all have different code bases, which makes feature parity and maintenance much more difficult. |
||||||
- The user experience and features differ significantly from platform to platform, which leads to frustration. This particularly affects mobile devices running Linux (e.g. postmarketOS). There is no suitable client on this platform at all. Using the desktop Linux client for file synchronization would probably work, but it still lacks almost all the features available on e.g. Android and the client is not converging to the needs of a mobile screens. |
- The user experience and features differ significantly from platform to platform, which leads to frustration. This particularly affects mobile devices running Linux (e.g. postmarketOS). There is no suitable client on this platform at all. Using the desktop Linux client for file synchronization would probably work, but this platform still lacks almost all the features available on e.g. Android and the client is not made for mobile screens. Someone who uses Linux on their mobile device is likely also interested in Nextcloud, so the need for a solution is definitely there. |
||||||
- Even on feature-rich platforms, features are spread across multiple apps, making it more complicated for the user who simply wants to get the most out of their Nextcloud server on their device. |
- Even on feature-rich platforms, features are spread across multiple apps (e.g. on Android), making it more complicated for the user who simply wants to get the most out of their Nextcloud server on their device. |
||||||
|
|
||||||
### How Neon as a framework tries to solve them |
### How Neon as a framework tries to solve them |
||||||
|
|
||||||
The Neon project uses [Dart](https://dart.dev/) and [Flutter](https://flutter.dev/) to help mobile client developers building apps. Flutter allows us to build convergent cross-platform clients that feel native. |
This project uses OpenAPI specifications to generate all the necessary API client code. |
||||||
We are a 100% FOSS framework and do not rely on any proprietary libraries making it easy for developers to publish their apps in places like the [F-Droid](https://f-droid.org/) store. |
This vastly reduces the developer efforts of writing a lot of boilerplate code and having to look at the PHP source code. |
||||||
We provide a generated [Nextcloud Dart client](packages/nextcloud) that is generated from the new OpenAPI specifications shipped with Nextcloud and is already being used by other Dart and Flutter projects. Gone are the days of looking at the PHP code and implementing an API client by hand which can be time-consuming and very error-prone. |
Most server APIs were not well or at all documented until now (there are some exceptions). |
||||||
|
Based on this work a project at the Nextcloud company started for adopting OpenAPI to document the server APIs. |
||||||
|
The OpenAPI specifications are generated completely automated from the source code (although some changes to the type annotations are required) and are validated with static analysis of the PHP code. |
||||||
|
These efforts are not done yet, but this project basically became the front-line for testing the automatically generated specifications. |
||||||
|
|
||||||
We provide abstractions, common utilities and prebuilt UI components (called Widgets in Flutter) that can be re-used. This allows Neon to make developing a new Nextcloud client as easy as adding a few custom UI elements and the necessary state management, while everything else is already taken care of for you. |
We use flutter because of its cross-platform capabilities. |
||||||
|
To decrease the developer burden, a lot of useful widgets and utilities have been developed, so that they can be re-used. |
||||||
|
Trying to make everything re-usable is a major goal of this project, as we want to close the gap between platforms and functionalities and make development of new clients and apps enjoyable and fast. |
||||||
|
Developing a new Nextcloud client can be as easy as adding some UI and then necessary state management, everything else is taken care of for you. |
||||||
|
|
||||||
## Contributing |
## Contributing |
||||||
|
|
||||||
We encourage every client developer to contribute their app implementation back into Neon. |
Checkout our [contributing docs](CONTRIBUTING.md) to get started with developing with Neon. |
||||||
This way the app developers can choose from a large set of clients to enable. |
|
||||||
Check out our [contributing docs](CONTRIBUTING.md) to get started with developing with Neon. |
|
||||||
|
|
||||||
We have a lot of [documentation](docs) from helping you set up your development environment to our guidelines. |
|
||||||
Please make sure to read them before starting to contribute. |
|
||||||
|
|
||||||
## Development and support |
## Development and support |
||||||
|
|
||||||
We have a Matrix space where you can ask questions: https://matrix.to/#/#nextcloud-neon:matrix.org |
We have a Matrix space where you can ask questions: https://matrix.to/#/#nextcloud-neon:matrix.org |
||||||
|
|
||||||
## Features |
## Documentation |
||||||
|
|
||||||
See [here](packages/app/README.md) for screenshots. |
See [docs](./docs). |
||||||
|
|
||||||
- :heavy_check_mark: Supported |
|
||||||
- :construction: Work in progress |
|
||||||
- :rocket: Planned |
|
||||||
|
|
||||||
| App | Status | |
|
||||||
|---------------------------------------------------|--------------------| |
|
||||||
| [Dashboard](packages/neon/neon_dashboard) | :heavy_check_mark: | |
|
||||||
| [Files](packages/neon/neon_files) | :heavy_check_mark: | |
|
||||||
| [News](packages/neon/neon_news) | :heavy_check_mark: | |
|
||||||
| [Notes](packages/neon/neon_notes) | :heavy_check_mark: | |
|
||||||
| [Notifications](packages/neon/neon_notifications) | :heavy_check_mark: | |
|
||||||
| Activity | :rocket: | |
|
||||||
| Calendar | :rocket: | |
|
||||||
| Contacts | :rocket: | |
|
||||||
| Cookbook | :rocket: | |
|
||||||
| Photos | :rocket: | |
|
||||||
| Talk | :rocket: | |
|
||||||
| Tasks | :rocket: | |
|
||||||
|
|
||||||
## Platform support |
## Platform support |
||||||
|
|
||||||
| Platform | Progress | |
Except for web, Neon should run on all supported Flutter platforms in the future. |
||||||
|-----------|--------------------| |
Right now this is not the case, only Android and Linux are supported and tested, but this can easily be extended to other platforms. |
||||||
| Android | :heavy_check_mark: | |
|
||||||
| iOS | :construction: | |
The features and problems of all platforms should be considered when implementing new features. |
||||||
| MacOS | :construction: | |
|
||||||
| Linux | :heavy_check_mark: | |
|
||||||
| Windows | :rocket: | |
|
||||||
| Web | :construction: | |
|
||||||
|
@ -1,11 +0,0 @@ |
|||||||
Copyright (c) 2023 provokateurin. |
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. |
|
||||||
|
|
||||||
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. |
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
@ -1,56 +0,0 @@ |
|||||||
{ |
|
||||||
"version": "0.2", |
|
||||||
"language": "en", |
|
||||||
"useGitignore": true, |
|
||||||
"enableGlobDot": false, |
|
||||||
"words": [ |
|
||||||
"OpenAPI" |
|
||||||
], |
|
||||||
"ignorePaths": [ |
|
||||||
"**.svg", |
|
||||||
"**/assets", |
|
||||||
"**/l10n/!(en.arb)", |
|
||||||
"external", |
|
||||||
"packages/dynamite/dynamite_petstore_example/lib", |
|
||||||
"packages/file_icons/lib/src/data.dart", |
|
||||||
"packages/neon_lints/lib", |
|
||||||
"tool/dev/static" |
|
||||||
], |
|
||||||
"dictionaries": [ |
|
||||||
"bash", |
|
||||||
"dart_flutter", |
|
||||||
"en_US", |
|
||||||
"misc", |
|
||||||
"neon", |
|
||||||
"nextcloud", |
|
||||||
"softwareTerms", |
|
||||||
"tools", |
|
||||||
"webdav" |
|
||||||
], |
|
||||||
"dictionaryDefinitions": [ |
|
||||||
{ |
|
||||||
"name": "dart_flutter", |
|
||||||
"path": ".cspell/dart_flutter.txt" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "misc", |
|
||||||
"path": ".cspell/misc.txt" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "neon", |
|
||||||
"path": ".cspell/neon.txt" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "nextcloud", |
|
||||||
"path": ".cspell/nextcloud.txt" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "tools", |
|
||||||
"path": ".cspell/tools.txt" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "webdav", |
|
||||||
"path": ".cspell/webdav.txt" |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
@ -1,35 +0,0 @@ |
|||||||
include: package:neon_lints/dartdoc_options.yaml |
|
||||||
|
|
||||||
dartdoc: |
|
||||||
nodoc: ['lib/l10n/*.dart'] |
|
||||||
showUndocumentedCategories: true |
|
||||||
ignore: |
|
||||||
## Errors that are ignored: |
|
||||||
## Warnings that are ignored: |
|
||||||
- reexported-private-api-across-packages |
|
||||||
## Default ignores for dartdoc: |
|
||||||
errors: |
|
||||||
## Default errors of dartdoc: |
|
||||||
- duplicate-file |
|
||||||
- invalid-parameter |
|
||||||
- tool-error |
|
||||||
- unresolved-export |
|
||||||
## Warnings that are elevated to errors: |
|
||||||
- ambiguous-doc-reference |
|
||||||
- ambiguous-reexport |
|
||||||
- broken-link |
|
||||||
- category-order-gives-missing-package-name |
|
||||||
- deprecated |
|
||||||
- ignored-canonical-for |
|
||||||
- missing-from-search-index |
|
||||||
- no-canonical-found |
|
||||||
- no-documentable-libraries |
|
||||||
- no-library-level-docs |
|
||||||
- orphaned-file |
|
||||||
- unknown-file |
|
||||||
- unknown-macro |
|
||||||
- unresolved-doc-reference |
|
||||||
## Ignores that are elevated to errors: |
|
||||||
# - type-as-html # broken, https://github.com/dart-lang/dartdoc/issues/3545 |
|
||||||
- missing-constant-constructor |
|
||||||
- missing-code-block-language |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@ -1,8 +0,0 @@ |
|||||||
# Dependencies |
|
||||||
|
|
||||||
We follow the guidelines outlined in https://dart.dev/tools/pub/dependencies with some rules and automatic workflows: |
|
||||||
1. We use the caret notation with the major version set to the latest major version and the minor and patch versions set to `0`. The constraint will be updated in case we need a particular feature or bug fix that was released in a newer version. |
|
||||||
2. Dev dependencies should be pinned to the latest versions since they do not affect consumers of our packages. |
|
||||||
3. Using Renovate we automatically update our dependency constraints. For non-dev dependencies this will be the latest major version, for everything else it will upgrade to the latest minor and patch versions as well. The lock files are also kept up-to-date with Renovate to compile everything with the latest available versions. |
|
||||||
4. The same rules and automatic workflows apply to the Dart and Flutter versions we use. |
|
||||||
5. The `app` package does not constrain the versions so the latest versions can be used. |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@ -1,11 +0,0 @@ |
|||||||
# Workflows |
|
||||||
|
|
||||||
## Adding a new package to the Neon project |
|
||||||
|
|
||||||
If you need to add a new package to the Neon project please make sure to execute all the following steps: |
|
||||||
1. Use the according template by running `fvm dart create -t package package_name` or `fvm flutter create -t package package_name`. |
|
||||||
2. Make sure to activate our strict linting by adding it to the package. |
|
||||||
3. Regenerate the dependency overrides by executing `melos bootstrap`. |
|
||||||
4. Add a Symlink to our main [license](../assets/AGPL-3.0.txt). |
|
||||||
5. Update [commitlint.yaml](../commitlint.yaml) by adding the new package name. |
|
||||||
6. Remove the package `.gitignore` (a global `.gitignore` for all packages is used instead). |
|
@ -1 +1 @@ |
|||||||
Subproject commit d56d4b4d4eaeaf71fd25298596e032073fea9056 |
Subproject commit 144d6d188e2280896f6cacc2218e583d939b4407 |
@ -1 +1 @@ |
|||||||
Subproject commit 0785e69d2b65cf3ed0347c6da0f38dc0e9ed6903 |
Subproject commit 50e881eb151ec5b94fa2bfe0b94c5cd3bbc2acc7 |
@ -1 +1 @@ |
|||||||
Subproject commit ba53fd66d1bf421765b0b6678aad868bae5a3889 |
Subproject commit 09d3a1c9abcdd1c0ec4d8531907b56ac9f368666 |
@ -0,0 +1 @@ |
|||||||
|
Subproject commit 5940a175e352d3cf7780e1c50dd572dfe04523b3 |
@ -1 +1 @@ |
|||||||
Subproject commit 4154ba343b9b188e40f327fb78d9eb5083e163a1 |
Subproject commit 8606f162c5b5b5d6a355e7e2f27e05585b3d0360 |
@ -1 +0,0 @@ |
|||||||
Subproject commit 7489cced7336f83d477aeda5c902f5bb08ebddfd |
|
@ -0,0 +1 @@ |
|||||||
|
Subproject commit 5ae33f4ebae9e478d40d2c776d9d305a58a829aa |
@ -1 +0,0 @@ |
|||||||
Subproject commit f73731dd34ffbf68512a363b579504b294986b53 |
|
@ -0,0 +1,48 @@ |
|||||||
|
# Miscellaneous |
||||||
|
*.class |
||||||
|
*.log |
||||||
|
*.pyc |
||||||
|
*.swp |
||||||
|
.DS_Store |
||||||
|
.atom/ |
||||||
|
.buildlog/ |
||||||
|
.history |
||||||
|
.svn/ |
||||||
|
|
||||||
|
# IntelliJ related |
||||||
|
*.iml |
||||||
|
*.ipr |
||||||
|
*.iws |
||||||
|
.idea/ |
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in |
||||||
|
# VS Code which you may wish to be included in version control, so this line |
||||||
|
# is commented out by default. |
||||||
|
#.vscode/ |
||||||
|
|
||||||
|
# Flutter/Dart/Pub related |
||||||
|
**/doc/api/ |
||||||
|
**/ios/Flutter/.last_build_id |
||||||
|
.dart_tool/ |
||||||
|
.flutter-plugins |
||||||
|
.flutter-plugins-dependencies |
||||||
|
.packages |
||||||
|
.pub-cache/ |
||||||
|
.pub/ |
||||||
|
/build/ |
||||||
|
|
||||||
|
# Web related |
||||||
|
lib/generated_plugin_registrant.dart |
||||||
|
|
||||||
|
# Symbolication related |
||||||
|
app.*.symbols |
||||||
|
|
||||||
|
# Obfuscation related |
||||||
|
app.*.map.json |
||||||
|
|
||||||
|
# Android Studio will place build artifacts here |
||||||
|
/android/app/debug |
||||||
|
/android/app/profile |
||||||
|
/android/app/release |
||||||
|
|
||||||
|
.flatpak-builder/ |
@ -1,33 +0,0 @@ |
|||||||
# This file tracks properties of this Flutter project. |
|
||||||
# Used by Flutter tool to assess capabilities and perform upgrades etc. |
|
||||||
# |
|
||||||
# This file should be version controlled and should not be manually edited. |
|
||||||
|
|
||||||
version: |
|
||||||
revision: "ead455963c12b453cdb2358cad34969c76daf180" |
|
||||||
channel: "stable" |
|
||||||
|
|
||||||
project_type: app |
|
||||||
|
|
||||||
# Tracks metadata for the flutter migrate command |
|
||||||
migration: |
|
||||||
platforms: |
|
||||||
- platform: root |
|
||||||
create_revision: ead455963c12b453cdb2358cad34969c76daf180 |
|
||||||
base_revision: ead455963c12b453cdb2358cad34969c76daf180 |
|
||||||
- platform: android |
|
||||||
create_revision: ead455963c12b453cdb2358cad34969c76daf180 |
|
||||||
base_revision: ead455963c12b453cdb2358cad34969c76daf180 |
|
||||||
- platform: linux |
|
||||||
create_revision: ead455963c12b453cdb2358cad34969c76daf180 |
|
||||||
base_revision: ead455963c12b453cdb2358cad34969c76daf180 |
|
||||||
|
|
||||||
# User provided section |
|
||||||
|
|
||||||
# List of Local paths (relative to this file) that should be |
|
||||||
# ignored by the migrate tool. |
|
||||||
# |
|
||||||
# Files that are not part of the templates will be ignored by default. |
|
||||||
unmanaged_files: |
|
||||||
- 'lib/main.dart' |
|
||||||
- 'ios/Runner.xcodeproj/project.pbxproj' |
|
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 616 B After Width: | Height: | Size: 499 B |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 421 B After Width: | Height: | Size: 337 B |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 779 B After Width: | Height: | Size: 583 B |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 843 B |
Before Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.1 KiB |
@ -1,7 +1,6 @@ |
|||||||
arb-dir: lib/l10n |
arb-dir: ../neon/neon/lib/l10n |
||||||
template-arb-file: en.arb |
template-arb-file: en.arb |
||||||
output-localization-file: localizations.dart |
output-localization-file: localizations.dart |
||||||
synthetic-package: false |
synthetic-package: false |
||||||
output-class: DashboardLocalizations |
output-dir: ../neon/neon/lib/l10n |
||||||
output-dir: lib/l10n |
|
||||||
nullable-getter: false |
nullable-getter: false |
@ -1,15 +1,20 @@ |
|||||||
import 'package:neon/models.dart'; |
import 'package:neon/models.dart'; |
||||||
import 'package:neon_dashboard/neon_dashboard.dart'; |
import 'package:neon/platform.dart'; |
||||||
|
import 'package:neon/utils.dart'; |
||||||
import 'package:neon_files/neon_files.dart'; |
import 'package:neon_files/neon_files.dart'; |
||||||
import 'package:neon_news/neon_news.dart'; |
import 'package:neon_news/neon_news.dart'; |
||||||
import 'package:neon_notes/neon_notes.dart'; |
import 'package:neon_notes/neon_notes.dart'; |
||||||
import 'package:neon_notifications/neon_notifications.dart'; |
import 'package:neon_notifications/neon_notifications.dart'; |
||||||
|
import 'package:shared_preferences/shared_preferences.dart'; |
||||||
|
|
||||||
/// The collection of clients enabled for the Neon app. |
List<AppImplementation> getAppImplementations( |
||||||
final Set<AppImplementation> appImplementations = { |
final SharedPreferences sharedPreferences, |
||||||
DashboardApp(), |
final RequestManager requestManager, |
||||||
FilesApp(), |
final NeonPlatform platform, |
||||||
NewsApp(), |
) => |
||||||
NotesApp(), |
[ |
||||||
NotificationsApp(), |
FilesApp(sharedPreferences, requestManager, platform), |
||||||
}; |
NewsApp(sharedPreferences, requestManager, platform), |
||||||
|
NotesApp(sharedPreferences, requestManager, platform), |
||||||
|
NotificationsApp(sharedPreferences, requestManager, platform), |
||||||
|
]; |
||||||
|
@ -1,30 +1,23 @@ |
|||||||
import 'dart:ui'; |
import 'dart:ui'; |
||||||
|
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart'; |
||||||
import 'package:neon/theme.dart'; |
import 'package:neon/theme.dart'; |
||||||
import 'package:vector_graphics/vector_graphics.dart'; |
|
||||||
|
|
||||||
/// The custom theme used in the Neon app. |
final neonTheme = NeonTheme( |
||||||
const neonTheme = NeonTheme( |
|
||||||
branding: branding, |
branding: branding, |
||||||
colorScheme: colorScheme, |
colorScheme: colorScheme, |
||||||
); |
); |
||||||
|
|
||||||
/// The custom branding used in the Neon app. |
final branding = Branding( |
||||||
const branding = Branding( |
|
||||||
name: 'Nextcloud Neon', |
name: 'Nextcloud Neon', |
||||||
logo: VectorGraphic( |
logo: SvgPicture.asset( |
||||||
|
'assets/logo.svg', |
||||||
width: 100, |
width: 100, |
||||||
height: 100, |
height: 100, |
||||||
loader: AssetBytesLoader( |
|
||||||
'assets/logo.svg.vec', |
|
||||||
), |
|
||||||
), |
), |
||||||
sourceCodeURL: 'https://github.com/nextcloud/neon', |
|
||||||
issueTrackerURL: 'https://github.com/nextcloud/neon/issues', |
|
||||||
legalese: 'Copyright © 2023, provokateurin\nUnder GPLv3 license', |
legalese: 'Copyright © 2023, provokateurin\nUnder GPLv3 license', |
||||||
); |
); |
||||||
|
|
||||||
/// The custom color scheme used in the Neon app. |
|
||||||
const colorScheme = NeonColorScheme( |
const colorScheme = NeonColorScheme( |
||||||
primary: Color(0xFFF37736), |
primary: Color(0xFFF37736), |
||||||
); |
); |
||||||
|
Before Width: | Height: | Size: 505 KiB After Width: | Height: | Size: 358 KiB |
Before Width: | Height: | Size: 417 KiB After Width: | Height: | Size: 286 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 754 KiB |
Before Width: | Height: | Size: 482 KiB After Width: | Height: | Size: 340 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 420 KiB |
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 446 KiB After Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 508 KiB After Width: | Height: | Size: 351 KiB |
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 240 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 147 KiB |