├── LICENSE ├── README.md ├── backend ├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── README.md ├── app │ ├── Console │ │ └── Kernel.php │ ├── Exceptions │ │ └── Handler.php │ ├── Http │ │ ├── Controllers │ │ │ ├── Api │ │ │ │ ├── LoginController.php │ │ │ │ ├── LogoutController.php │ │ │ │ └── RegisterController.php │ │ │ ├── Auth │ │ │ │ ├── AuthenticatedSessionController.php │ │ │ │ ├── EmailVerificationNotificationController.php │ │ │ │ ├── NewPasswordController.php │ │ │ │ ├── PasswordResetLinkController.php │ │ │ │ ├── RegisteredUserController.php │ │ │ │ └── VerifyEmailController.php │ │ │ ├── Controller.php │ │ │ ├── GalleryController.php │ │ │ ├── PersonalController.php │ │ │ └── ProductController.php │ │ ├── Kernel.php │ │ ├── Middleware │ │ │ ├── Authenticate.php │ │ │ ├── EncryptCookies.php │ │ │ ├── EnsureEmailIsVerified.php │ │ │ ├── PreventRequestsDuringMaintenance.php │ │ │ ├── RedirectIfAuthenticated.php │ │ │ ├── TrimStrings.php │ │ │ ├── TrustHosts.php │ │ │ ├── TrustProxies.php │ │ │ ├── ValidateSignature.php │ │ │ └── VerifyCsrfToken.php │ │ └── Requests │ │ │ └── Auth │ │ │ └── LoginRequest.php │ ├── Models │ │ ├── Gallery.php │ │ ├── Permission.php │ │ ├── Product.php │ │ ├── Role.php │ │ └── User.php │ └── Providers │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── BroadcastServiceProvider.php │ │ ├── EventServiceProvider.php │ │ └── RouteServiceProvider.php ├── artisan ├── bootstrap │ ├── app.php │ └── cache │ │ └── .gitignore ├── composer.json ├── composer.lock ├── config │ ├── app.php │ ├── auth.php │ ├── broadcasting.php │ ├── cache.php │ ├── cors.php │ ├── database.php │ ├── filesystems.php │ ├── hashing.php │ ├── jwt.php │ ├── laratrust.php │ ├── laratrust_seeder.php │ ├── logging.php │ ├── mail.php │ ├── queue.php │ ├── sanctum.php │ ├── services.php │ ├── session.php │ └── view.php ├── database │ ├── .gitignore │ ├── factories │ │ └── UserFactory.php │ ├── migrations │ │ ├── 2014_10_12_000000_create_users_table.php │ │ ├── 2014_10_12_100000_create_password_reset_tokens_table.php │ │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ │ ├── 2023_04_06_230417_create_products_table.php │ │ ├── 2023_04_16_071048_laratrust_setup_tables.php │ │ └── 2023_04_16_124222_create_galleries_table.php │ └── seeders │ │ ├── DatabaseSeeder.php │ │ └── LaratrustSeeder.php ├── package-lock.json ├── phpunit.xml ├── public │ ├── .htaccess │ ├── favicon.ico │ ├── index.php │ └── robots.txt ├── resources │ └── views │ │ └── .gitkeep ├── routes │ ├── api.php │ ├── auth.php │ ├── channels.php │ ├── console.php │ └── web.php ├── storage │ ├── app │ │ ├── .gitignore │ │ └── public │ │ │ └── .gitignore │ ├── framework │ │ ├── .gitignore │ │ ├── cache │ │ │ ├── .gitignore │ │ │ └── data │ │ │ │ └── .gitignore │ │ ├── sessions │ │ │ └── .gitignore │ │ ├── testing │ │ │ └── .gitignore │ │ └── views │ │ │ └── .gitignore │ └── logs │ │ └── .gitignore └── tests │ ├── CreatesApplication.php │ ├── Feature │ ├── Auth │ │ ├── AuthenticationTest.php │ │ ├── EmailVerificationTest.php │ │ ├── PasswordResetTest.php │ │ └── RegistrationTest.php │ └── ExampleTest.php │ ├── TestCase.php │ └── Unit │ └── ExampleTest.php └── frontend ├── .gitignore ├── .prettierrc.json ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public └── vite.svg ├── src ├── App.css ├── App.jsx ├── assets │ ├── midragon │ │ ├── js │ │ │ ├── jquery-3.6.2.min.js │ │ │ └── sweetalert2@11.js │ │ └── select2 │ │ │ ├── jquery.min.js │ │ │ ├── select2.full.min.js │ │ │ └── select2.min.css │ ├── react.svg │ └── stisla │ │ ├── css │ │ ├── bootstrap.min.css │ │ ├── components.css │ │ ├── components.css.map │ │ ├── custom.css │ │ ├── custom.css.map │ │ ├── reverse.css │ │ ├── rtl.css │ │ ├── skins │ │ │ ├── reverse.css │ │ │ └── reverse.css.map │ │ ├── style.css │ │ └── style.css.map │ │ ├── fonts │ │ ├── nunito-v9-latin-600.eot │ │ ├── nunito-v9-latin-600.svg │ │ ├── nunito-v9-latin-600.ttf │ │ ├── nunito-v9-latin-600.woff │ │ ├── nunito-v9-latin-600.woff2 │ │ ├── nunito-v9-latin-700.eot │ │ ├── nunito-v9-latin-700.svg │ │ ├── nunito-v9-latin-700.ttf │ │ ├── nunito-v9-latin-700.woff │ │ ├── nunito-v9-latin-700.woff2 │ │ ├── nunito-v9-latin-800.eot │ │ ├── nunito-v9-latin-800.svg │ │ ├── nunito-v9-latin-800.ttf │ │ ├── nunito-v9-latin-800.woff │ │ ├── nunito-v9-latin-800.woff2 │ │ ├── nunito-v9-latin-regular.eot │ │ ├── nunito-v9-latin-regular.svg │ │ ├── nunito-v9-latin-regular.ttf │ │ ├── nunito-v9-latin-regular.woff │ │ ├── nunito-v9-latin-regular.woff2 │ │ └── vazir │ │ │ ├── Farsi-Digits-Without-Latin │ │ │ ├── Vazir-Black-FD-WOL.eot │ │ │ ├── Vazir-Black-FD-WOL.ttf │ │ │ ├── Vazir-Black-FD-WOL.woff │ │ │ ├── Vazir-Black-FD-WOL.woff2 │ │ │ ├── Vazir-Bold-FD-WOL.eot │ │ │ ├── Vazir-Bold-FD-WOL.ttf │ │ │ ├── Vazir-Bold-FD-WOL.woff │ │ │ ├── Vazir-Bold-FD-WOL.woff2 │ │ │ ├── Vazir-FD-WOL.eot │ │ │ ├── Vazir-FD-WOL.ttf │ │ │ ├── Vazir-FD-WOL.woff │ │ │ ├── Vazir-FD-WOL.woff2 │ │ │ ├── Vazir-Light-FD-WOL.eot │ │ │ ├── Vazir-Light-FD-WOL.ttf │ │ │ ├── Vazir-Light-FD-WOL.woff │ │ │ ├── Vazir-Light-FD-WOL.woff2 │ │ │ ├── Vazir-Medium-FD-WOL.eot │ │ │ ├── Vazir-Medium-FD-WOL.ttf │ │ │ ├── Vazir-Medium-FD-WOL.woff │ │ │ ├── Vazir-Medium-FD-WOL.woff2 │ │ │ ├── Vazir-Thin-FD-WOL.eot │ │ │ ├── Vazir-Thin-FD-WOL.ttf │ │ │ ├── Vazir-Thin-FD-WOL.woff │ │ │ └── Vazir-Thin-FD-WOL.woff2 │ │ │ ├── Farsi-Digits │ │ │ ├── Vazir-Black-FD.eot │ │ │ ├── Vazir-Black-FD.ttf │ │ │ ├── Vazir-Black-FD.woff │ │ │ ├── Vazir-Black-FD.woff2 │ │ │ ├── Vazir-Bold-FD.eot │ │ │ ├── Vazir-Bold-FD.ttf │ │ │ ├── Vazir-Bold-FD.woff │ │ │ ├── Vazir-Bold-FD.woff2 │ │ │ ├── Vazir-FD.eot │ │ │ ├── Vazir-FD.ttf │ │ │ ├── Vazir-FD.woff │ │ │ ├── Vazir-FD.woff2 │ │ │ ├── Vazir-Light-FD.eot │ │ │ ├── Vazir-Light-FD.ttf │ │ │ ├── Vazir-Light-FD.woff │ │ │ ├── Vazir-Light-FD.woff2 │ │ │ ├── Vazir-Medium-FD.eot │ │ │ ├── Vazir-Medium-FD.ttf │ │ │ ├── Vazir-Medium-FD.woff │ │ │ ├── Vazir-Medium-FD.woff2 │ │ │ ├── Vazir-Thin-FD.eot │ │ │ ├── Vazir-Thin-FD.ttf │ │ │ ├── Vazir-Thin-FD.woff │ │ │ └── Vazir-Thin-FD.woff2 │ │ │ ├── LICENSE │ │ │ ├── Vazir-Black.eot │ │ │ ├── Vazir-Black.ttf │ │ │ ├── Vazir-Black.woff │ │ │ ├── Vazir-Black.woff2 │ │ │ ├── Vazir-Bold.eot │ │ │ ├── Vazir-Bold.ttf │ │ │ ├── Vazir-Bold.woff │ │ │ ├── Vazir-Bold.woff2 │ │ │ ├── Vazir-Light.eot │ │ │ ├── Vazir-Light.ttf │ │ │ ├── Vazir-Light.woff │ │ │ ├── Vazir-Light.woff2 │ │ │ ├── Vazir-Medium.eot │ │ │ ├── Vazir-Medium.ttf │ │ │ ├── Vazir-Medium.woff │ │ │ ├── Vazir-Medium.woff2 │ │ │ ├── Vazir-Thin.eot │ │ │ ├── Vazir-Thin.ttf │ │ │ ├── Vazir-Thin.woff │ │ │ ├── Vazir-Thin.woff2 │ │ │ ├── Vazir.eot │ │ │ ├── Vazir.ttf │ │ │ ├── Vazir.woff │ │ │ ├── Vazir.woff2 │ │ │ ├── Without-Latin │ │ │ ├── Vazir-Black-WOL.eot │ │ │ ├── Vazir-Black-WOL.ttf │ │ │ ├── Vazir-Black-WOL.woff │ │ │ ├── Vazir-Black-WOL.woff2 │ │ │ ├── Vazir-Bold-WOL.eot │ │ │ ├── Vazir-Bold-WOL.ttf │ │ │ ├── Vazir-Bold-WOL.woff │ │ │ ├── Vazir-Bold-WOL.woff2 │ │ │ ├── Vazir-Light-WOL.eot │ │ │ ├── Vazir-Light-WOL.ttf │ │ │ ├── Vazir-Light-WOL.woff │ │ │ ├── Vazir-Light-WOL.woff2 │ │ │ ├── Vazir-Medium-WOL.eot │ │ │ ├── Vazir-Medium-WOL.ttf │ │ │ ├── Vazir-Medium-WOL.woff │ │ │ ├── Vazir-Medium-WOL.woff2 │ │ │ ├── Vazir-Thin-WOL.eot │ │ │ ├── Vazir-Thin-WOL.ttf │ │ │ ├── Vazir-Thin-WOL.woff │ │ │ ├── Vazir-Thin-WOL.woff2 │ │ │ ├── Vazir-WOL.eot │ │ │ ├── Vazir-WOL.ttf │ │ │ ├── Vazir-WOL.woff │ │ │ └── Vazir-WOL.woff2 │ │ │ ├── font-face.css │ │ │ └── sample.png │ │ ├── img │ │ ├── avatar │ │ │ ├── avatar-1.png │ │ │ ├── avatar-2.png │ │ │ ├── avatar-3.png │ │ │ ├── avatar-4.png │ │ │ └── avatar-5.png │ │ ├── drawkit │ │ │ ├── drawkit-full-stack-man-colour.svg │ │ │ ├── drawkit-mobile-article-colour.svg │ │ │ ├── drawkit-nature-man-colour.svg │ │ │ └── revenue-graph-colour.svg │ │ ├── example-image-50.jpg │ │ ├── example-image.jpg │ │ ├── news │ │ │ ├── img01.jpg │ │ │ ├── img02.jpg │ │ │ ├── img03.jpg │ │ │ ├── img04.jpg │ │ │ ├── img05.jpg │ │ │ ├── img06.jpg │ │ │ ├── img07.jpg │ │ │ ├── img08.jpg │ │ │ ├── img09.jpg │ │ │ ├── img10.jpg │ │ │ ├── img11.jpg │ │ │ ├── img12.jpg │ │ │ ├── img13.jpg │ │ │ ├── img14.jpg │ │ │ ├── img15.jpg │ │ │ ├── img16.jpg │ │ │ └── img17.jpg │ │ ├── p-250.png │ │ ├── p-50.png │ │ ├── products │ │ │ ├── product-1-50.png │ │ │ ├── product-1.jpg │ │ │ ├── product-2-50.png │ │ │ ├── product-2.jpg │ │ │ ├── product-3-50.png │ │ │ ├── product-3.jpg │ │ │ ├── product-4-50.png │ │ │ ├── product-4.jpg │ │ │ ├── product-5-50.png │ │ │ └── product-5.jpg │ │ ├── stisla-fill.svg │ │ ├── stisla-light.svg │ │ ├── stisla-transparent.svg │ │ ├── stisla.svg │ │ └── unsplash │ │ │ ├── andre-benz-1214056-unsplash.jpg │ │ │ ├── eberhard-grossgasteiger-1207565-unsplash.jpg │ │ │ └── login-bg.jpg │ │ └── js │ │ ├── bootstrap.min.js │ │ ├── custom.js │ │ ├── jquery.min.js │ │ ├── jquery.nicescroll.min.js │ │ ├── moment.min.js │ │ ├── page │ │ ├── auth-register.js │ │ ├── bootstrap-modal.js │ │ ├── components-chat-box.js │ │ ├── components-multiple-upload.js │ │ ├── components-statistic.js │ │ ├── components-table.js │ │ ├── components-user.js │ │ ├── features-post-create.js │ │ ├── features-posts.js │ │ ├── features-setting-detail.js │ │ ├── forms-advanced-forms.js │ │ ├── gmaps-advanced-route.js │ │ ├── gmaps-draggable-marker.js │ │ ├── gmaps-geocoding.js │ │ ├── gmaps-geolocation.js │ │ ├── gmaps-marker.js │ │ ├── gmaps-multiple-marker.js │ │ ├── gmaps-route.js │ │ ├── gmaps-simple.js │ │ ├── index-0.js │ │ ├── index.js │ │ ├── modules-calendar.js │ │ ├── modules-chartjs.js │ │ ├── modules-datatables.js │ │ ├── modules-ion-icons.js │ │ ├── modules-slider.js │ │ ├── modules-sparkline.js │ │ ├── modules-sweetalert.js │ │ ├── modules-toastr.js │ │ ├── modules-vector-map.js │ │ └── utilities-contact.js │ │ ├── popper.min.js │ │ ├── scripts.js │ │ └── stisla.js ├── components │ ├── Case.jsx │ ├── Footer.jsx │ ├── NavLink.jsx │ ├── Navbar.jsx │ ├── Navigation.jsx │ ├── Router.jsx │ └── Sidebar.jsx ├── config │ └── appConfig.js ├── index.css ├── main.jsx └── pages │ ├── AdvancedFeature.jsx │ ├── Auth │ ├── Login.jsx │ ├── Register.jsx │ └── Session.js │ ├── Dashboard.jsx │ ├── Error │ ├── 403.jsx │ └── 404.jsx │ ├── Gallery │ └── Gallery.jsx │ ├── GeneralFeature.jsx │ ├── Layout │ ├── AuthLayout.jsx │ ├── Components │ │ ├── AddButton.jsx │ │ ├── InputValidation.jsx │ │ ├── ModalFooter.jsx │ │ ├── ModalHeader.jsx │ │ ├── Pagination.jsx │ │ ├── SearchEntries.jsx │ │ └── TextareaValidation.jsx │ └── MainLayout.jsx │ ├── MultipleInsert │ └── MultipleInsert.jsx │ ├── Profile │ └── Profile.jsx │ └── products │ └── Product.jsx ├── tailwind.config.js └── vite.config.js /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Fahmi Ibrahim 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | image 2 | 3 | # Laravel React Vite Stisla 4 | 5 | This project is a web application built with Laravel, ReactJS with Vite, and Stisla Admin Template. The web application is designed to provide a user-friendly interface for managing data with the CRUD, searching, pagination, showing, single page application, and validation features. 6 | 7 | ## Folder Structure 8 | 9 | - backend: Contains the Laravel project 10 | - frontend: Contains the ReactJS project 11 | 12 | ## Features 13 | 14 | - Laravel for backend RESTful API 15 | - ReactJS with Vite for frontend development 16 | - Stisla Admin Template for responsive and user-friendly interface 17 | - CRUD operations for managing data 18 | - Searching and pagination functionality 19 | - Single page application with React Router 20 | - Form validation with ReactJS validation rules 21 | - [NEW!] Authentication with JWT Token 22 | - [NEW!] Validation and sweetalert authentication 23 | - [NEW!] Multiple authentication role REST API with laratrust! 24 | - [NEW!] Page: 404, 403. 25 | 26 | ## Prerequisites 27 | 28 | 1. PHP >= 8.1 or new 29 | 2. Composer 30 | 3. Node.js last version 31 | 4. NPM last version 32 | 5. MySQL or MariaDB last version 33 | 34 | ## Installation 35 | 36 | 1. Clone this repository to your local machine: 37 | 38 | ``` 39 | git clone https://github.com/fhmiibrhimdev/laravel-react-vite-stisla.git 40 | ``` 41 | 42 | 2. Install the dependencies for the Laravel project: 43 | 44 | ``` 45 | cd backend 46 | composer install 47 | ``` 48 | 49 | 3. Create a .env file for your Laravel project and configure your database settings: 50 | 51 | ``` 52 | cp .env.example .env 53 | ``` 54 | 55 | 4. Generate a new APP_KEY for your Laravel project: 56 | 57 | ``` 58 | php artisan key:generate 59 | ``` 60 | 61 | 5. Run database migrations: 62 | 63 | ``` 64 | php artisan migrate:fresh --seed 65 | ``` 66 | 67 | 6. Run JWT Secret and Storage Link: 68 | 69 | ``` 70 | php artisan jwt:secret 71 | php artisan storage:link 72 | ``` 73 | 74 | 7. Install the dependencies for the ReactJS project: 75 | 76 | ``` 77 | cd ../frontend 78 | npm install 79 | ``` 80 | 81 | 8. Start the development server for the ReactJS project: 82 | 83 | ``` 84 | npm run dev 85 | ``` 86 | 87 | 9. Start the development server for the Laravel project: 88 | 89 | ``` 90 | cd ../backend 91 | php artisan serve 92 | ``` 93 | 94 | 10. Visit [Localhost](http://localhost:5173/products) in your web browser to access the web application. 95 | 96 | ## License 97 | 98 | This project is licensed under the MIT License. See the [LICENSE](https://github.com/fhmiibrhimdev/laravel-react-vite-stisla/blob/main/LICENSE) file for more details. 99 | -------------------------------------------------------------------------------- /backend/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /backend/.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | LOG_CHANNEL=stack 8 | LOG_DEPRECATIONS_CHANNEL=null 9 | LOG_LEVEL=debug 10 | 11 | DB_CONNECTION=mysql 12 | DB_HOST=127.0.0.1 13 | DB_PORT=3306 14 | DB_DATABASE=laravel 15 | DB_USERNAME=root 16 | DB_PASSWORD= 17 | 18 | BROADCAST_DRIVER=log 19 | CACHE_DRIVER=file 20 | FILESYSTEM_DISK=local 21 | QUEUE_CONNECTION=sync 22 | SESSION_DRIVER=file 23 | SESSION_LIFETIME=120 24 | 25 | MEMCACHED_HOST=127.0.0.1 26 | 27 | REDIS_HOST=127.0.0.1 28 | REDIS_PASSWORD=null 29 | REDIS_PORT=6379 30 | 31 | MAIL_MAILER=smtp 32 | MAIL_HOST=mailpit 33 | MAIL_PORT=1025 34 | MAIL_USERNAME=null 35 | MAIL_PASSWORD=null 36 | MAIL_ENCRYPTION=null 37 | MAIL_FROM_ADDRESS="hello@example.com" 38 | MAIL_FROM_NAME="${APP_NAME}" 39 | 40 | AWS_ACCESS_KEY_ID= 41 | AWS_SECRET_ACCESS_KEY= 42 | AWS_DEFAULT_REGION=us-east-1 43 | AWS_BUCKET= 44 | AWS_USE_PATH_STYLE_ENDPOINT=false 45 | 46 | PUSHER_APP_ID= 47 | PUSHER_APP_KEY= 48 | PUSHER_APP_SECRET= 49 | PUSHER_HOST= 50 | PUSHER_PORT=443 51 | PUSHER_SCHEME=https 52 | PUSHER_APP_CLUSTER=mt1 53 | 54 | VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 55 | VITE_PUSHER_HOST="${PUSHER_HOST}" 56 | VITE_PUSHER_PORT="${PUSHER_PORT}" 57 | VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" 58 | VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 59 | -------------------------------------------------------------------------------- /backend/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /vendor 8 | .env 9 | .env.backup 10 | .env.production 11 | .phpunit.result.cache 12 | Homestead.json 13 | Homestead.yaml 14 | auth.json 15 | npm-debug.log 16 | yarn-error.log 17 | /.fleet 18 | /.idea 19 | /.vscode 20 | -------------------------------------------------------------------------------- /backend/app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire')->hourly(); 16 | } 17 | 18 | /** 19 | * Register the commands for the application. 20 | */ 21 | protected function commands(): void 22 | { 23 | $this->load(__DIR__.'/Commands'); 24 | 25 | require base_path('routes/console.php'); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /backend/app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | , \Psr\Log\LogLevel::*> 14 | */ 15 | protected $levels = [ 16 | // 17 | ]; 18 | 19 | /** 20 | * A list of the exception types that are not reported. 21 | * 22 | * @var array> 23 | */ 24 | protected $dontReport = [ 25 | // 26 | ]; 27 | 28 | /** 29 | * A list of the inputs that are never flashed to the session on validation exceptions. 30 | * 31 | * @var array 32 | */ 33 | protected $dontFlash = [ 34 | 'current_password', 35 | 'password', 36 | 'password_confirmation', 37 | ]; 38 | 39 | /** 40 | * Register the exception handling callbacks for the application. 41 | */ 42 | public function register(): void 43 | { 44 | $this->reportable(function (Throwable $e) { 45 | // 46 | }); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Api/LoginController.php: -------------------------------------------------------------------------------- 1 | all(), [ 22 | 'email' => 'required', 23 | 'password' => 'required' 24 | ]); 25 | 26 | //if validation fails 27 | if ($validator->fails()) { 28 | return response()->json($validator->errors(), 422); 29 | } 30 | 31 | //get credentials from request 32 | $credentials = $request->only('email', 'password'); 33 | 34 | //if auth failed 35 | if(!$token = JWTAuth::attempt($credentials)) { 36 | return response()->json([ 37 | 'success' => false, 38 | 'message' => 'Your email or password is wrong!' 39 | ], 401); 40 | } 41 | 42 | $user = auth()->user(); 43 | 44 | $role = ''; 45 | if ($user->hasRole('admin')) { 46 | $role = 'admin'; 47 | } else if ($user->hasRole('user')) { 48 | $role = 'user'; 49 | } 50 | 51 | //if auth success 52 | return response()->json([ 53 | 'success' => true, 54 | 'user' => $user, 55 | 'role' => $role, 56 | 'token' => $token 57 | ], 200); 58 | } 59 | } -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Api/LogoutController.php: -------------------------------------------------------------------------------- 1 | json([ 28 | 'success' => true, 29 | 'message' => 'Logout Berhasil!', 30 | ]); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Api/RegisterController.php: -------------------------------------------------------------------------------- 1 | all(), [ 22 | 'name' => 'required', 23 | 'email' => 'required|email|unique:users', 24 | 'password' => 'required|min:8|confirmed' 25 | ]); 26 | 27 | //if validation fails 28 | if ($validator->fails()) { 29 | return response()->json($validator->errors(), 422); 30 | } 31 | 32 | //create user 33 | $user = User::create([ 34 | 'name' => $request->name, 35 | 'email' => $request->email, 36 | 'password' => bcrypt($request->password) 37 | ]); 38 | 39 | $user->addRole($request->role); 40 | 41 | //return response JSON user is created 42 | if($user) { 43 | return response()->json([ 44 | 'success' => true, 45 | 'user' => $user, 46 | 'role' => $request->role 47 | ], 201); 48 | } 49 | 50 | //return JSON process insert failed 51 | return response()->json([ 52 | 'success' => false, 53 | ], 409); 54 | } 55 | } -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Auth/AuthenticatedSessionController.php: -------------------------------------------------------------------------------- 1 | authenticate(); 19 | 20 | $request->session()->regenerate(); 21 | 22 | return response()->noContent(); 23 | } 24 | 25 | /** 26 | * Destroy an authenticated session. 27 | */ 28 | public function destroy(Request $request): Response 29 | { 30 | Auth::guard('web')->logout(); 31 | 32 | $request->session()->invalidate(); 33 | 34 | $request->session()->regenerateToken(); 35 | 36 | return response()->noContent(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Auth/EmailVerificationNotificationController.php: -------------------------------------------------------------------------------- 1 | user()->hasVerifiedEmail()) { 19 | return redirect()->intended(RouteServiceProvider::HOME); 20 | } 21 | 22 | $request->user()->sendEmailVerificationNotification(); 23 | 24 | return response()->json(['status' => 'verification-link-sent']); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Auth/NewPasswordController.php: -------------------------------------------------------------------------------- 1 | validate([ 25 | 'token' => ['required'], 26 | 'email' => ['required', 'email'], 27 | 'password' => ['required', 'confirmed', Rules\Password::defaults()], 28 | ]); 29 | 30 | // Here we will attempt to reset the user's password. If it is successful we 31 | // will update the password on an actual user model and persist it to the 32 | // database. Otherwise we will parse the error and return the response. 33 | $status = Password::reset( 34 | $request->only('email', 'password', 'password_confirmation', 'token'), 35 | function ($user) use ($request) { 36 | $user->forceFill([ 37 | 'password' => Hash::make($request->password), 38 | 'remember_token' => Str::random(60), 39 | ])->save(); 40 | 41 | event(new PasswordReset($user)); 42 | } 43 | ); 44 | 45 | if ($status != Password::PASSWORD_RESET) { 46 | throw ValidationException::withMessages([ 47 | 'email' => [__($status)], 48 | ]); 49 | } 50 | 51 | return response()->json(['status' => __($status)]); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Auth/PasswordResetLinkController.php: -------------------------------------------------------------------------------- 1 | validate([ 21 | 'email' => ['required', 'email'], 22 | ]); 23 | 24 | // We will send the password reset link to this user. Once we have attempted 25 | // to send the link, we will examine the response then see the message we 26 | // need to show to the user. Finally, we'll send out a proper response. 27 | $status = Password::sendResetLink( 28 | $request->only('email') 29 | ); 30 | 31 | if ($status != Password::RESET_LINK_SENT) { 32 | throw ValidationException::withMessages([ 33 | 'email' => [__($status)], 34 | ]); 35 | } 36 | 37 | return response()->json(['status' => __($status)]); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Auth/RegisteredUserController.php: -------------------------------------------------------------------------------- 1 | validate([ 24 | 'name' => ['required', 'string', 'max:255'], 25 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class], 26 | 'password' => ['required', 'confirmed', Rules\Password::defaults()], 27 | ]); 28 | 29 | $user = User::create([ 30 | 'name' => $request->name, 31 | 'email' => $request->email, 32 | 'password' => Hash::make($request->password), 33 | ]); 34 | 35 | event(new Registered($user)); 36 | 37 | Auth::login($user); 38 | 39 | return response()->noContent(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Auth/VerifyEmailController.php: -------------------------------------------------------------------------------- 1 | user()->hasVerifiedEmail()) { 19 | return redirect()->intended( 20 | config('app.frontend_url').RouteServiceProvider::HOME.'?verified=1' 21 | ); 22 | } 23 | 24 | if ($request->user()->markEmailAsVerified()) { 25 | event(new Verified($request->user())); 26 | } 27 | 28 | return redirect()->intended( 29 | config('app.frontend_url').RouteServiceProvider::HOME.'?verified=1' 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /backend/app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | protected $middleware = [ 17 | // \App\Http\Middleware\TrustHosts::class, 18 | \App\Http\Middleware\TrustProxies::class, 19 | \Illuminate\Http\Middleware\HandleCors::class, 20 | \App\Http\Middleware\PreventRequestsDuringMaintenance::class, 21 | \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 22 | \App\Http\Middleware\TrimStrings::class, 23 | \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 24 | ]; 25 | 26 | /** 27 | * The application's route middleware groups. 28 | * 29 | * @var array> 30 | */ 31 | protected $middlewareGroups = [ 32 | 'web' => [ 33 | \App\Http\Middleware\EncryptCookies::class, 34 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 35 | \Illuminate\Session\Middleware\StartSession::class, 36 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 37 | \App\Http\Middleware\VerifyCsrfToken::class, 38 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 39 | ], 40 | 41 | 'api' => [ 42 | \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 43 | \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', 44 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 45 | ], 46 | ]; 47 | 48 | /** 49 | * The application's middleware aliases. 50 | * 51 | * Aliases may be used to conveniently assign middleware to routes and groups. 52 | * 53 | * @var array 54 | */ 55 | protected $middlewareAliases = [ 56 | 'auth' => \App\Http\Middleware\Authenticate::class, 57 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 58 | 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 59 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 60 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 61 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 62 | 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 63 | 'signed' => \App\Http\Middleware\ValidateSignature::class, 64 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 65 | 'verified' => \App\Http\Middleware\EnsureEmailIsVerified::class, 66 | ]; 67 | } 68 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson() ? null : route('login'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/EnsureEmailIsVerified.php: -------------------------------------------------------------------------------- 1 | user() || 20 | ($request->user() instanceof MustVerifyEmail && 21 | ! $request->user()->hasVerifiedEmail())) { 22 | return response()->json(['message' => 'Your email address is not verified.'], 409); 23 | } 24 | 25 | return $next($request); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 24 | return redirect(RouteServiceProvider::HOME); 25 | } 26 | } 27 | 28 | return $next($request); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'current_password', 16 | 'password', 17 | 'password_confirmation', 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts(): array 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | |string|null 14 | */ 15 | protected $proxies; 16 | 17 | /** 18 | * The headers that should be used to detect proxies. 19 | * 20 | * @var int 21 | */ 22 | protected $headers = 23 | Request::HEADER_X_FORWARDED_FOR | 24 | Request::HEADER_X_FORWARDED_HOST | 25 | Request::HEADER_X_FORWARDED_PORT | 26 | Request::HEADER_X_FORWARDED_PROTO | 27 | Request::HEADER_X_FORWARDED_AWS_ELB; 28 | } 29 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/ValidateSignature.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 'fbclid', 16 | // 'utm_campaign', 17 | // 'utm_content', 18 | // 'utm_medium', 19 | // 'utm_source', 20 | // 'utm_term', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /backend/app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /backend/app/Http/Requests/Auth/LoginRequest.php: -------------------------------------------------------------------------------- 1 | 26 | */ 27 | public function rules(): array 28 | { 29 | return [ 30 | 'email' => ['required', 'string', 'email'], 31 | 'password' => ['required', 'string'], 32 | ]; 33 | } 34 | 35 | /** 36 | * Attempt to authenticate the request's credentials. 37 | * 38 | * @throws \Illuminate\Validation\ValidationException 39 | */ 40 | public function authenticate(): void 41 | { 42 | $this->ensureIsNotRateLimited(); 43 | 44 | if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { 45 | RateLimiter::hit($this->throttleKey()); 46 | 47 | throw ValidationException::withMessages([ 48 | 'email' => __('auth.failed'), 49 | ]); 50 | } 51 | 52 | RateLimiter::clear($this->throttleKey()); 53 | } 54 | 55 | /** 56 | * Ensure the login request is not rate limited. 57 | * 58 | * @throws \Illuminate\Validation\ValidationException 59 | */ 60 | public function ensureIsNotRateLimited(): void 61 | { 62 | if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { 63 | return; 64 | } 65 | 66 | event(new Lockout($this)); 67 | 68 | $seconds = RateLimiter::availableIn($this->throttleKey()); 69 | 70 | throw ValidationException::withMessages([ 71 | 'email' => trans('auth.throttle', [ 72 | 'seconds' => $seconds, 73 | 'minutes' => ceil($seconds / 60), 74 | ]), 75 | ]); 76 | } 77 | 78 | /** 79 | * Get the rate limiting throttle key for the request. 80 | */ 81 | public function throttleKey(): string 82 | { 83 | return Str::transliterate(Str::lower($this->input('email')).'|'.$this->ip()); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /backend/app/Models/Gallery.php: -------------------------------------------------------------------------------- 1 | 'datetime', 48 | ]; 49 | 50 | /** 51 | * getJWTIdentifier 52 | * 53 | * @return void 54 | */ 55 | public function getJWTIdentifier() 56 | { 57 | return $this->getKey(); 58 | } 59 | 60 | /** 61 | * getJWTCustomClaims 62 | * 63 | * @return void 64 | */ 65 | public function getJWTCustomClaims() 66 | { 67 | return []; 68 | } 69 | } -------------------------------------------------------------------------------- /backend/app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | protected $policies = [ 16 | // 'App\Models\Model' => 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | */ 22 | public function boot(): void 23 | { 24 | $this->registerPolicies(); 25 | 26 | ResetPassword::createUrlUsing(function (object $notifiable, string $token) { 27 | return config('app.frontend_url')."/password-reset/$token?email={$notifiable->getEmailForPasswordReset()}"; 28 | }); 29 | 30 | // 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /backend/app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | > 16 | */ 17 | protected $listen = [ 18 | Registered::class => [ 19 | SendEmailVerificationNotification::class, 20 | ], 21 | ]; 22 | 23 | /** 24 | * Register any events for your application. 25 | */ 26 | public function boot(): void 27 | { 28 | // 29 | } 30 | 31 | /** 32 | * Determine if events and listeners should be automatically discovered. 33 | */ 34 | public function shouldDiscoverEvents(): bool 35 | { 36 | return false; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /backend/app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | configureRateLimiting(); 28 | 29 | $this->routes(function () { 30 | Route::middleware('api') 31 | ->prefix('api') 32 | ->group(base_path('routes/api.php')); 33 | 34 | Route::middleware('web') 35 | ->group(base_path('routes/web.php')); 36 | }); 37 | } 38 | 39 | /** 40 | * Configure the rate limiters for the application. 41 | */ 42 | protected function configureRateLimiting(): void 43 | { 44 | RateLimiter::for('api', function (Request $request) { 45 | return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); 46 | }); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /backend/artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /backend/bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /backend/bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "type": "project", 4 | "description": "The Laravel Framework.", 5 | "keywords": ["framework", "laravel"], 6 | "license": "MIT", 7 | "require": { 8 | "php": "^8.1", 9 | "guzzlehttp/guzzle": "^7.2", 10 | "laravel/framework": "^10.0", 11 | "laravel/sanctum": "^3.2", 12 | "laravel/tinker": "^2.8", 13 | "santigarcor/laratrust": "^8.1", 14 | "tymon/jwt-auth": "^2.0" 15 | }, 16 | "require-dev": { 17 | "fakerphp/faker": "^1.9.1", 18 | "laravel/breeze": "^1.20", 19 | "laravel/pint": "^1.0", 20 | "laravel/sail": "^1.18", 21 | "mockery/mockery": "^1.4.4", 22 | "nunomaduro/collision": "^7.0", 23 | "phpunit/phpunit": "^10.0", 24 | "spatie/laravel-ignition": "^2.0" 25 | }, 26 | "autoload": { 27 | "psr-4": { 28 | "App\\": "app/", 29 | "Database\\Factories\\": "database/factories/", 30 | "Database\\Seeders\\": "database/seeders/" 31 | } 32 | }, 33 | "autoload-dev": { 34 | "psr-4": { 35 | "Tests\\": "tests/" 36 | } 37 | }, 38 | "scripts": { 39 | "post-autoload-dump": [ 40 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 41 | "@php artisan package:discover --ansi" 42 | ], 43 | "post-update-cmd": [ 44 | "@php artisan vendor:publish --tag=laravel-assets --ansi --force" 45 | ], 46 | "post-root-package-install": [ 47 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 48 | ], 49 | "post-create-project-cmd": [ 50 | "@php artisan key:generate --ansi" 51 | ] 52 | }, 53 | "extra": { 54 | "laravel": { 55 | "dont-discover": [] 56 | } 57 | }, 58 | "config": { 59 | "optimize-autoloader": true, 60 | "preferred-install": "dist", 61 | "sort-packages": true, 62 | "allow-plugins": { 63 | "pestphp/pest-plugin": true, 64 | "php-http/discovery": true 65 | } 66 | }, 67 | "minimum-stability": "stable", 68 | "prefer-stable": true 69 | } 70 | -------------------------------------------------------------------------------- /backend/config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', 40 | 'port' => env('PUSHER_PORT', 443), 41 | 'scheme' => env('PUSHER_SCHEME', 'https'), 42 | 'encrypted' => true, 43 | 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', 44 | ], 45 | 'client_options' => [ 46 | // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html 47 | ], 48 | ], 49 | 50 | 'ably' => [ 51 | 'driver' => 'ably', 52 | 'key' => env('ABLY_KEY'), 53 | ], 54 | 55 | 'redis' => [ 56 | 'driver' => 'redis', 57 | 'connection' => 'default', 58 | ], 59 | 60 | 'log' => [ 61 | 'driver' => 'log', 62 | ], 63 | 64 | 'null' => [ 65 | 'driver' => 'null', 66 | ], 67 | 68 | ], 69 | 70 | ]; 71 | -------------------------------------------------------------------------------- /backend/config/cors.php: -------------------------------------------------------------------------------- 1 | ['*'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => [env('FRONTEND_URL', 'http://localhost:3000'), 'http://localhost:5173', 'http://192.168.18.11:5173'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => [], 29 | 30 | 'max_age' => 0, 31 | 32 | 'supports_credentials' => true, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /backend/config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DISK', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Filesystem Disks 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure as many filesystem "disks" as you wish, and you 24 | | may even configure multiple disks of the same driver. Defaults have 25 | | been set up for each driver as an example of the required values. 26 | | 27 | | Supported Drivers: "local", "ftp", "sftp", "s3" 28 | | 29 | */ 30 | 31 | 'disks' => [ 32 | 33 | 'local' => [ 34 | 'driver' => 'local', 35 | 'root' => storage_path('app'), 36 | 'throw' => false, 37 | ], 38 | 39 | 'public' => [ 40 | 'driver' => 'local', 41 | 'root' => storage_path('app/public'), 42 | 'url' => env('APP_URL').'/storage', 43 | 'visibility' => 'public', 44 | 'throw' => false, 45 | ], 46 | 47 | 's3' => [ 48 | 'driver' => 's3', 49 | 'key' => env('AWS_ACCESS_KEY_ID'), 50 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 51 | 'region' => env('AWS_DEFAULT_REGION'), 52 | 'bucket' => env('AWS_BUCKET'), 53 | 'url' => env('AWS_URL'), 54 | 'endpoint' => env('AWS_ENDPOINT'), 55 | 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 56 | 'throw' => false, 57 | ], 58 | 59 | ], 60 | 61 | /* 62 | |-------------------------------------------------------------------------- 63 | | Symbolic Links 64 | |-------------------------------------------------------------------------- 65 | | 66 | | Here you may configure the symbolic links that will be created when the 67 | | `storage:link` Artisan command is executed. The array keys should be 68 | | the locations of the links and the values should be their targets. 69 | | 70 | */ 71 | 72 | 'links' => [ 73 | public_path('storage') => storage_path('app/public'), 74 | ], 75 | 76 | ]; 77 | -------------------------------------------------------------------------------- /backend/config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Bcrypt Options 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may specify the configuration options that should be used when 26 | | passwords are hashed using the Bcrypt algorithm. This will allow you 27 | | to control the amount of time it takes to hash the given password. 28 | | 29 | */ 30 | 31 | 'bcrypt' => [ 32 | 'rounds' => env('BCRYPT_ROUNDS', 10), 33 | ], 34 | 35 | /* 36 | |-------------------------------------------------------------------------- 37 | | Argon Options 38 | |-------------------------------------------------------------------------- 39 | | 40 | | Here you may specify the configuration options that should be used when 41 | | passwords are hashed using the Argon algorithm. These will allow you 42 | | to control the amount of time it takes to hash the given password. 43 | | 44 | */ 45 | 46 | 'argon' => [ 47 | 'memory' => 65536, 48 | 'threads' => 1, 49 | 'time' => 4, 50 | ], 51 | 52 | ]; 53 | -------------------------------------------------------------------------------- /backend/config/laratrust_seeder.php: -------------------------------------------------------------------------------- 1 | false, 8 | 9 | /** 10 | * Control if all the laratrust tables should be truncated before running the seeder. 11 | */ 12 | 'truncate_tables' => true, 13 | 14 | 'roles_structure' => [ 15 | 'admin' => [ 16 | 'users' => 'c,r,u,d', 17 | ], 18 | 'user' => [ 19 | 'users' => 'c,r,u,d', 20 | ], 21 | ], 22 | 23 | 'permissions_map' => [ 24 | 'c' => 'create', 25 | 'r' => 'read', 26 | 'u' => 'update', 27 | 'd' => 'delete', 28 | ], 29 | ]; 30 | -------------------------------------------------------------------------------- /backend/config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'sync'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Queue Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the connection information for each server that 24 | | is used by your application. A default configuration has been added 25 | | for each back-end shipped with Laravel. You are free to add more. 26 | | 27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'table' => 'jobs', 40 | 'queue' => 'default', 41 | 'retry_after' => 90, 42 | 'after_commit' => false, 43 | ], 44 | 45 | 'beanstalkd' => [ 46 | 'driver' => 'beanstalkd', 47 | 'host' => 'localhost', 48 | 'queue' => 'default', 49 | 'retry_after' => 90, 50 | 'block_for' => 0, 51 | 'after_commit' => false, 52 | ], 53 | 54 | 'sqs' => [ 55 | 'driver' => 'sqs', 56 | 'key' => env('AWS_ACCESS_KEY_ID'), 57 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 58 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 59 | 'queue' => env('SQS_QUEUE', 'default'), 60 | 'suffix' => env('SQS_SUFFIX'), 61 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 62 | 'after_commit' => false, 63 | ], 64 | 65 | 'redis' => [ 66 | 'driver' => 'redis', 67 | 'connection' => 'default', 68 | 'queue' => env('REDIS_QUEUE', 'default'), 69 | 'retry_after' => 90, 70 | 'block_for' => null, 71 | 'after_commit' => false, 72 | ], 73 | 74 | ], 75 | 76 | /* 77 | |-------------------------------------------------------------------------- 78 | | Failed Queue Jobs 79 | |-------------------------------------------------------------------------- 80 | | 81 | | These options configure the behavior of failed queue job logging so you 82 | | can control which database and table are used to store the jobs that 83 | | have failed. You may change them to any database / table you wish. 84 | | 85 | */ 86 | 87 | 'failed' => [ 88 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 89 | 'database' => env('DB_CONNECTION', 'mysql'), 90 | 'table' => 'failed_jobs', 91 | ], 92 | 93 | ]; 94 | -------------------------------------------------------------------------------- /backend/config/sanctum.php: -------------------------------------------------------------------------------- 1 | explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( 17 | '%s%s%s', 18 | 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', 19 | env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '', 20 | env('FRONTEND_URL') ? ','.parse_url(env('FRONTEND_URL'), PHP_URL_HOST) : '' 21 | ))), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Expiration Minutes 26 | |-------------------------------------------------------------------------- 27 | | 28 | | This value controls the number of minutes until an issued token will be 29 | | considered expired. If this value is null, personal access tokens do 30 | | not expire. This won't tweak the lifetime of first-party sessions. 31 | | 32 | */ 33 | 34 | 'expiration' => null, 35 | 36 | /* 37 | |-------------------------------------------------------------------------- 38 | | Sanctum Middleware 39 | |-------------------------------------------------------------------------- 40 | | 41 | | When authenticating your first-party SPA with Sanctum you may need to 42 | | customize some of the middleware Sanctum uses while processing the 43 | | request. You may change the middleware listed below as required. 44 | | 45 | */ 46 | 47 | 'middleware' => [ 48 | 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, 49 | 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, 50 | ], 51 | 52 | ]; 53 | -------------------------------------------------------------------------------- /backend/config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | 'scheme' => 'https', 22 | ], 23 | 24 | 'postmark' => [ 25 | 'token' => env('POSTMARK_TOKEN'), 26 | ], 27 | 28 | 'ses' => [ 29 | 'key' => env('AWS_ACCESS_KEY_ID'), 30 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 31 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 32 | ], 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /backend/config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /backend/database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /backend/database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class UserFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | public function definition(): array 19 | { 20 | return [ 21 | 'name' => fake()->name(), 22 | 'email' => fake()->unique()->safeEmail(), 23 | 'email_verified_at' => now(), 24 | 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 25 | 'remember_token' => Str::random(10), 26 | ]; 27 | } 28 | 29 | /** 30 | * Indicate that the model's email address should be unverified. 31 | */ 32 | public function unverified(): static 33 | { 34 | return $this->state(fn (array $attributes) => [ 35 | 'email_verified_at' => null, 36 | ]); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /backend/database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('name'); 17 | $table->string('email')->unique(); 18 | $table->timestamp('email_verified_at')->nullable(); 19 | $table->string('password'); 20 | $table->rememberToken(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('users'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /backend/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php: -------------------------------------------------------------------------------- 1 | string('email')->primary(); 16 | $table->string('token'); 17 | $table->timestamp('created_at')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('password_reset_tokens'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /backend/database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('uuid')->unique(); 17 | $table->text('connection'); 18 | $table->text('queue'); 19 | $table->longText('payload'); 20 | $table->longText('exception'); 21 | $table->timestamp('failed_at')->useCurrent(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('failed_jobs'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /backend/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->morphs('tokenable'); 17 | $table->string('name'); 18 | $table->string('token', 64)->unique(); 19 | $table->text('abilities')->nullable(); 20 | $table->timestamp('last_used_at')->nullable(); 21 | $table->timestamp('expires_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('personal_access_tokens'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /backend/database/migrations/2023_04_06_230417_create_products_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->text('name'); 17 | $table->text('description')->nullable(); 18 | $table->decimal('price', 10, 2); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('products'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /backend/database/migrations/2023_04_16_124222_create_galleries_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->text('name_gallery'); 17 | $table->text('description_gallery'); 18 | $table->text('image'); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('galleries'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /backend/database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call([ 16 | LaratrustSeeder::class 17 | ]); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /backend/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests/Unit 10 | 11 | 12 | ./tests/Feature 13 | 14 | 15 | 16 | 17 | ./app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /backend/public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /backend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/backend/public/favicon.ico -------------------------------------------------------------------------------- /backend/public/index.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class); 50 | 51 | $response = $kernel->handle( 52 | $request = Request::capture() 53 | )->send(); 54 | 55 | $kernel->terminate($request, $response); 56 | -------------------------------------------------------------------------------- /backend/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /backend/resources/views/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /backend/routes/api.php: -------------------------------------------------------------------------------- 1 | name('register'); 22 | Route::post('/login', App\Http\Controllers\Api\LoginController::class)->name('login'); 23 | Route::middleware('auth:api')->get('/user', function (Request $request) { 24 | $user = $request->user(); $role = $user->hasRole('admin') ? 'admin' : 'user'; 25 | $user->setAttribute('role', $role); 26 | return $user; 27 | }); 28 | 29 | Route::group(['middleware' => ['auth:api']], function () { 30 | Route::get('/user', function (Request $request) { 31 | $user = $request->user(); $role = $user->hasRole('admin') ? 'admin' : 'user'; 32 | $user->setAttribute('role', $role); 33 | return $user; 34 | }); 35 | Route::get('/profile', [PersonalController::class, 'index']); 36 | Route::put('/profile', [PersonalController::class, 'updateProfile']); 37 | Route::put('/update-password', [PersonalController::class, 'updatePassword']); 38 | }); 39 | 40 | Route::group(['middleware' => ['auth:api', 'role:admin']], function () { 41 | Route::resource('/products', ProductController::class); 42 | Route::post('/products/multiple-store', [ProductController::class, 'multipleStore']); 43 | Route::resource('/gallery', GalleryController::class); 44 | }); 45 | 46 | Route::post('/logout', App\Http\Controllers\Api\LogoutController::class)->name('logout'); -------------------------------------------------------------------------------- /backend/routes/auth.php: -------------------------------------------------------------------------------- 1 | middleware('guest') 13 | ->name('register'); 14 | 15 | Route::post('/login', [AuthenticatedSessionController::class, 'store']) 16 | ->middleware('guest') 17 | ->name('login'); 18 | 19 | Route::post('/forgot-password', [PasswordResetLinkController::class, 'store']) 20 | ->middleware('guest') 21 | ->name('password.email'); 22 | 23 | Route::post('/reset-password', [NewPasswordController::class, 'store']) 24 | ->middleware('guest') 25 | ->name('password.store'); 26 | 27 | Route::get('/verify-email/{id}/{hash}', VerifyEmailController::class) 28 | ->middleware(['auth', 'signed', 'throttle:6,1']) 29 | ->name('verification.verify'); 30 | 31 | Route::post('/email/verification-notification', [EmailVerificationNotificationController::class, 'store']) 32 | ->middleware(['auth', 'throttle:6,1']) 33 | ->name('verification.send'); 34 | 35 | Route::post('/logout', [AuthenticatedSessionController::class, 'destroy']) 36 | ->middleware('auth') 37 | ->name('logout'); 38 | -------------------------------------------------------------------------------- /backend/routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /backend/routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->purpose('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /backend/routes/web.php: -------------------------------------------------------------------------------- 1 | app()->version()]; 18 | }); 19 | 20 | require __DIR__.'/auth.php'; 21 | -------------------------------------------------------------------------------- /backend/storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /backend/storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /backend/storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /backend/storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 18 | 19 | return $app; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/tests/Feature/Auth/AuthenticationTest.php: -------------------------------------------------------------------------------- 1 | create(); 16 | 17 | $response = $this->post('/login', [ 18 | 'email' => $user->email, 19 | 'password' => 'password', 20 | ]); 21 | 22 | $this->assertAuthenticated(); 23 | $response->assertNoContent(); 24 | } 25 | 26 | public function test_users_can_not_authenticate_with_invalid_password(): void 27 | { 28 | $user = User::factory()->create(); 29 | 30 | $this->post('/login', [ 31 | 'email' => $user->email, 32 | 'password' => 'wrong-password', 33 | ]); 34 | 35 | $this->assertGuest(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /backend/tests/Feature/Auth/EmailVerificationTest.php: -------------------------------------------------------------------------------- 1 | create([ 20 | 'email_verified_at' => null, 21 | ]); 22 | 23 | Event::fake(); 24 | 25 | $verificationUrl = URL::temporarySignedRoute( 26 | 'verification.verify', 27 | now()->addMinutes(60), 28 | ['id' => $user->id, 'hash' => sha1($user->email)] 29 | ); 30 | 31 | $response = $this->actingAs($user)->get($verificationUrl); 32 | 33 | Event::assertDispatched(Verified::class); 34 | $this->assertTrue($user->fresh()->hasVerifiedEmail()); 35 | $response->assertRedirect(config('app.frontend_url').RouteServiceProvider::HOME.'?verified=1'); 36 | } 37 | 38 | public function test_email_is_not_verified_with_invalid_hash(): void 39 | { 40 | $user = User::factory()->create([ 41 | 'email_verified_at' => null, 42 | ]); 43 | 44 | $verificationUrl = URL::temporarySignedRoute( 45 | 'verification.verify', 46 | now()->addMinutes(60), 47 | ['id' => $user->id, 'hash' => sha1('wrong-email')] 48 | ); 49 | 50 | $this->actingAs($user)->get($verificationUrl); 51 | 52 | $this->assertFalse($user->fresh()->hasVerifiedEmail()); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /backend/tests/Feature/Auth/PasswordResetTest.php: -------------------------------------------------------------------------------- 1 | create(); 20 | 21 | $this->post('/forgot-password', ['email' => $user->email]); 22 | 23 | Notification::assertSentTo($user, ResetPassword::class); 24 | } 25 | 26 | public function test_password_can_be_reset_with_valid_token(): void 27 | { 28 | Notification::fake(); 29 | 30 | $user = User::factory()->create(); 31 | 32 | $this->post('/forgot-password', ['email' => $user->email]); 33 | 34 | Notification::assertSentTo($user, ResetPassword::class, function (object $notification) use ($user) { 35 | $response = $this->post('/reset-password', [ 36 | 'token' => $notification->token, 37 | 'email' => $user->email, 38 | 'password' => 'password', 39 | 'password_confirmation' => 'password', 40 | ]); 41 | 42 | $response->assertSessionHasNoErrors(); 43 | 44 | return true; 45 | }); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /backend/tests/Feature/Auth/RegistrationTest.php: -------------------------------------------------------------------------------- 1 | post('/register', [ 15 | 'name' => 'Test User', 16 | 'email' => 'test@example.com', 17 | 'password' => 'password', 18 | 'password_confirmation' => 'password', 19 | ]); 20 | 21 | $this->assertAuthenticated(); 22 | $response->assertNoContent(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /backend/tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 16 | 17 | $response->assertStatus(200); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /backend/tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4 3 | } 4 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 18 | 22 | 23 | 24 | Vite + React 25 | 26 | 27 |
28 | 29 | 30 | 31 | 36 | 41 | 42 | 43 | 44 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-project", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "axios": "^1.3.5", 13 | "crypto-js": "^4.1.1", 14 | "lodash": "^4.17.21", 15 | "react": "^18.2.0", 16 | "react-dom": "^18.2.0", 17 | "react-router-dom": "^6.10.0", 18 | "sweetalert2": "^11.7.3", 19 | "sweetalert2-react-content": "^5.0.7" 20 | }, 21 | "devDependencies": { 22 | "@types/react": "^18.0.28", 23 | "@types/react-dom": "^18.0.11", 24 | "@vitejs/plugin-react": "^3.1.0", 25 | "autoprefixer": "^10.4.14", 26 | "postcss": "^8.4.21", 27 | "prettier": "2.8.7", 28 | "prettier-plugin-tailwindcss": "^0.2.7", 29 | "tailwindcss": "^3.3.1", 30 | "vite": "^4.2.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /frontend/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | .logo { 9 | height: 6em; 10 | padding: 1.5em; 11 | will-change: filter; 12 | transition: filter 300ms; 13 | } 14 | .logo:hover { 15 | filter: drop-shadow(0 0 2em #646cffaa); 16 | } 17 | .logo.react:hover { 18 | filter: drop-shadow(0 0 2em #61dafbaa); 19 | } 20 | 21 | @keyframes logo-spin { 22 | from { 23 | transform: rotate(0deg); 24 | } 25 | to { 26 | transform: rotate(360deg); 27 | } 28 | } 29 | 30 | @media (prefers-reduced-motion: no-preference) { 31 | a:nth-of-type(2) .logo { 32 | animation: logo-spin infinite 20s linear; 33 | } 34 | } 35 | 36 | .card { 37 | padding: 2em; 38 | } 39 | 40 | .read-the-docs { 41 | color: #888; 42 | } 43 | -------------------------------------------------------------------------------- /frontend/src/App.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Navbar from "./components/Navbar"; 3 | import Router from "./components/Router"; 4 | import Sidebar from "./components/Sidebar"; 5 | import Footer from "./components/Footer"; 6 | export default function App() { 7 | return ( 8 | <> 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * You can write your CSS code here, DO NOT touch the default JavaScript file 4 | * because it will make it harder for you to update. 5 | * 6 | */ 7 | 8 | /*# sourceMappingURL=custom.css.map */ 9 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/css/custom.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../sources/scss/custom.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","file":"custom.css"} -------------------------------------------------------------------------------- /frontend/src/assets/stisla/css/skins/reverse.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../../sources/scss/skins/reverse.scss"],"names":[],"mappings":"AAMM;EACE;;AAKI;EACE;EACA;EACA;;AAMA;AAAA;EACE;EACA;;AACA;AAAA;EACI;EACA;;AAIJ;AAAA;EACE;EACA;;AAShB;EACE;;AAEE;EACE;;AAKA;EACE;;AACA;EACE;;AAIF;AAAA;AAAA;AAAA;EAIE;;AAGJ;EACE;;AAIE;EACE;;AACA;EACE;EACA;;AAIF;EACE;;AASd;AAAA;EAEE;;AACA;AAAA;AAAA;AAAA;EAEE;;AACA;AAAA;AAAA;AAAA;EACE;;AAKF;AAAA;AAAA;AAAA;EAEE","file":"reverse.css"} -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-600.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-600.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-600.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-600.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-600.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-600.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-700.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-700.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-700.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-700.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-800.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-800.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-800.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-800.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-800.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-800.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/nunito-v9-latin-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Black-FD-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Bold-FD-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-FD-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Light-FD-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Medium-FD-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits-Without-Latin/Vazir-Thin-FD-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Black-FD.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Bold-FD.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-FD.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Light-FD.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Medium-FD.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Farsi-Digits/Vazir-Thin-FD.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/LICENSE: -------------------------------------------------------------------------------- 1 | Changes by Saber Rastikerdar are in public domain. 2 | Glyphs and data from Roboto font are licensed under the Apache License, Version 2.0. 3 | 4 | Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. 5 | 6 | Bitstream Vera Fonts Copyright 7 | ------------------------------ 8 | 9 | Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is 10 | a trademark of Bitstream, Inc. 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining a copy 13 | of the fonts accompanying this license ("Fonts") and associated 14 | documentation files (the "Font Software"), to reproduce and distribute the 15 | Font Software, including without limitation the rights to use, copy, merge, 16 | publish, distribute, and/or sell copies of the Font Software, and to permit 17 | persons to whom the Font Software is furnished to do so, subject to the 18 | following conditions: 19 | 20 | The above copyright and trademark notices and this permission notice shall 21 | be included in all copies of one or more of the Font Software typefaces. 22 | 23 | The Font Software may be modified, altered, or added to, and in particular 24 | the designs of glyphs or characters in the Fonts may be modified and 25 | additional glyphs or characters may be added to the Fonts, only if the fonts 26 | are renamed to names not containing either the words "Bitstream" or the word 27 | "Vera". 28 | 29 | This License becomes null and void to the extent applicable to Fonts or Font 30 | Software that has been modified and is distributed under the "Bitstream 31 | Vera" names. 32 | 33 | The Font Software may be sold as part of a larger software package but no 34 | copy of one or more of the Font Software typefaces may be sold by itself. 35 | 36 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 37 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, 38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, 39 | TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME 40 | FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING 41 | ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, 42 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 43 | THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE 44 | FONT SOFTWARE. 45 | 46 | Except as contained in this notice, the names of Gnome, the Gnome 47 | Foundation, and Bitstream Inc., shall not be used in advertising or 48 | otherwise to promote the sale, use or other dealings in this Font Software 49 | without prior written authorization from the Gnome Foundation or Bitstream 50 | Inc., respectively. For further information, contact: fonts at gnome dot 51 | org. -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Black.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Black.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Black.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Black.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Bold.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Light.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Light.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Light.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Light.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Medium.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir-Thin.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Vazir.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Vazir.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Black-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Bold-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Light-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Medium-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-Thin-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.eot -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.ttf -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.woff -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/Without-Latin/Vazir-WOL.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/font-face.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: Vazir; 3 | src: url("Vazir.eot"); 4 | src: url("Vazir.eot?#iefix") format("embedded-opentype"), 5 | url("Vazir.woff2") format("woff2"), url("Vazir.woff") format("woff"), 6 | url("Vazir.ttf") format("truetype"); 7 | font-weight: normal; 8 | } 9 | 10 | @font-face { 11 | font-family: Vazir; 12 | src: url("Vazir-Bold.eot"); 13 | src: url("Vazir-Bold.eot?#iefix") format("embedded-opentype"), 14 | url("Vazir-Bold.woff2") format("woff2"), 15 | url("Vazir-Bold.woff") format("woff"), 16 | url("Vazir-Bold.ttf") format("truetype"); 17 | font-weight: bold; 18 | } 19 | 20 | @font-face { 21 | font-family: Vazir; 22 | src: url("Vazir-Light.eot"); 23 | src: url("Vazir-Light.eot?#iefix") format("embedded-opentype"), 24 | url("Vazir-Light.woff2") format("woff2"), 25 | url("Vazir-Light.woff") format("woff"), 26 | url("Vazir-Light.ttf") format("truetype"); 27 | font-weight: 300; 28 | } 29 | 30 | @font-face { 31 | font-family: Vazir; 32 | src: url("Vazir-Medium.eot"); 33 | src: url("Vazir-Medium.eot?#iefix") format("embedded-opentype"), 34 | url("Vazir-Medium.woff2") format("woff2"), 35 | url("Vazir-Medium.woff") format("woff"), 36 | url("Vazir-Medium.ttf") format("truetype"); 37 | font-weight: 500; 38 | } 39 | 40 | @font-face { 41 | font-family: Vazir; 42 | src: url("Vazir-Thin.eot"); 43 | src: url("Vazir-Thin.eot?#iefix") format("embedded-opentype"), 44 | url("Vazir-Thin.woff2") format("woff2"), 45 | url("Vazir-Thin.woff") format("woff"), 46 | url("Vazir-Thin.ttf") format("truetype"); 47 | font-weight: 100; 48 | } 49 | 50 | @font-face { 51 | font-family: Vazir; 52 | src: url("Vazir-Black.eot"); 53 | src: url("Vazir-Black.eot?#iefix") format("embedded-opentype"), 54 | url("Vazir-Black.woff2") format("woff2"), 55 | url("Vazir-Black.woff") format("woff"), 56 | url("Vazir-Black.ttf") format("truetype"); 57 | font-weight: 900; 58 | } 59 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/fonts/vazir/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/fonts/vazir/sample.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/avatar/avatar-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/avatar/avatar-1.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/avatar/avatar-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/avatar/avatar-2.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/avatar/avatar-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/avatar/avatar-3.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/avatar/avatar-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/avatar/avatar-4.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/avatar/avatar-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/avatar/avatar-5.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/example-image-50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/example-image-50.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/example-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/example-image.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img01.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img02.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img03.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img04.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img05.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img06.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img07.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img08.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img09.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img10.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img11.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img12.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img13.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img14.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img15.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img16.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/news/img17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/news/img17.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/p-250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/p-250.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/p-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/p-50.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-1-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-1-50.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-1.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-2-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-2-50.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-2.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-3-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-3-50.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-3.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-4-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-4-50.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-4.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-5-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-5-50.png -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/products/product-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/products/product-5.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/stisla-fill.svg: -------------------------------------------------------------------------------- 1 | stisla-fill -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/stisla-light.svg: -------------------------------------------------------------------------------- 1 | stisla-light -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/stisla-transparent.svg: -------------------------------------------------------------------------------- 1 | stisla-transparent -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/stisla.svg: -------------------------------------------------------------------------------- 1 | stisla -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/unsplash/andre-benz-1214056-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/unsplash/andre-benz-1214056-unsplash.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/unsplash/eberhard-grossgasteiger-1207565-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/unsplash/eberhard-grossgasteiger-1207565-unsplash.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/img/unsplash/login-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fhmiibrhimdev/laravel-react-vite-stisla/261df4d4c116287e9b1054fcad48b5c03e661df7/frontend/src/assets/stisla/img/unsplash/login-bg.jpg -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/custom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * You can write your JS code here, DO NOT touch the default style file 4 | * because it will make it harder for you to update. 5 | * 6 | */ 7 | 8 | "use strict"; 9 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/auth-register.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $(".pwstrength").pwstrength(); 4 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/components-multiple-upload.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var dropzone = new Dropzone("#mydropzone", { 4 | url: "#", 5 | }); 6 | 7 | var minSteps = 6, 8 | maxSteps = 60, 9 | timeBetweenSteps = 100, 10 | bytesPerStep = 100000; 11 | 12 | dropzone.uploadFiles = function (files) { 13 | var self = this; 14 | 15 | for (var i = 0; i < files.length; i++) { 16 | var file = files[i]; 17 | totalSteps = Math.round( 18 | Math.min(maxSteps, Math.max(minSteps, file.size / bytesPerStep)) 19 | ); 20 | 21 | for (var step = 0; step < totalSteps; step++) { 22 | var duration = timeBetweenSteps * (step + 1); 23 | setTimeout( 24 | (function (file, totalSteps, step) { 25 | return function () { 26 | file.upload = { 27 | progress: (100 * (step + 1)) / totalSteps, 28 | total: file.size, 29 | bytesSent: ((step + 1) * file.size) / totalSteps, 30 | }; 31 | 32 | self.emit( 33 | "uploadprogress", 34 | file, 35 | file.upload.progress, 36 | file.upload.bytesSent 37 | ); 38 | if (file.upload.progress == 100) { 39 | file.status = Dropzone.SUCCESS; 40 | self.emit("success", file, "success", null); 41 | self.emit("complete", file); 42 | self.processQueue(); 43 | } 44 | }; 45 | })(file, totalSteps, step), 46 | duration 47 | ); 48 | } 49 | } 50 | }; 51 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/components-table.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("[data-checkboxes]").each(function () { 4 | var me = $(this), 5 | group = me.data("checkboxes"), 6 | role = me.data("checkbox-role"); 7 | 8 | me.change(function () { 9 | var all = $( 10 | '[data-checkboxes="' + 11 | group + 12 | '"]:not([data-checkbox-role="dad"])' 13 | ), 14 | checked = $( 15 | '[data-checkboxes="' + 16 | group + 17 | '"]:not([data-checkbox-role="dad"]):checked' 18 | ), 19 | dad = $( 20 | '[data-checkboxes="' + group + '"][data-checkbox-role="dad"]' 21 | ), 22 | total = all.length, 23 | checked_length = checked.length; 24 | 25 | if (role == "dad") { 26 | if (me.is(":checked")) { 27 | all.prop("checked", true); 28 | } else { 29 | all.prop("checked", false); 30 | } 31 | } else { 32 | if (checked_length >= total) { 33 | dad.prop("checked", true); 34 | } else { 35 | dad.prop("checked", false); 36 | } 37 | } 38 | }); 39 | }); 40 | 41 | $("#sortable-table tbody").sortable({ 42 | handle: ".sort-handler", 43 | }); 44 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/components-user.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#users-carousel").owlCarousel({ 4 | items: 4, 5 | margin: 20, 6 | autoplay: true, 7 | autoplayTimeout: 5000, 8 | loop: true, 9 | responsive: { 10 | 0: { 11 | items: 2, 12 | }, 13 | 578: { 14 | items: 4, 15 | }, 16 | 768: { 17 | items: 4, 18 | }, 19 | }, 20 | }); 21 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/features-post-create.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("select").selectric(); 4 | $.uploadPreview({ 5 | input_field: "#image-upload", // Default: .image-upload 6 | preview_box: "#image-preview", // Default: .image-preview 7 | label_field: "#image-label", // Default: .image-label 8 | label_default: "Choose File", // Default: Choose File 9 | label_selected: "Change File", // Default: Change File 10 | no_label: false, // Default: false 11 | success_callback: null, // Default: null 12 | }); 13 | $(".inputtags").tagsinput("items"); 14 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/features-posts.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("[data-checkboxes]").each(function () { 4 | var me = $(this), 5 | group = me.data("checkboxes"), 6 | role = me.data("checkbox-role"); 7 | 8 | me.change(function () { 9 | var all = $( 10 | '[data-checkboxes="' + 11 | group + 12 | '"]:not([data-checkbox-role="dad"])' 13 | ), 14 | checked = $( 15 | '[data-checkboxes="' + 16 | group + 17 | '"]:not([data-checkbox-role="dad"]):checked' 18 | ), 19 | dad = $( 20 | '[data-checkboxes="' + group + '"][data-checkbox-role="dad"]' 21 | ), 22 | total = all.length, 23 | checked_length = checked.length; 24 | 25 | if (role == "dad") { 26 | if (me.is(":checked")) { 27 | all.prop("checked", true); 28 | } else { 29 | all.prop("checked", false); 30 | } 31 | } else { 32 | if (checked_length >= total) { 33 | dad.prop("checked", true); 34 | } else { 35 | dad.prop("checked", false); 36 | } 37 | } 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/features-setting-detail.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#setting-form").submit(function () { 4 | let save_button = $(this).find("#save-btn"), 5 | output_status = $("#output-status"), 6 | card = $("#settings-card"); 7 | 8 | let card_progress = $.cardProgress(card, { 9 | spinner: false, 10 | }); 11 | save_button.addClass("btn-progress"); 12 | output_status.html(""); 13 | 14 | // Do AJAX here 15 | // Here's fake AJAX 16 | setTimeout(function () { 17 | card_progress.dismiss(function () { 18 | $("html, body").animate({ 19 | scrollTop: 0, 20 | }); 21 | 22 | output_status.prepend( 23 | '
Setting saved Successfully.
' 24 | ); 25 | save_button.removeClass("btn-progress"); 26 | }); 27 | }, 3000); 28 | return false; 29 | }); 30 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/forms-advanced-forms.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var cleavePN = new Cleave(".phone-number", { 4 | phone: true, 5 | phoneRegionCode: "us", 6 | }); 7 | var cleaveC = new Cleave(".currency", { 8 | numeral: true, 9 | numeralThousandsGroupStyle: "thousand", 10 | }); 11 | var cleavePC = new Cleave(".purchase-code", { 12 | delimiter: "-", 13 | blocks: [4, 4, 4, 4], 14 | uppercase: true, 15 | }); 16 | var cleaveI = new Cleave(".invoice-input", { 17 | prefix: "INV", 18 | delimiter: "-", 19 | blocks: [10], 20 | uppercase: true, 21 | }); 22 | var cleaveD = new Cleave(".datemask", { 23 | date: true, 24 | datePattern: ["Y", "m", "d"], 25 | }); 26 | var cc_last_type; 27 | var cleaveCC = new Cleave(".creditcard", { 28 | creditCard: true, 29 | onCreditCardTypeChanged: function (type) { 30 | if (type !== "unknown") { 31 | if (type == "amex") { 32 | type = "americanexpress"; 33 | } else if (type == "mastercard") { 34 | type = "mastercard"; 35 | } else if (type == "visa") { 36 | type = "visa"; 37 | } else if (type == "diners") { 38 | type = "dinersclub"; 39 | } else if (type == "discover") { 40 | type = "discover"; 41 | } else if (type == "jcb") { 42 | type = "jcb"; 43 | } 44 | $(".creditcard").removeClass(cc_last_type); 45 | $(".creditcard").addClass(type); 46 | cc_last_type = type; 47 | } 48 | }, 49 | }); 50 | 51 | $(".pwstrength").pwstrength(); 52 | 53 | $(".daterange-cus").daterangepicker({ 54 | locale: { format: "YYYY-MM-DD" }, 55 | drops: "down", 56 | opens: "right", 57 | }); 58 | $(".daterange-btn").daterangepicker( 59 | { 60 | ranges: { 61 | Today: [moment(), moment()], 62 | Yesterday: [ 63 | moment().subtract(1, "days"), 64 | moment().subtract(1, "days"), 65 | ], 66 | "Last 7 Days": [moment().subtract(6, "days"), moment()], 67 | "Last 30 Days": [moment().subtract(29, "days"), moment()], 68 | "This Month": [moment().startOf("month"), moment().endOf("month")], 69 | "Last Month": [ 70 | moment().subtract(1, "month").startOf("month"), 71 | moment().subtract(1, "month").endOf("month"), 72 | ], 73 | }, 74 | startDate: moment().subtract(29, "days"), 75 | endDate: moment(), 76 | }, 77 | function (start, end) { 78 | $(".daterange-btn span").html( 79 | start.format("MMMM D, YYYY") + " - " + end.format("MMMM D, YYYY") 80 | ); 81 | } 82 | ); 83 | 84 | $(".colorpickerinput").colorpicker({ 85 | format: "hex", 86 | component: ".input-group-append", 87 | }); 88 | $(".inputtags").tagsinput("items"); 89 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-advanced-route.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // initialize map 4 | var map = new GMaps({ 5 | div: "#map", 6 | lat: -6.5637928, 7 | lng: 106.7535061, 8 | }); 9 | 10 | // when the 'start travel' button is clicked 11 | $("#start-travel").click(function () { 12 | $(this).fadeOut(); 13 | $("#instructions").before("
Instructions
"); 14 | map.travelRoute({ 15 | origin: [-6.5637928, 106.7535061], 16 | destination: [-6.5956157, 106.788236], 17 | travelMode: "driving", 18 | step: function (e) { 19 | $("#instructions").append( 20 | '
  • ' + 21 | e.instructions + 22 | "
  • " 23 | ); 24 | $("#instructions li:eq(" + e.step_number + ")") 25 | .delay(450 * e.step_number) 26 | .fadeIn(200, function () { 27 | map.setCenter(e.end_location.lat(), e.end_location.lng()); 28 | map.drawPolyline({ 29 | path: e.path, 30 | strokeColor: "#131540", 31 | strokeOpacity: 0.6, 32 | strokeWeight: 6, 33 | }); 34 | }); 35 | }, 36 | }); 37 | }); 38 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-draggable-marker.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var input_lat = $("#input-lat"), // latitude input text 4 | input_lng = $("#input-lng"), // longitude input text 5 | map = new GMaps({ 6 | // init map 7 | div: "#map", 8 | lat: -6.5637928, 9 | lng: 106.7535061, 10 | }); 11 | 12 | // add marker 13 | var marker = map.addMarker({ 14 | lat: -6.5637928, 15 | lng: 106.7535061, 16 | draggable: true, 17 | }); 18 | 19 | // when the map is clicked 20 | map.addListener("click", function (e) { 21 | var lat = e.latLng.lat(), 22 | lng = e.latLng.lng(); 23 | 24 | // move the marker position 25 | marker.setPosition({ 26 | lat: lat, 27 | lng: lng, 28 | }); 29 | update_position(); 30 | }); 31 | 32 | // when the marker is dragged 33 | marker.addListener("drag", function (e) { 34 | update_position(); 35 | }); 36 | 37 | // set the value to latitude and longitude input 38 | update_position(); 39 | function update_position() { 40 | var lat = marker.getPosition().lat(), 41 | lng = marker.getPosition().lng(); 42 | input_lat.val(lat); 43 | input_lng.val(lng); 44 | } 45 | 46 | // move the marker when the latitude and longitude inputs change in value 47 | $("#input-lat,#input-lng").blur(function () { 48 | var lat = parseInt(input_lat.val()), 49 | lng = parseInt(input_lng.val()); 50 | 51 | marker.setPosition({ 52 | lat: lat, 53 | lng: lng, 54 | }); 55 | map.setCenter({ 56 | lat: lat, 57 | lng: lng, 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-geocoding.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // initialize map 4 | var map = new GMaps({ 5 | div: "#map", 6 | lat: -6.5637928, 7 | lng: 106.7535061, 8 | }); 9 | 10 | // when the form is submitted 11 | $("#search-form").submit(function (e) { 12 | e.preventDefault(); 13 | 14 | // initialize map geocode 15 | GMaps.geocode({ 16 | address: $("#address").val(), 17 | callback: function (results, status) { 18 | if (status == "OK") { 19 | var latlng = results[0].geometry.location; 20 | map.setCenter(latlng.lat(), latlng.lng()); 21 | map.addMarker({ 22 | lat: latlng.lat(), 23 | lng: latlng.lng(), 24 | }); 25 | } 26 | }, 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-geolocation.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // initialize map 4 | var map = new GMaps({ 5 | div: "#map", 6 | lat: -6.5637928, 7 | lng: 106.7535061, 8 | }); 9 | // initialize map geolocation 10 | GMaps.geolocate({ 11 | // when geolocation is allowed by user 12 | success: function (position) { 13 | // set center map according to user position 14 | map.setCenter(position.coords.latitude, position.coords.longitude); 15 | // add a marker to the map 16 | map.addMarker({ 17 | lat: position.coords.latitude, 18 | lng: position.coords.longitude, 19 | title: "You", 20 | }); 21 | }, 22 | // when geolocation is blocked by the user 23 | error: function (error) { 24 | toastr.error("Geolocation failed: " + error.message); 25 | }, 26 | // when the user's browser does not support 27 | not_supported: function () { 28 | toastr.error("Your browser does not support geolocation"); 29 | }, 30 | }); 31 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-marker.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // initialize map 4 | var map = new GMaps({ 5 | div: "#map", 6 | lat: -6.5637928, 7 | lng: 106.7535061, 8 | }); 9 | // Added a marker to the map 10 | map.addMarker({ 11 | lat: -6.5637928, 12 | lng: 106.7535061, 13 | title: "Multinity", 14 | infoWindow: { 15 | content: 16 | '
    Multinity

    Jl. HM. Syarifudin, Bubulak, Bogor Bar.,
    Kota Bogor, Jawa Barat 16115

    Website

    ', 17 | }, 18 | }); 19 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-multiple-marker.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // initialize map 4 | var map = new GMaps({ 5 | div: "#map", 6 | lat: -6.8665409, 7 | lng: 106.4836553, 8 | zoom: 8, 9 | }); 10 | // Added markers to the map 11 | map.addMarker({ 12 | lat: -6.5637928, 13 | lng: 106.7535061, 14 | title: "Multinity", 15 | infoWindow: { 16 | content: 17 | '
    Multinity

    Jl. HM. Syarifudin, Bubulak, Bogor Bar.,
    Kota Bogor, Jawa Barat 16115

    Website

    ', 18 | }, 19 | }); 20 | map.addMarker({ 21 | lat: -6.1325841, 22 | lng: 106.8116507, 23 | title: "Procyon Logikreasi Indonesia", 24 | infoWindow: { 25 | content: 26 | '
    Procyon Logikreasi Indonesia

    Jl. Kali Besar Tim. No.29C, RT.7/RW.7, Pinangsia, Tamansari, Kota Jakarta Barat, Daerah Khusus Ibukota Jakarta 11110

    Website

    ', 27 | }, 28 | }); 29 | map.addMarker({ 30 | lat: -6.4462693, 31 | lng: 106.7654318, 32 | title: "Sigma ID", 33 | infoWindow: { 34 | content: 35 | '
    Sigma ID

    Jl.Setapak No.5, Citayam, Tajur Halang, Bogor, Jawa Barat 16320

    Website

    ', 36 | }, 37 | }); 38 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-route.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // initialize map 4 | var map = new GMaps({ 5 | div: "#map", 6 | lat: -6.5637928, 7 | lng: 106.7535061, 8 | zoom: 13, 9 | }); 10 | 11 | // draw route between 'origin' to 'destination' 12 | map.drawRoute({ 13 | origin: [-6.5637928, 106.7535061], 14 | destination: [-6.5956157, 106.788236], 15 | travelMode: "driving", 16 | strokeColor: "#131540", 17 | strokeOpacity: 0.6, 18 | strokeWeight: 6, 19 | }); 20 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/gmaps-simple.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var simple_map = new GMaps({ 4 | div: "#simple-map", 5 | lat: -6.5637928, 6 | lng: 106.7535061, 7 | }); 8 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-calendar.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#myEvent").fullCalendar({ 4 | height: "auto", 5 | header: { 6 | left: "prev,next today", 7 | center: "title", 8 | right: "month,agendaWeek,agendaDay,listWeek", 9 | }, 10 | editable: true, 11 | events: [ 12 | { 13 | title: "Conference", 14 | start: "2018-01-9", 15 | end: "2018-01-11", 16 | backgroundColor: "#fff", 17 | borderColor: "#fff", 18 | textColor: "#000", 19 | }, 20 | { 21 | title: "John's Birthday", 22 | start: "2018-01-14", 23 | backgroundColor: "#007bff", 24 | borderColor: "#007bff", 25 | textColor: "#fff", 26 | }, 27 | { 28 | title: "Reporting", 29 | start: "2018-01-10T11:30:00", 30 | backgroundColor: "#f56954", 31 | borderColor: "#f56954", 32 | textColor: "#fff", 33 | }, 34 | { 35 | title: "Starting New Project", 36 | start: "2018-01-11", 37 | backgroundColor: "#ffc107", 38 | borderColor: "#ffc107", 39 | textColor: "#fff", 40 | }, 41 | { 42 | title: "Social Distortion Concert", 43 | start: "2018-01-24", 44 | end: "2018-01-27", 45 | backgroundColor: "#000", 46 | borderColor: "#000", 47 | textColor: "#fff", 48 | }, 49 | { 50 | title: "Lunch", 51 | start: "2018-01-24T13:15:00", 52 | backgroundColor: "#fff", 53 | borderColor: "#fff", 54 | textColor: "#000", 55 | }, 56 | { 57 | title: "Company Trip", 58 | start: "2018-01-28", 59 | end: "2018-01-31", 60 | backgroundColor: "#fff", 61 | borderColor: "#fff", 62 | textColor: "#000", 63 | }, 64 | ], 65 | }); 66 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-datatables.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("[data-checkboxes]").each(function () { 4 | var me = $(this), 5 | group = me.data("checkboxes"), 6 | role = me.data("checkbox-role"); 7 | 8 | me.change(function () { 9 | var all = $( 10 | '[data-checkboxes="' + 11 | group + 12 | '"]:not([data-checkbox-role="dad"])' 13 | ), 14 | checked = $( 15 | '[data-checkboxes="' + 16 | group + 17 | '"]:not([data-checkbox-role="dad"]):checked' 18 | ), 19 | dad = $( 20 | '[data-checkboxes="' + group + '"][data-checkbox-role="dad"]' 21 | ), 22 | total = all.length, 23 | checked_length = checked.length; 24 | 25 | if (role == "dad") { 26 | if (me.is(":checked")) { 27 | all.prop("checked", true); 28 | } else { 29 | all.prop("checked", false); 30 | } 31 | } else { 32 | if (checked_length >= total) { 33 | dad.prop("checked", true); 34 | } else { 35 | dad.prop("checked", false); 36 | } 37 | } 38 | }); 39 | }); 40 | 41 | $("#table-1").dataTable({ 42 | columnDefs: [{ sortable: false, targets: [2, 3] }], 43 | }); 44 | $("#table-2").dataTable({ 45 | columnDefs: [{ sortable: false, targets: [0, 2, 3] }], 46 | }); 47 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-ion-icons.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#icons li").each(function () { 4 | $(this).append( 5 | '
    ' + $(this).attr("class") + "
    " 6 | ); 7 | }); 8 | $("#icons li").click(function () { 9 | $(".icon-name").fadeOut(); 10 | $(this).find(".icon-name").fadeIn(); 11 | }); 12 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-slider.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#slider1,#slider2").owlCarousel({ 4 | items: 1, 5 | nav: true, 6 | navText: [ 7 | '', 8 | '', 9 | ], 10 | }); 11 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-sparkline.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var sparkline_values = [ 4 | 110, 147, 324, 108, 235, 498, 346, 525, 382, 214, 427, 424, 239, 236, 5 | 475, 569, 6 | ], 7 | sparkline_values_bar = [ 8 | 10, 7, 4, 8, 5, 8, 6, 5, 2, 4, 7, 4, 9, 10, 7, 4, 8, 5, 8, 6, 5, 4, 9 | ], 10 | sparkline_pie = [30, 20, 10]; 11 | 12 | $(".sparkline-inline").sparkline(sparkline_values, { 13 | type: "line", 14 | width: "100%", 15 | height: "200", 16 | lineWidth: 3, 17 | lineColor: "rgba(63,82,227,.1)", 18 | fillColor: "rgba(63,82,227,.4)", 19 | highlightSpotColor: "rgba(63,82,227,.1)", 20 | highlightLineColor: "rgba(63,82,227,.1)", 21 | spotRadius: 3, 22 | }); 23 | 24 | $(".sparkline-line").sparkline(sparkline_values, { 25 | type: "line", 26 | width: "100%", 27 | height: "200", 28 | lineWidth: 3, 29 | lineColor: "rgba(63,82,227,.6)", 30 | fillColor: "transparent", 31 | highlightSpotColor: "rgba(63,82,227,.1)", 32 | highlightLineColor: "rgba(63,82,227,.1)", 33 | spotRadius: 3, 34 | }); 35 | 36 | $(".sparkline-bar").sparkline(sparkline_values_bar, { 37 | type: "bar", 38 | width: "100%", 39 | height: "200", 40 | barColor: "rgb(63,82,227)", 41 | barWidth: 20, 42 | }); 43 | 44 | $(".sparkline-pie").sparkline(sparkline_pie, { 45 | type: "pie", 46 | width: "auto", 47 | height: "200", 48 | barWidth: 20, 49 | }); 50 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-sweetalert.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#swal-1").click(function () { 4 | swal("Hello"); 5 | }); 6 | 7 | $("#swal-2").click(function () { 8 | swal("Good Job", "You clicked the button!", "success"); 9 | }); 10 | 11 | $("#swal-3").click(function () { 12 | swal("Good Job", "You clicked the button!", "warning"); 13 | }); 14 | 15 | $("#swal-4").click(function () { 16 | swal("Good Job", "You clicked the button!", "info"); 17 | }); 18 | 19 | $("#swal-5").click(function () { 20 | swal("Good Job", "You clicked the button!", "error"); 21 | }); 22 | 23 | $("#swal-6").click(function () { 24 | swal({ 25 | title: "Are you sure?", 26 | text: "Once deleted, you will not be able to recover this imaginary file!", 27 | icon: "warning", 28 | buttons: true, 29 | dangerMode: true, 30 | }).then((willDelete) => { 31 | if (willDelete) { 32 | swal("Poof! Your imaginary file has been deleted!", { 33 | icon: "success", 34 | }); 35 | } else { 36 | swal("Your imaginary file is safe!"); 37 | } 38 | }); 39 | }); 40 | 41 | $("#swal-7").click(function () { 42 | swal({ 43 | title: "What is your name?", 44 | content: { 45 | element: "input", 46 | attributes: { 47 | placeholder: "Type your name", 48 | type: "text", 49 | }, 50 | }, 51 | }).then((data) => { 52 | swal("Hello, " + data + "!"); 53 | }); 54 | }); 55 | 56 | $("#swal-8").click(function () { 57 | swal("This modal will disappear soon!", { 58 | buttons: false, 59 | timer: 3000, 60 | }); 61 | }); 62 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-toastr.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#toastr-1").click(function () { 4 | iziToast.info({ 5 | title: "Hello, world!", 6 | message: "This awesome plugin is made iziToast toastr", 7 | position: "topRight", 8 | }); 9 | }); 10 | 11 | $("#toastr-2").click(function () { 12 | iziToast.success({ 13 | title: "Hello, world!", 14 | message: "This awesome plugin is made by iziToast", 15 | position: "topRight", 16 | }); 17 | }); 18 | 19 | $("#toastr-3").click(function () { 20 | iziToast.warning({ 21 | title: "Hello, world!", 22 | message: "This awesome plugin is made by iziToast", 23 | position: "topRight", 24 | }); 25 | }); 26 | 27 | $("#toastr-4").click(function () { 28 | iziToast.error({ 29 | title: "Hello, world!", 30 | message: "This awesome plugin is made by iziToast", 31 | position: "topRight", 32 | }); 33 | }); 34 | 35 | $("#toastr-5").click(function () { 36 | iziToast.show({ 37 | title: "Hello, world!", 38 | message: "This awesome plugin is made by iziToast", 39 | position: "bottomRight", 40 | }); 41 | }); 42 | 43 | $("#toastr-6").click(function () { 44 | iziToast.show({ 45 | title: "Hello, world!", 46 | message: "This awesome plugin is made by iziToast", 47 | position: "bottomCenter", 48 | }); 49 | }); 50 | 51 | $("#toastr-7").click(function () { 52 | iziToast.show({ 53 | title: "Hello, world!", 54 | message: "This awesome plugin is made by iziToast", 55 | position: "bottomLeft", 56 | }); 57 | }); 58 | 59 | $("#toastr-8").click(function () { 60 | iziToast.show({ 61 | title: "Hello, world!", 62 | message: "This awesome plugin is made by iziToast", 63 | position: "topCenter", 64 | }); 65 | }); 66 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/modules-vector-map.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | $("#visitorMap").vectorMap({ 4 | map: "world_en", 5 | backgroundColor: "#ffffff", 6 | borderColor: "#f2f2f2", 7 | borderOpacity: 0.8, 8 | borderWidth: 1, 9 | hoverColor: "#000", 10 | hoverOpacity: 0.8, 11 | color: "#ddd", 12 | normalizeFunction: "linear", 13 | selectedRegions: false, 14 | showTooltip: true, 15 | pins: { 16 | id: '
    ', 17 | my: '
    ', 18 | th: '
    ', 19 | sy: '
    ', 20 | eg: '
    ', 21 | ae: '
    ', 22 | nz: '
    ', 23 | tl: '
    ', 24 | ng: '
    ', 25 | si: '
    ', 26 | pa: '
    ', 27 | au: '
    ', 28 | ca: '
    ', 29 | tr: '
    ', 30 | }, 31 | onRegionClick: function (element, code, region) { 32 | var opts = { 33 | title: "Choosed", 34 | message: 35 | 'You clicked "' + 36 | region + 37 | '" which has the code: ' + 38 | code.toUpperCase(), 39 | }; 40 | 41 | iziToast.info(opts); 42 | }, 43 | }); 44 | $("#visitorMap2").vectorMap({ 45 | map: "world_en", 46 | backgroundColor: "#ffffff", 47 | borderColor: "#f2f2f2", 48 | borderOpacity: 0.8, 49 | borderWidth: 1, 50 | hoverColor: "#000", 51 | hoverOpacity: 0.8, 52 | color: "#ddd", 53 | normalizeFunction: "linear", 54 | selectedRegions: false, 55 | showTooltip: true, 56 | onRegionClick: function (element, code, region) { 57 | var message = 58 | 'You clicked "' + 59 | region + 60 | '" which has the code: ' + 61 | code.toUpperCase(); 62 | 63 | $("#flag-icon").removeClass(function (index, className) { 64 | return (className.match(/(^|\s)flag-icon-\S+/g) || []).join(" "); 65 | }); 66 | $("#flag-icon").addClass("flag-icon-" + code); 67 | }, 68 | }); 69 | $("#visitorMap3").vectorMap({ 70 | map: "indonesia_id", 71 | backgroundColor: "#ffffff", 72 | borderColor: "#f2f2f2", 73 | borderOpacity: 0.8, 74 | borderWidth: 1, 75 | hoverColor: "#000", 76 | hoverOpacity: 0.8, 77 | color: "#ddd", 78 | normalizeFunction: "linear", 79 | selectedRegions: false, 80 | showTooltip: true, 81 | }); 82 | -------------------------------------------------------------------------------- /frontend/src/assets/stisla/js/page/utilities-contact.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // initialize map 4 | var map = new GMaps({ 5 | div: "#map", 6 | lat: -6.5637928, 7 | lng: 106.7535061, 8 | zoomControl: false, 9 | fullscreenControl: false, 10 | mapTypeControl: true, 11 | mapTypeControlOptions: { 12 | mapTypeIds: [], 13 | }, 14 | }); 15 | // Added a overlay to the map 16 | map.drawOverlay({ 17 | lat: -6.5637928, 18 | lng: 106.7535061, 19 | content: 20 | '
    Multinity

    Jl. HM. Syarifudin, Bubulak, Bogor Bar.,
    Kota Bogor, Jawa Barat 16115

    Website

    ', 21 | }); 22 | -------------------------------------------------------------------------------- /frontend/src/components/Case.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function Case({ children }) { 4 | return ( 5 |
    6 |
    {children}
    7 |
    8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function Footer() { 4 | return ( 5 |
    6 |
    7 | Copyright © 2023
    Re-created 8 | By 9 | Fahmi Ibrahim 10 |
    11 |
    0.1.8
    12 |
    13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/NavLink.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link } from "react-router-dom"; 3 | 4 | export default function NavLink({ href, children }) { 5 | return ( 6 | 7 | {children} 8 | 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/config/appConfig.js: -------------------------------------------------------------------------------- 1 | const appConfig = { 2 | debounceTimeout: 750, 3 | expirationTime: 60 * 60 * 1000, // set 1 hours 4 | baseURL: "http://127.0.0.1:8000", 5 | baseurlAPI: "http://127.0.0.1:8000/api", 6 | }; 7 | 8 | export default appConfig; 9 | -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer components { 6 | .show-entries { 7 | @apply tw-ml-4 tw-flex tw-justify-center lg:tw-justify-start; 8 | } 9 | 10 | .search-column { 11 | @apply tw-mb-5 tw-mt-3 tw-flex tw-justify-center lg:tw-mt-[-45px] lg:tw-justify-start; 12 | } 13 | 14 | .btn-modal { 15 | @apply tw-fixed tw-bottom-12 tw-right-7 tw-z-40 tw-h-14 tw-w-14 tw-rounded-full tw-bg-blue-500 tw-text-white tw-shadow-2xl hover:tw-border-blue-600 hover:tw-bg-blue-900; 16 | } 17 | } 18 | 19 | @layer utilities { 20 | body { 21 | @apply tw-tracking-wider; 22 | } 23 | 24 | .section-header > h1 { 25 | @apply tw-tracking-wider; 26 | } 27 | 28 | table { 29 | @apply tw-w-full tw-table-fixed; 30 | } 31 | 32 | table > thead > tr { 33 | @apply tw-text-xs tw-uppercase tw-tracking-widest; 34 | } 35 | 36 | table > tbody > tr { 37 | @apply tw-text-gray-700; 38 | } 39 | 40 | table > thead > tr > th { 41 | @apply tw-bg-gray-100 tw-p-4 tw-text-gray-600; 42 | } 43 | 44 | table > tbody > tr > td { 45 | @apply tw-border-b tw-border-gray-100 tw-p-4; 46 | } 47 | 48 | table > tbody { 49 | @apply tw-text-black; 50 | } 51 | 52 | .card-body > h3 { 53 | @apply tw-mb-5 tw-ml-4 tw-text-base tw-text-black; 54 | } 55 | 56 | .show-entries > p.show-entries-show { 57 | @apply tw-mr-1 tw-mt-1 tw-text-gray-800; 58 | } 59 | 60 | .show-entries > p.show-entries-entries { 61 | @apply tw-ml-1 tw-mt-1 tw-text-gray-800; 62 | } 63 | 64 | .show-entries > select { 65 | @apply tw-rounded-lg tw-border tw-border-gray-200; 66 | } 67 | 68 | .search-column > p { 69 | @apply tw-ml-0 tw-mr-1 tw-mt-1 tw-text-gray-800 lg:tw-ml-auto; 70 | } 71 | 72 | .search-column > input { 73 | @apply tw-mr-4 tw-w-2/3 tw-rounded-lg tw-border tw-border-gray-200 lg:tw-w-1/4; 74 | } 75 | 76 | .main-content { 77 | @apply tw-px-0; 78 | } 79 | 80 | .card { 81 | @apply tw-rounded-none tw-shadow-md tw-shadow-gray-300 lg:tw-rounded-lg; 82 | } 83 | 84 | .section-body { 85 | @apply tw-mt-[-10px]; 86 | } 87 | 88 | input.form-control { 89 | @apply tw-rounded-lg tw-border tw-border-gray-200 tw-text-sm; 90 | } 91 | 92 | select.form-control { 93 | @apply tw-rounded-lg; 94 | } 95 | 96 | textarea.form-control { 97 | @apply tw-rounded-lg; 98 | } 99 | 100 | .navbar.navbar-expand-lg.main-navbar { 101 | @apply tw-px-0 lg:tw-px-5; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /frontend/src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import { BrowserRouter } from "react-router-dom"; 4 | import App from "./App"; 5 | import "./index.css"; 6 | 7 | ReactDOM.createRoot(document.getElementById("app")).render( 8 | 9 | 10 | 11 | 12 | 13 | ); 14 | -------------------------------------------------------------------------------- /frontend/src/pages/AdvancedFeature.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Case from "../components/Case"; 3 | import { useEffect } from "react"; 4 | 5 | export default function AdvancedFeature() { 6 | useEffect(() => { 7 | document.title = "Advanced Feature"; 8 | }, []); 9 | 10 | return ( 11 | 12 |
    13 |

    Advanced Feature

    14 |
    15 | 16 |
    17 |
    18 |
    19 |

    Tabel Advanced Feature

    20 |

    21 | Lorem ipsum dolor, sit amet consectetur adipisicing 22 | elit. Tenetur at asperiores earum officiis 23 | reiciendis necessitatibus eos! Nam harum tempore 24 | molestias aliquam, qui excepturi similique expedita 25 | vitae perferendis voluptatum laudantium vero 26 | deleniti laboriosam assumenda impedit repellendus 27 | eum, commodi totam! Molestiae ducimus placeat totam 28 | nesciunt, perspiciatis dolor mollitia ut saepe cum 29 | sunt? 30 |

    31 |
    32 |
    33 |
    34 |
    35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /frontend/src/pages/Auth/Session.js: -------------------------------------------------------------------------------- 1 | import appConfig from "../../config/appConfig"; 2 | import CryptoJS from "crypto-js"; 3 | 4 | export function setTokenWithExpiration(key, token) { 5 | const now = new Date(); 6 | const expirationTime = now.getTime() + appConfig.expirationTime; 7 | 8 | const keyStr = "sangat-aman-12345"; 9 | const iv = CryptoJS.lib.WordArray.random(16); 10 | const encryptedToken = CryptoJS.AES.encrypt(token, keyStr, { 11 | iv: iv, 12 | }).toString(); 13 | 14 | const item = encryptedToken + "|" + expirationTime + "|" + iv.toString(); 15 | localStorage.setItem(key, item); 16 | } 17 | 18 | export function getTokenWithExpiration(key) { 19 | const item = localStorage.getItem(key); 20 | 21 | if (!item) { 22 | return null; 23 | } 24 | 25 | const parts = item.split("|"); 26 | const encryptedToken = parts[0]; 27 | const expirationTime = parts[1]; 28 | const iv = parts[2]; 29 | 30 | const keyStr = "sangat-aman-12345"; 31 | const decryptedToken = CryptoJS.AES.decrypt(encryptedToken, keyStr, { 32 | iv: CryptoJS.enc.Hex.parse(iv), 33 | }).toString(CryptoJS.enc.Utf8); 34 | 35 | if (parseInt(expirationTime) < new Date().getTime()) { 36 | localStorage.removeItem(key); 37 | return null; 38 | } 39 | 40 | return decryptedToken; 41 | } 42 | 43 | export function getTokenExpirationTime(key) { 44 | const item = localStorage.getItem(key); 45 | if (!item) { 46 | return null; 47 | } 48 | const [_, expirationTime] = item.split("|"); 49 | const now = new Date(); 50 | const remainingSeconds = Math.round( 51 | (expirationTime - now.getTime()) / 1000 52 | ); 53 | return remainingSeconds > 0 ? remainingSeconds : null; 54 | } 55 | -------------------------------------------------------------------------------- /frontend/src/pages/Dashboard.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Case from "../components/Case"; 3 | import { useEffect } from "react"; 4 | 5 | export default function Dashboard() { 6 | useEffect(() => { 7 | document.title = "Dashboard"; 8 | }); 9 | 10 | return ( 11 | 12 |
    13 |

    Dashboard

    14 |
    15 | 16 |
    17 |
    18 |
    19 |

    Tabel Dashboard

    20 |

    21 | Lorem ipsum dolor, sit amet consectetur adipisicing 22 | elit. Tenetur at asperiores earum officiis 23 | reiciendis necessitatibus eos! Nam harum tempore 24 | molestias aliquam, qui excepturi similique expedita 25 | vitae perferendis voluptatum laudantium vero 26 | deleniti laboriosam assumenda impedit repellendus 27 | eum, commodi totam! Molestiae ducimus placeat totam 28 | nesciunt, perspiciatis dolor mollitia ut saepe cum 29 | sunt? 30 |

    31 |
    32 |
    33 |
    34 |
    35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /frontend/src/pages/Error/403.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link } from "react-router-dom"; 3 | 4 | export default function Error403() { 5 | return ( 6 | <> 7 |
    8 |
    9 |
    10 |
    11 |
    12 |

    403

    13 |
    14 | You do not have access to this page. 15 |
    16 | 21 |
    22 |
    23 | 26 |
    27 |
    28 |
    29 | 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /frontend/src/pages/Error/404.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link } from "react-router-dom"; 3 | 4 | export default function Error404() { 5 | return ( 6 | <> 7 |
    8 |
    9 |
    10 |
    11 |
    12 |

    404

    13 |
    14 | Page not found. 15 |
    16 | 21 |
    22 |
    23 | 26 |
    27 |
    28 |
    29 | 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/AuthLayout.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function AuthLayout({ children }) { 4 | return ( 5 | <> 6 |
    7 |
    {children}
    8 |
    9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/Components/AddButton.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | 3 | export default function AddButton({ handleAdd }) { 4 | return ( 5 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/Components/InputValidation.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function InputValidation({ 4 | label, 5 | name, 6 | type, 7 | value, 8 | onChange, 9 | error, 10 | }) { 11 | return ( 12 |
    13 | 14 | 22 | {error &&
    {error}
    } 23 |
    24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/Components/ModalFooter.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | 3 | export default function ModalFooter() { 4 | return ( 5 |
    6 | 13 | 16 |
    17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/Components/ModalHeader.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | 3 | export default function ModalHeader({ isEditing }) { 4 | return ( 5 |
    6 |
    7 | {isEditing ? "Edit Data" : "Add Data"} 8 |
    9 | 17 |
    18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/Components/Pagination.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | 3 | export default function Pagination({ 4 | currentPage, 5 | showing, 6 | totalRows, 7 | totalPages, 8 | handlePageChange, 9 | }) { 10 | return ( 11 |
    12 |
    13 | Showing {(currentPage - 1) * showing + 1} to{" "} 14 | {Math.min(currentPage * showing, totalRows)} of {totalRows}{" "} 15 | results 16 |
    17 |
    18 |
      19 |
    • 24 | 31 |
    • 32 | {Array.from({ length: totalPages }, (_, i) => ( 33 |
    • 39 | 45 |
    • 46 | ))} 47 |
    • 52 | 59 |
    • 60 |
    61 |
    62 |
    63 | ); 64 | } 65 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/Components/SearchEntries.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | 3 | export default function SearchEntries({ 4 | showing, 5 | handleShow, 6 | searchTerm, 7 | handleSearch, 8 | }) { 9 | return ( 10 | <> 11 |
    12 |

    Show

    13 | 26 |

    Entries

    27 |
    28 |
    29 |

    Search:

    30 | 38 |
    39 | 40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/Components/TextareaValidation.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function TextAreaValidation({ 4 | label, 5 | name, 6 | value, 7 | onChange, 8 | error, 9 | }) { 10 | return ( 11 |
    12 | 13 | 21 | {error &&
    {error}
    } 22 |
    23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/pages/Layout/MainLayout.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Footer from "../../components/Footer"; 3 | import Navigation from "../../components/Navigation"; 4 | 5 | export default function MainLayout({ children }) { 6 | return ( 7 | <> 8 |
    9 |
    10 | 11 | {children} 12 |
    14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /frontend/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | important: true, 4 | prefix: "tw-", 5 | content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], 6 | theme: { 7 | extend: {}, 8 | }, 9 | plugins: [], 10 | }; 11 | -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | server: { 7 | host: true, 8 | }, 9 | plugins: [react()], 10 | }); 11 | --------------------------------------------------------------------------------