diff --git a/.env.example b/.env.example index 38a3db7..efe23cd 100644 --- a/.env.example +++ b/.env.example @@ -3,8 +3,8 @@ APP_ENV=local APP_KEY= APP_DEBUG=true APP_DEPLOYED=false -APP_TIMEZONE=UTC -APP_URL=http://xshop.test +APP_TIMEZONE=ASIA/TEHRAN +APP_URL=http://127.0.0.1:8000 APP_LOCALE=en APP_FALLBACK_LOCALE=en @@ -24,7 +24,7 @@ LOG_LEVEL=debug #DB_CONNECTION=sqlite #DB_HOST=127.0.0.1 #DB_PORT=3306 -#DB_DATABASE=/home/freeman/Projects/xstack/xshop2/storage/logs/open.db +#DB_DATABASE=/project-directory/xshop/storage/logs/open.db #DB_USERNAME=root #DB_PASSWORD= diff --git a/.gitignore b/.gitignore index 7fe978f..c4f1dd0 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ yarn-error.log /.fleet /.idea /.vscode +package-lock.json diff --git a/README-fa.md b/README-fa.md index f15a46a..f709b44 100644 --- a/README-fa.md +++ b/README-fa.md @@ -73,6 +73,15 @@ php artisan seeding:image Product digital ``` </div> +یا برای همه مدلها یکجا از دستور زیر استفاده کنید: + +<div dir="ltr"> + +```bash +php artisan seeding:all digital +``` +</div> + > شما ابتدا باید مدل را نوشته و سپس فولدر مورد نظر برای تصاویر را وارد کنید[bag, clothe, digital, sport, posts, makeup] > همچنین میتوانید یک پوشه درخواه پر از تصاویر jpg دلخواه را در آن پر کنید diff --git a/README.md b/README.md index 86dfa5c..e786f8d 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,18 @@ php artisan key:generate php artisan serv # to develop front-end +npm i +php artisan client +npm install @rollup/rollup-win32-x64-msvc # just for windows if the below line dose not work +npm run dev + +# or with yarn -npm install -g yarn yarn install php artisan client +yarn add @rollup/rollup-win32-x64-msvc # just for windows if the below line dose not work yarn dev + ``` > [!TIP] @@ -55,9 +62,17 @@ php artisan seeding:prepare ``` - nor copy your image folder to `database/seeders/images/` - then: Seeding image for models: [Group, Category, Post, Product, Slider] + ```bash php artisan seeding:image Product digital ``` + +Or to seed all models: + +```bash +php artisan seeding:all digital +``` + > First parameter is Model, Second is image seeder directory available [bag, clothe, digital, sport, posts, makeup] > You can create your directory and put your image into new directory then use image seeder diff --git a/app/Console/Commands/SeedImageAll.php b/app/Console/Commands/SeedImageAll.php new file mode 100644 index 0000000..2cfe38a --- /dev/null +++ b/app/Console/Commands/SeedImageAll.php @@ -0,0 +1,48 @@ +<?php + +namespace App\Console\Commands; + +use Illuminate\Console\Command; + +class SeedImageAll extends Command +{ + + + public $models = ['Category', 'Group', 'Slider', 'Post', 'Product']; + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'seeding:all {directory}'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Command description'; + + /** + * Execute the console command. + */ + public function handle() + { + // + foreach ($this->models as $model) { + // Call the seeder command + $exitCode = \Artisan::call('seeding:image', ['directory' => $this->argument('directory'), 'model' => $model]); + + // Get the output + $output = \Artisan::output(); + + // Handle the exit code and output as needed + if ($exitCode === 0) { + $this->info( "Seeding was successful: [$model] \n"); + } else { + $this->error("Seeding failed with exit code {$exitCode}:\n"); + } + $this->info( $output); + } + } +} diff --git a/app/Console/Commands/SeedingImage.php b/app/Console/Commands/SeedingImage.php index d478c4f..6c77a17 100644 --- a/app/Console/Commands/SeedingImage.php +++ b/app/Console/Commands/SeedingImage.php @@ -56,6 +56,8 @@ class SeedingImage extends Command } break; case 'Category': + $svgs = \File::files(__DIR__ . '/../../../database/seeders/images/svg'); + foreach (Category::all() as $item) { $this->info('Category: ' . $item->name . ' adding image...'); shuffle($images); @@ -75,6 +77,9 @@ class SeedingImage extends Command ->optimize() ->format('webp'); $i->save(storage_path() . '/app/public/categories/optimized-'. $item->bg); + shuffle($svgs); + \File::copy($svgs[0]->getRealPath(),storage_path().'/app/public/categories/' . $svgs[0]->getFilename()); + $item->svg = $svgs[0]->getFilename(); $item->save(); } break; diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 7b52b21..8b8ca24 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -1437,7 +1437,7 @@ function cacheNumber() * @param $asc * @return Category[]|\LaravelIdea\Helper\App\Models\_IH_Category_C */ -function getMainCategory($limit=4,$orderBy = 'id', $asc = 'ASC') +function getMainCategory($limit=4,$orderBy = 'sort', $asc = 'ASC') { return \App\Models\Category::whereNull('parent_id')->limit($limit)->orderBy($orderBy,$asc)->get(); } diff --git a/app/Http/Controllers/Admin/AreaController.php b/app/Http/Controllers/Admin/AreaController.php index b1868a4..0367d89 100644 --- a/app/Http/Controllers/Admin/AreaController.php +++ b/app/Http/Controllers/Admin/AreaController.php @@ -29,11 +29,12 @@ class AreaController extends Controller if (File::exists(resource_path() . '/views/segments/' . $seg)) { $dirs = File::directories(resource_path() . '/views/segments/' . $seg); foreach ($dirs as $dir) { - $temp = explode('/', $dir); + $tmp = str_replace(DIRECTORY_SEPARATOR,'/',$dir); + $temp = explode('/', $tmp); $valids[] = [ 'segment' => $temp[count($temp) - 2], 'part' => $temp[count($temp) - 1], - 'data' => json_decode(file_get_contents($dir . '/' . $temp[count($temp) - 1] . '.json'), true) + 'data' => json_decode(file_get_contents($dir . DIRECTORY_SEPARATOR. $temp[count($temp) - 1] . '.json'), true) ]; } } @@ -67,11 +68,12 @@ class AreaController extends Controller if (File::exists(resource_path() . '/views/segments/' . $seg)) { $dirs = File::directories(resource_path() . '/views/segments/' . $seg); foreach ($dirs as $dir) { - $temp = explode('/', $dir); + $tmp = str_replace(DIRECTORY_SEPARATOR,'/',$dir); + $temp = explode('/', $tmp); $valids[] = [ 'segment' => $temp[count($temp) - 2], 'part' => $temp[count($temp) - 1], - 'data' => json_decode(file_get_contents($dir . '/' . $temp[count($temp) - 1] . '.json'), true) + 'data' => json_decode(file_get_contents($dir . DIRECTORY_SEPARATOR. $temp[count($temp) - 1] . '.json'), true) ]; } } diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index fa74117..e63a15e 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -96,7 +96,8 @@ class ClientController extends Controller __('Video clips') => clipsUrl(), $clip->title => null, ]; - return view('client.default-list', compact('area', 'clip', 'title', 'subtitle', 'breadcrumb')); + $model = $clip; + return view('client.default-list', compact('area', 'clip', 'title', 'subtitle', 'breadcrumb','model')); } public function gallery($slug) @@ -179,7 +180,8 @@ class ClientController extends Controller __('Attachments') => attachmentsUrl(), $attachment->title => null, ]; - return view('client.default-list', compact('area', 'attachment', 'title', 'subtitle', 'breadcrumb')); + $model = $attachment; + return view('client.default-list', compact('area', 'attachment', 'title', 'subtitle', 'breadcrumb','model')); } public function tag($slug) @@ -225,7 +227,9 @@ class ClientController extends Controller } } - $comment->parent_id = $request->input('parent_id', null); + if ($request->input('parent_id') != '') { + $comment->parent_id = $request->input('parent_id', null); + } $comment->body = $request->input('message'); $comment->commentable_type = $request->input('commentable_type'); $comment->commentable_id = $request->input('commentable_id'); diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 03c9bcb..3185b13 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -13,7 +13,8 @@ class Setting extends Model public $translatable = ['value']; public static $settingTypes = ['TEXT', 'NUMBER', 'LONGTEXT', 'CODE', 'EDITOR', - 'CATEGORY', 'GROUP', 'CHECKBOX', 'FILE', 'COLOR', 'SELECT', 'MENU', 'LOCATION', 'ICON']; + 'CATEGORY', 'GROUP', 'CHECKBOX', 'FILE', 'COLOR', 'SELECT', 'MENU', 'LOCATION', + 'ICON','DATE','DATETIME','TIME']; public function getData() { diff --git a/composer.json b/composer.json index 7cc67c9..04f8e99 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "require": { "php": "^8.2", "ext-dom": "*", + "ext-zip": "*", "carlos-meneses/laravel-mpdf": "^2.1", "chillerlan/php-qrcode": "^5.0", "dpsoft/mellat": "^1.1", diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 73817ae..0000000 --- a/package-lock.json +++ /dev/null @@ -1,931 +0,0 @@ -{ - "name": "xshop2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "license": "GPL-3.0-or-later", - "dependencies": { - "bs5-lightbox": "^1.8.3", - "chart.js": "^4.4.3", - "leaflet": "^1.9.4", - "remixicon": "^4.3.0", - "sortablejs": "^1.15.2", - "three": "0.150.0", - "tiny-slider": "^2.9.4", - "vazir-xui": "^1.0.0", - "vazirmatn": "^33.0.3", - "vue-toast-notification": "^3.1.2", - "vuex": "^4.0.2" - }, - "devDependencies": { - "@popperjs/core": "^2.11.6", - "@vitejs/plugin-vue": "^4.5.0", - "axios": "^1.6.4", - "bootstrap": "^5.2.3", - "laravel-vite-plugin": "^1.0", - "sass": "^1.56.1", - "vite": "^5.0", - "vue": "^3.2.37" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", - "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", - "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", - "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.0.0 || ^5.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.26.tgz", - "integrity": "sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.26", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.26.tgz", - "integrity": "sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.4.26", - "@vue/shared": "3.4.26" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.26.tgz", - "integrity": "sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/compiler-core": "3.4.26", - "@vue/compiler-dom": "3.4.26", - "@vue/compiler-ssr": "3.4.26", - "@vue/shared": "3.4.26", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.38", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.26.tgz", - "integrity": "sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.4.26", - "@vue/shared": "3.4.26" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", - "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" - }, - "node_modules/@vue/reactivity": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.26.tgz", - "integrity": "sha512-E/ynEAu/pw0yotJeLdvZEsp5Olmxt+9/WqzvKff0gE67tw73gmbx6tRkiagE/eH0UCubzSlGRebCbidB1CpqZQ==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.4.26" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.26.tgz", - "integrity": "sha512-AFJDLpZvhT4ujUgZSIL9pdNcO23qVFh7zWCsNdGQBw8ecLNxOOnPcK9wTTIYCmBJnuPHpukOwo62a2PPivihqw==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.4.26", - "@vue/shared": "3.4.26" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.26.tgz", - "integrity": "sha512-UftYA2hUXR2UOZD/Fc3IndZuCOOJgFxJsWOxDkhfVcwLbsfh2CdXE2tG4jWxBZuDAs9J9PzRTUFt1PgydEtItw==", - "license": "MIT", - "dependencies": { - "@vue/runtime-core": "3.4.26", - "@vue/shared": "3.4.26", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.26.tgz", - "integrity": "sha512-xoGAqSjYDPGAeRWxeoYwqJFD/gw7mpgzOvSxEmjWaFO2rE6qpbD1PC172YRpvKhrihkyHJkNDADFXTfCyVGhKw==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.4.26", - "@vue/shared": "3.4.26" - }, - "peerDependencies": { - "vue": "3.4.26" - } - }, - "node_modules/@vue/shared": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.26.tgz", - "integrity": "sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bootstrap": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bs5-lightbox": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/bs5-lightbox/-/bs5-lightbox-1.8.3.tgz", - "integrity": "sha512-fEIjplDAtWw17vi6dFeu7+Td52sk3qQ9FbOOVSpWM3nqio502vZKIA0Q0De9D9ah44BGd+zOKUsikRPlKE2hFg==", - "funding": { - "url": "https://github.com/sponsors/trvswgnr" - }, - "peerDependencies": { - "bootstrap": "^5.0.0" - } - }, - "node_modules/chart.js": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", - "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/laravel-vite-plugin": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.2.tgz", - "integrity": "sha512-Mcclml10khYzBVxDwJro8wnVDwD4i7XOSEMACQNnarvTnHjrjXLLL+B/Snif2wYAyElsOqagJZ7VAinb/2vF5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "vite-plugin-full-reload": "^1.1.0" - }, - "bin": { - "clean-orphaned-assets": "bin/clean.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0" - } - }, - "node_modules/leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" - }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/remixicon": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/remixicon/-/remixicon-4.3.0.tgz", - "integrity": "sha512-jRYQ37dTFSkJtvcxwTUAkIiXkYRvA9EDvVuXPNrmt2xf/VS//CRgFtsX2TAFBoQOhh9SDh7l6La4Xu12snEyxg==" - }, - "node_modules/rollup": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", - "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.17.2", - "@rollup/rollup-android-arm64": "4.17.2", - "@rollup/rollup-darwin-arm64": "4.17.2", - "@rollup/rollup-darwin-x64": "4.17.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", - "@rollup/rollup-linux-arm-musleabihf": "4.17.2", - "@rollup/rollup-linux-arm64-gnu": "4.17.2", - "@rollup/rollup-linux-arm64-musl": "4.17.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", - "@rollup/rollup-linux-riscv64-gnu": "4.17.2", - "@rollup/rollup-linux-s390x-gnu": "4.17.2", - "@rollup/rollup-linux-x64-gnu": "4.17.2", - "@rollup/rollup-linux-x64-musl": "4.17.2", - "@rollup/rollup-win32-arm64-msvc": "4.17.2", - "@rollup/rollup-win32-ia32-msvc": "4.17.2", - "@rollup/rollup-win32-x64-msvc": "4.17.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/sass": { - "version": "1.76.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.76.0.tgz", - "integrity": "sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sortablejs": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz", - "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==" - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/three": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.150.0.tgz", - "integrity": "sha512-12oqqBZom9fb5HtX3rD8qPVnamojuiN5Os7r0x8s3HQ+WHRwnEyzl2XU3aEKocsDkG++rkE9+HWzx77O59NXtw==", - "license": "MIT" - }, - "node_modules/tiny-slider": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/tiny-slider/-/tiny-slider-2.9.4.tgz", - "integrity": "sha512-LAs2kldWcY+BqCKw4kxd4CMx2RhWrHyEePEsymlOIISTlOVkjfK40sSD7ay73eKXBLg/UkluAZpcfCstimHXew==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/vazir-xui": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vazir-xui/-/vazir-xui-1.0.0.tgz", - "integrity": "sha512-kvQ+cJgDBVv05pyXvrZeK+f96btLYMzurFm6VPvZbbQ7NbvGrOnIbYZO4ifqPN6YpkPdusJNXeNArXmbGM9rzA==" - }, - "node_modules/vazirmatn": { - "version": "33.0.3", - "resolved": "https://registry.npmjs.org/vazirmatn/-/vazirmatn-33.0.3.tgz", - "integrity": "sha512-fbjNc0CMjazZpIegWzz9OHGzI1APFboT+x7ZecXlUCtDe/nkyx7gtCTZnWS/+eeXG7fbfXymCPKJI8EsnM3iqw==" - }, - "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-full-reload": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz", - "integrity": "sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "picomatch": "^2.3.1" - } - }, - "node_modules/vue": { - "version": "3.4.26", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.26.tgz", - "integrity": "sha512-bUIq/p+VB+0xrJubaemrfhk1/FiW9iX+pDV+62I/XJ6EkspAO9/DXEjbDFoe8pIfOZBqfk45i9BMc41ptP/uRg==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.4.26", - "@vue/compiler-sfc": "3.4.26", - "@vue/runtime-dom": "3.4.26", - "@vue/server-renderer": "3.4.26", - "@vue/shared": "3.4.26" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-toast-notification": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vue-toast-notification/-/vue-toast-notification-3.1.2.tgz", - "integrity": "sha512-oNRL/W9aaHoeScp+iTIW7k09vM16/+8aptp2maa+7qTB43JuxmAgKdXKFYtf+uvSNOYYq2BIWgLCeJ61pwom/A==", - "engines": { - "node": ">=12.15.0" - }, - "peerDependencies": { - "vue": "^3.0" - } - }, - "node_modules/vuex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", - "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", - "dependencies": { - "@vue/devtools-api": "^6.0.0-beta.11" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - } - } -} diff --git a/resources/js/app.js b/resources/js/app.js index 1b7a562..0a3180f 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -118,6 +118,10 @@ app.component('lat-lng', Latlng); import MenuItemInput from "./components/MenuItemInput.vue"; app.component('menu-item-input', MenuItemInput); + +import VueTimepicker from "./components/vueTimePicker.vue"; +app.component('vue-time-picker', VueTimepicker); + /** * The following block of code may be used to automatically register your * Vue components. It will recursively scan this directory for the Vue diff --git a/resources/js/components/vueDateTimePicker.vue b/resources/js/components/vueDateTimePicker.vue index d1ef618..787b635 100644 --- a/resources/js/components/vueDateTimePicker.vue +++ b/resources/js/components/vueDateTimePicker.vue @@ -395,9 +395,9 @@ export default { // get input class getClass: function () { if (this.err == true || (typeof this.err == 'String' && this.err.trim() == '1')) { - return 'form-control is-invalid ' + this.customClass; + return 'form-control is-invalid text-center' + this.customClass; } - return 'form-control ' + this.customClass; + return 'form-control text-center ' + this.customClass; }, /* * make array of this month days [gregorian] diff --git a/resources/lang/fa.json b/resources/lang/fa.json index a2021ce..eaaf2f3 100644 --- a/resources/lang/fa.json +++ b/resources/lang/fa.json @@ -345,6 +345,7 @@ "Needs Improvement": "نیازمند بهینهتر شدن", "Next": "بعدی", "No parent": "بدون والد", + "Not available": "نا موجود", "Not required": "غیر ضرروری", "Order removed successfully": "سفارش با موفقیت حذف شد", "Orders": "سفارشاات", diff --git a/resources/sass/client-custom/_zfix.scss b/resources/sass/client-custom/_zfix.scss index 0d26364..46e8a6c 100644 --- a/resources/sass/client-custom/_zfix.scss +++ b/resources/sass/client-custom/_zfix.scss @@ -146,3 +146,7 @@ ul.pagination { .accordion-button:not(.collapsed){ background: transparent; } + +.btn-outline-light:hover{ + color: black !important; +} diff --git a/resources/views/admin/advs/adv-form.blade.php b/resources/views/admin/advs/adv-form.blade.php index 2a6455b..b4e8447 100644 --- a/resources/views/admin/advs/adv-form.blade.php +++ b/resources/views/admin/advs/adv-form.blade.php @@ -105,7 +105,7 @@ </label> {{-- WIP for lang change def tab--}} <vue-datetime-picker-input :xmin="{{strtotime('yesterday')}}" - xid="dp" xname="expire" xshow="date" xtitle="Expire date" def-tab="1" + xid="dp" xname="expire" xtitle="Expire date" @if(app()->getLocale() != 'fa') def-tab="1" xshow="date" @else xshow="pdate" @endif @if(isset($item)) :xvalue="{{strtotime($item->expire)}}" @endif ></vue-datetime-picker-input> </div> diff --git a/resources/views/admin/customers/customer-form.blade.php b/resources/views/admin/customers/customer-form.blade.php index 7d4fe59..fcdee2a 100644 --- a/resources/views/admin/customers/customer-form.blade.php +++ b/resources/views/admin/customers/customer-form.blade.php @@ -104,7 +104,7 @@ </label> <vue-datetime-picker-input :xmax="{{strtotime('yesterday')}}" - xid="dp" xname="dob" xshow="pdate" xtitle="{{__("Date of born")}}" def-tab="0" + xid="dp" xname="dob" xtitle="{{__("Date of born")}}" @if(app()->getLocale() != 'fa') def-tab="1" xshow="date" @else xshow="pdate" @endif @if(isset($item)) :xvalue="{{strtotime($item->dob)}}" @endif :timepicker="false" ></vue-datetime-picker-input> diff --git a/resources/views/admin/discounts/discount-form.blade.php b/resources/views/admin/discounts/discount-form.blade.php index 5961bcc..802c0a3 100644 --- a/resources/views/admin/discounts/discount-form.blade.php +++ b/resources/views/admin/discounts/discount-form.blade.php @@ -44,7 +44,7 @@ </label> <vue-datetime-picker-input :xmin="{{strtotime('yesterday')}}" - xid="dp" xname="expire" xshow="datetime" xtitle="Expire date" def-tab="1" + xid="dp" xname="expire" xtitle="Expire date" @if(app()->getLocale() != 'fa') def-tab="1" xshow="datetime" @else xshow="pdatetime" @endif @if(isset($item)) :xvalue="{{strtotime($item->expire)}}" @endif :timepicker="true" ></vue-datetime-picker-input> diff --git a/resources/views/client/default-list.blade.php b/resources/views/client/default-list.blade.php index b4f2500..8995ba4 100644 --- a/resources/views/client/default-list.blade.php +++ b/resources/views/client/default-list.blade.php @@ -12,7 +12,7 @@ @endforeach @endif @foreach(getParts($area) as $part) - @php($p = $part->getBladeWithData()) + @php($p = $part->getBladeWithData($model??null)) @include($p['blade'],['data' => $p['data']]) @endforeach @if(findArea($area)->use_default) diff --git a/resources/views/client/gallery.blade.php b/resources/views/client/gallery.blade.php index 43f7a64..c9144db 100644 --- a/resources/views/client/gallery.blade.php +++ b/resources/views/client/gallery.blade.php @@ -12,7 +12,7 @@ @endforeach @endif @foreach(getParts($area) as $part) - @php($p = $part->getBladeWithData()) + @php($p = $part->getBladeWithData($gallery)) @include($p['blade'],['data' => $p['data']]) @endforeach @if(findArea($area)->use_default) diff --git a/resources/views/client/post.blade.php b/resources/views/client/post.blade.php index 13cd00c..c579694 100644 --- a/resources/views/client/post.blade.php +++ b/resources/views/client/post.blade.php @@ -11,7 +11,7 @@ @endforeach @endif @foreach(getParts($area,$post) as $part) - @php($p = $part->getBladeWithData()) + @php($p = $part->getBladeWithData($post)) @include($p['blade'],['data' => $p['data']]) @endforeach @if(findArea($area,$post)->use_default) diff --git a/resources/views/client/product.blade.php b/resources/views/client/product.blade.php index de4f0a0..c60dc0a 100644 --- a/resources/views/client/product.blade.php +++ b/resources/views/client/product.blade.php @@ -12,7 +12,7 @@ @endforeach @endif @foreach(getParts($area,$product) as $part) - @php($p = $part->getBladeWithData()) + @php($p = $part->getBladeWithData($product)) @include($p['blade'],['data' => $p['data']]) @endforeach @if(findArea($area,$product)->use_default) diff --git a/resources/views/components/setting-field.blade.php b/resources/views/components/setting-field.blade.php index 3305c5b..674a696 100644 --- a/resources/views/components/setting-field.blade.php +++ b/resources/views/components/setting-field.blade.php @@ -22,6 +22,26 @@ class="form-control" rows="5">{{old($setting->key, $setting->value)}}</textarea> @break + @case('TIME') + <vue-time-picker :am-pm="false" + xid="{{$setting->key}}" + xname="{{$setting->key}}" + :xvalue="{{$setting->value}}" + xtitle="{{$setting->title}}"></vue-time-picker> + @break + @case('DATE') + <vue-datetime-picker-input + xid="{{$setting->key}}" xname="{{$setting->key}}" @if(app()->getLocale() == 'fa') xshow="pdate" @else xshow="date" @endif xtitle="{{$setting->title}}" @if(app()->getLocale() != 'fa') def-tab="1" @endif + :xvalue="{{$setting->value}}" + ></vue-datetime-picker-input> + @break + @case('DATETIME') + <vue-datetime-picker-input + xid="{{$setting->key}}" xname="{{$setting->key}}" @if(app()->getLocale() == 'fa') xshow="pdatetime" @else xshow="datetime" @endif xtitle="{{$setting->title}}" @if(app()->getLocale() != 'fa') def-tab="1" @endif + :xvalue="{{$setting->value}}" + :timepicker="true" + ></vue-datetime-picker-input> + @break @case('ICON') <remix-icon-picker xname="{{$setting->key}}" xvalue="{{old($setting->key, $setting->value)}}"></remix-icon-picker> @break diff --git a/resources/views/segments/categories/CurveCategories/CurveCategories.blade.php b/resources/views/segments/categories/CurveCategories/CurveCategories.blade.php new file mode 100644 index 0000000..b2301b2 --- /dev/null +++ b/resources/views/segments/categories/CurveCategories/CurveCategories.blade.php @@ -0,0 +1,42 @@ +<section id='CurveCategories'> + + + <div id="curve-cat-top"> + + </div> + <div> + {{-- class="{{gfx()['container']}}"--}} + + <h1 class="text-center"> + {{getSetting($part->area_name . '_' . $part->part.'_title')}} + </h1> + <div id="curve-slider-cat-container"> + + <div id="crc-nxt" class="sld-btn"> + <i class="ri-arrow-right-line"></i> + </div> + <div id="crc-prv" class="sld-btn"> + <i class="ri-arrow-left-line"></i> + </div> + + <div id="curve-slider-cat"> + @foreach(getCategorySubCatsBySetting($part->area_name . '_' . $part->part.'_category') as $cat) + <div class="item slider-content"> + <div class="curve-cat-item"> + <a href="{{$cat->webUrl()}}"> + <img src="{{$cat->imgUrl()}}" alt="{{$cat->name}}"> + <h4> + {{$cat->name}} + </h4> + </a> + </div> + </div> + @endforeach + </div> + </div> + </div> + + <div id="curve-cat-bottom"> + + </div> +</section> diff --git a/resources/views/segments/categories/CurveCategories/CurveCategories.js b/resources/views/segments/categories/CurveCategories/CurveCategories.js new file mode 100644 index 0000000..19e707c --- /dev/null +++ b/resources/views/segments/categories/CurveCategories/CurveCategories.js @@ -0,0 +1,52 @@ +import {tns} from "tiny-slider/src/tiny-slider"; + +var curveCatSlider ; + +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('#curve-slider-cat')?.forEach(function (el) { + if (el.classList.contains('.tns-slider')){ + console.log('ignore'); + return 'ignore'; + } + curveCatSlider = tns({ + container: el, + responsive:{ + 560:{ + items: 1.5, + }, + 1000:{ + items: 3.5, + }, + 1400:{ + items: 5.5, + }, + + }, + // edgePadding: 50, + autoplay: true, + autoplayButton: false, + mouseDrag: true, + prevButton: false, + nextButton: false, + autoplayTimeout: 8000, + center: true, + nav: true, + loop:true, + }); + }); + // + document.querySelector('#crc-nxt')?.addEventListener('click',function () { + if (document.documentElement.getAttribute('dir') === 'rtl'){ + curveCatSlider.goTo('prev'); + }else{ + curveCatSlider.goTo('next'); + } + }); + document.querySelector('#crc-prv')?.addEventListener('click',function () { + if (document.documentElement.getAttribute('dir') !== 'rtl'){ + curveCatSlider.goTo('prev'); + }else{ + curveCatSlider.goTo('next'); + } + }); +}); diff --git a/resources/views/segments/categories/CurveCategories/CurveCategories.json b/resources/views/segments/categories/CurveCategories/CurveCategories.json new file mode 100644 index 0000000..24bdfb5 --- /dev/null +++ b/resources/views/segments/categories/CurveCategories/CurveCategories.json @@ -0,0 +1,10 @@ +{ + "name": "CurveCategories", + "version": "1.0", + "author": "xStack", + "email": "xshop@xstack.ir", + "license": "GPL-3.0-or-later", + "url": "https:\/\/xstack.ir", + "author_url": "https:\/\/4xmen.ir", + "packages": [] +} \ No newline at end of file diff --git a/resources/views/segments/categories/CurveCategories/CurveCategories.php b/resources/views/segments/categories/CurveCategories/CurveCategories.php new file mode 100644 index 0000000..17e1d98 --- /dev/null +++ b/resources/views/segments/categories/CurveCategories/CurveCategories.php @@ -0,0 +1,56 @@ +<?php + +namespace Resources\Views\Segments; + +use App\Models\Category; +use App\Models\Part; +use App\Models\Setting; + +class CurveCategories +{ + public static function onAdd(Part $part = null) + { + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_title'; + $setting->value = 'Lorem ipsum dolor sit amet'; + $setting->type = 'TEXT'; + $setting->size = 4; + $setting->title = $part->area_name . ' ' . $part->part .' titles'; + $setting->save(); + + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_category'; + $setting->value = Category::first()->id; + $setting->type = 'CATEGORY'; + $setting->size = 4; + $setting->title = $part->area_name . ' ' . $part->part .' category'; + $setting->save(); + + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_bg'; + $setting->value = gfx()['secondary']; + $setting->type = 'COLOR'; + $setting->data = json_encode(['name' => 'curve-slider-bg']); + $setting->size = 4; + $setting->title = $part->area_name . ' ' . $part->part .' background color'; + $setting->save(); + + + + } + public static function onRemove(Part $part = null) + { + Setting::where('key',$part->area_name . '_' . $part->part.'_title')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'_category')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'bg')->first()?->delete(); + } + public static function onMount(Part $part = null) + { + return $part; + } +} diff --git a/resources/views/segments/categories/CurveCategories/CurveCategories.scss b/resources/views/segments/categories/CurveCategories/CurveCategories.scss new file mode 100644 index 0000000..180f17e --- /dev/null +++ b/resources/views/segments/categories/CurveCategories/CurveCategories.scss @@ -0,0 +1,171 @@ +#CurveCategories { + position: relative; + background: var(--curve-slider-bg); + + + h1{ + position: relative; + z-index: 33; + margin-bottom: 1rem; + font-size: 30px; + font-weight: 300; + } + #curve-cat-top, #curve-cat-bottom { + height: 10rem; + position: relative; + background: transparent; + overflow: hidden; + + } + + #curve-cat-top { + + margin-bottom: -4.5rem; + + z-index: 15; + + &:before { + content: " "; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 700%; + background: var(--xshop-background); + border-radius: 50%; + transform: scaleX(1.75); + } + + } + + #curve-cat-bottom { + margin-top: -2.5rem; + z-index: 10; + + &:before { + content: " "; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 700%; + background: var(--xshop-background); + border-radius: 50%; + transform: scaleX(1.75); + } + } + + #curve-slider-cat-container { + height: 35vh; + + #curve-slider-cat{ + //width: 100vw; + //left: 0; + //right: 0; + } + + .slider-content { + transform: translateX(25%); + } + + &:before, &:after { + content: ' '; + position: absolute; + top: 0; + bottom: 0; + width: 45%; + z-index: 9; + pointer-events: none; + } + + &:before { + background: linear-gradient(90deg, var(--curve-slider-bg) 20%, rgba(0, 0, 0, 0) 100%); + left: 0; + } + + &:after { + background: linear-gradient(-90deg, var(--curve-slider-bg) 20%, rgba(0, 0, 0, 0) 100%); + right: 0; + } + + + .sld-btn,.tns-nav{ + z-index: 70; + position: absolute; + top: 75%; + cursor: pointer; + i{ + font-size: 35px; + } + } + + #crc-nxt{ + right:calc(50% - 100px); + transform: translateX(-50%); + } + #crc-prv{ + left:calc(50% - 100px); + transform: translateX(50%); + } + + .tns-nav{ + display: flex !important; + width: 150px; + left:calc(50% - 75px); + height: 50px; + + align-items: center; + justify-content: space-evenly; + button{ + display: inline-block; + margin: 3px; + width: 10px; + height: 10px; + border-radius: var(--xshop-border-radius); + background: #00000044; + border: 0; + } + + .tns-nav-active{ + + background: var(--xshop-primary); + } + } + } + + .curve-cat-item { + height: 35vh; + position: relative; + img { + height: 100%; + width: 100%; + object-fit: cover; + } + + h4{ + position: absolute; + bottom: 45%; + left: 0; + right: 0; + width: 100%; + text-align: center; + z-index: 33; + background: var(--xshop-background); + padding: .5rem; + transition: 300ms; + font-weight: 400; + opacity: 0; + } + + &:hover{ + h4{ + opacity: 1; + } + } + + + + } + + +} diff --git a/resources/views/segments/categories/CurveCategories/screenshot.png b/resources/views/segments/categories/CurveCategories/screenshot.png new file mode 100644 index 0000000..c715a5f Binary files /dev/null and b/resources/views/segments/categories/CurveCategories/screenshot.png differ diff --git a/resources/views/segments/customer/AvisaCustomer/AvisaCustomer.blade.php b/resources/views/segments/customer/AvisaCustomer/AvisaCustomer.blade.php index a7baa6f..05b79c2 100644 --- a/resources/views/segments/customer/AvisaCustomer/AvisaCustomer.blade.php +++ b/resources/views/segments/customer/AvisaCustomer/AvisaCustomer.blade.php @@ -287,7 +287,8 @@ </label> <vue-datetime-picker-input :xmax="{{strtotime('yesterday')}}" - xid="dp" xname="dob" xshow="pdate" xtitle="{{__("Date of born")}}" def-tab="0" + xid="dp" xname="dob" xtitle="{{__("Date of born")}}" + @if(app()->getLocale() != 'fa') def-tab="1" xshow="date" @else xshow="pdate" @endif :xvalue="{{strtotime(auth('customer')->user()->dob)}}" :timepicker="false" ></vue-datetime-picker-input> diff --git a/resources/views/segments/default-assets/circle-3d-minify.svg b/resources/views/segments/default-assets/circle-3d-minify.svg new file mode 100644 index 0000000..5ce409d --- /dev/null +++ b/resources/views/segments/default-assets/circle-3d-minify.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="450" height="90"><path fill="none" stroke="#c5c6c6" d="M31 41c0 19.33 85.066 35 190 35s190-15.67 190-35c0-12.933-38.08-24.228-94.713-30.287"/><circle cx="31.118" cy="42.094" r="12.362" style="fill:none;fill-opacity:.998931;stroke:#c5c6c6;stroke-width:.69;stroke-dasharray:none;stroke-opacity:1"/><circle cx="31.204" cy="42.323" r="4.242" style="fill:maroon;fill-opacity:.998931;stroke:none;stroke-width:.69;stroke-dasharray:none;stroke-opacity:1"/><circle cx="86.201" cy="65.349" r="2.638" style="fill:#ccc;fill-opacity:.998931;stroke:none;stroke-width:.429084;stroke-dasharray:none;stroke-opacity:1"/><circle cx="142.481" cy="72.624" r="2.638" style="fill:#ccc;fill-opacity:.998931;stroke:none;stroke-width:.429084;stroke-dasharray:none;stroke-opacity:1"/><circle cx="214.078" cy="75.719" r="2.638" style="fill:#ccc;fill-opacity:.998931;stroke:none;stroke-width:.429084;stroke-dasharray:none;stroke-opacity:1"/><circle cx="283.972" cy="74.022" r="2.638" style="fill:#ccc;fill-opacity:.998931;stroke:none;stroke-width:.429084;stroke-dasharray:none;stroke-opacity:1"/><circle cx="349.739" cy="66.418" r="2.638" style="fill:#ccc;fill-opacity:.998931;stroke:none;stroke-width:.429084;stroke-dasharray:none;stroke-opacity:1"/><circle cx="394.632" cy="26.596" r="2.638" style="fill:#ccc;fill-opacity:.998931;stroke:none;stroke-width:.429084;stroke-dasharray:none;stroke-opacity:1"/><circle cx="315.84" cy="9.743" r="2.638" style="fill:#ccc;fill-opacity:.998931;stroke:none;stroke-width:.429084;stroke-dasharray:none;stroke-opacity:1"/></svg> \ No newline at end of file diff --git a/resources/views/segments/default-assets/hodhod.png b/resources/views/segments/default-assets/hodhod.png new file mode 100644 index 0000000..8519082 Binary files /dev/null and b/resources/views/segments/default-assets/hodhod.png differ diff --git a/resources/views/segments/default-assets/smoke.webp b/resources/views/segments/default-assets/smoke.webp new file mode 100644 index 0000000..aa27ef5 Binary files /dev/null and b/resources/views/segments/default-assets/smoke.webp differ diff --git a/resources/views/segments/header/HodHeader/HodHeader.blade.php b/resources/views/segments/header/HodHeader/HodHeader.blade.php new file mode 100644 index 0000000..72e1718 --- /dev/null +++ b/resources/views/segments/header/HodHeader/HodHeader.blade.php @@ -0,0 +1,19 @@ +<section class='HodHeader'> + <div class="{{gfx()['container']}}"> + <div class="row"> + <div class="col-md"> + <h1> + {{$title}} + </h1> + <h2> + {{$subtitle}} + </h2> + </div> + <div class="col-md-3 text-end"> + <div id="hod-logo"> + <img src="{{asset('upload/images/logo.png')}}" alt="logo" > + </div> + </div> + </div> + </div> +</section> diff --git a/resources/views/segments/header/HodHeader/HodHeader.js b/resources/views/segments/header/HodHeader/HodHeader.js new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/segments/header/HodHeader/HodHeader.json b/resources/views/segments/header/HodHeader/HodHeader.json new file mode 100644 index 0000000..e23cb23 --- /dev/null +++ b/resources/views/segments/header/HodHeader/HodHeader.json @@ -0,0 +1,10 @@ +{ + "name": "HodHeader", + "version": "1.0", + "author": "xStack", + "email": "xshop@xstack.ir", + "license": "GPL-3.0-or-later", + "url": "https:\/\/xstack.ir", + "author_url": "https:\/\/4xmen.ir", + "packages": [] +} diff --git a/resources/views/segments/header/HodHeader/HodHeader.php b/resources/views/segments/header/HodHeader/HodHeader.php new file mode 100644 index 0000000..357a8e2 --- /dev/null +++ b/resources/views/segments/header/HodHeader/HodHeader.php @@ -0,0 +1,34 @@ +<?php + +namespace Resources\Views\Segments; + +use App\Models\Part; +use App\Models\Setting; +use Illuminate\Support\Facades\File; + +class HodHeader +{ + public static function onAdd(Part $part = null) + { + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_png'; + $setting->value = 'url("'.asset('upload/images/'.$part->area_name . '.' . $part->part.'.png').'")'; + $setting->type = 'FILE'; + $setting->size = 12; + $setting->title = $part->area_name . ' ' . $part->part.' pattern image'; + $setting->data = json_encode(['name' => 'hod-img']); + $setting->save(); + + File::copy(__DIR__.'/../../default-assets/hodhod.png',public_path('upload/images/').$part->area_name . '.' . $part->part.'.png'); + } + public static function onRemove(Part $part = null) + { + Setting::where('key',$part->area_name . '_' . $part->part.'_png')->first()?->delete(); + } + public static function onMount(Part $part = null) + { + return $part; + } +} diff --git a/resources/views/segments/header/HodHeader/HodHeader.scss b/resources/views/segments/header/HodHeader/HodHeader.scss new file mode 100644 index 0000000..ba3352a --- /dev/null +++ b/resources/views/segments/header/HodHeader/HodHeader.scss @@ -0,0 +1,43 @@ +.HodHeader { + // scss + overflow: visible; + background: linear-gradient( 45deg, var(--xshop-primary), var(--xshop-secondary) 100%); + color: var(--xshop-diff); + padding: 4.5rem 0 1rem; + position: relative; + + &:before{ + content: ' '; + background-image: var(--hod-img); + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; + height: 100%; + } + + h1,h2{ + font-weight: 400; + max-height: 1em; + overflow: hidden; + } + #hod-logo { + padding: 2rem; + background: #ffffff99; + position: relative; + z-index: 5; + display: inline-block; + margin-bottom: -40px; + border-radius: var(--xshop-border-radius); + margin-top: 1rem; + img { + height: 75px; + } + } + + + .content{ + padding-top: 2rem; + } +} diff --git a/resources/views/segments/header/HodHeader/screenshot.png b/resources/views/segments/header/HodHeader/screenshot.png new file mode 100644 index 0000000..cb1a196 Binary files /dev/null and b/resources/views/segments/header/HodHeader/screenshot.png differ diff --git a/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.blade.php b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.blade.php new file mode 100644 index 0000000..5d7e531 --- /dev/null +++ b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.blade.php @@ -0,0 +1,26 @@ +<section class='MainCategoriesIcon'> + <div class="{{gfx()['container']}}"> + <h1 class="text-center"> + {{getSetting($part->area_name . '_' . $part->part.'_title')}} + </h1> + <div class="cat-icon-box"> + <div class="row"> + @foreach(getMainCategory(getSetting($part->area_name . '_' . $part->part.'_limit')) as $category) + <div class="col-md"> + <div class=" l-box"> + <a class="main-category" href="{{$category->webUrl()}}"> + <img src="{{$category->svgUrl()}}" alt="{{$category->name}}" + title="{{$category->name}}"> + </a> + </div> + <a class="main-category" href="{{$category->webUrl()}}"> + <h4> + {{$category->name}} + </h4> + </a> + </div> + @endforeach + </div> + </div> + </div> +</section> diff --git a/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.js b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.js new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.json b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.json new file mode 100644 index 0000000..ee29139 --- /dev/null +++ b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.json @@ -0,0 +1,10 @@ +{ + "name": "MainCategoriesIcon", + "version": "1.0", + "author": "xStack", + "email": "xshop@xstack.ir", + "license": "GPL-3.0-or-later", + "url": "https:\/\/xstack.ir", + "author_url": "https:\/\/4xmen.ir", + "packages": [] +} \ No newline at end of file diff --git a/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.php b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.php new file mode 100644 index 0000000..85bef68 --- /dev/null +++ b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.php @@ -0,0 +1,75 @@ +<?php + +namespace Resources\Views\Segments; + +use App\Models\Part; +use App\Models\Setting; + +class MainCategoriesIcon +{ + public static function onAdd(Part $part = null) + { + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_bg'; + $setting->value = '#ffffff'; + $setting->type = 'COLOR'; + $setting->data = json_encode(['name' => 'cat-icon-bg']); + $setting->size = 4; + $setting->title = $part->area_name . ' ' . $part->part .' background color'; + $setting->save(); + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_box'; + $setting->value = gfx()['primary']; + $setting->type = 'COLOR'; + $setting->data = json_encode(['name' => 'cat-icon-box']); + $setting->size = 4; + $setting->title = $part->area_name . ' ' . $part->part .' box color'; + $setting->save(); + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_text'; + $setting->value = '#ffffff'; + $setting->type = 'COLOR'; + $setting->data = json_encode(['name' => 'cat-icon-text']); + $setting->size =4; + $setting->title = $part->area_name . ' ' . $part->part .' text color'; + $setting->save(); + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_title'; + $setting->value = 'Lorem ipsum dolor sit amet'; + $setting->type = 'TEXT'; + $setting->size = 6; + $setting->title = $part->area_name . ' ' . $part->part .' titles'; + $setting->save(); + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_limit'; + $setting->value = '4'; + $setting->size = 6; + $setting->type = 'NUMBER'; + $setting->data = json_encode(['xmin' => 4, 'xmax' => 12]); + $setting->title = $part->area_name . ' ' . $part->part. ' limit'; + $setting->save(); + + } + public static function onRemove(Part $part = null) + { + Setting::where('key',$part->area_name . '_' . $part->part.'_title')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'_limit')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'_bg')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'_box')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'_text')->first()?->delete(); + } + public static function onMount(Part $part = null) + { + return $part; + } +} diff --git a/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.scss b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.scss new file mode 100644 index 0000000..c113f9b --- /dev/null +++ b/resources/views/segments/index/MainCategoriesIcon/MainCategoriesIcon.scss @@ -0,0 +1,51 @@ +.MainCategoriesIcon { + // scss + padding: 4rem; + background: var(--cat-icon-bg); + position: relative; + overflow: hidden; + + h1 { + position: absolute; + left: 2rem; + top: 1rem; + transform: rotateZ(-90deg); + white-space: nowrap; + font-size: 22px; + text-align: center; + width: 0; + } + + .cat-icon-box { + background: var(--cat-icon-box); + padding: 1rem; + border-radius: var(--xshop-border-radius); + + .row { + margin: 1rem; + } + + .l-box { + border-radius: var(--xshop-border-radius); + margin: 1rem; + background: var(--cat-icon-bg); + text-align: center; + + + img { + max-width: 70%; + margin: 1rem 0; + } + + } + } + + h4 { + padding: 1rem 0 0 0; + font-size: 20px; + font-weight: 300; + color: var(--cat-icon-text) !important; + text-align: center; + } + +} diff --git a/resources/views/segments/index/MainCategoriesIcon/screenshot.png b/resources/views/segments/index/MainCategoriesIcon/screenshot.png new file mode 100644 index 0000000..e122506 Binary files /dev/null and b/resources/views/segments/index/MainCategoriesIcon/screenshot.png differ diff --git a/resources/views/segments/index/MainCategoriesSlider/MainCategoriesSlider.blade.php b/resources/views/segments/index/MainCategoriesSlider/MainCategoriesSlider.blade.php index 1fb14d8..446df49 100644 --- a/resources/views/segments/index/MainCategoriesSlider/MainCategoriesSlider.blade.php +++ b/resources/views/segments/index/MainCategoriesSlider/MainCategoriesSlider.blade.php @@ -4,7 +4,7 @@ {{getSetting($data->area_name.'_'.$data->part.'_title')}} </h1> <div id="main-cats"> - @foreach(\App\Models\Category::whereNull('parent_id')->limit(10)->get() as $category) + @foreach(getMainCategory(10) as $category) <div class="item slider-content"> <a class="main-category" href="{{$category->webUrl()}}"> <img src="{{$category->imgUrl()}}" alt="{{$category->name}}" title="{{$category->name}}" > diff --git a/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.blade.php b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.blade.php new file mode 100644 index 0000000..b841a09 --- /dev/null +++ b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.blade.php @@ -0,0 +1,44 @@ +<section id='SamiraProductSlider'> + <div class="{{gfx()['container']}}"> + <div id="samira-container"> + <div id="sam-nxt" class="sld-btn"> + <i class="ri-arrow-right-line"></i> + </div> + <div id="sam-prv" class="sld-btn"> + <i class="ri-arrow-left-line"></i> + </div> + <div id="samira-slider"> + + @foreach(getCategoryProductBySetting($part->area_name . '_' . $part->part.'_category',getSetting($part->area_name . '_' . $part->part.'_limit')) as $product) + <div class="item slider-content"> + + <div class="row"> + + <div class="col-md-8 cloudy"> + <a href="{{$product->webUrl()}}"> + <img src="{{$product->imgUrl()}}" alt="{{$product->name}}" loading="lazy"> + </a> + <img src="{{asset('upload/images/index.SamiraProductSlider.webp')}}" alt="" class="bg"> + <img src="{{asset('upload/images/circle-3d-minify.svg')}}" alt="" class="circle"> + </div> + <div class="col-md-4"> + <h4 class="mb-4"> + {{$product->name}} + </h4> + + <a href="{{$product->webUrl()}}" class="btn btn-outline-light"> + {{__("View product")}} + + <i class="ri-arrow-right-circle-fill float-end"></i> + </a> + </div> + + </div> + + </div> + @endforeach + </div> + </div> + + </div> +</section> diff --git a/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.js b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.js new file mode 100644 index 0000000..5a7a5dd --- /dev/null +++ b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.js @@ -0,0 +1,42 @@ +import {tns} from "tiny-slider/src/tiny-slider"; + +var samSlider ; + + +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('#samira-slider')?.forEach(function (el) { + if (el.classList.contains('.tns-slider')){ + console.log('ignore'); + return 'ignore'; + } + samSlider = tns({ + container: el, + items: 1.5, + // edgePadding: 50, + autoplay: true, + autoplayButton: false, + mouseDrag: true, + prevButton: false, + nextButton: false, + autoplayTimeout: 8000, + center: true, + nav: true, + loop:true, + }); + }); + + document.querySelector('#sam-nxt')?.addEventListener('click',function () { + if (document.documentElement.getAttribute('dir') === 'rtl'){ + samSlider.goTo('prev'); + }else{ + samSlider.goTo('next'); + } + }); + document.querySelector('#sam-prv')?.addEventListener('click',function () { + if (document.documentElement.getAttribute('dir') !== 'rtl'){ + samSlider.goTo('prev'); + }else{ + samSlider.goTo('next'); + } + }); +}); diff --git a/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.json b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.json new file mode 100644 index 0000000..bea5c6e --- /dev/null +++ b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.json @@ -0,0 +1,10 @@ +{ + "name": "SamiraProductSlider", + "version": "1.0", + "author": "xStack", + "email": "xshop@xstack.ir", + "license": "GPL-3.0-or-later", + "url": "https:\/\/xstack.ir", + "author_url": "https:\/\/4xmen.ir", + "packages": [] +} \ No newline at end of file diff --git a/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.php b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.php new file mode 100644 index 0000000..d37bebf --- /dev/null +++ b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.php @@ -0,0 +1,79 @@ +<?php + +namespace Resources\Views\Segments; + +use App\Models\Category; +use App\Models\Part; +use App\Models\Setting; +use Illuminate\Support\Facades\File; + +class SamiraProductSlider +{ + public static function onAdd(Part $part = null) + { + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_title'; + $setting->value = 'Lorem ipsum dolor sit amet'; + $setting->type = 'TEXT'; + $setting->size = 6; + $setting->title = $part->area_name . ' ' . $part->part .' titles'; + $setting->save(); + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_category'; + $setting->value = Category::first()->id; + $setting->type = 'CATEGORY'; + $setting->size = 3; + $setting->title = $part->area_name . ' ' . $part->part .' category'; + $setting->save(); + + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_bg'; + $setting->value = gfx()['secondary']; + $setting->type = 'COLOR'; + $setting->data = json_encode(['name' => 'samira-bg']); + $setting->size = 3; + $setting->title = $part->area_name . ' ' . $part->part .' background color'; + $setting->save(); + + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_limit'; + $setting->value = 4; + $setting->size = 6; + $setting->type = 'NUMBER'; + $setting->data = json_encode(['xmin' => 4, 'xmax' => 12]); + $setting->title = $part->area_name . ' ' . $part->part. ' limit'; + $setting->save(); + + $setting = new Setting(); + $setting->section = 'theme'; + $setting->key = $part->area_name . '_' . $part->part.'_webp'; + $setting->value = null; + $setting->type = 'FILE'; + $setting->size = 6; + $setting->title = $part->area_name . ' ' . $part->part.' background pattern image'; + $setting->save(); + File::copy(__DIR__.'/../../default-assets/smoke.webp',public_path('upload/images/').$part->area_name . '.' . $part->part.'.webp'); + File::copy(__DIR__.'/../../default-assets/circle-3d-minify.svg',public_path('upload/images/').'circle-3d-minify.svg'); + + } + public static function onRemove(Part $part = null) + { + Setting::where('key',$part->area_name . '_' . $part->part.'_title')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'_category')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'bg')->first()?->delete(); + Setting::where('key',$part->area_name . '_' . $part->part.'_webp')->first()?->delete(); + + } + public static function onMount(Part $part = null) + { + return $part; + } +} diff --git a/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.scss b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.scss new file mode 100644 index 0000000..4535755 --- /dev/null +++ b/resources/views/segments/products/SamiraProductSlider/SamiraProductSlider.scss @@ -0,0 +1,143 @@ +#SamiraProductSlider { + // scss + padding: 4rem 0; + background: var(--samira-bg); + color: var(--xshop-diff2); + + .container,.container-fluid{ + position: relative; + padding: 2rem 0; + &:before{ + position: absolute; + content: ' '; + top: 1rem; + bottom: 1rem; + left: 2rem; + right: 2rem; + background: #ffffff; + background: radial-gradient(circle, rgba(255,255,255,.4) 0%, rgba(0,0,0,0) 100%); + + border-radius: 50%; + filter: blur(30px); + + } + } + + img{ + width: 100px; + transition: 300ms; + height: 80vh; + object-fit: contain; + } + + .slider-content{ + height: 80vh; + //border:1px solid grey; + direction: rtl !important; + transform: translateX(25%); + + .col-md-4{ + padding-top: 40vh; + a{ + color: white; + } + h4{ + border-bottom: darkred 1px solid; + padding: .5rem; + } + } + } + + .cloudy{ + position: relative; + padding-top: 10vh; + .bg{ + opacity: 0; + transition: 200ms; + } + } + + + .tns-slide-active{ + img{ + width: 100%; + height: 50vh; + } + + &+.tns-item{ + direction: ltr !important; + } + + .cloudy{ + .bg{ + position: absolute; + left: 15%; + bottom: 0; + top: 0; + width: 75%; + z-index: -1; + object-fit: contain; + height: 70vh; + opacity: 1; + } + .circle{ + position: absolute; + right: 0; + bottom: -10vh; + width: 100%; + object-fit: scale-down; + height: 15vh; + transform: translateX(5%); + } + } + + } + + #samira-container { + position: relative; + + .sld-btn,.tns-nav{ + z-index: 70; + position: absolute; + top: 90%; + cursor: pointer; + i{ + font-size: 35px; + } + } + + #sam-nxt{ + left:calc(20% + 200px); + } + #sam-prv{ + left: 20%; + } + + .tns-nav{ + display: flex !important; + width: 150px; + left:calc(20% + 45px); + height: 50px; + + align-items: center; + justify-content: space-evenly; + button{ + display: inline-block; + margin: 3px; + width: 10px; + height: 10px; + border-radius: var(--xshop-border-radius); + background: #ffffff44; + border: 0; + } + + .tns-nav-active{ + + background: #ffffff; + } + } + } + + + +} diff --git a/resources/views/segments/products/SamiraProductSlider/screenshot.png b/resources/views/segments/products/SamiraProductSlider/screenshot.png new file mode 100644 index 0000000..9cc398c Binary files /dev/null and b/resources/views/segments/products/SamiraProductSlider/screenshot.png differ