From 733f0aa228bc1a2d6c40366251edc20e010b52cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Wed, 7 Apr 2021 20:16:47 +0200 Subject: [PATCH] back/forward buttons, fix timestamps in DB --- .DS_Store | Bin 6148 -> 6148 bytes app/Models/Tip.php | 1 + app/Twitter/Tweet.php | 7 +- composer.lock | 46 +- content/threads/1-rt-1-tip.md | 2 +- content/threads/laravel-clean-code-tactics.md | 4 +- content/tips/avoid-helper-classes.md | 2 +- .../avoid-queries-in-blade-when-possible.md | 2 +- content/tips/be-friends-with-your-ide.md | 2 +- ...-creating-a-class-just-for-a-single-use.md | 2 +- .../tips/comparing-changes-on-saving-using.md | 2 +- .../consider-single-action-controllers.md | 2 +- content/tips/consider-using-form-requests.md | 2 +- ...ead-of-facades-they-can-clean-things-up.md | 2 +- content/tips/context-matters.md | 2 +- content/tips/create-action-classes.md | 2 +- ...tom-blade-directives-for-business-logic.md | 2 +- content/tips/create-fluent-objects.md | 2 +- content/tips/create-helper-functions.md | 2 +- ...create-model-methods-for-business-logic.md | 2 +- .../create-query-scopes-for-complex-wheres.md | 2 +- .../tips/create-single-use-blade-includes.md | 2 +- content/tips/create-single-use-traits.md | 2 +- ...variables-when-they-improve-readability.md | 2 +- ...e-a-weekend-towards-learning-proper-oop.md | 2 +- ...en-you-can-just-pass-the-value-directly.md | 2 +- ...t-just-write-procedural-code-in-classes.md | 2 +- ...aces-but-dont-make-them-too-long-either.md | 2 +- .../tips/dont-use-a-controller-namespace.md | 2 +- content/tips/dont-use-abbreviations.md | 2 +- ...dont-use-model-methods-to-retrieve-data.md | 2 +- .../tips/eloquent-listeners-are-awesome.md | 2 +- ...g-a-parent-relationship-for-some-things.md | 2 +- ...e-deleting-associated-files-on-deletion.md | 2 +- content/tips/extract-methods.md | 2 +- ...le-source-of-truth-for-validation-rules.md | 2 +- ...f-the-model-state-stuff-mentioned-above.md | 2 +- ...ks-with-both-array-and-model-properties.md | 2 +- ...of-vue-data-you-can-use-arrow-functions.md | 2 +- ...have-to-pass-the-team-id-to-every-route.md | 2 +- ...tack-trace-executed-queries-app-context.md | 2 +- ...ort-namespaces-instead-of-using-aliases.md | 2 +- ...-wanted-value-based-on-the-key-you-have.md | 2 +- content/tips/its-about-the-micro.md | 2 +- ...ave-a-very-nice-syntax-for-foreign-keys.md | 2 +- ...esourcestoolscards-based-on-an-if-check.md | 2 +- ...l-telescope-is-great-for-so-many-things.md | 2 +- ...ople-underutilize-the-exception-handler.md | 2 +- .../relevant-for-people-building-packages.md | 2 +- ...ur-codebase-in-one-phplaravel-app-state.md | 2 +- content/tips/this-one-is-less-obscure.md | 2 +- ...uch-cool-stuff-you-can-do-with-eloquent.md | 2 +- ...sary-nesting-by-returning-a-value-early.md | 2 +- ...ctions-when-they-can-clean-up-your-code.md | 2 +- content/tips/use-custom-collections.md | 2 +- content/tips/use-custom-config-files.md | 2 +- .../tips/use-data-transfer-objects-dtos.md | 2 +- ...docblocks-only-when-they-clarify-things.md | 2 +- content/tips/use-events.md | 2 +- .../tips/use-expressive-names-for-methods.md | 2 +- content/tips/use-short-operators.md | 2 +- content/tips/use-strict-comparison.md | 2 +- ...a-incur-a-database-query-for-each-model.md | 2 +- ...model-instance-youll-have-to-refresh-it.md | 2 +- ...ture-looks-at-each-point-of-the-process.md | 2 +- ...te-functional-code-when-it-benefits-you.md | 2 +- ...r-when-method-to-handle-complex-sorting.md | 2 +- ...his-method-will-be-displayed-in-horizon.md | 2 +- ...thats-added-using-a-subquery-in-a-scope.md | 2 +- ...-custom-objects-work-perfectly-well-too.md | 2 +- ...ng-saving-deleting-to-cancel-the-action.md | 2 +- ...how-the-rendered-version-in-the-browser.md | 2 +- .../you-can-use-wherexandy-in-eloquent.md | 2 +- public/css/app.css | 1728 +----- public/js/app.js | 5043 +---------------- public/mix-manifest.json | 4 +- resources/views/components/layout.blade.php | 9 +- resources/views/components/socials.blade.php | 48 +- resources/views/tips/show.blade.php | 49 +- 79 files changed, 171 insertions(+), 6904 deletions(-) diff --git a/.DS_Store b/.DS_Store index f46d66154d5a09b1df9427e16d76b2c0ad7f5a27..cc86c354048140c9d993449d74ce31b8a40558ee 100644 GIT binary patch delta 323 zcmZoMXfc=|#>B)qu~2NHo}wr-0|Nsi1A_nqLncFVQh9MfQcix-#*51t>p?PX3WK`cn3CJzu~2NHo}wrd0|Nsi1A_nqLncFVS#VKaPJUkc#6tDS1|lq*zcLB2 vZgyZ!W7^El!Oy|O(6-r-`8)Guei2 $tweet->author->profile_image_url, ])->username, 'images' => array_map(fn (TwitterImage $image) => $image->url, $tweet->images), + 'created_at' => $tweet->created_at, ]); } diff --git a/app/Twitter/Tweet.php b/app/Twitter/Tweet.php index a9fce52..d63d10e 100644 --- a/app/Twitter/Tweet.php +++ b/app/Twitter/Tweet.php @@ -2,6 +2,7 @@ namespace App\Twitter; +use Carbon\Carbon; use Illuminate\Support\Facades\Http; /** @@ -14,18 +15,21 @@ class Tweet public TwitterUser $author; public ?string $threadId = null; public array $images = []; + public Carbon $created_at; public function __construct( string $id, string $text, TwitterUser $author, ?string $threadId = null, + Carbon $created_at, array $images = [], ) { $this->id = $id; $this->text = $text; $this->author = $author; $this->threadId = $threadId; + $this->created_at = $created_at; $this->images = $images; } @@ -36,7 +40,7 @@ class Tweet ->withToken(config('services.twitter.token')) ->get('https://api.twitter.com/2/tweets/' . $id, [ 'media.fields' => 'url', - 'tweet.fields' => 'conversation_id,entities', + 'tweet.fields' => 'conversation_id,entities,created_at', 'user.fields' => 'profile_image_url', 'expansions' => 'attachments.media_keys,author_id', ]); @@ -66,6 +70,7 @@ class Tweet $author['profile_image_url'], ), $response->json('data.conversation_id'), + Carbon::make($response->json('data.created_at')), array_map(fn (string $url) => new TwitterImage($url), $response->json('includes.media.*.url', [])), ); } diff --git a/composer.lock b/composer.lock index c67ec3e..dd19e0b 100644 --- a/composer.lock +++ b/composer.lock @@ -895,16 +895,16 @@ }, { "name": "laravel/framework", - "version": "v8.35.1", + "version": "v8.36.2", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "d118c0df39e7524131176aaf76493eae63a8a602" + "reference": "0debd8ad6b5aa1f61ccc73910adf049af4ca0444" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/d118c0df39e7524131176aaf76493eae63a8a602", - "reference": "d118c0df39e7524131176aaf76493eae63a8a602", + "url": "https://api.github.com/repos/laravel/framework/zipball/0debd8ad6b5aa1f61ccc73910adf049af4ca0444", + "reference": "0debd8ad6b5aa1f61ccc73910adf049af4ca0444", "shasum": "" }, "require": { @@ -1059,7 +1059,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-03-30T21:34:17+00:00" + "time": "2021-04-07T12:37:22+00:00" }, { "name": "laravel/tinker", @@ -2440,16 +2440,16 @@ }, { "name": "ryangjchandler/orbit", - "version": "v0.7.2", + "version": "v0.7.4", "source": { "type": "git", "url": "https://github.com/ryangjchandler/orbit.git", - "reference": "b01f1d8c28586410ce3bf3c3ada9c131e03b9ff9" + "reference": "2636eb680e96a3cd4e2a911e44df3850f4e90518" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ryangjchandler/orbit/zipball/b01f1d8c28586410ce3bf3c3ada9c131e03b9ff9", - "reference": "b01f1d8c28586410ce3bf3c3ada9c131e03b9ff9", + "url": "https://api.github.com/repos/ryangjchandler/orbit/zipball/2636eb680e96a3cd4e2a911e44df3850f4e90518", + "reference": "2636eb680e96a3cd4e2a911e44df3850f4e90518", "shasum": "" }, "require": { @@ -2496,7 +2496,7 @@ "description": "A flat-file database driver for Eloquent.", "support": { "issues": "https://github.com/ryangjchandler/orbit/issues", - "source": "https://github.com/ryangjchandler/orbit/tree/v0.7.2" + "source": "https://github.com/ryangjchandler/orbit/tree/v0.7.4" }, "funding": [ { @@ -2504,7 +2504,7 @@ "type": "github" } ], - "time": "2021-03-29T13:10:29+00:00" + "time": "2021-04-04T21:29:16+00:00" }, { "name": "spatie/yaml-front-matter", @@ -4883,16 +4883,16 @@ }, { "name": "symplify/git-wrapper", - "version": "v9.2.12", + "version": "v9.2.14", "source": { "type": "git", "url": "https://github.com/symplify/git-wrapper.git", - "reference": "ab372196b2925900d94f06bd97c73deb0654bc94" + "reference": "790b91b137bb26eaebe8f56a6961883439874f71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/git-wrapper/zipball/ab372196b2925900d94f06bd97c73deb0654bc94", - "reference": "ab372196b2925900d94f06bd97c73deb0654bc94", + "url": "https://api.github.com/repos/symplify/git-wrapper/zipball/790b91b137bb26eaebe8f56a6961883439874f71", + "reference": "790b91b137bb26eaebe8f56a6961883439874f71", "shasum": "" }, "require": { @@ -4905,7 +4905,7 @@ "ondram/ci-detector": "^3.5", "phpunit/phpunit": "^9.5", "psr/log": "^1.1", - "symplify/smart-file-system": "^9.2.12" + "symplify/smart-file-system": "^9.2.14" }, "type": "library", "autoload": { @@ -4924,7 +4924,7 @@ "git wrapper" ], "support": { - "source": "https://github.com/symplify/git-wrapper/tree/v9.2.12" + "source": "https://github.com/symplify/git-wrapper/tree/v9.2.14" }, "funding": [ { @@ -4936,7 +4936,7 @@ "type": "github" } ], - "time": "2021-03-19T11:24:34+00:00" + "time": "2021-03-22T13:11:48+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -5658,16 +5658,16 @@ }, { "name": "laravel/sail", - "version": "v1.4.10", + "version": "v1.4.11", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "4f0b2bac128ee60a11d9758651f103f78157474a" + "reference": "e46a3228da4e95a411a981ac807bd119ab2485fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/4f0b2bac128ee60a11d9758651f103f78157474a", - "reference": "4f0b2bac128ee60a11d9758651f103f78157474a", + "url": "https://api.github.com/repos/laravel/sail/zipball/e46a3228da4e95a411a981ac807bd119ab2485fa", + "reference": "e46a3228da4e95a411a981ac807bd119ab2485fa", "shasum": "" }, "require": { @@ -5714,7 +5714,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2021-03-30T21:26:44+00:00" + "time": "2021-04-06T14:00:39+00:00" }, { "name": "mockery/mockery", diff --git a/content/threads/1-rt-1-tip.md b/content/threads/1-rt-1-tip.md index ab063ae..1e73ac5 100644 --- a/content/threads/1-rt-1-tip.md +++ b/content/threads/1-rt-1-tip.md @@ -3,6 +3,6 @@ slug: 1-rt-1-tip title: '1 RT = 1 tip' tweet_id: 1308082888324374528 author_username: samuelstancl -created_at: 2021-04-06T16:07:39+00:00 +created_at: 2021-04-07T18:16:23+00:00 --- A thread of misc tips, originally one tip per one retweet. \ No newline at end of file diff --git a/content/threads/laravel-clean-code-tactics.md b/content/threads/laravel-clean-code-tactics.md index 86a8b84..92b8c38 100644 --- a/content/threads/laravel-clean-code-tactics.md +++ b/content/threads/laravel-clean-code-tactics.md @@ -3,6 +3,6 @@ slug: laravel-clean-code-tactics title: 'Laravel Clean Code Tactics' tweet_id: 1272822437181378561 author_username: samuelstancl -created_at: 2021-04-06T16:07:22+00:00 +created_at: 2021-04-07T18:16:07+00:00 --- -Get the PDF versions [here](https://gum.co/laravel-clean-code) \ No newline at end of file +The OG thread. Get printable PDF versions [here](https://gum.co/laravel-clean-code). \ No newline at end of file diff --git a/content/tips/avoid-helper-classes.md b/content/tips/avoid-helper-classes.md index a075f24..e0dc138 100644 --- a/content/tips/avoid-helper-classes.md +++ b/content/tips/avoid-helper-classes.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean2CnyWoAEZ3Ef.jpg' -created_at: 2021-04-06T16:07:28+00:00 +created_at: 2020-06-16T09:24:56+00:00 slug: avoid-helper-classes --- diff --git a/content/tips/avoid-queries-in-blade-when-possible.md b/content/tips/avoid-queries-in-blade-when-possible.md index 2f57f00..2e074e1 100644 --- a/content/tips/avoid-queries-in-blade-when-possible.md +++ b/content/tips/avoid-queries-in-blade-when-possible.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean7jvPWkAAp2_6.jpg' -created_at: 2021-04-06T16:07:36+00:00 +created_at: 2020-06-16T09:40:48+00:00 slug: avoid-queries-in-blade-when-possible --- diff --git a/content/tips/be-friends-with-your-ide.md b/content/tips/be-friends-with-your-ide.md index 893a7e5..1e4b290 100644 --- a/content/tips/be-friends-with-your-ide.md +++ b/content/tips/be-friends-with-your-ide.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean6t2ZXgAEiJMa.jpg' -created_at: 2021-04-06T16:07:34+00:00 +created_at: 2020-06-16T09:40:46+00:00 slug: be-friends-with-your-ide --- diff --git a/content/tips/closure-validation-rules-are-theyre-often-better-than-creating-a-class-just-for-a-single-use.md b/content/tips/closure-validation-rules-are-theyre-often-better-than-creating-a-class-just-for-a-single-use.md index 62f88d9..45f9caf 100644 --- a/content/tips/closure-validation-rules-are-theyre-often-better-than-creating-a-class-just-for-a-single-use.md +++ b/content/tips/closure-validation-rules-are-theyre-often-better-than-creating-a-class-just-for-a-single-use.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidAtSYXgAc-6tH.png' -created_at: 2021-04-06T16:07:41+00:00 +created_at: 2020-09-21T16:48:18+00:00 slug: closure-validation-rules-are-theyre-often-better-than-creating-a-class-just-for-a-single-use --- diff --git a/content/tips/comparing-changes-on-saving-using.md b/content/tips/comparing-changes-on-saving-using.md index d0f6e8b..bba05c6 100644 --- a/content/tips/comparing-changes-on-saving-using.md +++ b/content/tips/comparing-changes-on-saving-using.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidZs1IWAAUgH0m.png' -created_at: 2021-04-06T16:07:44+00:00 +created_at: 2020-09-21T18:38:04+00:00 slug: comparing-changes-on-saving-using --- diff --git a/content/tips/consider-single-action-controllers.md b/content/tips/consider-single-action-controllers.md index e366293..4deaca5 100644 --- a/content/tips/consider-single-action-controllers.md +++ b/content/tips/consider-single-action-controllers.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean6Sn9XkAA-WKS.png' -created_at: 2021-04-06T16:07:34+00:00 +created_at: 2020-06-16T09:40:45+00:00 slug: consider-single-action-controllers --- diff --git a/content/tips/consider-using-form-requests.md b/content/tips/consider-using-form-requests.md index 0983863..870672d 100644 --- a/content/tips/consider-using-form-requests.md +++ b/content/tips/consider-using-form-requests.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean0kWgXgAAcOXm.jpg' -created_at: 2021-04-06T16:07:26+00:00 +created_at: 2020-06-16T09:24:55+00:00 slug: consider-using-form-requests --- diff --git a/content/tips/consider-using-helpers-instead-of-facades-they-can-clean-things-up.md b/content/tips/consider-using-helpers-instead-of-facades-they-can-clean-things-up.md index 099b59b..d139626 100644 --- a/content/tips/consider-using-helpers-instead-of-facades-they-can-clean-things-up.md +++ b/content/tips/consider-using-helpers-instead-of-facades-they-can-clean-things-up.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean7QGBXYAEt_l2.jpg' -created_at: 2021-04-06T16:07:35+00:00 +created_at: 2020-06-16T09:40:47+00:00 slug: consider-using-helpers-instead-of-facades-they-can-clean-things-up --- diff --git a/content/tips/context-matters.md b/content/tips/context-matters.md index 3737810..e55f2e7 100644 --- a/content/tips/context-matters.md +++ b/content/tips/context-matters.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean8vC0WAAEomIq.jpg' -created_at: 2021-04-06T16:07:38+00:00 +created_at: 2020-06-16T09:40:51+00:00 slug: context-matters --- diff --git a/content/tips/create-action-classes.md b/content/tips/create-action-classes.md index 68ffe95..d77aff1 100644 --- a/content/tips/create-action-classes.md +++ b/content/tips/create-action-classes.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean0gvIWsAAIfxK.jpg' -created_at: 2021-04-06T16:07:26+00:00 +created_at: 2020-06-16T09:24:54+00:00 slug: create-action-classes --- diff --git a/content/tips/create-custom-blade-directives-for-business-logic.md b/content/tips/create-custom-blade-directives-for-business-logic.md index 0a4ad72..1af9888 100644 --- a/content/tips/create-custom-blade-directives-for-business-logic.md +++ b/content/tips/create-custom-blade-directives-for-business-logic.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean7bYSXkAIwDIR.png' -created_at: 2021-04-06T16:07:35+00:00 +created_at: 2020-06-16T09:40:48+00:00 slug: create-custom-blade-directives-for-business-logic --- diff --git a/content/tips/create-fluent-objects.md b/content/tips/create-fluent-objects.md index 2a32ca6..dfabd8e 100644 --- a/content/tips/create-fluent-objects.md +++ b/content/tips/create-fluent-objects.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean3zqXWAAASnOP.png' -created_at: 2021-04-06T16:07:29+00:00 +created_at: 2020-06-16T09:24:58+00:00 slug: create-fluent-objects --- diff --git a/content/tips/create-helper-functions.md b/content/tips/create-helper-functions.md index 78066b8..a9f2134 100644 --- a/content/tips/create-helper-functions.md +++ b/content/tips/create-helper-functions.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean1ow4WoAAFjoT.jpg' -created_at: 2021-04-06T16:07:27+00:00 +created_at: 2020-06-16T09:24:56+00:00 slug: create-helper-functions --- diff --git a/content/tips/create-model-methods-for-business-logic.md b/content/tips/create-model-methods-for-business-logic.md index 19493c2..e45592e 100644 --- a/content/tips/create-model-methods-for-business-logic.md +++ b/content/tips/create-model-methods-for-business-logic.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean0WGiWAAAg4cu.jpg' -created_at: 2021-04-06T16:07:25+00:00 +created_at: 2020-06-16T09:24:54+00:00 slug: create-model-methods-for-business-logic --- diff --git a/content/tips/create-query-scopes-for-complex-wheres.md b/content/tips/create-query-scopes-for-complex-wheres.md index 8cfa8bb..a1f4d22 100644 --- a/content/tips/create-query-scopes-for-complex-wheres.md +++ b/content/tips/create-query-scopes-for-complex-wheres.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean5ymtXgAEvlxm.jpg' -created_at: 2021-04-06T16:07:32+00:00 +created_at: 2020-06-16T09:40:43+00:00 slug: create-query-scopes-for-complex-wheres --- diff --git a/content/tips/create-single-use-blade-includes.md b/content/tips/create-single-use-blade-includes.md index 4854748..293a653 100644 --- a/content/tips/create-single-use-blade-includes.md +++ b/content/tips/create-single-use-blade-includes.md @@ -4,7 +4,7 @@ tweet_id: '1272826427902234625' thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: { } -created_at: 2021-04-06T16:07:31+00:00 +created_at: 2020-06-16T09:40:43+00:00 slug: create-single-use-blade-includes --- diff --git a/content/tips/create-single-use-traits.md b/content/tips/create-single-use-traits.md index 8dd2e6c..309627f 100644 --- a/content/tips/create-single-use-traits.md +++ b/content/tips/create-single-use-traits.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean5BnEWkAEPUTe.jpg' -created_at: 2021-04-06T16:07:31+00:00 +created_at: 2020-06-16T09:25:01+00:00 slug: create-single-use-traits --- diff --git a/content/tips/create-variables-when-they-improve-readability.md b/content/tips/create-variables-when-they-improve-readability.md index 5b94412..3c91002 100644 --- a/content/tips/create-variables-when-they-improve-readability.md +++ b/content/tips/create-variables-when-they-improve-readability.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean0HJwWAAAZkDR.png' -created_at: 2021-04-06T16:07:24+00:00 +created_at: 2020-06-16T09:24:53+00:00 slug: create-variables-when-they-improve-readability --- diff --git a/content/tips/dedicate-a-weekend-towards-learning-proper-oop.md b/content/tips/dedicate-a-weekend-towards-learning-proper-oop.md index 76163d9..0cf1ffb 100644 --- a/content/tips/dedicate-a-weekend-towards-learning-proper-oop.md +++ b/content/tips/dedicate-a-weekend-towards-learning-proper-oop.md @@ -4,7 +4,7 @@ tweet_id: '1272822460631539712' thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: { } -created_at: 2021-04-06T16:07:28+00:00 +created_at: 2020-06-16T09:24:57+00:00 slug: dedicate-a-weekend-towards-learning-proper-oop --- diff --git a/content/tips/dont-create-variables-when-you-can-just-pass-the-value-directly.md b/content/tips/dont-create-variables-when-you-can-just-pass-the-value-directly.md index cc50349..48c239e 100644 --- a/content/tips/dont-create-variables-when-you-can-just-pass-the-value-directly.md +++ b/content/tips/dont-create-variables-when-you-can-just-pass-the-value-directly.md @@ -5,6 +5,6 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eanz9WJWkAAeoT2.jpg' -created_at: 2021-04-06T16:07:24+00:00 +created_at: 2020-06-16T09:24:53+00:00 slug: dont-create-variables-when-you-can-just-pass-the-value-directly --- diff --git a/content/tips/dont-just-write-procedural-code-in-classes.md b/content/tips/dont-just-write-procedural-code-in-classes.md index a7c8098..fbd65d5 100644 --- a/content/tips/dont-just-write-procedural-code-in-classes.md +++ b/content/tips/dont-just-write-procedural-code-in-classes.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean2u-YX0AEmwEd.jpg' -created_at: 2021-04-06T16:07:28+00:00 +created_at: 2020-06-16T09:24:57+00:00 slug: dont-just-write-procedural-code-in-classes --- diff --git a/content/tips/dont-split-lines-at-random-places-but-dont-make-them-too-long-either.md b/content/tips/dont-split-lines-at-random-places-but-dont-make-them-too-long-either.md index 802cf8a..c449aae 100644 --- a/content/tips/dont-split-lines-at-random-places-but-dont-make-them-too-long-either.md +++ b/content/tips/dont-split-lines-at-random-places-but-dont-make-them-too-long-either.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eanz0jnXsAAvkv1.jpg' -created_at: 2021-04-06T16:07:23+00:00 +created_at: 2020-06-16T09:24:52+00:00 slug: dont-split-lines-at-random-places-but-dont-make-them-too-long-either --- diff --git a/content/tips/dont-use-a-controller-namespace.md b/content/tips/dont-use-a-controller-namespace.md index 4f20095..e61ac8f 100644 --- a/content/tips/dont-use-a-controller-namespace.md +++ b/content/tips/dont-use-a-controller-namespace.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean6NFJX0AAfiXT.png' -created_at: 2021-04-06T16:07:33+00:00 +created_at: 2020-06-16T09:40:45+00:00 slug: dont-use-a-controller-namespace --- diff --git a/content/tips/dont-use-abbreviations.md b/content/tips/dont-use-abbreviations.md index 0ffb9f6..16ffc25 100644 --- a/content/tips/dont-use-abbreviations.md +++ b/content/tips/dont-use-abbreviations.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean4TBBXgAAMab3.png' -created_at: 2021-04-06T16:07:30+00:00 +created_at: 2020-06-16T09:24:59+00:00 slug: dont-use-abbreviations --- diff --git a/content/tips/dont-use-model-methods-to-retrieve-data.md b/content/tips/dont-use-model-methods-to-retrieve-data.md index 4efccb0..156a9aa 100644 --- a/content/tips/dont-use-model-methods-to-retrieve-data.md +++ b/content/tips/dont-use-model-methods-to-retrieve-data.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean58GjWAAAgqLq.jpg' -created_at: 2021-04-06T16:07:32+00:00 +created_at: 2020-06-16T09:40:44+00:00 slug: dont-use-model-methods-to-retrieve-data --- diff --git a/content/tips/eloquent-listeners-are-awesome.md b/content/tips/eloquent-listeners-are-awesome.md index abaefd2..c697bd5 100644 --- a/content/tips/eloquent-listeners-are-awesome.md +++ b/content/tips/eloquent-listeners-are-awesome.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidaLtrXcAU0nIG.png' -created_at: 2021-04-06T16:07:45+00:00 +created_at: 2020-09-21T18:43:42+00:00 slug: eloquent-listeners-are-awesome --- diff --git a/content/tips/example-checking-a-parent-relationship-for-some-things.md b/content/tips/example-checking-a-parent-relationship-for-some-things.md index cd6c9ac..1f0dfac 100644 --- a/content/tips/example-checking-a-parent-relationship-for-some-things.md +++ b/content/tips/example-checking-a-parent-relationship-for-some-things.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidbX_UWAAMeB6-.png' -created_at: 2021-04-06T16:07:45+00:00 +created_at: 2020-09-21T18:43:43+00:00 slug: example-checking-a-parent-relationship-for-some-things --- diff --git a/content/tips/example-deleting-associated-files-on-deletion.md b/content/tips/example-deleting-associated-files-on-deletion.md index 06206b1..2c02745 100644 --- a/content/tips/example-deleting-associated-files-on-deletion.md +++ b/content/tips/example-deleting-associated-files-on-deletion.md @@ -5,6 +5,6 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidbEGZXYAA6q3G.png' -created_at: 2021-04-06T16:07:45+00:00 +created_at: 2020-09-21T18:43:42+00:00 slug: example-deleting-associated-files-on-deletion --- diff --git a/content/tips/extract-methods.md b/content/tips/extract-methods.md index edfe01c..d1bda6c 100644 --- a/content/tips/extract-methods.md +++ b/content/tips/extract-methods.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean1UORWkAE4UDD.jpg' -created_at: 2021-04-06T16:07:27+00:00 +created_at: 2020-06-16T09:24:55+00:00 slug: extract-methods --- diff --git a/content/tips/have-a-single-source-of-truth-for-validation-rules.md b/content/tips/have-a-single-source-of-truth-for-validation-rules.md index bea331b..1bfb672 100644 --- a/content/tips/have-a-single-source-of-truth-for-validation-rules.md +++ b/content/tips/have-a-single-source-of-truth-for-validation-rules.md @@ -4,7 +4,7 @@ tweet_id: '1272826456960315392' thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: { } -created_at: 2021-04-06T16:07:37+00:00 +created_at: 2020-06-16T09:40:49+00:00 slug: have-a-single-source-of-truth-for-validation-rules --- diff --git a/content/tips/heres-another-example-of-the-model-state-stuff-mentioned-above.md b/content/tips/heres-another-example-of-the-model-state-stuff-mentioned-above.md index ba5a494..0969080 100644 --- a/content/tips/heres-another-example-of-the-model-state-stuff-mentioned-above.md +++ b/content/tips/heres-another-example-of-the-model-state-stuff-mentioned-above.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidDSDcXYAA_7XD.jpg' -created_at: 2021-04-06T16:07:42+00:00 +created_at: 2020-09-21T17:00:00+00:00 slug: heres-another-example-of-the-model-state-stuff-mentioned-above --- diff --git a/content/tips/if-you-didnt-know-at-laravellivewire-now-triggers-updated-and-updating-hooks-for-nested-properties-which-works-with-both-array-and-model-properties.md b/content/tips/if-you-didnt-know-at-laravellivewire-now-triggers-updated-and-updating-hooks-for-nested-properties-which-works-with-both-array-and-model-properties.md index 819aefd..63056e7 100644 --- a/content/tips/if-you-didnt-know-at-laravellivewire-now-triggers-updated-and-updating-hooks-for-nested-properties-which-works-with-both-array-and-model-properties.md +++ b/content/tips/if-you-didnt-know-at-laravellivewire-now-triggers-updated-and-updating-hooks-for-nested-properties-which-works-with-both-array-and-model-properties.md @@ -6,6 +6,6 @@ author_username: LiamHammett images: - 'https://pbs.twimg.com/media/EiXw7FcXYAEGzFy.jpg' - 'https://pbs.twimg.com/media/EiXw7h3WAAEjT9F.jpg' -created_at: 2021-04-06T16:07:48+00:00 +created_at: 2020-09-20T16:20:30+00:00 slug: if-you-didnt-know-at-laravellivewire-now-triggers-updated-and-updating-hooks-for-nested-properties-which-works-with-both-array-and-model-properties --- diff --git a/content/tips/if-you-dont-like-the-double-indentation-of-vue-data-you-can-use-arrow-functions.md b/content/tips/if-you-dont-like-the-double-indentation-of-vue-data-you-can-use-arrow-functions.md index 09ec462..1c2203a 100644 --- a/content/tips/if-you-dont-like-the-double-indentation-of-vue-data-you-can-use-arrow-functions.md +++ b/content/tips/if-you-dont-like-the-double-indentation-of-vue-data-you-can-use-arrow-functions.md @@ -6,7 +6,7 @@ author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Edb2vN0XoAEnunt.png' - 'https://pbs.twimg.com/media/Edb2vO8WoAAAcdX.png' -created_at: 2021-04-06T16:07:42+00:00 +created_at: 2020-07-21T08:05:30+00:00 slug: if-you-dont-like-the-double-indentation-of-vue-data-you-can-use-arrow-functions --- diff --git a/content/tips/if-you-want-to-identify-teams-workspaces-etc-by-path-you-dont-have-to-pass-the-team-id-to-every-route.md b/content/tips/if-you-want-to-identify-teams-workspaces-etc-by-path-you-dont-have-to-pass-the-team-id-to-every-route.md index 32b7b34..c3630ac 100644 --- a/content/tips/if-you-want-to-identify-teams-workspaces-etc-by-path-you-dont-have-to-pass-the-team-id-to-every-route.md +++ b/content/tips/if-you-want-to-identify-teams-workspaces-etc-by-path-you-dont-have-to-pass-the-team-id-to-every-route.md @@ -6,7 +6,7 @@ author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidKFFnX0AEEjwr.png' - 'https://pbs.twimg.com/media/EidKYlkWoAAWkLD.png' -created_at: 2021-04-06T16:07:43+00:00 +created_at: 2020-09-21T17:30:36+00:00 slug: if-you-want-to-identify-teams-workspaces-etc-by-path-you-dont-have-to-pass-the-team-id-to-every-route --- diff --git a/content/tips/if-youre-debugging-your-app-and-youd-like-to-examine-more-things-eg-the-stack-trace-executed-queries-app-context.md b/content/tips/if-youre-debugging-your-app-and-youd-like-to-examine-more-things-eg-the-stack-trace-executed-queries-app-context.md index c43fa58..e36825e 100644 --- a/content/tips/if-youre-debugging-your-app-and-youd-like-to-examine-more-things-eg-the-stack-trace-executed-queries-app-context.md +++ b/content/tips/if-youre-debugging-your-app-and-youd-like-to-examine-more-things-eg-the-stack-trace-executed-queries-app-context.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidXEVXXgAofRdr.jpg' -created_at: 2021-04-06T16:07:44+00:00 +created_at: 2020-09-21T18:24:57+00:00 slug: if-youre-debugging-your-app-and-youd-like-to-examine-more-things-eg-the-stack-trace-executed-queries-app-context --- diff --git a/content/tips/import-namespaces-instead-of-using-aliases.md b/content/tips/import-namespaces-instead-of-using-aliases.md index 9d20cd1..2b36d5c 100644 --- a/content/tips/import-namespaces-instead-of-using-aliases.md +++ b/content/tips/import-namespaces-instead-of-using-aliases.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean5otqXYAA4QPR.png' -created_at: 2021-04-06T16:07:31+00:00 +created_at: 2020-06-16T09:40:43+00:00 slug: import-namespaces-instead-of-using-aliases --- diff --git a/content/tips/instead-of-writing-repetitive-else-if-statements-use-an-array-to-look-up-the-wanted-value-based-on-the-key-you-have.md b/content/tips/instead-of-writing-repetitive-else-if-statements-use-an-array-to-look-up-the-wanted-value-based-on-the-key-you-have.md index 2791c4c..f9144c2 100644 --- a/content/tips/instead-of-writing-repetitive-else-if-statements-use-an-array-to-look-up-the-wanted-value-based-on-the-key-you-have.md +++ b/content/tips/instead-of-writing-repetitive-else-if-statements-use-an-array-to-look-up-the-wanted-value-based-on-the-key-you-have.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EanzWiHXsAAhshs.jpg' -created_at: 2021-04-06T16:07:22+00:00 +created_at: 2020-06-16T09:24:52+00:00 slug: instead-of-writing-repetitive-else-if-statements-use-an-array-to-look-up-the-wanted-value-based-on-the-key-you-have --- diff --git a/content/tips/its-about-the-micro.md b/content/tips/its-about-the-micro.md index 54ddeaf..8e7ffb7 100644 --- a/content/tips/its-about-the-micro.md +++ b/content/tips/its-about-the-micro.md @@ -4,7 +4,7 @@ tweet_id: '1272822438406094848' thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: { } -created_at: 2021-04-06T16:07:22+00:00 +created_at: 2020-06-16T09:24:51+00:00 slug: its-about-the-micro --- diff --git a/content/tips/laravel-migrations-have-a-very-nice-syntax-for-foreign-keys.md b/content/tips/laravel-migrations-have-a-very-nice-syntax-for-foreign-keys.md index 10c0098..71d6067 100644 --- a/content/tips/laravel-migrations-have-a-very-nice-syntax-for-foreign-keys.md +++ b/content/tips/laravel-migrations-have-a-very-nice-syntax-for-foreign-keys.md @@ -4,7 +4,7 @@ tweet_id: '1308126491188883463' thread_slug: 1-rt-1-tip author_username: samuelstancl images: { } -created_at: 2021-04-06T16:07:46+00:00 +created_at: 2020-09-21T19:30:33+00:00 slug: laravel-migrations-have-a-very-nice-syntax-for-foreign-keys --- diff --git a/content/tips/laravel-nova-lets-you-show-different-resourcestoolscards-based-on-an-if-check.md b/content/tips/laravel-nova-lets-you-show-different-resourcestoolscards-based-on-an-if-check.md index f044a85..1c9c8a8 100644 --- a/content/tips/laravel-nova-lets-you-show-different-resourcestoolscards-based-on-an-if-check.md +++ b/content/tips/laravel-nova-lets-you-show-different-resourcestoolscards-based-on-an-if-check.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidABmBXcAAto9_.png' -created_at: 2021-04-06T16:07:41+00:00 +created_at: 2020-09-21T16:44:47+00:00 slug: laravel-nova-lets-you-show-different-resourcestoolscards-based-on-an-if-check --- diff --git a/content/tips/laravel-telescope-is-great-for-so-many-things.md b/content/tips/laravel-telescope-is-great-for-so-many-things.md index a632cbd..487b2c3 100644 --- a/content/tips/laravel-telescope-is-great-for-so-many-things.md +++ b/content/tips/laravel-telescope-is-great-for-so-many-things.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidI3vCXgAIOCvY.png' -created_at: 2021-04-06T16:07:43+00:00 +created_at: 2020-09-21T17:24:29+00:00 slug: laravel-telescope-is-great-for-so-many-things --- diff --git a/content/tips/people-underutilize-the-exception-handler.md b/content/tips/people-underutilize-the-exception-handler.md index f0d2f2b..c4a67fb 100644 --- a/content/tips/people-underutilize-the-exception-handler.md +++ b/content/tips/people-underutilize-the-exception-handler.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eic5sfxWAAY2ym2.png' -created_at: 2021-04-06T16:07:39+00:00 +created_at: 2020-09-21T16:37:18+00:00 slug: people-underutilize-the-exception-handler --- diff --git a/content/tips/relevant-for-people-building-packages.md b/content/tips/relevant-for-people-building-packages.md index 2d77796..2e111eb 100644 --- a/content/tips/relevant-for-people-building-packages.md +++ b/content/tips/relevant-for-people-building-packages.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidBy75XsA4CZGx.jpg' -created_at: 2021-04-06T16:07:41+00:00 +created_at: 2020-09-21T16:52:14+00:00 slug: relevant-for-people-building-packages --- diff --git a/content/tips/theres-great-value-in-understanding-how-object-state-of-models-works-this-is-mostly-relevant-in-feature-tests-because-they-touch-many-parts-of-your-codebase-in-one-phplaravel-app-state.md b/content/tips/theres-great-value-in-understanding-how-object-state-of-models-works-this-is-mostly-relevant-in-feature-tests-because-they-touch-many-parts-of-your-codebase-in-one-phplaravel-app-state.md index ee000ab..9b2b68e 100644 --- a/content/tips/theres-great-value-in-understanding-how-object-state-of-models-works-this-is-mostly-relevant-in-feature-tests-because-they-touch-many-parts-of-your-codebase-in-one-phplaravel-app-state.md +++ b/content/tips/theres-great-value-in-understanding-how-object-state-of-models-works-this-is-mostly-relevant-in-feature-tests-because-they-touch-many-parts-of-your-codebase-in-one-phplaravel-app-state.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eic9xP2XsAoo8ay.png' -created_at: 2021-04-06T16:07:40+00:00 +created_at: 2020-09-21T16:37:19+00:00 slug: theres-great-value-in-understanding-how-object-state-of-models-works-this-is-mostly-relevant-in-feature-tests-because-they-touch-many-parts-of-your-codebase-in-one-phplaravel-app-state --- diff --git a/content/tips/this-one-is-less-obscure.md b/content/tips/this-one-is-less-obscure.md index 08410b9..8586a19 100644 --- a/content/tips/this-one-is-less-obscure.md +++ b/content/tips/this-one-is-less-obscure.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidvI20XcAA7MGY.png' -created_at: 2021-04-06T16:07:48+00:00 +created_at: 2020-09-21T20:10:31+00:00 slug: this-one-is-less-obscure --- diff --git a/content/tips/this-wont-fit-into-one-tweet-but-theres-so-much-cool-stuff-you-can-do-with-eloquent.md b/content/tips/this-wont-fit-into-one-tweet-but-theres-so-much-cool-stuff-you-can-do-with-eloquent.md index b77e1ac..c6c89cb 100644 --- a/content/tips/this-wont-fit-into-one-tweet-but-theres-so-much-cool-stuff-you-can-do-with-eloquent.md +++ b/content/tips/this-wont-fit-into-one-tweet-but-theres-so-much-cool-stuff-you-can-do-with-eloquent.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eidq5A3XsAAM9lA.png' -created_at: 2021-04-06T16:07:46+00:00 +created_at: 2020-09-21T20:00:49+00:00 slug: this-wont-fit-into-one-tweet-but-theres-so-much-cool-stuff-you-can-do-with-eloquent --- diff --git a/content/tips/try-to-avoid-unnecessary-nesting-by-returning-a-value-early.md b/content/tips/try-to-avoid-unnecessary-nesting-by-returning-a-value-early.md index 06daffe..713bd22 100644 --- a/content/tips/try-to-avoid-unnecessary-nesting-by-returning-a-value-early.md +++ b/content/tips/try-to-avoid-unnecessary-nesting-by-returning-a-value-early.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EanzmPwXYAAoH2A.jpg' -created_at: 2021-04-06T16:07:23+00:00 +created_at: 2020-06-16T09:24:52+00:00 slug: try-to-avoid-unnecessary-nesting-by-returning-a-value-early --- diff --git a/content/tips/use-collections-when-they-can-clean-up-your-code.md b/content/tips/use-collections-when-they-can-clean-up-your-code.md index 771ad2a..7805f1e 100644 --- a/content/tips/use-collections-when-they-can-clean-up-your-code.md +++ b/content/tips/use-collections-when-they-can-clean-up-your-code.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean8WekXkAEafMW.png' -created_at: 2021-04-06T16:07:37+00:00 +created_at: 2020-06-16T09:40:50+00:00 slug: use-collections-when-they-can-clean-up-your-code --- diff --git a/content/tips/use-custom-collections.md b/content/tips/use-custom-collections.md index 5f545b3..63b2fd3 100644 --- a/content/tips/use-custom-collections.md +++ b/content/tips/use-custom-collections.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean3-8QXYAAmi7V.jpg' -created_at: 2021-04-06T16:07:30+00:00 +created_at: 2020-06-16T09:24:59+00:00 slug: use-custom-collections --- diff --git a/content/tips/use-custom-config-files.md b/content/tips/use-custom-config-files.md index 3ac11ad..a7f304b 100644 --- a/content/tips/use-custom-config-files.md +++ b/content/tips/use-custom-config-files.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean6FxnXkAAXDsl.png' -created_at: 2021-04-06T16:07:33+00:00 +created_at: 2020-06-16T09:40:44+00:00 slug: use-custom-config-files --- diff --git a/content/tips/use-data-transfer-objects-dtos.md b/content/tips/use-data-transfer-objects-dtos.md index bdebda4..5530716 100644 --- a/content/tips/use-data-transfer-objects-dtos.md +++ b/content/tips/use-data-transfer-objects-dtos.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean3uMaWAAApBhb.jpg' -created_at: 2021-04-06T16:07:29+00:00 +created_at: 2020-06-16T09:24:58+00:00 slug: use-data-transfer-objects-dtos --- diff --git a/content/tips/use-docblocks-only-when-they-clarify-things.md b/content/tips/use-docblocks-only-when-they-clarify-things.md index dd6f3f9..433b504 100644 --- a/content/tips/use-docblocks-only-when-they-clarify-things.md +++ b/content/tips/use-docblocks-only-when-they-clarify-things.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean8DcIXkAESZ_P.jpg' -created_at: 2021-04-06T16:07:37+00:00 +created_at: 2020-06-16T09:40:49+00:00 slug: use-docblocks-only-when-they-clarify-things --- diff --git a/content/tips/use-events.md b/content/tips/use-events.md index 69cdacb..6a58de7 100644 --- a/content/tips/use-events.md +++ b/content/tips/use-events.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean07-jXkAErgaL.jpg' -created_at: 2021-04-06T16:07:26+00:00 +created_at: 2020-06-16T09:24:55+00:00 slug: use-events --- diff --git a/content/tips/use-expressive-names-for-methods.md b/content/tips/use-expressive-names-for-methods.md index 3a5e35f..6d0c2d5 100644 --- a/content/tips/use-expressive-names-for-methods.md +++ b/content/tips/use-expressive-names-for-methods.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean4xcqWAAUsjdG.png' -created_at: 2021-04-06T16:07:30+00:00 +created_at: 2020-06-16T09:25:00+00:00 slug: use-expressive-names-for-methods --- diff --git a/content/tips/use-short-operators.md b/content/tips/use-short-operators.md index 7a5a7e6..804cb37 100644 --- a/content/tips/use-short-operators.md +++ b/content/tips/use-short-operators.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean63YeXQAABhBd.jpg' -created_at: 2021-04-06T16:07:34+00:00 +created_at: 2020-06-16T09:40:46+00:00 slug: use-short-operators --- diff --git a/content/tips/use-strict-comparison.md b/content/tips/use-strict-comparison.md index 8917c8c..65dbec8 100644 --- a/content/tips/use-strict-comparison.md +++ b/content/tips/use-strict-comparison.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean722QXgAENwmW.jpg' -created_at: 2021-04-06T16:07:36+00:00 +created_at: 2020-06-16T09:40:48+00:00 slug: use-strict-comparison --- diff --git a/content/tips/wanna-update-a-set-of-eloquent-models-and-have-the-change-updated-in-the-database-and-in-your-in-memory-instances-but-dont-wanna-incur-a-database-query-for-each-model.md b/content/tips/wanna-update-a-set-of-eloquent-models-and-have-the-change-updated-in-the-database-and-in-your-in-memory-instances-but-dont-wanna-incur-a-database-query-for-each-model.md index 05dfda2..2889704 100644 --- a/content/tips/wanna-update-a-set-of-eloquent-models-and-have-the-change-updated-in-the-database-and-in-your-in-memory-instances-but-dont-wanna-incur-a-database-query-for-each-model.md +++ b/content/tips/wanna-update-a-set-of-eloquent-models-and-have-the-change-updated-in-the-database-and-in-your-in-memory-instances-but-dont-wanna-incur-a-database-query-for-each-model.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: timacdonald87 images: - 'https://pbs.twimg.com/media/EWVoC3jVcAEg0JX.jpg' -created_at: 2021-04-06T16:07:49+00:00 +created_at: 2020-04-24T03:23:18+00:00 slug: wanna-update-a-set-of-eloquent-models-and-have-the-change-updated-in-the-database-and-in-your-in-memory-instances-but-dont-wanna-incur-a-database-query-for-each-model --- diff --git a/content/tips/when-a-relationship-is-already-loaded-and-cached-on-the-model-instance-youll-have-to-refresh-it.md b/content/tips/when-a-relationship-is-already-loaded-and-cached-on-the-model-instance-youll-have-to-refresh-it.md index ef4738d..f2d00a7 100644 --- a/content/tips/when-a-relationship-is-already-loaded-and-cached-on-the-model-instance-youll-have-to-refresh-it.md +++ b/content/tips/when-a-relationship-is-already-loaded-and-cached-on-the-model-instance-youll-have-to-refresh-it.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eic_JawXgAAEbYL.png' -created_at: 2021-04-06T16:07:40+00:00 +created_at: 2020-09-21T16:42:13+00:00 slug: when-a-relationship-is-already-loaded-and-cached-on-the-model-instance-youll-have-to-refresh-it --- diff --git a/content/tips/when-im-converting-data-into-a-different-structure-one-thing-i-like-to-do-is-annotate-how-the-structure-looks-at-each-point-of-the-process.md b/content/tips/when-im-converting-data-into-a-different-structure-one-thing-i-like-to-do-is-annotate-how-the-structure-looks-at-each-point-of-the-process.md index 70a5474..a26a246 100644 --- a/content/tips/when-im-converting-data-into-a-different-structure-one-thing-i-like-to-do-is-annotate-how-the-structure-looks-at-each-point-of-the-process.md +++ b/content/tips/when-im-converting-data-into-a-different-structure-one-thing-i-like-to-do-is-annotate-how-the-structure-looks-at-each-point-of-the-process.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EinfW11XgAE0y7W.jpg' -created_at: 2021-04-06T16:07:49+00:00 +created_at: 2020-09-23T17:40:43+00:00 slug: when-im-converting-data-into-a-different-structure-one-thing-i-like-to-do-is-annotate-how-the-structure-looks-at-each-point-of-the-process --- diff --git a/content/tips/write-functional-code-when-it-benefits-you.md b/content/tips/write-functional-code-when-it-benefits-you.md index 37a9b33..b66b6e6 100644 --- a/content/tips/write-functional-code-when-it-benefits-you.md +++ b/content/tips/write-functional-code-when-it-benefits-you.md @@ -5,7 +5,7 @@ thread_slug: laravel-clean-code-tactics author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Ean8cQUWoAEjdO3.jpg' -created_at: 2021-04-06T16:07:38+00:00 +created_at: 2020-06-16T09:40:51+00:00 slug: write-functional-code-when-it-benefits-you --- diff --git a/content/tips/yesterday-in-my-at-laracononline-talk-i-explained-how-to-use-the-query-builder-when-method-to-handle-complex-sorting.md b/content/tips/yesterday-in-my-at-laracononline-talk-i-explained-how-to-use-the-query-builder-when-method-to-handle-complex-sorting.md index 2f8893b..fde8f57 100644 --- a/content/tips/yesterday-in-my-at-laracononline-talk-i-explained-how-to-use-the-query-builder-when-method-to-handle-complex-sorting.md +++ b/content/tips/yesterday-in-my-at-laracononline-talk-i-explained-how-to-use-the-query-builder-when-method-to-handle-complex-sorting.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: reinink images: - 'https://pbs.twimg.com/media/ERyNRSIX0AEjjWo.jpg' -created_at: 2021-04-06T16:07:49+00:00 +created_at: 2020-02-27T13:12:31+00:00 slug: yesterday-in-my-at-laracononline-talk-i-explained-how-to-use-the-query-builder-when-method-to-handle-complex-sorting --- diff --git a/content/tips/you-can-add-a-tags-method-to-a-job-anything-you-return-from-this-method-will-be-displayed-in-horizon.md b/content/tips/you-can-add-a-tags-method-to-a-job-anything-you-return-from-this-method-will-be-displayed-in-horizon.md index eeaf2cc..2b8b723 100644 --- a/content/tips/you-can-add-a-tags-method-to-a-job-anything-you-return-from-this-method-will-be-displayed-in-horizon.md +++ b/content/tips/you-can-add-a-tags-method-to-a-job-anything-you-return-from-this-method-will-be-displayed-in-horizon.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidtAYaXkAEjAl-.jpg' -created_at: 2021-04-06T16:07:47+00:00 +created_at: 2020-09-21T20:00:50+00:00 slug: you-can-add-a-tags-method-to-a-job-anything-you-return-from-this-method-will-be-displayed-in-horizon --- diff --git a/content/tips/you-can-create-dynamic-relationships-this-relationship-is-based-on-a-column-thats-added-using-a-subquery-in-a-scope.md b/content/tips/you-can-create-dynamic-relationships-this-relationship-is-based-on-a-column-thats-added-using-a-subquery-in-a-scope.md index 0407e60..4368d22 100644 --- a/content/tips/you-can-create-dynamic-relationships-this-relationship-is-based-on-a-column-thats-added-using-a-subquery-in-a-scope.md +++ b/content/tips/you-can-create-dynamic-relationships-this-relationship-is-based-on-a-column-thats-added-using-a-subquery-in-a-scope.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidrdqwWkAIy4oN.png' -created_at: 2021-04-06T16:07:47+00:00 +created_at: 2020-09-21T20:00:49+00:00 slug: you-can-create-dynamic-relationships-this-relationship-is-based-on-a-column-thats-added-using-a-subquery-in-a-scope --- diff --git a/content/tips/you-can-explicitly-bind-objects-to-routes-you-dont-have-to-use-route-model-binding-only-custom-objects-work-perfectly-well-too.md b/content/tips/you-can-explicitly-bind-objects-to-routes-you-dont-have-to-use-route-model-binding-only-custom-objects-work-perfectly-well-too.md index f53c468..6a804c6 100644 --- a/content/tips/you-can-explicitly-bind-objects-to-routes-you-dont-have-to-use-route-model-binding-only-custom-objects-work-perfectly-well-too.md +++ b/content/tips/you-can-explicitly-bind-objects-to-routes-you-dont-have-to-use-route-model-binding-only-custom-objects-work-perfectly-well-too.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidyDmfWsAI14-C.png' -created_at: 2021-04-06T16:07:48+00:00 +created_at: 2020-09-21T20:24:49+00:00 slug: you-can-explicitly-bind-objects-to-routes-you-dont-have-to-use-route-model-binding-only-custom-objects-work-perfectly-well-too --- diff --git a/content/tips/you-can-return-false-from-a-ing-eloquent-event-listener-creating-updating-saving-deleting-to-cancel-the-action.md b/content/tips/you-can-return-false-from-a-ing-eloquent-event-listener-creating-updating-saving-deleting-to-cancel-the-action.md index 3f5bc2c..b11ed07 100644 --- a/content/tips/you-can-return-false-from-a-ing-eloquent-event-listener-creating-updating-saving-deleting-to-cancel-the-action.md +++ b/content/tips/you-can-return-false-from-a-ing-eloquent-event-listener-creating-updating-saving-deleting-to-cancel-the-action.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eidmle3WoAI72Yk.png' -created_at: 2021-04-06T16:07:46+00:00 +created_at: 2020-09-21T19:32:43+00:00 slug: you-can-return-false-from-a-ing-eloquent-event-listener-creating-updating-saving-deleting-to-cancel-the-action --- diff --git a/content/tips/you-can-return-mailables-as-responses-from-controllers-it-will-show-the-rendered-version-in-the-browser.md b/content/tips/you-can-return-mailables-as-responses-from-controllers-it-will-show-the-rendered-version-in-the-browser.md index 5d841c7..0dbed8d 100644 --- a/content/tips/you-can-return-mailables-as-responses-from-controllers-it-will-show-the-rendered-version-in-the-browser.md +++ b/content/tips/you-can-return-mailables-as-responses-from-controllers-it-will-show-the-rendered-version-in-the-browser.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/Eic6iydX0AgLupY.png' -created_at: 2021-04-06T16:07:40+00:00 +created_at: 2020-09-21T16:37:19+00:00 slug: you-can-return-mailables-as-responses-from-controllers-it-will-show-the-rendered-version-in-the-browser --- diff --git a/content/tips/you-can-use-wherexandy-in-eloquent.md b/content/tips/you-can-use-wherexandy-in-eloquent.md index 32a9768..855eb7e 100644 --- a/content/tips/you-can-use-wherexandy-in-eloquent.md +++ b/content/tips/you-can-use-wherexandy-in-eloquent.md @@ -5,7 +5,7 @@ thread_slug: 1-rt-1-tip author_username: samuelstancl images: - 'https://pbs.twimg.com/media/EidOOuTXYAYMtI9.png' -created_at: 2021-04-06T16:07:43+00:00 +created_at: 2020-09-21T17:46:34+00:00 slug: you-can-use-wherexandy-in-eloquent --- diff --git a/public/css/app.css b/public/css/app.css index 860336e..5f7c8e2 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -1,1727 +1 @@ -/*! tailwindcss v2.1.1 | MIT License | https://tailwindcss.com *//*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */ - -/* -Document -======== -*/ - -/** -Use a better box model (opinionated). -*/ - -*, -*::before, -*::after { - box-sizing: border-box; -} - -/** -Use a more readable tab size (opinionated). -*/ - -:root { - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; -} - -/** -1. Correct the line height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -*/ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* -Sections -======== -*/ - -/** -Remove the margin in all browsers. -*/ - -body { - margin: 0; -} - -/** -Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -*/ - -body { - font-family: - system-ui, - -apple-system, /* Firefox supports this but not yet `system-ui` */ - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji'; -} - -/* -Grouping content -================ -*/ - -/** -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -*/ - -hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ -} - -/* -Text-level semantics -==================== -*/ - -/** -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr[title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/** -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/** -1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -2. Correct the odd 'em' font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: - ui-monospace, - SFMono-Regular, - Consolas, - 'Liberation Mono', - Menlo, - monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/** -Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -Tabular data -============ -*/ - -/** -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -*/ - -table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ -} - -/* -Forms -===== -*/ - -/** -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** -Remove the inheritance of text transform in Edge and Firefox. -1. Remove the inheritance of text transform in Firefox. -*/ - -button, -select { /* 1 */ - text-transform: none; -} - -/** -Correct the inability to style clickable types in iOS and Safari. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; -} - -/** -Remove the inner border and padding in Firefox. -*/ - -::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** -Restore the focus styles unset by the previous rule. -*/ - -:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** -Remove the additional ':invalid' styles in Firefox. -See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737 -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/** -Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. -*/ - -legend { - padding: 0; -} - -/** -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/** -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/** -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to 'inherit' in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* -Interactive -=========== -*/ - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -}/** - * Manually forked from SUIT CSS Base: https://github.com/suitcss/base - * A thin layer on top of normalize.css that provides a starting point more - * suitable for web applications. - */ - -/** - * Removes the default spacing and border for appropriate elements. - */ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -button { - background-color: transparent; - background-image: none; -} - -/** - * Work around a Firefox/IE bug where the transparent `button` background - * results in a loss of the default `button` focus styles. - */ - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -fieldset { - margin: 0; - padding: 0; -} - -ol, -ul { - list-style: none; - margin: 0; - padding: 0; -} - -/** - * Tailwind custom reset styles - */ - -/** - * 1. Use the user's configured `sans` font-family (with Tailwind's default - * sans-serif font stack as a fallback) as a sane default. - * 2. Use Tailwind's default "normal" line-height so the user isn't forced - * to override it to ensure consistency even when using the default theme. - */ - -html { - font-family: iA Writer Quattro S, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */ - line-height: 1.5; /* 2 */ -} - - -/** - * Inherit font-family and line-height from `html` so users can set them as - * a class directly on the `html` element. - */ - -body { - font-family: inherit; - line-height: inherit; -} - -/** - * 1. Prevent padding and border from affecting element width. - * - * We used to set this in the html element and inherit from - * the parent element for everything else. This caused issues - * in shadow-dom-enhanced elements like
where the content - * is wrapped by a div with box-sizing set to `content-box`. - * - * https://github.com/mozdevs/cssremedy/issues/4 - * - * - * 2. Allow adding a border to an element by just adding a border-width. - * - * By default, the way the browser specifies that an element should have no - * border is by setting it's border-style to `none` in the user-agent - * stylesheet. - * - * In order to easily add borders to elements by just setting the `border-width` - * property, we change the default border-style for all elements to `solid`, and - * use border-width to hide them instead. This way our `border` utilities only - * need to set the `border-width` property instead of the entire `border` - * shorthand, making our border utilities much more straightforward to compose. - * - * https://github.com/tailwindcss/tailwindcss/pull/116 - */ - -*, -::before, -::after { - box-sizing: border-box; /* 1 */ - border-width: 0; /* 2 */ - border-style: solid; /* 2 */ - border-color: #e4e4e7; /* 2 */ -} - -/* - * Ensure horizontal rules are visible by default - */ - -hr { - border-top-width: 1px; -} - -/** - * Undo the `border-style: none` reset that Normalize applies to images so that - * our `border-{width}` utilities have the expected effect. - * - * The Normalize reset is unnecessary for us since we default the border-width - * to 0 on all elements. - * - * https://github.com/tailwindcss/tailwindcss/issues/362 - */ - -img { - border-style: solid; -} - -textarea { - resize: vertical; -} - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - color: #a1a1aa; -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - color: #a1a1aa; -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - color: #a1a1aa; -} - -button, -[role="button"] { - cursor: pointer; -} - -table { - border-collapse: collapse; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/** - * Reset links to optimize for opt-in styling instead of - * opt-out. - */ - -a { - color: inherit; - text-decoration: inherit; -} - -/** - * Reset form element properties that are easy to forget to - * style explicitly so you don't inadvertently introduce - * styles that deviate from your design system. These styles - * supplement a partial reset that is already applied by - * normalize.css. - */ - -button, -input, -optgroup, -select, -textarea { - padding: 0; - line-height: inherit; - color: inherit; -} - -/** - * Use the configured 'mono' font family for elements that - * are expected to be rendered with a monospace font, falling - * back to the system monospace stack if there is no configured - * 'mono' font family. - */ - -pre, -code, -kbd, -samp { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -/** - * Make replaced elements `display: block` by default as that's - * the behavior you want almost all of the time. Inspired by - * CSS Remedy, with `svg` added as well. - * - * https://github.com/mozdevs/cssremedy/issues/14 - */ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - vertical-align: middle; -} - -/** - * Constrain images and videos to the parent width and preserve - * their intrinsic aspect ratio. - * - * https://github.com/mozdevs/cssremedy/issues/14 - */ - -img, -video { - max-width: 100%; - height: auto; -} - -* { - --tw-shadow: 0 0 #0000; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgba(59, 130, 246, 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; -} - .prose a { - position: relative; -} -.prose { - color: #3f3f46; - max-width: 65ch; -} -.prose [class~="lead"] { - color: #52525b; - font-size: 1.25em; - line-height: 1.6; - margin-top: 1.2em; - margin-bottom: 1.2em; -} -.prose a { - color: #18181b; - text-decoration: underline; - font-weight: 500; -} -.prose strong { - color: #18181b; - font-weight: 600; -} -.prose ol[type="A"] { - --list-counter-style: upper-alpha; -} -.prose ol[type="a"] { - --list-counter-style: lower-alpha; -} -.prose ol[type="A s"] { - --list-counter-style: upper-alpha; -} -.prose ol[type="a s"] { - --list-counter-style: lower-alpha; -} -.prose ol[type="I"] { - --list-counter-style: upper-roman; -} -.prose ol[type="i"] { - --list-counter-style: lower-roman; -} -.prose ol[type="I s"] { - --list-counter-style: upper-roman; -} -.prose ol[type="i s"] { - --list-counter-style: lower-roman; -} -.prose ol[type="1"] { - --list-counter-style: decimal; -} -.prose ol > li { - position: relative; - padding-left: 1.75em; -} -.prose ol > li::before { - content: counter(list-item, var(--list-counter-style, decimal)) "."; - position: absolute; - font-weight: 400; - color: #71717a; - left: 0; -} -.prose ul > li { - position: relative; - padding-left: 1.75em; -} -.prose ul > li::before { - content: ""; - position: absolute; - background-color: #d4d4d8; - border-radius: 50%; - width: 0.375em; - height: 0.375em; - top: calc(0.875em - 0.1875em); - left: 0.25em; -} -.prose hr { - border-color: #e4e4e7; - border-top-width: 1px; - margin-top: 3em; - margin-bottom: 3em; -} -.prose blockquote { - font-weight: 500; - font-style: italic; - color: #18181b; - border-left-width: 0.25rem; - border-left-color: #e4e4e7; - quotes: "\201C""\201D""\2018""\2019"; - margin-top: 1.6em; - margin-bottom: 1.6em; - padding-left: 1em; -} -.prose blockquote p:first-of-type::before { - content: open-quote; -} -.prose blockquote p:last-of-type::after { - content: close-quote; -} -.prose h1 { - color: #18181b; - font-weight: 800; - font-size: 2.25em; - margin-top: 0; - margin-bottom: 0.8888889em; - line-height: 1.1111111; -} -.prose h2 { - color: #18181b; - font-weight: 700; - font-size: 1.5em; - margin-top: 2em; - margin-bottom: 1em; - line-height: 1.3333333; -} -.prose h3 { - color: #18181b; - font-weight: 600; - font-size: 1.25em; - margin-top: 1.6em; - margin-bottom: 0.6em; - line-height: 1.6; -} -.prose h4 { - color: #18181b; - font-weight: 600; - margin-top: 1.5em; - margin-bottom: 0.5em; - line-height: 1.5; -} -.prose figure figcaption { - color: #71717a; - font-size: 0.875em; - line-height: 1.4285714; - margin-top: 0.8571429em; -} -.prose code { - color: #18181b; - font-weight: 600; - font-size: 0.875em; -} -.prose code::before { - content: "`"; -} -.prose code::after { - content: "`"; -} -.prose a code { - color: #18181b; -} -.prose pre { - color: #e4e4e7; - background-color: #27272a; - overflow-x: auto; - font-size: 0.875em; - line-height: 1.7142857; - margin-top: 1.7142857em; - margin-bottom: 1.7142857em; - border-radius: 0.375rem; - padding-top: 0.8571429em; - padding-right: 1.1428571em; - padding-bottom: 0.8571429em; - padding-left: 1.1428571em; -} -.prose pre code { - background-color: transparent; - border-width: 0; - border-radius: 0; - padding: 0; - font-weight: 400; - color: inherit; - font-size: inherit; - font-family: inherit; - line-height: inherit; -} -.prose pre code::before { - content: none; -} -.prose pre code::after { - content: none; -} -.prose table { - width: 100%; - table-layout: auto; - text-align: left; - margin-top: 2em; - margin-bottom: 2em; - font-size: 0.875em; - line-height: 1.7142857; -} -.prose thead { - color: #18181b; - font-weight: 600; - border-bottom-width: 1px; - border-bottom-color: #d4d4d8; -} -.prose thead th { - vertical-align: bottom; - padding-right: 0.5714286em; - padding-bottom: 0.5714286em; - padding-left: 0.5714286em; -} -.prose tbody tr { - border-bottom-width: 1px; - border-bottom-color: #e4e4e7; -} -.prose tbody tr:last-child { - border-bottom-width: 0; -} -.prose tbody td { - vertical-align: top; - padding-top: 0.5714286em; - padding-right: 0.5714286em; - padding-bottom: 0.5714286em; - padding-left: 0.5714286em; -} -.prose { - font-size: 1rem; - line-height: 1.75; -} -.prose p { - margin-top: 1.25em; - margin-bottom: 1.25em; -} -.prose img { - margin-top: 2em; - margin-bottom: 2em; -} -.prose video { - margin-top: 2em; - margin-bottom: 2em; -} -.prose figure { - margin-top: 2em; - margin-bottom: 2em; -} -.prose figure > * { - margin-top: 0; - margin-bottom: 0; -} -.prose h2 code { - font-size: 0.875em; -} -.prose h3 code { - font-size: 0.9em; -} -.prose ol { - margin-top: 1.25em; - margin-bottom: 1.25em; -} -.prose ul { - margin-top: 1.25em; - margin-bottom: 1.25em; -} -.prose li { - margin-top: 0.5em; - margin-bottom: 0.5em; -} -.prose > ul > li p { - margin-top: 0.75em; - margin-bottom: 0.75em; -} -.prose > ul > li > *:first-child { - margin-top: 1.25em; -} -.prose > ul > li > *:last-child { - margin-bottom: 1.25em; -} -.prose > ol > li > *:first-child { - margin-top: 1.25em; -} -.prose > ol > li > *:last-child { - margin-bottom: 1.25em; -} -.prose ul ul, .prose ul ol, .prose ol ul, .prose ol ol { - margin-top: 0.75em; - margin-bottom: 0.75em; -} -.prose hr + * { - margin-top: 0; -} -.prose h2 + * { - margin-top: 0; -} -.prose h3 + * { - margin-top: 0; -} -.prose h4 + * { - margin-top: 0; -} -.prose thead th:first-child { - padding-left: 0; -} -.prose thead th:last-child { - padding-right: 0; -} -.prose tbody td:first-child { - padding-left: 0; -} -.prose tbody td:last-child { - padding-right: 0; -} -.prose > :first-child { - margin-top: 0; -} -.prose > :last-child { - margin-bottom: 0; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} -.pointer-events-none { - pointer-events: none; -} -.pointer-events-auto { - pointer-events: auto; -} -.relative { - position: relative; -} -.absolute { - position: absolute; -} -.fixed { - position: fixed; -} -.inset-0 { - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; -} -.inset-x-0 { - left: 0px; - right: 0px; -} -.top-32 { - top: 8rem; -} -.top-0 { - top: 0px; -} -.z-40 { - z-index: 40; -} -.mx-auto { - margin-left: auto; - margin-right: auto; -} -.-mx-16 { - margin-left: -4rem; - margin-right: -4rem; -} -.-mx-24 { - margin-left: -6rem; - margin-right: -6rem; -} -.mt-8 { - margin-top: 2rem; -} -.-ml-16 { - margin-left: -4rem; -} -.block { - display: block; -} -.inline { - display: inline; -} -.flex { - display: flex; -} -.grid { - display: grid; -} -.inline-grid { - display: inline-grid; -} -.hidden { - display: none; -} -.h-full { - height: 100%; -} -.h-16 { - height: 4rem; -} -.h-72 { - height: 18rem; -} -.h-screen { - height: 100vh; -} -.h-6 { - height: 1.5rem; -} -.h-8 { - height: 2rem; -} -.h-14 { - height: 3.5rem; -} -.min-h-screen { - min-height: 100vh; -} -.w-full { - width: 100%; -} -.w-16 { - width: 4rem; -} -.w-8 { - width: 2rem; -} -.w-1\/2 { - width: 50%; -} -.w-6 { - width: 1.5rem; -} -.w-14 { - width: 3.5rem; -} -.max-w-4xl { - max-width: 56rem; -} -.max-w-5xl { - max-width: 64rem; -} -.flex-1 { - flex: 1 1 0%; -} -.flex-shrink-0 { - flex-shrink: 0; -} -.transform { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} -.-translate-y-1\/4 { - --tw-translate-y: -25%; -} -.skew-y-12 { - --tw-skew-y: 12deg; -} -.grid-flow-col { - grid-auto-flow: column; -} -.grid-flow-row { - grid-auto-flow: row; -} -.grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); -} -.grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); -} -.flex-col { - flex-direction: column; -} -.flex-wrap { - flex-wrap: wrap; -} -.items-center { - align-items: center; -} -.items-start { - align-items: flex-start; -} -.justify-center { - justify-content: center; -} -.justify-between { - justify-content: space-between; -} -.gap-8 { - gap: 2rem; -} -.gap-2 { - gap: 0.5rem; -} -.gap-5 { - gap: 1.25rem; -} -.gap-4 { - gap: 1rem; -} -.gap-1 { - gap: 0.25rem; -} -.gap-6 { - gap: 1.5rem; -} -.gap-x-5 { - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; -} -.gap-y-4 { - row-gap: 1rem; -} -.space-y-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); -} -.space-y-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1rem * var(--tw-space-y-reverse)); -} -.space-x-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1rem * var(--tw-space-x-reverse)); - margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); -} -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); -} -.space-x-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1.5rem * var(--tw-space-x-reverse)); - margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); -} -.space-y-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); -} -.divide-y > :not([hidden]) ~ :not([hidden]) { - --tw-divide-y-reverse: 0; - border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); - border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); -} -.break-all { - word-break: break-all; -} -.rounded-2xl { - border-radius: 1rem; -} -.rounded-xl { - border-radius: 0.75rem; -} -.rounded-full { - border-radius: 9999px; -} -.border-2 { - border-width: 2px; -} -.border { - border-width: 1px; -} -.border-b-2 { - border-bottom-width: 2px; -} -.border-t { - border-top-width: 1px; -} -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgba(228, 228, 231, var(--tw-border-opacity)); -} -.border-blue-800 { - --tw-border-opacity: 1; - border-color: rgba(30, 64, 175, var(--tw-border-opacity)); -} -.border-pink-100 { - --tw-border-opacity: 1; - border-color: rgba(252, 231, 243, var(--tw-border-opacity)); -} -.border-gray-100 { - --tw-border-opacity: 1; - border-color: rgba(244, 244, 245, var(--tw-border-opacity)); -} -.bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgba(250, 250, 250, var(--tw-bg-opacity)); -} -.bg-white { - --tw-bg-opacity: 1; - background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); -} -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgba(244, 244, 245, var(--tw-bg-opacity)); -} -.bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgba(228, 228, 231, var(--tw-bg-opacity)); -} -.bg-gradient-to-b { - background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); -} -.bg-gradient-to-br { - background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); -} -.from-white { - --tw-gradient-from: #fff; - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(255, 255, 255, 0)); -} -.from-yellow-400 { - --tw-gradient-from: #facc15; - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(250, 204, 21, 0)); -} -.from-yellow-300 { - --tw-gradient-from: #fde047; - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(253, 224, 71, 0)); -} -.to-pink-50 { - --tw-gradient-to: #fdf2f8; -} -.to-pink-400 { - --tw-gradient-to: #f472b6; -} -.bg-clip-text { - -webkit-background-clip: text; - background-clip: text; -} -.p-16 { - padding: 4rem; -} -.p-8 { - padding: 2rem; -} -.p-6 { - padding: 1.5rem; -} -.py-12 { - padding-top: 3rem; - padding-bottom: 3rem; -} -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} -.py-24 { - padding-top: 6rem; - padding-bottom: 6rem; -} -.py-32 { - padding-top: 8rem; - padding-bottom: 8rem; -} -.text-center { - text-align: center; -} -.text-right { - text-align: right; -} -.text-left { - text-align: left; -} -.font-sans { - font-family: iA Writer Quattro S, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -} -.text-2xl { - font-size: 1.5rem; - line-height: 2rem; -} -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} -.text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; -} -.text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; -} -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} -.font-bold { - font-weight: 700; -} -.font-medium { - font-weight: 500; -} -.ordinal, .slashed-zero, .lining-nums, .oldstyle-nums, .proportional-nums, .tabular-nums, .diagonal-fractions, .stacked-fractions { - --tw-ordinal: var(--tw-empty,/*!*/ /*!*/); - --tw-slashed-zero: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-figure: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-spacing: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-fraction: var(--tw-empty,/*!*/ /*!*/); - font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); -} -.tabular-nums { - --tw-numeric-spacing: tabular-nums; -} -.tracking-tight { - letter-spacing: -0.025em; -} -.tracking-tighter { - letter-spacing: -0.05em; -} -.text-transparent { - color: transparent; -} -.text-gray-800 { - --tw-text-opacity: 1; - color: rgba(39, 39, 42, var(--tw-text-opacity)); -} -.text-blue-800 { - --tw-text-opacity: 1; - color: rgba(30, 64, 175, var(--tw-text-opacity)); -} -.text-yellow-900 { - --tw-text-opacity: 1; - color: rgba(113, 63, 18, var(--tw-text-opacity)); -} -.text-gray-500 { - --tw-text-opacity: 1; - color: rgba(113, 113, 122, var(--tw-text-opacity)); -} -.text-red-500 { - --tw-text-opacity: 1; - color: rgba(239, 68, 68, var(--tw-text-opacity)); -} -.text-orange-500 { - --tw-text-opacity: 1; - color: rgba(249, 115, 22, var(--tw-text-opacity)); -} -.text-gray-600 { - --tw-text-opacity: 1; - color: rgba(82, 82, 91, var(--tw-text-opacity)); -} -.antialiased { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.mix-blend-multiply { - mix-blend-mode: multiply; -} -.shadow { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.shadow-xl { - --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.shadow-md { - --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.shadow-2xl { - --tw-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.shadow-inner { - --tw-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -.ring-4 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} -.ring-white { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(255, 255, 255, var(--tw-ring-opacity)); -} -.backdrop-filter { - --tw-backdrop-blur: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-brightness: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-contrast: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-grayscale: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-hue-rotate: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-invert: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-opacity: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-saturate: var(--tw-empty,/*!*/ /*!*/); - --tw-backdrop-sepia: var(--tw-empty,/*!*/ /*!*/); - -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); - backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); -} -.backdrop-blur-lg { - --tw-backdrop-blur: blur(16px); -} -.transition { - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} -.duration-75 { - transition-duration: 75ms; -} -.duration-200 { - transition-duration: 200ms; -} -.duration-300 { - transition-duration: 300ms; -} -.hover\:border-orange-500:hover { - --tw-border-opacity: 1; - border-color: rgba(249, 115, 22, var(--tw-border-opacity)); -} -.hover\:border-pink-900:hover { - --tw-border-opacity: 1; - border-color: rgba(131, 24, 67, var(--tw-border-opacity)); -} -.focus\:border-orange-600:focus { - --tw-border-opacity: 1; - border-color: rgba(234, 88, 12, var(--tw-border-opacity)); -} -.focus\:border-pink-900:focus { - --tw-border-opacity: 1; - border-color: rgba(131, 24, 67, var(--tw-border-opacity)); -} -.focus\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} -.active\:scale-\[0\.99\]:active { - --tw-scale-x: 0.99; - --tw-scale-y: 0.99; -} -.group:hover .group-hover\:-translate-y-2 { - --tw-translate-y: -0.5rem; -} -.group:hover .group-hover\:rotate-6 { - --tw-rotate: 6deg; -} -.group:hover .group-hover\:scale-105 { - --tw-scale-x: 1.05; - --tw-scale-y: 1.05; -} -.group:hover .group-hover\:shadow-md { - --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} -@media (min-width: 640px) { - - .sm\:mx-0 { - margin-left: 0px; - margin-right: 0px; - } - - .sm\:mt-60 { - margin-top: 15rem; - } - - .sm\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .sm\:flex-row { - flex-direction: row; - } - - .sm\:px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } -} -@media (min-width: 768px) { - - .md\:prose-xl { - font-size: 1.25rem; - line-height: 1.8; - } - - .md\:prose-xl p { - margin-top: 1.2em; - margin-bottom: 1.2em; - } - - .md\:prose-xl [class~="lead"] { - font-size: 1.2em; - line-height: 1.5; - margin-top: 1em; - margin-bottom: 1em; - } - - .md\:prose-xl blockquote { - margin-top: 1.6em; - margin-bottom: 1.6em; - padding-left: 1.0666667em; - } - - .md\:prose-xl h1 { - font-size: 2.8em; - margin-top: 0; - margin-bottom: 0.8571429em; - line-height: 1; - } - - .md\:prose-xl h2 { - font-size: 1.8em; - margin-top: 1.5555556em; - margin-bottom: 0.8888889em; - line-height: 1.1111111; - } - - .md\:prose-xl h3 { - font-size: 1.5em; - margin-top: 1.6em; - margin-bottom: 0.6666667em; - line-height: 1.3333333; - } - - .md\:prose-xl h4 { - margin-top: 1.8em; - margin-bottom: 0.6em; - line-height: 1.6; - } - - .md\:prose-xl img { - margin-top: 2em; - margin-bottom: 2em; - } - - .md\:prose-xl video { - margin-top: 2em; - margin-bottom: 2em; - } - - .md\:prose-xl figure { - margin-top: 2em; - margin-bottom: 2em; - } - - .md\:prose-xl figure > * { - margin-top: 0; - margin-bottom: 0; - } - - .md\:prose-xl figure figcaption { - font-size: 0.9em; - line-height: 1.5555556; - margin-top: 1em; - } - - .md\:prose-xl code { - font-size: 0.9em; - } - - .md\:prose-xl h2 code { - font-size: 0.8611111em; - } - - .md\:prose-xl h3 code { - font-size: 0.9em; - } - - .md\:prose-xl pre { - font-size: 0.9em; - line-height: 1.7777778; - margin-top: 2em; - margin-bottom: 2em; - border-radius: 0.5rem; - padding-top: 1.1111111em; - padding-right: 1.3333333em; - padding-bottom: 1.1111111em; - padding-left: 1.3333333em; - } - - .md\:prose-xl ol { - margin-top: 1.2em; - margin-bottom: 1.2em; - } - - .md\:prose-xl ul { - margin-top: 1.2em; - margin-bottom: 1.2em; - } - - .md\:prose-xl li { - margin-top: 0.6em; - margin-bottom: 0.6em; - } - - .md\:prose-xl ol > li { - padding-left: 1.8em; - } - - .md\:prose-xl ol > li::before { - left: 0; - } - - .md\:prose-xl ul > li { - padding-left: 1.8em; - } - - .md\:prose-xl ul > li::before { - width: 0.35em; - height: 0.35em; - top: calc(0.9em - 0.175em); - left: 0.25em; - } - - .md\:prose-xl > ul > li p { - margin-top: 0.8em; - margin-bottom: 0.8em; - } - - .md\:prose-xl > ul > li > *:first-child { - margin-top: 1.2em; - } - - .md\:prose-xl > ul > li > *:last-child { - margin-bottom: 1.2em; - } - - .md\:prose-xl > ol > li > *:first-child { - margin-top: 1.2em; - } - - .md\:prose-xl > ol > li > *:last-child { - margin-bottom: 1.2em; - } - - .md\:prose-xl ul ul, .md\:prose-xl ul ol, .md\:prose-xl ol ul, .md\:prose-xl ol ol { - margin-top: 0.8em; - margin-bottom: 0.8em; - } - - .md\:prose-xl ul ul, .md\:prose-xl ul ol, .md\:prose-xl ol ul, .md\:prose-xl ol ol { - margin-top: 0.8em; - margin-bottom: 0.8em; - } - - .md\:prose-xl ul ul, .md\:prose-xl ul ol, .md\:prose-xl ol ul, .md\:prose-xl ol ol { - margin-top: 0.8em; - margin-bottom: 0.8em; - } - - .md\:prose-xl ul ul, .md\:prose-xl ul ol, .md\:prose-xl ol ul, .md\:prose-xl ol ol { - margin-top: 0.8em; - margin-bottom: 0.8em; - } - - .md\:prose-xl hr { - margin-top: 2.8em; - margin-bottom: 2.8em; - } - - .md\:prose-xl hr + * { - margin-top: 0; - } - - .md\:prose-xl h2 + * { - margin-top: 0; - } - - .md\:prose-xl h3 + * { - margin-top: 0; - } - - .md\:prose-xl h4 + * { - margin-top: 0; - } - - .md\:prose-xl table { - font-size: 0.9em; - line-height: 1.5555556; - } - - .md\:prose-xl thead th { - padding-right: 0.6666667em; - padding-bottom: 0.8888889em; - padding-left: 0.6666667em; - } - - .md\:prose-xl thead th:first-child { - padding-left: 0; - } - - .md\:prose-xl thead th:last-child { - padding-right: 0; - } - - .md\:prose-xl tbody td { - padding-top: 0.8888889em; - padding-right: 0.6666667em; - padding-bottom: 0.8888889em; - padding-left: 0.6666667em; - } - - .md\:prose-xl tbody td:first-child { - padding-left: 0; - } - - .md\:prose-xl tbody td:last-child { - padding-right: 0; - } - - .md\:prose-xl > :first-child { - margin-top: 0; - } - - .md\:prose-xl > :last-child { - margin-bottom: 0; - } - - .md\:h-96 { - height: 24rem; - } - - .md\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .md\:space-y-12 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(3rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(3rem * var(--tw-space-y-reverse)); - } - - .md\:py-24 { - padding-top: 6rem; - padding-bottom: 6rem; - } - - .md\:px-8 { - padding-left: 2rem; - padding-right: 2rem; - } - - .md\:text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; - } - - .md\:text-5xl { - font-size: 3rem; - line-height: 1; - } - - .md\:text-6xl { - font-size: 3.75rem; - line-height: 1; - } -} -@media (min-width: 1024px) { - - .lg\:flex { - display: flex; - } - - .lg\:text-8xl { - font-size: 6rem; - line-height: 1; - } -} - +/*! tailwindcss v2.1.1 | MIT License | https://tailwindcss.com*//*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:iA Writer Quattro S,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid #e4e4e7}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder, textarea::-moz-placeholder{opacity:1;color:#a1a1aa}input:-ms-input-placeholder, textarea:-ms-input-placeholder{opacity:1;color:#a1a1aa}input::placeholder,textarea::placeholder{opacity:1;color:#a1a1aa}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*{--tw-shadow:0 0 transparent;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.prose a{position:relative}.prose{color:#3f3f46;max-width:65ch}.prose [class~=lead]{color:#52525b;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose a{color:#18181b;text-decoration:underline;font-weight:500}.prose strong{color:#18181b;font-weight:600}.prose ol[type=A]{--list-counter-style:upper-alpha}.prose ol[type=a]{--list-counter-style:lower-alpha}.prose ol[type="A s"]{--list-counter-style:upper-alpha}.prose ol[type="a s"]{--list-counter-style:lower-alpha}.prose ol[type=I]{--list-counter-style:upper-roman}.prose ol[type=i]{--list-counter-style:lower-roman}.prose ol[type="I s"]{--list-counter-style:upper-roman}.prose ol[type="i s"]{--list-counter-style:lower-roman}.prose ol[type="1"]{--list-counter-style:decimal}.prose ol>li{position:relative;padding-left:1.75em}.prose ol>li:before{content:counter(list-item,var(--list-counter-style,decimal)) ".";position:absolute;font-weight:400;color:#71717a;left:0}.prose ul>li{position:relative;padding-left:1.75em}.prose ul>li:before{content:"";position:absolute;background-color:#d4d4d8;border-radius:50%;width:.375em;height:.375em;top:.6875em;left:.25em}.prose hr{border-color:#e4e4e7;border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose blockquote{font-weight:500;font-style:italic;color:#18181b;border-left-width:.25rem;border-left-color:#e4e4e7;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose blockquote p:first-of-type:before{content:open-quote}.prose blockquote p:last-of-type:after{content:close-quote}.prose h1{color:#18181b;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose h2{color:#18181b;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose h3{color:#18181b;font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose h4{color:#18181b;font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose figure figcaption{color:#71717a;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose code{color:#18181b;font-weight:600;font-size:.875em}.prose code:after,.prose code:before{content:"`"}.prose a code{color:#18181b}.prose pre{color:#e4e4e7;background-color:#27272a;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose pre code:after,.prose pre code:before{content:none}.prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose thead{color:#18181b;font-weight:600;border-bottom-width:1px;border-bottom-color:#d4d4d8}.prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose tbody tr{border-bottom-width:1px;border-bottom-color:#e4e4e7}.prose tbody tr:last-child{border-bottom-width:0}.prose tbody td{vertical-align:top;padding:.5714286em}.prose{font-size:1rem;line-height:1.75}.prose p{margin-top:1.25em;margin-bottom:1.25em}.prose figure,.prose img,.prose video{margin-top:2em;margin-bottom:2em}.prose figure>*{margin-top:0;margin-bottom:0}.prose h2 code{font-size:.875em}.prose h3 code{font-size:.9em}.prose ol,.prose ul{margin-top:1.25em;margin-bottom:1.25em}.prose li{margin-top:.5em;margin-bottom:.5em}.prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.prose>ul>li>:first-child{margin-top:1.25em}.prose>ul>li>:last-child{margin-bottom:1.25em}.prose>ol>li>:first-child{margin-top:1.25em}.prose>ol>li>:last-child{margin-bottom:1.25em}.prose ol ol,.prose ol ul,.prose ul ol,.prose ul ul{margin-top:.75em;margin-bottom:.75em}.prose h2+*,.prose h3+*,.prose h4+*,.prose hr+*{margin-top:0}.prose thead th:first-child{padding-left:0}.prose thead th:last-child{padding-right:0}.prose tbody td:first-child{padding-left:0}.prose tbody td:last-child{padding-right:0}.prose>:first-child{margin-top:0}.prose>:last-child{margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.inset-0{top:0;right:0;bottom:0;left:0}.z-40{z-index:40}.mx-auto{margin-left:auto;margin-right:auto}.mt-3{margin-top:.75rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.inline-grid{display:inline-grid}.hidden{display:none}.h-14{height:3.5rem}.h-full{height:100%}.h-16{height:4rem}.h-72{height:18rem}.h-screen{height:100vh}.h-8{height:2rem}.min-h-screen{min-height:100vh}.w-full{width:100%}.w-14{width:3.5rem}.w-16{width:4rem}.w-8{width:2rem}.max-w-4xl{max-width:56rem}.flex-1{flex:1 1 0%}.transform{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/4{--tw-translate-y:-25%}.skew-y-12{--tw-skew-y:12deg}.grid-flow-col{grid-auto-flow:column}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-6{gap:1.5rem}.gap-4{gap:1rem}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.5rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.break-all{word-break:break-all}.break-words{overflow-wrap:break-word}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-xl{border-radius:.75rem}.border-t{border-top-width:1px}.border-b-2{border-bottom-width:2px}.border-gray-200{--tw-border-opacity:1;border-color:rgba(228,228,231,var(--tw-border-opacity))}.border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(250,250,250,var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(228,228,231,var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-gradient-to-b{background-image:linear-gradient(180deg,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.from-yellow-400{--tw-gradient-from:#facc15;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(250,204,21,0))}.from-yellow-300{--tw-gradient-from:#fde047;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,224,71,0))}.to-pink-50{--tw-gradient-to:#fdf2f8}.to-pink-400{--tw-gradient-to:#f472b6}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-6{padding:1.5rem}.p-16{padding:4rem}.px-4{padding-left:1rem;padding-right:1rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-24{padding-top:6rem;padding-bottom:6rem}.text-left{text-align:left}.text-center{text-align:center}.font-sans{font-family:iA Writer Quattro S,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.diagonal-fractions,.lining-nums,.oldstyle-nums,.ordinal,.proportional-nums,.slashed-zero,.stacked-fractions,.tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.text-gray-500{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}.text-transparent{color:transparent}.text-gray-800{--tw-text-opacity:1;color:rgba(39,39,42,var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgba(113,63,18,var(--tw-text-opacity))}.text-orange-500{--tw-text-opacity:1;color:rgba(249,115,22,var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mix-blend-multiply{mix-blend-mode:multiply}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.shadow,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.shadow-2xl,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-75{transition-duration:75ms}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.hover\:border-orange-500:hover{--tw-border-opacity:1;border-color:rgba(249,115,22,var(--tw-border-opacity))}.hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.focus\:border-orange-600:focus{--tw-border-opacity:1;border-color:rgba(234,88,12,var(--tw-border-opacity))}.focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.active\:scale-\[0\.99\]:active{--tw-scale-x:0.99;--tw-scale-y:0.99}.group:hover .group-hover\:-translate-y-2{--tw-translate-y:-0.5rem}.group:hover .group-hover\:rotate-6{--tw-rotate:6deg}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.group:hover .group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}@media (min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width:768px){.md\:prose-xl{font-size:1.25rem;line-height:1.8}.md\:prose-xl p{margin-top:1.2em;margin-bottom:1.2em}.md\:prose-xl [class~=lead]{font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.md\:prose-xl blockquote{margin-top:1.6em;margin-bottom:1.6em;padding-left:1.0666667em}.md\:prose-xl h1{font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.md\:prose-xl h2{font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.md\:prose-xl h3{font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.md\:prose-xl h4{margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.md\:prose-xl figure,.md\:prose-xl img,.md\:prose-xl video{margin-top:2em;margin-bottom:2em}.md\:prose-xl figure>*{margin-top:0;margin-bottom:0}.md\:prose-xl figure figcaption{font-size:.9em;line-height:1.5555556;margin-top:1em}.md\:prose-xl code{font-size:.9em}.md\:prose-xl h2 code{font-size:.8611111em}.md\:prose-xl h3 code{font-size:.9em}.md\:prose-xl pre{font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding:1.1111111em 1.3333333em}.md\:prose-xl ol,.md\:prose-xl ul{margin-top:1.2em;margin-bottom:1.2em}.md\:prose-xl li{margin-top:.6em;margin-bottom:.6em}.md\:prose-xl ol>li{padding-left:1.8em}.md\:prose-xl ol>li:before{left:0}.md\:prose-xl ul>li{padding-left:1.8em}.md\:prose-xl ul>li:before{width:.35em;height:.35em;top:.725em;left:.25em}.md\:prose-xl>ul>li p{margin-top:.8em;margin-bottom:.8em}.md\:prose-xl>ul>li>:first-child{margin-top:1.2em}.md\:prose-xl>ul>li>:last-child{margin-bottom:1.2em}.md\:prose-xl>ol>li>:first-child{margin-top:1.2em}.md\:prose-xl>ol>li>:last-child{margin-bottom:1.2em}.md\:prose-xl ol ol,.md\:prose-xl ol ul,.md\:prose-xl ul ol,.md\:prose-xl ul ul{margin-top:.8em;margin-bottom:.8em}.md\:prose-xl hr{margin-top:2.8em;margin-bottom:2.8em}.md\:prose-xl h2+*,.md\:prose-xl h3+*,.md\:prose-xl h4+*,.md\:prose-xl hr+*{margin-top:0}.md\:prose-xl table{font-size:.9em;line-height:1.5555556}.md\:prose-xl thead th{padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.md\:prose-xl thead th:first-child{padding-left:0}.md\:prose-xl thead th:last-child{padding-right:0}.md\:prose-xl tbody td{padding:.8888889em .6666667em}.md\:prose-xl tbody td:first-child{padding-left:0}.md\:prose-xl tbody td:last-child{padding-right:0}.md\:prose-xl>:first-child{margin-top:0}.md\:prose-xl>:last-child{margin-bottom:0}.md\:h-96{height:24rem}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-24{padding-top:6rem;padding-bottom:6rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:flex{display:flex}.lg\:text-8xl{font-size:6rem;line-height:1}} diff --git a/public/js/app.js b/public/js/app.js index 8b4d6dc..93ddfb2 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1,1270 +1,4 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js": -/*!***************************************************************!*\ - !*** ./node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "clearCache": () => (/* binding */ clearCache), -/* harmony export */ "connectStreamSource": () => (/* binding */ connectStreamSource), -/* harmony export */ "disconnectStreamSource": () => (/* binding */ disconnectStreamSource), -/* harmony export */ "navigator": () => (/* binding */ navigator), -/* harmony export */ "registerAdapter": () => (/* binding */ registerAdapter), -/* harmony export */ "renderStreamMessage": () => (/* binding */ renderStreamMessage), -/* harmony export */ "setProgressBarDelay": () => (/* binding */ setProgressBarDelay), -/* harmony export */ "start": () => (/* binding */ start), -/* harmony export */ "visit": () => (/* binding */ visit) -/* harmony export */ }); -/* -Turbo 7.0.0-beta.4 -Copyright © 2021 Basecamp, LLC - */ -(function () { - if (window.Reflect === undefined || window.customElements === undefined || - window.customElements.polyfillWrapFlushCallback) { - return; - } - const BuiltInHTMLElement = HTMLElement; - const wrapperForTheName = { - 'HTMLElement': function HTMLElement() { - return Reflect.construct(BuiltInHTMLElement, [], this.constructor); - } - }; - window.HTMLElement = - wrapperForTheName['HTMLElement']; - HTMLElement.prototype = BuiltInHTMLElement.prototype; - HTMLElement.prototype.constructor = HTMLElement; - Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement); -})(); - -const submittersByForm = new WeakMap; -function findSubmitterFromClickTarget(target) { - const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null; - const candidate = element ? element.closest("input, button") : null; - return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == "submit" ? candidate : null; -} -function clickCaptured(event) { - const submitter = findSubmitterFromClickTarget(event.target); - if (submitter && submitter.form) { - submittersByForm.set(submitter.form, submitter); - } -} -(function () { - if ("SubmitEvent" in window) - return; - addEventListener("click", clickCaptured, true); - Object.defineProperty(Event.prototype, "submitter", { - get() { - if (this.type == "submit" && this.target instanceof HTMLFormElement) { - return submittersByForm.get(this.target); - } - } - }); -})(); - -var FrameLoadingStyle; -(function (FrameLoadingStyle) { - FrameLoadingStyle["eager"] = "eager"; - FrameLoadingStyle["lazy"] = "lazy"; -})(FrameLoadingStyle || (FrameLoadingStyle = {})); -class FrameElement extends HTMLElement { - constructor() { - super(); - this.loaded = Promise.resolve(); - this.delegate = new FrameElement.delegateConstructor(this); - } - static get observedAttributes() { - return ["loading", "src"]; - } - connectedCallback() { - this.delegate.connect(); - } - disconnectedCallback() { - this.delegate.disconnect(); - } - attributeChangedCallback(name) { - if (name == "loading") { - this.delegate.loadingStyleChanged(); - } - else if (name == "src") { - this.delegate.sourceURLChanged(); - } - } - get src() { - return this.getAttribute("src"); - } - set src(value) { - if (value) { - this.setAttribute("src", value); - } - else { - this.removeAttribute("src"); - } - } - get loading() { - return frameLoadingStyleFromString(this.getAttribute("loading") || ""); - } - set loading(value) { - if (value) { - this.setAttribute("loading", value); - } - else { - this.removeAttribute("loading"); - } - } - get disabled() { - return this.hasAttribute("disabled"); - } - set disabled(value) { - if (value) { - this.setAttribute("disabled", ""); - } - else { - this.removeAttribute("disabled"); - } - } - get autoscroll() { - return this.hasAttribute("autoscroll"); - } - set autoscroll(value) { - if (value) { - this.setAttribute("autoscroll", ""); - } - else { - this.removeAttribute("autoscroll"); - } - } - get complete() { - return !this.delegate.isLoading; - } - get isActive() { - return this.ownerDocument === document && !this.isPreview; - } - get isPreview() { - var _a, _b; - return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute("data-turbo-preview"); - } -} -function frameLoadingStyleFromString(style) { - switch (style.toLowerCase()) { - case "lazy": return FrameLoadingStyle.lazy; - default: return FrameLoadingStyle.eager; - } -} - -function expandURL(locatable) { - const anchor = document.createElement("a"); - anchor.href = locatable.toString(); - return new URL(anchor.href); -} -function getAnchor(url) { - let anchorMatch; - if (url.hash) { - return url.hash.slice(1); - } - else if (anchorMatch = url.href.match(/#(.*)$/)) { - return anchorMatch[1]; - } - else { - return ""; - } -} -function getExtension(url) { - return (getLastPathComponent(url).match(/\.[^.]*$/) || [])[0] || ""; -} -function isHTML(url) { - return !!getExtension(url).match(/^(?:|\.(?:htm|html|xhtml))$/); -} -function isPrefixedBy(baseURL, url) { - const prefix = getPrefix(url); - return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix); -} -function toCacheKey(url) { - const anchorLength = url.hash.length; - if (anchorLength < 2) { - return url.href; - } - else { - return url.href.slice(0, -anchorLength); - } -} -function getPathComponents(url) { - return url.pathname.split("/").slice(1); -} -function getLastPathComponent(url) { - return getPathComponents(url).slice(-1)[0]; -} -function getPrefix(url) { - return addTrailingSlash(url.origin + url.pathname); -} -function addTrailingSlash(value) { - return value.endsWith("/") ? value : value + "/"; -} - -class FetchResponse { - constructor(response) { - this.response = response; - } - get succeeded() { - return this.response.ok; - } - get failed() { - return !this.succeeded; - } - get clientError() { - return this.statusCode >= 400 && this.statusCode <= 499; - } - get serverError() { - return this.statusCode >= 500 && this.statusCode <= 599; - } - get redirected() { - return this.response.redirected; - } - get location() { - return expandURL(this.response.url); - } - get isHTML() { - return this.contentType && this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/); - } - get statusCode() { - return this.response.status; - } - get contentType() { - return this.header("Content-Type"); - } - get responseText() { - return this.response.text(); - } - get responseHTML() { - if (this.isHTML) { - return this.response.text(); - } - else { - return Promise.resolve(undefined); - } - } - header(name) { - return this.response.headers.get(name); - } -} - -function dispatch(eventName, { target, cancelable, detail } = {}) { - const event = new CustomEvent(eventName, { cancelable, bubbles: true, detail }); - void (target || document.documentElement).dispatchEvent(event); - return event; -} -function nextAnimationFrame() { - return new Promise(resolve => requestAnimationFrame(() => resolve())); -} -function nextEventLoopTick() { - return new Promise(resolve => setTimeout(() => resolve(), 0)); -} -function nextMicrotask() { - return Promise.resolve(); -} -function parseHTMLDocument(html = "") { - return new DOMParser().parseFromString(html, "text/html"); -} -function unindent(strings, ...values) { - const lines = interpolate(strings, values).replace(/^\n/, "").split("\n"); - const match = lines[0].match(/^\s+/); - const indent = match ? match[0].length : 0; - return lines.map(line => line.slice(indent)).join("\n"); -} -function interpolate(strings, values) { - return strings.reduce((result, string, i) => { - const value = values[i] == undefined ? "" : values[i]; - return result + string + value; - }, ""); -} -function uuid() { - return Array.apply(null, { length: 36 }).map((_, i) => { - if (i == 8 || i == 13 || i == 18 || i == 23) { - return "-"; - } - else if (i == 14) { - return "4"; - } - else if (i == 19) { - return (Math.floor(Math.random() * 4) + 8).toString(16); - } - else { - return Math.floor(Math.random() * 15).toString(16); - } - }).join(""); -} - -var FetchMethod; -(function (FetchMethod) { - FetchMethod[FetchMethod["get"] = 0] = "get"; - FetchMethod[FetchMethod["post"] = 1] = "post"; - FetchMethod[FetchMethod["put"] = 2] = "put"; - FetchMethod[FetchMethod["patch"] = 3] = "patch"; - FetchMethod[FetchMethod["delete"] = 4] = "delete"; -})(FetchMethod || (FetchMethod = {})); -function fetchMethodFromString(method) { - switch (method.toLowerCase()) { - case "get": return FetchMethod.get; - case "post": return FetchMethod.post; - case "put": return FetchMethod.put; - case "patch": return FetchMethod.patch; - case "delete": return FetchMethod.delete; - } -} -class FetchRequest { - constructor(delegate, method, location, body = new URLSearchParams) { - this.abortController = new AbortController; - this.delegate = delegate; - this.method = method; - if (this.isIdempotent) { - this.url = mergeFormDataEntries(location, [...body.entries()]); - } - else { - this.body = body; - this.url = location; - } - } - get location() { - return this.url; - } - get params() { - return this.url.searchParams; - } - get entries() { - return this.body ? Array.from(this.body.entries()) : []; - } - cancel() { - this.abortController.abort(); - } - async perform() { - const { fetchOptions } = this; - dispatch("turbo:before-fetch-request", { detail: { fetchOptions } }); - try { - this.delegate.requestStarted(this); - const response = await fetch(this.url.href, fetchOptions); - return await this.receive(response); - } - catch (error) { - this.delegate.requestErrored(this, error); - throw error; - } - finally { - this.delegate.requestFinished(this); - } - } - async receive(response) { - const fetchResponse = new FetchResponse(response); - const event = dispatch("turbo:before-fetch-response", { cancelable: true, detail: { fetchResponse } }); - if (event.defaultPrevented) { - this.delegate.requestPreventedHandlingResponse(this, fetchResponse); - } - else if (fetchResponse.succeeded) { - this.delegate.requestSucceededWithResponse(this, fetchResponse); - } - else { - this.delegate.requestFailedWithResponse(this, fetchResponse); - } - return fetchResponse; - } - get fetchOptions() { - return { - method: FetchMethod[this.method].toUpperCase(), - credentials: "same-origin", - headers: this.headers, - redirect: "follow", - body: this.body, - signal: this.abortSignal - }; - } - get isIdempotent() { - return this.method == FetchMethod.get; - } - get headers() { - const headers = Object.assign({}, this.defaultHeaders); - if (typeof this.delegate.prepareHeadersForRequest == "function") { - this.delegate.prepareHeadersForRequest(headers, this); - } - return headers; - } - get abortSignal() { - return this.abortController.signal; - } - get defaultHeaders() { - return { - "Accept": "text/html, application/xhtml+xml" - }; - } -} -function mergeFormDataEntries(url, entries) { - const currentSearchParams = new URLSearchParams(url.search); - for (const [name, value] of entries) { - if (value instanceof File) - continue; - if (currentSearchParams.has(name)) { - currentSearchParams.delete(name); - url.searchParams.set(name, value); - } - else { - url.searchParams.append(name, value); - } - } - return url; -} - -class AppearanceObserver { - constructor(delegate, element) { - this.started = false; - this.intersect = entries => { - const lastEntry = entries.slice(-1)[0]; - if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) { - this.delegate.elementAppearedInViewport(this.element); - } - }; - this.delegate = delegate; - this.element = element; - this.intersectionObserver = new IntersectionObserver(this.intersect); - } - start() { - if (!this.started) { - this.started = true; - this.intersectionObserver.observe(this.element); - } - } - stop() { - if (this.started) { - this.started = false; - this.intersectionObserver.unobserve(this.element); - } - } -} - -class StreamMessage { - constructor(html) { - this.templateElement = document.createElement("template"); - this.templateElement.innerHTML = html; - } - static wrap(message) { - if (typeof message == "string") { - return new this(message); - } - else { - return message; - } - } - get fragment() { - const fragment = document.createDocumentFragment(); - for (const element of this.foreignElements) { - fragment.appendChild(document.importNode(element, true)); - } - return fragment; - } - get foreignElements() { - return this.templateChildren.reduce((streamElements, child) => { - if (child.tagName.toLowerCase() == "turbo-stream") { - return [...streamElements, child]; - } - else { - return streamElements; - } - }, []); - } - get templateChildren() { - return Array.from(this.templateElement.content.children); - } -} -StreamMessage.contentType = "text/vnd.turbo-stream.html"; - -var FormSubmissionState; -(function (FormSubmissionState) { - FormSubmissionState[FormSubmissionState["initialized"] = 0] = "initialized"; - FormSubmissionState[FormSubmissionState["requesting"] = 1] = "requesting"; - FormSubmissionState[FormSubmissionState["waiting"] = 2] = "waiting"; - FormSubmissionState[FormSubmissionState["receiving"] = 3] = "receiving"; - FormSubmissionState[FormSubmissionState["stopping"] = 4] = "stopping"; - FormSubmissionState[FormSubmissionState["stopped"] = 5] = "stopped"; -})(FormSubmissionState || (FormSubmissionState = {})); -var FormEnctype; -(function (FormEnctype) { - FormEnctype["urlEncoded"] = "application/x-www-form-urlencoded"; - FormEnctype["multipart"] = "multipart/form-data"; - FormEnctype["plain"] = "text/plain"; -})(FormEnctype || (FormEnctype = {})); -function formEnctypeFromString(encoding) { - switch (encoding.toLowerCase()) { - case FormEnctype.multipart: return FormEnctype.multipart; - case FormEnctype.plain: return FormEnctype.plain; - default: return FormEnctype.urlEncoded; - } -} -class FormSubmission { - constructor(delegate, formElement, submitter, mustRedirect = false) { - this.state = FormSubmissionState.initialized; - this.delegate = delegate; - this.formElement = formElement; - this.submitter = submitter; - this.formData = buildFormData(formElement, submitter); - this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body); - this.mustRedirect = mustRedirect; - } - get method() { - var _a; - const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute("formmethod")) || this.formElement.getAttribute("method") || ""; - return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get; - } - get action() { - var _a; - return ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute("formaction")) || this.formElement.action; - } - get location() { - return expandURL(this.action); - } - get body() { - if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) { - return new URLSearchParams(this.stringFormData); - } - else { - return this.formData; - } - } - get enctype() { - var _a; - return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute("formenctype")) || this.formElement.enctype); - } - get stringFormData() { - return [...this.formData].reduce((entries, [name, value]) => { - return entries.concat(typeof value == "string" ? [[name, value]] : []); - }, []); - } - async start() { - const { initialized, requesting } = FormSubmissionState; - if (this.state == initialized) { - this.state = requesting; - return this.fetchRequest.perform(); - } - } - stop() { - const { stopping, stopped } = FormSubmissionState; - if (this.state != stopping && this.state != stopped) { - this.state = stopping; - this.fetchRequest.cancel(); - return true; - } - } - prepareHeadersForRequest(headers, request) { - if (!request.isIdempotent) { - const token = getCookieValue(getMetaContent("csrf-param")) || getMetaContent("csrf-token"); - if (token) { - headers["X-CSRF-Token"] = token; - } - headers["Accept"] = [StreamMessage.contentType, headers["Accept"]].join(", "); - } - } - requestStarted(request) { - this.state = FormSubmissionState.waiting; - dispatch("turbo:submit-start", { target: this.formElement, detail: { formSubmission: this } }); - this.delegate.formSubmissionStarted(this); - } - requestPreventedHandlingResponse(request, response) { - this.result = { success: response.succeeded, fetchResponse: response }; - } - requestSucceededWithResponse(request, response) { - if (response.clientError || response.serverError) { - this.delegate.formSubmissionFailedWithResponse(this, response); - } - else if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) { - const error = new Error("Form responses must redirect to another location"); - this.delegate.formSubmissionErrored(this, error); - } - else { - this.state = FormSubmissionState.receiving; - this.result = { success: true, fetchResponse: response }; - this.delegate.formSubmissionSucceededWithResponse(this, response); - } - } - requestFailedWithResponse(request, response) { - this.result = { success: false, fetchResponse: response }; - this.delegate.formSubmissionFailedWithResponse(this, response); - } - requestErrored(request, error) { - this.result = { success: false, error }; - this.delegate.formSubmissionErrored(this, error); - } - requestFinished(request) { - this.state = FormSubmissionState.stopped; - dispatch("turbo:submit-end", { target: this.formElement, detail: Object.assign({ formSubmission: this }, this.result) }); - this.delegate.formSubmissionFinished(this); - } - requestMustRedirect(request) { - return !request.isIdempotent && this.mustRedirect; - } -} -function buildFormData(formElement, submitter) { - const formData = new FormData(formElement); - const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("name"); - const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("value"); - if (name && formData.get(name) != value) { - formData.append(name, value || ""); - } - return formData; -} -function getCookieValue(cookieName) { - if (cookieName != null) { - const cookies = document.cookie ? document.cookie.split("; ") : []; - const cookie = cookies.find((cookie) => cookie.startsWith(cookieName)); - if (cookie) { - const value = cookie.split("=").slice(1).join("="); - return value ? decodeURIComponent(value) : undefined; - } - } -} -function getMetaContent(name) { - const element = document.querySelector(`meta[name="${name}"]`); - return element && element.content; -} -function responseSucceededWithoutRedirect(response) { - return response.statusCode == 200 && !response.redirected; -} - -class Snapshot { - constructor(element) { - this.element = element; - } - get children() { - return [...this.element.children]; - } - hasAnchor(anchor) { - return this.getElementForAnchor(anchor) != null; - } - getElementForAnchor(anchor) { - try { - return this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`); - } - catch (_a) { - return null; - } - } - get firstAutofocusableElement() { - return this.element.querySelector("[autofocus]"); - } - get permanentElements() { - return [...this.element.querySelectorAll("[id][data-turbo-permanent]")]; - } - getPermanentElementById(id) { - return this.element.querySelector(`#${id}[data-turbo-permanent]`); - } - getPermanentElementsPresentInSnapshot(snapshot) { - return this.permanentElements.filter(({ id }) => snapshot.getPermanentElementById(id)); - } -} - -class FormInterceptor { - constructor(delegate, element) { - this.submitBubbled = ((event) => { - if (event.target instanceof HTMLFormElement) { - const form = event.target; - const submitter = event.submitter || undefined; - if (this.delegate.shouldInterceptFormSubmission(form, submitter)) { - event.preventDefault(); - event.stopImmediatePropagation(); - this.delegate.formSubmissionIntercepted(form, submitter); - } - } - }); - this.delegate = delegate; - this.element = element; - } - start() { - this.element.addEventListener("submit", this.submitBubbled); - } - stop() { - this.element.removeEventListener("submit", this.submitBubbled); - } -} - -class View { - constructor(delegate, element) { - this.delegate = delegate; - this.element = element; - } - scrollToAnchor(anchor) { - const element = this.snapshot.getElementForAnchor(anchor); - if (element) { - this.scrollToElement(element); - } - else { - this.scrollToPosition({ x: 0, y: 0 }); - } - } - scrollToElement(element) { - element.scrollIntoView(); - } - scrollToPosition({ x, y }) { - this.scrollRoot.scrollTo(x, y); - } - get scrollRoot() { - return window; - } - async render(renderer) { - if (this.renderer) { - throw new Error("rendering is already in progress"); - } - const { isPreview, shouldRender, newSnapshot: snapshot } = renderer; - if (shouldRender) { - try { - this.renderer = renderer; - this.prepareToRenderSnapshot(renderer); - this.delegate.viewWillRenderSnapshot(snapshot, isPreview); - await this.renderSnapshot(renderer); - this.delegate.viewRenderedSnapshot(snapshot, isPreview); - this.finishRenderingSnapshot(renderer); - } - finally { - delete this.renderer; - } - } - else { - this.invalidate(); - } - } - invalidate() { - this.delegate.viewInvalidated(); - } - prepareToRenderSnapshot(renderer) { - this.markAsPreview(renderer.isPreview); - renderer.prepareToRender(); - } - markAsPreview(isPreview) { - if (isPreview) { - this.element.setAttribute("data-turbo-preview", ""); - } - else { - this.element.removeAttribute("data-turbo-preview"); - } - } - async renderSnapshot(renderer) { - await renderer.render(); - } - finishRenderingSnapshot(renderer) { - renderer.finishRendering(); - } -} - -class FrameView extends View { - invalidate() { - this.element.innerHTML = ""; - } - get snapshot() { - return new Snapshot(this.element); - } -} - -class LinkInterceptor { - constructor(delegate, element) { - this.clickBubbled = (event) => { - if (this.respondsToEventTarget(event.target)) { - this.clickEvent = event; - } - else { - delete this.clickEvent; - } - }; - this.linkClicked = ((event) => { - if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) { - if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url)) { - this.clickEvent.preventDefault(); - event.preventDefault(); - this.delegate.linkClickIntercepted(event.target, event.detail.url); - } - } - delete this.clickEvent; - }); - this.willVisit = () => { - delete this.clickEvent; - }; - this.delegate = delegate; - this.element = element; - } - start() { - this.element.addEventListener("click", this.clickBubbled); - document.addEventListener("turbo:click", this.linkClicked); - document.addEventListener("turbo:before-visit", this.willVisit); - } - stop() { - this.element.removeEventListener("click", this.clickBubbled); - document.removeEventListener("turbo:click", this.linkClicked); - document.removeEventListener("turbo:before-visit", this.willVisit); - } - respondsToEventTarget(target) { - const element = target instanceof Element - ? target - : target instanceof Node - ? target.parentElement - : null; - return element && element.closest("turbo-frame, html") == this.element; - } -} - -class Renderer { - constructor(currentSnapshot, newSnapshot, isPreview) { - this.currentSnapshot = currentSnapshot; - this.newSnapshot = newSnapshot; - this.isPreview = isPreview; - this.promise = new Promise((resolve, reject) => this.resolvingFunctions = { resolve, reject }); - } - get shouldRender() { - return true; - } - prepareToRender() { - return; - } - finishRendering() { - if (this.resolvingFunctions) { - this.resolvingFunctions.resolve(); - delete this.resolvingFunctions; - } - } - createScriptElement(element) { - if (element.getAttribute("data-turbo-eval") == "false") { - return element; - } - else { - const createdScriptElement = document.createElement("script"); - createdScriptElement.textContent = element.textContent; - createdScriptElement.async = false; - copyElementAttributes(createdScriptElement, element); - return createdScriptElement; - } - } - preservingPermanentElements(callback) { - const placeholders = relocatePermanentElements(this.currentSnapshot, this.newSnapshot); - callback(); - replacePlaceholderElementsWithClonedPermanentElements(placeholders); - } - focusFirstAutofocusableElement() { - const element = this.newSnapshot.firstAutofocusableElement; - if (elementIsFocusable(element)) { - element.focus(); - } - } - get currentElement() { - return this.currentSnapshot.element; - } - get newElement() { - return this.newSnapshot.element; - } -} -function replaceElementWithElement(fromElement, toElement) { - const parentElement = fromElement.parentElement; - if (parentElement) { - return parentElement.replaceChild(toElement, fromElement); - } -} -function copyElementAttributes(destinationElement, sourceElement) { - for (const { name, value } of [...sourceElement.attributes]) { - destinationElement.setAttribute(name, value); - } -} -function createPlaceholderForPermanentElement(permanentElement) { - const element = document.createElement("meta"); - element.setAttribute("name", "turbo-permanent-placeholder"); - element.setAttribute("content", permanentElement.id); - return { element, permanentElement }; -} -function replacePlaceholderElementsWithClonedPermanentElements(placeholders) { - for (const { element, permanentElement } of placeholders) { - const clonedElement = permanentElement.cloneNode(true); - replaceElementWithElement(element, clonedElement); - } -} -function relocatePermanentElements(currentSnapshot, newSnapshot) { - return currentSnapshot.getPermanentElementsPresentInSnapshot(newSnapshot).reduce((placeholders, permanentElement) => { - const newElement = newSnapshot.getPermanentElementById(permanentElement.id); - if (newElement) { - const placeholder = createPlaceholderForPermanentElement(permanentElement); - replaceElementWithElement(permanentElement, placeholder.element); - replaceElementWithElement(newElement, permanentElement); - return [...placeholders, placeholder]; - } - else { - return placeholders; - } - }, []); -} -function elementIsFocusable(element) { - return element && typeof element.focus == "function"; -} - -class FrameRenderer extends Renderer { - get shouldRender() { - return true; - } - async render() { - await nextAnimationFrame(); - this.preservingPermanentElements(() => { - this.loadFrameElement(); - }); - this.scrollFrameIntoView(); - await nextAnimationFrame(); - this.focusFirstAutofocusableElement(); - } - loadFrameElement() { - var _a; - const destinationRange = document.createRange(); - destinationRange.selectNodeContents(this.currentElement); - destinationRange.deleteContents(); - const frameElement = this.newElement; - const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange(); - if (sourceRange) { - sourceRange.selectNodeContents(frameElement); - this.currentElement.appendChild(sourceRange.extractContents()); - } - } - scrollFrameIntoView() { - if (this.currentElement.autoscroll || this.newElement.autoscroll) { - const element = this.currentElement.firstElementChild; - const block = readScrollLogicalPosition(this.currentElement.getAttribute("data-autoscroll-block"), "end"); - if (element) { - element.scrollIntoView({ block }); - return true; - } - } - return false; - } -} -function readScrollLogicalPosition(value, defaultValue) { - if (value == "end" || value == "start" || value == "center" || value == "nearest") { - return value; - } - else { - return defaultValue; - } -} - -class FrameController { - constructor(element) { - this.resolveVisitPromise = () => { }; - this.element = element; - this.view = new FrameView(this, this.element); - this.appearanceObserver = new AppearanceObserver(this, this.element); - this.linkInterceptor = new LinkInterceptor(this, this.element); - this.formInterceptor = new FormInterceptor(this, this.element); - } - connect() { - if (this.loadingStyle == FrameLoadingStyle.lazy) { - this.appearanceObserver.start(); - } - this.linkInterceptor.start(); - this.formInterceptor.start(); - } - disconnect() { - this.appearanceObserver.stop(); - this.linkInterceptor.stop(); - this.formInterceptor.stop(); - } - sourceURLChanged() { - if (this.loadingStyle == FrameLoadingStyle.eager) { - this.loadSourceURL(); - } - } - loadingStyleChanged() { - if (this.loadingStyle == FrameLoadingStyle.lazy) { - this.appearanceObserver.start(); - } - else { - this.appearanceObserver.stop(); - this.loadSourceURL(); - } - } - async loadSourceURL() { - if (this.isActive && this.sourceURL && this.sourceURL != this.loadingURL) { - try { - this.loadingURL = this.sourceURL; - this.element.loaded = this.visit(this.sourceURL); - this.appearanceObserver.stop(); - await this.element.loaded; - } - finally { - delete this.loadingURL; - } - } - } - async loadResponse(response) { - try { - const html = await response.responseHTML; - if (html) { - const { body } = parseHTMLDocument(html); - const snapshot = new Snapshot(await this.extractForeignFrameElement(body)); - const renderer = new FrameRenderer(this.view.snapshot, snapshot, false); - await this.view.render(renderer); - } - } - catch (error) { - console.error(error); - this.view.invalidate(); - } - } - elementAppearedInViewport(element) { - this.loadSourceURL(); - } - shouldInterceptLinkClick(element, url) { - return this.shouldInterceptNavigation(element); - } - linkClickIntercepted(element, url) { - this.navigateFrame(element, url); - } - shouldInterceptFormSubmission(element) { - return this.shouldInterceptNavigation(element); - } - formSubmissionIntercepted(element, submitter) { - if (this.formSubmission) { - this.formSubmission.stop(); - } - this.formSubmission = new FormSubmission(this, element, submitter); - if (this.formSubmission.fetchRequest.isIdempotent) { - this.navigateFrame(element, this.formSubmission.fetchRequest.url.href); - } - else { - this.formSubmission.start(); - } - } - prepareHeadersForRequest(headers, request) { - headers["Turbo-Frame"] = this.id; - } - requestStarted(request) { - this.element.setAttribute("busy", ""); - } - requestPreventedHandlingResponse(request, response) { - this.resolveVisitPromise(); - } - async requestSucceededWithResponse(request, response) { - await this.loadResponse(response); - this.resolveVisitPromise(); - } - requestFailedWithResponse(request, response) { - console.error(response); - this.resolveVisitPromise(); - } - requestErrored(request, error) { - console.error(error); - this.resolveVisitPromise(); - } - requestFinished(request) { - this.element.removeAttribute("busy"); - } - formSubmissionStarted(formSubmission) { - } - formSubmissionSucceededWithResponse(formSubmission, response) { - const frame = this.findFrameElement(formSubmission.formElement); - frame.delegate.loadResponse(response); - } - formSubmissionFailedWithResponse(formSubmission, fetchResponse) { - this.element.delegate.loadResponse(fetchResponse); - } - formSubmissionErrored(formSubmission, error) { - } - formSubmissionFinished(formSubmission) { - } - viewWillRenderSnapshot(snapshot, isPreview) { - } - viewRenderedSnapshot(snapshot, isPreview) { - } - viewInvalidated() { - } - async visit(url) { - const request = new FetchRequest(this, FetchMethod.get, expandURL(url)); - return new Promise(resolve => { - this.resolveVisitPromise = () => { - this.resolveVisitPromise = () => { }; - resolve(); - }; - request.perform(); - }); - } - navigateFrame(element, url) { - const frame = this.findFrameElement(element); - frame.src = url; - } - findFrameElement(element) { - var _a; - const id = element.getAttribute("data-turbo-frame") || this.element.getAttribute("target"); - return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element; - } - async extractForeignFrameElement(container) { - let element; - const id = CSS.escape(this.id); - if (element = activateElement(container.querySelector(`turbo-frame#${id}`))) { - return element; - } - if (element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`))) { - await element.loaded; - return await this.extractForeignFrameElement(element); - } - console.error(`Response has no matching element`); - return new FrameElement(); - } - shouldInterceptNavigation(element) { - const id = element.getAttribute("data-turbo-frame") || this.element.getAttribute("target"); - if (!this.enabled || id == "_top") { - return false; - } - if (id) { - const frameElement = getFrameElementById(id); - if (frameElement) { - return !frameElement.disabled; - } - } - return true; - } - get id() { - return this.element.id; - } - get enabled() { - return !this.element.disabled; - } - get sourceURL() { - return this.element.src; - } - get loadingStyle() { - return this.element.loading; - } - get isLoading() { - return this.formSubmission !== undefined || this.loadingURL !== undefined; - } - get isActive() { - return this.element.isActive; - } -} -function getFrameElementById(id) { - if (id != null) { - const element = document.getElementById(id); - if (element instanceof FrameElement) { - return element; - } - } -} -function activateElement(element) { - if (element && element.ownerDocument !== document) { - element = document.importNode(element, true); - } - if (element instanceof FrameElement) { - return element; - } -} - -const StreamActions = { - append() { - var _a; - (_a = this.targetElement) === null || _a === void 0 ? void 0 : _a.append(this.templateContent); - }, - prepend() { - var _a; - (_a = this.targetElement) === null || _a === void 0 ? void 0 : _a.prepend(this.templateContent); - }, - remove() { - var _a; - (_a = this.targetElement) === null || _a === void 0 ? void 0 : _a.remove(); - }, - replace() { - var _a; - (_a = this.targetElement) === null || _a === void 0 ? void 0 : _a.replaceWith(this.templateContent); - }, - update() { - if (this.targetElement) { - this.targetElement.innerHTML = ""; - this.targetElement.append(this.templateContent); - } - } -}; - -class StreamElement extends HTMLElement { - async connectedCallback() { - try { - await this.render(); - } - catch (error) { - console.error(error); - } - finally { - this.disconnect(); - } - } - async render() { - var _a; - return (_a = this.renderPromise) !== null && _a !== void 0 ? _a : (this.renderPromise = (async () => { - if (this.dispatchEvent(this.beforeRenderEvent)) { - await nextAnimationFrame(); - this.performAction(); - } - })()); - } - disconnect() { - try { - this.remove(); - } - catch (_a) { } - } - get performAction() { - if (this.action) { - const actionFunction = StreamActions[this.action]; - if (actionFunction) { - return actionFunction; - } - this.raise("unknown action"); - } - this.raise("action attribute is missing"); - } - get targetElement() { - var _a; - if (this.target) { - return (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.getElementById(this.target); - } - this.raise("target attribute is missing"); - } - get templateContent() { - return this.templateElement.content; - } - get templateElement() { - if (this.firstElementChild instanceof HTMLTemplateElement) { - return this.firstElementChild; - } - this.raise("first child element must be a