├── resources ├── views │ ├── components │ │ ├── logo.blade.php │ │ ├── response-code.blade.php │ │ ├── logo-cron.blade.php │ │ ├── logo-uptime.blade.php │ │ ├── logo-broken-link.blade.php │ │ ├── pill.blade.php │ │ └── logo-ohdear.blade.php │ ├── brokenLinks.blade.php │ ├── cron.blade.php │ └── uptime.blade.php ├── images │ └── grid-36-24.svg └── css │ └── style.css ├── src ├── OhDearPulse.php ├── Exceptions │ └── SiteIdNotCorrect.php ├── Livewire │ ├── Concerns │ │ ├── UsesOhDearApi.php │ │ └── RemembersApiCalls.php │ ├── OhDearBrokenLinksCardComponent.php │ ├── OhDearCronPulseCardComponent.php │ └── OhDearUptimePulseCardComponent.php ├── OhDearPulseServiceProvider.php └── Commands │ └── VerifyCommand.php ├── package.json ├── tailwind.config.js ├── LICENSE.md ├── CHANGELOG.md ├── composer.json ├── README.md ├── dist └── output.css └── yarn.lock /resources/views/components/logo.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{$slot}} 3 |
-------------------------------------------------------------------------------- /resources/images/grid-36-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/OhDearPulse.php: -------------------------------------------------------------------------------- 1 | 'green', 6 | Str::startsWith($code, '3') => 'blue', 7 | Str::startsWith($code, '4') => 'orange', 8 | Str::startsWith($code, '500') => 'red', 9 | default => 'gray', 10 | }; 11 | @endphp 12 | 13 | {{$code}} -------------------------------------------------------------------------------- /resources/views/components/logo-cron.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Livewire/Concerns/UsesOhDearApi.php: -------------------------------------------------------------------------------- 1 | siteId) { 18 | return false; 19 | } 20 | 21 | if (! OhDearPulse::isConfigured()) { 22 | return false; 23 | } 24 | 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /resources/views/components/logo-uptime.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/css/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | .bg-grid-base { 7 | mask-position: bottom left; 8 | background-repeat: repeat; 9 | } 10 | 11 | .bg-grid { 12 | @apply bg-grid-base; 13 | 14 | -webkit-mask-image: url("data:image/svg;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAJKADAAQAAAABAAAAGAAAAABO37Z7AAAATElEQVRIDe3XsQ0AIAwDwYT9d06ABb5DQfq0bqzDDRGDrvatQX1uFQvRiyikEAlQ7oYUIgHK3ZBCJEC5G1KIBCh3Q98J5fl6UOuHeTVzhwkl8Nz3qwAAAABJRU5ErkJggg=="); 15 | mask-image: url("data:image/svg;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAJKADAAQAAAABAAAAGAAAAABO37Z7AAAATElEQVRIDe3XsQ0AIAwDwYT9d06ABb5DQfq0bqzDDRGDrvatQX1uFQvRiyikEAlQ7oYUIgHK3ZBCJEC5G1KIBCh3Q98J5fl6UOuHeTVzhwkl8Nz3qwAAAABJRU5ErkJggg=="); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /resources/views/components/logo-broken-link.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Livewire/Concerns/RemembersApiCalls.php: -------------------------------------------------------------------------------- 1 | store()->remember( 18 | 'laravel:pulse:'.static::class.':'.$key, 19 | $interval, 20 | function () use ($apiCall) { 21 | try { 22 | return $apiCall(); 23 | } catch (NotFoundException $exception) { 24 | throw SiteIdNotCorrect::make($exception); 25 | } 26 | }, 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) ohdearapp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /resources/views/components/pill.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $colorClasses = match($color ?? 'gray') { 3 | 'primary' => 'bg-primary text-white', 4 | 'blue' => 'bg-sky-100 text-sky-700', 5 | 'green' => 'bg-emerald-100 text-emerald-700 dark:bg-emerald-700/50 dark:text-emerald-200', 6 | 'red' => 'bg-red-100 text-red-700', 7 | 'yellow' => 'bg-yellow-100 text-yellow-700', 8 | 'indigo' => 'bg-indigo-100 text-indigo-700', 9 | 'purple' => 'bg-purple-100 text-purple-700', 10 | 'orange' => 'bg-orange-100 text-orange-700 dark:bg-orange-700/50 dark:text-orange-200', 11 | 'amber' => 'bg-amber-100 text-amber-700', 12 | 'gray' => 'bg-gray-150 text-gray-700', 13 | 'pink' => 'bg-pink-100 text-pink-700', 14 | default => 'bg-gray-200 text-gray-800' 15 | }; 16 | 17 | $sizeClasses = match($size ?? 'default') { 18 | 'sm' => 'text-xxs px-1.5 py-[1px]', 19 | 'lg' => 'text-xs px-2.5 py-1', 20 | default => 'px-2 py-0.5 text-xs' 21 | }; 22 | @endphp 23 | 24 | @php 25 | $roundedClass = ''; 26 | 27 | if(! str_contains($attributes->get('class'), 'rounded')){ 28 | $roundedClass = 'rounded-full'; 29 | } 30 | @endphp 31 | 32 |
merge(['class' => 'inline-block font-medium ' . $roundedClass .' '.$colorClasses. ' ' .$sizeClasses])}}> 33 | {{$slot}} 34 |
35 | -------------------------------------------------------------------------------- /src/Livewire/OhDearBrokenLinksCardComponent.php: -------------------------------------------------------------------------------- 1 | siteId = $siteId ?? config('services.oh_dear.pulse.site_id'); 23 | } 24 | 25 | public function render(): Renderable 26 | { 27 | $brokenLinks = $this->getBrokenLinks(); 28 | 29 | return view('ohdear-pulse::brokenLinks', [ 30 | 'isConfigured' => $this->isConfigured(), 31 | 'brokenLinks' => $brokenLinks, 32 | ]); 33 | } 34 | 35 | /** 36 | * @return array<\OhDear\PhpSdk\Resources\BrokenLink>|null 37 | */ 38 | public function getBrokenLinks(): ?array 39 | { 40 | if (! $this->isConfigured()) { 41 | return null; 42 | } 43 | 44 | return $this->rememberApiCall( 45 | fn () => $this->ohDear()?->brokenLinks($this->siteId), 46 | 'site:'.$this->siteId, 47 | CarbonInterval::minutes(15) 48 | ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/Livewire/OhDearCronPulseCardComponent.php: -------------------------------------------------------------------------------- 1 | siteId = $siteId ?? config('services.oh_dear.pulse.site_id'); 27 | } 28 | 29 | public function render(): Renderable 30 | { 31 | $cronChecks = $this->getCronChecks(); 32 | 33 | return view('ohdear-pulse::cron', [ 34 | 'isConfigured' => $this->isConfigured(), 35 | 'cronChecks' => $cronChecks, 36 | ]); 37 | } 38 | 39 | /** 40 | * @return array<\OhDear\PhpSdk\Resources\CronCheck>|null 41 | */ 42 | public function getCronChecks(): ?array 43 | { 44 | if (! $this->isConfigured()) { 45 | return null; 46 | } 47 | 48 | return $this->rememberApiCall( 49 | fn () => $this->ohDear()?->cronChecks($this->siteId), 50 | 'site:'.$this->siteId, 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/OhDearPulseServiceProvider.php: -------------------------------------------------------------------------------- 1 | name('ohdear-pulse') 20 | ->hasViews() 21 | ->hasCommand(VerifyCommand::class); 22 | } 23 | 24 | public function packageBooted() 25 | { 26 | $this->callAfterResolving('livewire', function (LivewireManager $livewire) { 27 | $livewire->component('ohdear.pulse.uptime', OhDearUptimePulseCardComponent::class); 28 | $livewire->component('ohdear.pulse.cron', OhDearCronPulseCardComponent::class); 29 | $livewire->component('ohdear.pulse.brokenLinks', OhDearBrokenLinksCardComponent::class); 30 | }); 31 | 32 | $this->app->bind('ohdear-pulse', function () { 33 | if (! OhDearPulse::isConfigured()) { 34 | return null; 35 | } 36 | 37 | return new OhDear(config('services.oh_dear.pulse.api_key')); 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `ohdear-pulse` will be documented in this file. 4 | 5 | ## 1.1.1 - 2025-02-17 6 | 7 | ### What's Changed 8 | 9 | * Bump dependabot/fetch-metadata from 1.6.0 to 2.0.0 by @dependabot in https://github.com/ohdearapp/ohdear-pulse/pull/3 10 | * Bump aglipanci/laravel-pint-action from 2.3.1 to 2.4 by @dependabot in https://github.com/ohdearapp/ohdear-pulse/pull/5 11 | * Bump dependabot/fetch-metadata from 2.0.0 to 2.1.0 by @dependabot in https://github.com/ohdearapp/ohdear-pulse/pull/6 12 | * Bump dependabot/fetch-metadata from 2.1.0 to 2.2.0 by @dependabot in https://github.com/ohdearapp/ohdear-pulse/pull/8 13 | * Bump dependabot/fetch-metadata from 2.2.0 to 2.3.0 by @dependabot in https://github.com/ohdearapp/ohdear-pulse/pull/10 14 | * Bump aglipanci/laravel-pint-action from 2.4 to 2.5 by @dependabot in https://github.com/ohdearapp/ohdear-pulse/pull/11 15 | * Laravel 12.x Compatibility by @laravel-shift in https://github.com/ohdearapp/ohdear-pulse/pull/12 16 | 17 | ### New Contributors 18 | 19 | * @laravel-shift made their first contribution in https://github.com/ohdearapp/ohdear-pulse/pull/12 20 | 21 | **Full Changelog**: https://github.com/ohdearapp/ohdear-pulse/compare/1.1.0...1.1.1 22 | 23 | ## 1.1.0 - 2024-03-28 24 | 25 | ### What's Changed 26 | 27 | * Add Laravel 11 support by @oddvalue in https://github.com/ohdearapp/ohdear-pulse/pull/4 28 | 29 | ### New Contributors 30 | 31 | * @oddvalue made their first contribution in https://github.com/ohdearapp/ohdear-pulse/pull/4 32 | 33 | **Full Changelog**: https://github.com/ohdearapp/ohdear-pulse/compare/1.0.0...1.1.0 34 | 35 | ## 1.0.0 - 2024-01-07 36 | 37 | **Full Changelog**: https://github.com/ohdearapp/ohdear-pulse/compare/0.0.3...1.0.0 38 | 39 | ## 0.0.3 - 2024-01-07 40 | 41 | **Full Changelog**: https://github.com/ohdearapp/ohdear-pulse/compare/0.0.2...0.0.3 42 | 43 | ## 0.0.2 - 2024-01-04 44 | 45 | **Full Changelog**: https://github.com/ohdearapp/ohdear-pulse/compare/0.0.1...0.0.2 46 | 47 | ## 0.0.1 - 2024-01-04 48 | 49 | - experimental release 50 | -------------------------------------------------------------------------------- /src/Commands/VerifyCommand.php: -------------------------------------------------------------------------------- 1 | info('Verifying if Oh Dear is configured correctly...'); 20 | 21 | $this 22 | ->verifySdkInstalled() 23 | ->verifyApiToken($ohDearConfig) 24 | ->verifySiteId($ohDearConfig) 25 | ->verifyConnection($ohDearConfig); 26 | 27 | $this->info('✅ Oh Dear is configured correctly!'); 28 | } 29 | 30 | public function verifySdkInstalled(): self 31 | { 32 | if (! class_exists(OhDear::class)) { 33 | throw new Exception('You must install the Oh Dear SDK in order to sync your schedule with Oh Dear. Run `composer require ohdearapp/ohdear-php-sdk`.'); 34 | } 35 | 36 | $this->comment('The Oh Dear SDK is installed.'); 37 | 38 | return $this; 39 | } 40 | 41 | protected function verifyApiToken(array $ohDearConfig): self 42 | { 43 | if (empty($ohDearConfig['api_key'])) { 44 | throw new Exception('No API key found. Make sure you added an API token to the `services.oh_dear.pulse.api_key` key of the `services` config file. You can generate a new token here: https://ohdear.app/user/api-tokens'); 45 | } 46 | 47 | $this->comment('Oh Dear API token found.'); 48 | 49 | return $this; 50 | } 51 | 52 | protected function verifySiteId(array $ohDearConfig): self 53 | { 54 | if (empty($ohDearConfig['site_id'])) { 55 | throw new Exception('No site id found. Make sure you added an site id to the `oh_dear.pulse.site_id` key of the `services` config file. You can found your site id on the settings page of a site on Oh Dear.'); 56 | } 57 | 58 | $this->comment('Oh Dear site id found.'); 59 | 60 | return $this; 61 | } 62 | 63 | protected function verifyConnection(array $ohDearConfig): self 64 | { 65 | $this->comment('Trying to reach Oh Dear...'); 66 | 67 | $site = app('ohdear-pulse')->site($ohDearConfig['site_id']); 68 | 69 | $this->comment("Successfully connected to Oh Dear. The configured site URL is: {$site->sortUrl}"); 70 | 71 | return $this; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ohdearapp/ohdear-pulse", 3 | "description": "Integrate Oh Dear with Laravel Pulse", 4 | "keywords": [ 5 | "ohdearapp", 6 | "laravel", 7 | "ohdear-pulse" 8 | ], 9 | "homepage": "https://github.com/ohdearapp/ohdear-pulse", 10 | "license": "MIT", 11 | "authors": [ 12 | { 13 | "name": "Freek Van der Herten", 14 | "email": "freek@spatie.be", 15 | "role": "Developer" 16 | } 17 | ], 18 | "require": { 19 | "php": "^8.1", 20 | "illuminate/contracts": "^10.0|^11.0|^12.0", 21 | "laravel/pulse": "^1.0@beta", 22 | "ohdearapp/ohdear-php-sdk": "^3.10", 23 | "spatie/laravel-package-tools": "^1.16.1" 24 | }, 25 | "require-dev": { 26 | "laravel/pint": "^1.13.7", 27 | "nunomaduro/collision": "^7.10|^8.0", 28 | "orchestra/testbench": "^8.19|^9.0|^10.0", 29 | "pestphp/pest": "^2.30|^3.7", 30 | "pestphp/pest-plugin-arch": "^2.5|^3.0", 31 | "pestphp/pest-plugin-laravel": "^2.2|^3.1", 32 | "spatie/laravel-ray": "^1.33" 33 | }, 34 | "autoload": { 35 | "psr-4": { 36 | "OhDear\\OhDearPulse\\": "src/", 37 | "OhDear\\OhDearPulse\\Database\\Factories\\": "database/factories/" 38 | } 39 | }, 40 | "autoload-dev": { 41 | "psr-4": { 42 | "OhDear\\OhDearPulse\\Tests\\": "tests/", 43 | "Workbench\\App\\": "workbench/app/" 44 | } 45 | }, 46 | "scripts": { 47 | "post-autoload-dump": "@composer run prepare", 48 | "clear": "@php vendor/bin/testbench package:purge-ohdear-pulse --ansi", 49 | "prepare": "@php vendor/bin/testbench package:discover --ansi", 50 | "build": [ 51 | "@composer run prepare", 52 | "@php vendor/bin/testbench workbench:build --ansi" 53 | ], 54 | "start": [ 55 | "Composer\\Config::disableProcessTimeout", 56 | "@composer run build", 57 | "@php vendor/bin/testbench serve" 58 | ], 59 | "analyse": "vendor/bin/phpstan analyse", 60 | "test": "vendor/bin/pest", 61 | "test-coverage": "vendor/bin/pest --coverage", 62 | "format": "vendor/bin/pint" 63 | }, 64 | "config": { 65 | "sort-packages": true, 66 | "allow-plugins": { 67 | "pestphp/pest-plugin": true, 68 | "phpstan/extension-installer": true 69 | } 70 | }, 71 | "extra": { 72 | "laravel": { 73 | "providers": [ 74 | "OhDear\\OhDearPulse\\OhDearPulseServiceProvider" 75 | ], 76 | "aliases": { 77 | "OhDearPulse": "OhDear\\OhDearPulse\\Facades\\OhDearPulse" 78 | } 79 | } 80 | }, 81 | "minimum-stability": "dev", 82 | "prefer-stable": true 83 | } 84 | -------------------------------------------------------------------------------- /resources/views/components/logo-ohdear.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'text-gray-300 dark:text-gray-600 hover:!text-brand inline-block w-10']) }} viewBox="0 0 1000 600" fill="none" xmlns="http://www.w3.org/2000/svg" alt="Oh Dear — The all-in-one monitoring tool for your entire website"> 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /resources/views/brokenLinks.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Str; 3 | @endphp 4 | 5 | 6 |
7 |
8 | 9 | 10 | 11 | 12 |

Broken 13 | Links

14 |
15 | 16 |
17 | 20 | 21 | 22 |
23 |
24 | 25 |
26 |
27 |
28 | @if(! $isConfigured) 29 | This card will display your broken links. Learn how to configure it in our docs. 31 | @else 32 | 33 | 34 | 35 | 36 | Status 37 | code 38 | 39 | Broken Link 40 | Found on 41 | Link text 42 | 43 | 44 | 45 | @foreach ($brokenLinks as $brokenLink) 46 | 47 | 48 | 49 | 50 | {{$brokenLink->statusCode}} 51 | 52 | 53 | 54 | 58 | 59 | 61 | {{ $brokenLink->relativeFoundOnUrl }} 63 | 64 | 65 | {{ $brokenLink->linkText }} 66 | 67 | 68 | @endforeach 69 | 70 | 71 | @endif 72 |
73 |
74 |
75 |
76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Integrate Oh Dear with Laravel Pulse 2 | 3 | [![Latest Version on Packagist](https://img.shields.io/packagist/v/ohdearapp/ohdear-pulse.svg?style=flat-square)](https://packagist.org/packages/ohdearapp/ohdear-pulse) 4 | [![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/ohdearapp/ohdear-pulse/run-tests.yml?branch=main&label=tests&style=flat-square)](https://github.com/ohdearapp/ohdear-pulse/actions?query=workflow%3Arun-tests+branch%3Amain) 5 | [![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/ohdearapp/ohdear-pulse/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/ohdearapp/ohdear-pulse/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain) 6 | [![Total Downloads](https://img.shields.io/packagist/dt/ohdearapp/ohdear-pulse.svg?style=flat-square)](https://packagist.org/packages/ohdearapp/ohdear-pulse) 7 | 8 | This package contains Pulse cards that show results from [Oh Dear](https://ohdear.app) in your [Laravel Pulse](https://pulse.laravel.com) dashboard. 9 | 10 | Currently, there are three cards available: 11 | 12 | - [Uptime and Performance](https://ohdear.app/docs/features/uptime-monitoring) 13 | 14 | 15 | 16 | - [Cron Job Monitoring](https://ohdear.app/docs/features/cron-job-monitoring) 17 | 18 | ![screenshot](https://github.com/ohdearapp/ohdear-pulse/blob/main/docs/cron.jpg?raw=true) 19 | 20 | - [Broken links](https://ohdear.app/docs/features/broken-links-detection) 21 | 22 | ![screenshot](https://github.com/ohdearapp/ohdear-pulse/blob/main/docs/broken-links.jpg?raw=true) 23 | 24 | ## Installation 25 | 26 | You can install the package via composer: 27 | 28 | ```bash 29 | composer require ohdearapp/ohdear-pulse 30 | ``` 31 | 32 | In your `config/services.php` file, add the following lines: 33 | 34 | ```php 35 | 'oh_dear' => [ 36 | 'pulse' => [ 37 | 'api_key' => env('OH_DEAR_API_TOKEN'), 38 | 'site_id' => env('OH_DEAR_SITE_ID'), 39 | ], 40 | ], 41 | ``` 42 | 43 | You can create an API token on the "API Tokens" page at Oh Dear. You'll find the site ID on the "Settings" page of a site on Oh Dear. 44 | 45 | You can execute this artisan command to verify if you set up the configuration correctly. 46 | 47 | ```bash 48 | php artisan ohdear-pulse:verify 49 | ``` 50 | 51 | ## Usage 52 | 53 | There are currently three cards available: 54 | 55 | - `ohdear.pulse.uptime`: displays the uptime and performance of a site 56 | - `ohdear.pulse.cron`: displays the results of the cron job monitoring 57 | - `ohdear.pulse.brokenLinks`: displays any broken links that were detected 58 | 59 | You can add the cards to your Pulse dashboard, by first publishing the Pulse's dashboard view: 60 | 61 | ```bash 62 | php artisan vendor:publish --tag=pulse-dashboard 63 | ``` 64 | 65 | Next, add the cards to the `resources/views/vendor/pulse/dashboard.blade.php` file: 66 | 67 | ```html 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | {{-- Add more cards here --}} 76 | 77 | ``` 78 | 79 | All these cards accept an optional `site-id` attribute. If you don't provide it, the site ID from the `config/services.php` file will be used. 80 | 81 | ## Testing 82 | 83 | ```bash 84 | composer test 85 | ``` 86 | 87 | ## Changelog 88 | 89 | Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. 90 | 91 | ## Contributing 92 | 93 | Please see [CONTRIBUTING](CONTRIBUTING.md) for details. 94 | 95 | ## Security Vulnerabilities 96 | 97 | Please review [our security policy](../../security/policy) on how to report security vulnerabilities. 98 | 99 | ## Credits 100 | 101 | - [Freek Van der Herten](https://github.com/freekmurze) 102 | - [All Contributors](../../contributors) 103 | 104 | ## License 105 | 106 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 107 | -------------------------------------------------------------------------------- /resources/views/cron.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Str; 3 | @endphp 4 | 5 | 6 |
7 |
8 | 9 | 10 | 11 | 12 |

15 | Cron 16 |

17 |
18 | 19 |
20 | 21 | 22 | 23 |
24 |
25 | 26 |
27 |
28 | @if(! $isConfigured) 29 | This card will display your cron checks. Learn how to configure it in our docs. 30 | @else 31 | 32 | 33 | 34 | Task 35 | Last executed at 36 | Cron expression 37 | Result 38 | 39 | 40 | 41 | @foreach ($cronChecks as $cronCheck) 42 | 43 | 44 | 45 | 46 | 47 | {{ $cronCheck->name }} 48 | 49 | 50 | 51 | 52 |
53 |
54 | {{ $cronCheck->humanReadableLatestPingAt }} 55 |
56 |
57 | {{ $cronCheck->latestPingAt }} 58 |
59 |
60 |
61 | 62 |
63 |
64 | {{ $cronCheck->humanReadableCronExpression }} 65 |
66 |
67 | {{ $cronCheck->cronExpression }} 68 |
69 |
70 |
71 | 72 | {{ $cronCheck->latestResultLabel }} 73 | 74 | 75 | @endforeach 76 | 77 |
78 | @endif 79 | 80 |
81 |
82 | 83 |
84 | -------------------------------------------------------------------------------- /src/Livewire/OhDearUptimePulseCardComponent.php: -------------------------------------------------------------------------------- 1 | sites = collect(); 41 | 42 | $this->siteId = $siteId ?? config('services.oh_dear.pulse.site_id'); 43 | 44 | $this->fetchPerformanceRecords(); 45 | } 46 | 47 | public function fetchPerformanceRecords(): void 48 | { 49 | $performanceRecords = $this->rememberApiCall( 50 | fn () => $this->ohDear()->performanceRecords( 51 | $this->siteId, 52 | Carbon::now()->subMinutes(20), 53 | Carbon::now(), 54 | ), 55 | 'performance-records:'.$this->siteId, 56 | CarbonInterval::seconds(30), 57 | ); 58 | 59 | $performanceRecords = collect($performanceRecords) 60 | ->map(function (PerformanceRecord $record) { 61 | $createdAt = Carbon::createFromFormat('Y-m-d H:i:s', $record->createdAt); 62 | 63 | return [ 64 | $createdAt->getTimestampMs(), 65 | number_format($record->totalTimeInSeconds * 1000, 2), 66 | ]; 67 | })->reverse()->values()->toArray(); 68 | 69 | $this->performanceRecords = $performanceRecords; 70 | 71 | $this->maxPerformanceRecord = (int) ceil(collect($this->performanceRecords) 72 | ->max(fn (array $dataPoint) => $dataPoint[1])) + 10; 73 | } 74 | 75 | protected function getLabels(): array 76 | { 77 | return collect($this->performanceRecords) 78 | ->map(function (array $dataPoint, int $index) { 79 | if ($index === 0) { 80 | return 'Now'; 81 | } 82 | 83 | return $index.' '.Str::plural('minute', $index).' ago'; 84 | }) 85 | ->toArray(); 86 | } 87 | 88 | public function render(): Renderable 89 | { 90 | $site = $this->getSite(); 91 | 92 | return view('ohdear-pulse::uptime', [ 93 | 'site' => $site, 94 | 'status' => $this->getStatus($site), 95 | 'statusColor' => $this->getStatusColor(), 96 | 'performance' => $this->getPerformance($site), 97 | 'isConfigured' => $this->isConfigured(), 98 | ]); 99 | } 100 | 101 | public function getSite(): ?Site 102 | { 103 | if (! OhDearPulse::isConfigured()) { 104 | return null; 105 | } 106 | 107 | $siteAttributes = $this->rememberApiCall( 108 | fn () => $this->ohDear()?->site($this->siteId)?->attributes, 109 | 'site:'.$this->siteId, 110 | CarbonInterval::seconds(10), 111 | ); 112 | 113 | return new Site($siteAttributes); 114 | } 115 | 116 | protected function getStatus(?Site $site): ?string 117 | { 118 | if (! $site) { 119 | return null; 120 | } 121 | 122 | if (! $check = $this->getCheck($site, 'uptime')) { 123 | return null; 124 | } 125 | 126 | return match ($check->summary) { 127 | 'Up' => 'Online', 128 | default => $check->summary, 129 | }; 130 | } 131 | 132 | protected function getStatusColor(): string 133 | { 134 | return match ($this->getStatus($this->getSite())) { 135 | 'Online' => 'dark:bg-gradient-to-t dark:from-emerald-500 dark:to-emerald-400 bg-emerald-100 text-emerald-800 dark:border-emerald-300 dark:text-gray-900 dark:border-t', 136 | 'Down' => 'dark:bg-gradient-to-t dark:from-rose-500 dark:to-rose-400 bg-rose-100 text-rose-800 dark:border-rose-300 dark:text-gray-900 dark:border-t', 137 | default => 'bg-gray-600', 138 | }; 139 | } 140 | 141 | protected function getPerformance(?Site $site): ?string 142 | { 143 | if (! $site) { 144 | return null; 145 | } 146 | 147 | if (! $check = $this->getCheck($site, 'performance')) { 148 | return null; 149 | } 150 | 151 | return $check->summary; 152 | } 153 | 154 | protected function getCheck(Site $site, string $type): ?Check 155 | { 156 | return collect($site->checks) 157 | ->first(fn (Check $check) => $check->type === $type); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /resources/views/uptime.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Str; 3 | @endphp 4 | 5 | 6 | 7 |
8 |
9 | 10 |
11 | 12 |
13 |
{{ $status }}
14 |
15 | 16 |
17 | 18 | 19 | 20 | 21 |

Uptime

22 |
23 | 24 |
25 | 26 | 27 | 28 |
29 |
30 | 31 |
32 |
33 |
34 |
35 | 36 |
37 | {{$this->performanceRecords[0][1]}}ms 38 |
39 |
147 | 148 |
149 |
150 | Now 151 | 152 | {{\Carbon\Carbon::createFromTimestamp($this->performanceRecords[count($this->performanceRecords) -1][0]/1000)->diffInMinutes(now(), true)}} min ago 153 |
154 |
155 |
156 | -------------------------------------------------------------------------------- /dist/output.css: -------------------------------------------------------------------------------- 1 | .bg-grid { 2 | -webkit-mask-position: bottom left; 3 | mask-position: bottom left; 4 | background-repeat: repeat; 5 | -webkit-mask-image: url("data:image/svg;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAJKADAAQAAAABAAAAGAAAAABO37Z7AAAATElEQVRIDe3XsQ0AIAwDwYT9d06ABb5DQfq0bqzDDRGDrvatQX1uFQvRiyikEAlQ7oYUIgHK3ZBCJEC5G1KIBCh3Q98J5fl6UOuHeTVzhwkl8Nz3qwAAAABJRU5ErkJggg=="); 6 | mask-image: url("data:image/svg;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAJKADAAQAAAABAAAAGAAAAABO37Z7AAAATElEQVRIDe3XsQ0AIAwDwYT9d06ABb5DQfq0bqzDDRGDrvatQX1uFQvRiyikEAlQ7oYUIgHK3ZBCJEC5G1KIBCh3Q98J5fl6UOuHeTVzhwkl8Nz3qwAAAABJRU5ErkJggg=="); 7 | } 8 | 9 | *, ::before, ::after { 10 | --tw-border-spacing-x: 0; 11 | --tw-border-spacing-y: 0; 12 | --tw-translate-x: 0; 13 | --tw-translate-y: 0; 14 | --tw-rotate: 0; 15 | --tw-skew-x: 0; 16 | --tw-skew-y: 0; 17 | --tw-scale-x: 1; 18 | --tw-scale-y: 1; 19 | --tw-pan-x: ; 20 | --tw-pan-y: ; 21 | --tw-pinch-zoom: ; 22 | --tw-scroll-snap-strictness: proximity; 23 | --tw-gradient-from-position: ; 24 | --tw-gradient-via-position: ; 25 | --tw-gradient-to-position: ; 26 | --tw-ordinal: ; 27 | --tw-slashed-zero: ; 28 | --tw-numeric-figure: ; 29 | --tw-numeric-spacing: ; 30 | --tw-numeric-fraction: ; 31 | --tw-ring-inset: ; 32 | --tw-ring-offset-width: 0px; 33 | --tw-ring-offset-color: #fff; 34 | --tw-ring-color: rgb(59 130 246 / 0.5); 35 | --tw-ring-offset-shadow: 0 0 #0000; 36 | --tw-ring-shadow: 0 0 #0000; 37 | --tw-shadow: 0 0 #0000; 38 | --tw-shadow-colored: 0 0 #0000; 39 | --tw-blur: ; 40 | --tw-brightness: ; 41 | --tw-contrast: ; 42 | --tw-grayscale: ; 43 | --tw-hue-rotate: ; 44 | --tw-invert: ; 45 | --tw-saturate: ; 46 | --tw-sepia: ; 47 | --tw-drop-shadow: ; 48 | --tw-backdrop-blur: ; 49 | --tw-backdrop-brightness: ; 50 | --tw-backdrop-contrast: ; 51 | --tw-backdrop-grayscale: ; 52 | --tw-backdrop-hue-rotate: ; 53 | --tw-backdrop-invert: ; 54 | --tw-backdrop-opacity: ; 55 | --tw-backdrop-saturate: ; 56 | --tw-backdrop-sepia: ; 57 | } 58 | 59 | ::backdrop { 60 | --tw-border-spacing-x: 0; 61 | --tw-border-spacing-y: 0; 62 | --tw-translate-x: 0; 63 | --tw-translate-y: 0; 64 | --tw-rotate: 0; 65 | --tw-skew-x: 0; 66 | --tw-skew-y: 0; 67 | --tw-scale-x: 1; 68 | --tw-scale-y: 1; 69 | --tw-pan-x: ; 70 | --tw-pan-y: ; 71 | --tw-pinch-zoom: ; 72 | --tw-scroll-snap-strictness: proximity; 73 | --tw-gradient-from-position: ; 74 | --tw-gradient-via-position: ; 75 | --tw-gradient-to-position: ; 76 | --tw-ordinal: ; 77 | --tw-slashed-zero: ; 78 | --tw-numeric-figure: ; 79 | --tw-numeric-spacing: ; 80 | --tw-numeric-fraction: ; 81 | --tw-ring-inset: ; 82 | --tw-ring-offset-width: 0px; 83 | --tw-ring-offset-color: #fff; 84 | --tw-ring-color: rgb(59 130 246 / 0.5); 85 | --tw-ring-offset-shadow: 0 0 #0000; 86 | --tw-ring-shadow: 0 0 #0000; 87 | --tw-shadow: 0 0 #0000; 88 | --tw-shadow-colored: 0 0 #0000; 89 | --tw-blur: ; 90 | --tw-brightness: ; 91 | --tw-contrast: ; 92 | --tw-grayscale: ; 93 | --tw-hue-rotate: ; 94 | --tw-invert: ; 95 | --tw-saturate: ; 96 | --tw-sepia: ; 97 | --tw-drop-shadow: ; 98 | --tw-backdrop-blur: ; 99 | --tw-backdrop-brightness: ; 100 | --tw-backdrop-contrast: ; 101 | --tw-backdrop-grayscale: ; 102 | --tw-backdrop-hue-rotate: ; 103 | --tw-backdrop-invert: ; 104 | --tw-backdrop-opacity: ; 105 | --tw-backdrop-saturate: ; 106 | --tw-backdrop-sepia: ; 107 | } 108 | 109 | #ohdear :is(.static) { 110 | position: static; 111 | } 112 | 113 | #ohdear :is(.absolute) { 114 | position: absolute; 115 | } 116 | 117 | #ohdear :is(.relative) { 118 | position: relative; 119 | } 120 | 121 | #ohdear :is(.bottom-8) { 122 | bottom: 2rem; 123 | } 124 | 125 | #ohdear :is(.bottom-\[-1px\]) { 126 | bottom: -1px; 127 | } 128 | 129 | #ohdear :is(.left-0) { 130 | left: 0px; 131 | } 132 | 133 | #ohdear :is(.left-2) { 134 | left: 0.5rem; 135 | } 136 | 137 | #ohdear :is(.left-9) { 138 | left: 2.25rem; 139 | } 140 | 141 | #ohdear :is(.left-\[2\.15rem\]) { 142 | left: 2.15rem; 143 | } 144 | 145 | #ohdear :is(.right-0) { 146 | right: 0px; 147 | } 148 | 149 | #ohdear :is(.top-0) { 150 | top: 0px; 151 | } 152 | 153 | #ohdear :is(.top-1) { 154 | top: 0.25rem; 155 | } 156 | 157 | #ohdear :is(.z-0) { 158 | z-index: 0; 159 | } 160 | 161 | #ohdear :is(.\!ml-0) { 162 | margin-left: 0px !important; 163 | } 164 | 165 | #ohdear :is(.mt-2) { 166 | margin-top: 0.5rem; 167 | } 168 | 169 | #ohdear :is(.mt-20) { 170 | margin-top: 5rem; 171 | } 172 | 173 | #ohdear :is(.mt-4) { 174 | margin-top: 1rem; 175 | } 176 | 177 | #ohdear :is(.block) { 178 | display: block; 179 | } 180 | 181 | #ohdear :is(.inline-block) { 182 | display: inline-block; 183 | } 184 | 185 | #ohdear :is(.flex) { 186 | display: flex; 187 | } 188 | 189 | #ohdear :is(.grid) { 190 | display: grid; 191 | } 192 | 193 | #ohdear :is(.h-2) { 194 | height: 0.5rem; 195 | } 196 | 197 | #ohdear :is(.h-32) { 198 | height: 8rem; 199 | } 200 | 201 | #ohdear :is(.h-\[calc\(100\%-3rem\)\]) { 202 | height: calc(100% - 3rem); 203 | } 204 | 205 | #ohdear :is(.h-\[calc\(100\%-4rem\)\]) { 206 | height: calc(100% - 4rem); 207 | } 208 | 209 | #ohdear :is(.h-full) { 210 | height: 100%; 211 | } 212 | 213 | #ohdear :is(.w-10) { 214 | width: 2.5rem; 215 | } 216 | 217 | #ohdear :is(.w-2) { 218 | width: 0.5rem; 219 | } 220 | 221 | #ohdear :is(.w-32) { 222 | width: 8rem; 223 | } 224 | 225 | #ohdear :is(.w-5) { 226 | width: 1.25rem; 227 | } 228 | 229 | #ohdear :is(.w-\[10\%\]) { 230 | width: 10%; 231 | } 232 | 233 | #ohdear :is(.w-\[1px\]) { 234 | width: 1px; 235 | } 236 | 237 | #ohdear :is(.w-\[20\%\]) { 238 | width: 20%; 239 | } 240 | 241 | #ohdear :is(.w-\[25\%\]) { 242 | width: 25%; 243 | } 244 | 245 | #ohdear :is(.w-\[29\%\]) { 246 | width: 29%; 247 | } 248 | 249 | #ohdear :is(.w-\[35\%\]) { 250 | width: 35%; 251 | } 252 | 253 | #ohdear :is(.w-\[40\%\]) { 254 | width: 40%; 255 | } 256 | 257 | #ohdear :is(.w-full) { 258 | width: 100%; 259 | } 260 | 261 | #ohdear :is(.max-w-\[25\%\]) { 262 | max-width: 25%; 263 | } 264 | 265 | #ohdear :is(.table-fixed) { 266 | table-layout: fixed; 267 | } 268 | 269 | #ohdear :is(.grid-cols-1) { 270 | grid-template-columns: repeat(1, minmax(0, 1fr)); 271 | } 272 | 273 | #ohdear :is(.flex-col) { 274 | flex-direction: column; 275 | } 276 | 277 | #ohdear :is(.items-center) { 278 | align-items: center; 279 | } 280 | 281 | #ohdear :is(.justify-center) { 282 | justify-content: center; 283 | } 284 | 285 | #ohdear :is(.justify-between) { 286 | justify-content: space-between; 287 | } 288 | 289 | #ohdear :is(.gap-4) { 290 | gap: 1rem; 291 | } 292 | 293 | #ohdear :is(.gap-6) { 294 | gap: 1.5rem; 295 | } 296 | 297 | #ohdear :is(.space-x-1 > :not([hidden]) ~ :not([hidden])) { 298 | --tw-space-x-reverse: 0; 299 | margin-right: calc(0.25rem * var(--tw-space-x-reverse)); 300 | margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); 301 | } 302 | 303 | #ohdear :is(.space-x-2 > :not([hidden]) ~ :not([hidden])) { 304 | --tw-space-x-reverse: 0; 305 | margin-right: calc(0.5rem * var(--tw-space-x-reverse)); 306 | margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); 307 | } 308 | 309 | #ohdear :is(.overflow-hidden) { 310 | overflow: hidden; 311 | } 312 | 313 | #ohdear :is(.truncate) { 314 | overflow: hidden; 315 | text-overflow: ellipsis; 316 | white-space: nowrap; 317 | } 318 | 319 | #ohdear :is(.whitespace-nowrap) { 320 | white-space: nowrap; 321 | } 322 | 323 | #ohdear :is(.rounded) { 324 | border-radius: 0.25rem; 325 | } 326 | 327 | #ohdear :is(.rounded-full) { 328 | border-radius: 9999px; 329 | } 330 | 331 | #ohdear :is(.rounded-lg) { 332 | border-radius: 0.5rem; 333 | } 334 | 335 | #ohdear :is(.rounded-tr-lg) { 336 | border-top-right-radius: 0.5rem; 337 | } 338 | 339 | #ohdear :is(.border) { 340 | border-width: 1px; 341 | } 342 | 343 | #ohdear :is(.border-dashed) { 344 | border-style: dashed; 345 | } 346 | 347 | #ohdear :is(.border-emerald-400\/20) { 348 | border-color: rgb(52 211 153 / 0.2); 349 | } 350 | 351 | #ohdear :is(.bg-amber-100) { 352 | --tw-bg-opacity: 1; 353 | background-color: rgb(254 243 199 / var(--tw-bg-opacity)); 354 | } 355 | 356 | #ohdear :is(.bg-emerald-100) { 357 | --tw-bg-opacity: 1; 358 | background-color: rgb(209 250 229 / var(--tw-bg-opacity)); 359 | } 360 | 361 | #ohdear :is(.bg-emerald-500) { 362 | --tw-bg-opacity: 1; 363 | background-color: rgb(16 185 129 / var(--tw-bg-opacity)); 364 | } 365 | 366 | #ohdear :is(.bg-gray-200) { 367 | --tw-bg-opacity: 1; 368 | background-color: rgb(229 231 235 / var(--tw-bg-opacity)); 369 | } 370 | 371 | #ohdear :is(.bg-gray-600) { 372 | --tw-bg-opacity: 1; 373 | background-color: rgb(75 85 99 / var(--tw-bg-opacity)); 374 | } 375 | 376 | #ohdear :is(.bg-indigo-100) { 377 | --tw-bg-opacity: 1; 378 | background-color: rgb(224 231 255 / var(--tw-bg-opacity)); 379 | } 380 | 381 | #ohdear :is(.bg-orange-100) { 382 | --tw-bg-opacity: 1; 383 | background-color: rgb(255 237 213 / var(--tw-bg-opacity)); 384 | } 385 | 386 | #ohdear :is(.bg-pink-100) { 387 | --tw-bg-opacity: 1; 388 | background-color: rgb(252 231 243 / var(--tw-bg-opacity)); 389 | } 390 | 391 | #ohdear :is(.bg-purple-100) { 392 | --tw-bg-opacity: 1; 393 | background-color: rgb(243 232 255 / var(--tw-bg-opacity)); 394 | } 395 | 396 | #ohdear :is(.bg-red-100) { 397 | --tw-bg-opacity: 1; 398 | background-color: rgb(254 226 226 / var(--tw-bg-opacity)); 399 | } 400 | 401 | #ohdear :is(.bg-rose-100) { 402 | --tw-bg-opacity: 1; 403 | background-color: rgb(255 228 230 / var(--tw-bg-opacity)); 404 | } 405 | 406 | #ohdear :is(.bg-sky-100) { 407 | --tw-bg-opacity: 1; 408 | background-color: rgb(224 242 254 / var(--tw-bg-opacity)); 409 | } 410 | 411 | #ohdear :is(.bg-yellow-100) { 412 | --tw-bg-opacity: 1; 413 | background-color: rgb(254 249 195 / var(--tw-bg-opacity)); 414 | } 415 | 416 | #ohdear :is(.bg-gradient-to-t) { 417 | background-image: linear-gradient(to top, var(--tw-gradient-stops)); 418 | } 419 | 420 | #ohdear :is(.from-gray-100) { 421 | --tw-gradient-from: #f3f4f6 var(--tw-gradient-from-position); 422 | --tw-gradient-to: rgb(243 244 246 / 0) var(--tw-gradient-to-position); 423 | --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); 424 | } 425 | 426 | #ohdear :is(.to-gray-100\/0) { 427 | --tw-gradient-to: rgb(243 244 246 / 0) var(--tw-gradient-to-position); 428 | } 429 | 430 | #ohdear :is(.px-1) { 431 | padding-left: 0.25rem; 432 | padding-right: 0.25rem; 433 | } 434 | 435 | #ohdear :is(.px-1\.5) { 436 | padding-left: 0.375rem; 437 | padding-right: 0.375rem; 438 | } 439 | 440 | #ohdear :is(.px-2) { 441 | padding-left: 0.5rem; 442 | padding-right: 0.5rem; 443 | } 444 | 445 | #ohdear :is(.px-2\.5) { 446 | padding-left: 0.625rem; 447 | padding-right: 0.625rem; 448 | } 449 | 450 | #ohdear :is(.px-4) { 451 | padding-left: 1rem; 452 | padding-right: 1rem; 453 | } 454 | 455 | #ohdear :is(.px-6) { 456 | padding-left: 1.5rem; 457 | padding-right: 1.5rem; 458 | } 459 | 460 | #ohdear :is(.py-0) { 461 | padding-top: 0px; 462 | padding-bottom: 0px; 463 | } 464 | 465 | #ohdear :is(.py-0\.5) { 466 | padding-top: 0.125rem; 467 | padding-bottom: 0.125rem; 468 | } 469 | 470 | #ohdear :is(.py-1) { 471 | padding-top: 0.25rem; 472 | padding-bottom: 0.25rem; 473 | } 474 | 475 | #ohdear :is(.py-\[1px\]) { 476 | padding-top: 1px; 477 | padding-bottom: 1px; 478 | } 479 | 480 | #ohdear :is(.text-center) { 481 | text-align: center; 482 | } 483 | 484 | #ohdear :is(.text-right) { 485 | text-align: right; 486 | } 487 | 488 | #ohdear :is(.text-base) { 489 | font-size: 1rem; 490 | line-height: 1.5rem; 491 | } 492 | 493 | #ohdear :is(.text-sm) { 494 | font-size: 0.875rem; 495 | line-height: 1.25rem; 496 | } 497 | 498 | #ohdear :is(.text-xs) { 499 | font-size: 0.75rem; 500 | line-height: 1rem; 501 | } 502 | 503 | #ohdear :is(.font-bold) { 504 | font-weight: 700; 505 | } 506 | 507 | #ohdear :is(.font-medium) { 508 | font-weight: 500; 509 | } 510 | 511 | #ohdear :is(.uppercase) { 512 | text-transform: uppercase; 513 | } 514 | 515 | #ohdear :is(.text-amber-700) { 516 | --tw-text-opacity: 1; 517 | color: rgb(180 83 9 / var(--tw-text-opacity)); 518 | } 519 | 520 | #ohdear :is(.text-emerald-700) { 521 | --tw-text-opacity: 1; 522 | color: rgb(4 120 87 / var(--tw-text-opacity)); 523 | } 524 | 525 | #ohdear :is(.text-emerald-800) { 526 | --tw-text-opacity: 1; 527 | color: rgb(6 95 70 / var(--tw-text-opacity)); 528 | } 529 | 530 | #ohdear :is(.text-gray-300) { 531 | --tw-text-opacity: 1; 532 | color: rgb(209 213 219 / var(--tw-text-opacity)); 533 | } 534 | 535 | #ohdear :is(.text-gray-400) { 536 | --tw-text-opacity: 1; 537 | color: rgb(156 163 175 / var(--tw-text-opacity)); 538 | } 539 | 540 | #ohdear :is(.text-gray-600) { 541 | --tw-text-opacity: 1; 542 | color: rgb(75 85 99 / var(--tw-text-opacity)); 543 | } 544 | 545 | #ohdear :is(.text-gray-700) { 546 | --tw-text-opacity: 1; 547 | color: rgb(55 65 81 / var(--tw-text-opacity)); 548 | } 549 | 550 | #ohdear :is(.text-gray-800) { 551 | --tw-text-opacity: 1; 552 | color: rgb(31 41 55 / var(--tw-text-opacity)); 553 | } 554 | 555 | #ohdear :is(.text-gray-900) { 556 | --tw-text-opacity: 1; 557 | color: rgb(17 24 39 / var(--tw-text-opacity)); 558 | } 559 | 560 | #ohdear :is(.text-indigo-700) { 561 | --tw-text-opacity: 1; 562 | color: rgb(67 56 202 / var(--tw-text-opacity)); 563 | } 564 | 565 | #ohdear :is(.text-orange-700) { 566 | --tw-text-opacity: 1; 567 | color: rgb(194 65 12 / var(--tw-text-opacity)); 568 | } 569 | 570 | #ohdear :is(.text-pink-700) { 571 | --tw-text-opacity: 1; 572 | color: rgb(190 24 93 / var(--tw-text-opacity)); 573 | } 574 | 575 | #ohdear :is(.text-purple-700) { 576 | --tw-text-opacity: 1; 577 | color: rgb(126 34 206 / var(--tw-text-opacity)); 578 | } 579 | 580 | #ohdear :is(.text-red-700) { 581 | --tw-text-opacity: 1; 582 | color: rgb(185 28 28 / var(--tw-text-opacity)); 583 | } 584 | 585 | #ohdear :is(.text-rose-800) { 586 | --tw-text-opacity: 1; 587 | color: rgb(159 18 57 / var(--tw-text-opacity)); 588 | } 589 | 590 | #ohdear :is(.text-sky-700) { 591 | --tw-text-opacity: 1; 592 | color: rgb(3 105 161 / var(--tw-text-opacity)); 593 | } 594 | 595 | #ohdear :is(.text-white) { 596 | --tw-text-opacity: 1; 597 | color: rgb(255 255 255 / var(--tw-text-opacity)); 598 | } 599 | 600 | #ohdear :is(.text-yellow-700) { 601 | --tw-text-opacity: 1; 602 | color: rgb(161 98 7 / var(--tw-text-opacity)); 603 | } 604 | 605 | #ohdear :is(.underline) { 606 | text-decoration-line: underline; 607 | } 608 | 609 | #ohdear :is(.shadow-2xl) { 610 | --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); 611 | --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); 612 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 613 | } 614 | 615 | #ohdear :is(.transition-colors) { 616 | transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; 617 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 618 | transition-duration: 150ms; 619 | } 620 | 621 | #ohdear :is(.first\:h-0:first-child) { 622 | height: 0px; 623 | } 624 | 625 | #ohdear :is(.hover\:\!text-brand:hover) { 626 | --tw-text-opacity: 1 !important; 627 | color: rgb(255 57 0 / var(--tw-text-opacity)) !important; 628 | } 629 | 630 | #ohdear :is(.hover\:text-brand:hover) { 631 | --tw-text-opacity: 1; 632 | color: rgb(255 57 0 / var(--tw-text-opacity)); 633 | } 634 | 635 | @media (min-width: 1280px) { 636 | #ohdear :is(.xl\:w-\[8\%\]) { 637 | width: 8%; 638 | } 639 | } 640 | 641 | @media (min-width: 1536px) { 642 | #ohdear :is(.\32xl\:w-\[7\%\]) { 643 | width: 7%; 644 | } 645 | } 646 | 647 | #ohdear :is(:where(.dark) .dark\:border-t) { 648 | border-top-width: 1px; 649 | } 650 | 651 | #ohdear :is(:where(.dark) .dark\:border-emerald-200) { 652 | --tw-border-opacity: 1; 653 | border-color: rgb(167 243 208 / var(--tw-border-opacity)); 654 | } 655 | 656 | #ohdear :is(:where(.dark) .dark\:border-emerald-300) { 657 | --tw-border-opacity: 1; 658 | border-color: rgb(110 231 183 / var(--tw-border-opacity)); 659 | } 660 | 661 | #ohdear :is(:where(.dark) .dark\:border-emerald-400\/10) { 662 | border-color: rgb(52 211 153 / 0.1); 663 | } 664 | 665 | #ohdear :is(:where(.dark) .dark\:border-rose-300) { 666 | --tw-border-opacity: 1; 667 | border-color: rgb(253 164 175 / var(--tw-border-opacity)); 668 | } 669 | 670 | #ohdear :is(:where(.dark) .dark\:bg-emerald-700\/50) { 671 | background-color: rgb(4 120 87 / 0.5); 672 | } 673 | 674 | #ohdear :is(:where(.dark) .dark\:bg-gray-800) { 675 | --tw-bg-opacity: 1; 676 | background-color: rgb(31 41 55 / var(--tw-bg-opacity)); 677 | } 678 | 679 | #ohdear :is(:where(.dark) .dark\:bg-orange-700\/50) { 680 | background-color: rgb(194 65 12 / 0.5); 681 | } 682 | 683 | #ohdear :is(:where(.dark) .dark\:bg-gradient-to-t) { 684 | background-image: linear-gradient(to top, var(--tw-gradient-stops)); 685 | } 686 | 687 | #ohdear :is(:where(.dark) .dark\:from-emerald-400) { 688 | --tw-gradient-from: #34d399 var(--tw-gradient-from-position); 689 | --tw-gradient-to: rgb(52 211 153 / 0) var(--tw-gradient-to-position); 690 | --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); 691 | } 692 | 693 | #ohdear :is(:where(.dark) .dark\:from-emerald-500) { 694 | --tw-gradient-from: #10b981 var(--tw-gradient-from-position); 695 | --tw-gradient-to: rgb(16 185 129 / 0) var(--tw-gradient-to-position); 696 | --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); 697 | } 698 | 699 | #ohdear :is(:where(.dark) .dark\:from-gray-800\/30) { 700 | --tw-gradient-from: rgb(31 41 55 / 0.3) var(--tw-gradient-from-position); 701 | --tw-gradient-to: rgb(31 41 55 / 0) var(--tw-gradient-to-position); 702 | --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); 703 | } 704 | 705 | #ohdear :is(:where(.dark) .dark\:from-rose-500) { 706 | --tw-gradient-from: #f43f5e var(--tw-gradient-from-position); 707 | --tw-gradient-to: rgb(244 63 94 / 0) var(--tw-gradient-to-position); 708 | --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); 709 | } 710 | 711 | #ohdear :is(:where(.dark) .dark\:to-emerald-300) { 712 | --tw-gradient-to: #6ee7b7 var(--tw-gradient-to-position); 713 | } 714 | 715 | #ohdear :is(:where(.dark) .dark\:to-emerald-400) { 716 | --tw-gradient-to: #34d399 var(--tw-gradient-to-position); 717 | } 718 | 719 | #ohdear :is(:where(.dark) .dark\:to-gray-800\/0) { 720 | --tw-gradient-to: rgb(31 41 55 / 0) var(--tw-gradient-to-position); 721 | } 722 | 723 | #ohdear :is(:where(.dark) .dark\:to-rose-400) { 724 | --tw-gradient-to: #fb7185 var(--tw-gradient-to-position); 725 | } 726 | 727 | #ohdear :is(:where(.dark) .dark\:text-emerald-200) { 728 | --tw-text-opacity: 1; 729 | color: rgb(167 243 208 / var(--tw-text-opacity)); 730 | } 731 | 732 | #ohdear :is(:where(.dark) .dark\:text-gray-100) { 733 | --tw-text-opacity: 1; 734 | color: rgb(243 244 246 / var(--tw-text-opacity)); 735 | } 736 | 737 | #ohdear :is(:where(.dark) .dark\:text-gray-300) { 738 | --tw-text-opacity: 1; 739 | color: rgb(209 213 219 / var(--tw-text-opacity)); 740 | } 741 | 742 | #ohdear :is(:where(.dark) .dark\:text-gray-400) { 743 | --tw-text-opacity: 1; 744 | color: rgb(156 163 175 / var(--tw-text-opacity)); 745 | } 746 | 747 | #ohdear :is(:where(.dark) .dark\:text-gray-500) { 748 | --tw-text-opacity: 1; 749 | color: rgb(107 114 128 / var(--tw-text-opacity)); 750 | } 751 | 752 | #ohdear :is(:where(.dark) .dark\:text-gray-600) { 753 | --tw-text-opacity: 1; 754 | color: rgb(75 85 99 / var(--tw-text-opacity)); 755 | } 756 | 757 | #ohdear :is(:where(.dark) .dark\:text-gray-900) { 758 | --tw-text-opacity: 1; 759 | color: rgb(17 24 39 / var(--tw-text-opacity)); 760 | } 761 | 762 | #ohdear :is(:where(.dark) .dark\:text-orange-200) { 763 | --tw-text-opacity: 1; 764 | color: rgb(254 215 170 / var(--tw-text-opacity)); 765 | } 766 | 767 | #ohdear :is(:where(.dark) .dark\:hover\:text-brand:hover) { 768 | --tw-text-opacity: 1; 769 | color: rgb(255 57 0 / var(--tw-text-opacity)); 770 | } 771 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@alloc/quick-lru@^5.2.0": 6 | version "5.2.0" 7 | resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" 8 | integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== 9 | 10 | "@jridgewell/gen-mapping@^0.3.2": 11 | version "0.3.3" 12 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" 13 | integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== 14 | dependencies: 15 | "@jridgewell/set-array" "^1.0.1" 16 | "@jridgewell/sourcemap-codec" "^1.4.10" 17 | "@jridgewell/trace-mapping" "^0.3.9" 18 | 19 | "@jridgewell/resolve-uri@^3.1.0": 20 | version "3.1.1" 21 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 22 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 23 | 24 | "@jridgewell/set-array@^1.0.1": 25 | version "1.1.2" 26 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 27 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 28 | 29 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 30 | version "1.4.15" 31 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 32 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 33 | 34 | "@jridgewell/trace-mapping@^0.3.9": 35 | version "0.3.20" 36 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" 37 | integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== 38 | dependencies: 39 | "@jridgewell/resolve-uri" "^3.1.0" 40 | "@jridgewell/sourcemap-codec" "^1.4.14" 41 | 42 | "@nodelib/fs.scandir@2.1.5": 43 | version "2.1.5" 44 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 45 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 46 | dependencies: 47 | "@nodelib/fs.stat" "2.0.5" 48 | run-parallel "^1.1.9" 49 | 50 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 51 | version "2.0.5" 52 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 53 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 54 | 55 | "@nodelib/fs.walk@^1.2.3": 56 | version "1.2.8" 57 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 58 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 59 | dependencies: 60 | "@nodelib/fs.scandir" "2.1.5" 61 | fastq "^1.6.0" 62 | 63 | any-promise@^1.0.0: 64 | version "1.3.0" 65 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 66 | integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== 67 | 68 | anymatch@~3.1.2: 69 | version "3.1.3" 70 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 71 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 72 | dependencies: 73 | normalize-path "^3.0.0" 74 | picomatch "^2.0.4" 75 | 76 | arg@^5.0.2: 77 | version "5.0.2" 78 | resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" 79 | integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== 80 | 81 | balanced-match@^1.0.0: 82 | version "1.0.2" 83 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 84 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 85 | 86 | binary-extensions@^2.0.0: 87 | version "2.2.0" 88 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 89 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 90 | 91 | brace-expansion@^1.1.7: 92 | version "1.1.11" 93 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 94 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 95 | dependencies: 96 | balanced-match "^1.0.0" 97 | concat-map "0.0.1" 98 | 99 | braces@^3.0.2, braces@~3.0.2: 100 | version "3.0.2" 101 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 102 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 103 | dependencies: 104 | fill-range "^7.0.1" 105 | 106 | camelcase-css@^2.0.1: 107 | version "2.0.1" 108 | resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" 109 | integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== 110 | 111 | chokidar@^3.5.3: 112 | version "3.5.3" 113 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 114 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 115 | dependencies: 116 | anymatch "~3.1.2" 117 | braces "~3.0.2" 118 | glob-parent "~5.1.2" 119 | is-binary-path "~2.1.0" 120 | is-glob "~4.0.1" 121 | normalize-path "~3.0.0" 122 | readdirp "~3.6.0" 123 | optionalDependencies: 124 | fsevents "~2.3.2" 125 | 126 | commander@^4.0.0: 127 | version "4.1.1" 128 | resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" 129 | integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== 130 | 131 | concat-map@0.0.1: 132 | version "0.0.1" 133 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 134 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 135 | 136 | cssesc@^3.0.0: 137 | version "3.0.0" 138 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" 139 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 140 | 141 | didyoumean@^1.2.2: 142 | version "1.2.2" 143 | resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" 144 | integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== 145 | 146 | dlv@^1.1.3: 147 | version "1.1.3" 148 | resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" 149 | integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== 150 | 151 | fast-glob@^3.3.0: 152 | version "3.3.2" 153 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 154 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 155 | dependencies: 156 | "@nodelib/fs.stat" "^2.0.2" 157 | "@nodelib/fs.walk" "^1.2.3" 158 | glob-parent "^5.1.2" 159 | merge2 "^1.3.0" 160 | micromatch "^4.0.4" 161 | 162 | fastq@^1.6.0: 163 | version "1.15.0" 164 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 165 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 166 | dependencies: 167 | reusify "^1.0.4" 168 | 169 | fill-range@^7.0.1: 170 | version "7.0.1" 171 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 172 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 173 | dependencies: 174 | to-regex-range "^5.0.1" 175 | 176 | fs.realpath@^1.0.0: 177 | version "1.0.0" 178 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 179 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 180 | 181 | fsevents@~2.3.2: 182 | version "2.3.3" 183 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 184 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 185 | 186 | function-bind@^1.1.2: 187 | version "1.1.2" 188 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 189 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 190 | 191 | glob-parent@^5.1.2, glob-parent@~5.1.2: 192 | version "5.1.2" 193 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 194 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 195 | dependencies: 196 | is-glob "^4.0.1" 197 | 198 | glob-parent@^6.0.2: 199 | version "6.0.2" 200 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 201 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 202 | dependencies: 203 | is-glob "^4.0.3" 204 | 205 | glob@7.1.6: 206 | version "7.1.6" 207 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 208 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 209 | dependencies: 210 | fs.realpath "^1.0.0" 211 | inflight "^1.0.4" 212 | inherits "2" 213 | minimatch "^3.0.4" 214 | once "^1.3.0" 215 | path-is-absolute "^1.0.0" 216 | 217 | hasown@^2.0.0: 218 | version "2.0.0" 219 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" 220 | integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== 221 | dependencies: 222 | function-bind "^1.1.2" 223 | 224 | inflight@^1.0.4: 225 | version "1.0.6" 226 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 227 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 228 | dependencies: 229 | once "^1.3.0" 230 | wrappy "1" 231 | 232 | inherits@2: 233 | version "2.0.4" 234 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 235 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 236 | 237 | is-binary-path@~2.1.0: 238 | version "2.1.0" 239 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 240 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 241 | dependencies: 242 | binary-extensions "^2.0.0" 243 | 244 | is-core-module@^2.13.0: 245 | version "2.13.1" 246 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" 247 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== 248 | dependencies: 249 | hasown "^2.0.0" 250 | 251 | is-extglob@^2.1.1: 252 | version "2.1.1" 253 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 254 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 255 | 256 | is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 257 | version "4.0.3" 258 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 259 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 260 | dependencies: 261 | is-extglob "^2.1.1" 262 | 263 | is-number@^7.0.0: 264 | version "7.0.0" 265 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 266 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 267 | 268 | jiti@^1.19.1: 269 | version "1.21.0" 270 | resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" 271 | integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== 272 | 273 | lilconfig@^2.1.0: 274 | version "2.1.0" 275 | resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" 276 | integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== 277 | 278 | lilconfig@^3.0.0: 279 | version "3.0.0" 280 | resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" 281 | integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== 282 | 283 | lines-and-columns@^1.1.6: 284 | version "1.2.4" 285 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" 286 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 287 | 288 | merge2@^1.3.0: 289 | version "1.4.1" 290 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 291 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 292 | 293 | micromatch@^4.0.4, micromatch@^4.0.5: 294 | version "4.0.5" 295 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 296 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 297 | dependencies: 298 | braces "^3.0.2" 299 | picomatch "^2.3.1" 300 | 301 | minimatch@^3.0.4: 302 | version "3.1.2" 303 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 304 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 305 | dependencies: 306 | brace-expansion "^1.1.7" 307 | 308 | mz@^2.7.0: 309 | version "2.7.0" 310 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 311 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 312 | dependencies: 313 | any-promise "^1.0.0" 314 | object-assign "^4.0.1" 315 | thenify-all "^1.0.0" 316 | 317 | nanoid@^3.3.7: 318 | version "3.3.7" 319 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 320 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 321 | 322 | normalize-path@^3.0.0, normalize-path@~3.0.0: 323 | version "3.0.0" 324 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 325 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 326 | 327 | object-assign@^4.0.1: 328 | version "4.1.1" 329 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 330 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 331 | 332 | object-hash@^3.0.0: 333 | version "3.0.0" 334 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" 335 | integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== 336 | 337 | once@^1.3.0: 338 | version "1.4.0" 339 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 340 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 341 | dependencies: 342 | wrappy "1" 343 | 344 | path-is-absolute@^1.0.0: 345 | version "1.0.1" 346 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 347 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 348 | 349 | path-parse@^1.0.7: 350 | version "1.0.7" 351 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 352 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 353 | 354 | picocolors@^1.0.0: 355 | version "1.0.0" 356 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 357 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 358 | 359 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 360 | version "2.3.1" 361 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 362 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 363 | 364 | pify@^2.3.0: 365 | version "2.3.0" 366 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 367 | integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== 368 | 369 | pirates@^4.0.1: 370 | version "4.0.6" 371 | resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" 372 | integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== 373 | 374 | postcss-import@^15.1.0: 375 | version "15.1.0" 376 | resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" 377 | integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== 378 | dependencies: 379 | postcss-value-parser "^4.0.0" 380 | read-cache "^1.0.0" 381 | resolve "^1.1.7" 382 | 383 | postcss-js@^4.0.1: 384 | version "4.0.1" 385 | resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" 386 | integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== 387 | dependencies: 388 | camelcase-css "^2.0.1" 389 | 390 | postcss-load-config@^4.0.1: 391 | version "4.0.2" 392 | resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" 393 | integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== 394 | dependencies: 395 | lilconfig "^3.0.0" 396 | yaml "^2.3.4" 397 | 398 | postcss-nested@^6.0.1: 399 | version "6.0.1" 400 | resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" 401 | integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== 402 | dependencies: 403 | postcss-selector-parser "^6.0.11" 404 | 405 | postcss-selector-parser@^6.0.11: 406 | version "6.0.13" 407 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" 408 | integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== 409 | dependencies: 410 | cssesc "^3.0.0" 411 | util-deprecate "^1.0.2" 412 | 413 | postcss-value-parser@^4.0.0: 414 | version "4.2.0" 415 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" 416 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 417 | 418 | postcss@^8.4.23: 419 | version "8.4.32" 420 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" 421 | integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== 422 | dependencies: 423 | nanoid "^3.3.7" 424 | picocolors "^1.0.0" 425 | source-map-js "^1.0.2" 426 | 427 | queue-microtask@^1.2.2: 428 | version "1.2.3" 429 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 430 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 431 | 432 | read-cache@^1.0.0: 433 | version "1.0.0" 434 | resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" 435 | integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== 436 | dependencies: 437 | pify "^2.3.0" 438 | 439 | readdirp@~3.6.0: 440 | version "3.6.0" 441 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 442 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 443 | dependencies: 444 | picomatch "^2.2.1" 445 | 446 | resolve@^1.1.7, resolve@^1.22.2: 447 | version "1.22.8" 448 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" 449 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 450 | dependencies: 451 | is-core-module "^2.13.0" 452 | path-parse "^1.0.7" 453 | supports-preserve-symlinks-flag "^1.0.0" 454 | 455 | reusify@^1.0.4: 456 | version "1.0.4" 457 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 458 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 459 | 460 | run-parallel@^1.1.9: 461 | version "1.2.0" 462 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 463 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 464 | dependencies: 465 | queue-microtask "^1.2.2" 466 | 467 | source-map-js@^1.0.2: 468 | version "1.0.2" 469 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 470 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 471 | 472 | sucrase@^3.32.0: 473 | version "3.34.0" 474 | resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" 475 | integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== 476 | dependencies: 477 | "@jridgewell/gen-mapping" "^0.3.2" 478 | commander "^4.0.0" 479 | glob "7.1.6" 480 | lines-and-columns "^1.1.6" 481 | mz "^2.7.0" 482 | pirates "^4.0.1" 483 | ts-interface-checker "^0.1.9" 484 | 485 | supports-preserve-symlinks-flag@^1.0.0: 486 | version "1.0.0" 487 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 488 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 489 | 490 | tailwindcss@^3.3.6: 491 | version "3.3.6" 492 | resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.6.tgz#4dd7986bf4902ad385d90d45fd4b2fa5fab26d5f" 493 | integrity sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw== 494 | dependencies: 495 | "@alloc/quick-lru" "^5.2.0" 496 | arg "^5.0.2" 497 | chokidar "^3.5.3" 498 | didyoumean "^1.2.2" 499 | dlv "^1.1.3" 500 | fast-glob "^3.3.0" 501 | glob-parent "^6.0.2" 502 | is-glob "^4.0.3" 503 | jiti "^1.19.1" 504 | lilconfig "^2.1.0" 505 | micromatch "^4.0.5" 506 | normalize-path "^3.0.0" 507 | object-hash "^3.0.0" 508 | picocolors "^1.0.0" 509 | postcss "^8.4.23" 510 | postcss-import "^15.1.0" 511 | postcss-js "^4.0.1" 512 | postcss-load-config "^4.0.1" 513 | postcss-nested "^6.0.1" 514 | postcss-selector-parser "^6.0.11" 515 | resolve "^1.22.2" 516 | sucrase "^3.32.0" 517 | 518 | thenify-all@^1.0.0: 519 | version "1.6.0" 520 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 521 | integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== 522 | dependencies: 523 | thenify ">= 3.1.0 < 4" 524 | 525 | "thenify@>= 3.1.0 < 4": 526 | version "3.3.1" 527 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" 528 | integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== 529 | dependencies: 530 | any-promise "^1.0.0" 531 | 532 | to-regex-range@^5.0.1: 533 | version "5.0.1" 534 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 535 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 536 | dependencies: 537 | is-number "^7.0.0" 538 | 539 | ts-interface-checker@^0.1.9: 540 | version "0.1.13" 541 | resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" 542 | integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== 543 | 544 | util-deprecate@^1.0.2: 545 | version "1.0.2" 546 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 547 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 548 | 549 | wrappy@1: 550 | version "1.0.2" 551 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 552 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 553 | 554 | yaml@^2.3.4: 555 | version "2.3.4" 556 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" 557 | integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== 558 | --------------------------------------------------------------------------------