Initial commit

This commit is contained in:
dominik-zeglen 2019-06-19 16:40:52 +02:00
commit 5d959e6d6e
1168 changed files with 205791 additions and 0 deletions

37
.codeclimate.yml Normal file
View file

@ -0,0 +1,37 @@
engines:
eslint:
enabled: true
channel: eslint-4
isort:
enabled: true
channel: beta
pep8:
enabled: true
pylint:
enabled: true
channel: beta
plugins:
- celery
- django
checks:
import-error:
enabled: false
tslint:
enabled: true
config: tslint.json
duplication:
enabled: true
config:
languages:
python:
mass_threshold: 100
python_version: 3
exclude_patterns:
- ".*"
- "**/__pycache__/"
- "**/migrations/"
- "node_modules/"
- "tests/"
ratings:
paths:
- saleor/**

40
.gitignore vendored Normal file
View file

@ -0,0 +1,40 @@
*.py[cod]
.*
!.babelrc
!.circleci
!.codeclimate.yml
!.coveragerc
!.dockerignore
!.eslintrc.json
!.flowconfig
!.gqlconfig
!.github
!.gitignore
!.nvmrc
!.npmrc
!.plop
!.pylintrc
!.travis*
!.tx
*.css
*.log
*.pot
*.pyc
local_settings.py
__pycache__/
build/
coverage/
dist/
*\.egg*
# data
/docs/_build/
/media/
/node_modules/
/static/
/saleor/static/assets/
webpack-bundle.json
/templates/templated_email/compiled/*
!/templates/templated_email/compiled/.gitkeep
# Exported results file
django-queries-results.html

1
.npmrc Normal file
View file

@ -0,0 +1 @@
puppeteer_skip_chromium_download = true

73
.travis.yml Normal file
View file

@ -0,0 +1,73 @@
dist: xenial
language: python
sudo: false
python:
- "3.6"
- "3.7"
branches:
only:
- master
- /next\/.*/
cache:
pip: true
directories:
- node_modules
- $HOME/.cache/pip
install:
- pip install -U pip setuptools wheel
- pip install tox-travis pytest-django-queries
- git clone https://github.com/NyanKiyoshi/pytest-django-queries-ci-tools.git --depth 1 ../queries-ci-tools
- >
if [ -n "$DJANGO" ]; then
nvm install 10 \
&& npm i \
&& npm run build-assets --production \
&& npm run build-emails
fi
script:
- >
if [ -n "$DJANGO" ]; then
npm run test
fi
- tox
env:
global:
- DATABASE_URL="postgres://postgres@localhost:5432/saleor"
- SECRET_KEY="irrelevant"
- DIFF_RESULTS_BASE_URL="http://dhrwmpu5reeyd.cloudfront.net"
- QUERIES_RESULTS_PATH=/tmp/queries-results.json
matrix:
- DJANGO="2.2"
- DJANGO="master"
matrix:
fast_finish: true
include:
- env: TOXENV=black
python: "3.6"
- env: TOXENV=flake8
python: "3.6"
- env: TOXENV=check_gql_schema
python: "3.6"
- env: TOXENV=check_migrations
python: "3.6"
allow_failures:
- python: "3.6"
env: DJANGO="master"
- python: "3.7"
env: DJANGO="master"
services:
- postgresql
addons:
postgresql: 9.4
after_success:
- ../queries-ci-tools/handle-event.sh

517
CHANGELOG.md Normal file
View file

@ -0,0 +1,517 @@
# Changelog
All notable, unreleased changes to this project will be documented in this file. For the released changes, please visit the [Releases](https://github.com/mirumee/saleor/releases) page.
## [Unreleased Changeset: Attributes]
- The mutations `attributeCreate` and `attributeUpdate`:
- They no longer crash if no values were passed. - #4260 by @NyanKiyoshi
- They no longer accept the `productType` parameter and no longer return the attribute's `productType` in the root of the response; instead, you should query the attribute's `productType` manually. - #4260 by @NyanKiyoshi
- They now accept an optional `slug` input parameter for setting the internal representation of the attribute instead of always generating it. This allows users to have multiple attributes with the same name but that are different things or set of values. - #4260 by @NyanKiyoshi
- The `Attribute` model:
- They now always unique, instead of being unique only into a given product type. - #4260 by @NyanKiyoshi
- Attributes can now be associated to multiple product types. - #4266 by @NyanKiyoshi
- The `Attribute` model's `product_type` field was renamed to `product_types` (M2M related manager). - #4266 by @NyanKiyoshi
- Added `attributeAssign(...)` and `attributeUnassign(...)` mutations in the GraphQL API. - #4266 by @NyanKiyoshi
## [Unreleased]
- Fixed internal error when creating a checkout with a voucher code - #4292 by @NyanKiyoshi
- Add filter tab name as required - #4269 by @benekex2
- A few unused panels are now disabled by default from the debug toolbar; this should improve loading time when debugging - #4301 by @NyanKiyoshi
## 2.7.0
### API
- Create order only when payment is successful - #4154 by @NyanKiyoshi
- Order Events containing order lines or fulfillment lines now return the line object in the GraphQL API - #4114 by @NyanKiyoshi
- GraphQL now prints exceptions to stderr as well as returning them or not - #4148 by @NyanKiyoshi
- Refactored API resolvers to static methods with root typing - #4155 by @NyanKiyoshi
- Add phone validation in the GraphQL API to handle the library upgrade - #4156 by @NyanKiyoshi
### Core
- Add basic Gift Cards support in the backend - #4025 by @fowczarek
- Add the ability to sort products within a collection - #4123 by @NyanKiyoshi
- Implement customer events - #4094 by @NyanKiyoshi
- Merge "authorize" and "capture" operations - #4098 by @korycins, @NyanKiyoshi
- Separate the Django middlewares from the GraphQL API middlewares - #4102 by @NyanKiyoshi, #4186 by @cmiacz
### Dashboard 2.0
- Add navigation section - #4012 by @dominik-zeglen
- Add filtering on product list - #4193 by @dominik-zeglen
- Add filtering on orders list - #4237 by @dominik-zeglen
- Change input style and improve Storybook stories - #4115 by @dominik-zeglen
- Migrate deprecated fields in Dashboard 2.0 - #4121 by @benekex2
- Add multiple select checkbox - #4133, #4146 by @benekex2
- Rename menu items in Dashboard 2.0 - #4172 by @benekex2
- Category delete modal improvements - #4171 by @benekex2
- Close modals on click outside - #4236 - by @benekex2
- Use date localize hook in translations - #4202 by @dominik-zeglen
- Unify search API - #4200 by @dominik-zeglen
- Default default PAGINATE_BY - #4238 by @dominik-zeglen
- Create generic filtering interface - #4221 by @dominik-zeglen
- Add default state to rich text editor = #4281 by @dominik-zeglen
- Fix translation discard button - #4109 by @benekex2
- Fix draftail options and icons - #4132 by @benekex2
- Fix typos and messages in Dashboard 2.0 - #4168 by @benekex2
- Fix view all orders button - #4173 by @benekex2
- Fix visibility card view - #4198 by @benekex2
- Fix query refetch after selecting an object in list - #4272 by @dominik-zeglen
- Fix image selection in variants - #4270 by @benekex2
- Fix collection search - #4267 by @dominik-zeglen
- Fix quantity height in draft order edit - #4273 by @benekex2
- Fix checkbox clickable area size - #4280 by @dominik-zeglen
- Fix breaking object selection in menu section - #4282 by @dominik-zeglen
- Reset selected items when tab switch - #4268 by @benekex2
- Add attribute section - #4305 by @dominik-zeglen
### Other notable changes
- Add support for Google Cloud Storage - #4127 by @chetabahana
- Adding a nonexistent variant to checkout no longer crashes - #4166 by @NyanKiyoshi
- Disable storage of Celery results - #4169 by @NyanKiyoshi
- Disable polling in Playground - #4188 by @maarcingebala
- Cleanup code for updated function names and unused argument - #4090 by @jxltom
- Users can now add multiple "Add to Cart" forms in a single page - #4165 by @NyanKiyoshi
- Fix incorrect argument in `get_client_token` in Braintree integration - #4182 by @maarcingebala
- Fix resolving attribute values when transforming them to HStore - #4161 by @maarcingebala
- Fix wrong calculation of subtotal in cart page - #4145 by @korycins
- Fix margin calculations when product/variant price is set to zero - #4170 by @MahmoudRizk
- Fix applying discounts in checkout's subtotal calculation in API - #4192 by @maarcingebala
- Fix GATEWAYS_ENUM to always contain all implemented payment gateways - #4108 by @koradon
## 2.6.0
### API
- Add unified filtering interface in resolvers - #3952, #4078 by @korycins
- Add mutations for bulk actions - #3935, #3954, #3967, #3969, #3970 by @akjanik
- Add mutation for reordering menu items - #3958 by @NyanKiyoshi
- Optimize queries for single nodes - #3968 @NyanKiyoshi
- Refactor error handling in mutations #3891 by @maarcingebala & @akjanik
- Specify mutation permissions through Meta classes - #3980 by @NyanKiyoshi
- Unify pricing access in products and variants - #3948 by @NyanKiyoshi
- Use only_fields instead of exclude_fields in type definitions - #3940 by @michaljelonek
- Prefetch collections when getting sales of a bunch of products - #3961 by @NyanKiyoshi
- Remove unnecessary dedents from GraphQL schema so new Playground can work - #4045 by @salwator
- Restrict resolving payment by ID - #4009 @NyanKiyoshi
- Require `checkoutId` for updating checkout's shipping and billing address - #4074 by @jxltom
- Handle errors in `TokenVerify` mutation - #3981 by @fowczarek
- Unify argument names in types and resolvers - #3942 by @NyanKiyoshi
### Core
- Use Black as the default code formatting tool - #3852 by @krzysztofwolski and @NyanKiyoshi
- Dropped Python 3.5 support - #4028 by @korycins
- Rename Cart to Checkout - #3963 by @michaljelonek
- Use data classes to exchange data with payment gateways - #4028 by @korycins
- Refactor order events - #4018 by @NyanKiyoshi
### Dashboard 2.0
- Add bulk actions - #3955 by @dominik-zeglen
- Add user avatar management - #4030 by @benekex2
- Add navigation drawer support on mobile devices - #3839 by @benekex2
- Fix rendering validation errors in product form - #4024 by @benekex2
- Move dialog windows to query string rather than router paths - #3953 by @dominik-zeglen
- Update order events types - #4089 by @jxltom
- Code cleanup by replacing render props with react hooks - #4010 by @dominik-zeglen
### Other notable changes
- Add setting to enable Django Debug Toolbar - #3983 by @koradon
- Use newest GraphQL Playground - #3971 by @salwator
- Ensure adding to quantities in the checkout is respecting the limits - #4005 by @NyanKiyoshi
- Fix country area choices - #4008 by @fowczarek
- Fix price_range_as_dict function - #3999 by @zodiacfireworks
- Fix the product listing not showing in the voucher when there were products selected - #4062 by @NyanKiyoshi
- Fix crash in Dashboard 1.0 when updating an order address's phone number - #4061 by @NyanKiyoshi
- Reduce the time of tests execution by using dummy password hasher - #4083 by @korycins
- Set up explicit **hash** function - #3979 by @akjanik
- Unit tests use none as media root - #3975 by @korycins
- Update file field styles with materializecss template filter - #3998 by @zodiacfireworks
- New translations:
- Albanian
- Colombian Spanish
- Lithuanian
## 2.5.0
### API
- Add query to fetch draft orders - #3809 by @michaljelonek
- Add bulk delete mutations - #3838 by @michaljelonek
- Add `languageCode` enum to API - #3819 by @michaljelonek, #3854 by @jxltom
- Duplicate address instances in checkout mutations - #3866 by @pawelzar
- Restrict access to `orders` query for unauthorized users - #3861 by @pawelzar
- Support setting address as default in address mutations - #3787 by @jxltom
- Fix phone number validation in GraphQL when country prefix not given - #3905 by @patrys
- Report pretty stack traces in DEBUG mode - #3918 by @patrys
### Core
- Drop support for Django 2.1 and Django 1.11 (previous LTS) - #3929 by @patrys
- Fulfillment of digital products - #3868 by @korycins
- Introduce avatars for staff accounts - #3878 by @pawelzar
- Refactor the account avatars path from a relative to absolute - #3938 by @NyanKiyoshi
### Dashboard 2.0
- Add translations section - #3884 by @dominik-zeglen
- Add light/dark theme - #3856 by @dominik-zeglen
- Add customer's address book view - #3826 by @dominik-zeglen
- Add "Add variant" button on the variant details page = #3914 by @dominik-zeglen
- Add back arrows in "Configure" subsections - #3917 by @dominik-zeglen
- Display avatars in staff views - #3922 by @dominik-zeglen
- Prevent user from changing his own status and permissions - #3922 by @dominik-zeglen
- Fix crashing product create view - #3837, #3910 by @dominik-zeglen
- Fix layout in staff members details page - #3857 by @dominik-zeglen
- Fix unfocusing rich text editor - #3902 by @dominik-zeglen
- Improve accessibility - #3856 by @dominik-zeglen
### Other notable changes
- Improve user and staff management in dashboard 1.0 - #3781 by @jxltom
- Fix default product tax rate in Dashboard 1.0 - #3880 by @pawelzar
- Fix logo in docs - #3928 by @michaljelonek
- Fix name of logo file - #3867 by @jxltom
- Fix variants for juices in example data - #3926 by @michaljelonek
- Fix alignment of the cart dropdown on new bootstrap version - #3937 by @NyanKiyoshi
- Refactor the account avatars path from a relative to absolute - #3938 by @NyanKiyoshi
- New translations:
- Armenian
- Portuguese
- Swahili
- Thai
## 2.4.0
### API
- Add model translations support in GraphQL API - #3789 by @michaljelonek
- Add mutations to manage addresses for authenticated customers - #3772 by @Kwaidan00, @maarcingebala
- Add mutation to apply vouchers in checkout - #3739 by @Kwaidan00
- Add thumbnail field to `OrderLine` type - #3737 by @michaljelonek
- Add a query to fetch order by token - #3740 by @michaljelonek
- Add city choices and city area type to address validator API - #3788 by @jxltom
- Fix access to unpublished objects in API - #3724 by @Kwaidan00
- Fix bug where errors are not returned when creating fulfillment with a non-existent order line - #3777 by @jxltom
- Fix `productCreate` mutation when no product type was provided - #3804 by @michaljelonek
- Enable database search in products query - #3736 by @michaljelonek
- Use authenticated user's email as default email in creating checkout - #3726 by @jxltom
- Generate voucher code if it wasn't provided in mutation - #3717 by @Kwaidan00
- Improve limitation of vouchers by country - #3707 by @michaljelonek
- Only include canceled fulfillments for staff in fulfillment API - #3778 by @jxltom
- Support setting address as when creating customer address #3782 by @jxltom
- Fix generating slug from title - #3816 by @maarcingebala
- Add `variant` field to `OrderLine` type - #3820 by @maarcingebala
### Core
- Add JSON fields to store rich-text content - #3756 by @michaljelonek
- Add function to recalculate total order weight - #3755 by @Kwaidan00, @maarcingebala
- Unify cart creation logic in API and Django views - #3761, #3790 by @maarcingebala
- Unify payment creation logic in API and Django views - #3715 by @maarcingebala
- Support partially charged and refunded payments - #3735 by @jxltom
- Support partial fulfillment of ordered items - #3754 by @jxltom
- Fix applying discounts when a sale has no end date - #3595 by @cprinos
### Dashboard 2.0
- Add "Discounts" section - #3654 by @dominik-zeglen
- Add "Pages" section; introduce Draftail WYSIWYG editor - #3751 by @dominik-zeglen
- Add "Shipping Methods" section - #3770 by @dominik-zeglen
- Add support for date and datetime components - #3708 by @dominik-zeglen
- Restyle app layout - #3811 by @dominik-zeglen
### Other notable changes
- Unify model field names related to models' public access - `publication_date` and `is_published` - #3706 by @michaljelonek
- Improve filter orders by payment status - #3749 @jxltom
- Refactor translations in emails - #3701 by @Kwaidan00
- Use exact image versions in docker-compose - #3742 by @ashishnitinpatil
- Sort order payment and history in descending order - #3747 by @jxltom
- Disable style-loader in dev mode - #3720 by @jxltom
- Add ordering to shipping method - #3806 by @michaljelonek
- Add missing type definition for dashboard 2.0 - #3776 by @jxltom
- Add header and footer for checkout success pages #3752 by @jxltom
- Add instructions for using local assets in Docker - #3723 by @michaljelonek
- Update S3 deployment documentation to include CORS configuration note - #3743 by @NyanKiyoshi
- Fix missing migrations for is_published field of product and page model - #3757 by @jxltom
- Fix problem with l10n in Braintree payment gateway template - #3691 by @Kwaidan00
- Fix bug where payment is not filtered from active ones when creating payment - #3732 by @jxltom
- Fix incorrect cart badge location - #3786 by @jxltom
- Fix storefront styles after bootstrap is updated to 4.3.1 - #3753 by @jxltom
- Fix logo size in different browser and devices with different sizes - #3722 by @jxltom
- Rename dumpdata file `db.json` to `populatedb_data.json` - #3810 by @maarcingebala
- Prefetch collections for product availability - #3813 by @michaljelonek
- Bump django-graphql-jwt - #3814 by @michaljelonek
- Fix generating slug from title - #3816 by @maarcingebala
- New translations:
- Estonian
- Indonesian
## 2.3.1
- Fix access to private variant fields in API - #3773 by maarcingebala
- Limit access of quantity and allocated quantity to staff in GraphQL API #3780 by @jxltom
## 2.3.0
### API
- Return user's last checkout in the `User` type - #3578 by @fowczarek
- Automatically assign checkout to the logged in user - #3587 by @fowczarek
- Expose `chargeTaxesOnShipping` field in the `Shop` type - #3603 by @fowczarek
- Expose list of enabled payment gateways - #3639 by @fowczarek
- Validate uploaded files in a unified way - #3633 by @fowczarek
- Add mutation to trigger fetching tax rates - #3622 by @fowczarek
- Use USERNAME_FIELD instead of hard-code email field when resolving user - #3577 by @jxltom
- Require variant and quantity fields in `CheckoutLineInput` type - #3592 by @jxltom
- Preserve order of nodes in `get_nodes_or_error` function - #3632 by @jxltom
- Add list mutations for `Voucher` and `Sale` models - #3669 by @michaljelonek
- Use proper type for countries in `Voucher` type - #3664 by @michaljelonek
- Require email in when creating checkout in API - #3667 by @michaljelonek
- Unify returning errors in the `tokenCreate` mutation - #3666 by @michaljelonek
- Use `Date` field in Sale/Voucher inputs - #3672 by @michaljelonek
- Refactor checkout mutations - #3610 by @fowczarek
- Refactor `clean_instance`, so it does not returns errors anymore - #3597 by @akjanik
- Handle GraphqQL syntax errors - #3576 by @jxltom
### Core
- Refactor payments architecture - #3519 by @michaljelonek
- Improve Docker and `docker-compose` configuration - #3657 by @michaljelonek
- Allow setting payment status manually for dummy gateway in Storefront 1.0 - #3648 by @jxltom
- Infer default transaction kind from operation type - #3646 by @jxltom
- Get correct payment status for order without any payments - #3605 by @jxltom
- Add default ordering by `id` for `CartLine` model - #3593 by @jxltom
- Fix "set password" email sent to customer created in the dashboard - #3688 by @Kwaidan00
### Dashboard 2.0
- Add taxes section - #3622 by @dominik-zeglen
- Add drag'n'drop image upload - #3611 by @dominik-zeglen
- Unify grid handling - #3520 by @dominik-zeglen
- Add component generator - #3670 by @dominik-zeglen
- Throw Typescript errors while snapshotting - #3611 by @dominik-zeglen
- Simplify mutation's error checking - #3589 by @dominik-zeglen
- Fix order cancelling - #3624 by @dominik-zeglen
- Fix logo placement - #3602 by @dominik-zeglen
### Other notable changes
- Register Celery task for updating exchange rates - #3599 by @jxltom
- Fix handling different attributes with the same slug - #3626 by @jxltom
- Add missing migrations for tax rate choices - #3629 by @jxltom
- Fix `TypeError` on calling `get_client_token` - #3660 by @michaljelonek
- Make shipping required as default when creating product types - #3655 by @jxltom
- Display payment status on customer's account page in Storefront 1.0 - #3637 by @jxltom
- Make order fields sequence in Dashboard 1.0 same as in Dashboard 2.0 - #3606 by @jxltom
- Fix returning products for homepage for the currently viewing user - #3598 by @jxltom
- Allow filtering payments by status in Dashboard 1.0 - #3608 by @jxltom
- Fix typo in the definition of order status - #3649 by @jxltom
- Add margin for order notes section - #3650 by @jxltom
- Fix logo position - #3609, #3616 by @jxltom
- Storefront visual improvements - #3696 by @piotrgrundas
- Fix product list price filter - #3697 by @Kwaidan00
- Redirect to success page after successful payment - #3693 by @Kwaidan00
## 2.2.0
### API
- Use `PermissionEnum` as input parameter type for `permissions` field - #3434 by @maarcingebala
- Add "authorize" and "charge" mutations for payments - #3426 by @jxltom
- Add alt text to product thumbnails and background images of collections and categories - #3429 by @fowczarek
- Fix passing decimal arguments = #3457 by @fowczarek
- Allow sorting products by the update date - #3470 by @jxltom
- Validate and clear the shipping method in draft order mutations - #3472 by @fowczarek
- Change tax rate field to choice field - #3478 by @fowczarek
- Allow filtering attributes by collections - #3508 by @maarcingebala
- Resolve to `None` when empty object ID was passed as mutation argument - #3497 by @maarcingebala
- Change `errors` field type from [Error] to [Error!] - #3489 by @fowczarek
- Support creating default variant for product types that don't use multiple variants - #3505 by @fowczarek
- Validate SKU when creating a default variant - #3555 by @fowczarek
- Extract enums to separate files - #3523 by @maarcingebala
### Core
- Add Stripe payment gateway - #3408 by @jxltom
- Add `first_name` and `last_name` fields to the `User` model - #3101 by @fowczarek
- Improve several payment validations - #3418 by @jxltom
- Optimize payments related database queries - #3455 by @jxltom
- Add publication date to collections - #3369 by @k-brk
- Fix hard-coded site name in order PDFs - #3526 by @NyanKiyoshi
- Update favicons to the new style - #3483 by @dominik-zeglen
- Fix migrations for default currency - #3235 by @bykof
- Remove Elasticsearch from `docker-compose.yml` - #3482 by @maarcingebala
- Resort imports in tests - #3471 by @jxltom
- Fix the no shipping orders payment crash on Stripe - #3550 by @NyanKiyoshi
- Bump backend dependencies - #3557 by @maarcingebala. This PR removes security issue CVE-2019-3498 which was present in Django 2.1.4. Saleor however wasn't vulnerable to this issue as it doesn't use the affected `django.views.defaults.page_not_found()` view.
- Generate random data using the default currency - #3512 by @stephenmoloney
- New translations:
- Catalan
- Serbian
### Dashboard 2.0
- Restyle product selection dialogs - #3499 by @dominik-zeglen, @maarcingebala
- Fix minor visual bugs in Dashboard 2.0 - #3433 by @dominik-zeglen
- Display warning if order draft has missing data - #3431 by @dominik-zeglen
- Add description field to collections - #3435 by @dominik-zeglen
- Add query batching - #3443 by @dominik-zeglen
- Use autocomplete fields in country selection - #3443 by @dominik-zeglen
- Add alt text to categories and collections - #3461 by @dominik-zeglen
- Use first and last name of a customer or staff member in UI - #3247 by @Bonifacy1, @dominik-zeglen
- Show error page if an object was not found - #3463 by @dominik-zeglen
- Fix simple product's inventory data saving bug - #3474 by @dominik-zeglen
- Replace `thumbnailUrl` with `thumbnail { url }` - #3484 by @dominik-zeglen
- Change "Feature on Homepage" switch behavior - #3481 by @dominik-zeglen
- Expand payment section in order view - #3502 by @dominik-zeglen
- Change TypeScript loader to speed up the build process - #3545 by @patrys
### Bugfixes
- Do not show `Pay For Order` if order is partly paid since partial payment is not supported - #3398 by @jxltom
- Fix attribute filters in the products category view - #3535 by @fowczarek
- Fix storybook dependencies conflict - #3544 by @dominik-zeglen
## 2.1.0
### API
- Change selected connection fields to lists - #3307 by @fowczarek
- Require pagination in connections - #3352 by @maarcingebala
- Replace Graphene view with a custom one - #3263 by @patrys
- Change `sortBy` parameter to use enum type - #3345 by @fowczarek
- Add `me` query to fetch data of a logged-in user - #3202, #3316 by @fowczarek
- Add `canFinalize` field to the Order type - #3356 by @fowczarek
- Extract resolvers and mutations to separate files - #3248 by @fowczarek
- Add VAT tax rates field to country - #3392 by @michaljelonek
- Allow creating orders without users - #3396 by @fowczarek
### Core
- Add Razorpay payment gatway - #3205 by @NyanKiyoshi
- Use standard tax rate as a default tax rate value - #3340 by @fowczarek
- Add description field to the Collection model - #3275 by @fowczarek
- Enforce the POST method on VAT rates fetching - #3337 by @NyanKiyoshi
- Generate thumbnails for category/collection background images - #3270 by @NyanKiyoshi
- Add warm-up support in product image creation mutation - #3276 by @NyanKiyoshi
- Fix error in the `populatedb` script when running it not from the project root - #3272 by @NyanKiyoshi
- Make Webpack rebuilds fast - #3290 by @patrys
- Skip installing Chromium to make deployment faster - #3227 by @jxltom
- Add default test runner - #3258 by @jxltom
- Add Transifex client to Pipfile - #3321 by @jxltom
- Remove additional pytest arguments in tox - #3338 by @jxltom
- Remove test warnings - #3339 by @jxltom
- Remove runtime warning when product has discount - #3310 by @jxltom
- Remove `django-graphene-jwt` warnings - #3228 by @jxltom
- Disable deprecated warnings - #3229 by @jxltom
- Add `AWS_S3_ENDPOINT_URL` setting to support DigitalOcean spaces. - #3281 by @hairychris
- Add `.gitattributes` file to hide diffs for generated files on Github - #3055 by @NyanKiyoshi
- Add database sequence reset to `populatedb` - #3406 by @michaljelonek
- Get authorized amount from succeeded auth transactions - #3417 by @jxltom
- Resort imports by `isort` - #3412 by @jxltom
### Dashboard 2.0
- Add confirmation modal when leaving view with unsaved changes - #3375 by @dominik-zeglen
- Add dialog loading and error states - #3359 by @dominik-zeglen
- Split paths and urls - #3350 by @dominik-zeglen
- Derive state from props in forms - #3360 by @dominik-zeglen
- Apply debounce to autocomplete fields - #3351 by @dominik-zeglen
- Use Apollo signatures - #3353 by @dominik-zeglen
- Add order note field in the order details view - #3346 by @dominik-zeglen
- Add app-wide progress bar - #3312 by @dominik-zeglen
- Ensure that all queries are built on top of TypedQuery - #3309 by @dominik-zeglen
- Close modal windows automatically - #3296 by @dominik-zeglen
- Move URLs to separate files - #3295 by @dominik-zeglen
- Add basic filters for products and orders list - #3237 by @Bonifacy1
- Fetch default currency from API - #3280 by @dominik-zeglen
- Add `displayName` property to components - #3238 by @Bonifacy1
- Add window titles - #3279 by @dominik-zeglen
- Add paginator component - #3265 by @dominik-zeglen
- Update Material UI to 3.6 - #3387 by @patrys
- Upgrade React, Apollo, Webpack and Babel - #3393 by @patrys
- Add pagination for required connections - #3411 by @dominik-zeglen
### Bugfixes
- Fix language codes - #3311 by @jxltom
- Fix resolving empty attributes list - #3293 by @maarcingebala
- Fix range filters not being applied - #3385 by @michaljelonek
- Remove timeout for updating image height - #3344 by @jxltom
- Return error if checkout was not found - #3289 by @maarcingebala
- Solve an auto-resize conflict between Materialize and medium-editor - #3367 by @adonig
- Fix calls to `ngettext_lazy` - #3380 by @patrys
- Filter preauthorized order from succeeded transactions - #3399 by @jxltom
- Fix incorrect country code in fixtures - #3349 by @bingimar
- Fix updating background image of a collection - #3362 by @fowczarek & @dominik-zeglen
### Docs
- Document settings related to generating thumbnails on demand - #3329 by @NyanKiyoshi
- Improve documentation for Heroku deployment - #3170 by @raybesiga
- Update documentation on Docker deployment - #3326 by @jxltom
- Document payment gateway configuration - #3376 by @NyanKiyoshi
## 2.0.0
### API
- Add mutation to delete a customer; add `isActive` field in `customerUpdate` mutation - #3177 by @maarcingebala
- Add mutations to manage authorization keys - #3082 by @maarcingebala
- Add queries for dashboard homepage - #3146 by @maarcingebala
- Allows user to unset homepage collection - #3140 by @oldPadavan
- Use enums as permission codes - #3095 by @the-bionic
- Return absolute image URLs - #3182 by @maarcingebala
- Add `backgroundImage` field to `CategoryInput` - #3153 by @oldPadavan
- Add `dateJoined` and `lastLogin` fields in `User` type - #3169 by @maarcingebala
- Separate `parent` input field from `CategoryInput` - #3150 by @akjanik
- Remove duplicated field in Order type - #3180 by @maarcingebala
- Handle empty `backgroundImage` field in API - #3159 by @maarcingebala
- Generate name-based slug in collection mutations - #3145 by @akjanik
- Remove products field from `collectionUpdate` mutation - #3141 by @oldPadavan
- Change `items` field in `Menu` type from connection to list - #3032 by @oldPadavan
- Make `Meta.description` required in `BaseMutation` - #3034 by @oldPadavan
- Apply `textwrap.dedent` to GraphQL descriptions - #3167 by @fowczarek
### Dashboard 2.0
- Add collection management - #3135 by @dominik-zeglen
- Add customer management - #3176 by @dominik-zeglen
- Add homepage view - #3155, #3178 by @Bonifacy1 and @dominik-zeglen
- Add product type management - #3052 by @dominik-zeglen
- Add site settings management - #3071 by @dominik-zeglen
- Escape node IDs in URLs - #3115 by @dominik-zeglen
- Restyle categories section - #3072 by @Bonifacy1
### Other
- Change relation between `ProductType` and `Attribute` models - #3097 by @maarcingebala
- Remove `quantity-allocated` generation in `populatedb` script - #3084 by @MartinSeibert
- Handle `Money` serialization - #3131 by @Pacu2
- Do not collect unnecessary static files - #3050 by @jxltom
- Remove host mounted volume in `docker-compose` - #3091 by @tiangolo
- Remove custom services names in `docker-compose` - #3092 by @tiangolo
- Replace COUNTRIES with countries.countries - #3079 by @neeraj1909
- Installing dev packages in docker since tests are needed - #3078 by @jxltom
- Remove comparing string in address-form-panel template - #3074 by @tomcio1205
- Move updating variant names to a Celery task - #3189 by @fowczarek
### Bugfixes
- Fix typo in `clean_input` method - #3100 by @the-bionic
- Fix typo in `ShippingMethod` model - #3099 by @the-bionic
- Remove duplicated variable declaration - #3094 by @the-bionic
### Docs
- Add createdb note to getting started for Windows - #3106 by @ajostergaard
- Update docs on pipenv - #3045 by @jxltom

29
LICENSE Normal file
View file

@ -0,0 +1,29 @@
BSD 3-Clause License
Copyright (c) 2010-2018, Mirumee Software
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* 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.
* 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.

143
README.md Normal file
View file

@ -0,0 +1,143 @@
![github_saleor_readmew_header_01](https://user-images.githubusercontent.com/5421321/47800694-19bec680-dd2d-11e8-8625-2ed7c690bc13.jpg)
<div align="center">
<h1>Saleor</h1>
</div>
<div align="center">
<strong>E-commerce for the PWA era</strong>
</div>
<div align="center">
A modular, high performance e-commerce storefront built with GraphQL, Django, and ReactJS.
</div>
<br>
<div align="center">
Join our active, engaged community: <br>
<a href="https://getsaleor.com/">Website</a>
<span> | </span>
<a href="https://medium.com/saleor">Blog</a>
<span> | </span>
<a href="https://twitter.com/getsaleor">Twitter</a>
<span> | </span>
<a href="https://gitter.im/mirumee/saleor">Gitter</a>
<span> | </span>
<a href="https://spectrum.chat/saleor">Spectrum</a>
</div>
<br>
<div align="center">
<a href="https://circleci.com/gh/mirumee/saleor">
<img src="https://circleci.com/gh/mirumee/saleor.svg?style=svg" alt="Build status" />
</a>
<a href="http://codecov.io/github/mirumee/saleor?branch=master">
<img src="http://codecov.io/github/mirumee/saleor/coverage.svg?branch=master" alt="Codecov" />
</a>
<a href="https://docs.getsaleor.com/en/latest/?badge=latest">
<img src="https://readthedocs.org/projects/saleor/badge/?version=latest" alt="Documentation Status" />
</a>
<a href="https://github.com/python/black">
<img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black">
</a>
</div>
## Table of Contents
- [What makes Saleor special?](#what-makes-saleor-special)
- [Features](#features)
- [Installation](#installation)
- [Demo](#demo)
- [Contributing](#contributing)
- [Translations](#translations)
- [Your feedback](#your-feedback)
- [License](#license)
## What makes Saleor special?
Saleor is a rapidly-growing open source e-commerce platform that has served high-volume companies from branches like publishing and apparel since 2012. Based on Python and Django, the latest major update introduces a modular front end powered by a GraphQL API and written with React and TypeScript.
## Features
- __PWA__: End users can shop offline for better sales and shopping experiences
- __GraphQL API__: Access all data from any web or mobile client using the latest technology
- __Headless commerce__: Build mobile apps, customize storefronts and externalize processes
- __UX and UI__: Designed for a user experience that rivals even the top commercial platforms
- __Dashboard__: Administrators have total control of users, processes and products
- __Orders__: A comprehensive system for orders, dispatch and refunds
- __Cart__: Advanced payment and tax options, with full control over discounts and promotions
- __Payments__: Flexible API architecture allows integration of any payment method. Comes with Braintree support out of the box.
- __Geo-adaptive__: Automatic localized pricing. Over 20 local languages. Localized checkout experience by country.
- __SEO__: Packed with features that get stores to a wider audience
- __Cloud__: Optimized for deployments using Docker
- __Analytics__: Server-side Google Analytics to report e-commerce metrics without affecting privacy
Saleor is free and always will be.
Help us out… If you love free stuff and great software, give us a star! 🌟
![1 copy 2x](https://user-images.githubusercontent.com/5421321/47798207-30aeea00-dd28-11e8-9398-3d8426836a83.png)
![group 2 2x](https://user-images.githubusercontent.com/5421321/47799917-8afd7a00-dd2b-11e8-88c7-63588e25bcea.png)
## Installation
Saleor requires Python 3.6+, Node.js 10.0+, PostgreSQL and OS-specific dependency tools.
[See the Saleor docs](https://saleor.readthedocs.io) for step-by-step installation and deployment instructions.
## Demo
Want to see Saleor in action?
[View Storefront](http://demo.getsaleor.com/) | [View Dashboard (admin area)](http://demo.getsaleor.com/dashboard/)
Or launch the demo on a free Heroku instance.
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)
Login credentials: `admin@example.com`/`admin`
## PWA Storefront
The PWA, single-page storefront lives in a [separate repository](https://github.com/mirumee/saleor-storefront).
[View PWA Storefront](https://pwa.getsaleor.com/)
## Contributing
We love your contributions and do our best to provide you with mentorship and support. If you are looking for an issue to tackle, take a look at issues labelled [`Help Wanted`](https://github.com/mirumee/saleor/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22).
If nothing grabs your attention, check [our roadmap](https://github.com/mirumee/saleor/projects/6) or come up with your own feature. Just drop us a line or [open an issue](https://github.com/mirumee/saleor/issues/new) and well work out how to handle it.
Get more details in our [Contributing Guide](https://saleor.readthedocs.io/en/latest/contributing.html).
## Translations
Did you know that Saleor is available in almost 30 languages, translated entirely by our community?
If you'd like to help us, you can join one of our translation teams on [the localization platform Transifex](https://www.transifex.com/mirumee/saleor-1/languages/).
The repository gets synchronized weekly with the latest contributions.
## Your feedback
Do you use Saleor as an e-commerce platform?
Fill out this short survey and help us grow. It will take just a minute, but mean a lot!
[Take a survey](https://mirumee.typeform.com/to/sOIJbJ)
## License
Disclaimer: Everything you see here is open and free to use as long as you comply with the [license](https://github.com/mirumee/saleor/blob/master/LICENSE). There are no hidden charges. We promise to do our best to fix bugs and improve the code.
Some situations do call for extra code; we can cover exotic use cases or build you a custom e-commerce appliance.
#### Crafted with ❤️ by [Mirumee Software](http://mirumee.com)
hello@mirumee.com

14
apollo.config.js Normal file
View file

@ -0,0 +1,14 @@
module.exports = {
client: {
addTypename: true,
includes: [
'saleor/static/dashboard-next/**/*.ts',
'saleor/static/dashboard-next/**/*.tsx'
],
name: 'storefront',
service: {
localSchemaFile: 'saleor/graphql/schema.graphql',
name: 'saleor'
}
}
};

View file

@ -0,0 +1,4 @@
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0V0z" fill="none"/>
<path d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z" fill="#010101"/>
</svg>

After

Width:  |  Height:  |  Size: 243 B

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
<path d="M29.6,14.3c0,0.7-0.2,1.2-0.7,1.7L16.7,28.2c-0.5,0.5-1.1,0.7-1.7,0.7c-0.7,0-1.2-0.2-1.7-0.7L1.1,16
c-0.5-0.5-0.7-1-0.7-1.7c0-0.7,0.2-1.2,0.7-1.7l1.4-1.4c0.5-0.5,1.1-0.7,1.7-0.7c0.7,0,1.2,0.2,1.7,0.7l5.5,5.5V3.5
c0-0.7,0.2-1.2,0.7-1.7c0.5-0.5,1-0.7,1.7-0.7h2.4c0.7,0,1.2,0.2,1.7,0.7c0.5,0.5,0.7,1,0.7,1.7v13.2l5.5-5.5c0.5-0.5,1-0.7,1.7-0.7
c0.7,0,1.2,0.2,1.7,0.7l1.4,1.4C29.4,13.1,29.6,13.6,29.6,14.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 776 B

View file

@ -0,0 +1 @@
<svg width="20" height="20" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1664 896v128q0 53-32.5 90.5t-84.5 37.5h-704l293 294q38 36 38 90t-38 90l-75 76q-37 37-90 37-52 0-91-37l-651-652q-37-37-37-90 0-52 37-91l651-650q38-38 91-38 52 0 90 38l75 74q38 38 38 91t-38 91l-293 293h704q52 0 84.5 37.5t32.5 90.5z"/></svg>

After

Width:  |  Height:  |  Size: 336 B

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><path d="M500,10L227.8,391.1h544.4L500,10z M500,990l272.2-381.1H227.8L500,990z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 571 B

View file

@ -0,0 +1,4 @@
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0V0z" fill="none"/>
<path d="M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z"/>
</svg>

After

Width:  |  Height:  |  Size: 225 B

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
<path d="M29.6,15.8c0,0.6-0.2,1.2-0.7,1.7l-1.4,1.4c-0.5,0.5-1,0.7-1.7,0.7c-0.7,0-1.2-0.2-1.7-0.7l-5.5-5.5v13.2
c0,0.7-0.2,1.2-0.7,1.6c-0.5,0.4-1,0.6-1.7,0.6h-2.4c-0.7,0-1.2-0.2-1.7-0.6c-0.5-0.4-0.7-0.9-0.7-1.6V13.4l-5.5,5.5
c-0.5,0.5-1,0.7-1.7,0.7s-1.2-0.2-1.7-0.7l-1.4-1.4c-0.5-0.5-0.7-1-0.7-1.7c0-0.7,0.2-1.2,0.7-1.7L13.3,1.9c0.4-0.5,1-0.7,1.7-0.7
c0.7,0,1.2,0.2,1.7,0.7l12.2,12.2C29.4,14.6,29.6,15.2,29.6,15.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
assets/images/block1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

BIN
assets/images/block2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

BIN
assets/images/block3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.25 6.75C17.25 7.19325 17.25 7.51025 17.25 7.701C17.6981 7.9605 18 8.44519 18 9C18 9.82781 17.3278 10.5 16.5 10.5C15.6722 10.5 15 9.82781 15 9C15 8.44519 15.3019 7.9605 15.75 7.701V7.5V6.75H8.25002V7.5V7.701C8.69814 7.9605 9.00002 8.44519 9.00002 9C9.00002 9.82781 8.32783 10.5 7.50002 10.5C6.6722 10.5 6.00002 9.82781 6.00002 9C6.00002 8.44519 6.30189 7.9605 6.75002 7.701C6.75002 7.2725 6.75002 6.9555 6.75002 6.75H4.53002C4.38752 6.7575 4.24689 6.795 4.11939 6.86062C3.92627 6.95812 3.75002 7.0875 3.60002 7.245C3.42939 7.41937 3.28689 7.62 3.17627 7.8375C3.08627 8.01375 3.02439 8.20312 2.99439 8.39812L2.24814 21.0881C2.24627 21.1162 2.24439 21.1425 2.24064 21.1706C2.23877 21.1837 2.23877 21.1969 2.23877 21.21C2.24064 21.33 2.27252 21.4462 2.33064 21.5531C2.42627 21.7331 2.55377 21.8944 2.70752 22.0294C2.87627 22.1812 3.06752 22.3031 3.27752 22.3912C3.42939 22.4587 3.59439 22.4962 3.76127 22.5H20.2575H20.2875C20.4506 22.4962 20.61 22.4606 20.7581 22.3931C20.9588 22.305 21.1425 22.1831 21.3038 22.0331C21.4538 21.8962 21.5775 21.735 21.6694 21.5531C21.7275 21.4444 21.7594 21.3244 21.7613 21.2025C21.7613 21.1894 21.7613 21.1762 21.7594 21.165C21.7575 21.1387 21.7538 21.1125 21.7538 21.0881L21.0075 8.4075C20.9981 8.36062 20.985 8.31562 20.9663 8.27062C20.9269 8.17687 20.8781 8.08687 20.82 8.0025C20.6513 7.7625 20.4469 7.55062 20.2144 7.3725C19.965 7.1775 19.6913 7.01625 19.3969 6.89812C19.275 6.84937 19.1494 6.81 19.02 6.78187C18.93 6.76125 18.8381 6.75 18.7444 6.75H17.25ZM17.25 5.24962C17.25 4.79837 17.25 4.04844 17.25 2.99981C17.25 1.05487 16.401 0 14.6631 0C12.925 0 11.1171 0 9.34839 0C7.57952 0 6.75002 1.18219 6.75002 3.09581C6.75002 3.56119 6.75002 4.27912 6.75002 5.24962H4.50039C3.04164 5.28075 1.68152 6.75975 1.50039 8.24962L0.750392 20.9996C0.57583 22.5199 2.25677 23.9996 3.75039 23.9996H20.2504C21.7849 24.0277 23.4163 22.4951 23.2504 20.9996L22.5004 8.24962C22.3129 6.74962 20.2915 5.24962 18.7504 5.24962H17.25ZM8.25002 5.24962V5.01V3.09562C8.25002 3.09375 8.25002 3.09187 8.25002 3.09187C8.25002 2.92312 8.25939 2.75625 8.27814 2.58937C8.29501 2.45437 8.32127 2.32125 8.35689 2.19C8.39627 2.03437 8.46564 1.88812 8.56314 1.76062C8.62314 1.6875 8.70002 1.63125 8.78627 1.59375C8.85377 1.56562 8.92502 1.54312 8.99814 1.53C9.11252 1.50937 9.22689 1.5 9.34127 1.5C9.34314 1.5 9.34501 1.5 9.34876 1.5H14.6625C14.6663 1.5 14.6681 1.5 14.67 1.5C14.79 1.5 14.9081 1.50937 15.0263 1.52812C15.1031 1.54125 15.1781 1.56187 15.2513 1.59187C15.33 1.62187 15.4013 1.67062 15.4594 1.73437C15.5456 1.845 15.6075 1.97062 15.6431 2.1075C15.6788 2.23312 15.705 2.36062 15.72 2.49C15.7406 2.65875 15.75 2.82562 15.75 2.99437C15.75 2.99625 15.75 2.99812 15.75 3V4.94437V5.24962H8.25002Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1,3 @@
<svg width="8" height="6" viewBox="0 0 8 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 6L0.535899 -6.52533e-07L7.4641 -4.68497e-08L4 6Z" fill="#333333"/>
</svg>

After

Width:  |  Height:  |  Size: 181 B

View file

@ -0,0 +1,3 @@
<svg width="8" height="6" viewBox="0 0 8 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 0L7.4641 6H0.535898L4 0Z" fill="#333333"/>
</svg>

After

Width:  |  Height:  |  Size: 157 B

1
assets/images/close.svg Normal file
View file

@ -0,0 +1 @@
<svg width="30" height="30" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/></svg>

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

13
assets/images/delete.svg Normal file
View file

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" height="20px" width="20px" viewBox="0 0 13.2 14.4">
<path fill="#828282" d="M13.2,2.7v0.6c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H12v8.9c0,0.5-0.1,1-0.4,1.3
c-0.3,0.4-0.6,0.6-1.1,0.6H2.7c-0.4,0-0.8-0.2-1.1-0.5s-0.4-0.8-0.4-1.3V3.6H0.3c-0.1,0-0.2,0-0.2-0.1C0,3.5,0,3.4,0,3.3V2.7
c0-0.1,0-0.2,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1h2.9l0.7-1.6C4,0.6,4.1,0.4,4.4,0.2C4.6,0.1,4.9,0,5.1,0h3c0.3,0,0.5,0.1,0.7,0.2
c0.2,0.2,0.4,0.4,0.5,0.6L10,2.4h2.9c0.1,0,0.2,0,0.2,0.1C13.2,2.5,13.2,2.6,13.2,2.7z M10.8,12.5V3.6H2.4v8.9c0,0.1,0,0.3,0.1,0.4
c0,0.1,0.1,0.2,0.1,0.3c0,0.1,0.1,0.1,0.1,0.1h7.8c0,0,0.1,0,0.1-0.1c0-0.1,0.1-0.1,0.1-0.3C10.8,12.8,10.8,12.6,10.8,12.5z
M4.8,5.7v5.4c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H3.9c-0.1,0-0.2,0-0.2-0.1c-0.1-0.1-0.1-0.1-0.1-0.2V5.7
c0-0.1,0-0.2,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1h0.6c0.1,0,0.2,0,0.2,0.1C4.8,5.6,4.8,5.6,4.8,5.7z M4.5,2.4h4.2L8.3,1.3
c0-0.1-0.1-0.1-0.2-0.1h-3C5.1,1.2,5,1.2,5,1.3L4.5,2.4z M7.2,5.7v5.4c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H6.3
c-0.1,0-0.2,0-0.2-0.1C6,11.3,6,11.2,6,11.1V5.7c0-0.1,0-0.2,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1h0.6c0.1,0,0.2,0,0.2,0.1
C7.2,5.6,7.2,5.6,7.2,5.7z M9.6,5.7v5.4c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H8.7c-0.1,0-0.2,0-0.2-0.1
c-0.1-0.1-0.1-0.1-0.1-0.2V5.7c0-0.1,0-0.2,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1h0.6c0.1,0,0.2,0,0.2,0.1C9.6,5.6,9.6,5.6,9.6,5.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Dribbble"
x="0px"
y="0px"
viewBox="0 0 611.9 611.8"
style="enable-background:new 0 0 611.9 611.8;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="dribbble-logo.svg"><metadata
id="metadata25"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs23" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1027"
id="namedview21"
showgrid="false"
inkscape:zoom="0.38574698"
inkscape:cx="-322.7004"
inkscape:cy="305.89999"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="Dribbble" /><style
type="text/css"
id="style3">
.st0{fill:#333333;}
</style><g
id="g5"><path
class="st0"
d="M317.7,301.7c0.3,0,0.5-0.1,0.8-0.2c-3.2-7-6.6-14.2-10.3-21.5c-85.7,24.7-168.2,26.7-192.1,26.7 c0.2,43.9,15.4,86.1,43.2,119.9C175.3,401.9,228.2,330.7,317.7,301.7z"
id="path7" /><path
class="st0"
d="M427.3,160.2c-34.1-28.3-76.9-43.9-121.3-43.9c-11.7,0-23.4,1.1-34.9,3.2c12,16.7,39.3,56,65.1,102.6 C389.9,200.8,417.8,171.7,427.3,160.2z"
id="path9" /><path
class="st0"
d="M220.4,136.8c-48.9,24.6-85,69.8-98.4,122.8c24.5-0.3,89.5-3,163.5-21.6C258.4,190.8,230.1,150.4,220.4,136.8z "
id="path11" /><path
class="st0"
d="M226.9,416.1c-18.3,18.9-28.6,35.2-33.2,43.1C226.5,483.3,265.2,496,306,496c24,0,47.3-4.4,69.4-13.1 c-3.8-21-14.9-74-38.4-136.6C293.6,362.1,256.6,385.6,226.9,416.1z"
id="path13" /><path
class="st0"
d="M386.3,334.3c19.6,55.5,29.8,102.4,33.9,123.5c37.5-28.4,63.4-69.8,72.2-115.8c-12-3.3-39.5-9.7-74-9.7 C407.5,332.3,396.7,333,386.3,334.3z"
id="path15" /><path
class="st0"
d="M357.2,262.7c3.7,7.7,7.1,15.3,10.2,22.6c0.7,1.9,1.5,3.8,2.4,5.6c13-1.5,26.8-2.2,41.1-2.2 c37.4,0,70,4.9,84.8,7.6c-1.9-37.5-15.1-73.9-37.7-104C445.9,206.2,413.9,238.2,357.2,262.7z"
id="path17" /><path
class="st0"
d="M541.1,0H70.5C31.5,0,0,31.5,0,70.5v470.6c0,39,31.5,70.7,70.5,70.7h470.7c39,0,70.7-31.7,70.7-70.7V70.5 C611.8,31.5,580.3,0,541.1,0z M306,542.3c-130.4,0-236.4-106-236.4-236.4S175.6,69.5,306,69.5s236.4,106,236.4,236.4 S436.4,542.3,306,542.3z"
id="path19" /></g><path
style="fill:#ffffff"
d="M 46.901322,608.44297 C 29.988409,602.56956 14.247533,588.00307 5.9871654,570.58126 L -0.15856971,557.6194 0.01332794,306.15923 C 0.1402627,120.47326 0.981244,52.540006 3.2284693,46.444804 8.9313787,30.976667 21.80567,15.998221 36.241342,8.0363558 l 14.100709,-7.77711852 255.348719,0 255.34873,0 13.27227,7.00157802 c 15.16611,8.0006407 25.35136,18.9908767 33.15236,35.7725737 5.38474,11.583741 5.42283,13.431866 5.42283,263.125841 0,250.84142 -0.013,251.48943 -5.50289,263.35758 -7.02232,15.18241 -21.85712,30.01721 -37.03953,37.03953 -11.83595,5.47445 -13.18302,5.50594 -260.76521,6.09273 -236.301776,0.56003 -249.565102,0.34766 -262.678008,-4.2061 z m 306.748348,-72.5817 c 43.0469,-8.92914 80.70912,-28.72235 113.48519,-59.64163 C 553.59441,394.65807 565.42258,261.97623 494.77472,166.1711 483.13636,150.38839 453.77307,122.04464 437.90179,111.27287 395.21946,82.304579 348.4362,69.679819 293.37612,72.271702 234.46667,75.044789 187.82537,95.042589 144.05688,136.29341 96.684713,180.94061 71.632774,239.73578 71.679011,306.15923 c 0.05244,75.32168 33.349179,142.57693 92.660059,187.16172 53.70462,40.37051 123.81695,56.12555 189.3106,42.54032 z"
id="path4157"
inkscape:connector-curvature="0" /><path
style="fill:#ffffff"
d="m 122.62823,254.58516 c 10.6064,-42.25926 45.87505,-89.30416 82.84595,-110.50831 7.35466,-4.21816 14.10516,-7.68033 15.00111,-7.69371 1.75133,-0.0262 49.44701,71.94277 59.57039,89.8869 3.36473,5.96413 5.47333,11.48822 4.68578,12.27577 -4.87666,4.87666 -90.44565,18.23471 -135.6073,21.16945 l -28.24416,1.8354 1.74823,-6.9655 z"
id="path4159"
inkscape:connector-curvature="0" /><path
style="fill:#ffffff"
d="m 326.31479,207.00097 c -4.61286,-8.19838 -18.87347,-30.99044 -31.69024,-50.64903 -12.81677,-19.65859 -22.47432,-36.57382 -21.46122,-37.58941 1.01311,-1.01558 12.71601,-2.24691 26.00646,-2.73628 40.70138,-1.49866 79.6108,9.38712 112.16018,31.37933 8.91128,6.02097 16.20233,11.79252 16.20233,12.82567 0,2.99096 -16.92905,19.11068 -32.09732,30.56282 -14.89984,11.24949 -51.43829,31.11304 -57.23158,31.11304 -1.92588,0 -7.27575,-6.70776 -11.88861,-14.90614 z"
id="path4163"
inkscape:connector-curvature="0" /><path
style="fill:#ffffff"
d="m 472.89882,293.98796 c -7.12902,-1.36849 -33.65075,-2.68949 -58.93718,-2.93556 l -45.97531,-0.44741 -5.56295,-13.70312 c -3.05962,-7.53671 -5.1188,-14.14077 -4.57595,-14.67569 0.54284,-0.53491 8.69238,-4.98476 18.11009,-9.88856 25.96713,-13.52109 45.81026,-27.41556 65.05341,-45.55143 l 17.41946,-16.4171 8.78749,13.82473 c 14.75388,23.21126 23.10789,47.20212 28.96137,83.17071 1.79924,11.05596 0.99806,11.2839 -23.28043,6.62343 z"
id="path4165"
inkscape:connector-curvature="0" /><path
style="fill:#ffffff"
d="m 418.59459,454.57258 c -0.54882,-1.78226 -4.14163,-16.58135 -7.98401,-32.88687 -3.84239,-16.30553 -11.01762,-42.37789 -15.94497,-57.93859 -4.92736,-15.5607 -8.20013,-29.05088 -7.27283,-29.97817 0.92729,-0.92729 15.29595,-1.68599 31.93034,-1.68599 34.84046,0 70.17425,5.4005 72.345,11.05738 2.1483,5.59839 -6.27048,30.33244 -18.14512,53.30962 -6.73802,13.03793 -17.39743,27.63999 -29.80552,40.82987 -19.39699,20.61913 -23.2763,23.28936 -25.12289,17.29275 z"
id="path4167"
inkscape:connector-curvature="0" /><path
style="fill:#ffffff"
d="m 265.64442,492.56928 c -28.24366,-6.29374 -71.42568,-26.53229 -71.42568,-33.47578 0,-5.48107 18.84836,-30.31952 36.09501,-47.56617 9.84241,-9.84241 27.97298,-24.60076 40.29017,-32.79633 20.5133,-13.64908 58.10643,-32.28205 65.2849,-32.35834 6.05593,-0.0644 42.53846,126.47824 39.0699,135.51715 -4.37796,11.40879 -75.05542,18.31363 -109.3143,10.67947 z"
id="path4169"
inkscape:connector-curvature="0" /><path
style="fill:#ffffff"
d="m 149.82081,415.68698 c -17.90699,-24.24555 -32.34268,-64.96753 -33.77252,-95.2697 l -0.67278,-14.25805 34.88496,-1.83755 c 48.95705,-2.57879 105.06145,-11.38786 154.13412,-24.20092 4.15202,-1.08411 6.07815,0.79469 9.67007,9.43249 4.65474,11.19367 4.16778,15.30979 -1.81126,15.30979 -7.39525,0 -56.85219,26.94368 -76.15378,41.48787 -21.71343,16.36156 -47.66805,42.5572 -65.28682,65.8931 -6.00481,7.95331 -11.35364,14.46056 -11.88629,14.46056 -0.53266,0 -4.63022,-4.95792 -9.1057,-11.01759 z"
id="path4171"
inkscape:connector-curvature="0" /></svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

4
assets/images/edit.svg Normal file
View file

@ -0,0 +1,4 @@
<svg fill="#E57373" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/>
<path d="M0 0h24v24H0z" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 155.139 155.139" style="enable-background:new 0 0 155.139 155.139;" xml:space="preserve" width="512px" height="512px">
<g>
<path id="f_1_" d="M89.584,155.139V84.378h23.742l3.562-27.585H89.584V39.184 c0-7.984,2.208-13.425,13.67-13.425l14.595-0.006V1.08C115.325,0.752,106.661,0,96.577,0C75.52,0,61.104,12.853,61.104,36.452 v20.341H37.29v27.585h23.814v70.761H89.584z" fill="#ffffff"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 811 B

43
assets/images/favicon.svg Normal file
View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="200px" height="200px" viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
<g>
<g>
<path fill="#D85138" d="M138.855,133.841c0,0,33.57,22.432,40.697,18.347C186.435,147.28,138.855,133.841,138.855,133.841z"/>
<path fill="#D85138" d="M129.037,125.426c0,0,45.677,26.125,53.93,20.458C189.061,140.104,129.037,125.426,129.037,125.426z"/>
<path fill="#D85138" d="M127.469,133.707c0,0,37.804,30.899,47.685,26.431C183.372,155.573,127.469,133.707,127.469,133.707z"/>
<path fill="#D85138" d="M119.812,130.545c0,0,33.759,30.264,40.08,29.715C166.028,159.728,119.812,130.545,119.812,130.545z"/>
<path fill="#EB9759" d="M117.814,124.424c0,0,40.188,27.103,49.393,23.69C175.192,144.833,117.814,124.424,117.814,124.424z"/>
<path fill="#EB9759" d="M114.894,121.477c0,0,46.591,23.881,54.302,19.536C175.335,136.838,114.894,121.477,114.894,121.477z"/>
<path fill="#EB9759" d="M112.481,122.127c0,0,35.207,28.818,43.691,27.37C163.556,148.026,112.481,122.127,112.481,122.127z"/>
<path fill="#EB9759" d="M108.404,122.24c0,0,26.352,30.883,37.533,29.322C155.906,150.154,108.404,122.24,108.404,122.24z"/>
<path fill="#228299" d="M102.223,117.755c0,0,40.577,26.13,49.637,23.083C159.599,137.872,102.223,117.755,102.223,117.755z"/>
<path fill="#228299" d="M102.438,117.622c0,0,47.158,23.037,54.624,19.041C163.355,132.671,102.438,117.622,102.438,117.622z"/>
<path fill="#228299" d="M100.225,119.031c0,0,35.597,27.719,45.539,25.338C154.886,141.723,100.225,119.031,100.225,119.031z"/>
</g>
<path fill="#D85138" d="M181.552,67.305l-7.597-0.794c8.394-6.804,10.374-25.805,10.374-25.805
C129.147,90.318,74.234,75.301,74.234,75.301l-32.248,4.313c1.71,1.313,3.386,2.54,5.045,3.711l-1.641,0.484
c62.442,64.136,126.179,5.499,126.179,5.499l-7.597-0.796C179.97,82.5,181.552,67.305,181.552,67.305z"/>
<path fill="#D85138" d="M109.231,126.38c2.241-1.986,4.498-4.31,6.766-7.048L61.761,80.339l17.983-0.666
c0,0-8.668-10.662-29.535-28.648c-27.453-23.661-32.627-1.006-32.627-1.006L33.615,81.38c0,0,26.976,61.831,60.759,53.357
c0.868,0.902,1.963,1.762,3.349,2.539c10.533,5.908,20.921-7.661,20.921-7.661L109.231,126.38z"/>
<path fill="#FFFFFF" d="M56.456,65.981c0,0-31.171-4.542-27.007,5.429L21.117,51.47C21.117,51.47,36.894,33.168,56.456,65.981z"/>
<circle fill="#414142" cx="35.665" cy="51.248" r="1.909"/>
<path fill="#595A5C" d="M30.357,75.003c0,0-11.286-12.437-14.187-5.372l5.805-14.134C21.976,55.498,27.011,52.983,30.357,75.003z"
/>
<g>
<path fill="#28A5D3" d="M79.744,79.673c0,0,78.498,17.241,115.381-2.179c0,0-7.257,17.667-17.228,21.831l7.069,2.904
c0,0-5.803,14.137-22.841,15.399l7.069,2.901c0,0-77.681,38.31-119.525-40.818L79.744,79.673z"/>
<path fill="#EB9759" d="M79.744,79.673c0,0,41.426,17.006,81.94,8.863c0,0-4.356,10.604-14.328,14.77l7.071,2.899
c0,0-7.889,9.15-16.409,9.783l10.603,4.352c0,0-62.69,25.805-98.951-40.628L79.744,79.673z"/>
<path fill="#FFE6C6" d="M77.267,79.855c0,0,30.03,20.289,68.617,16.389c0,0-4.844,8.534-13.76,10.994l5.691,3.227
c0,0-7.688,6.918-14.992,6.532l8.534,4.844c0,0-59.226,5.535-81.687-42.127L77.267,79.855z"/>
<path fill="#D85138" d="M78.936,78.721c0,0,20.428,16.26,47.218,15.877c0,0-5.805,14.135-21.392,11.862
c0,0,7.069,2.902,9.152,7.888c0,0-30.92,11.507-65.252-35.626H78.936z"/>
</g>
<path fill="#BBBCBC" d="M24.456,55.093c0,0,0.653-3.764-6.871-5.074c0,0-14.566,16.852-0.821,27
C16.764,77.018,13.659,72.6,24.456,55.093z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="459px" height="459px" viewBox="0 76 459 459" style="enable-background:new 0 0 459 459;" xml:space="preserve">
<g>
<g id="filter">
<path d="M178.5,382.5h102v-51h-102V382.5z M0,76.5v51h459v-51H0z M76.5,255h306v-51h-306V255z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 523 B

View file

@ -0,0 +1,18 @@
<svg width="20" height="38" viewBox="0 0 20 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:figma="http://www.figma.com/figma/ns">
<title>Group</title>
<desc>Created using Figma</desc>
<g id="Canvas" transform="translate(-1659 898)" figma:type="canvas">
<g id="Group" style="mix-blend-mode:normal;" figma:type="frame">
<g id="Line 5" style="mix-blend-mode:normal;" figma:type="line">
<use xlink:href="#path0_stroke" transform="matrix(0.704759 -0.709446 0.704759 0.709446 1660.03 -860.25)" fill="#BFBFBF" style="mix-blend-mode:normal;"/>
</g>
<g id="Line 6" style="mix-blend-mode:normal;" figma:type="line">
<use xlink:href="#path1_stroke" transform="matrix(-0.704759 -0.709446 0.704759 -0.709446 1678.41 -878.75)" fill="#BFBFBF" style="mix-blend-mode:normal;"/>
</g>
</g>
</g>
<defs>
<path id="path0_stroke" d="M 0 -5.55112e-17L 26.0767 -5.55112e-17L 26.0767 -1L 0 -1L 0 -5.55112e-17Z"/>
<path id="path1_stroke" d="M 0 0L 26.0767 0L 26.0767 -1L 0 -1L 0 0Z"/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,3 @@
<svg width="45" height="43" viewBox="0 0 45 43" xmlns="http://www.w3.org/2000/svg">
<path fill="#ffffff" d="M 22.4943 -7.16688e-09C 10.0725 -7.16688e-09 7.85499e-09 9.87083 7.85499e-09 22.044C 7.85499e-09 31.7835 6.44383 40.0444 15.3848 42.9636C 16.5095 43.1662 16.9185 42.4827 16.9185 41.8993C 16.9185 41.376 16.9003 39.9888 16.8889 38.1473C 10.6337 39.4789 9.31356 35.1925 9.31356 35.1925C 8.28882 32.6452 6.81419 31.9683 6.81419 31.9683C 4.77152 30.6011 6.97097 30.6256 6.97097 30.6256C 9.22949 30.7837 10.4156 32.8991 10.4156 32.8991C 12.4219 36.268 15.6824 35.2927 16.9639 34.7316C 17.1661 33.3043 17.7501 32.3335 18.3908 31.7813C 13.3943 31.2268 8.1434 29.3364 8.1434 20.8884C 8.1434 18.4814 9.02045 16.5152 10.4587 14.9721C 10.2292 14.4155 9.45443 12.1732 10.6791 9.13826C 10.6791 9.13826 12.5696 8.54374 16.8685 11.4006C 18.6612 10.9107 20.5857 10.6635 22.5011 10.6568C 24.4097 10.6635 26.3365 10.9107 28.1338 11.4006C 32.4282 8.54596 34.3118 9.13826 34.3118 9.13826C 35.5365 12.1732 34.7685 14.4155 34.539 14.9721C 35.9818 16.513 36.8498 18.4814 36.8498 20.8884C 36.8498 29.3609 31.5897 31.2202 26.5774 31.7657C 27.3885 32.447 28.1088 33.792 28.1088 35.8494C 28.1088 38.7953 28.0793 41.1734 28.0793 41.897C 28.0793 42.4871 28.486 43.1729 29.6266 42.9592C 38.5584 40.0378 45 31.779 45 22.0418C 44.9909 9.86861 34.9162 -7.16688e-09 22.4943 -7.16688e-09Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 491.858 491.858" style="enable-background:new 0 0 491.858 491.858;" xml:space="preserve" width="512px" height="512px">
<g>
<g>
<g>
<path d="M377.472,224.957H201.319v58.718H308.79c-16.032,51.048-63.714,88.077-120.055,88.077 c-69.492,0-125.823-56.335-125.823-125.824c0-69.492,56.333-125.823,125.823-125.823c34.994,0,66.645,14.289,89.452,37.346 l42.622-46.328c-34.04-33.355-80.65-53.929-132.074-53.929C84.5,57.193,0,141.693,0,245.928s84.5,188.737,188.736,188.737 c91.307,0,171.248-64.844,188.737-150.989v-58.718L377.472,224.957L377.472,224.957z" fill="#FFFFFF"/>
<polygon points="491.858,224.857 455.827,224.857 455.827,188.826 424.941,188.826 424.941,224.857 388.91,224.857 388.91,255.74 424.941,255.74 424.941,291.772 455.827,291.772 455.827,255.74 491.858,255.74 " fill="#FFFFFF"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M256,69c60.9,0,68.1,0.2,92.2,1.3c22.2,1,34.3,4.7,42.4,7.9c10.6,4.1,18.2,9.1,26.2,17.1
c8,8,12.9,15.6,17.1,26.2c3.1,8,6.8,20.1,7.9,42.4c1.1,24.1,1.3,31.3,1.3,92.2c0,60.9-0.2,68.1-1.3,92.2c-1,22.2-4.7,34.3-7.9,42.4
c-4.1,10.6-9.1,18.2-17.1,26.2c-8,8-15.6,12.9-26.2,17.1c-8,3.1-20.1,6.8-42.4,7.9c-24.1,1.1-31.3,1.3-92.2,1.3
c-60.9,0-68.1-0.2-92.2-1.3c-22.2-1-34.3-4.7-42.4-7.9c-10.6-4.1-18.2-9.1-26.2-17.1c-8-8-12.9-15.6-17.1-26.2
c-3.1-8-6.8-20.1-7.9-42.4C69.2,324.1,69,316.9,69,256c0-60.9,0.2-68.1,1.3-92.2c1-22.2,4.7-34.3,7.9-42.4
c4.1-10.6,9.1-18.2,17.1-26.2c8-8,15.6-12.9,26.2-17.1c8-3.1,20.1-6.8,42.4-7.9C187.9,69.2,195.1,69,256,69 M256,27.9
c-62,0-69.7,0.3-94.1,1.4c-24.3,1.1-40.9,5-55.4,10.6c-15,5.8-27.7,13.6-40.4,26.3c-12.7,12.7-20.5,25.4-26.3,40.4
c-5.6,14.5-9.5,31.1-10.6,55.4c-1.1,24.3-1.4,32.1-1.4,94.1c0,62,0.3,69.7,1.4,94.1c1.1,24.3,5,40.9,10.6,55.4
c5.8,15,13.6,27.7,26.3,40.4c12.7,12.7,25.4,20.5,40.4,26.3c14.5,5.6,31.1,9.5,55.4,10.6c24.3,1.1,32.1,1.4,94.1,1.4
c62,0,69.7-0.3,94.1-1.4c24.3-1.1,40.9-5,55.4-10.6c15-5.8,27.7-13.6,40.4-26.3c12.7-12.7,20.5-25.4,26.3-40.4
c5.6-14.5,9.5-31.1,10.6-55.4c1.1-24.3,1.4-32.1,1.4-94.1c0-62-0.3-69.7-1.4-94.1c-1.1-24.3-5-40.9-10.6-55.4
c-5.8-15-13.6-27.7-26.3-40.4c-12.7-12.7-25.4-20.5-40.4-26.3c-14.5-5.6-31.1-9.5-55.4-10.6C325.7,28.1,318,27.9,256,27.9"/>
<path fill="#FFFFFF" d="M256,138.8c-64.7,0-117.2,52.5-117.2,117.2c0,64.7,52.5,117.2,117.2,117.2c64.7,0,117.2-52.4,117.2-117.2
C373.2,191.3,320.7,138.8,256,138.8 M256,332c-42,0-76-34-76-76c0-42,34-76,76-76c42,0,76,34,76,76C332,298,298,332,256,332"/>
<path fill="#FFFFFF" d="M405.2,134.2c0,15.1-12.3,27.4-27.4,27.4c-15.1,0-27.4-12.3-27.4-27.4c0-15.1,12.3-27.4,27.4-27.4
C392.9,106.8,405.2,119.1,405.2,134.2"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 114.97 114.97"><defs><style>.cls-1{fill:#fff;}</style></defs><title>icon-linkedin</title><path class="cls-1" d="M1185.54,435.91A57.49,57.49,0,1,1,1243,378.42,57.55,57.55,0,0,1,1185.54,435.91Zm0-109A51.49,51.49,0,1,0,1237,378.42,51.55,51.55,0,0,0,1185.54,326.93Z" transform="translate(-1128.05 -320.93)"/><path class="cls-1" d="M1212.63,403.31v-20c0-10.73-5.73-15.73-13.37-15.73a11.52,11.52,0,0,0-10.46,5.77v-5h-11.61c0.15,3.28,0,34.94,0,34.94h11.61V383.8a7.94,7.94,0,0,1,.38-2.83,6.35,6.35,0,0,1,6-4.25c4.2,0,5.88,3.2,5.88,7.9v18.69h11.61Zm-47.68-39.71c4,0,6.57-2.69,6.57-6s-2.52-6-6.5-6-6.57,2.61-6.57,6,2.52,6,6.42,6h0.07Zm5.81,39.71V368.38h-11.61v34.94h11.61Z" transform="translate(-1128.05 -320.93)"/></svg>

After

Width:  |  Height:  |  Size: 797 B

46
assets/images/loader.svg Normal file
View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50.5 50.5" style="enable-background:new 0 0 50.5 50.5;" xml:space="preserve">
<style type="text/css">
.st0{fill:#9A9999;}
</style>
<path class="st0" d="M48.7,23.5c-1.7,0-1.8,1.1-6,0.6c-0.1-0.4-0.3-0.6-0.4-0.6c-0.2,0-0.3,0.2-0.4,0.6h-0.6
c-0.3-3.5-1.7-6.8-3.9-9.3l0.5-0.5c0.3,0.2,0.6,0.2,0.7,0.1c0.1-0.1,0-0.4-0.2-0.7c2.7-3.4,3.5-2.6,4.7-3.8c1.2-1.2,0-2.5,0-2.5
s-1.2-1.2-2.5,0c-1.2,1.2-0.5,2-3.8,4.7c-0.3-0.2-0.6-0.3-0.7-0.2c-0.1,0.1-0.1,0.4,0.1,0.7l-0.5,0.5c-2.5-2.2-5.8-3.6-9.3-3.9V8.6
C26.8,8.5,27,8.4,27,8.2c0-0.2-0.2-0.3-0.6-0.4c-0.5-4.3,0.6-4.3,0.6-6C27,0,25.3,0,25.3,0s-1.8,0-1.8,1.8c0,1.7,1.1,1.8,0.6,6
c-0.4,0.1-0.6,0.2-0.6,0.4c0,0.2,0.2,0.3,0.6,0.4v0.6c-3.5,0.3-6.8,1.7-9.3,3.9l-0.5-0.5c0.2-0.3,0.2-0.6,0.1-0.7
c-0.1-0.1-0.4,0-0.7,0.2c-3.4-2.7-2.6-3.5-3.8-4.7c-1.2-1.2-2.5,0-2.5,0s-1.2,1.2,0,2.5c1.2,1.2,2,0.5,4.7,3.8
c-0.2,0.3-0.3,0.6-0.2,0.7c0.1,0.1,0.4,0.1,0.7-0.1l0.5,0.5c-2.2,2.5-3.6,5.8-3.9,9.3H8.6c-0.1-0.4-0.2-0.6-0.4-0.6
c-0.2,0-0.3,0.2-0.4,0.6c-4.3,0.5-4.3-0.6-6-0.6C0,23.5,0,25.3,0,25.3S0,27,1.8,27c1.7,0,1.8-1.1,6-0.6C7.9,26.8,8,27,8.2,27
c0.2,0,0.3-0.2,0.4-0.6h0.6c0.3,3.5,1.7,6.8,3.9,9.3l-0.5,0.5c-0.3-0.2-0.6-0.2-0.7-0.1c-0.1,0.1,0,0.4,0.2,0.7
c-2.7,3.4-3.5,2.6-4.7,3.8c-1.2,1.2,0,2.5,0,2.5s1.2,1.2,2.5,0c1.2-1.2,0.5-2,3.8-4.7c0.3,0.2,0.6,0.3,0.7,0.2
c0.1-0.1,0.1-0.4-0.1-0.7l0.5-0.5c2.5,2.2,5.8,3.6,9.3,3.9v0.6c-0.4,0.1-0.6,0.2-0.6,0.4c0,0.2,0.2,0.3,0.6,0.4
c0.5,4.3-0.6,4.3-0.6,6c0,1.8,1.8,1.8,1.8,1.8s1.8,0,1.8-1.8c0-1.7-1.1-1.8-0.6-6c0.4-0.1,0.6-0.2,0.6-0.4c0-0.2-0.2-0.3-0.6-0.4
v-0.6c3.5-0.3,6.8-1.7,9.3-3.9l0.5,0.5c-0.2,0.3-0.2,0.6-0.1,0.7c0.1,0.1,0.4,0,0.7-0.2c3.4,2.7,2.6,3.5,3.8,4.7
c1.2,1.2,2.5,0,2.5,0s1.2-1.2,0-2.5c-1.2-1.2-2-0.5-4.7-3.8c0.2-0.3,0.3-0.6,0.2-0.7c-0.1-0.1-0.4-0.1-0.7,0.1l-0.5-0.5
c2.2-2.5,3.6-5.8,3.9-9.3h0.6c0.1,0.4,0.2,0.6,0.4,0.6c0.2,0,0.3-0.2,0.4-0.6c4.3-0.5,4.3,0.6,6,0.6c1.8,0,1.8-1.8,1.8-1.8
S50.5,23.5,48.7,23.5z M15.8,17.6l0.3,0.3l0.3-0.3c-0.2,0.2-0.2,0.4-0.1,0.4c0.1,0.1,0.3,0,0.4-0.1l1.1,1.7l1.7,1.1
c-0.2,0.2-0.2,0.4-0.1,0.4c0.1,0.1,0.3,0,0.4-0.1l1.2-1.2c0.2-0.2,0.2-0.4,0.1-0.4c-0.1-0.1-0.3,0-0.4,0.1l-1.1-1.7l-1.7-1.1
c0.2-0.2,0.2-0.4,0.1-0.4c-0.1-0.1-0.3,0-0.4,0.1l0.3-0.3l-0.3-0.3c1.8-1.5,4-2.4,6.5-2.7v0.4h0.4c-0.2,0-0.4,0.1-0.4,0.2
c0,0.1,0.2,0.2,0.4,0.2L24,16l0.4,2c-0.2,0-0.4,0.1-0.4,0.2c0,0.1,0.2,0.2,0.4,0.2H24v0.5c-0.9,0.2-1.7,0.5-2.4,1l-0.4-0.4l-1.7,1.7
l0.4,0.4c-0.5,0.7-0.8,1.5-1,2.4h-0.5v0.4c0-0.2-0.1-0.4-0.2-0.4c-0.1,0-0.2,0.2-0.2,0.4l-2-0.4l-2,0.4c0-0.2-0.1-0.4-0.2-0.4
c-0.1,0-0.2,0.2-0.2,0.4v-0.4h-0.4C13.4,21.6,14.4,19.4,15.8,17.6z M29.4,25.3c0,2.3-1.8,4.1-4.1,4.1s-4.1-1.8-4.1-4.1
c0-2.3,1.8-4.1,4.1-4.1S29.4,23,29.4,25.3z M13.5,26.5v-0.4c0,0.2,0.1,0.4,0.2,0.4c0.1,0,0.2-0.2,0.2-0.4l2,0.4l2-0.4
c0,0.2,0.1,0.4,0.2,0.4c0.1,0,0.2-0.2,0.2-0.4v0.4h0.6c0.2,0.9,0.5,1.7,1,2.4l-0.4,0.4l0.3,0.3c-0.2-0.2-0.4-0.2-0.4-0.1
c-0.1,0.1,0,0.3,0.1,0.4L17.8,31l-1.1,1.7c-0.2-0.2-0.4-0.2-0.4-0.1c-0.1,0.1,0,0.3,0.1,0.4l-0.3-0.3l-0.2,0.2
c-1.5-1.8-2.4-4-2.7-6.4H13.5z M17.5,34.2c0.2,0.2,0.4,0.2,0.4,0.1c0.1-0.1,0-0.3-0.1-0.4l1.7-1.1l1.1-1.7c0.2,0.2,0.4,0.2,0.4,0.1
c0.1-0.1,0-0.3-0.1-0.4l0.3,0.3l0.4-0.4c0.7,0.5,1.5,0.8,2.4,1v0.6h0.4c-0.2,0-0.4,0.1-0.4,0.2c0,0.1,0.2,0.2,0.4,0.2l-0.4,2l0.4,2
c-0.2,0-0.4,0.1-0.4,0.2c0,0.1,0.2,0.2,0.4,0.2H24v0.3c-2.4-0.2-4.6-1.2-6.4-2.7l0.2-0.2L17.5,34.2z M26.1,37c0.2,0,0.4-0.1,0.4-0.2
c0-0.1-0.2-0.2-0.4-0.2l0.4-2l-0.4-2c0.2,0,0.4-0.1,0.4-0.2c0-0.1-0.2-0.2-0.4-0.2h0.4v-0.6c0.9-0.2,1.7-0.5,2.4-1l0.4,0.4l0.3-0.3
c-0.2,0.2-0.2,0.4-0.1,0.4c0.1,0.1,0.3,0,0.4-0.1l1.1,1.7l1.7,1.1c-0.2,0.2-0.2,0.4-0.1,0.4c0.1,0.1,0.3,0,0.4-0.1l-0.3,0.3l0.2,0.2
c-1.8,1.5-4,2.4-6.4,2.7V37H26.1z M34.6,32.9l-0.2-0.2L34.1,33c0.2-0.2,0.2-0.4,0.1-0.4c-0.1-0.1-0.3,0-0.4,0.1L32.7,31L31,29.9
c0.2-0.2,0.2-0.4,0.1-0.4c-0.1-0.1-0.3,0-0.4,0.1l0.3-0.3l-0.4-0.4c0.5-0.7,0.8-1.5,1-2.4h0.6v-0.4c0,0.2,0.1,0.4,0.2,0.4
c0.1,0,0.2-0.2,0.2-0.4l2,0.4l2-0.4c0,0.2,0.1,0.4,0.2,0.4c0.1,0,0.2-0.2,0.2-0.4v0.4h0.3C37.1,28.9,36.1,31.2,34.6,32.9z M37,24.1
v0.4c0-0.2-0.1-0.4-0.2-0.4c-0.1,0-0.2,0.2-0.2,0.4l-2-0.4l-2,0.4c0-0.2-0.1-0.4-0.2-0.4c-0.1,0-0.2,0.2-0.2,0.4v-0.4h-0.5
c-0.2-0.9-0.5-1.7-1-2.4l0.4-0.4l-1.7-1.7l-0.4,0.4c-0.7-0.5-1.5-0.8-2.4-1v-0.5h-0.4c0.2,0,0.4-0.1,0.4-0.2c0-0.1-0.2-0.2-0.4-0.2
l0.4-2l-0.4-2c0.2,0,0.4-0.1,0.4-0.2c0-0.1-0.2-0.2-0.4-0.2h0.4v-0.4c2.4,0.2,4.7,1.2,6.5,2.7l-0.3,0.3l0.3,0.3
c-0.2-0.2-0.4-0.2-0.4-0.1c-0.1,0.1,0,0.3,0.1,0.4L31,17.9l-1.1,1.7c-0.2-0.2-0.4-0.2-0.4-0.1c-0.1,0.1,0,0.3,0.1,0.4l1.2,1.2
c0.2,0.2,0.4,0.2,0.4,0.1c0.1-0.1,0-0.3-0.1-0.4l1.7-1.1l1.1-1.7c0.2,0.2,0.4,0.2,0.4,0.1c0.1-0.1,0-0.3-0.1-0.4l0.3,0.3l0.3-0.3
c1.5,1.8,2.4,4,2.7,6.5H37z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -0,0 +1,201 @@
<svg width="520" height="1080" viewBox="0 0 520 1080" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.27" d="M-68.594 578.429L511.218 -1.38306V247.737L177.677 581.277L-68.594 578.429Z" fill="url(#paint0_linear)"/>
<path d="M200.595 334.229H131.194L81.7325 383.691H151.004L200.595 334.229Z" fill="#412578"/>
<path opacity="0.3" d="M437.285 1032.9H413.978L355.712 1091.17H379.019L437.285 1032.9Z" fill="#412578"/>
<g opacity="0.8">
<path opacity="0.8" d="M40.6874 535.96H94.0332V615.978H40.6874V535.96Z" fill="url(#paint1_linear)" stroke="#93D7EA" stroke-width="0.75" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.8" d="M94.0332 615.978L147.379 562.633V482.614L94.0332 535.96V615.978Z" fill="url(#paint2_linear)" stroke="#93D7EA" stroke-width="0.75" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.8" d="M40.6874 535.96L94.0332 482.614H147.379L94.0332 535.96H40.6874Z" fill="url(#paint3_linear)" stroke="#93D7EA" stroke-width="0.75" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<path opacity="0.3" d="M443.888 564.186H410.612L327.356 647.442H360.633L443.888 564.186Z" fill="#412578"/>
<path opacity="0.3" d="M385.622 513.301H226.88L-170.106 910.287H-11.3637L385.622 513.301Z" fill="#412578"/>
<g opacity="0.4">
<path opacity="0.65" d="M128.604 644.205L157.09 615.719H232.965L204.48 644.205H128.604Z" fill="url(#paint4_linear)" stroke="#93D7EA" stroke-width="0.75" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.37" d="M156.831 539.844H232.706V615.719H156.831V539.844V539.844Z" fill="url(#paint5_linear)" stroke="#93D7EA" stroke-width="0.75" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.4" d="M203.962 644.464V568.588" stroke="url(#paint6_linear)" stroke-width="0.75" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<g opacity="0.4">
<g opacity="0.4">
<path opacity="0.78" d="M128.474 644.205L156.959 615.719V539.844L128.474 568.329V644.205Z" fill="url(#paint7_linear)" stroke="#93D7EA" stroke-width="1.2122" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.4" d="M128.346 568.33H204.221V644.205H128.346V568.33V568.33Z" fill="url(#paint8_linear)" stroke="#93D7EA" stroke-width="1.2122" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.4" d="M204.221 644.205L232.707 615.719V539.844L204.221 568.329V644.205Z" fill="url(#paint9_linear)" stroke="#93D7EA" stroke-width="1.2122" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.4" d="M128.346 568.329L156.831 539.844H232.706L204.221 568.329H128.346Z" fill="url(#paint10_linear)" stroke="#93D7EA" stroke-width="1.2122" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<path opacity="0.4" d="M128.993 567.941H204.48" stroke="url(#paint11_linear)" stroke-width="1.3046" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.4" d="M129.511 568.07C129.511 568.588 128.993 569.106 128.475 569.106C127.957 569.106 127.439 568.588 127.439 568.07C127.439 567.552 127.957 567.034 128.475 567.034C128.993 567.034 129.511 567.552 129.511 568.07Z" fill="white"/>
<path opacity="0.4" d="M205.386 568.07C205.386 568.588 204.868 569.106 204.35 569.106C203.832 569.106 203.314 568.588 203.314 568.07C203.314 567.552 203.832 567.034 204.35 567.034C204.868 567.034 205.386 567.552 205.386 568.07Z" fill="white"/>
<path opacity="0.4" d="M129.511 644.205C129.511 644.723 128.993 645.241 128.475 645.241C127.957 645.241 127.439 644.723 127.439 644.205C127.439 643.687 127.957 643.169 128.475 643.169C128.993 643.169 129.511 643.687 129.511 644.205Z" fill="white"/>
<path opacity="0.4" d="M205.386 644.205C205.386 644.723 204.868 645.241 204.35 645.241C203.832 645.241 203.314 644.723 203.314 644.205C203.314 643.687 203.832 643.169 204.35 643.169C204.868 643.169 205.386 643.687 205.386 644.205Z" fill="white"/>
<path opacity="0.4" d="M157.478 540.103C157.478 540.621 156.961 541.139 156.443 541.139C155.925 541.139 155.407 540.621 155.407 540.103C155.407 539.585 155.925 539.067 156.443 539.067C156.961 539.067 157.478 539.585 157.478 540.103Z" fill="white"/>
<path opacity="0.4" d="M233.224 540.103C233.224 540.621 232.706 541.139 232.189 541.139C231.671 541.139 231.153 540.621 231.153 540.103C231.153 539.585 231.671 539.067 232.189 539.067C232.836 539.067 233.224 539.585 233.224 540.103Z" fill="white"/>
<path opacity="0.4" d="M233.224 616.237C233.224 616.755 232.706 617.273 232.189 617.273C231.671 617.273 231.153 616.755 231.153 616.237C231.153 615.719 231.671 615.201 232.189 615.201C232.836 615.201 233.224 615.719 233.224 616.237Z" fill="white"/>
</g>
</g>
<path d="M367.625 429.138L299.777 496.986V429.138L367.625 361.291V429.138Z" fill="url(#paint12_linear)" stroke="#93D7EA" stroke-width="1.2122" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M299.648 429.138H274.27L342.117 361.291H367.495L299.648 429.138Z" fill="url(#paint13_linear)" stroke="#93D7EA" stroke-width="1.2122" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.8" d="M274.27 429.138H299.648V496.986H274.27V429.138Z" fill="url(#paint14_linear)" stroke="#93D7EA" stroke-width="0.75" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M275.435 429.138C275.435 429.656 275.046 430.045 274.528 430.045C274.01 430.045 273.622 429.656 273.622 429.138C273.622 428.62 274.01 428.232 274.528 428.232C275.046 428.232 275.435 428.62 275.435 429.138Z" fill="white"/>
<path d="M300.554 429.138C300.554 429.656 300.165 430.045 299.648 430.045C299.13 430.045 298.741 429.656 298.741 429.138C298.741 428.62 299.13 428.232 299.648 428.232C300.036 428.232 300.554 428.62 300.554 429.138Z" fill="white"/>
<path d="M275.435 496.856C275.435 497.374 275.046 497.763 274.528 497.763C274.01 497.763 273.622 497.374 273.622 496.856C273.622 496.338 274.01 495.95 274.528 495.95C275.046 495.95 275.435 496.338 275.435 496.856Z" fill="white"/>
<path d="M300.554 496.856C300.554 497.374 300.165 497.763 299.648 497.763C299.13 497.763 298.741 497.374 298.741 496.856C298.741 496.338 299.13 495.95 299.648 495.95C300.036 495.95 300.554 496.338 300.554 496.856Z" fill="white"/>
<path d="M368.919 361.42C368.919 361.938 368.531 362.327 368.013 362.327C367.495 362.327 367.107 361.938 367.107 361.42C367.107 360.902 367.495 360.514 368.013 360.514C368.531 360.514 368.919 360.902 368.919 361.42Z" fill="white"/>
<path d="M343.023 361.42C343.023 361.938 342.635 362.327 342.117 362.327C341.599 362.327 341.211 361.938 341.211 361.42C341.211 360.902 341.599 360.514 342.117 360.514C342.635 360.514 343.023 360.902 343.023 361.42Z" fill="white"/>
<path d="M368.919 429.138C368.919 429.656 368.531 430.045 368.013 430.045C367.495 430.045 367.107 429.656 367.107 429.138C367.107 428.62 367.495 428.232 368.013 428.232C368.531 428.232 368.919 428.62 368.919 429.138Z" fill="white"/>
<path d="M200.984 790.906V879.082L493.35 586.586V486.239L202.149 777.311L200.984 790.906Z" stroke="#95D4E7" stroke-miterlimit="10"/>
<path d="M523.13 591.118V526.119L463.44 585.809V650.42L487.912 625.948L523.13 591.118Z" fill="url(#paint15_linear)"/>
<path opacity="0.61" d="M2.23177 336.56L240.475 98.3167H371.25L441.817 168.883L-8.77405 619.474V345.624L2.23177 336.56Z" fill="url(#paint16_linear)"/>
<path d="M96.1048 571.307L-38.425 707.003V729.532L119.8 571.178L96.1048 571.307Z" fill="url(#paint17_linear)"/>
<path opacity="0.27" d="M499.824 613.518L813.554 299.658H828.703L512.383 615.978L499.824 613.518Z" fill="url(#paint18_linear)"/>
<path opacity="0.27" d="M127.439 912.229L355.713 683.955V782.101L224.42 913.394L127.439 912.229Z" fill="url(#paint19_linear)"/>
<path opacity="0.6" d="M519.116 965.834V910.287H463.44L519.116 965.834Z" fill="url(#paint20_linear)"/>
<path opacity="0.4" d="M327.097 516.019V630.868L442.723 508.639V395.732L327.097 516.019Z" fill="url(#paint21_linear)"/>
<path d="M94.0332 687.322L372.286 409.069H385.622L105.169 689.523L94.0332 687.322Z" fill="url(#paint22_linear)"/>
<path d="M426.409 720.857H402.196L384.845 738.207H409.188L426.409 720.857Z" fill="#E30D13"/>
<defs>
<linearGradient id="paint0_linear" x1="210.919" y1="544.839" x2="252.208" y2="18.3994" gradientUnits="userSpaceOnUse">
<stop stop-color="#9EE0E0" stop-opacity="0.9"/>
<stop offset="0.0690068" stop-color="#87D9D8" stop-opacity="0.9069"/>
<stop offset="0.1999" stop-color="#62CDCC" stop-opacity="0.92"/>
<stop offset="0.3369" stop-color="#43C4C2" stop-opacity="0.9337"/>
<stop offset="0.4797" stop-color="#2BBCBB" stop-opacity="0.948"/>
<stop offset="0.6307" stop-color="#1BB7B5" stop-opacity="0.9631"/>
<stop offset="0.7955" stop-color="#10B4B2" stop-opacity="0.9796"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="86.8793" y1="548.022" x2="-31.5978" y2="717.592" gradientUnits="userSpaceOnUse">
<stop stop-color="#F9B000"/>
<stop offset="0.0455285" stop-color="#F69903"/>
<stop offset="0.1341" stop-color="#F17407"/>
<stop offset="0.23" stop-color="#ED540B"/>
<stop offset="0.3333" stop-color="#E93A0E"/>
<stop offset="0.4468" stop-color="#E72610"/>
<stop offset="0.5756" stop-color="#E51812"/>
<stop offset="0.7329" stop-color="#E41013"/>
<stop offset="1" stop-color="#E30D13"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="8.42613" y1="621.292" x2="192.07" y2="503.552" gradientUnits="userSpaceOnUse">
<stop offset="0.00124199" stop-color="#F9B000" stop-opacity="0.7"/>
<stop offset="0.046714" stop-color="#F69903" stop-opacity="0.7137"/>
<stop offset="0.1351" stop-color="#F17407" stop-opacity="0.7402"/>
<stop offset="0.231" stop-color="#ED540B" stop-opacity="0.769"/>
<stop offset="0.3342" stop-color="#E93A0E" stop-opacity="0.8"/>
<stop offset="0.4475" stop-color="#E72610" stop-opacity="0.834"/>
<stop offset="0.5762" stop-color="#E51812" stop-opacity="0.8727"/>
<stop offset="0.7332" stop-color="#E41013" stop-opacity="0.9199"/>
<stop offset="1" stop-color="#E30D13"/>
</linearGradient>
<linearGradient id="paint3_linear" x1="-90.7801" y1="491.557" x2="132.111" y2="513.032" gradientUnits="userSpaceOnUse">
<stop stop-color="#C86128"/>
<stop offset="1" stop-color="#B83626"/>
</linearGradient>
<linearGradient id="paint4_linear" x1="-4.1855" y1="612.121" x2="218.97" y2="633.621" gradientUnits="userSpaceOnUse">
<stop stop-color="#412D79"/>
<stop offset="1" stop-color="#1988BE"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="43.3468" y1="563.209" x2="226.08" y2="580.815" gradientUnits="userSpaceOnUse">
<stop stop-color="#412D79"/>
<stop offset="1" stop-color="#1988BE"/>
</linearGradient>
<linearGradient id="paint6_linear" x1="-nan" y1="-nan" x2="-nan" y2="-nan" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0"/>
<stop offset="1" stop-color="white"/>
</linearGradient>
<linearGradient id="paint7_linear" x1="125.822" y1="596.701" x2="165.997" y2="585.55" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint8_linear" x1="186.759" y1="584.48" x2="62.9013" y2="716.77" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint9_linear" x1="201.587" y1="596.701" x2="241.762" y2="585.55" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint10_linear" x1="134.897" y1="578.386" x2="227.683" y2="528.988" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint11_linear" x1="-nan" y1="-nan" x2="-nan" y2="-nan" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0"/>
<stop offset="1" stop-color="white"/>
</linearGradient>
<linearGradient id="paint12_linear" x1="296.265" y1="512.615" x2="364.588" y2="359.948" gradientUnits="userSpaceOnUse">
<stop stop-color="#160F4A" stop-opacity="0"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint13_linear" x1="249.759" y1="427.379" x2="351.876" y2="381.199" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint14_linear" x1="291.639" y1="457.632" x2="239.337" y2="518.417" gradientUnits="userSpaceOnUse">
<stop stop-color="#412D79"/>
<stop offset="1" stop-color="#1988BE"/>
</linearGradient>
<linearGradient id="paint15_linear" x1="501.325" y1="463.542" x2="489.815" y2="643.6" gradientUnits="userSpaceOnUse">
<stop stop-color="#0DB3B1"/>
<stop offset="0.0800204" stop-color="#11A4AA"/>
<stop offset="0.388" stop-color="#1D6E91"/>
<stop offset="0.6549" stop-color="#26487F"/>
<stop offset="0.8678" stop-color="#2B3074"/>
<stop offset="1" stop-color="#2D2870"/>
</linearGradient>
<linearGradient id="paint16_linear" x1="379.168" y1="94.602" x2="3.56627" y2="470.204" gradientUnits="userSpaceOnUse">
<stop stop-color="#49BABB" stop-opacity="0.9"/>
<stop offset="0.2113" stop-color="#4BB7B9" stop-opacity="0.9211"/>
<stop offset="0.3934" stop-color="#51ACB3" stop-opacity="0.9393"/>
<stop offset="0.5647" stop-color="#5B9AA9" stop-opacity="0.9565"/>
<stop offset="0.7295" stop-color="#68819B" stop-opacity="0.9729"/>
<stop offset="0.8881" stop-color="#7A6189" stop-opacity="0.9888"/>
<stop offset="1" stop-color="#89467A"/>
</linearGradient>
<linearGradient id="paint17_linear" x1="-44.393" y1="723.589" x2="113.902" y2="565.294" gradientUnits="userSpaceOnUse">
<stop stop-color="#9EE0E0" stop-opacity="0.9"/>
<stop offset="0.0690068" stop-color="#87D9D8" stop-opacity="0.9069"/>
<stop offset="0.1999" stop-color="#62CDCC" stop-opacity="0.92"/>
<stop offset="0.3369" stop-color="#43C4C2" stop-opacity="0.9337"/>
<stop offset="0.4797" stop-color="#2BBCBB" stop-opacity="0.948"/>
<stop offset="0.6307" stop-color="#1BB7B5" stop-opacity="0.9631"/>
<stop offset="0.7955" stop-color="#10B4B2" stop-opacity="0.9796"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint18_linear" x1="499.78" y1="457.835" x2="828.66" y2="457.835" gradientUnits="userSpaceOnUse">
<stop stop-color="#9EE0E0" stop-opacity="0.9"/>
<stop offset="0.0690068" stop-color="#87D9D8" stop-opacity="0.9069"/>
<stop offset="0.1999" stop-color="#62CDCC" stop-opacity="0.92"/>
<stop offset="0.3369" stop-color="#43C4C2" stop-opacity="0.9337"/>
<stop offset="0.4797" stop-color="#2BBCBB" stop-opacity="0.948"/>
<stop offset="0.6307" stop-color="#1BB7B5" stop-opacity="0.9631"/>
<stop offset="0.7955" stop-color="#10B4B2" stop-opacity="0.9796"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint19_linear" x1="237.473" y1="899.056" x2="253.73" y2="691.786" gradientUnits="userSpaceOnUse">
<stop stop-color="#9EE0E0" stop-opacity="0.9"/>
<stop offset="0.0690068" stop-color="#87D9D8" stop-opacity="0.9069"/>
<stop offset="0.1999" stop-color="#62CDCC" stop-opacity="0.92"/>
<stop offset="0.3369" stop-color="#43C4C2" stop-opacity="0.9337"/>
<stop offset="0.4797" stop-color="#2BBCBB" stop-opacity="0.948"/>
<stop offset="0.6307" stop-color="#1BB7B5" stop-opacity="0.9631"/>
<stop offset="0.7955" stop-color="#10B4B2" stop-opacity="0.9796"/>
<stop offset="1" stop-color="#0DB3B1"/>
</linearGradient>
<linearGradient id="paint20_linear" x1="555.91" y1="890.358" x2="441.045" y2="975.174" gradientUnits="userSpaceOnUse">
<stop offset="0.00124199" stop-color="#F2F2F2"/>
<stop offset="0.2791" stop-color="#E3E3E3"/>
<stop offset="0.6619" stop-color="#D6D6D6"/>
<stop offset="1" stop-color="#D1D1D1"/>
</linearGradient>
<linearGradient id="paint21_linear" x1="384.889" y1="395.701" x2="384.889" y2="630.868" gradientUnits="userSpaceOnUse">
<stop offset="0.00124199" stop-color="#F9B000" stop-opacity="0.7"/>
<stop offset="0.2564" stop-color="#F59C05" stop-opacity="0.7766"/>
<stop offset="0.7738" stop-color="#EC6A12" stop-opacity="0.932"/>
<stop offset="1" stop-color="#E85218"/>
</linearGradient>
<linearGradient id="paint22_linear" x1="93.9868" y1="549.345" x2="385.611" y2="549.345" gradientUnits="userSpaceOnUse">
<stop offset="0.00124199" stop-color="#E30D13" stop-opacity="0.7"/>
<stop offset="0.147" stop-color="#E52123" stop-opacity="0.7438"/>
<stop offset="0.4444" stop-color="#E8534D" stop-opacity="0.8331"/>
<stop offset="0.8632" stop-color="#EEA48F" stop-opacity="0.9589"/>
<stop offset="1" stop-color="#F0C0A6"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

BIN
assets/images/login-bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,9 @@
<svg viewBox="0 0 119 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.29798 0L0 6.36371H31.8841L38.1818 0H6.29798Z" fill="#13BEBB"/>
<path d="M18.3033 39.9567C26.1372 39.9567 28.1071 36.8068 28.1071 32.4921C28.1071 27.1847 23.3171 26.1924 19.333 25.545C16.2888 25.0271 14.9011 24.7683 14.9011 22.913C14.9011 21.5323 16.1097 21.0144 18.0795 21.0144C20.4969 21.0144 21.1683 21.7049 21.3923 23.7328L27.749 22.7835C27.2115 18.4255 24.7495 16.2249 18.2585 16.2249C11.141 16.2249 8.63409 19.0727 8.63409 23.6033C8.58946 29.4717 14.1403 30.0756 18.2585 30.7658C20.81 31.2409 21.7952 31.6719 21.7952 33.3549C21.7952 34.7359 20.9447 35.34 18.3928 35.34C15.5726 35.34 14.7221 34.8653 14.364 32.5783L8.18652 33.4844C8.7684 38.1014 11.4991 39.9567 18.3033 39.9567Z" fill="white"/>
<path d="M38.794 35.2108C35.7944 35.2108 34.7204 34.5635 34.7204 32.4061C34.7204 30.4644 35.7944 29.6877 39.0177 29.6877H42.2408V31.9315C42.2408 34.0889 41.1665 35.2108 38.794 35.2108ZM36.0184 39.9571C39.5101 39.9571 41.0771 38.8351 42.1962 37.1954V39.655H48.5078V24.0352C48.5078 18.8141 46.4933 16.1821 39.5101 16.1821C32.7505 16.1821 30.3782 18.0805 29.438 22.7406L35.7052 23.69C36.1079 21.7052 36.69 21.1009 39.2864 21.1009C41.7932 21.1009 42.1962 22.1365 42.1962 23.8626V25.4592H39.2415C31.2287 25.4592 28.4978 27.8755 28.4978 32.7943C28.4978 37.6269 30.9601 39.9571 36.0184 39.9571Z" fill="white"/>
<path d="M50.1196 39.6545H56.566V6.36353L50.1196 12.727V39.6545Z" fill="white"/>
<path d="M64.4442 25.5879V24.4231C64.4442 22.3952 65.3844 21.0143 68.2046 21.0143C70.9352 21.0143 71.8308 22.1793 71.8308 24.4231V25.5879H64.4442ZM68.2046 39.9999C75.6357 39.9999 77.6054 36.548 78.0529 33.0961L71.9203 32.1899C71.6516 34.2609 71.2487 35.3398 68.2046 35.3398C65.116 35.3398 64.4442 33.8294 64.4442 31.8448V29.9462H78.0529V25.8038C78.0529 20.022 75.7698 16.1816 68.2046 16.1816C60.729 16.1816 58.1772 20.0651 58.1772 24.9841V31.1974C58.1772 35.9872 60.7736 39.9999 68.2046 39.9999Z" fill="white"/>
<path d="M90.0053 39.9999C97.3914 39.9999 100.435 36.2459 100.435 31.1974V24.9841C100.435 19.8494 97.3914 16.1816 90.0053 16.1816C82.6188 16.1816 79.6646 19.8494 79.6646 24.9841V31.1974C79.6646 36.2459 82.5742 39.9999 90.0053 39.9999ZM90.0053 34.9947C87.4088 34.9947 86.1107 33.6571 86.1107 31.4997V24.8548C86.1107 22.6542 87.4088 21.3165 90.0053 21.3165C92.6017 21.3165 93.9892 22.6542 93.9892 24.8548V31.4997C93.9892 33.6571 92.6017 34.9947 90.0053 34.9947Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M111.948 22.767H108.493V39.5199H102.047V22.767L108.345 16.4033H118.246L111.948 22.767Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1 @@
<svg enable-background="new 20 0 57.6 19.5" viewBox="0 0 57.6 19.5" xmlns="http://www.w3.org/2000/svg"><path d="m15.5 3.1h-15.5l3.1-3.1h15.5z" fill="#54baba"/><g fill="#222046"><path d="m8.9 19.5c3.8 0 4.8-1.5 4.8-3.6 0-2.6-2.3-3.1-4.3-3.4-1.5-.3-2.2-.4-2.2-1.3 0-.7.6-.9 1.5-.9 1.2 0 1.5.3 1.6 1.3l3.1-.5c-.1-2.1-1.3-3.2-4.5-3.2-3.5 0-4.7 1.4-4.7 3.6 0 2.9 2.7 3.2 4.7 3.5 1.2.2 1.7.4 1.7 1.3 0 .7-.4 1-1.7 1-1.4 0-1.8-.2-2-1.3l-3 .4c.4 2.2 1.7 3.1 5 3.1z"/><path d="m17.5 19.5c1.7 0 2.5-.5 3-1.3v1.2h3.1v-7.6c0-2.5-1-3.8-4.4-3.8-3.3 0-4.4.9-4.9 3.2l3.1.5c.2-1 .5-1.3 1.7-1.3s1.4.5 1.4 1.3v.8h-1.4c-3.9 0-5.2 1.2-5.2 3.6 0 2.2 1.2 3.4 3.6 3.4zm1.4-2.3c-1.5 0-2-.3-2-1.4 0-.9.5-1.3 2.1-1.3h1.6v1.1c0 1-.5 1.6-1.7 1.6z"/><path d="m24.4 19.3h3.1v-16.2l-3.1 3.1z"/><path d="m33.2 19.5c3.6 0 4.6-1.7 4.8-3.4l-3-.4c-.1 1-.3 1.5-1.8 1.5s-1.8-.7-1.8-1.7v-.9h6.6v-2c0-2.8-1.1-4.7-4.8-4.7-3.6 0-4.9 1.9-4.9 4.3v3c0 2.3 1.3 4.3 4.9 4.3zm-1.8-7v-.6c0-1 .5-1.7 1.8-1.7s1.8.6 1.8 1.7v.6z"/><path d="m43.8 7.9c-3.6 0-5 1.8-5 4.3v3c0 2.5 1.4 4.3 5 4.3s5.1-1.8 5.1-4.3v-3c0-2.5-1.5-4.3-5.1-4.3zm2 7.4c0 1.1-.7 1.7-1.9 1.7s-1.9-.7-1.9-1.7v-3.2c0-1.1.6-1.7 1.9-1.7s1.9.7 1.9 1.7z"/><path d="m52.8 8-3.1 3.1v8.2h3.1v-8.2h1.7l3.1-3.1z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1 @@
<svg viewBox="0 0 538 182" xmlns="http://www.w3.org/2000/svg" xmlns:serif="http://www.serif.com/" fill-rule="evenodd" clip-rule="evenodd"><g serif:id="Saleor OS"><path fill="none" d="M0 0h537.903v181.963H0z"/><clipPath id="a"><path d="M0 0h537.903v181.963H0z"/></clipPath><g serif:id="Layer 1" clip-path="url(#a)"><path d="M28.649 0L-.001 28.949l145.042-.001 28.65-28.949L28.649 0z" fill="#fff"/><path d="M83.256 181.766c35.637 0 44.598-14.329 44.598-33.957 0-24.144-21.79-28.658-39.914-31.603-13.848-2.356-20.161-3.533-20.161-11.973 0-6.281 5.498-8.637 14.459-8.637 10.997 0 14.051 3.141 15.07 12.366l28.917-4.318c-2.445-19.825-13.645-29.836-43.173-29.836-32.378 0-43.782 12.955-43.782 33.565-.203 26.696 25.048 29.443 43.782 32.583 11.607 2.161 16.089 4.122 16.089 11.778 0 6.282-3.869 9.03-15.478 9.03-12.829 0-16.698-2.159-18.327-12.563l-28.102 4.122c2.647 21.003 15.069 29.443 46.022 29.443m93.212-21.59c-13.645 0-18.531-2.945-18.531-12.759 0-8.833 4.886-12.366 19.549-12.366h14.662v10.207c0 9.814-4.887 14.918-15.68 14.918m-12.626 21.591c15.884 0 23.012-5.104 28.103-12.563v11.189h28.712v-71.056c0-23.751-9.164-35.724-40.931-35.724-30.75 0-41.542 8.636-45.819 29.835l28.51 4.319c1.832-9.029 4.48-11.778 16.291-11.778 11.404 0 13.237 4.711 13.237 12.563v7.263h-13.441c-36.451 0-48.874 10.992-48.874 33.368 0 21.984 11.201 32.584 34.212 32.584M227.989 180.392h29.325V28.949l-29.325 28.948v122.495zm65.165-63.99v-5.299c0-9.225 4.277-15.507 17.106-15.507 12.422 0 16.496 5.3 16.496 15.507v5.299h-33.602zm17.106 65.561c33.805 0 42.765-15.703 44.801-31.406l-27.898-4.122c-1.222 9.421-3.055 14.329-16.903 14.329-14.05 0-17.106-6.871-17.106-15.899v-8.637h61.907v-18.844c0-26.302-10.386-43.772-44.801-43.772-34.007 0-45.615 17.666-45.615 40.043v28.265c0 21.789 11.811 40.043 45.615 40.043m99.173 0c33.6 0 47.447-17.077 47.447-40.043v-28.265c0-23.358-13.847-40.043-47.447-40.043-33.602 0-47.041 16.685-47.041 40.043v28.265c0 22.966 13.236 40.043 47.041 40.043m0-22.769c-11.812 0-17.717-6.085-17.717-15.899v-30.228c0-10.011 5.905-16.096 17.717-16.096 11.811 0 18.123 6.085 18.123 16.096v30.228c0 9.814-6.312 15.899-18.123 15.899M509.253 103.568h-15.718v76.21h-29.324v-76.21l28.65-28.949h45.042l-28.65 28.949z" fill="#fff"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

View file

@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.5 5H22.5C23.328 5 24 5.448 24 6C24 6.552 23.328 7 22.5 7H1.5C0.672 7 0 6.552 0 6C0 5.448 0.672 5 1.5 5Z" fill="#323232"/>
<path d="M1.5 11H22.5C23.328 11 24 11.448 24 12C24 12.552 23.328 13 22.5 13H1.5C0.672 13 0 12.552 0 12C0 11.448 0.672 11 1.5 11Z" fill="#323232"/>
<path d="M1.5 17H22.5C23.328 17 24 17.448 24 18C24 18.552 23.328 19 22.5 19H1.5C0.672 19 0 18.552 0 18C0 17.448 0.672 17 1.5 17Z" fill="#323232"/>
</svg>

After

Width:  |  Height:  |  Size: 536 B

View file

@ -0,0 +1,151 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="360px" height="360px" viewBox="0 0 720 720" enable-background="new 0 0 720 720" xml:space="preserve">
<g>
<defs>
<circle id="SVGID_1_" cx="359.75" cy="361.057" r="350.25"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<rect x="-15.285" y="-17.386" clip-path="url(#SVGID_2_)" fill="#C8E5EC" width="751.374" height="493.886"/>
<g clip-path="url(#SVGID_2_)">
<g opacity="0.9">
<path fill="#FFFFFF" d="M180.169,250.249c0,0,0-71.167,71.167-71.167s71.167,71.167,71.167,71.167s35.585,0,35.585,35.583
h-177.92V250.249z"/>
<path fill="#FFFFFF" d="M109.002,321.416c0,0-35.583,0-35.583-35.584c0-35.583,35.583-35.583,35.583-35.583
s35.585,0,35.585,35.583h142.334c0,0,0-35.583,35.583-35.583c0,0,35.585,0,35.585,35.583c0,0,0,35.584-35.585,35.584H109.002z"/>
<path fill="#FFFFFF" d="M109.002,285.832c0,0,0-71.167,71.167-71.167c71.167,0,71.167,71.167,71.167,71.167H109.002z"/>
<path fill="#FFFFFF" d="M180.169,321.416c0,0,0-71.167,71.167-71.167s71.167,71.167,71.167,71.167H180.169z"/>
</g>
</g>
<g clip-path="url(#SVGID_2_)">
<g opacity="0.9">
<path fill="#FFFFFF" d="M590.455,389.175c0,0,0-30.077,30.076-30.077c30.077,0,30.077,30.077,30.077,30.077
s15.039,0,15.039,15.037h-75.192V389.175z"/>
<path fill="#FFFFFF" d="M560.378,419.251c0,0-15.037,0-15.037-15.039c0-15.037,15.037-15.037,15.037-15.037s15.04,0,15.04,15.037
h60.153c0,0,0-15.037,15.037-15.037c0,0,15.039,0,15.039,15.037c0,0,0,15.039-15.039,15.039H560.378z"/>
<path fill="#FFFFFF" d="M560.378,404.212c0,0,0-30.074,30.077-30.074c30.076,0,30.076,30.074,30.076,30.074H560.378z"/>
<path fill="#FFFFFF" d="M590.455,419.251c0,0,0-30.076,30.076-30.076c30.077,0,30.077,30.076,30.077,30.076H590.455z"/>
</g>
</g>
<rect x="-15.285" y="476.5" clip-path="url(#SVGID_2_)" fill="#57ACCD" width="751.374" height="257.487"/>
<ellipse clip-path="url(#SVGID_2_)" fill="#3F89A0" cx="348.662" cy="593.902" rx="152.623" ry="23.48"/>
<g clip-path="url(#SVGID_2_)">
<polygon fill="#A6A8AC" points="193.428,596.516 216.908,573.035 381.271,549.555 451.713,526.074 475.193,549.555
498.673,596.516 "/>
<path fill="#F0D4C0" d="M494.9,359.273c-4.986,10.367-14.818,15.985-21.96,12.551c-7.139-3.435-8.889-14.621-3.905-24.986
c4.985-10.367,14.817-15.987,21.959-12.553C498.133,337.719,499.884,348.907,494.9,359.273z"/>
<path fill="none" stroke="#237378" stroke-width="14.6391" stroke-miterlimit="10" d="M406.306,370.474
c0,0,20.872,70.441,67.832,0"/>
<path fill="none" stroke="#237378" stroke-width="10.4357" stroke-miterlimit="10" d="M324.952,445.694
c0,0-11.121,63.919,5.401,105.662"/>
<path fill="#237378" d="M301.194,465.267v11.302c0,0,0,22.614,58.556,22.614c58.559,0,58.559-22.614,58.559-22.614v-11.302
H301.194z"/>
<rect x="301.194" y="386.347" fill="#237378" width="117.114" height="83.699"/>
<path fill="#455B5F" d="M428.983,303.905c-19.669-0.785,11.31-80.341-67.664-80.378l-20.68,1.378
c-59.323,10.24-37.017,85.255-56.406,88.643c-19.394,3.387-33.801-39.667-31.019,2.067c2.779,41.733,42.189,44.347,42.189,44.347
l64.334-4.287l64.337-4.287c0,0,29.775-7.223,26.996-48.957C448.288,260.7,448.655,304.688,428.983,303.905"/>
<path fill="#F0D4C0" d="M311.179,352.775c0.492,7.408-3.89,13.731-9.793,14.126c-5.901,0.393-11.085-5.294-11.58-12.702
c-0.492-7.407,3.893-13.73,9.791-14.124C305.5,339.684,310.685,345.369,311.179,352.775z"/>
<path fill="#F0D4C0" d="M428.701,344.945c0.494,7.409-3.891,13.731-9.794,14.125c-5.898,0.394-11.083-5.293-11.577-12.701
c-0.494-7.407,3.891-13.73,9.791-14.123C423.024,331.853,428.209,337.539,428.701,344.945z"/>
<rect x="301.199" y="421.924" fill="#754D29" width="117.111" height="36.597"/>
<path fill="none" stroke="#237378" stroke-width="14.6391" stroke-miterlimit="10" d="M308.175,390.973
c0,0-58.482,25.03,3.595,56.164"/>
<path fill="#F0D4C0" d="M362.247,399.523c52.884-3.523,55.886-36.087,55.666-45.293l-0.16-2.419l-0.974-14.606
c0,0-3.245-36.462-60.858-32.623c-57.616,3.838-55.993,40.409-55.993,40.409l0.974,14.605l0.16,2.419
C302.065,371.172,309.362,403.047,362.247,399.523"/>
<path fill="#333333" d="M406.474,341.56c0.67,10.082-6.96,18.801-17.042,19.474c-10.081,0.67-18.803-6.959-19.473-17.042
c-0.673-10.083,6.958-18.803,17.04-19.476C397.08,323.845,405.801,331.476,406.474,341.56"/>
<line fill="none" stroke="#333333" stroke-width="4.0664" stroke-miterlimit="10" x1="358.976" y1="322.566" x2="412.135" y2="369.506"/>
<path fill="#414142" d="M299.487,338.395l-0.046-0.707C299.441,337.688,299.452,337.937,299.487,338.395"/>
<path fill="#414142" d="M416.291,329.901l0.048,0.708C416.313,330.151,416.291,329.901,416.291,329.901"/>
<path fill="#57ACCD" d="M299.711,341.736c0,0,23.088-8.22,57.982-10.545c34.892-2.325,58.87,2.761,58.87,2.761
s-0.594-33.371-60.643-29.37C295.872,308.582,299.711,341.736,299.711,341.736"/>
<path fill="#333333" d="M354.234,346.746c0.207,3.094-2.135,5.771-5.23,5.977s-5.771-2.135-5.975-5.23
c-0.207-3.096,2.132-5.771,5.228-5.977C351.353,341.309,354.028,343.65,354.234,346.746"/>
<rect x="381.113" y="321.119" transform="matrix(0.9969 0.0792 -0.0792 0.9969 26.9061 -29.8359)" fill="#333333" width="17.081" height="6.443"/>
<path fill="#333333" d="M356.277,269.875c0.665,0.191,1.435,0.395,2.232,0.598c1.131,0.285,2.209-0.613,2.132-1.773l-0.509-7.655
c-0.046-0.687-0.5-1.288-1.154-1.502c-0.13-0.042-0.255-0.085-0.379-0.134c-1.353-0.477-1.84-1.135-1.921-2.386
c-0.069-1.005,0.586-1.868,1.87-2.414c0.673-0.286,1.09-0.961,1.042-1.687l-0.069-1.032c-0.061-0.943,0.65-1.759,1.595-1.822
l0.494-0.033c0.943-0.062,1.759,0.651,1.822,1.595l0.074,1.107c0.051,0.759,0.601,1.375,1.342,1.555
c1.274,0.313,2.424,0.868,3.453,1.669c0.662,0.516,1.612,0.439,2.216-0.149l5.01-4.903c0.69-0.675,0.697-1.804-0.011-2.461
c-3.786-3.502-8.912-5.039-15.376-4.608c-4.321,0.288-7.938,1.661-10.851,4.18c-2.912,2.521-4.204,5.814-3.926,9.945
C345.752,263.849,349.414,267.817,356.277,269.875"/>
<path fill="#333333" d="M368.69,261.818c-0.76-0.222-1.569-0.438-2.38-0.641c-1.126-0.285-2.201,0.613-2.125,1.773l0.522,7.832
c0.046,0.712,0.532,1.315,1.215,1.526c0.003,0,0.006,0.002,0.011,0.002c1.732,0.577,2.54,1.341,2.619,2.53
c0.087,1.321-0.649,2.284-2.209,2.875c-0.688,0.26-1.111,0.962-1.063,1.696l0.076,1.149c0.064,0.944-0.649,1.758-1.592,1.822
l-0.494,0.032c-0.945,0.063-1.761-0.65-1.822-1.592l-0.068-1.012c-0.054-0.81-0.67-1.457-1.473-1.577
c-2.792-0.42-5.3-1.669-7.188-3.44c-0.629-0.591-1.618-0.575-2.265-0.004l-5.467,4.814c-0.711,0.626-0.795,1.722-0.153,2.421
c1.717,1.873,3.885,3.465,6.532,4.775c3.315,1.603,7.378,2.211,12.26,1.886c11.582-0.771,17.045-6.542,16.481-14.992
C379.715,267.747,376.382,264.008,368.69,261.818"/>
<path fill="#E4F1DF" d="M356.114,267.454c0.667,0.192,1.437,0.397,2.234,0.599c1.129,0.284,2.209-0.614,2.133-1.775l-0.512-7.653
c-0.046-0.687-0.5-1.289-1.152-1.503c-0.13-0.041-0.255-0.085-0.382-0.132c-1.351-0.477-1.837-1.135-1.921-2.387
c-0.066-1.005,0.586-1.868,1.873-2.414c0.67-0.285,1.091-0.96,1.042-1.684l-0.068-1.033c-0.064-0.943,0.649-1.759,1.595-1.822
l0.492-0.033c0.945-0.062,1.76,0.651,1.824,1.595l0.073,1.105c0.049,0.762,0.602,1.375,1.341,1.558
c1.276,0.313,2.425,0.868,3.454,1.667c0.663,0.518,1.613,0.439,2.217-0.149l5.007-4.902c0.69-0.676,0.7-1.805-0.008-2.461
c-3.789-3.503-8.912-5.039-15.379-4.608c-4.321,0.288-7.936,1.66-10.848,4.181c-2.915,2.52-4.204,5.812-3.929,9.942
C345.592,261.428,349.253,265.395,356.114,267.454"/>
<path fill="#E4F1DF" d="M368.529,259.396c-0.759-0.222-1.571-0.438-2.379-0.641c-1.127-0.286-2.204,0.614-2.125,1.773l0.52,7.833
c0.049,0.71,0.532,1.314,1.215,1.524c0.003,0.001,0.006,0.003,0.011,0.004c1.735,0.576,2.543,1.34,2.622,2.529
c0.086,1.322-0.65,2.286-2.209,2.875c-0.688,0.26-1.111,0.962-1.063,1.696l0.076,1.149c0.063,0.944-0.649,1.761-1.595,1.823
l-0.492,0.033c-0.945,0.063-1.761-0.652-1.821-1.595l-0.069-1.012c-0.053-0.81-0.672-1.457-1.472-1.576
c-2.795-0.421-5.299-1.668-7.188-3.442c-0.629-0.591-1.62-0.572-2.265-0.002l-5.47,4.814c-0.711,0.625-0.792,1.722-0.15,2.42
c1.717,1.874,3.883,3.465,6.532,4.774c3.313,1.603,7.379,2.211,12.26,1.887c11.583-0.772,17.045-6.542,16.482-14.991
C379.552,265.326,376.222,261.587,368.529,259.396"/>
<circle fill="#593C24" cx="360.849" cy="440.423" r="5.16"/>
<circle fill="#593C24" cx="386.94" cy="440.423" r="5.159"/>
<circle fill="#593C24" cx="405.202" cy="440.423" r="5.159"/>
<circle fill="#593C24" cx="326.931" cy="440.423" r="5.161"/>
<path fill="none" stroke="#F79643" stroke-width="9.7594" stroke-miterlimit="10" d="M369.516,458.521h-17.08
c-5.368,0-9.758-4.393-9.758-9.759v-17.08c0-5.365,4.39-9.758,9.758-9.758h17.08c5.365,0,9.758,4.393,9.758,9.758v17.08
C379.273,454.128,374.881,458.521,369.516,458.521z"/>
<path fill="#333333" d="M398.033,373.908c0,0-13.523-19.474-30.025-10.227c-17.583-6.976-28.398,14.119-28.398,14.119
c-27.741,1.85-39.697-33.867-40.123-39.406l2.792,41.894c1.982,29.758,39.356,27.943,39.356,27.943l30.184,12.663h0.002
l28.237-16.556c0,0,21.053-2.079,19.07-31.835l-2.79-41.894C416.655,336.155,425.766,372.063,398.033,373.908 M369.226,381.943
L369.226,381.943h-0.003l0,0c-20.242,2.028-22.313-4.626-22.313-4.626c11.529,1.946,21.48-7.526,21.503-7.547
c0.025,0.018,11.146,8.084,22.313,4.627C390.726,374.397,389.554,381.266,369.226,381.943"/>
<rect x="337.796" y="436.563" fill="#E7E7E7" width="21.957" height="7.317"/>
<g>
<rect x="462.17" y="359.313" transform="matrix(0.4965 -0.868 0.868 0.4965 -87.9687 596.1019)" fill="#216264" width="15.404" height="29.14"/>
<rect x="470.719" y="354.357" transform="matrix(0.4969 -0.8678 0.8678 0.4969 -82.332 595.8392)" fill="#F79643" width="3.978" height="29.137"/>
</g>
<g>
<path fill="#F0D4C0" d="M320.247,463.224c-4.782,6.313-12.736,8.336-17.766,4.524c-5.035-3.809-5.236-12.016-0.456-18.326
c4.782-6.311,12.736-8.336,17.766-4.527C324.822,448.706,325.023,456.912,320.247,463.224z"/>
<rect x="299.369" y="431.013" transform="matrix(0.8164 0.5774 -0.5774 0.8164 313.6682 -95.5206)" fill="#216264" width="15.403" height="29.139"/>
<rect x="309.742" y="434.309" transform="matrix(0.8166 0.5772 -0.5772 0.8166 316.2598 -97.609)" fill="#F79643" width="3.981" height="29.141"/>
</g>
<ellipse transform="matrix(0.9978 -0.0665 0.0665 0.9978 -23.2004 25.1838)" fill="#E1B08E" cx="366.775" cy="361.168" rx="11.134" ry="3.913"/>
<polygon fill="#593C24" points="312.358,529.619 318.682,567.553 299.716,573.874 299.716,580.197 331.33,580.197 337.65,529.619
"/>
<polygon fill="#754D29" points="312.639,523.097 300.898,546.577 347.859,546.577 336.119,523.097 "/>
<path fill="none" stroke="#333333" stroke-width="7.8268" stroke-miterlimit="10" d="M335.217,324.15
c0,0,9.121-10.73,19.819-3.817"/>
<g>
<ellipse fill="#A6A8AC" cx="404.455" cy="341.775" rx="4.671" ry="7.827"/>
<polygon fill="#A6A8AC" points="404.453,333.949 455.835,330.035 455.835,353.516 404.453,349.602 "/>
<ellipse fill="#929497" cx="455.833" cy="341.775" rx="4.671" ry="15.653"/>
<polygon fill="#929497" points="455.835,326.122 530.566,318.295 530.566,365.256 455.835,357.429 "/>
<ellipse fill="#A6A8AC" cx="530.566" cy="341.775" rx="14.013" ry="23.48"/>
<path fill="#414142" d="M539.909,341.775c0,10.807-4.181,19.567-9.343,19.567c-5.159,0-9.34-8.761-9.34-19.567
s4.181-19.567,9.34-19.567C535.729,322.208,539.909,330.969,539.909,341.775z"/>
<ellipse fill="#E7E7E7" cx="530.566" cy="335.905" rx="4.67" ry="9.784"/>
</g>
<path fill="none" stroke="#237378" stroke-width="10.4357" stroke-miterlimit="10" d="M400.043,477.007
c0,0,65.491-39.137,41.748,30.869"/>
<g>
<polygon fill="#593C24" points="453.276,498.021 446.953,535.958 465.919,542.281 465.919,548.6 434.306,548.6 427.982,498.021
"/>
<polygon fill="#754D29" points="430.051,491.499 418.311,514.979 465.271,514.979 453.531,491.499 "/>
</g>
<polygon fill="#929497" points="475.193,549.555 357.791,596.516 498.673,596.516 "/>
<polygon fill="#929497" points="240.389,596.516 216.908,573.035 334.311,596.516 "/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,3 @@
<svg width="487" height="257" viewBox="0 0 487 257" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 186.283L27.7022 215.527H63.4453L69.3415 185.298L0 186.283ZM91.8596 79.5938L76.8475 152.211H46.4659L91.8596 79.5938ZM144.402 0L111.518 152.211H125.101L117.237 187.444L105.799 185.298L95.0764 228.224H60.0483L88.6427 256.842H122.956L134.394 213.916H144.402L152.994 179.795L142.06 168.288L171.747 27.0091L144.402 0ZM315.253 186.283L342.956 215.527H378.699L384.595 185.298L315.253 186.283ZM407.113 79.5938L392.101 152.211H361.719L407.113 79.5938ZM459.655 0L426.772 152.211H440.354L432.491 187.444L421.053 185.298L410.33 228.224H375.302L403.896 256.842H438.209L449.647 213.916H459.655L468.248 179.795L457.313 168.288L487 27.0091L459.655 0ZM264.767 47.1731C260.209 27.0979 231.658 31.5679 223.751 51.7347L197.928 168.932C194.173 195.226 213.54 198.788 228.309 189.099L252.972 75.8821L261.281 67.2968L264.767 47.1731ZM284.068 9.61264C297.41 23.4606 301.314 38.1871 298.277 55.2689L272.184 179.795C267.538 202.649 221.964 248.614 176.751 218.031L202.843 247.006C239.167 273.343 289.493 244.041 301.136 200.86L326.514 86.7481C334.02 53.569 318.828 36.2183 284.068 9.61264Z" fill="#C4C4C4"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16.8 12.6" style="enable-background:new 0 0 16.8 12.6;" xml:space="preserve">
<style type="text/css">
.st0{fill:#333333;}
</style>
<path class="st0" d="M12.3,0.9C12.3,1,12.3,1,12.3,0.9c-0.7,1.3-1.7,3-3,5.4C8,8.7,7,10.5,6.3,11.6l-0.5,0.8
c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0-0.5-0.2-1.3-0.7c-0.1-0.1-0.2-0.2-0.2-0.3c0-0.1,0.1-0.3,0.4-0.8c-0.9-0.4-1.7-0.9-2.5-1.6
C1.4,8.6,0.7,7.8,0.2,7C0.1,6.8,0,6.5,0,6.3s0.1-0.5,0.2-0.6c1-1.5,2.1-2.6,3.6-3.5c1.4-0.9,3-1.3,4.7-1.3C9,0.9,9.5,1,10.1,1.1
l0.5-0.9C10.7,0.1,10.8,0,10.9,0c0,0,0.1,0,0.2,0.1s0.2,0.1,0.3,0.1s0.2,0.1,0.3,0.2c0.1,0.1,0.2,0.1,0.3,0.2
c0.1,0.1,0.2,0.1,0.2,0.1C12.2,0.7,12.3,0.8,12.3,0.9z M5.2,9.8l0.7-1.3C5.4,8.1,5,7.6,4.7,7C4.4,6.4,4.2,5.8,4.2,5.1
c0-0.8,0.2-1.5,0.6-2.1C3.3,3.7,2.2,4.8,1.2,6.3C2.2,7.9,3.6,9.1,5.2,9.8z M8.7,3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3
C8.6,2.3,8.5,2.3,8.4,2.3c-0.8,0-1.5,0.3-2,0.8c-0.6,0.6-0.8,1.2-0.8,2c0,0.1,0,0.2,0.1,0.3C5.8,5.5,5.9,5.6,6,5.6
c0.1,0,0.2,0,0.3-0.1c0.1-0.1,0.1-0.2,0.1-0.3c0-0.5,0.2-1,0.6-1.4s0.8-0.6,1.4-0.6C8.5,3.2,8.6,3.1,8.7,3z M16.8,6.3
c0,0.2-0.1,0.4-0.2,0.6c-0.2,0.4-0.6,0.9-1,1.4c-0.9,1.1-2,1.9-3.3,2.5c-1.2,0.6-2.5,0.9-3.9,0.9l0.7-1.2c1.3-0.1,2.6-0.5,3.7-1.3
c1.1-0.7,2.1-1.7,2.8-2.9c-0.7-1.1-1.6-2-2.6-2.8l0.6-1.1c0.6,0.4,1.2,0.9,1.7,1.4c0.5,0.6,1,1.1,1.4,1.7
C16.8,5.9,16.8,6.1,16.8,6.3z M12.6,5.1c0,0.9-0.2,1.7-0.7,2.4c-0.5,0.7-1.1,1.2-2,1.5l2.6-4.7C12.6,4.6,12.6,4.9,12.6,5.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16.8 10.8" style="enable-background:new 0 0 16.8 10.8;" xml:space="preserve">
<style type="text/css">
.st0{fill:#333333;}
</style>
<path class="st0" d="M16.8,5.4c0,0.2-0.1,0.4-0.2,0.6c-0.9,1.4-2.1,2.6-3.5,3.5s-3,1.3-4.7,1.3c-1.6,0-3.2-0.4-4.7-1.3
c-1.5-0.9-2.7-2-3.5-3.5C0.1,5.8,0,5.6,0,5.4S0.1,5,0.2,4.8c0.9-1.4,2.1-2.6,3.5-3.5C5.2,0.4,6.8,0,8.4,0c1.6,0,3.2,0.4,4.7,1.3
c1.5,0.9,2.7,2,3.5,3.5C16.8,5,16.8,5.2,16.8,5.4z M15.6,5.4c-1-1.5-2.1-2.6-3.6-3.3c0.4,0.7,0.6,1.4,0.6,2.1c0,1.2-0.4,2.1-1.2,3
s-1.8,1.2-3,1.2c-1.2,0-2.1-0.4-3-1.2c-0.8-0.8-1.2-1.8-1.2-3c0-0.8,0.2-1.5,0.6-2.1C3.3,2.8,2.2,3.9,1.2,5.4C2,6.7,3.1,7.7,4.3,8.5
C5.6,9.2,7,9.6,8.4,9.6s2.8-0.4,4.1-1.1C13.8,7.7,14.8,6.7,15.6,5.4z M8.7,2.1C8.8,2,8.9,1.9,8.9,1.8c0-0.1,0-0.2-0.1-0.3
C8.6,1.4,8.5,1.4,8.4,1.4c-0.8,0-1.5,0.3-2,0.8c-0.6,0.6-0.8,1.2-0.8,2c0,0.1,0,0.2,0.1,0.3C5.8,4.6,5.9,4.7,6,4.7
c0.1,0,0.2,0,0.3-0.1c0.1-0.1,0.1-0.2,0.1-0.3c0-0.5,0.2-1,0.6-1.4s0.8-0.6,1.4-0.6C8.5,2.3,8.6,2.2,8.7,2.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,9 @@
<svg width="37" height="36" viewBox="0 0 37 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.22165 29.7949H0.58465C0.463483 29.7757 0.339087 29.7544 0.241002 29.6832C0.093454 29.576 0.0294675 29.3967 0 29.2102V0.584649C0.03929 0.33635 0.171052 0.104259 0.403986 0.0286256C0.461938 0.00975233 0.524452 0.00954185 0.58465 0H29.2105C29.2702 0.00954185 29.3305 0.0190837 29.3908 0.0286256C29.5592 0.114292 29.7101 0.230548 29.7662 0.403985C29.7851 0.461938 29.7851 0.524451 29.795 0.584649V6.21595L35.4394 6.20683C35.4997 6.21631 35.5601 6.22571 35.6204 6.23518C35.7888 6.32077 35.9397 6.43703 35.9965 6.61061C36.0154 6.6687 36.0154 6.73121 36.0253 6.79148V35.4147C35.986 35.6629 35.8541 35.8951 35.6211 35.9707C35.5629 35.9896 35.5004 35.9898 35.4401 35.9994L6.80637 36C6.68513 35.9808 6.56074 35.9597 6.46265 35.8884C6.3151 35.7812 6.25119 35.6018 6.22165 35.4154V29.7949ZM34.8557 30.2975H7.39102V34.8307L34.8557 34.8301V30.2975ZM28.6633 15.4452L23.063 20.8494L31.1722 28.9086C31.2424 29.0051 31.2852 29.0454 31.3133 29.1281H34.8557V21.229L28.6633 15.4452ZM8.27743 29.0783C8.28087 29.0948 8.28353 29.1114 8.28557 29.1281H29.7339L19.241 18.6996L8.27743 29.0783ZM28.6254 6.21785V1.1693H1.1693V28.6256H6.22165V6.83772C6.2408 6.71669 6.26199 6.59244 6.33307 6.49442C6.44006 6.34694 6.61918 6.28282 6.80539 6.25307L28.6254 6.21785ZM34.8557 19.6289V7.37711C25.7011 7.39192 16.5459 7.40665 7.39102 7.42146V28.3073L18.8489 17.4606C18.996 17.3592 18.9973 17.3585 19.1681 17.3064C19.228 17.3072 19.2878 17.3079 19.3475 17.3086C19.5171 17.3648 19.5185 17.3655 19.663 17.4705L22.233 20.0249L28.2507 14.2183C28.4444 14.0476 28.4507 14.0362 28.7306 14.059C28.9264 14.0927 28.9629 14.1322 29.0562 14.2117L34.8557 19.6289ZM12.9322 9.93019C14.3966 9.94408 15.7827 11.0726 16.0626 12.5321C16.2614 13.5688 15.9096 14.6949 15.1526 15.4341C14.2682 16.2976 12.862 16.5852 11.6988 16.1097C10.6719 15.6898 9.89786 14.7049 9.73691 13.6065C9.53829 12.2509 10.3114 10.8116 11.5556 10.2303C11.9847 10.0299 12.4574 9.92865 12.9322 9.93019ZM12.8982 11.0995C11.9719 11.1083 11.1014 11.8117 10.9137 12.7275C10.653 14 11.8357 15.4123 13.2853 15.1437C14.1119 14.9905 14.8064 14.274 14.929 13.437C15.0953 12.3025 14.1666 11.1191 12.938 11.0996C12.9247 11.0995 12.9115 11.0995 12.8982 11.0995Z" fill="url(#paint0_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="0" y1="0" x2="39.5989" y2="41.1706" gradientUnits="userSpaceOnUse">
<stop stop-color="#13BEBB"/>
<stop offset="1" stop-color="#3EE7CD"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
assets/images/reset-bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View file

@ -0,0 +1,3 @@
<svg width="49" height="49" viewBox="0 0 49 49" xmlns="http://www.w3.org/2000/svg">
<path fill="#EB5757" d="M 0 48.5L 0 20L 20.5 0L 48.5 0L 0 48.5Z"/>
</svg>

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

3
assets/images/search.svg Executable file
View file

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.6205 13.8251C15.9027 12.3584 16.68 10.4393 16.68 8.34005C16.68 3.73697 12.943 0 8.34005 0C3.73697 0 0 3.73697 0 8.34005C0 12.943 3.73697 16.68 8.34005 16.68C10.439 16.68 12.358 15.9029 13.8246 14.6209L17.0376 17.8327C17.143 17.9381 17.2865 17.9986 17.4355 17.9986C17.5846 17.9986 17.728 17.9381 17.8335 17.8327C17.939 17.7272 17.998 17.5852 17.998 17.4361C17.998 17.287 17.939 17.1436 17.8335 17.0381L14.6205 13.8251ZM13.5634 13.3159C14.164 12.6845 14.6474 11.9499 14.9887 11.1473C15.3627 10.2586 15.5554 9.30516 15.5554 8.34047C15.5554 8.33906 15.5554 8.33906 15.5554 8.33906C15.5554 7.37578 15.3627 6.42094 14.9887 5.53359C14.6244 4.67578 14.0985 3.89672 13.4404 3.24C12.7823 2.58047 12.0032 2.05594 11.1468 1.69172C10.258 1.31625 9.30459 1.12359 8.33991 1.125C7.37522 1.12359 6.42178 1.31625 5.53303 1.69172C4.67663 2.05594 3.89756 2.58047 3.23944 3.24C2.58131 3.89672 2.05538 4.67578 1.69256 5.53219C1.31709 6.42094 1.12444 7.37578 1.12444 8.34047C1.12444 9.30375 1.31709 10.2586 1.69256 11.1473C2.05538 12.0038 2.58131 12.7828 3.23944 13.4409C3.89756 14.0991 4.67663 14.625 5.53303 14.9878C6.42178 15.3633 7.37522 15.5559 8.3385 15.5545H8.33991C8.33991 15.5545 8.33991 15.5545 8.34131 15.5545C9.30459 15.5559 10.2594 15.3633 11.1468 14.9878C11.9495 14.6478 12.6841 14.1646 13.3154 13.564C13.3418 13.5111 13.3768 13.4625 13.4193 13.4198C13.4619 13.3772 13.5107 13.3424 13.5634 13.3159Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,2 @@
<svg width="43" height="43" viewBox="0 0 43 43" xmlns="http://www.w3.org/2000/svg"><path fill="#ffffff" id="path0_fill" d="M 21.5011 9.42327e-09C 9.62631 9.42327e-09 9.42327e-09 9.62631 9.42327e-09 21.5011C 9.42327e-09 33.3737 9.62631 43 21.5011 43C 33.3737 43 43 33.3737 43 21.5011C 43 9.62631 33.3737 9.42327e-09 21.5011 9.42327e-09ZM 33.534 18.5587L 33.4615 19.279C 32.5064 26.6261 25.8202 34.3706 15.5922 33.0465C 12.4523 32.6381 9.65046 31.336 7.39539 29.4388C 7.82357 29.5421 8.26492 29.6277 8.71286 29.6826C 11.3193 30.0207 13.8312 29.452 15.926 28.2026C 13.4997 27.8469 11.6574 25.9673 11.2336 23.6705C 11.5652 23.7825 11.9099 23.8638 12.2678 23.9077C 12.7751 23.9735 13.2735 23.9692 13.7588 23.9011C 11.2841 23.0601 9.65705 20.5657 10.0062 17.8737L 10.015 17.8034C 10.711 18.3172 11.5366 18.6795 12.4435 18.8288C 11.0821 17.6387 10.3224 15.8096 10.5705 13.8817C 10.7022 12.8629 11.0997 11.9429 11.6838 11.1831C 13.9893 14.9028 17.799 17.6475 22.3882 18.4775C 22.3465 18.0603 22.3509 17.6277 22.408 17.193C 22.8054 14.1255 25.6182 11.9582 28.6901 12.3557C 30.2886 12.5621 31.6434 13.425 32.5195 14.6393C 33.8194 14.5536 35.0644 14.244 36.226 13.7478C 35.6441 14.9906 34.6253 15.9655 33.3847 16.5035C 34.5287 16.5167 35.6353 16.3564 36.6915 16.0424C 35.8044 17.0634 34.7285 17.922 33.534 18.5587Z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

3
assets/images/what.svg Normal file
View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="488" height="359" viewBox="0 0 488 359" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M186.62 211.896H227.139L272.972 0L306.039 33.7306L253.045 238.466H216.123L186.62 211.896ZM170.678 298.931H211.197L219.832 259.74L246.235 285.944L237.103 325.501H200.181L170.678 298.931ZM318.141 328.822H358.66L367.296 289.632L393.698 315.835L384.566 355.392H347.645L318.141 328.822ZM468.031 64.7883C479.185 98.6093 467.483 129.579 432.905 157.677C392.561 177.947 377.642 200.848 371.77 245.169L340.471 245.773L370.612 259.748L400.253 261.165L405.769 230.574C419.118 196.387 459.156 192.667 476.599 159.502C487.498 141.701 490.586 124.17 485.848 106.886L468.031 64.7883ZM429.669 97.3605C431.638 75.985 422.397 64.6821 401.927 63.4306C367.716 62.7717 346.204 79.928 337.378 114.881L303.894 116.754L335.699 144.15L365.933 144.023C374.549 110.04 396.119 93.8932 429.669 97.3605ZM14.2468 331.554H54.7661L63.4013 292.363L89.804 318.566L80.6718 358.124H43.7502L14.2468 331.554ZM164.136 67.5171C175.29 101.338 163.589 132.308 129.011 160.406C88.6667 180.676 73.7478 203.577 67.8758 247.898L36.5762 248.501L66.7172 262.48L96.3587 263.893L101.875 233.303C115.223 199.116 155.262 195.396 172.705 162.231C183.604 144.429 186.692 126.898 181.954 109.617L164.136 67.5171ZM125.774 100.092C127.743 78.7163 118.502 67.4134 98.0327 66.162C63.8211 65.5004 42.31 82.6566 33.4835 117.609L0 119.485L31.8044 146.879L62.0383 146.751C70.6549 112.771 92.2244 96.6218 125.774 100.092Z" fill="#C4C4C4"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

32039
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

177
package.json Normal file
View file

@ -0,0 +1,177 @@
{
"name": "saleor",
"version": "0.0.0",
"main": "Gruntfile.js",
"repository": {
"type": "git",
"url": "git://github.com/mirumee/saleor-dashboard.git"
},
"author": "Mirumee Software",
"license": "BSD-3-Clause",
"bugs": {
"url": "https://github.com/mirumee/saleor-dashboard/issues"
},
"homepage": "http://getsaleor.com/",
"engines": {
"node": ">=10.6.0",
"npm": ">=6.1.0"
},
"dependencies": {
"@material-ui/core": "^3.9.3",
"@material-ui/icons": "^3.0.1",
"@material-ui/styles": "^3.0.0-alpha.10",
"@types/classnames": "^2.2.6",
"@types/enzyme": "^3.1.15",
"@types/fuzzaldrin": "^2.1.1",
"@types/moment-timezone": "^0.5.9",
"@types/react-dropzone": "^4.2.2",
"@types/react-helmet": "^5.0.7",
"@types/react-infinite-scroller": "^1.2.0",
"@types/react-sortable-tree": "^0.3.6",
"@types/storybook__addon-storyshots": "^3.4.3",
"@types/string-similarity": "^1.2.0",
"@types/url-join": "^0.8.2",
"apollo": "^2.8.1",
"apollo-cache-inmemory": "^1.3.11",
"apollo-client": "^2.4.7",
"apollo-client-preset": "^1.0.6",
"apollo-link": "^1.2.5",
"apollo-link-batch-http": "^1.2.5",
"apollo-link-context": "^1.0.10",
"apollo-link-error": "^1.1.2",
"apollo-upload-client": "^9.1.0",
"classnames": "^2.2.6",
"crc-32": "^1.2.0",
"downshift": "^1.31.14",
"draft-js": "^0.10.5",
"draftail": "^1.1.0",
"draftjs-to-html": "^0.8.4",
"fast-array-diff": "^0.2.0",
"fuzzaldrin": "^2.1.0",
"graphql": "^14.0.2",
"graphql-tag": "^2.10.0",
"i18next": "^11.2.2",
"i18next-browser-languagedetector": "^2.2.0",
"i18next-xhr-backend": "^1.5.1",
"is-url": "^1.2.4",
"keycode": "^2.2.0",
"lodash": "^4.17.11",
"moment-timezone": "^0.5.21",
"qs": "^6.5.2",
"react": "^16.8.3",
"react-apollo": "^2.5.1",
"react-dom": "^16.8.3",
"react-dropzone": "^8.0.3",
"react-helmet": "^5.2.0",
"react-infinite-scroller": "^1.2.4",
"react-inlinesvg": "^0.8.1",
"react-jss": "^8.4.0",
"react-moment": "^0.7.7",
"react-router": "^5.0.0",
"react-router-dom": "^5.0.0",
"react-router-navigation-prompt": "^1.8.2",
"react-sortable-hoc": "^0.6.8",
"react-sortable-tree": "^2.6.2",
"react-svg": "^2.2.11",
"slugify": "^1.3.4",
"string-similarity": "^1.2.0",
"typescript": "^3.2.2",
"universal-cookie": "^2.1.2",
"url-join": "^4.0.0",
"use-react-router": "^1.0.4"
},
"devDependencies": {
"@babel/core": "^7.2.0",
"@babel/plugin-proposal-class-properties": "^7.2.1",
"@babel/plugin-proposal-decorators": "^7.2.0",
"@babel/plugin-proposal-object-rest-spread": "^7.2.0",
"@babel/preset-env": "^7.2.0",
"@babel/preset-react": "^7.0.0",
"@babel/runtime": "^7.2.0",
"@storybook/addon-storyshots": "^4.1.4",
"@storybook/react": "^4.1.4",
"@types/draft-js": "^0.10.27",
"@types/i18next": "^8.4.3",
"@types/jest": "^23.3.1",
"@types/react": "^16.8.6",
"@types/react-dom": "^16.8.2",
"@types/react-router-dom": "^4.2.6",
"@types/react-test-renderer": "^16.8.1",
"@types/storybook__react": "^4.0.0",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^23.6.0",
"babel-loader": "^8.0.4",
"enzyme": "^3.7.0",
"enzyme-adapter-react-16": "^1.7.0",
"enzyme-to-json": "^3.3.5",
"file-loader": "^1.1.11",
"fork-ts-checker-webpack-plugin": "^0.5.2",
"fsevents": "^1.2.9",
"html-webpack-plugin": "^3.2.0",
"jest": "^24.7.1",
"jest-file": "^1.0.0",
"plop": "^2.2.0",
"react-test-renderer": "^16.8.6",
"regenerator-runtime": "^0.11.1",
"ts-jest": "^23.10.5",
"ts-loader": "^5.3.2",
"tsconfig-paths-webpack-plugin": "^3.2.0",
"tslint": "^5.11.0",
"tslint-config-prettier": "^1.15.0",
"webpack": "^4.27.0",
"webpack-bundle-tracker": "^0.3.0",
"webpack-cli": "^3.1.2",
"webpack-dev-server": "^3.7.2"
},
"babel": {
"presets": [
"@babel/preset-env",
"@babel/preset-react"
],
"plugins": [
"@babel/plugin-proposal-class-properties",
[
"@babel/plugin-proposal-decorators",
{
"decoratorsBeforeExport": true
}
],
"@babel/plugin-proposal-object-rest-spread"
]
},
"jest": {
"globals": {
"ts-jest": {
"tsConfig": "tsconfig.json"
}
},
"transform": {
"^.+\\.tsx?$": "ts-jest",
"^.+\\.(png|svg|jpe?g)$": "jest-file"
},
"testRegex": ".*\\.test\\.tsx?$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
],
"moduleNameMapper": {
"@assets(.*)$": "<rootDir>/assets/$1",
"@saleor(.*)$": "<rootDir>/src/$1"
}
},
"scripts": {
"build": "webpack -p",
"build-types": "apollo client:codegen --target=typescript types --globalTypesFile=src/types/globalTypes.ts",
"generate-component": "plop --plopfile .plop/plopfile.js",
"lint": "tslint 'src/**/*.{ts,tsx}'",
"lint-fix": "tslint 'src/**/*.{ts,tsx}' --fix",
"start": "webpack-dev-server --open",
"storybook": "start-storybook -p 3000 -c src/storybook/",
"build-storybook": "build-storybook -c src/storybook/ -o storybook",
"test": "jest src/"
}
}

16
src/Baseline.tsx Normal file
View file

@ -0,0 +1,16 @@
import CssBaseline from "@material-ui/core/CssBaseline";
import { createStyles, withStyles } from "@material-ui/core/styles";
import * as React from "react";
const styles = createStyles({
"@global": {
"@import": "url('https://rsms.me/inter/inter.css')"
}
});
const Baseline = withStyles(styles, {
name: "Baseline"
})(() => <CssBaseline />);
Baseline.displayName = "Baseline";
export default Baseline;

11
src/NotFound.tsx Normal file
View file

@ -0,0 +1,11 @@
import * as React from "react";
import NotFoundPage from "./components/NotFoundPage";
import useNavigator from "./hooks/useNavigator";
export const NotFound: React.StatelessComponent = () => {
const navigate = useNavigator();
return <NotFoundPage onBack={() => navigate("/")} />;
};
export default NotFound;

135
src/auth/AuthProvider.tsx Normal file
View file

@ -0,0 +1,135 @@
import * as React from "react";
import { getMutationProviderData } from "../misc";
import { PartialMutationProviderOutput } from "../types";
import { getAuthToken, removeAuthToken, setAuthToken, UserContext } from "./";
import { TypedTokenAuthMutation, TypedVerifyTokenMutation } from "./mutations";
import { TokenAuth, TokenAuthVariables } from "./types/TokenAuth";
import { User } from "./types/User";
import { VerifyToken, VerifyTokenVariables } from "./types/VerifyToken";
interface AuthProviderOperationsProps {
children: (
props: {
hasToken: boolean;
isAuthenticated: boolean;
tokenAuthLoading: boolean;
tokenVerifyLoading: boolean;
user: User;
}
) => React.ReactNode;
}
const AuthProviderOperations: React.StatelessComponent<
AuthProviderOperationsProps
> = ({ children }) => {
return (
<TypedTokenAuthMutation>
{(...tokenAuth) => (
<TypedVerifyTokenMutation>
{(...tokenVerify) => (
<AuthProvider
tokenAuth={getMutationProviderData(...tokenAuth)}
tokenVerify={getMutationProviderData(...tokenVerify)}
>
{children}
</AuthProvider>
)}
</TypedVerifyTokenMutation>
)}
</TypedTokenAuthMutation>
);
};
interface AuthProviderProps {
children: (
props: {
hasToken: boolean;
isAuthenticated: boolean;
tokenAuthLoading: boolean;
tokenVerifyLoading: boolean;
user: User;
}
) => React.ReactNode;
tokenAuth: PartialMutationProviderOutput<TokenAuth, TokenAuthVariables>;
tokenVerify: PartialMutationProviderOutput<VerifyToken, VerifyTokenVariables>;
}
interface AuthProviderState {
user: User;
persistToken: boolean;
}
class AuthProvider extends React.Component<
AuthProviderProps,
AuthProviderState
> {
constructor(props) {
super(props);
this.state = { user: undefined, persistToken: false };
}
componentWillReceiveProps(props: AuthProviderProps) {
const { tokenAuth, tokenVerify } = props;
if (tokenAuth.opts.error || tokenVerify.opts.error) {
this.logout();
}
if (tokenAuth.opts.data) {
const user = tokenAuth.opts.data.tokenCreate.user;
// FIXME: Now we set state also when auth fails and returned user is
// `null`, because the LoginView uses this `null` to display error.
this.setState({ user });
if (user) {
setAuthToken(
tokenAuth.opts.data.tokenCreate.token,
this.state.persistToken
);
}
} else {
if (tokenVerify.opts.data && tokenVerify.opts.data.tokenVerify.user) {
const user = tokenVerify.opts.data.tokenVerify.user;
this.setState({ user });
}
}
}
componentDidMount() {
const { user } = this.state;
const { tokenVerify } = this.props;
const token = getAuthToken();
if (!!token && !user) {
tokenVerify.mutate({ token });
}
}
login = (email: string, password: string, persistToken: boolean) => {
const { tokenAuth } = this.props;
this.setState({ persistToken });
tokenAuth.mutate({ email, password });
};
logout = () => {
this.setState({ user: undefined });
removeAuthToken();
};
render() {
const { children, tokenAuth, tokenVerify } = this.props;
const { user } = this.state;
const isAuthenticated = !!user;
return (
<UserContext.Provider
value={{ user, login: this.login, logout: this.logout }}
>
{children({
hasToken: !!getAuthToken(),
isAuthenticated,
tokenAuthLoading: tokenAuth.opts.loading,
tokenVerifyLoading: tokenVerify.opts.loading,
user
})}
</UserContext.Provider>
);
}
}
export default AuthProviderOperations;

View file

@ -0,0 +1,21 @@
import CircularProgress from "@material-ui/core/CircularProgress";
import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles";
import * as React from "react";
const styles = createStyles({
root: {
alignItems: "center",
display: "flex",
height: "100vh",
justifyContent: "center"
}
});
const LoginLoading = withStyles(styles, { name: "LoginLoading" })(
({ classes }: WithStyles<typeof styles>) => (
<div className={classes.root}>
<CircularProgress size={128} />
</div>
)
);
LoginLoading.displayName = "LoginLoading";
export default LoginLoading;

View file

@ -0,0 +1,2 @@
export { default } from "./LoginLoading";
export * from "./LoginLoading";

View file

@ -0,0 +1,201 @@
import Button from "@material-ui/core/Button";
import {
createStyles,
Theme,
withStyles,
WithStyles
} from "@material-ui/core/styles";
import TextField from "@material-ui/core/TextField";
import Typography from "@material-ui/core/Typography";
import * as React from "react";
import SVG from "react-inlinesvg";
import * as backgroundArt from "@assets/images/login-background.svg";
import * as saleorDarkLogo from "@assets/images/logo-dark.svg";
import * as saleorLightLogo from "@assets/images/logo-light.svg";
import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox";
import Form from "@saleor/components/Form";
import { FormSpacer } from "@saleor/components/FormSpacer";
import useTheme from "@saleor/hooks/useTheme";
import i18n from "../../../i18n";
export interface FormData {
email: string;
loading: boolean;
password: string;
rememberMe: boolean;
}
const styles = (theme: Theme) =>
createStyles({
buttonContainer: {
display: "flex",
justifyContent: "space-between"
},
link: {
color: theme.palette.primary.main,
cursor: "pointer",
textAlign: "center"
},
loginButton: {
width: 140
},
logo: {
"& svg": {
display: "block",
height: 40,
marginBottom: theme.spacing.unit * 4
}
},
mainPanel: {
[theme.breakpoints.down("sm")]: {
padding: theme.spacing.unit * 2
},
background: theme.palette.background.paper,
display: "flex",
flexDirection: "column",
height: "100vh",
justifyContent: "center",
padding: theme.spacing.unit * 6,
width: "100%"
},
mainPanelContent: {
[theme.breakpoints.up("xs")]: {
width: "100%"
},
[theme.breakpoints.up("sm")]: {
width: 328
},
"@media (min-width: 1440px)": {
width: 464
},
margin: "auto",
width: "100%"
},
panel: {
"& span": {
color: theme.palette.error.contrastText
},
background: theme.palette.error.main,
borderRadius: theme.spacing.unit,
marginBottom: theme.spacing.unit * 3,
padding: theme.spacing.unit * 1.5
},
root: {
[theme.breakpoints.up("lg")]: {
gridTemplateColumns: "376px 1fr"
},
"@media (min-width: 1440px)": {
gridTemplateColumns: "520px 1fr"
},
display: "grid",
gridTemplateColumns: "1fr",
height: "100vh",
overflow: "hidden",
width: "100vw"
},
sidebar: {
[theme.breakpoints.up("lg")]: {
display: "block"
},
display: "none"
},
sidebarArt: {
"& svg": {
width: "100%"
}
}
});
export interface LoginCardProps extends WithStyles<typeof styles> {
error: boolean;
disableLoginButton: boolean;
onPasswordRecovery: () => void;
onSubmit?(event: FormData);
}
const LoginCard = withStyles(styles, { name: "LoginCard" })(
({ classes, error, disableLoginButton, onSubmit }: LoginCardProps) => {
const { isDark } = useTheme();
return (
<Form
initial={{ email: "", password: "", rememberMe: false }}
onSubmit={onSubmit}
>
{({ change: handleChange, data, submit: handleSubmit }) => (
<div className={classes.root}>
<div className={classes.sidebar}>
<SVG className={classes.sidebarArt} src={backgroundArt} />
</div>
<div className={classes.mainPanel}>
<div className={classes.mainPanelContent}>
<SVG
className={classes.logo}
src={isDark ? saleorDarkLogo : saleorLightLogo}
/>
{error && (
<div className={classes.panel}>
<Typography
variant="caption"
dangerouslySetInnerHTML={{
__html: i18n.t(
"Sorry, your username and/or password are incorrect. <br />Please try again."
)
}}
/>
</div>
)}
<TextField
autoFocus
fullWidth
autoComplete="username"
label={i18n.t("Email", { context: "form" })}
name="email"
onChange={handleChange}
value={data.email}
/>
<FormSpacer />
<TextField
fullWidth
autoComplete="current-password"
label={i18n.t("Password")}
name="password"
onChange={handleChange}
type="password"
value={data.password}
/>
<FormSpacer />
<div className={classes.buttonContainer}>
<ControlledCheckbox
checked={data.rememberMe}
label={i18n.t("Remember me")}
name="rememberMe"
onChange={handleChange}
/>
<FormSpacer />
<Button
className={classes.loginButton}
color="primary"
disabled={disableLoginButton}
variant="contained"
onClick={handleSubmit}
type="submit"
>
{i18n.t("Login")}
</Button>
</div>
{/* <FormSpacer />
<Typography className={classes.link}>
{i18n.t("Reset your password")}
</Typography> */}
</div>
</div>
</div>
)}
</Form>
);
}
);
LoginCard.displayName = "LoginCard";
export default LoginCard;

View file

@ -0,0 +1,2 @@
export { default } from "./LoginPage";
export * from "./LoginPage";

View file

@ -0,0 +1,34 @@
import * as React from "react";
import { Route, RouteProps } from "react-router-dom";
import AppLayout from "@saleor/components/AppLayout";
import { UserContext } from "..";
import NotFound from "../../NotFound";
import { PermissionEnum } from "../../types/globalTypes";
import { hasPermission } from "../misc";
interface SectionRouteProps extends RouteProps {
permissions?: PermissionEnum[];
}
export const SectionRoute: React.StatelessComponent<SectionRouteProps> = ({
permissions,
...props
}) => (
<UserContext.Consumer>
{({ user }) =>
!permissions ||
permissions
.map(permission => hasPermission(permission, user))
.reduce((prev, curr) => prev && curr) ? (
<AppLayout>
<Route {...props} />
</AppLayout>
) : (
<NotFound />
)
}
</UserContext.Consumer>
);
SectionRoute.displayName = "Route";
export default SectionRoute;

30
src/auth/index.tsx Normal file
View file

@ -0,0 +1,30 @@
import * as React from "react";
import { User } from "./types/User";
const TOKEN_STORAGE_KEY = "dashboardAuth";
interface UserContext {
login: (username: string, password: string, persist: boolean) => void;
logout: () => void;
user?: User;
}
export const UserContext = React.createContext<UserContext>({
login: undefined,
logout: undefined
});
export const getAuthToken = () =>
localStorage.getItem(TOKEN_STORAGE_KEY) ||
sessionStorage.getItem(TOKEN_STORAGE_KEY);
export const setAuthToken = (token: string, persist: boolean) =>
persist
? localStorage.setItem(TOKEN_STORAGE_KEY, token)
: sessionStorage.setItem(TOKEN_STORAGE_KEY, token);
export const removeAuthToken = () => {
localStorage.removeItem(TOKEN_STORAGE_KEY);
sessionStorage.removeItem(TOKEN_STORAGE_KEY);
};

5
src/auth/misc.ts Normal file
View file

@ -0,0 +1,5 @@
import { PermissionEnum } from '../types/globalTypes'
import { User } from "./types/User";
export const hasPermission = (permission: PermissionEnum, user: User) =>
user.permissions.map(perm => perm.code).includes(permission);

58
src/auth/mutations.ts Normal file
View file

@ -0,0 +1,58 @@
import gql from "graphql-tag";
import { TypedMutation } from "../mutations";
import { TokenAuth, TokenAuthVariables } from "./types/TokenAuth";
import { VerifyToken, VerifyTokenVariables } from "./types/VerifyToken";
export const fragmentUser = gql`
fragment User on User {
id
email
firstName
lastName
isStaff
note
permissions {
code
name
}
}
`;
export const tokenAuthMutation = gql`
${fragmentUser}
mutation TokenAuth($email: String!, $password: String!) {
tokenCreate(email: $email, password: $password) {
token
errors {
field
message
}
user {
...User
}
}
}
`;
export const TypedTokenAuthMutation = TypedMutation<
TokenAuth,
TokenAuthVariables
>(tokenAuthMutation);
export const tokenVerifyMutation = gql`
${fragmentUser}
mutation VerifyToken($token: String!) {
tokenVerify(token: $token) {
payload
user {
...User
}
}
}
`;
export const TypedVerifyTokenMutation = TypedMutation<
VerifyToken,
VerifyTokenVariables
>(tokenVerifyMutation);

View file

@ -0,0 +1,48 @@
/* tslint:disable */
/* eslint-disable */
// This file was automatically generated and should not be edited.
import { PermissionEnum } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: TokenAuth
// ====================================================
export interface TokenAuth_tokenCreate_errors {
__typename: "Error";
field: string | null;
message: string | null;
}
export interface TokenAuth_tokenCreate_user_permissions {
__typename: "PermissionDisplay";
code: PermissionEnum;
name: string;
}
export interface TokenAuth_tokenCreate_user {
__typename: "User";
id: string;
email: string;
firstName: string;
lastName: string;
isStaff: boolean;
note: string | null;
permissions: (TokenAuth_tokenCreate_user_permissions | null)[] | null;
}
export interface TokenAuth_tokenCreate {
__typename: "CreateToken";
token: string | null;
errors: (TokenAuth_tokenCreate_errors | null)[];
user: TokenAuth_tokenCreate_user | null;
}
export interface TokenAuth {
tokenCreate: TokenAuth_tokenCreate | null;
}
export interface TokenAuthVariables {
email: string;
password: string;
}

26
src/auth/types/User.ts Normal file
View file

@ -0,0 +1,26 @@
/* tslint:disable */
/* eslint-disable */
// This file was automatically generated and should not be edited.
import { PermissionEnum } from "./../../types/globalTypes";
// ====================================================
// GraphQL fragment: User
// ====================================================
export interface User_permissions {
__typename: "PermissionDisplay";
code: PermissionEnum;
name: string;
}
export interface User {
__typename: "User";
id: string;
email: string;
firstName: string;
lastName: string;
isStaff: boolean;
note: string | null;
permissions: (User_permissions | null)[] | null;
}

View file

@ -0,0 +1,40 @@
/* tslint:disable */
/* eslint-disable */
// This file was automatically generated and should not be edited.
import { PermissionEnum } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: VerifyToken
// ====================================================
export interface VerifyToken_tokenVerify_user_permissions {
__typename: "PermissionDisplay";
code: PermissionEnum;
name: string;
}
export interface VerifyToken_tokenVerify_user {
__typename: "User";
id: string;
email: string;
firstName: string;
lastName: string;
isStaff: boolean;
note: string | null;
permissions: (VerifyToken_tokenVerify_user_permissions | null)[] | null;
}
export interface VerifyToken_tokenVerify {
__typename: "VerifyToken";
payload: any | null;
user: VerifyToken_tokenVerify_user | null;
}
export interface VerifyToken {
tokenVerify: VerifyToken_tokenVerify | null;
}
export interface VerifyTokenVariables {
token: string;
}

27
src/auth/views/Login.tsx Normal file
View file

@ -0,0 +1,27 @@
import * as React from "react";
import LoginPage, { FormData } from "../components/LoginPage";
import { UserContext } from "../index";
interface LoginViewProps {
loading: boolean;
}
const LoginView: React.StatelessComponent<LoginViewProps> = ({ loading }) => (
<UserContext.Consumer>
{({ login, user }) => {
const handleSubmit = (data: FormData) =>
login(data.email, data.password, data.rememberMe);
return (
<LoginPage
error={user === null}
disableLoginButton={loading}
onPasswordRecovery={undefined}
onSubmit={handleSubmit}
/>
);
}}
</UserContext.Consumer>
);
LoginView.displayName = "LoginView";
export default LoginView;

View file

@ -0,0 +1,133 @@
import {
createStyles,
Theme,
withStyles,
WithStyles
} from "@material-ui/core/styles";
import TextField from "@material-ui/core/TextField";
import * as React from "react";
import Button from "@material-ui/core/Button";
import Card from "@material-ui/core/Card";
import CardContent from "@material-ui/core/CardContent";
import CardTitle from "@saleor/components/CardTitle";
import Hr from "@saleor/components/Hr";
import ImageTile from "@saleor/components/ImageTile";
import ImageUpload from "@saleor/components/ImageUpload";
import Skeleton from "@saleor/components/Skeleton";
import i18n from "../../../i18n";
import { CategoryDetails_category_backgroundImage } from "../../types/CategoryDetails";
import { FormData } from "../CategoryUpdatePage";
const styles = (theme: Theme) =>
createStyles({
fileField: {
display: "none"
},
image: {
height: "100%",
objectFit: "contain",
userSelect: "none",
width: "100%"
},
imageContainer: {
background: "#ffffff",
border: "1px solid #eaeaea",
borderRadius: theme.spacing.unit,
height: 148,
justifySelf: "start",
overflow: "hidden",
padding: theme.spacing.unit * 2,
position: "relative",
width: 148
}
});
export interface CategoryBackgroundProps extends WithStyles<typeof styles> {
data: FormData;
image: CategoryDetails_category_backgroundImage;
onChange: (event: React.ChangeEvent<any>) => void;
onImageDelete: () => void;
onImageUpload: (file: File) => void;
}
export const CategoryBackground = withStyles(styles)(
class CategoryBackgroundComponent extends React.Component<
CategoryBackgroundProps,
{}
> {
imgInputAnchor = React.createRef<HTMLInputElement>();
clickImgInput = () => this.imgInputAnchor.current.click();
render() {
const {
classes,
data,
onImageUpload,
image,
onChange,
onImageDelete
} = this.props;
return (
<Card>
<CardTitle
title={i18n.t("Background image (optional)")}
toolbar={
<>
<Button
variant="text"
color="primary"
onClick={this.clickImgInput}
>
{i18n.t("Upload image")}
</Button>
<input
className={classes.fileField}
id="fileUpload"
onChange={event => onImageUpload(event.target.files[0])}
type="file"
ref={this.imgInputAnchor}
/>
</>
}
/>
{image === undefined ? (
<CardContent>
<div>
<div className={classes.imageContainer}>
<Skeleton />
</div>
</div>
</CardContent>
) : image === null ? (
<ImageUpload onImageUpload={onImageUpload} />
) : (
<CardContent>
<ImageTile image={image} onImageDelete={onImageDelete} />
</CardContent>
)}
{image && (
<>
<Hr />
<CardContent>
<TextField
name="backgroundImageAlt"
label={i18n.t("Description")}
helperText={i18n.t("Optional")}
value={data.backgroundImageAlt}
onChange={onChange}
fullWidth
multiline
/>
</CardContent>
</>
)}
</Card>
);
}
}
);
CategoryBackground.displayName = "CategoryBackground";
export default CategoryBackground;

View file

@ -0,0 +1,2 @@
export { default } from "./CategoryBackground";
export * from "./CategoryBackground";

View file

@ -0,0 +1,92 @@
import { ContentState, convertToRaw, RawDraftContentState } from "draft-js";
import * as React from "react";
import AppHeader from "@saleor/components/AppHeader";
import { CardSpacer } from "@saleor/components/CardSpacer";
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton";
import Container from "@saleor/components/Container";
import Form from "@saleor/components/Form";
import PageHeader from "@saleor/components/PageHeader";
import SaveButtonBar from "@saleor/components/SaveButtonBar";
import SeoForm from "@saleor/components/SeoForm";
import i18n from "../../../i18n";
import { UserError } from "../../../types";
import CategoryDetailsForm from "../../components/CategoryDetailsForm";
interface FormData {
description: RawDraftContentState;
name: string;
seoTitle: string;
seoDescription: string;
}
const initialData: FormData = {
description: convertToRaw(ContentState.createFromText("")),
name: "",
seoDescription: "",
seoTitle: ""
};
export interface CategoryCreatePageProps {
errors: UserError[];
disabled: boolean;
saveButtonBarState: ConfirmButtonTransitionState;
onSubmit(data: FormData);
onBack();
}
export const CategoryCreatePage: React.StatelessComponent<
CategoryCreatePageProps
> = ({
disabled,
onSubmit,
onBack,
errors: userErrors,
saveButtonBarState
}) => (
<Form
onSubmit={onSubmit}
initial={initialData}
errors={userErrors}
confirmLeave
>
{({ data, change, errors, submit, hasChanged }) => (
<Container>
<AppHeader onBack={onBack}>{i18n.t("Categories")}</AppHeader>
<PageHeader title={i18n.t("Add Category")} />
<div>
<CategoryDetailsForm
disabled={disabled}
data={data}
onChange={change}
errors={errors}
/>
<CardSpacer />
<SeoForm
helperText={i18n.t(
"Add search engine title and description to make this product easier to find"
)}
title={data.seoTitle}
titlePlaceholder={data.name}
description={data.seoDescription}
descriptionPlaceholder={data.name}
loading={disabled}
onChange={change}
disabled={disabled}
/>
<SaveButtonBar
onCancel={onBack}
onSave={submit}
labels={{
save: i18n.t("Save category")
}}
state={saveButtonBarState}
disabled={disabled || !hasChanged}
/>
</div>
</Container>
)}
</Form>
);
CategoryCreatePage.displayName = "CategoryCreatePage";
export default CategoryCreatePage;

View file

@ -0,0 +1,2 @@
export { default } from "./CategoryCreatePage";
export * from "./CategoryCreatePage";

View file

@ -0,0 +1,65 @@
import Button from "@material-ui/core/Button";
import Dialog from "@material-ui/core/Dialog";
import DialogActions from "@material-ui/core/DialogActions";
import DialogContent from "@material-ui/core/DialogContent";
import DialogContentText from "@material-ui/core/DialogContentText";
import DialogTitle from "@material-ui/core/DialogTitle";
import {
createStyles,
Theme,
withStyles,
WithStyles
} from "@material-ui/core/styles";
import * as React from "react";
import i18n from "../../../i18n";
const styles = (theme: Theme) =>
createStyles({
deleteButton: {
"&:hover": {
backgroundColor: theme.palette.error.main
},
backgroundColor: theme.palette.error.main,
color: theme.palette.error.contrastText
}
});
export interface CategoryDeleteDialogProps extends WithStyles<typeof styles> {
open: boolean;
name: string;
onClose();
onConfirm();
}
const CategoryDeleteDialog = withStyles(styles, {
name: "CategoryDeleteDialog"
})(({ classes, name, open, onConfirm, onClose }: CategoryDeleteDialogProps) => (
<Dialog onClose={onClose} open={open}>
<DialogTitle>{i18n.t("Delete category", { context: "title" })}</DialogTitle>
<DialogContent>
<DialogContentText
dangerouslySetInnerHTML={{
__html: i18n.t(
"Are you sure you want to remove <strong>{{name}}</strong>?",
{ name }
)
}}
/>
</DialogContent>
<DialogActions>
<Button onClick={onClose}>
{i18n.t("Cancel", { context: "button" })}
</Button>
<Button
className={classes.deleteButton}
variant="contained"
onClick={onConfirm}
>
{i18n.t("Delete category", { context: "button" })}
</Button>
</DialogActions>
</Dialog>
));
CategoryDeleteDialog.displayName = "CategoryDeleteDialog";
export default CategoryDeleteDialog;

View file

@ -0,0 +1,2 @@
export { default } from "./CategoryDeleteDialog";
export * from "./CategoryDeleteDialog";

View file

@ -0,0 +1,77 @@
import Card from "@material-ui/core/Card";
import CardContent from "@material-ui/core/CardContent";
import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles";
import TextField from "@material-ui/core/TextField";
import { RawDraftContentState } from "draft-js";
import * as React from "react";
import CardTitle from "@saleor/components/CardTitle";
import FormSpacer from "@saleor/components/FormSpacer";
import RichTextEditor from "@saleor/components/RichTextEditor";
import i18n from "../../../i18n";
import { maybe } from "../../../misc";
import { CategoryDetails_category } from "../../types/CategoryDetails";
const styles = createStyles({
root: {
width: "50%"
}
});
interface CategoryDetailsFormProps extends WithStyles<typeof styles> {
category?: CategoryDetails_category;
data: {
name: string;
description: RawDraftContentState;
};
disabled: boolean;
errors: { [key: string]: string };
onChange: (event: React.ChangeEvent<any>) => void;
}
export const CategoryDetailsForm = withStyles(styles, {
name: "CategoryDetailsForm"
})(
({
category,
classes,
disabled,
data,
onChange,
errors
}: CategoryDetailsFormProps) => {
return (
<Card>
<CardTitle title={i18n.t("General information")} />
<CardContent>
<>
<div>
<TextField
classes={{ root: classes.root }}
label={i18n.t("Name")}
name="name"
disabled={disabled}
value={data && data.name}
onChange={onChange}
error={!!errors.name}
helperText={errors.name}
/>
</div>
<FormSpacer />
<RichTextEditor
disabled={disabled}
error={!!errors.descriptionJson}
helperText={errors.descriptionJson}
label={i18n.t("Description")}
initial={maybe(() => JSON.parse(category.descriptionJson))}
name="description"
onChange={onChange}
/>
</>
</CardContent>
</Card>
);
}
);
CategoryDetailsForm.displayName = "CategoryDetailsForm";
export default CategoryDetailsForm;

Some files were not shown because too many files have changed in this diff Show more