diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..494fcc50b --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,51 @@ +name: Deploy Docs to GH Pages + +on: + push: + branches: [master, develop] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Not needed if lastUpdated is not enabled + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Install dependencies + run: npm ci + - name: Build with VitePress + run: npm run docs:build + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4fb5ab96c..b80b1d9ca 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,8 @@ .phpunit.result.cache .vscode composer.lock -src/docs/.vitepress/cache -src/docs/.vitepress/dist +docs/.vitepress/cache +docs/.vitepress/dist nbproject node_modules -package-lock.json -vendor \ No newline at end of file +vendor diff --git a/Plugin.php b/Plugin.php index 7b63f60f2..64ed1ee54 100644 --- a/Plugin.php +++ b/Plugin.php @@ -2,12 +2,13 @@ namespace OFFLINE\Mall; +use Illuminate\Contracts\Foundation\Application; use Illuminate\Support\Facades\View; +use October\Rain\Database\Relations\Relation; use OFFLINE\Mall\Classes\Registration\BootComponents; use OFFLINE\Mall\Classes\Registration\BootEvents; use OFFLINE\Mall\Classes\Registration\BootExtensions; use OFFLINE\Mall\Classes\Registration\BootMails; -use OFFLINE\Mall\Classes\Registration\BootRelations; use OFFLINE\Mall\Classes\Registration\BootServiceContainer; use OFFLINE\Mall\Classes\Registration\BootSettings; use OFFLINE\Mall\Classes\Registration\BootTwig; @@ -16,6 +17,16 @@ use OFFLINE\Mall\Console\IndexCommand; use OFFLINE\Mall\Console\PurgeCommand; use OFFLINE\Mall\Console\SeedDataCommand; +use OFFLINE\Mall\Models\CustomField; +use OFFLINE\Mall\Models\CustomFieldOption; +use OFFLINE\Mall\Models\Discount; +use OFFLINE\Mall\Models\ImageSet; +use OFFLINE\Mall\Models\PaymentMethod; +use OFFLINE\Mall\Models\Product; +use OFFLINE\Mall\Models\ServiceOption; +use OFFLINE\Mall\Models\ShippingMethod; +use OFFLINE\Mall\Models\ShippingMethodRate; +use OFFLINE\Mall\Models\Variant; use System\Classes\PluginBase; class Plugin extends PluginBase @@ -28,7 +39,6 @@ class Plugin extends PluginBase use BootMails; use BootValidation; use BootTwig; - use BootRelations; /** * Required plugin dependencies. @@ -40,16 +50,32 @@ class Plugin extends PluginBase 'RainLab.Translate' ]; + /** + * Required model morph-map relations, must be registered n the constructor + * to make them available when the plugin migrations are run. + * @var array + */ + protected $relations = [ + Variant::MORPH_KEY => Variant::class, + Product::MORPH_KEY => Product::class, + ImageSet::MORPH_KEY => ImageSet::class, + Discount::MORPH_KEY => Discount::class, + CustomField::MORPH_KEY => CustomField::class, + PaymentMethod::MORPH_KEY => PaymentMethod::class, + ShippingMethod::MORPH_KEY => ShippingMethod::class, + CustomFieldOption::MORPH_KEY => CustomFieldOption::class, + ShippingMethodRate::MORPH_KEY => ShippingMethodRate::class, + ServiceOption::MORPH_KEY => ServiceOption::class, + ]; + /** * Create a new plugin instance. - * @return void + * @param Application $app */ - public function __construct($app) + public function __construct(Application $app) { parent::__construct($app); - // The morph map has to be registered in the constructor so it is available - // when plugin migrations are run. - $this->registerRelations(); + Relation::morphMap($this->relations); } /** diff --git a/README.md b/README.md index 07a462515..2fbb4eb84 100644 --- a/README.md +++ b/README.md @@ -144,5 +144,5 @@ If you found a bug or want to request a feature please file a GitHub issue. ### Pull requests -PRs are always welcome! Open them against the `develop` branch. If you plan a time consuming +PRs are always welcome! Open them against the `next` branch. If you plan a time consuming contribution please open an issue first and describe what changes you have in mind. diff --git a/assets/css/nouislider.min.css b/assets/css/nouislider.min.css new file mode 100644 index 000000000..60f217c09 --- /dev/null +++ b/assets/css/nouislider.min.css @@ -0,0 +1 @@ +.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;height:100%;width:100%;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{top:-100%;width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;bottom:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#FAFAFA;border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-connects{border-radius:3px}.noUi-connect{background:#3FB8AF}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#B8B8B8}[disabled] .noUi-handle,[disabled].noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-sub{background:#AAA}.noUi-marker-large{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.noUi-horizontal .noUi-origin>.noUi-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%,0);left:auto;bottom:10px}.noUi-vertical .noUi-origin>.noUi-tooltip{-webkit-transform:translate(0,-18px);transform:translate(0,-18px);top:auto;right:28px} \ No newline at end of file diff --git a/assets/js/nouislider.min.js b/assets/js/nouislider.min.js new file mode 100644 index 000000000..d52d86a35 --- /dev/null +++ b/assets/js/nouislider.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).noUiSlider={})}(this,function(ot){"use strict";function n(t){return"object"==typeof t&&"function"==typeof t.to}function st(t){t.parentElement.removeChild(t)}function at(t){return null!=t}function lt(t){t.preventDefault()}function i(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}function ut(t,e,r){0=e[r];)r+=1;return r}function r(t,e,r){if(r>=t.slice(-1)[0])return 100;var n=l(r,t),i=t[n-1],o=t[n],t=e[n-1],n=e[n];return t+(r=r,a(o=[i,o],o[0]<0?r+Math.abs(o[0]):r-o[0],0)/s(t,n))}function o(t,e,r,n){if(100===n)return n;var i=l(n,t),o=t[i-1],s=t[i];return r?(s-o)/2this.xPct[n+1];)n++;else t===this.xPct[this.xPct.length-1]&&(n=this.xPct.length-2);r||t!==this.xPct[n+1]||n++;for(var i,o=1,s=(e=null===e?[]:e)[n],a=0,l=0,u=0,c=r?(t-this.xPct[n])/(this.xPct[n+1]-this.xPct[n]):(this.xPct[n+1]-t)/(this.xPct[n+1]-this.xPct[n]);0= 2) required for mode 'count'.");for(var e=t.values-1,r=100/e,n=[];e--;)n[e]=e*r;return n.push(100),U(n,t.stepped)}(d),m={},t=S.xVal[0],e=S.xVal[S.xVal.length-1],g=!1,v=!1,b=0;return(h=h.slice().sort(function(t,e){return t-e}).filter(function(t){return!this[t]&&(this[t]=!0)},{}))[0]!==t&&(h.unshift(t),g=!0),h[h.length-1]!==e&&(h.push(e),v=!0),h.forEach(function(t,e){var r,n,i,o,s,a,l,u,t=t,c=h[e+1],p=d.mode===ot.PipsMode.Steps,f=(f=p?S.xNumSteps[e]:f)||c-t;for(void 0===c&&(c=t),f=Math.max(f,1e-7),r=t;r<=c;r=Number((r+f).toFixed(7))){for(a=(o=(i=S.toStepping(r))-b)/(d.density||1),u=o/(l=Math.round(a)),n=1;n<=l;n+=1)m[(s=b+n*u).toFixed(5)]=[S.fromStepping(s),0];a=-1ot.PipsType.NoValue&&((t=P(a,!1)).className=p(n,f.cssClasses.value),t.setAttribute("data-value",String(r)),t.style[f.style]=e+"%",t.innerHTML=String(s.to(r))))}),a}function L(){n&&(st(n),n=null)}function T(t){L();var e=D(t),r=t.filter,t=t.format||{to:function(t){return String(Math.round(t))}};return n=d.appendChild(O(e,r,t))}function j(){var t=i.getBoundingClientRect(),e="offset"+["Width","Height"][f.ort];return 0===f.ort?t.width||i[e]:t.height||i[e]}function z(n,i,o,s){function e(t){var e,r=function(e,t,r){var n=0===e.type.indexOf("touch"),i=0===e.type.indexOf("mouse"),o=0===e.type.indexOf("pointer"),s=0,a=0;0===e.type.indexOf("MSPointer")&&(o=!0);if("mousedown"===e.type&&!e.buttons&&!e.touches)return!1;if(n){var l=function(t){t=t.target;return t===r||r.contains(t)||e.composed&&e.composedPath().shift()===r};if("touchstart"===e.type){n=Array.prototype.filter.call(e.touches,l);if(1r.stepAfter.startValue&&(i=r.stepAfter.startValue-n),t=n>r.thisStep.startValue?r.thisStep.step:!1!==r.stepBefore.step&&n-r.stepBefore.highestStep,100===e?i=null:0===e&&(t=null);e=S.countStepDecimals();return null!==i&&!1!==i&&(i=Number(i.toFixed(e))),[t=null!==t&&!1!==t?Number(t.toFixed(e)):t,i]}ft(t=d,f.cssClasses.target),0===f.dir?ft(t,f.cssClasses.ltr):ft(t,f.cssClasses.rtl),0===f.ort?ft(t,f.cssClasses.horizontal):ft(t,f.cssClasses.vertical),ft(t,"rtl"===getComputedStyle(t).direction?f.cssClasses.textDirectionRtl:f.cssClasses.textDirectionLtr),i=P(t,f.cssClasses.base),function(t,e){var r=P(e,f.cssClasses.connects);l=[],(a=[]).push(N(r,t[0]));for(var n=0;ncustomer)->is_guest === 1) { - throw new AuthException('A user was not found with the given credentials.'); - } - - return $user; - } -} diff --git a/classes/customer/DefaultSignInHandler.php b/classes/customer/DefaultSignInHandler.php index cd25e2194..6f05c47df 100644 --- a/classes/customer/DefaultSignInHandler.php +++ b/classes/customer/DefaultSignInHandler.php @@ -2,17 +2,18 @@ namespace OFFLINE\Mall\Classes\Customer; +use Auth; use Event; use Exception; use Flash; use October\Rain\Auth\AuthException; use October\Rain\Exception\ValidationException; +use OFFLINE\Mall\Classes\User\Settings; use OFFLINE\Mall\Models\Cart; use OFFLINE\Mall\Models\Customer; -use OFFLINE\Mall\Models\User; -use Auth; use OFFLINE\Mall\Models\Wishlist; -use Redirect; +use RainLab\User\Models\Setting; +use RainLab\User\Models\User; use Validator; class DefaultSignInHandler implements SignInHandler @@ -52,9 +53,18 @@ protected function login(array $data) Event::fire('rainlab.user.beforeAuthenticate', [$this, $credentials]); Event::fire('mall.customer.beforeAuthenticate', [$this, $credentials]); - $user = Auth::authenticate($credentials, true); + // RainLab.User 3.0 compatibility + if (class_exists(\RainLab\User\Models\Setting::class)) { + if (Auth::attempt(['email' => $credentials['login'], 'password' => $credentials['password']], true)) { + $user = Auth::getUser(); + } else { + throw new AuthException('rainlab.user::lang.account.invalid_login'); + } + } else { + $user = Auth::authenticate($credentials, true); + } - if ($user->isBanned()) { + if (method_exists($user, 'isBanned') && $user->isBanned()) { Auth::logout(); throw new AuthException('rainlab.user::lang.account.banned'); } @@ -88,7 +98,7 @@ protected function login(array $data) */ protected function validate(array $data) { - $minPasswordLength = \RainLab\User\Models\User::getMinPasswordLength(); + $minPasswordLength = Settings::getMinPasswordLength(); $rules = [ 'login' => 'required|email|between:6,255', 'password' => sprintf('required|min:%d|max:255', $minPasswordLength), diff --git a/classes/customer/DefaultSignUpHandler.php b/classes/customer/DefaultSignUpHandler.php index 01f9693eb..eef24de5a 100644 --- a/classes/customer/DefaultSignUpHandler.php +++ b/classes/customer/DefaultSignUpHandler.php @@ -6,14 +6,15 @@ use Event; use Illuminate\Support\Facades\Validator; use October\Rain\Exception\ValidationException; +use OFFLINE\Mall\Classes\User\Settings; use OFFLINE\Mall\Models\Address; use OFFLINE\Mall\Models\Cart; use OFFLINE\Mall\Models\Customer; use OFFLINE\Mall\Models\GeneralSettings; -use OFFLINE\Mall\Models\User; use OFFLINE\Mall\Models\Wishlist; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; use RainLab\User\Models\UserGroup; +use RainLab\User\Models\User; use System\Classes\PluginManager; class DefaultSignUpHandler implements SignUpHandler @@ -29,8 +30,9 @@ public function handle(array $data, bool $asGuest = false): ?User /** * @throws ValidationException + * @return User */ - protected function signUp(array $data): ?User + protected function signUp(array $data) { if ($this->asGuest) { $data['password'] = $data['password_repeat'] = str_random(30); @@ -121,13 +123,23 @@ protected function validate(array $data) } } - protected function createUser($data, $requiresConfirmation): User + /** + * @param $data + * @param $requiresConfirmation + */ + protected function createUser($data, $requiresConfirmation) { $data['name'] = $data['firstname']; $data['surname'] = $data['lastname']; $data['email'] = $data['email']; $data['password'] = $data['password']; $data['password_confirmation'] = $data['password_repeat']; + + // RainLab.User 3.0 + if (class_exists(\RainLab\User\Models\Setting::class)) { + $data['first_name'] = $data['firstname']; + $data['last_name'] = $data['lastname']; + } $user = Auth::register($data, ! $requiresConfirmation); if ($this->asGuest && $user && $group = UserGroup::getGuestGroup()) { @@ -170,7 +182,7 @@ protected function renameExistingGuestAccounts(array $data, $user) public static function rules($forSignup = true): array { - $minPasswordLength = \RainLab\User\Models\User::getMinPasswordLength(); + $minPasswordLength = Settings::getMinPasswordLength(); $rules = [ 'firstname' => 'required', 'lastname' => 'required', diff --git a/classes/customer/SignInHandler.php b/classes/customer/SignInHandler.php index db6ad9bb7..9e66c991c 100644 --- a/classes/customer/SignInHandler.php +++ b/classes/customer/SignInHandler.php @@ -3,7 +3,7 @@ namespace OFFLINE\Mall\Classes\Customer; -use OFFLINE\Mall\Models\User; +use RainLab\User\Models\User; interface SignInHandler { diff --git a/classes/customer/SignUpHandler.php b/classes/customer/SignUpHandler.php index 3ae932ed5..9cfdd3b7e 100644 --- a/classes/customer/SignUpHandler.php +++ b/classes/customer/SignUpHandler.php @@ -3,7 +3,7 @@ namespace OFFLINE\Mall\Classes\Customer; -use OFFLINE\Mall\Models\User; +use RainLab\User\Models\User; interface SignUpHandler { diff --git a/classes/downloads/VirtualProductFileDownload.php b/classes/downloads/VirtualProductFileDownload.php index 6af9354a7..f4f4238f1 100644 --- a/classes/downloads/VirtualProductFileDownload.php +++ b/classes/downloads/VirtualProductFileDownload.php @@ -3,8 +3,11 @@ namespace OFFLINE\Mall\Classes\Downloads; use Auth; +use Cms\Classes\Controller; use Cms\Classes\Page; use Flash; +use OFFLINE\Mall\Models\Product; +use OFFLINE\Mall\Models\ProductFile; use Request; use Session; use Illuminate\Support\Facades\Log; @@ -14,7 +17,7 @@ class VirtualProductFileDownload { - public function handle(string $key, ?string $idx = null) + public function handle(string $key) { $grant = $this->findGrant($key); if ( ! $grant) { @@ -40,30 +43,33 @@ public function handle(string $key, ?string $idx = null) return response($this->trans('expired'), 403); } - // Get File - if (!empty($idx)) { - $file = $product->files->where('id', $idx)->first(); - } else { - $file = $grant->file ? $grant->file : $product->latest_file; + // Increase the download counter, then send the file as a response. + $grant->increment('download_count'); + if ($product->latest_file) { + $product->latest_file->increment('download_count'); } - // If no file is around, return and log an error. The site admin needs to fix this! - if (empty($file)) { - Log::error( - '[OFFLINE.Mall] A virtual product without a file attachment has been purchased. You need to fix this!', - ['grant' => $grant, 'product' => $product, 'user' => Auth::getUser()] - ); - return response($this->trans('not_found'), 500); + // If the grant has a file attached, send it. + if ($grant->file) { + $filename = sprintf('%s.%s', $grant->display_name, $grant->file->getExtension()); + + return response()->download($grant->file->getLocalPath(), $filename); } - // Increase the download counter, then send the file as a response. - $grant->increment('download_count'); - $file->increment('download_count'); + // If no grant specific file is available, return the product file. + if ($product->latest_file && $product->latest_file->file) { + $filename = sprintf('%s.%s', $grant->display_name, $product->latest_file->file->getExtension()); + + return response()->download($product->latest_file->file->getLocalPath(), $filename); + } + + // If no file is around, return and log an error. The site admin needs to fix this! + Log::error( + '[OFFLINE.Mall] A virtual product without a file attachment has been purchased. You need to fix this!', + ['grant' => $grant, 'product' => $product, 'user' => Auth::getUser()] + ); - // Download File - $filename = sprintf('%s.%s', $file->display_name, $file->file->getExtension()); - $filename = urlencode($filename); - return response()->download($file->file->getLocalPath(), $filename); + return response($this->trans('not_found'), 500); } /** @@ -91,7 +97,7 @@ protected function redirectToLogin() Session::put('mall.login.redirect', Request::url()); Flash::warning(trans('offline.mall::frontend.session.login_required')); - $url = Page::url(GeneralSettings::get('account_page')); + $url = (new Controller)->pageUrl(GeneralSettings::get('account_page')); return Redirect::to($url); } diff --git a/classes/events/MailingEventHandler.php b/classes/events/MailingEventHandler.php index cdb875522..02cf60a37 100644 --- a/classes/events/MailingEventHandler.php +++ b/classes/events/MailingEventHandler.php @@ -16,7 +16,7 @@ use OFFLINE\Mall\Models\Notification; use OFFLINE\Mall\Models\Order; use RainLab\Translate\Classes\Translator; -use RainLab\User\Models\Settings as UserSettings; +use OFFLINE\Mall\Classes\User\Settings as UserSettings; use PDOException; class MailingEventHandler @@ -81,9 +81,16 @@ public function customerCreated($handler, $user) return; } - $needsConfirmation = UserSettings::get('activate_mode') === UserSettings::ACTIVATE_USER; - $confirmCode = implode('!', [$user->id, $user->getActivationCode()]); - $confirmUrl = $this->getAccountUrl('confirmation') . '?code=' . $confirmCode; + // RainLab.User 3.0 + if (class_exists(\RainLab\User\Models\Setting::class)) { + $needsConfirmation = false; + $confirmCode = null; + $confirmUrl = null; + } else { + $needsConfirmation = UserSettings::get('activate_mode') === UserSettings::ACTIVATE_USER; + $confirmCode = implode('!', [$user->id, $user->getActivationCode()]); + $confirmUrl = $this->getAccountUrl('confirmation') . '?code=' . $confirmCode; + } $data = [ 'user' => $user, diff --git a/classes/pricing/concerns/ApplyDiscounts.php b/classes/pricing/concerns/ApplyDiscounts.php index 5963b8745..2a701d4ad 100644 --- a/classes/pricing/concerns/ApplyDiscounts.php +++ b/classes/pricing/concerns/ApplyDiscounts.php @@ -32,9 +32,14 @@ public function applyDiscounts() // Calculate Products $total = $this->productsExclusive()->exclusive()->getMinorAmount()->toInt(); + $products = []; foreach ($this->map['products'] AS $product) { - $products[] = intval(round((100 / $total) * $product->exclusive()->toInt())); + if ($total > 0) { + $products[] = intval(round((100 / $total) * $product->exclusive()->toInt())); + } else { + $products[] = 0; + } } // Apply Discounts diff --git a/classes/registration/BootEvents.php b/classes/registration/BootEvents.php index 68240712d..a05342451 100644 --- a/classes/registration/BootEvents.php +++ b/classes/registration/BootEvents.php @@ -104,6 +104,16 @@ protected function registerStaticPagesEvents() return Product::translateParams($params, $oldLocale, $newLocale); } }); + + // Translate slugs October 3 CMS + Event::listen('cms.sitePicker.overrideParams', function ($page, $params, $currentSite, $proposedSite) { + if ($page->getBaseFileName() === GeneralSettings::get('category_page')) { + return Category::translateParams($params, $currentSite->hard_locale, $proposedSite->hard_locale); + } + if ($page->getBaseFileName() === GeneralSettings::get('product_page')) { + return Product::translateParams($params, $currentSite->hard_locale, $proposedSite->hard_locale); + } + }); } protected function registerSiteSearchEvents() diff --git a/classes/registration/BootExtensions.php b/classes/registration/BootExtensions.php index 9c49809b0..691817cc3 100644 --- a/classes/registration/BootExtensions.php +++ b/classes/registration/BootExtensions.php @@ -2,15 +2,15 @@ namespace OFFLINE\Mall\Classes\Registration; -use App; +use Backend\Widgets\Filter; use Backend\Widgets\Form; +use Backend\Widgets\Lists; use Illuminate\Support\Facades\Event; use October\Rain\Database\Builder; use OFFLINE\Mall\Models\Address; use OFFLINE\Mall\Models\Customer; use OFFLINE\Mall\Models\CustomerGroup; use OFFLINE\Mall\Models\Tax; -use OFFLINE\Mall\Models\User as MallUser; use RainLab\Location\Models\Country as RainLabCountry; use RainLab\User\Controllers\Users as RainLabUsersController; use RainLab\User\Models\User as RainLabUser; @@ -42,11 +42,6 @@ protected function extendRainLabCountry() protected function extendRainLabUser() { - // Use custom user model - App::singleton('user.auth', function () { - return \OFFLINE\Mall\Classes\Customer\AuthManager::instance(); - }); - RainLabUser::extend(function (RainLabUser $model) { $model->hasOne['customer'] = Customer::class; $model->belongsTo['customer_group'] = [CustomerGroup::class, 'key' => 'offline_mall_customer_group_id']; @@ -56,40 +51,72 @@ protected function extendRainLabUser() 'through' => Customer::class, 'throughKey' => 'id', ]; - $model->rules['surname'] = 'required'; - $model->rules['name'] = 'required'; $model->addFillable([ 'customer_group', 'offline_mall_customer_group_id', ]); + // RainLab.User 3.0 + if (class_exists(\RainLab\User\Models\Setting::class)) { + $model->rules['first_name'] = 'required'; + $model->rules['last_name'] = 'required'; + } else { + $model->rules['surname'] = 'required'; + $model->rules['name'] = 'required'; + } + $model->addDynamicMethod('scopeCustomer', function (Builder $builder) { $builder->whereHas('customer'); return $builder; }); + + $model->addDynamicMethod('scopeHasCustomerFilter', function (Builder $builder, $scopes) { + if ($scopes->value == '1') { + $builder->doesntHave('customer'); + } else if ($scopes->value == '2') { + $builder->whereHas('customer'); + } + return $builder; + }); + + // Create a customer for a User model that does not have a customer attached. + $model->addDynamicMethod('attachCustomer', function () use ($model) { + if ($model->customer || $model->is_guest) { + return; + } + + $customer = new Customer(); + $customer->firstname = $model->name; + $customer->lastname = $model->surname; + $customer->user_id = $model->id; + $customer->is_guest = false; + $customer->save(); + + $model->customer = $customer; + }); }); RainLabUsersController::extend(function (RainLabUsersController $users) { if (!isset($users->relationConfig)) { $users->addDynamicProperty('relationConfig'); } + $myConfigPath = '$/offline/mall/controllers/users/config_relation.yaml'; $users->relationConfig = $users->mergeConfig( $users->relationConfig, $myConfigPath ); + // Extend the Users controller with the Relation behaviour that is needed // to display the addresses relation widget above. - if (!$users->isClassExtendedWith('Backend.Behaviors.RelationController')) { - $users->extendClassWith(\Backend\Behaviors\RelationController::class); + // RainLab.User 3.0 does not need this. + if (!class_exists(\RainLab\User\Models\Setting::class)) { + if (!$users->isClassExtendedWith(\Backend\Behaviors\RelationController::class)) { + $users->extendClassWith(\Backend\Behaviors\RelationController::class); + } } }); - MallUser::extend(function ($model) { - $model->rules['surname'] = 'required'; - $model->rules['name'] = 'required'; - }); - // Add Customer Groups menu entry to RainLab.User Event::listen('backend.menu.extendItems', function ($manager) { $manager->addSideMenuItems('RainLab.User', 'user', [ @@ -128,16 +155,59 @@ protected function extendRainLabUser() 'emptyOption' => trans('offline.mall::lang.common.none'), 'tab' => 'offline.mall::lang.plugin.name', ], - // - // This feature is blocked by https://github.com/octobercms/october/issues/2508 - // - // 'addresses' => [ - // 'label' => trans('offline.mall::lang.common.addresses'), - // 'type' => 'partial', - // 'path' => '$/offline/mall/controllers/users/_addresses.htm', - // 'tab' => 'offline.mall::lang.plugin.name', - // ], + //'addresses' => [ + // 'label' => trans('offline.mall::lang.common.addresses'), + // 'type' => 'partial', + // 'path' => '$/offline/mall/controllers/users/_addresses.htm', + // 'tab' => 'offline.mall::lang.plugin.name', + //], ]); }, 5); + + // Add Customer Group on RainLab.User List + Event::listen('backend.list.extendColumns', function (Lists $list) { + if (!$list->getController() instanceof \RainLab\User\Controllers\Users) { + return; + } + + if (!$list->getModel() instanceof \RainLab\User\Models\User) { + return; + } + + // Add a new column + $list->addColumns([ + 'customer_group' => [ + 'label' => trans('offline.mall::lang.common.customer_group'), + 'default' => '', + 'after' => 'email', + 'relation' => 'customer_group', + 'select' => 'name', + 'sortable' => true + ] + ]); + }); + + // Add Customer Group on RainLab.User List + Event::listen('backend.filter.extendScopes', function (Filter $filter) { + if (!$filter->getController() instanceof \RainLab\User\Controllers\Users) { + return; + } + + if (!$filter->getModel() instanceof \RainLab\User\Models\User) { + return; + } + + $filter->addScopes([ + 'has_customer' => [ + 'label' => trans('offline.mall::lang.order.customer'), + 'type' => 'switch', + 'conditions' => [ + 'offline_mall_customers.id = null', + 'offline_mall_customers.id <> null', + ], + 'modelScope' => 'hasCustomerFilter' + ] + ]); + }); } } diff --git a/classes/registration/BootRelations.php b/classes/registration/BootRelations.php deleted file mode 100644 index 12115d8af..000000000 --- a/classes/registration/BootRelations.php +++ /dev/null @@ -1,35 +0,0 @@ - Variant::class, - Product::MORPH_KEY => Product::class, - ImageSet::MORPH_KEY => ImageSet::class, - Discount::MORPH_KEY => Discount::class, - CustomField::MORPH_KEY => CustomField::class, - PaymentMethod::MORPH_KEY => PaymentMethod::class, - ShippingMethod::MORPH_KEY => ShippingMethod::class, - CustomFieldOption::MORPH_KEY => CustomFieldOption::class, - ShippingMethodRate::MORPH_KEY => ShippingMethodRate::class, - ServiceOption::MORPH_KEY => ServiceOption::class, - ]); - } -} diff --git a/classes/registration/BootServiceContainer.php b/classes/registration/BootServiceContainer.php index 00dae883a..142859f67 100644 --- a/classes/registration/BootServiceContainer.php +++ b/classes/registration/BootServiceContainer.php @@ -2,15 +2,13 @@ namespace OFFLINE\Mall\Classes\Registration; -use DB; -use PDO; use Barryvdh\DomPDF\Facade; use Barryvdh\DomPDF\PDF; +use DB; use Dompdf\Dompdf; use Hashids\Hashids; use Illuminate\Foundation\AliasLoader; use Illuminate\Support\Facades\Cache; -use OFFLINE\Mall\Classes\Customer\AuthManager; use OFFLINE\Mall\Classes\Customer\DefaultSignInHandler; use OFFLINE\Mall\Classes\Customer\DefaultSignUpHandler; use OFFLINE\Mall\Classes\Customer\SignInHandler; @@ -28,6 +26,7 @@ use OFFLINE\Mall\Classes\Utils\DefaultMoney; use OFFLINE\Mall\Classes\Utils\Money; use OFFLINE\Mall\Models\GeneralSettings; +use PDO; trait BootServiceContainer { @@ -54,9 +53,6 @@ protected function registerServices() $this->app->singleton(Hashids::class, function () { return new Hashids(config('app.key', 'oc-mall'), 8); }); - $this->app->singleton('user.auth', function () { - return AuthManager::instance(); - }); $this->app->bind(Index::class, function () { $driver = Cache::rememberForever('offline_mall.mysql.index.driver', function () { $driver = GeneralSettings::get('index_driver'); diff --git a/classes/registration/BootValidation.php b/classes/registration/BootValidation.php index 00be3941b..0144b91ec 100644 --- a/classes/registration/BootValidation.php +++ b/classes/registration/BootValidation.php @@ -2,7 +2,7 @@ namespace OFFLINE\Mall\Classes\Registration; -use OFFLINE\Mall\Models\User as RainLabUser; +use RainLab\User\Models\User; use Validator; trait BootValidation @@ -10,12 +10,12 @@ trait BootValidation protected function registerValidationRules() { Validator::extend('non_existing_user', function ($attribute, $value, $parameters) { - return RainLabUser - ::with('customer') + return User::with('customer') ->where('email', $value) ->whereHas('customer', function ($q) { $q->where('is_guest', 0); - })->count() === 0; + }) + ->count() === 0; }); } } diff --git a/classes/traits/FilteredTaxes.php b/classes/traits/FilteredTaxes.php index 0989a654a..934701962 100644 --- a/classes/traits/FilteredTaxes.php +++ b/classes/traits/FilteredTaxes.php @@ -7,7 +7,7 @@ use October\Rain\Support\Collection; use OFFLINE\Mall\Models\Cart; use OFFLINE\Mall\Models\Tax; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; use Event; diff --git a/classes/traits/HashIds.php b/classes/traits/HashIds.php index 47de5c503..0afbe15b6 100644 --- a/classes/traits/HashIds.php +++ b/classes/traits/HashIds.php @@ -22,13 +22,18 @@ public function getHashIdAttribute() * @param string $value * @return mixed */ - public function decode(string $value) + public function decode(string $value = null) { - $result = app(Hasher::class)->decode($value) ?? null; - if (is_array($result) && count($result) === 1) { - return $result[0]; - } else { - return $result; + if (!$value) { + return null; + } + + try { + $result = app(Hasher::class)->decode($value) ?? null; + + return is_array($result) && count($result) === 1 ? $result[0] : $result; + } catch (\Exception $e) { + return null; } } diff --git a/classes/traits/PriceAccessors.php b/classes/traits/PriceAccessors.php index a917233b2..b0fd03e5e 100644 --- a/classes/traits/PriceAccessors.php +++ b/classes/traits/PriceAccessors.php @@ -1,5 +1,4 @@ -mapWithKeys(function ($price) { + return Collection::wrap($items)->mapWithKeys(function ($price) { $code = $price->currency->code; $product = null; diff --git a/classes/traits/ProductPriceAccessors.php b/classes/traits/ProductPriceAccessors.php index 89a04f3ef..00ac6bef6 100644 --- a/classes/traits/ProductPriceAccessors.php +++ b/classes/traits/ProductPriceAccessors.php @@ -1,87 +1,122 @@ -customer_group_prices; - $filter = function ($query) use ($group) { return $query->where('customer_group_id', $group->id); }; $price = $this->withFilter($filter, $prices->where('currency_id', $currency->id))->first(); + if ($price) { + return $price; + } - return $price - ?? $this->nullPrice( - $currency, - $this->withFilter($filter, $prices), - 'customer_group_prices', - $filter - ); + return $this->nullPrice( + $currency, + $this->withFilter($filter, $prices), + 'customer_group_prices', + $filter + ); } + /** + * Undocumented function + * @param int|PriceCategory $category + * @param mixed $currency + * @return mixed + */ public function additionalPrice($category, $currency = null) { - $currency = Currency::resolve($currency); - - $prices = $this->additional_prices; - if ($category instanceof PriceCategory) { $category = $category->id; } + $currency = Currency::resolve($currency); + $prices = $this->additional_prices; $filter = function ($query) use ($category) { return $query->where('price_category_id', $category); }; - $query = $this->withFilter($filter, $prices->where('currency_id', $currency->id)); + $price = $this->withFilter($filter, $prices->where('currency_id', $currency->id))->first(); + if ($price) { + return $price; + } - return $query->first() - ?? $this->nullPrice( - $currency, - $this->withFilter($filter, $prices), - 'additional_prices', - $filter - ); + return $this->nullPrice( + $currency, + $this->withFilter($filter, $prices), + 'additional_prices', + $filter + ); } + /** + * Undocumented function + * @deprecated 3.2.2 - The oldPrice category has been made optional. + * @return mixed + */ public function oldPriceRelations() { $oldPrice = PriceCategory::where('code', 'old_price')->first(); if ($oldPrice) { return $this->additional_prices->where('price_category_id', $oldPrice->id); - } else { - return []; } + + return new Collection(); } + /** + * Undocumented function + * @deprecated 3.2.2 - The oldPrice category has been made optional. + * @param mixed $currency + * @return mixed + */ public function oldPrice($currency = null) { $oldPrice = PriceCategory::where('code', 'old_price')->first(); if ($oldPrice) { return $this->additionalPrice($oldPrice, $currency); - } else { - return null; } - } + return null; + } + + /** + * Undocumented function + * @deprecated 3.2.2 - The oldPrice category has been made optional. + * @return mixed + */ public function getOldPriceAttribute() { return $this->mapCurrencyPrices($this->oldPriceRelations()); } - public function getOnSaleAttribute() + /** + * Undocumented function + * @deprecated 3.2.2 - The oldPrice category has been made optional. + * @return boolean + */ + public function getOnSaleAttribute(): bool { - return $this->old_price->count() > 0; + $price = $this->old_price; + + return $price && $price->count() > 0; } } diff --git a/classes/traits/UserSpecificPrice.php b/classes/traits/UserSpecificPrice.php index 62f447a01..3b745e281 100644 --- a/classes/traits/UserSpecificPrice.php +++ b/classes/traits/UserSpecificPrice.php @@ -4,7 +4,7 @@ use OFFLINE\Mall\Models\CustomerGroup; use OFFLINE\Mall\Models\Price; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; trait UserSpecificPrice { diff --git a/classes/traits/cart/Discounts.php b/classes/traits/cart/Discounts.php index e9459f660..56d007a5a 100644 --- a/classes/traits/cart/Discounts.php +++ b/classes/traits/cart/Discounts.php @@ -7,7 +7,7 @@ use Illuminate\Support\Facades\DB; use October\Rain\Exception\ValidationException; use OFFLINE\Mall\Models\Discount; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; trait Discounts { diff --git a/classes/user/Auth.php b/classes/user/Auth.php new file mode 100644 index 000000000..bc839e32f --- /dev/null +++ b/classes/user/Auth.php @@ -0,0 +1,18 @@ += 3.0) + */ +class Auth +{ + public static function __callStatic($method, $args) + { + if (class_exists(\RainLab\User\Facades\Auth::class)) { + return call_user_func_array([\RainLab\User\Facades\Auth::class, $method], $args); + } + + return call_user_func_array([\Illuminate\Support\Facades\Auth::class, $method], $args); + } +} \ No newline at end of file diff --git a/classes/user/Settings.php b/classes/user/Settings.php new file mode 100644 index 000000000..c32e33a76 --- /dev/null +++ b/classes/user/Settings.php @@ -0,0 +1,28 @@ += 3.0) + */ +class Settings +{ + const ACTIVATE_USER = 'user'; + + public static function getMinPasswordLength() + { + return Config::get('rainlab.user::minPasswordLength', Config::get('rainlab.user::password_policy.min_length', 8)); + } + + public static function __callStatic($method, $args) + { + if (class_exists(\RainLab\User\Models\Settings::class)) { + return call_user_func_array([\RainLab\User\Models\Settings::class, $method], $args); + } + + return call_user_func_array([\RainLab\User\Models\Setting::class, $method], $args); + + } +} \ No newline at end of file diff --git a/components/AddressForm.php b/components/AddressForm.php index a3f9141e4..0753d92a8 100644 --- a/components/AddressForm.php +++ b/components/AddressForm.php @@ -8,7 +8,7 @@ use OFFLINE\Mall\Models\Cart; use OFFLINE\Mall\Models\GeneralSettings; use RainLab\Location\Models\Country; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; /** * The AddressForm component displays a form to edit an address. diff --git a/components/AddressSelector.php b/components/AddressSelector.php index 22a62463c..ab27a7e81 100644 --- a/components/AddressSelector.php +++ b/components/AddressSelector.php @@ -11,7 +11,7 @@ use OFFLINE\Mall\Models\Address; use OFFLINE\Mall\Models\Cart; use OFFLINE\Mall\Models\GeneralSettings; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; /** * The AddressSelector component displays a dropdown diff --git a/components/Cart.php b/components/Cart.php index 319aab8b7..2696cab22 100644 --- a/components/Cart.php +++ b/components/Cart.php @@ -10,7 +10,7 @@ use OFFLINE\Mall\Models\GeneralSettings; use OFFLINE\Mall\Models\ShippingMethod; use OFFLINE\Mall\Models\Variant; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; /** * The Cart component displays a user's cart. diff --git a/components/CustomerProfile.php b/components/CustomerProfile.php index 5db4e13dc..161ceb84e 100644 --- a/components/CustomerProfile.php +++ b/components/CustomerProfile.php @@ -5,6 +5,7 @@ use Auth; use DB; use October\Rain\Exception\ValidationException; +use October\Rain\Router\Rule; use October\Rain\Support\Facades\Flash; use OFFLINE\Mall\Classes\Customer\SignUpHandler; use RainLab\User\Models\User; @@ -77,9 +78,9 @@ public function onSubmit() 'password', 'password_repeat', ]); - $neededRules['email'] = 'unique:users'; + $neededRules['email'] = ['required', \Illuminate\Validation\Rule::unique('users', 'email')->ignore($this->user->id)]; - // The password is unchanged so we don't need to validate it. + // The password is unchanged, so we don't need to validate it. if ($data['password'] === '') { unset($neededRules['password'], $neededRules['password_repeat']); } diff --git a/components/MyAccount.php b/components/MyAccount.php index 3fb19b620..d76ffa3ea 100644 --- a/components/MyAccount.php +++ b/components/MyAccount.php @@ -8,7 +8,7 @@ use October\Rain\Exception\ValidationException; use October\Rain\Support\Facades\Flash; use OFFLINE\Mall\Models\GeneralSettings; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; /** * The MyAccount component displays an overview of a customer's account. @@ -123,7 +123,7 @@ public function onRun() * * @return string */ - public function pageUrl($page, $params = []) + public function getPageUrl($page, $params = []) { return $this->controller->pageUrl( $this->page->page->fileName, @@ -192,7 +192,7 @@ protected function isValidPage(): bool */ private function exitRedirect() { - return redirect()->to($this->pageUrl('orders')); + return redirect()->to($this->getPageUrl('orders')); } /** @@ -204,7 +204,7 @@ private function exitRedirect() private function cartRedirect() { $controller = Controller::getController() ?: new Controller; - $url = $controller->pageUrl(GeneralSettings::get('cart_page')); + $url = $controller->getPageUrl(GeneralSettings::get('cart_page')); return redirect()->to($url); } diff --git a/components/ProductReviews.php b/components/ProductReviews.php index 7ddd328a6..d93d6ada9 100644 --- a/components/ProductReviews.php +++ b/components/ProductReviews.php @@ -12,7 +12,7 @@ use OFFLINE\Mall\Models\Review; use OFFLINE\Mall\Models\ReviewCategory; use OFFLINE\Mall\Models\ReviewSettings; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; class ProductReviews extends ComponentBase { diff --git a/components/Products.php b/components/Products.php index 597aff4f0..c08d78f27 100644 --- a/components/Products.php +++ b/components/Products.php @@ -20,7 +20,7 @@ use OFFLINE\Mall\Models\GeneralSettings; use OFFLINE\Mall\Models\Product; use OFFLINE\Mall\Models\Variant; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; use Redirect; /** diff --git a/components/ProductsFilter.php b/components/ProductsFilter.php index c19baa3bc..c63125ea3 100644 --- a/components/ProductsFilter.php +++ b/components/ProductsFilter.php @@ -254,8 +254,8 @@ public function getCategoryOptions() public function init() { if ((bool)$this->property('includeSliderAssets')) { - $this->addJs('https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/11.0.3/nouislider.min.js'); - $this->addCss('https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/11.0.3/nouislider.min.css'); + $this->addJs('assets/js/nouislider.min.js'); + $this->addCss('assets/css/nouislider.min.css'); } $this->money = app(Money::class); } diff --git a/components/QuickCheckout.php b/components/QuickCheckout.php index c9099b828..9238ba7d4 100644 --- a/components/QuickCheckout.php +++ b/components/QuickCheckout.php @@ -18,10 +18,10 @@ use OFFLINE\Mall\Models\Order; use OFFLINE\Mall\Models\PaymentMethod; use OFFLINE\Mall\Models\ShippingMethod; -use OFFLINE\Mall\Models\User; use OFFLINE\Mall\Models\Variant; use RainLab\Location\Models\Country; -use RainLab\User\Facades\Auth as FrontendAuth; +use OFFLINE\Mall\Classes\User\Auth as FrontendAuth; +use RainLab\User\Models\User; use Validator; /** diff --git a/components/SignUp.php b/components/SignUp.php index bc91512b1..7527d06bd 100644 --- a/components/SignUp.php +++ b/components/SignUp.php @@ -7,7 +7,7 @@ use OFFLINE\Mall\Classes\Customer\SignUpHandler; use OFFLINE\Mall\Models\GeneralSettings; use RainLab\Location\Models\Country; -use RainLab\User\Models\Settings as UserSettings; +use OFFLINE\Mall\Classes\User\Settings as UserSettings; /** * The SignUp component displays a signup and login form diff --git a/components/WishlistButton.php b/components/WishlistButton.php index d7e48b1cd..7f03c7f3a 100644 --- a/components/WishlistButton.php +++ b/components/WishlistButton.php @@ -8,7 +8,7 @@ use OFFLINE\Mall\Classes\Traits\HashIds; use OFFLINE\Mall\Models\Wishlist; use OFFLINE\Mall\Models\WishlistItem; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; use Validator; class WishlistButton extends MallComponent diff --git a/components/Wishlists.php b/components/Wishlists.php index a87ee55c9..dce9c7e6c 100644 --- a/components/Wishlists.php +++ b/components/Wishlists.php @@ -13,7 +13,7 @@ use OFFLINE\Mall\Models\ShippingMethod; use OFFLINE\Mall\Models\Wishlist; use OFFLINE\Mall\Models\WishlistItem; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; class Wishlists extends MallComponent { diff --git a/composer.json b/composer.json index b9106d047..aa280d2aa 100644 --- a/composer.json +++ b/composer.json @@ -24,8 +24,8 @@ "league/omnipay": "^3.2", "omnipay/paypal": "^3.0", "omnipay/stripe": "^3.0", - "rainlab/user-plugin": "^1.6|^2.0", - "rainlab/location-plugin": "^1.2", + "rainlab/user-plugin": "^1.6|^2.0|^3.0", + "rainlab/location-plugin": "^1.2|^2.0", "rainlab/translate-plugin": "^1.9|^2.0", "whitecube/php-prices": "^2.0|^3.0" }, diff --git a/controllers/products/_missing_file_hint.htm b/controllers/products/_missing_file_hint.htm index db938b854..f1466028b 100644 --- a/controllers/products/_missing_file_hint.htm +++ b/controllers/products/_missing_file_hint.htm @@ -3,7 +3,7 @@


- .

diff --git a/src/docs/.vitepress/components/BadgeStd.vue b/docs/.vitepress/components/BadgeStd.vue similarity index 100% rename from src/docs/.vitepress/components/BadgeStd.vue rename to docs/.vitepress/components/BadgeStd.vue diff --git a/src/docs/.vitepress/components/CatalogueIcon.vue b/docs/.vitepress/components/CatalogueIcon.vue similarity index 100% rename from src/docs/.vitepress/components/CatalogueIcon.vue rename to docs/.vitepress/components/CatalogueIcon.vue diff --git a/src/docs/.vitepress/components/OrdersIcon.vue b/docs/.vitepress/components/OrdersIcon.vue similarity index 100% rename from src/docs/.vitepress/components/OrdersIcon.vue rename to docs/.vitepress/components/OrdersIcon.vue diff --git a/src/docs/.vitepress/components/SpoilerStd.vue b/docs/.vitepress/components/SpoilerStd.vue similarity index 100% rename from src/docs/.vitepress/components/SpoilerStd.vue rename to docs/.vitepress/components/SpoilerStd.vue diff --git a/src/docs/.vitepress/config.mts b/docs/.vitepress/config.mts similarity index 99% rename from src/docs/.vitepress/config.mts rename to docs/.vitepress/config.mts index fe21ea06a..b3ce13b14 100644 --- a/src/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -4,6 +4,7 @@ import { defineConfig } from 'vitepress' export default defineConfig({ title: "Mall OctoberCMS Plugin", description: "The all-inclusive e-commerce solution for OctoberCMS.", + base: '/oc-mall-plugin/', vite: { server: { port: 3003 diff --git a/src/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts similarity index 100% rename from src/docs/.vitepress/theme/index.ts rename to docs/.vitepress/theme/index.ts diff --git a/src/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css similarity index 100% rename from src/docs/.vitepress/theme/style.css rename to docs/.vitepress/theme/style.css diff --git a/src/docs/development/changelog/latest.md b/docs/development/changelog/latest.md similarity index 100% rename from src/docs/development/changelog/latest.md rename to docs/development/changelog/latest.md diff --git a/src/docs/development/changelog/v1.md b/docs/development/changelog/v1.md similarity index 100% rename from src/docs/development/changelog/v1.md rename to docs/development/changelog/v1.md diff --git a/src/docs/development/changelog/v2.md b/docs/development/changelog/v2.md similarity index 100% rename from src/docs/development/changelog/v2.md rename to docs/development/changelog/v2.md diff --git a/src/docs/development/changelog/v3.md b/docs/development/changelog/v3.md similarity index 100% rename from src/docs/development/changelog/v3.md rename to docs/development/changelog/v3.md diff --git a/src/docs/development/core/cart-model.md b/docs/development/core/cart-model.md similarity index 83% rename from src/docs/development/core/cart-model.md rename to docs/development/core/cart-model.md index 0099e371f..939a1e57d 100644 --- a/src/docs/development/core/cart-model.md +++ b/docs/development/core/cart-model.md @@ -1,8 +1,6 @@ # Cart model -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Cart` model represents a customer's shopping cart. diff --git a/src/docs/development/core/console-commands.md b/docs/development/core/console-commands.md similarity index 88% rename from src/docs/development/core/console-commands.md rename to docs/development/core/console-commands.md index 886dae7fa..b85ebb210 100644 --- a/src/docs/development/core/console-commands.md +++ b/docs/development/core/console-commands.md @@ -1,8 +1,6 @@ # Console commands -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + ## `mall:check` diff --git a/src/docs/development/core/events.md b/docs/development/core/events.md similarity index 95% rename from src/docs/development/core/events.md rename to docs/development/core/events.md index 3a660c532..b558d14d3 100644 --- a/src/docs/development/core/events.md +++ b/docs/development/core/events.md @@ -1,8 +1,6 @@ # Events -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The oc-mall plugin emits the following events: diff --git a/src/docs/development/core/integration.md b/docs/development/core/integration.md similarity index 83% rename from src/docs/development/core/integration.md rename to docs/development/core/integration.md index ea8a3d300..0bd40b020 100644 --- a/src/docs/development/core/integration.md +++ b/docs/development/core/integration.md @@ -1,8 +1,6 @@ # Integration with other Plugins -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + ## OFFLINE.SiteSearch diff --git a/src/docs/development/core/order-model.md b/docs/development/core/order-model.md similarity index 92% rename from src/docs/development/core/order-model.md rename to docs/development/core/order-model.md index 64c4ad561..d019b419c 100644 --- a/src/docs/development/core/order-model.md +++ b/docs/development/core/order-model.md @@ -1,8 +1,6 @@ # Order model -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Order` model represents a customer's completed order. diff --git a/src/docs/development/core/payment-providers.md b/docs/development/core/payment-providers.md similarity index 96% rename from src/docs/development/core/payment-providers.md rename to docs/development/core/payment-providers.md index 53032227f..df23275ac 100644 --- a/src/docs/development/core/payment-providers.md +++ b/docs/development/core/payment-providers.md @@ -1,8 +1,6 @@ # Payment providers -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + You can add your own payment provider by providing an implementation of a `PaymentProvider` class. diff --git a/src/docs/development/core/pdf.md b/docs/development/core/pdf.md similarity index 81% rename from src/docs/development/core/pdf.md rename to docs/development/core/pdf.md index 111710043..3a5c178a0 100644 --- a/src/docs/development/core/pdf.md +++ b/docs/development/core/pdf.md @@ -1,8 +1,6 @@ # PDF -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Mall bundles the great [barryvdh/laravel-dompdf](https://github.com/barryvdh/laravel-dompdf/) to generate PDF files. diff --git a/src/docs/development/core/price-bag.md b/docs/development/core/price-bag.md similarity index 100% rename from src/docs/development/core/price-bag.md rename to docs/development/core/price-bag.md diff --git a/src/docs/development/core/pricing-information.md b/docs/development/core/pricing-information.md similarity index 92% rename from src/docs/development/core/pricing-information.md rename to docs/development/core/pricing-information.md index 0534135dc..9380acfeb 100644 --- a/src/docs/development/core/pricing-information.md +++ b/docs/development/core/pricing-information.md @@ -1,8 +1,6 @@ # Pricing information -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + By default the following models have pricing information associated with them: diff --git a/src/docs/development/core/product-model.md b/docs/development/core/product-model.md similarity index 91% rename from src/docs/development/core/product-model.md rename to docs/development/core/product-model.md index e3169f22d..06c2cc38e 100644 --- a/src/docs/development/core/product-model.md +++ b/docs/development/core/product-model.md @@ -1,8 +1,6 @@ # Product model -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Product` model is the central entity of your shop installation. diff --git a/src/docs/development/core/variant-model.md b/docs/development/core/variant-model.md similarity index 89% rename from src/docs/development/core/variant-model.md rename to docs/development/core/variant-model.md index db5a78706..e902c7024 100644 --- a/src/docs/development/core/variant-model.md +++ b/docs/development/core/variant-model.md @@ -1,8 +1,6 @@ # Variant model -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + A `Variant` model always belongs to a parent [Product model](./product-model.md). diff --git a/src/docs/development/core/wishlist-model.md b/docs/development/core/wishlist-model.md similarity index 81% rename from src/docs/development/core/wishlist-model.md rename to docs/development/core/wishlist-model.md index 02f8e7fe0..c7c96b499 100644 --- a/src/docs/development/core/wishlist-model.md +++ b/docs/development/core/wishlist-model.md @@ -1,8 +1,6 @@ # Wishlist model -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Wishlist` model represents a customer's wishlist. diff --git a/src/docs/development/extend/unit-testing.md b/docs/development/extend/unit-testing.md similarity index 100% rename from src/docs/development/extend/unit-testing.md rename to docs/development/extend/unit-testing.md diff --git a/src/docs/development/index.md b/docs/development/index.md similarity index 100% rename from src/docs/development/index.md rename to docs/development/index.md diff --git a/src/docs/development/roadmap.md b/docs/development/roadmap.md similarity index 100% rename from src/docs/development/roadmap.md rename to docs/development/roadmap.md diff --git a/src/docs/guide/components/address-form.md b/docs/guide/components/address-form.md similarity index 78% rename from src/docs/guide/components/address-form.md rename to docs/guide/components/address-form.md index 7282bc5bf..fe0b61417 100644 --- a/src/docs/guide/components/address-form.md +++ b/docs/guide/components/address-form.md @@ -1,8 +1,6 @@ # AddressForm -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `AddressForm` component displays a address edit form. diff --git a/src/docs/guide/components/address-list.md b/docs/guide/components/address-list.md similarity index 69% rename from src/docs/guide/components/address-list.md rename to docs/guide/components/address-list.md index 08daa4535..38df0b0bf 100644 --- a/src/docs/guide/components/address-list.md +++ b/docs/guide/components/address-list.md @@ -1,8 +1,6 @@ # AddressList -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `AddressList` component displays a list of a user's addresses. diff --git a/src/docs/guide/components/address-selector.md b/docs/guide/components/address-selector.md similarity index 78% rename from src/docs/guide/components/address-selector.md rename to docs/guide/components/address-selector.md index d348ad332..b8f7277e8 100644 --- a/src/docs/guide/components/address-selector.md +++ b/docs/guide/components/address-selector.md @@ -1,8 +1,6 @@ # AddressSelector -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `AddressSelector` component displays an address that belongs to the user's cart. It gives the user the ability to edit it or select a different address. diff --git a/src/docs/guide/components/cart.md b/docs/guide/components/cart.md similarity index 94% rename from src/docs/guide/components/cart.md rename to docs/guide/components/cart.md index b4011ae4f..340680863 100644 --- a/src/docs/guide/components/cart.md +++ b/docs/guide/components/cart.md @@ -1,8 +1,6 @@ # Cart -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Cart` component displays the currently logged in user's cart. diff --git a/src/docs/guide/components/checkout.md b/docs/guide/components/checkout.md similarity index 77% rename from src/docs/guide/components/checkout.md rename to docs/guide/components/checkout.md index 786433f03..5f88c5bb8 100644 --- a/src/docs/guide/components/checkout.md +++ b/docs/guide/components/checkout.md @@ -1,8 +1,6 @@ # Checkout -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Checkout` component orchestrates the complete checkout process. An alternative to this component is the [QuickCheckout](./quick-checkout.md) component. diff --git a/src/docs/guide/components/currency-picker.md b/docs/guide/components/currency-picker.md similarity index 54% rename from src/docs/guide/components/currency-picker.md rename to docs/guide/components/currency-picker.md index 9a82e2037..70b0990be 100644 --- a/src/docs/guide/components/currency-picker.md +++ b/docs/guide/components/currency-picker.md @@ -1,8 +1,6 @@ # CurrencyPicker -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `CurrencyPicker` component displays a dropdown to change the active Currency. diff --git a/src/docs/guide/components/customer-profile.md b/docs/guide/components/customer-profile.md similarity index 64% rename from src/docs/guide/components/customer-profile.md rename to docs/guide/components/customer-profile.md index 8d5581bdf..a25e00b74 100644 --- a/src/docs/guide/components/customer-profile.md +++ b/docs/guide/components/customer-profile.md @@ -1,8 +1,6 @@ # CustomerProfile -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `CustomerProfile` component displays a form to edit a user's profile. diff --git a/src/docs/guide/components/discount-applier.md b/docs/guide/components/discount-applier.md similarity index 66% rename from src/docs/guide/components/discount-applier.md rename to docs/guide/components/discount-applier.md index 1b25d159d..0ae5044fb 100644 --- a/src/docs/guide/components/discount-applier.md +++ b/docs/guide/components/discount-applier.md @@ -1,8 +1,6 @@ # DiscountApplier -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `DiscountApplier` component allows the user to enter a discount code. diff --git a/src/docs/guide/components/mall-dependencies.md b/docs/guide/components/mall-dependencies.md similarity index 57% rename from src/docs/guide/components/mall-dependencies.md rename to docs/guide/components/mall-dependencies.md index fec39926e..a9f0500d6 100644 --- a/src/docs/guide/components/mall-dependencies.md +++ b/docs/guide/components/mall-dependencies.md @@ -1,8 +1,6 @@ # mallDependencies -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `mallDependencies` component includes all required frontend assets. diff --git a/src/docs/guide/components/my-account.md b/docs/guide/components/my-account.md similarity index 79% rename from src/docs/guide/components/my-account.md rename to docs/guide/components/my-account.md index f99c74f1b..93096eaa6 100644 --- a/src/docs/guide/components/my-account.md +++ b/docs/guide/components/my-account.md @@ -1,8 +1,6 @@ # MyAccount -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `MyAccount` component displays an overview of the user's account. diff --git a/src/docs/guide/components/orders-list.md b/docs/guide/components/orders-list.md similarity index 63% rename from src/docs/guide/components/orders-list.md rename to docs/guide/components/orders-list.md index 77ec49de0..27695f796 100644 --- a/src/docs/guide/components/orders-list.md +++ b/docs/guide/components/orders-list.md @@ -1,8 +1,6 @@ # OrdersList -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `OrdersList` component displays a list of all the currently logged in user's orders. diff --git a/src/docs/guide/components/payment-method-selector.md b/docs/guide/components/payment-method-selector.md similarity index 66% rename from src/docs/guide/components/payment-method-selector.md rename to docs/guide/components/payment-method-selector.md index 88feb07de..158265fed 100644 --- a/src/docs/guide/components/payment-method-selector.md +++ b/docs/guide/components/payment-method-selector.md @@ -1,8 +1,6 @@ # PaymentMethodSelector -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `PaymentMethodSelector` component displays all available payment methods and let's the user provide additional data. diff --git a/src/docs/guide/components/product-reviews.md b/docs/guide/components/product-reviews.md similarity index 75% rename from src/docs/guide/components/product-reviews.md rename to docs/guide/components/product-reviews.md index affb5f626..9b2039180 100644 --- a/src/docs/guide/components/product-reviews.md +++ b/docs/guide/components/product-reviews.md @@ -1,8 +1,6 @@ # ProductReviews -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `ProductReviews` component displays all Reviews for a Product or Variant. diff --git a/src/docs/guide/components/product.md b/docs/guide/components/product.md similarity index 89% rename from src/docs/guide/components/product.md rename to docs/guide/components/product.md index 228f19a42..aab7662dc 100644 --- a/src/docs/guide/components/product.md +++ b/docs/guide/components/product.md @@ -1,8 +1,6 @@ # Product -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Product` component displays a single [`Product` or `Variant`](/guide/usage/products). diff --git a/src/docs/guide/components/products-filter.md b/docs/guide/components/products-filter.md similarity index 91% rename from src/docs/guide/components/products-filter.md rename to docs/guide/components/products-filter.md index 793d90d2e..c4db433fb 100644 --- a/src/docs/guide/components/products-filter.md +++ b/docs/guide/components/products-filter.md @@ -1,8 +1,6 @@ # ProductsFilter -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `ProductsFilter` displays filters for a category. It's selection will be applied to a result set displayed by the [Products component](./products.md). diff --git a/src/docs/guide/components/products.md b/docs/guide/components/products.md similarity index 95% rename from src/docs/guide/components/products.md rename to docs/guide/components/products.md index f9af79944..132612d90 100644 --- a/src/docs/guide/components/products.md +++ b/docs/guide/components/products.md @@ -1,8 +1,6 @@ # Products -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `Products` component displays a list of products. The list can be sorted, filtered and paginated. diff --git a/src/docs/guide/components/quick-checkout.md b/docs/guide/components/quick-checkout.md similarity index 78% rename from src/docs/guide/components/quick-checkout.md rename to docs/guide/components/quick-checkout.md index 6a1d66894..f68f3324f 100644 --- a/src/docs/guide/components/quick-checkout.md +++ b/docs/guide/components/quick-checkout.md @@ -1,8 +1,6 @@ # QuickCheckout -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `QuickCheckout` component allows the creation of an order on a single page. This component is meant as an alternative to the [Checkout](./checkout.md) component. diff --git a/src/docs/guide/components/shipping-method-selector.md b/docs/guide/components/shipping-method-selector.md similarity index 64% rename from src/docs/guide/components/shipping-method-selector.md rename to docs/guide/components/shipping-method-selector.md index 1384926bc..720c05059 100644 --- a/src/docs/guide/components/shipping-method-selector.md +++ b/docs/guide/components/shipping-method-selector.md @@ -1,8 +1,6 @@ # ShippingMethodSelector -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `ShippingMethodSelector` component displays all available shipping methods. diff --git a/src/docs/guide/components/sign-up.md b/docs/guide/components/sign-up.md similarity index 62% rename from src/docs/guide/components/sign-up.md rename to docs/guide/components/sign-up.md index 72b373d03..cd2319c9d 100644 --- a/src/docs/guide/components/sign-up.md +++ b/docs/guide/components/sign-up.md @@ -1,8 +1,6 @@ # signUp -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `SignUp` component displays sign up and sign in forms for user authentication. diff --git a/src/docs/guide/components/wishlist-button.md b/docs/guide/components/wishlist-button.md similarity index 86% rename from src/docs/guide/components/wishlist-button.md rename to docs/guide/components/wishlist-button.md index c6f3aabac..fb341c6a1 100644 --- a/src/docs/guide/components/wishlist-button.md +++ b/docs/guide/components/wishlist-button.md @@ -1,8 +1,6 @@ # WishlistButton -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `wishlistButton` component displays a `Add to wishlist` button. diff --git a/src/docs/guide/components/wishlists.md b/docs/guide/components/wishlists.md similarity index 81% rename from src/docs/guide/components/wishlists.md rename to docs/guide/components/wishlists.md index 69508b065..50c2c6923 100644 --- a/src/docs/guide/components/wishlists.md +++ b/docs/guide/components/wishlists.md @@ -1,8 +1,6 @@ # Wishlists -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + The `wishlists` component displays all wishlists of the currently logged in customer. diff --git a/src/docs/guide/index.md b/docs/guide/index.md similarity index 100% rename from src/docs/guide/index.md rename to docs/guide/index.md diff --git a/src/docs/guide/introduction/configuration.md b/docs/guide/introduction/configuration.md similarity index 100% rename from src/docs/guide/introduction/configuration.md rename to docs/guide/introduction/configuration.md diff --git a/src/docs/guide/introduction/installation.md b/docs/guide/introduction/installation.md similarity index 100% rename from src/docs/guide/introduction/installation.md rename to docs/guide/introduction/installation.md diff --git a/src/docs/guide/usage/analytics.md b/docs/guide/usage/analytics.md similarity index 95% rename from src/docs/guide/usage/analytics.md rename to docs/guide/usage/analytics.md index 93cf23f33..70b2830c0 100644 --- a/src/docs/guide/usage/analytics.md +++ b/docs/guide/usage/analytics.md @@ -1,8 +1,6 @@ # Analytics -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + ## Google Merchant Center Feed diff --git a/src/docs/guide/usage/categories.md b/docs/guide/usage/categories.md similarity index 75% rename from src/docs/guide/usage/categories.md rename to docs/guide/usage/categories.md index 2da8c5e8d..efe7a1bfa 100644 --- a/src/docs/guide/usage/categories.md +++ b/docs/guide/usage/categories.md @@ -1,8 +1,6 @@ # Categories -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Categories are used to organize [Products](./products.md) in your store. They also define the [Properties]( ./properties.md) that will be available for all related Products. diff --git a/src/docs/guide/usage/currencies.md b/docs/guide/usage/currencies.md similarity index 76% rename from src/docs/guide/usage/currencies.md rename to docs/guide/usage/currencies.md index 8ab5adc56..a72c43f6a 100644 --- a/src/docs/guide/usage/currencies.md +++ b/docs/guide/usage/currencies.md @@ -1,8 +1,6 @@ # Currencies -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Currencies can be managed via `Backend settings > Mall: General > Currencies`. They are used for all pricing information in the plugin. diff --git a/src/docs/guide/usage/going-live.md b/docs/guide/usage/going-live.md similarity index 86% rename from src/docs/guide/usage/going-live.md rename to docs/guide/usage/going-live.md index b740fca23..c4438a3b3 100644 --- a/src/docs/guide/usage/going-live.md +++ b/docs/guide/usage/going-live.md @@ -1,8 +1,6 @@ # Going Live -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Once everything is set up and you have deployed your oc-mall installation to a production server you, can use the checklist on this page to make sure everything is running smoothly. diff --git a/src/docs/guide/usage/payment-methods.md b/docs/guide/usage/payment-methods.md similarity index 92% rename from src/docs/guide/usage/payment-methods.md rename to docs/guide/usage/payment-methods.md index 7c5c1ec3f..4951179d2 100644 --- a/src/docs/guide/usage/payment-methods.md +++ b/docs/guide/usage/payment-methods.md @@ -1,8 +1,6 @@ # Payments -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + ## Payment gateways diff --git a/src/docs/guide/usage/products.md b/docs/guide/usage/products.md similarity index 92% rename from src/docs/guide/usage/products.md rename to docs/guide/usage/products.md index c5b18228f..114a09cfe 100644 --- a/src/docs/guide/usage/products.md +++ b/docs/guide/usage/products.md @@ -1,8 +1,6 @@ # Products and Variants -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + A Product is the central entity in `oc-mall`. diff --git a/src/docs/guide/usage/properties.md b/docs/guide/usage/properties.md similarity index 93% rename from src/docs/guide/usage/properties.md rename to docs/guide/usage/properties.md index 69d28da34..20d4f70a5 100644 --- a/src/docs/guide/usage/properties.md +++ b/docs/guide/usage/properties.md @@ -1,8 +1,6 @@ # Properties -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Properties are used to describe a [Product or Variant](./products.md) in your store. diff --git a/src/docs/guide/usage/reviews.md b/docs/guide/usage/reviews.md similarity index 83% rename from src/docs/guide/usage/reviews.md rename to docs/guide/usage/reviews.md index 631a016bc..f40f67733 100644 --- a/src/docs/guide/usage/reviews.md +++ b/docs/guide/usage/reviews.md @@ -1,8 +1,6 @@ # Reviews -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Reviews can be added for a Product or Variant. diff --git a/src/docs/guide/usage/services.md b/docs/guide/usage/services.md similarity index 79% rename from src/docs/guide/usage/services.md rename to docs/guide/usage/services.md index 2485b1786..1ce906635 100644 --- a/src/docs/guide/usage/services.md +++ b/docs/guide/usage/services.md @@ -1,8 +1,6 @@ # Services -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Services are additional offerings for a product (e. g. extended warranty, on-site installation). diff --git a/src/docs/guide/usage/shipping-methods.md b/docs/guide/usage/shipping-methods.md similarity index 87% rename from src/docs/guide/usage/shipping-methods.md rename to docs/guide/usage/shipping-methods.md index da4495200..2c7401338 100644 --- a/src/docs/guide/usage/shipping-methods.md +++ b/docs/guide/usage/shipping-methods.md @@ -1,8 +1,6 @@ # Shipping methods -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + `Shipping methods` are presented to a customer during checkout. diff --git a/src/docs/guide/usage/taxes.md b/docs/guide/usage/taxes.md similarity index 71% rename from src/docs/guide/usage/taxes.md rename to docs/guide/usage/taxes.md index 1bb9072f9..1bf33ef27 100644 --- a/src/docs/guide/usage/taxes.md +++ b/docs/guide/usage/taxes.md @@ -1,8 +1,6 @@ # Taxes -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + Taxes can be applied to [Products and Variants](/guide/usage/products), [Shipping methods](/guide/usage/shipping-methods) and [Payment methods](/guide/usage/payment-methods). diff --git a/src/docs/guide/usage/virtual-products.md b/docs/guide/usage/virtual-products.md similarity index 93% rename from src/docs/guide/usage/virtual-products.md rename to docs/guide/usage/virtual-products.md index 9d93d40fa..f0653c2d3 100644 --- a/src/docs/guide/usage/virtual-products.md +++ b/docs/guide/usage/virtual-products.md @@ -1,8 +1,6 @@ # Virtual products -> [!DANGER] Work in Progress -> We are currently revising our documentation and the page you are currently looking at has not yet -> been completed. Thus, the information here may therefore be incomplete or out of date. + If a product is not something physical (like a file), you can mark it as "virtual". @@ -79,9 +77,9 @@ class Plugin extends PluginBase // Make sure the event is triggered by a product you care about. Validate this using the slug, the // assigned category or one of the other unique values (user_defined_id, gtin, mpn, etc). // In this example we check if the product belongs to a category that has the - // "generate-gift-cards" code set as a custom code. + // "gift-cards" code set as a custom code. $isGiftCardCategory = $product->categories->contains(function (Category $category) { - return $category->code === 'generate-gift-cards'; + return $category->code === 'gift-cards'; }); // Exit here if this is not a product with a gift card category attached. if ( ! $isGiftCardCategory) { diff --git a/src/docs/index.md b/docs/index.md similarity index 100% rename from src/docs/index.md rename to docs/index.md diff --git a/src/docs/public/mall-logo-dark.svg b/docs/public/mall-logo-dark.svg similarity index 100% rename from src/docs/public/mall-logo-dark.svg rename to docs/public/mall-logo-dark.svg diff --git a/src/docs/public/mall-logo-light.svg b/docs/public/mall-logo-light.svg similarity index 100% rename from src/docs/public/mall-logo-light.svg rename to docs/public/mall-logo-light.svg diff --git a/lang/en/lang.php b/lang/en/lang.php index d8214dd8d..ed7d017b1 100644 --- a/lang/en/lang.php +++ b/lang/en/lang.php @@ -1158,6 +1158,11 @@ 'cancelled' => 'Set the state of the order as "cancelled"', ], ], + 'users' => [ + 'create_customer' => 'Create Customer', + 'customer_added' => 'The selected users have been extended with a customer account.', + 'no_customer_added' => 'No valid user found with without a customer account.', + ], 'customer_group' => [ 'code_comment' => 'This code can be used to identify this group programmatically', 'discount_comment' => 'Give this customer group a specific discount in % on your whole catalogue', diff --git a/models/Cart.php b/models/Cart.php index 3859e61af..02b4cb925 100644 --- a/models/Cart.php +++ b/models/Cart.php @@ -38,8 +38,14 @@ class Cart extends Model 'products' => [CartProduct::class, 'deleted' => true], ]; public $belongsTo = [ - 'shipping_method' => ShippingMethod::class, - 'payment_method' => PaymentMethod::class, + 'shipping_method' => [ + ShippingMethod::class, + 'scope' => 'all' + ], + 'payment_method' => [ + PaymentMethod::class, + 'scope' => 'all' + ], 'shipping_address' => [Address::class, 'localKey' => 'shipping_address_id', 'deleted' => true], 'billing_address' => [Address::class, 'localKey' => 'billing_address_id', 'deleted' => true], 'customer' => [Customer::class, 'deleted' => true], diff --git a/models/CustomerGroup.php b/models/CustomerGroup.php index 61abb9468..91de68917 100644 --- a/models/CustomerGroup.php +++ b/models/CustomerGroup.php @@ -7,6 +7,7 @@ use October\Rain\Database\Traits\Sortable; use October\Rain\Database\Traits\Validation; use OFFLINE\Mall\Classes\Traits\NullPrice; +use RainLab\User\Models\User; class CustomerGroup extends Model { diff --git a/models/Order.php b/models/Order.php index a71524144..130e6b91b 100644 --- a/models/Order.php +++ b/models/Order.php @@ -62,9 +62,21 @@ class Order extends Model 'payment_logs' => [PaymentLog::class, 'order' => 'created_at DESC'], ]; public $belongsTo = [ - 'payment_method' => [PaymentMethod::class, 'deleted' => true], - 'customer_payment_method' => [CustomerPaymentMethod::class, 'deleted' => true], - 'order_state' => [OrderState::class, 'deleted' => true], + 'payment_method' => [ + PaymentMethod::class, + 'deleted' => true, + 'scope' => 'all' + ], + 'customer_payment_method' => [ + CustomerPaymentMethod::class, + 'deleted' => true, + 'scope' => 'all' + ], + 'order_state' => [ + OrderState::class, + 'deleted' => true, + 'scope' => 'all' + ], 'customer' => [Customer::class, 'deleted' => true], 'cart' => [Cart::class, 'deleted' => true], ]; diff --git a/models/OrderState.php b/models/OrderState.php index e40ce2223..950782c25 100644 --- a/models/OrderState.php +++ b/models/OrderState.php @@ -2,6 +2,7 @@ namespace OFFLINE\Mall\Models; +use Illuminate\Database\Eloquent\Builder; use Lang; use Model; use October\Rain\Database\Traits\SoftDelete; @@ -118,7 +119,6 @@ class OrderState extends Model /** * Return the available translated orderState flag options. - * * @return array */ public function getFlagOptions(): array @@ -128,6 +128,20 @@ public function getFlagOptions(): array }, static::$availableFlagOptions); } + /** + * Include all payment methods, even disabled ones. + * @param Builder $query + * @return void + */ + public function scopeAll(Builder $query) + { + return $query->withDisabled(); + } + + /** + * Undocumented function + * @return void + */ public function beforeDelete() { if (!empty($this->flag)) { diff --git a/models/PaymentMethod.php b/models/PaymentMethod.php index b204ea874..b86f4569c 100644 --- a/models/PaymentMethod.php +++ b/models/PaymentMethod.php @@ -6,6 +6,7 @@ use DB; use Model; use Cms\Classes\Theme; +use Illuminate\Database\Eloquent\Builder; use October\Rain\Database\Traits\Nullable; use October\Rain\Database\Traits\Sluggable; use October\Rain\Database\Traits\SoftDelete; @@ -201,6 +202,16 @@ static public function getDefault(): ?self return $default; } + /** + * Include all payment methods, even disabled ones. + * @param Builder $query + * @return void + */ + public function scopeAll(Builder $query) + { + return $query->withDisabled(); + } + /** * Hook after model has been deleted. * @return void diff --git a/models/Review.php b/models/Review.php index eb237269f..5dd55e33e 100644 --- a/models/Review.php +++ b/models/Review.php @@ -5,7 +5,7 @@ use Event; use Model; use October\Rain\Database\Traits\Validation; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; /** * @property Customer $customer diff --git a/models/ShippingMethod.php b/models/ShippingMethod.php index 505dc1bc9..c92cb573a 100644 --- a/models/ShippingMethod.php +++ b/models/ShippingMethod.php @@ -6,6 +6,7 @@ use DB; use Event; use Model; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Session; use October\Rain\Database\Collection; use October\Rain\Database\Traits\Sortable; @@ -280,6 +281,16 @@ static public function getAvailability($countryId, $total, $cart = null, $wishli return $availableShippingMethods; } + /** + * Include all shipping methods, even disabled ones. + * @param Builder $query + * @return void + */ + public function scopeAll(Builder $query) + { + return $query->withDisabled(); + } + /** * JSON serialize class. * @return array diff --git a/models/User.php b/models/User.php index 97a6c66c5..d17faaabb 100644 --- a/models/User.php +++ b/models/User.php @@ -4,40 +4,11 @@ use RainLab\User\Models\User as UserBase; +/** + * @deprecated Use RainLab\User\Models\User instead + * This class is only here for backwards compatibility reasons. + */ class User extends UserBase { - /** - * The validation rules for the single attributes. - * @var array - */ - public $rules = [ - 'email' => 'required|between:6,255|email', - 'avatar' => 'nullable|image|max:4000', - 'password' => 'required:create|between:4,255|confirmed', - 'password_confirmation' => 'required_with:password|between:4,255', - ]; - /** - * The relations to eager load on every query. - * @var array - */ - public $with = [ - 'customer_group' - ]; - - /** - * The belongsTo relationships of this model. - * @var array - */ - public $belongsTo =[ - 'customer_group' => [CustomerGroup::class, 'key' => 'offline_mall_customer_group_id'], - ]; - - /** - * The hasOne relationships of this model. - * @var array - */ - public $hasOne = [ - 'customer' => Customer::class, - ]; } diff --git a/models/Wishlist.php b/models/Wishlist.php index 4c4c3898f..1e4789a64 100644 --- a/models/Wishlist.php +++ b/models/Wishlist.php @@ -14,7 +14,7 @@ use OFFLINE\Mall\Classes\Traits\HashIds; use OFFLINE\Mall\Classes\Traits\PDFMaker; use OFFLINE\Mall\Classes\Traits\ShippingMethods; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; use RainLab\User\Models\User; class Wishlist extends Model diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..72e389734 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2645 @@ +{ + "name": "@offline/mall", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@offline/mall", + "license": "MIT", + "devDependencies": { + "vitepress": "^1.0.0-rc.44", + "vue": "^3.4.21" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz", + "integrity": "sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.23.3" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.3.tgz", + "integrity": "sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz", + "integrity": "sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.23.3" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.3.tgz", + "integrity": "sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.3.tgz", + "integrity": "sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.3.tgz", + "integrity": "sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.3.tgz", + "integrity": "sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", + "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.3.tgz", + "integrity": "sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.3.tgz", + "integrity": "sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.23.3" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.3.tgz", + "integrity": "sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz", + "integrity": "sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.23.3" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.3.tgz", + "integrity": "sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz", + "integrity": "sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.23.3" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.3.tgz", + "integrity": "sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/requester-common": "4.23.3" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.6.0", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "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==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "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, + "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, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.4.0.tgz", + "integrity": "sha512-CxpKLntAi64h3j+TwWqVIQObPTED0FyXLHTTh3MKXtqiQNn2JGcMQQ362LftDbc9kYbDtrksNMNoVmVXzKFYUQ==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.4.0.tgz", + "integrity": "sha512-kzvlWmWYYSeaLKRce/kgmFFORUtBtFahfXRKndor0b60ocYiXufBQM6d6w1PlMuUkdk55aor9xLvy9wy7hTEJg==", + "dev": true, + "dependencies": { + "shiki": "1.4.0" + } + }, + "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 + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", + "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.26", + "@vue/shared": "3.4.26" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.1.3.tgz", + "integrity": "sha512-W8IwFJ/o5iUk78jpqhvScbgCsPiOp2uileDVC0NDtW38gCWhsnu9SeBTjcdu3lbwLdsjc+H1c5Msd/x9ApbcFA==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.1.3" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.1.3.tgz", + "integrity": "sha512-NFskFSJMVCBXTkByuk2llzI3KD3Blcm7WqiRorWjD6nClHPgkH5BobDH08rfulqq5ocRt5xV+3qOT1Q9FXJrwQ==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.1.3", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.1.3.tgz", + "integrity": "sha512-KJ3AfgjTn3tJz/XKF+BlVShNPecim3G21oHRue+YQOsooW+0s+qXvm09U09aO7yBza5SivL1QgxSrzAbiKWjhQ==", + "dev": true, + "dependencies": { + "rfdc": "^1.3.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", + "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-account": "4.23.3", + "@algolia/client-analytics": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-personalization": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/recommend": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "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, + "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==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.21.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.21.0.tgz", + "integrity": "sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "dev": true, + "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/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.4.0.tgz", + "integrity": "sha512-5WIn0OL8PWm7JhnTwRWXniy6eEDY234mRrERVlFa646V2ErQqwIFd2UML7e0Pq9eqSKLoMa3Ke+xbsF+DAuy+Q==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.4.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "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/vitepress": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.1.4.tgz", + "integrity": "sha512-bWIzFZXpPB6NIDBuWnS20aMADH+FcFKDfQNYFvbOWij03PR29eImTceQHIzCKordjXYBhM/TjE5VKFTUJ3EheA==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.3.0", + "@shikijs/transformers": "^1.3.0", + "@types/markdown-it": "^14.0.1", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.27", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.3.0", + "vite": "^5.2.10", + "vue": "^3.4.25" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "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==", + "dev": true, + "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 + } + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "requires": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "requires": {} + }, + "@algolia/cache-browser-local-storage": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz", + "integrity": "sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.23.3" + } + }, + "@algolia/cache-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.3.tgz", + "integrity": "sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==", + "dev": true + }, + "@algolia/cache-in-memory": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz", + "integrity": "sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.23.3" + } + }, + "@algolia/client-account": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.3.tgz", + "integrity": "sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "@algolia/client-analytics": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.3.tgz", + "integrity": "sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "@algolia/client-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.3.tgz", + "integrity": "sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "@algolia/client-personalization": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.3.tgz", + "integrity": "sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==", + "dev": true, + "requires": { + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "@algolia/client-search": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", + "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", + "dev": true, + "requires": { + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "@algolia/logger-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.3.tgz", + "integrity": "sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==", + "dev": true + }, + "@algolia/logger-console": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.3.tgz", + "integrity": "sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==", + "dev": true, + "requires": { + "@algolia/logger-common": "4.23.3" + } + }, + "@algolia/recommend": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.3.tgz", + "integrity": "sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==", + "dev": true, + "requires": { + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz", + "integrity": "sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.23.3" + } + }, + "@algolia/requester-common": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.3.tgz", + "integrity": "sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==", + "dev": true + }, + "@algolia/requester-node-http": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz", + "integrity": "sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.23.3" + } + }, + "@algolia/transporter": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.3.tgz", + "integrity": "sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/requester-common": "4.23.3" + } + }, + "@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true + }, + "@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "dev": true + }, + "@docsearch/js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", + "dev": true, + "requires": { + "@docsearch/react": "3.6.0", + "preact": "^10.0.0" + } + }, + "@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "dev": true, + "requires": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + } + }, + "@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "dev": true, + "optional": true + }, + "@shikijs/core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.4.0.tgz", + "integrity": "sha512-CxpKLntAi64h3j+TwWqVIQObPTED0FyXLHTTh3MKXtqiQNn2JGcMQQ362LftDbc9kYbDtrksNMNoVmVXzKFYUQ==", + "dev": true + }, + "@shikijs/transformers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.4.0.tgz", + "integrity": "sha512-kzvlWmWYYSeaLKRce/kgmFFORUtBtFahfXRKndor0b60ocYiXufBQM6d6w1PlMuUkdk55aor9xLvy9wy7hTEJg==", + "dev": true, + "requires": { + "shiki": "1.4.0" + } + }, + "@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 + }, + "@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "dev": true + }, + "@types/markdown-it": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.0.1.tgz", + "integrity": "sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==", + "dev": true, + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "dev": true + }, + "@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "requires": {} + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.4.26", + "@vue/shared": "3.4.26" + } + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.4.26", + "@vue/shared": "3.4.26" + } + }, + "@vue/devtools-api": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.1.3.tgz", + "integrity": "sha512-W8IwFJ/o5iUk78jpqhvScbgCsPiOp2uileDVC0NDtW38gCWhsnu9SeBTjcdu3lbwLdsjc+H1c5Msd/x9ApbcFA==", + "dev": true, + "requires": { + "@vue/devtools-kit": "^7.1.3" + } + }, + "@vue/devtools-kit": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.1.3.tgz", + "integrity": "sha512-NFskFSJMVCBXTkByuk2llzI3KD3Blcm7WqiRorWjD6nClHPgkH5BobDH08rfulqq5ocRt5xV+3qOT1Q9FXJrwQ==", + "dev": true, + "requires": { + "@vue/devtools-shared": "^7.1.3", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + } + }, + "@vue/devtools-shared": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.1.3.tgz", + "integrity": "sha512-KJ3AfgjTn3tJz/XKF+BlVShNPecim3G21oHRue+YQOsooW+0s+qXvm09U09aO7yBza5SivL1QgxSrzAbiKWjhQ==", + "dev": true, + "requires": { + "rfdc": "^1.3.1" + } + }, + "@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==", + "dev": true, + "requires": { + "@vue/shared": "3.4.26" + } + }, + "@vue/runtime-core": { + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.26.tgz", + "integrity": "sha512-AFJDLpZvhT4ujUgZSIL9pdNcO23qVFh7zWCsNdGQBw8ecLNxOOnPcK9wTTIYCmBJnuPHpukOwo62a2PPivihqw==", + "dev": true, + "requires": { + "@vue/reactivity": "3.4.26", + "@vue/shared": "3.4.26" + } + }, + "@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==", + "dev": true, + "requires": { + "@vue/runtime-core": "3.4.26", + "@vue/shared": "3.4.26", + "csstype": "^3.1.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@vue/compiler-ssr": "3.4.26", + "@vue/shared": "3.4.26" + } + }, + "@vue/shared": { + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.26.tgz", + "integrity": "sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==", + "dev": true + }, + "@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dev": true, + "requires": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "requires": {} + } + } + }, + "@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dev": true, + "requires": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "dev": true + }, + "@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dev": true, + "requires": { + "vue-demi": ">=0.14.7" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "requires": {} + } + } + }, + "algoliasearch": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", + "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", + "dev": true, + "requires": { + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-account": "4.23.3", + "@algolia/client-analytics": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-personalization": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/recommend": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "requires": { + "@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" + } + }, + "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==", + "dev": true + }, + "focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "requires": { + "tabbable": "^6.2.0" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + } + }, + "preact": { + "version": "10.21.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.21.0.tgz", + "integrity": "sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==", + "dev": true + }, + "rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "rollup": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "dev": true, + "requires": { + "@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", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "dev": true, + "peer": true + }, + "shiki": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.4.0.tgz", + "integrity": "sha512-5WIn0OL8PWm7JhnTwRWXniy6eEDY234mRrERVlFa646V2ErQqwIFd2UML7e0Pq9eqSKLoMa3Ke+xbsF+DAuy+Q==", + "dev": true, + "requires": { + "@shikijs/core": "1.4.0" + } + }, + "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==", + "dev": true + }, + "speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true + }, + "tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "requires": { + "esbuild": "^0.20.1", + "fsevents": "~2.3.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + } + }, + "vitepress": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.1.4.tgz", + "integrity": "sha512-bWIzFZXpPB6NIDBuWnS20aMADH+FcFKDfQNYFvbOWij03PR29eImTceQHIzCKordjXYBhM/TjE5VKFTUJ3EheA==", + "dev": true, + "requires": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.3.0", + "@shikijs/transformers": "^1.3.0", + "@types/markdown-it": "^14.0.1", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.27", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.3.0", + "vite": "^5.2.10", + "vue": "^3.4.25" + } + }, + "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==", + "dev": true, + "requires": { + "@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" + } + } + } +} diff --git a/package.json b/package.json index df4351390..cfcf8051d 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,12 @@ "private": true, "type": "module", "scripts": { - "docs:dev": "vitepress dev src/docs", - "docs:build": "vitepress build src/docs", - "docs:preview": "vitepress preview src/docs", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs", "translate": "translator" }, "devDependencies": { - "@ratmd/oc-translator": "^0.1.1", "vitepress": "^1.0.0-rc.44", "vue": "^3.4.21" } diff --git a/tests/models/CurrencyTest.php b/tests/models/CurrencyTest.php index 0297fc814..0319645b5 100644 --- a/tests/models/CurrencyTest.php +++ b/tests/models/CurrencyTest.php @@ -2,11 +2,10 @@ namespace OFFLINE\Mall\Tests\Models; -use OFFLINE\Mall\Classes\Customer\AuthManager; +use OFFLINE\Mall\Classes\User\Auth; use OFFLINE\Mall\Models\Currency; -use OFFLINE\Mall\Models\User; use OFFLINE\Mall\Tests\PluginTestCase; -use RainLab\User\Facades\Auth; +use RainLab\User\Models\User; class CurrencyTest extends PluginTestCase { @@ -18,9 +17,6 @@ public function setUp(): void { parent::setUp(); - app()->singleton('user.auth', function () { - return AuthManager::instance(); - }); Auth::login(User::first()); } diff --git a/tests/models/CustomerGroupPriceTest.php b/tests/models/CustomerGroupPriceTest.php index aab134280..accec5d67 100644 --- a/tests/models/CustomerGroupPriceTest.php +++ b/tests/models/CustomerGroupPriceTest.php @@ -2,14 +2,13 @@ namespace OFFLINE\Mall\Tests\Models; -use OFFLINE\Mall\Classes\Customer\AuthManager; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; use OFFLINE\Mall\Models\CustomerGroup; use OFFLINE\Mall\Models\CustomerGroupPrice; use OFFLINE\Mall\Models\Product; -use OFFLINE\Mall\Models\User; use OFFLINE\Mall\Models\Variant; use OFFLINE\Mall\Tests\PluginTestCase; +use RainLab\User\Models\User; class CustomerGroupPriceTest extends PluginTestCase { @@ -21,10 +20,6 @@ public function setUp(): void $variant->name = 'Variant'; $variant->stock = 20; $variant->save(); - - app()->singleton('user.auth', function () { - return AuthManager::instance(); - }); } public function test_relationship() diff --git a/tests/models/OrderTest.php b/tests/models/OrderTest.php index f2694fddd..2d1736fe9 100644 --- a/tests/models/OrderTest.php +++ b/tests/models/OrderTest.php @@ -3,7 +3,6 @@ namespace OFFLINE\Mall\Tests\Models; use Event; -use OFFLINE\Mall\Classes\Customer\AuthManager; use OFFLINE\Mall\Classes\Exceptions\OutOfStockException; use OFFLINE\Mall\Classes\PaymentState\PendingState; use OFFLINE\Mall\Models\Address; @@ -19,10 +18,10 @@ use OFFLINE\Mall\Models\Product; use OFFLINE\Mall\Models\ShippingMethod; use OFFLINE\Mall\Models\Tax; -use OFFLINE\Mall\Models\User; use OFFLINE\Mall\Models\Variant; use OFFLINE\Mall\Tests\PluginTestCase; -use RainLab\User\Facades\Auth; +use OFFLINE\Mall\Classes\User\Auth; +use RainLab\User\Models\User; class OrderTest extends PluginTestCase { @@ -30,10 +29,6 @@ public function setUp(): void { parent::setUp(); - // Authenticate user - app()->singleton('user.auth', function () { - return AuthManager::instance(); - }); Auth::login(User::first()); // Set Country diff --git a/tests/models/PriceCategoryTest.php b/tests/models/PriceCategoryTest.php index a8b5f0034..3336855fa 100644 --- a/tests/models/PriceCategoryTest.php +++ b/tests/models/PriceCategoryTest.php @@ -3,14 +3,13 @@ namespace OFFLINE\Mall\Tests\Models; use Illuminate\Support\Facades\DB; -use OFFLINE\Mall\Classes\Customer\AuthManager; +use OFFLINE\Mall\Classes\User\Auth; use OFFLINE\Mall\Models\Currency; use OFFLINE\Mall\Models\Price; use OFFLINE\Mall\Models\PriceCategory; use OFFLINE\Mall\Models\Product; -use OFFLINE\Mall\Models\User; use OFFLINE\Mall\Tests\PluginTestCase; -use RainLab\User\Facades\Auth; +use RainLab\User\Models\User; class PriceCategoryTest extends PluginTestCase { @@ -22,9 +21,6 @@ public function setUp(): void { parent::setUp(); - app()->singleton('user.auth', function () { - return AuthManager::instance(); - }); Auth::login(User::first()); } diff --git a/tests/models/TaxTest.php b/tests/models/TaxTest.php index afa861e19..cd17dc15c 100644 --- a/tests/models/TaxTest.php +++ b/tests/models/TaxTest.php @@ -2,14 +2,13 @@ namespace OFFLINE\Mall\Tests\Models; -use OFFLINE\Mall\Classes\Customer\AuthManager; +use OFFLINE\Mall\Classes\User\Auth; use OFFLINE\Mall\Models\PaymentMethod; use OFFLINE\Mall\Models\Product; use OFFLINE\Mall\Models\ShippingMethod; use OFFLINE\Mall\Models\Tax; -use OFFLINE\Mall\Models\User; use OFFLINE\Mall\Tests\PluginTestCase; -use RainLab\User\Facades\Auth; +use RainLab\User\Models\User; class TaxTest extends PluginTestCase { @@ -21,9 +20,6 @@ public function setUp(): void { parent::setUp(); - app()->singleton('user.auth', function () { - return AuthManager::instance(); - }); Auth::login(User::first()); } diff --git a/updates/version.yaml b/updates/version.yaml index 7af44693f..e1ca772e5 100644 --- a/updates/version.yaml +++ b/updates/version.yaml @@ -560,4 +560,18 @@ v3.2.0: - 030_07-alter_offline_mall_order_states.php - 030_08-create_offline_mall_product_file_variant_table.php v3.2.1: - - 'Fix Release Number' \ No newline at end of file + - 'Fix Release Number' +v3.2.2: + - 'Minor Bugfix' + - 'Added Customer Group column on RainLab.User list.' + - 'Added Customer filter scope on RainLab.User list.' + - 'Added Create Customer bulk toolbar action on RainLab.User list.' + - 'Update noUiSlider to version 15.7.1.' + - 'Update to new translate.localePicker.translateParams event, thanks to @RickAcb (#1126).' + - 'Fixed include external assets instead of using a CDN, thanks to @ZhiweiWu0425 (#918).' + - 'Fixed mapWithKeys function call on array when oldPrice has been disabled, thanks to @dathwa (#1118).' + - 'Fixed backend Order menu breaks on used but disabled payment methods, thanks to @dathwa (#1120).' +'v3.3.0': + - "Various Bugfixes" + - 'Added support for RainLab.User 3.0' + - 'Deprecated OFFLINE\Mall\Models\User, use the RainLab.User model instead' \ No newline at end of file