From 409918b304e4596908ac0e15885114f3f0c047b7 Mon Sep 17 00:00:00 2001 From: ildyria Date: Tue, 15 Oct 2024 18:38:25 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20LycheeOr?= =?UTF-8?q?g/LycheeOrg.github.io@019d7669afb517443a7fa3262ee1a799c51b18c2?= =?UTF-8?q?=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2024-06-25-performance-problems/index.html | 2 +- 2024-06-29-future-of-lychee/index.html | 2 +- 2024-07-02-v6-landing-page/index.html | 2 +- 2024-07-06-v6-about/index.html | 2 +- 2024-07-07-v6-gallery-1/index.html | 2 +- 2024-07-09-v6-gallery-2/index.html | 2 +- 2024-07-12-v6-gallery-3/index.html | 2 +- 2024-07-13-v6-gallery-4/index.html | 2 +- 2024-07-16-v6-album-1/index.html | 2 +- 2024-07-17-v6-album-2/index.html | 2 +- 2024-07-18-v6-tests-1/index.html | 2 +- 2024-07-21-v6-tests-2/index.html | 2 +- 2024-07-23-v6-tests-3/index.html | 2 +- 2024-07-24-v6-profile-1/index.html | 2 +- 2024-07-26-v6-profile-2/index.html | 2 +- 2024-07-28-v6-settings-1/index.html | 2 +- 2024-07-29-v6-settings-2/index.html | 2 +- 2024-07-30-v6-settings-3/index.html | 2 +- 2024-08-02-v6-settings-4/index.html | 2 +- 2024-08-03-v6-users/index.html | 2 +- 2024-08-04-v6-diagnostics/index.html | 2 +- 2024-08-05-v6-jobs/index.html | 2 +- 2024-08-08-v6-maintenance/index.html | 2 +- 2024-08-09-v6-light-mode/index.html | 2 +- 2024-08-10-v6-move-album-panel/index.html | 2 +- 2024-08-11-v6-transfer-album-panel/index.html | 2 +- 2024-08-14-v6-share-album-panel/index.html | 2 +- 2024-08-17-v6-upload-dialog/index.html | 2 +- 2024-08-18-v6-upload-dialog/index.html | 2 +- 2024-08-27-v6-edit-photo/index.html | 2 +- 2024-08-31-v6-help/index.html | 2 +- 2024-09-14-v6-settings/index.html | 2 +- 2024-09-15-v6-menus/index.html | 2 +- 2024-09-23-v6-multiple/index.html | 2 +- 2024-09-24-v6-frame/index.html | 2 +- 2024-09-24-v6-oauth/index.html | 2 +- 2024-09-24-v6-scramble/index.html | 4 ++-- 2024-09-25-v6-map/index.html | 2 +- 2024-09-29-v6-alpha/index.html | 2 +- 2024-09-30-v6-header/index.html | 2 +- 2024-10-05-v6-beta/index.html | 2 +- 2024-10-07-v6-beta2/index.html | 2 +- 2024-10-14-v6-beta3/index.html | 1 + 404.html | 2 +- assets/license.CTUg88x-.css | 1 - assets/license.DLZnnSui.css | 1 + blog/2/index.html | 2 +- blog/3/index.html | 2 +- blog/4/index.html | 2 +- blog/5/index.html | 2 +- blog/index.html | 2 +- category/active-development/2/index.html | 2 +- category/active-development/3/index.html | 2 +- category/active-development/4/index.html | 2 +- category/active-development/index.html | 2 +- category/api-documentation/index.html | 2 +- category/future/index.html | 2 +- category/livewire/index.html | 2 +- get-supporter-edition/index.html | 2 +- index.html | 2 +- license/index.html | 2 +- rss.xml | 2 +- sitemap-0.xml | 2 +- support/index.html | 2 +- tag/api/index.html | 2 +- tag/clockwork/index.html | 2 +- tag/documentation/index.html | 2 +- tag/front-end/index.html | 2 +- tag/hprof/index.html | 2 +- tag/livewire/index.html | 2 +- tag/lychee/2/index.html | 2 +- tag/lychee/3/index.html | 2 +- tag/lychee/4/index.html | 2 +- tag/lychee/5/index.html | 2 +- tag/lychee/index.html | 2 +- tag/scramble/index.html | 2 +- tag/v5/index.html | 2 +- tag/v6/2/index.html | 2 +- tag/v6/3/index.html | 2 +- tag/v6/4/index.html | 2 +- tag/v6/5/index.html | 2 +- tag/v6/index.html | 2 +- tag/vuejs/2/index.html | 2 +- tag/vuejs/3/index.html | 2 +- tag/vuejs/4/index.html | 2 +- tag/vuejs/5/index.html | 1 + tag/vuejs/index.html | 2 +- 87 files changed, 87 insertions(+), 85 deletions(-) create mode 100644 2024-10-14-v6-beta3/index.html delete mode 100644 assets/license.CTUg88x-.css create mode 100644 assets/license.DLZnnSui.css create mode 100644 tag/vuejs/5/index.html diff --git a/2024-06-25-performance-problems/index.html b/2024-06-25-performance-problems/index.html index b520e2e5..3eeda04a 100644 --- a/2024-06-25-performance-problems/index.html +++ b/2024-06-25-performance-problems/index.html @@ -1 +1 @@ -Lychee - Livewire performances problems 📉

· ildyria · Livewire  · 5 min read

Livewire performances problems 📉

A look back on Server-Side rendering performance with Livewire in Lychee v5.

A look back on Server-Side rendering performance with Livewire in Lychee v5.

On December 25th, we released Lychee version 5. This was the first major version bump since April 2020. This new version brings the latest and shiniest part of the laravel ecosystem: Livewire.

What is Livewire?

Livewire aims to bridge the gap between the front-end and the backend, with an ambitious message: “you no longer need to know JS to do front-end reactivity”.
The premise is appealing:

  • no more AJAX requests,
  • no more JS needed to build the DOM (like in Lychee v3 and v4),
  • no more DOM manipulation,
  • no more events to track,
  • only PHP (stronger type garantees),
  • re-using blade templates & Laravel components,
  • in place replacement with dom-diffing…
  • Single Page Application behaviour with url updates.

All this is done with this single library which takes care of keeping a cryptographically authenticated state, provide events annotation hooks on html elements and forward those calls to the Server, executing direclty php methods on the components.

So far soo good. It took me about 1.5 years to re-implement the front-end, added tests. We are ready to ship.

A sad reality: local development vs real life server performance.

When doing local development with Livewire, everything seems fast. The request are instantanuous, the reactivity is palpable. However, as soon as you are deploying on an external server, you are immediately faced with a harsh reality: Latency is a B**tch.

What is happening? Any action with behaviour is trigerring a call to the server. This round-trip instantly kills the fluidness previously seen. Everything is slow, opening menus are taking ages… Switching from one picture to another is terrible.

There is however a solution: AlpineJS. A small library to leaverage local interaction such as hover, opening menus etc to JavaScript and keep the rest with Server Round trip. One could say that Alpine is very close to VueJS in its design, to the point where the naming convension are similar: x-on instead of v-on, x-html instead of v-html, etc…

Using AlpineJS, I rewrote the photo navigation and editing part, I rewrote the layout (justified, masonry etc.) of the pictures in albums. Finally Lychee v5 was getting usable.

A N + 1 query blade for-loop.

We got report from our users that when using a large number of albums and sub-albums, Lychee was getting slower beyond what would be acceptable. We pop back debug mod with the trusted debug bar and have a look at what is going on.

354 SQL queries with 348 duplicates

What do we see? Server takes 2,43 seconds to respond and for 45 sub-albums we have 354 SQL statement executed with 348 of them being duplicates. There is no doubt, we have a N+1 problem.

After a few hours of debugging the culprit was found: the id of the thumb of the parent album [Parent] was being queried for every sub-album [child] in order to check whether the current sub album [child] was used to specify the facade of the album [Parent]. With a bit of caching, this went away quickly.

Similarly, the computation of the parent album [parent] access rights were done for every single [child] instance. This lead to another set of duplicated queries.

After a few updates and iterations, we got the following results.

33 SQL queries with 17 duplicates

33 Queries, with 17 duplicates. Good enough. At least that number is no longer related to the number of Sub-Albums, it is therefore a flat cost. We will bit the bullet for now…

Still slow: Serialization

Still after this being solved, reports kept coming that Lychee was still slow when opening albums with large number of pictures. In order to track down this issue, we can no longer use DebugBar, it is not precise enough. So we turn ourselves to ClockWork, a powerful request analyzer.

Clockwork vue

This is a request opening an album with 700 pictures. No sub-albums, just a collection of photos. Without XDebug enabled (it usually produces a 20x slowdown), it takes 3 seconds for the server to produce the data, and render the page. What is going on?

Scrolling down we see the following waterfal. In Red are the SQL queries, in pruple the rendering of the components. Clockwork serialization

It is obvious that the roadblock is not dues to SQL queries: 2876ms are spent in the app, while 162m are spent waiting for the database. What is happening in that purple part? Simple, data are being serialzied to be sent to the front-end. Do note that we already did optimize our communcation between the server and the front-end:

  • we only send the minimum amount of data to needed to be displayed.
  • we only use the id of the models, all the other information are kept serverside. This has two benefits, it prevents exposing uncontrolled data (e.g. password field not in the $hidden attribute of a model will be displayed by the toArray() which is used by default by Laravel to serialize models. ).
  • Serialization with toArray() breaks in our case due to the recursive nature of the Parent-Child relationship in albums.

As a result, it is pretty clear that at least 75% of those 2876 ms are mostly spent on serialization of data. This is assumption is also quickly verified: by setting LIVEWIRE_ENABLED=false in your .env, you are reverting back to the front-end of Version 4. The results are immediate. The speed kicks in and Lychee feels snappier.

We dig a little more in the serialization problem with Laravel xprof profiler, because maybe there are some quick gains.

Hprof

The most expensive function calls are the transformation of Models from the SQL query row into their respective object. This is not specially surprising. However when looking at the following parts, we notice something suprising.

Hprof1

Hprof2

Hprof3

The Carbon object is initialized every time, and a lot of time is spent in finding on which timezone the server is running…

Conclusion

On this note, it becomes pretty obvious that for Lychee, Livewire and Server Side Rendering are not a good option. We tried to follow the hype and be at the bleeding edge of technology. While those ideas are appealing at first, they became quickly a nightmare to optimize and diagnose.

To know what is coming next, read the our next post here.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Livewire performances problems 📉

· ildyria · Livewire  · 5 min read

Livewire performances problems 📉

A look back on Server-Side rendering performance with Livewire in Lychee v5.

A look back on Server-Side rendering performance with Livewire in Lychee v5.

On December 25th, we released Lychee version 5. This was the first major version bump since April 2020. This new version brings the latest and shiniest part of the laravel ecosystem: Livewire.

What is Livewire?

Livewire aims to bridge the gap between the front-end and the backend, with an ambitious message: “you no longer need to know JS to do front-end reactivity”.
The premise is appealing:

  • no more AJAX requests,
  • no more JS needed to build the DOM (like in Lychee v3 and v4),
  • no more DOM manipulation,
  • no more events to track,
  • only PHP (stronger type garantees),
  • re-using blade templates & Laravel components,
  • in place replacement with dom-diffing…
  • Single Page Application behaviour with url updates.

All this is done with this single library which takes care of keeping a cryptographically authenticated state, provide events annotation hooks on html elements and forward those calls to the Server, executing direclty php methods on the components.

So far soo good. It took me about 1.5 years to re-implement the front-end, added tests. We are ready to ship.

A sad reality: local development vs real life server performance.

When doing local development with Livewire, everything seems fast. The request are instantanuous, the reactivity is palpable. However, as soon as you are deploying on an external server, you are immediately faced with a harsh reality: Latency is a B**tch.

What is happening? Any action with behaviour is trigerring a call to the server. This round-trip instantly kills the fluidness previously seen. Everything is slow, opening menus are taking ages… Switching from one picture to another is terrible.

There is however a solution: AlpineJS. A small library to leaverage local interaction such as hover, opening menus etc to JavaScript and keep the rest with Server Round trip. One could say that Alpine is very close to VueJS in its design, to the point where the naming convension are similar: x-on instead of v-on, x-html instead of v-html, etc…

Using AlpineJS, I rewrote the photo navigation and editing part, I rewrote the layout (justified, masonry etc.) of the pictures in albums. Finally Lychee v5 was getting usable.

A N + 1 query blade for-loop.

We got report from our users that when using a large number of albums and sub-albums, Lychee was getting slower beyond what would be acceptable. We pop back debug mod with the trusted debug bar and have a look at what is going on.

354 SQL queries with 348 duplicates

What do we see? Server takes 2,43 seconds to respond and for 45 sub-albums we have 354 SQL statement executed with 348 of them being duplicates. There is no doubt, we have a N+1 problem.

After a few hours of debugging the culprit was found: the id of the thumb of the parent album [Parent] was being queried for every sub-album [child] in order to check whether the current sub album [child] was used to specify the facade of the album [Parent]. With a bit of caching, this went away quickly.

Similarly, the computation of the parent album [parent] access rights were done for every single [child] instance. This lead to another set of duplicated queries.

After a few updates and iterations, we got the following results.

33 SQL queries with 17 duplicates

33 Queries, with 17 duplicates. Good enough. At least that number is no longer related to the number of Sub-Albums, it is therefore a flat cost. We will bit the bullet for now…

Still slow: Serialization

Still after this being solved, reports kept coming that Lychee was still slow when opening albums with large number of pictures. In order to track down this issue, we can no longer use DebugBar, it is not precise enough. So we turn ourselves to ClockWork, a powerful request analyzer.

Clockwork vue

This is a request opening an album with 700 pictures. No sub-albums, just a collection of photos. Without XDebug enabled (it usually produces a 20x slowdown), it takes 3 seconds for the server to produce the data, and render the page. What is going on?

Scrolling down we see the following waterfal. In Red are the SQL queries, in pruple the rendering of the components. Clockwork serialization

It is obvious that the roadblock is not dues to SQL queries: 2876ms are spent in the app, while 162m are spent waiting for the database. What is happening in that purple part? Simple, data are being serialzied to be sent to the front-end. Do note that we already did optimize our communcation between the server and the front-end:

  • we only send the minimum amount of data to needed to be displayed.
  • we only use the id of the models, all the other information are kept serverside. This has two benefits, it prevents exposing uncontrolled data (e.g. password field not in the $hidden attribute of a model will be displayed by the toArray() which is used by default by Laravel to serialize models. ).
  • Serialization with toArray() breaks in our case due to the recursive nature of the Parent-Child relationship in albums.

As a result, it is pretty clear that at least 75% of those 2876 ms are mostly spent on serialization of data. This is assumption is also quickly verified: by setting LIVEWIRE_ENABLED=false in your .env, you are reverting back to the front-end of Version 4. The results are immediate. The speed kicks in and Lychee feels snappier.

We dig a little more in the serialization problem with Laravel xprof profiler, because maybe there are some quick gains.

Hprof

The most expensive function calls are the transformation of Models from the SQL query row into their respective object. This is not specially surprising. However when looking at the following parts, we notice something suprising.

Hprof1

Hprof2

Hprof3

The Carbon object is initialized every time, and a lot of time is spent in finding on which timezone the server is running…

Conclusion

On this note, it becomes pretty obvious that for Lychee, Livewire and Server Side Rendering are not a good option. We tried to follow the hype and be at the bleeding edge of technology. While those ideas are appealing at first, they became quickly a nightmare to optimize and diagnose.

To know what is coming next, read the our next post here.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-06-29-future-of-lychee/index.html b/2024-06-29-future-of-lychee/index.html index bc3ac67d..98f58e8c 100644 --- a/2024-06-29-future-of-lychee/index.html +++ b/2024-06-29-future-of-lychee/index.html @@ -1 +1 @@ -Lychee - The future of Lychee: what is coming next. 🚀

· ildyria · Future  · 3 min read

The future of Lychee: what is coming next. 🚀

What is coming for Lychee? Where are we? What are we looking forward to?

What is coming for Lychee? Where are we? What are we looking forward to?

cross posted here on GitHub Discussion

Hi everyone,

The problem. 💢

After having worked on Lychee and the Livewire migration for the past 3 years, and having it battle tested over the last 6 months (version 5 till version 5.5). It is obvious that this was not a good decision. While Livewire is a nice concept by Caleb, it is not applicable in our case. The rendering times are just too long. Loading an album with 700+ pictures is just too heavy computationally wise.

What does this means for now? 🤔

I am starting to work on Lychee v6. Yes already… I made the decision to rewrite the front-end once again. This time I will be working with Vue3. It is one of the industry standard and should make the interaction with the server faster.

Have all those years spent on doing this “vanilla-JS-to-Livewire” conversion gone to waste? No.
While I did this conversion I also migrated the front-end to tailwind css, all this will be reused in with Vue. I am also planning to make use of PrimeVue to simplify some of the logic (e.g. modals, menus). Part of the current front-end are also making use of AlpineJS, so more code that can be reused there.

The compilation step will stay the same: composer & npm with vite. Just the front-end will change.

About backward compatibility. 🚫

When I did the migration v4-v5, I made the Livewire front-end optional, giving the ability to users to disable this behavior. With v6, I do not plan to do the same, this involves too much complexity to keep v4 front-end (vanila), v5 front-end (livewire) and v6 (vue). As a consequence on v6, there will be only one front-end: Vue (and possibly legacy legacy vanilla, but unlikely).

As this is a major version bump, do not expect the API to stay the same. I will try to preserve some backward compatibility in most of the calls, but some other may change (e.g. uploading to support chunks).

That being said, the migration from v5 to v6 should be as easy if not simpler than the one from v4 to v5. Expect your familiar lychee look and feel, just a different javascript front-end.

When will the v6 be available ? ⏩

It is very difficult to say, as I am not really able to estimate the amount of work to be done. My free time is quite limited between work, all the sport practice, the lady and doing photography (the main reason why I maintain this project). So please be patient (sorry).

Support and the team. 🦸

At the moment, only @d7415 and I (@ildyria) are maintaining Lychee, @d7415 doing most of the review work while I am working on fixing the bugs & trying to provide improvements. We aim to maintain this free open-source photography library with high quality of code.

If you feel like helping us, don’t hesitate to join us on discord or gitter.

If you are using Lychee, a small token of gratitude will go a long way. You can support further development (and bug fixes!) of Lychee on opencollective or on GitHub.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - The future of Lychee: what is coming next. 🚀

· ildyria · Future  · 3 min read

The future of Lychee: what is coming next. 🚀

What is coming for Lychee? Where are we? What are we looking forward to?

What is coming for Lychee? Where are we? What are we looking forward to?

cross posted here on GitHub Discussion

Hi everyone,

The problem. 💢

After having worked on Lychee and the Livewire migration for the past 3 years, and having it battle tested over the last 6 months (version 5 till version 5.5). It is obvious that this was not a good decision. While Livewire is a nice concept by Caleb, it is not applicable in our case. The rendering times are just too long. Loading an album with 700+ pictures is just too heavy computationally wise.

What does this means for now? 🤔

I am starting to work on Lychee v6. Yes already… I made the decision to rewrite the front-end once again. This time I will be working with Vue3. It is one of the industry standard and should make the interaction with the server faster.

Have all those years spent on doing this “vanilla-JS-to-Livewire” conversion gone to waste? No.
While I did this conversion I also migrated the front-end to tailwind css, all this will be reused in with Vue. I am also planning to make use of PrimeVue to simplify some of the logic (e.g. modals, menus). Part of the current front-end are also making use of AlpineJS, so more code that can be reused there.

The compilation step will stay the same: composer & npm with vite. Just the front-end will change.

About backward compatibility. 🚫

When I did the migration v4-v5, I made the Livewire front-end optional, giving the ability to users to disable this behavior. With v6, I do not plan to do the same, this involves too much complexity to keep v4 front-end (vanila), v5 front-end (livewire) and v6 (vue). As a consequence on v6, there will be only one front-end: Vue (and possibly legacy legacy vanilla, but unlikely).

As this is a major version bump, do not expect the API to stay the same. I will try to preserve some backward compatibility in most of the calls, but some other may change (e.g. uploading to support chunks).

That being said, the migration from v5 to v6 should be as easy if not simpler than the one from v4 to v5. Expect your familiar lychee look and feel, just a different javascript front-end.

When will the v6 be available ? ⏩

It is very difficult to say, as I am not really able to estimate the amount of work to be done. My free time is quite limited between work, all the sport practice, the lady and doing photography (the main reason why I maintain this project). So please be patient (sorry).

Support and the team. 🦸

At the moment, only @d7415 and I (@ildyria) are maintaining Lychee, @d7415 doing most of the review work while I am working on fixing the bugs & trying to provide improvements. We aim to maintain this free open-source photography library with high quality of code.

If you feel like helping us, don’t hesitate to join us on discord or gitter.

If you are using Lychee, a small token of gratitude will go a long way. You can support further development (and bug fixes!) of Lychee on opencollective or on GitHub.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-02-v6-landing-page/index.html b/2024-07-02-v6-landing-page/index.html index c47a1c99..460227a5 100644 --- a/2024-07-02-v6-landing-page/index.html +++ b/2024-07-02-v6-landing-page/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Landing page and left menu

· ildyria · Active Development  · 1 min read

Bite-size v6: Landing page and left menu

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

This is the first post of our series. After setting up everything for VueJs, I finally have the landing page working again. That conversion was pretty straight forward, copy the livewire html into the Vue component and ship it.

We now turn attention to the gallery. Rather that translating the Livewire components and keeping the html and css, we choose a different approach, migrate to a battle tested suite of components: PrimeVue.

Why did we make that decision:

  • No implementation of the reactivity is needed.
  • Components templates already mostly set-up
  • Unified and consistent styling accross all elements, only need to customize little parts.
  • PrimeVue is compatible with tailwind, which means that some of the specific component styling done in Lychee v5 can be easilly transported to the version 6.

Login modal is done (but no server interaction is applied yet). Login modal

And similarly a quick draft of the left menu is executed. landing page

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Landing page and left menu

· ildyria · Active Development  · 1 min read

Bite-size v6: Landing page and left menu

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

This is the first post of our series. After setting up everything for VueJs, I finally have the landing page working again. That conversion was pretty straight forward, copy the livewire html into the Vue component and ship it.

We now turn attention to the gallery. Rather that translating the Livewire components and keeping the html and css, we choose a different approach, migrate to a battle tested suite of components: PrimeVue.

Why did we make that decision:

  • No implementation of the reactivity is needed.
  • Components templates already mostly set-up
  • Unified and consistent styling accross all elements, only need to customize little parts.
  • PrimeVue is compatible with tailwind, which means that some of the specific component styling done in Lychee v5 can be easilly transported to the version 6.

Login modal is done (but no server interaction is applied yet). Login modal

And similarly a quick draft of the left menu is executed. landing page

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-06-v6-about/index.html b/2024-07-06-v6-about/index.html index 08749d29..b8e3fff7 100644 --- a/2024-07-06-v6-about/index.html +++ b/2024-07-06-v6-about/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: About and gallery

· ildyria · Active Development  · 1 min read

Bite-size v6: About and gallery

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After a bit of working, we get the About Lychee modal to work, and we shift our focus to displaying the albums in the gallery page (see below).

Using PrimeVue, we quickly draft header, navbar and panels. We do not pay attention to styling yet, so we are stuck with default white. At this point we are focusing on the squeleton to rather than the details.

Notice that all of them are stacked on top of each other? This is because tailwind css has not been applied yet. At least we can be sure that we are getting proper data from the backend. landing page

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: About and gallery

· ildyria · Active Development  · 1 min read

Bite-size v6: About and gallery

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After a bit of working, we get the About Lychee modal to work, and we shift our focus to displaying the albums in the gallery page (see below).

Using PrimeVue, we quickly draft header, navbar and panels. We do not pay attention to styling yet, so we are stuck with default white. At this point we are focusing on the squeleton to rather than the details.

Notice that all of them are stacked on top of each other? This is because tailwind css has not been applied yet. At least we can be sure that we are getting proper data from the backend. landing page

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-07-v6-gallery-1/index.html b/2024-07-07-v6-gallery-1/index.html index ab9e7334..7d9ab61f 100644 --- a/2024-07-07-v6-gallery-1/index.html +++ b/2024-07-07-v6-gallery-1/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: gallery - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Login is now working, and we fixed the display of albums: they are no longer stacked on top of each other.

Logged in

And after a few fixes, album navigation is working and we even get the thumbs to show up.

with thumbs

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: gallery - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Login is now working, and we fixed the display of albums: they are no longer stacked on top of each other.

Logged in

And after a few fixes, album navigation is working and we even get the thumbs to show up.

with thumbs

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-09-v6-gallery-2/index.html b/2024-07-09-v6-gallery-2/index.html index c67493be..ff14216b 100644 --- a/2024-07-09-v6-gallery-2/index.html +++ b/2024-07-09-v6-gallery-2/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: gallery - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Focusing on the squeleton is nice, but having some pictures is better. They are now visible in the albums. Still some styling needs to be done…

Also quick check on the speed, this is better than with Livewire. Noice. speed check

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: gallery - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Focusing on the squeleton is nice, but having some pictures is better. They are now visible in the albums. Still some styling needs to be done…

Also quick check on the speed, this is better than with Livewire. Noice. speed check

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-12-v6-gallery-3/index.html b/2024-07-12-v6-gallery-3/index.html index 64113db1..4f2fcee0 100644 --- a/2024-07-12-v6-gallery-3/index.html +++ b/2024-07-12-v6-gallery-3/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: gallery - 3

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 3

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the album vue, we create the photo view and start to add some styling back. Furthermore, most of the sharing options are back.

sharing

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: gallery - 3

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 3

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the album vue, we create the photo view and start to add some styling back. Furthermore, most of the sharing options are back.

sharing

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-13-v6-gallery-4/index.html b/2024-07-13-v6-gallery-4/index.html index 4abbeb2d..11b9ef38 100644 --- a/2024-07-13-v6-gallery-4/index.html +++ b/2024-07-13-v6-gallery-4/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: gallery - 4

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 4

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

The hero banner image is back again when available plus some styling of the layout buttons, panels etc. The description still needs to be fixed though…

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: gallery - 4

· ildyria · Active Development  · 1 min read

Bite-size v6: gallery - 4

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

The hero banner image is back again when available plus some styling of the layout buttons, panels etc. The description still needs to be fixed though…

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-16-v6-album-1/index.html b/2024-07-16-v6-album-1/index.html index 7723d031..99fb63b9 100644 --- a/2024-07-16-v6-album-1/index.html +++ b/2024-07-16-v6-album-1/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: album - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: album - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

First stap at editing the album properties. Nothing is working yet.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: album - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: album - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

First stap at editing the album properties. Nothing is working yet.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-17-v6-album-2/index.html b/2024-07-17-v6-album-2/index.html index 91974103..a183f331 100644 --- a/2024-07-17-v6-album-2/index.html +++ b/2024-07-17-v6-album-2/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: album - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: album - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

We finish stylizing the forms. We also start working on a light theme for Lychee… light theme

At that time, none of the other tabs are working (Move, Transfer, Delete, Share).

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: album - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: album - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

We finish stylizing the forms. We also start working on a light theme for Lychee… light theme

At that time, none of the other tabs are working (Move, Transfer, Delete, Share).

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-18-v6-tests-1/index.html b/2024-07-18-v6-tests-1/index.html index 46567882..fc91a4e8 100644 --- a/2024-07-18-v6-tests-1/index.html +++ b/2024-07-18-v6-tests-1/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: tests - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: tests - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

No visual updates. Currently working on adding tests.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: tests - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: tests - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

No visual updates. Currently working on adding tests.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-21-v6-tests-2/index.html b/2024-07-21-v6-tests-2/index.html index 46b6376e..7331bf10 100644 --- a/2024-07-21-v6-tests-2/index.html +++ b/2024-07-21-v6-tests-2/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: tests - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: tests - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

No visual updates. More tests… Refactoring the full request layer to support proper REST protocol (GET vs POST).

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: tests - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: tests - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

No visual updates. More tests… Refactoring the full request layer to support proper REST protocol (GET vs POST).

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-23-v6-tests-3/index.html b/2024-07-23-v6-tests-3/index.html index 5ff77c25..d9842606 100644 --- a/2024-07-23-v6-tests-3/index.html +++ b/2024-07-23-v6-tests-3/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: tests - 3

· ildyria · Active Development  · 1 min read

Bite-size v6: tests - 3

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Writting more tests…

  • Albums::get
  • Album::get ✅ (for both model and tag album)
  • Album::update
  • Album::updateTag

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: tests - 3

· ildyria · Active Development  · 1 min read

Bite-size v6: tests - 3

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Writting more tests…

  • Albums::get
  • Album::get ✅ (for both model and tag album)
  • Album::update
  • Album::updateTag

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-24-v6-profile-1/index.html b/2024-07-24-v6-profile-1/index.html index 1e1cc16f..d1b61f31 100644 --- a/2024-07-24-v6-profile-1/index.html +++ b/2024-07-24-v6-profile-1/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: profile - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: profile - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bit of progress on the Profile page.

  • Profile::updateLogin
  • Profile::setEmail
  • Profile::resetToken
  • Profile::unsetToken

UI coming soon.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: profile - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: profile - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bit of progress on the Profile page.

  • Profile::updateLogin
  • Profile::setEmail
  • Profile::resetToken
  • Profile::unsetToken

UI coming soon.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-26-v6-profile-2/index.html b/2024-07-26-v6-profile-2/index.html index 0dc06117..b45055c3 100644 --- a/2024-07-26-v6-profile-2/index.html +++ b/2024-07-26-v6-profile-2/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: profile - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: profile - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

And here is most of the UI of the Profile page. Still missing Oauth, email and 2FA.

token interface token interface token interface

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: profile - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: profile - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

And here is most of the UI of the Profile page. Still missing Oauth, email and 2FA.

token interface token interface token interface

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-28-v6-settings-1/index.html b/2024-07-28-v6-settings-1/index.html index bb178f5e..34eef368 100644 --- a/2024-07-28-v6-settings-1/index.html +++ b/2024-07-28-v6-settings-1/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: settings - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Some progress on the settings page using the accordion from PrimeVue. We also are going to be using tabs on top instead of having to go completely at the bottom of the page to click on More.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: settings - 1

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 1

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Some progress on the settings page using the accordion from PrimeVue. We also are going to be using tabs on top instead of having to go completely at the bottom of the page to click on More.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-29-v6-settings-2/index.html b/2024-07-29-v6-settings-2/index.html index 41e0d524..c1bbb2b4 100644 --- a/2024-07-29-v6-settings-2/index.html +++ b/2024-07-29-v6-settings-2/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: settings - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More work on the first tab (simple settings). Not of the buttons do anything, but it gives a nice skeleton to wire later.

settings settings

And also available in Dark mode. settings

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: settings - 2

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 2

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More work on the first tab (simple settings). Not of the buttons do anything, but it gives a nice skeleton to wire later.

settings settings

And also available in Dark mode. settings

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-07-30-v6-settings-3/index.html b/2024-07-30-v6-settings-3/index.html index 8d6b7f85..ec7f4dc8 100644 --- a/2024-07-30-v6-settings-3/index.html +++ b/2024-07-30-v6-settings-3/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: settings - 3

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 3

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Working on the More tabs. This time instead of having simple field text and the key names, we use directly the descriptions for the setting. Knowing the type of value expected, we also use toggles when boolean etc. settings

However, a some users prefers the old interface, it is available in a single toggle switch. settings

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: settings - 3

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 3

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Working on the More tabs. This time instead of having simple field text and the key names, we use directly the descriptions for the setting. Knowing the type of value expected, we also use toggles when boolean etc. settings

However, a some users prefers the old interface, it is available in a single toggle switch. settings

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-02-v6-settings-4/index.html b/2024-08-02-v6-settings-4/index.html index 0fd0b5ef..2a8a6b22 100644 --- a/2024-08-02-v6-settings-4/index.html +++ b/2024-08-02-v6-settings-4/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: settings - 4

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 4

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More work on the More tabs. We now display a warning that some changes have not been saved. When clicked on Save, a toast notification confirms that the data has been properly persisted. settings

We also add a warning for the version field. This one should not be edited as it will mess up with the migrations of the database. settings

We also added a small indicator of which field have been modified. Clicking on that indicator reset the field to its previous value. settings

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: settings - 4

· ildyria · Active Development  · 1 min read

Bite-size v6: settings - 4

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More work on the More tabs. We now display a warning that some changes have not been saved. When clicked on Save, a toast notification confirms that the data has been properly persisted. settings

We also add a warning for the version field. This one should not be edited as it will mess up with the migrations of the database. settings

We also added a small indicator of which field have been modified. Clicking on that indicator reset the field to its previous value. settings

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-03-v6-users/index.html b/2024-08-03-v6-users/index.html index 8dc48d07..2a62a8cb 100644 --- a/2024-08-03-v6-users/index.html +++ b/2024-08-03-v6-users/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: User management

· ildyria · Active Development  · 1 min read

Bite-size v6: User management

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the settings we now focus on User managment. We added the following endpoints, including tests:

  • /Users
  • /Users::save
  • /Users::delete
  • /Users::create

And the associated VueJS components for the front-end:

  • create user ✅
  • edit user ✅
  • delete user ✅

The page is now fully functional on laptops. users

And view in Mobile. The buttons are simplified for icons. users

And it also works fine in white. users

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: User management

· ildyria · Active Development  · 1 min read

Bite-size v6: User management

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the settings we now focus on User managment. We added the following endpoints, including tests:

  • /Users
  • /Users::save
  • /Users::delete
  • /Users::create

And the associated VueJS components for the front-end:

  • create user ✅
  • edit user ✅
  • delete user ✅

The page is now fully functional on laptops. users

And view in Mobile. The buttons are simplified for icons. users

And it also works fine in white. users

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-04-v6-diagnostics/index.html b/2024-08-04-v6-diagnostics/index.html index e7f286a0..0b817173 100644 --- a/2024-08-04-v6-diagnostics/index.html +++ b/2024-08-04-v6-diagnostics/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Diagnostics

· ildyria · Active Development  · 1 min read

Bite-size v6: Diagnostics

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

A bit of refactoring on the Profile page. Note that there is a change in behaviour:

  • for any changes, the old password is required. This is to ensure that the email address or the username are not changed by mistake.
  • username and email are now pre-filled.
  • This is a single API call instead of two as in v4 and v5.

profile

After that we focused on adding back a quite important page: the Diagnostics. All sections are there: Errors (also available when not logged in), Info, Space and Configuration. As usual, the button to request space usage, as this one tend to be pretty slow on some installations. Diagnostics

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Diagnostics

· ildyria · Active Development  · 1 min read

Bite-size v6: Diagnostics

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

A bit of refactoring on the Profile page. Note that there is a change in behaviour:

  • for any changes, the old password is required. This is to ensure that the email address or the username are not changed by mistake.
  • username and email are now pre-filled.
  • This is a single API call instead of two as in v4 and v5.

profile

After that we focused on adding back a quite important page: the Diagnostics. All sections are there: Errors (also available when not logged in), Info, Space and Configuration. As usual, the button to request space usage, as this one tend to be pretty slow on some installations. Diagnostics

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-05-v6-jobs/index.html b/2024-08-05-v6-jobs/index.html index dd96f4cb..79deef9b 100644 --- a/2024-08-05-v6-jobs/index.html +++ b/2024-08-05-v6-jobs/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Jobs

· ildyria · Active Development  · 1 min read

Bite-size v6: Jobs

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the diagnostics, we quickly fix the Job pages. We integrated pagination in the backend (but it is not exploited yet in the front-end. Maybe later, who knows.)

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Jobs

· ildyria · Active Development  · 1 min read

Bite-size v6: Jobs

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the diagnostics, we quickly fix the Job pages. We integrated pagination in the backend (but it is not exploited yet in the front-end. Maybe later, who knows.)

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-08-v6-maintenance/index.html b/2024-08-08-v6-maintenance/index.html index 66ac2376..628d8eae 100644 --- a/2024-08-08-v6-maintenance/index.html +++ b/2024-08-08-v6-maintenance/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Maintenance

· ildyria · Active Development  · 1 min read

Bite-size v6: Maintenance

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the Jobs listing page for history. We take care of the maintenance page. Like in the v5, it provides exactly the same functionalities.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Maintenance

· ildyria · Active Development  · 1 min read

Bite-size v6: Maintenance

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After the Jobs listing page for history. We take care of the maintenance page. Like in the v5, it provides exactly the same functionalities.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-09-v6-light-mode/index.html b/2024-08-09-v6-light-mode/index.html index e3acb920..4c8b2b46 100644 --- a/2024-08-09-v6-light-mode/index.html +++ b/2024-08-09-v6-light-mode/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Light mode

· ildyria · Active Development  · 1 min read

Bite-size v6: Light mode

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Yes, it is here. There is now a toggle switch in the settings which will enable light mode (note that you will need to refresh for the changes to take effect.)

Aside from the the selection of language is also fixed (it was missing from the settings).

delete And as seen above, I also fixed the deletion via the panel in the Album view. More to come…

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Light mode

· ildyria · Active Development  · 1 min read

Bite-size v6: Light mode

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Yes, it is here. There is now a toggle switch in the settings which will enable light mode (note that you will need to refresh for the changes to take effect.)

Aside from the the selection of language is also fixed (it was missing from the settings).

delete And as seen above, I also fixed the deletion via the panel in the Album view. More to come…

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-10-v6-move-album-panel/index.html b/2024-08-10-v6-move-album-panel/index.html index 43b454ef..f5baf54b 100644 --- a/2024-08-10-v6-move-album-panel/index.html +++ b/2024-08-10-v6-move-album-panel/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Move Album panel

· ildyria · Active Development  · 1 min read

Bite-size v6: Move Album panel

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

The panel to move albums has been implemented. Just like in version 5, drop-down with search to select the destination. Once selected a confirmation message appears. confirm

And on completion of the action a small toast confirms the execution. toast

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Move Album panel

· ildyria · Active Development  · 1 min read

Bite-size v6: Move Album panel

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

The panel to move albums has been implemented. Just like in version 5, drop-down with search to select the destination. Once selected a confirmation message appears. confirm

And on completion of the action a small toast confirms the execution. toast

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-11-v6-transfer-album-panel/index.html b/2024-08-11-v6-transfer-album-panel/index.html index 276bde0d..a96c510b 100644 --- a/2024-08-11-v6-transfer-album-panel/index.html +++ b/2024-08-11-v6-transfer-album-panel/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Transfer Album panel

· ildyria · Active Development  · 1 min read

Bite-size v6: Transfer Album panel

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After moving albums from one to another, we add back the functionality that came with the v5: Transfering albums ownership. We ask to select a user

Selection of user

And we do request confirmation (in case you made a mistake in the user selection).

Confirm

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Transfer Album panel

· ildyria · Active Development  · 1 min read

Bite-size v6: Transfer Album panel

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After moving albums from one to another, we add back the functionality that came with the v5: Transfering albums ownership. We ask to select a user

Selection of user

And we do request confirmation (in case you made a mistake in the user selection).

Confirm

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-14-v6-share-album-panel/index.html b/2024-08-14-v6-share-album-panel/index.html index 5f1fd8f8..21a8a736 100644 --- a/2024-08-14-v6-share-album-panel/index.html +++ b/2024-08-14-v6-share-album-panel/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Share Album panel

· ildyria · Active Development  · 1 min read

Bite-size v6: Share Album panel

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After transfering albums to another user, we add back another functionality that came with the v5: Sharing albums with extended right access.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Share Album panel

· ildyria · Active Development  · 1 min read

Bite-size v6: Share Album panel

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After transfering albums to another user, we add back another functionality that came with the v5: Sharing albums with extended right access.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-17-v6-upload-dialog/index.html b/2024-08-17-v6-upload-dialog/index.html index 106ccadf..4d32ba9f 100644 --- a/2024-08-17-v6-upload-dialog/index.html +++ b/2024-08-17-v6-upload-dialog/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Upload dialog

· ildyria · Active Development  · 1 min read

Bite-size v6: Upload dialog

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Now that most of the ground work has been built, we focus on the smaller details. We add back what all gallery should have: the uploader. And just like in the version 5 it supports chunk upload and parallel processing.

Once completed the list stays open (for now).

A nice improvement that could be added later: cancelling an upload. But there are more pressing matters.

Also added the menu in the top right to access the usual creations options.

What is left to be done before we start having a viable prototype? Still quite a bit see the list below.

  • Create/Move/Merge/Delete albums via context menu
  • Copy/Delete/Star etc. photo via context menu
  • Editing picture informations
  • Frame/Slideshow view
  • Map view
  • U2F
  • Oauth
  • All existing key bindings
  • Sharing summary page (nice to have).

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Upload dialog

· ildyria · Active Development  · 1 min read

Bite-size v6: Upload dialog

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Now that most of the ground work has been built, we focus on the smaller details. We add back what all gallery should have: the uploader. And just like in the version 5 it supports chunk upload and parallel processing.

Once completed the list stays open (for now).

A nice improvement that could be added later: cancelling an upload. But there are more pressing matters.

Also added the menu in the top right to access the usual creations options.

What is left to be done before we start having a viable prototype? Still quite a bit see the list below.

  • Create/Move/Merge/Delete albums via context menu
  • Copy/Delete/Star etc. photo via context menu
  • Editing picture informations
  • Frame/Slideshow view
  • Map view
  • U2F
  • Oauth
  • All existing key bindings
  • Sharing summary page (nice to have).

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-18-v6-upload-dialog/index.html b/2024-08-18-v6-upload-dialog/index.html index a1d19600..bbce9b29 100644 --- a/2024-08-18-v6-upload-dialog/index.html +++ b/2024-08-18-v6-upload-dialog/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Link in Landing and Server Import

· ildyria · Active Development  · 1 min read

Bite-size v6: Link in Landing and Server Import

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

One of the complaints we got a few times was that the Gallery link in top right was not so visible. We now also provide a big link in the middle of the page with a subtle tripple arrow annimation to catch the eye with movement. Hopefully this resolves some of the requests.

As it was disabled in version 5, import from server is not coming back in version 6. Sorry. Still in order to avoid questions “where did this go?” etc, we provide a kind reminder to the user that the functionality is no more.

I am currently working on the dialogs to create Albums.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Link in Landing and Server Import

· ildyria · Active Development  · 1 min read

Bite-size v6: Link in Landing and Server Import

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

One of the complaints we got a few times was that the Gallery link in top right was not so visible. We now also provide a big link in the middle of the page with a subtle tripple arrow annimation to catch the eye with movement. Hopefully this resolves some of the requests.

As it was disabled in version 5, import from server is not coming back in version 6. Sorry. Still in order to avoid questions “where did this go?” etc, we provide a kind reminder to the user that the functionality is no more.

I am currently working on the dialogs to create Albums.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-27-v6-edit-photo/index.html b/2024-08-27-v6-edit-photo/index.html index 4b36b915..a2c3f78b 100644 --- a/2024-08-27-v6-edit-photo/index.html +++ b/2024-08-27-v6-edit-photo/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Edit photos

· ildyria · Active Development  · 1 min read

Bite-size v6: Edit photos

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After taking some time off for personal reasons and some fixing minor bugs, I finally added the endpoint to edit pictures. As opposed to the version 4, this one will have a single API endpoint to edit all parameters. I still need to add the ability to edit some of the exif data.

On the not-so-great news, I decided to drop the support of dedoc/scramble. No more dedoc/scramble It was used in the version 4 to provide easy API documentation. Unfortunately, scramble fails at the following:

  • proper software design respecting SOLID architecture (refusal to have proper design with interface and uses reflections instead to check if some methods are available).
  • lack of static analysis such as Phpstan.

Furthermore, with version 6 we are now using Spatie Data. This allows us to generate typescripts definitions from those objects, and thus ensuring stronger type compatibility between front-end and back-end. Unfortunately Spatie Data is only supported in the pro version of Scramble, we respect the decision of romalytvynenko and remove it as we are no longer able to use it anymore.

Thoughts on how to document the API in an automated way are welcome.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Edit photos

· ildyria · Active Development  · 1 min read

Bite-size v6: Edit photos

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After taking some time off for personal reasons and some fixing minor bugs, I finally added the endpoint to edit pictures. As opposed to the version 4, this one will have a single API endpoint to edit all parameters. I still need to add the ability to edit some of the exif data.

On the not-so-great news, I decided to drop the support of dedoc/scramble. No more dedoc/scramble It was used in the version 4 to provide easy API documentation. Unfortunately, scramble fails at the following:

  • proper software design respecting SOLID architecture (refusal to have proper design with interface and uses reflections instead to check if some methods are available).
  • lack of static analysis such as Phpstan.

Furthermore, with version 6 we are now using Spatie Data. This allows us to generate typescripts definitions from those objects, and thus ensuring stronger type compatibility between front-end and back-end. Unfortunately Spatie Data is only supported in the pro version of Scramble, we respect the decision of romalytvynenko and remove it as we are no longer able to use it anymore.

Thoughts on how to document the API in an automated way are welcome.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-08-31-v6-help/index.html b/2024-08-31-v6-help/index.html index cf33c231..fd4742ae 100644 --- a/2024-08-31-v6-help/index.html +++ b/2024-08-31-v6-help/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Keybindings help

· ildyria · Active Development  · 1 min read

Bite-size v6: Keybindings help

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

When you login, you will now be presented with this pop up giving you the keybindings tips. We added a small checkbox at the bottom so this pop up can be made hidden forever easilly.

Additionally, we added a help button in the top right of the gallery page. Clicking on this will open the help keybind. keybind help button

When not logged in, just like in version 5, it is now possible to have a customizable back to… button. login left, home right This button will switch place with the login button if the setting of the position of login is set to the right instead of the default left. login right, home left

The overlay on the picture is also back, rotating between none, description, date, and exif data. The setting is persisted accross the page. Photo overlay

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Keybindings help

· ildyria · Active Development  · 1 min read

Bite-size v6: Keybindings help

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

When you login, you will now be presented with this pop up giving you the keybindings tips. We added a small checkbox at the bottom so this pop up can be made hidden forever easilly.

Additionally, we added a help button in the top right of the gallery page. Clicking on this will open the help keybind. keybind help button

When not logged in, just like in version 5, it is now possible to have a customizable back to… button. login left, home right This button will switch place with the login button if the setting of the position of login is set to the right instead of the default left. login right, home left

The overlay on the picture is also back, rotating between none, description, date, and exif data. The setting is persisted accross the page. Photo overlay

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-14-v6-settings/index.html b/2024-09-14-v6-settings/index.html index 9507d164..02cae990 100644 --- a/2024-09-14-v6-settings/index.html +++ b/2024-09-14-v6-settings/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Settings and coverage

· ildyria · Active Development  · 1 min read

Bite-size v6: Settings and coverage

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After a week of vacation and seeing the family, I am back on Lychee. As we soft launched the alpha on docker, we are getting some feedback such as that the all settings tab is too complex and too heavy for normal user. The basic settings are here to stay, it is just that I haven’t had the time fix the panel. On the other hand, by switching the values to the right and label to the left, we declutered the interface significantly.

One of the value of LycheeOrg is High quality software see our team page. For this reason we are now able to release two versions of Lychee v6. One with the legacy fallback and one without, the conversion is easilly done with a simple bash script. Nonetheless, by removing those legacy hooks, we identified pain points for the future and fixed them.

Coverage

Continuing on this track, I increased the code coverage to 80% by adding tests. The Codecov integration will now guarantee that no future pull requests fall under that threshold.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Settings and coverage

· ildyria · Active Development  · 1 min read

Bite-size v6: Settings and coverage

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

After a week of vacation and seeing the family, I am back on Lychee. As we soft launched the alpha on docker, we are getting some feedback such as that the all settings tab is too complex and too heavy for normal user. The basic settings are here to stay, it is just that I haven’t had the time fix the panel. On the other hand, by switching the values to the right and label to the left, we declutered the interface significantly.

One of the value of LycheeOrg is High quality software see our team page. For this reason we are now able to release two versions of Lychee v6. One with the legacy fallback and one without, the conversion is easilly done with a simple bash script. Nonetheless, by removing those legacy hooks, we identified pain points for the future and fixed them.

Coverage

Continuing on this track, I increased the code coverage to 80% by adding tests. The Codecov integration will now guarantee that no future pull requests fall under that threshold.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-15-v6-menus/index.html b/2024-09-15-v6-menus/index.html index 31fb960d..a4b38cc5 100644 --- a/2024-09-15-v6-menus/index.html +++ b/2024-09-15-v6-menus/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Photo selection and context menus

· ildyria · Active Development  · 2 min read

Bite-size v6: Photo selection and context menus

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More things start to take shape. The selection with Ctrl and Shift are now working. The Drag-and-select is not implemented yet, but that one will probably be for after the official release. So far the interface is still not mobile friendly for selection, some improvements need to be made here. I also need to check how the interaction with ctrl + click is working on Mac to see if that is still spawning a browser context menu.

That being said, the first few operations are now working. The photo listing is not updated yet, nor dropping the local cache of the current album. Ah, I forgot to mention that.

As opposed to version 4 and version 5, Lychee v6 will support local caching of the requests, which means that once an album has been open, it will not be queried again. This will significantly speed up the responses when going through multiple pages etc. On the less fun side for me, it also means that I will be fighting against the cache invalidation problem. Wish me luck. ;)

That being said, now that photo selection is working, we also have the context menus being displayed. At the moment most of the actions are empty placeholders, but actual execution code should be coming soon.

Menu

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Photo selection and context menus

· ildyria · Active Development  · 2 min read

Bite-size v6: Photo selection and context menus

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More things start to take shape. The selection with Ctrl and Shift are now working. The Drag-and-select is not implemented yet, but that one will probably be for after the official release. So far the interface is still not mobile friendly for selection, some improvements need to be made here. I also need to check how the interaction with ctrl + click is working on Mac to see if that is still spawning a browser context menu.

That being said, the first few operations are now working. The photo listing is not updated yet, nor dropping the local cache of the current album. Ah, I forgot to mention that.

As opposed to version 4 and version 5, Lychee v6 will support local caching of the requests, which means that once an album has been open, it will not be queried again. This will significantly speed up the responses when going through multiple pages etc. On the less fun side for me, it also means that I will be fighting against the cache invalidation problem. Wish me luck. ;)

That being said, now that photo selection is working, we also have the context menus being displayed. At the moment most of the actions are empty placeholders, but actual execution code should be coming soon.

Menu

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-23-v6-multiple/index.html b/2024-09-23-v6-multiple/index.html index 890f31bf..ea150814 100644 --- a/2024-09-23-v6-multiple/index.html +++ b/2024-09-23-v6-multiple/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Context menus, WebAuthn and more

· ildyria · Active Development  · 2 min read

Bite-size v6: Context menus, WebAuthn and more

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

While I am quite busy, I still try to push the development and I hope to be able to release a beta of version 6 by the end of the week.

Thumb album decorations

As you can see on the screenshot above, the album decorations are making their come back from the version 4 (I hadn’t had time to implement them in v5). You now have the choice between:

  • layer (default),
  • photos (number of photos),
  • albums (number of sub albums),
  • all (number of photos and albums),
  • and none which hides the indicator.

When using all the direction and order of appearance are also configurable.

Context menu improvements

Menu More work has been done on the context menu, currently the following are working as expected:

  • Right click actions on single and multiple pictures
    • (Un)Star photo(s)
    • Set as cover
    • Set as header
    • Rename photo
    • Move photo(s)
    • Tag photo(s)
    • Copy photo(s)
    • Delete photo(s)
    • Download
  • Right click actions on single and multiple album
    • Set as cover
    • Rename album
    • Move album(s)
    • Merge album(s) untested
    • Delete album(s)
    • Download

Keybindings and actions

In term of keybindings, also some progress here.

  • toggle full screen
  • edit photo / album
  • info panel toggle
  • photo overlay rotation
  • next/previous photo
  • star
  • delete

The buttons on single picture are also working as expected.

  • star
  • move
  • delete

WebAuthn support

Furthermore, this weekend I have been actively working on the WebAuthn authentication method. All behaviours are now functionals. Login

Listing is also available with the ability to edit the aliases. For less opacity, we also provide the registration datetime of key material. List

And if you try to register a key that is already in the database, we also prevent this. Error

What is left?

On the todo list before we can go to a Beta release:

  • The unticked boxes above.
  • Map page.
  • Sharing page.
  • Frame page.
  • Search page.
  • Oauth support.
  • And maybe some exclusive functionalities of v6?

Can I test this already ?

Sure! There are multiple ways:

  • there is now an alpha prerelease archive but it is more of a snapshot of current development.
  • You can try to follow the alpha branch on Lychee (though once the v6 will be published, don’t forget to switch pack to master)
  • You can also use the alpha tag on docker releases. It is building the latest version of alpha branch every night.

Important: we do not support bug report yet as those are advanced development build and not production ready. To put it bluntly: If things break, you are on your own. Don’t come crying.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Context menus, WebAuthn and more

· ildyria · Active Development  · 2 min read

Bite-size v6: Context menus, WebAuthn and more

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

While I am quite busy, I still try to push the development and I hope to be able to release a beta of version 6 by the end of the week.

Thumb album decorations

As you can see on the screenshot above, the album decorations are making their come back from the version 4 (I hadn’t had time to implement them in v5). You now have the choice between:

  • layer (default),
  • photos (number of photos),
  • albums (number of sub albums),
  • all (number of photos and albums),
  • and none which hides the indicator.

When using all the direction and order of appearance are also configurable.

Context menu improvements

Menu More work has been done on the context menu, currently the following are working as expected:

  • Right click actions on single and multiple pictures
    • (Un)Star photo(s)
    • Set as cover
    • Set as header
    • Rename photo
    • Move photo(s)
    • Tag photo(s)
    • Copy photo(s)
    • Delete photo(s)
    • Download
  • Right click actions on single and multiple album
    • Set as cover
    • Rename album
    • Move album(s)
    • Merge album(s) untested
    • Delete album(s)
    • Download

Keybindings and actions

In term of keybindings, also some progress here.

  • toggle full screen
  • edit photo / album
  • info panel toggle
  • photo overlay rotation
  • next/previous photo
  • star
  • delete

The buttons on single picture are also working as expected.

  • star
  • move
  • delete

WebAuthn support

Furthermore, this weekend I have been actively working on the WebAuthn authentication method. All behaviours are now functionals. Login

Listing is also available with the ability to edit the aliases. For less opacity, we also provide the registration datetime of key material. List

And if you try to register a key that is already in the database, we also prevent this. Error

What is left?

On the todo list before we can go to a Beta release:

  • The unticked boxes above.
  • Map page.
  • Sharing page.
  • Frame page.
  • Search page.
  • Oauth support.
  • And maybe some exclusive functionalities of v6?

Can I test this already ?

Sure! There are multiple ways:

  • there is now an alpha prerelease archive but it is more of a snapshot of current development.
  • You can try to follow the alpha branch on Lychee (though once the v6 will be published, don’t forget to switch pack to master)
  • You can also use the alpha tag on docker releases. It is building the latest version of alpha branch every night.

Important: we do not support bug report yet as those are advanced development build and not production ready. To put it bluntly: If things break, you are on your own. Don’t come crying.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-24-v6-frame/index.html b/2024-09-24-v6-frame/index.html index 29f1994f..73791450 100644 --- a/2024-09-24-v6-frame/index.html +++ b/2024-09-24-v6-frame/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Frame Mode and Sharing

· ildyria · Active Development  · 1 min read

Bite-size v6: Frame Mode and Sharing

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More progress today! The Frame mode is now available like on the version 5. However I still have the links in the header to add conditionally.

global sharing

And as seen above the global sharing page available via the left menu is also completed. For now, we do not support mass sharing (like on the version 4), but this can easilly be added later.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Frame Mode and Sharing

· ildyria · Active Development  · 1 min read

Bite-size v6: Frame Mode and Sharing

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

More progress today! The Frame mode is now available like on the version 5. However I still have the links in the header to add conditionally.

global sharing

And as seen above the global sharing page available via the left menu is also completed. For now, we do not support mass sharing (like on the version 4), but this can easilly be added later.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-24-v6-oauth/index.html b/2024-09-24-v6-oauth/index.html index 59a9664c..a653a47f 100644 --- a/2024-09-24-v6-oauth/index.html +++ b/2024-09-24-v6-oauth/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Oauth authentication

· ildyria · Active Development  · 1 min read

Bite-size v6: Oauth authentication

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Added first in version 5, it is also now available in version 6. I have not fully tested the code but I am quite confident it works as expected (as it is literally the same as on version 5).

Furthermore, as the keycloak is making use of the fa-key icon, we switched the WebAuthn icon to fa-fingerprint to avoid confusion. Furthermore, with biometrics rolling out such as face-id and fingerprint readers in WebAuthn authentication devices, it also makes more sense to use this icon (first one from left to right on the row of icons in the screenshot below).

Fingerprint

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Oauth authentication

· ildyria · Active Development  · 1 min read

Bite-size v6: Oauth authentication

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Added first in version 5, it is also now available in version 6. I have not fully tested the code but I am quite confident it works as expected (as it is literally the same as on version 5).

Furthermore, as the keycloak is making use of the fa-key icon, we switched the WebAuthn icon to fa-fingerprint to avoid confusion. Furthermore, with biometrics rolling out such as face-id and fingerprint readers in WebAuthn authentication devices, it also makes more sense to use this icon (first one from left to right on the row of icons in the screenshot below).

Fingerprint

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-24-v6-scramble/index.html b/2024-09-24-v6-scramble/index.html index 2c578633..a354fc16 100644 --- a/2024-09-24-v6-scramble/index.html +++ b/2024-09-24-v6-scramble/index.html @@ -1,4 +1,4 @@ -Lychee - About Lychee API documentation

· ildyria · Api Documentation  · 4 min read

About Lychee API documentation

With v6 at the horizon, we had to drop the support of Scramble, a library responsible for automated API documentation. We explain here the reasons which motivated such choice.

With v6 at the horizon, we had to drop the support of Scramble, a library responsible for automated API documentation. We explain here the reasons which motivated such choice.

x1ntt asked the following question and I thought it deserved a visible answer.

Even without API documentation, is the v6 version compatible with this API? I think APIs are very important because I have a need for automated development. Maintaining a good API will lead to the emergence of excellent third-party clients and tools.

In short: Yes and No.

Yes because v6 will provide a legacy api option which can be enabled by setting LEGACY_API_ENABLED in your .env. Furthermore, the URL of the legacy API do not change, they stay the same. So no need to change your code, you will just need to set the .env variable.

No, because v6 will provide a completely upgrade of the API which makes use of a bit more than just POST requests. It will also support GET, PATCH, DELETE (to get closer to proper REST spec).

About v4 and v5 documentation

Documentation on v4 and v5 was making use of dedoc/scramble. This extension of Laravel was doing a static analysis of the routes, checking the controllers, the requests objects and the resources files. Using those data it generated a nice interface with readable documentation.

It has been brought to our attention that Scramble is not even working anymore on version 5.5.1 and most likely suffers from an infinite recursion during the serialization of one of the response (out of memory error).

In the spirit of open source, I could try to fix it. However, scramble fails at the following:

  • proper software design respecting SOLID architecture (refusal to have proper design with interface, uses reflections instead to check if some methods are available, and violation of the Liskov substitution principle).
  • lack of static analysis such as Phpstan.

As I do not feel comfortable to contribute to such code base, it is an easier decision to drop the scramble component completely.

No more dedoc/scramble

Furthermore, with version 6 we are now using Spatie Data. This allows us to generate typescripts definitions from those objects, and thus ensuring stronger type compatibility between front-end and back-end.

Scramble only support Spatie Data in the pro version, we respect the decision of romalytvynenko, and remove it as we are no longer able to use it anymore.

About v6

It is likely that I will release version 6 without API documentation at first. My time is limited and I prefer to focus on adding back the functionalities rather than writing documentations, especially given that the v1 api will remain available.

And to clarify, this does not mean that there won’t be documentation of the API at some point. As x1ntt says “Maintaining a good API will lead to the emergence of excellent third-party clients and tools.” For this reason I am also exploring other documentation options such as scribe.

At the time of writing the list of the api v2 routes is as follows (and subject to change):

GET       api/v2/Album ............................................. Gallery\AlbumController@get
+Lychee - About Lychee API documentation

· ildyria · Api Documentation  · 4 min read

About Lychee API documentation

With v6 at the horizon, we had to drop the support of Scramble, a library responsible for automated API documentation. We explain here the reasons which motivated such choice.

With v6 at the horizon, we had to drop the support of Scramble, a library responsible for automated API documentation. We explain here the reasons which motivated such choice.

x1ntt asked the following question and I thought it deserved a visible answer.

Even without API documentation, is the v6 version compatible with this API? I think APIs are very important because I have a need for automated development. Maintaining a good API will lead to the emergence of excellent third-party clients and tools.

In short: Yes and No.

Yes because v6 will provide a legacy api option which can be enabled by setting LEGACY_API_ENABLED in your .env. Furthermore, the URL of the legacy API do not change, they stay the same. So no need to change your code, you will just need to set the .env variable.

No, because v6 will provide a completely upgrade of the API which makes use of a bit more than just POST requests. It will also support GET, PATCH, DELETE (to get closer to proper REST spec).

About v4 and v5 documentation

Documentation on v4 and v5 was making use of dedoc/scramble. This extension of Laravel was doing a static analysis of the routes, checking the controllers, the requests objects and the resources files. Using those data it generated a nice interface with readable documentation.

It has been brought to our attention that Scramble is not even working anymore on version 5.5.1 and most likely suffers from an infinite recursion during the serialization of one of the response (out of memory error).

In the spirit of open source, I could try to fix it. However, scramble fails at the following:

  • proper software design respecting SOLID architecture (refusal to have proper design with interface, uses reflections instead to check if some methods are available, and violation of the Liskov substitution principle).
  • lack of static analysis such as Phpstan.

As I do not feel comfortable to contribute to such code base, it is an easier decision to drop the scramble component completely.

No more dedoc/scramble

Furthermore, with version 6 we are now using Spatie Data. This allows us to generate typescripts definitions from those objects, and thus ensuring stronger type compatibility between front-end and back-end.

Scramble only support Spatie Data in the pro version, we respect the decision of romalytvynenko, and remove it as we are no longer able to use it anymore.

About v6

It is likely that I will release version 6 without API documentation at first. My time is limited and I prefer to focus on adding back the functionalities rather than writing documentations, especially given that the v1 api will remain available.

And to clarify, this does not mean that there won’t be documentation of the API at some point. As x1ntt says “Maintaining a good API will lead to the emergence of excellent third-party clients and tools.” For this reason I am also exploring other documentation options such as scribe.

At the time of writing the list of the api v2 routes is as follows (and subject to change):

GET       api/v2/Album ............................................. Gallery\AlbumController@get
 POST      api/v2/Album ..................................... Gallery\AlbumController@createAlbum
 PATCH     api/v2/Album ..................................... Gallery\AlbumController@updateAlbum
 POST      api/v2/Album::cover .................................... Gallery\AlbumController@cover
@@ -80,4 +80,4 @@
 GET       auth/{provider}/authenticate ....... oauth-authenticate › OauthController@authenticate
 GET       auth/{provider}/redirect .................................. OauthController@redirected
 GET       auth/{provider}/register ................... oauth-register › OauthController@register
-

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-25-v6-map/index.html b/2024-09-25-v6-map/index.html index 0c6a2bba..09108850 100644 --- a/2024-09-25-v6-map/index.html +++ b/2024-09-25-v6-map/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Map implementation

· ildyria · Active Development  · 1 min read

Bite-size v6: Map implementation

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Addition of this morning. The map is back!

I still need to integrate the link to the header menu in the gallery page and album page. I will probably do that at the same time as with the frame mod.

Next stop, will most likely be the Search page.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Map implementation

· ildyria · Active Development  · 1 min read

Bite-size v6: Map implementation

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Addition of this morning. The map is back!

I still need to integrate the link to the header menu in the gallery page and album page. I will probably do that at the same time as with the frame mod.

Next stop, will most likely be the Search page.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-29-v6-alpha/index.html b/2024-09-29-v6-alpha/index.html index 9004c281..3e34edbe 100644 --- a/2024-09-29-v6-alpha/index.html +++ b/2024-09-29-v6-alpha/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Second Alpha!

· ildyria · Active Development  · 1 min read

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

A week ago I did a list (see here) of things that needed to be completed before we could move further. After battling to get back the code coverage above 80%, I was able to finish the needed tick box. This also includes some missed points such as the unlocking of albums with passwords and sensitive curtains.

I would say Lychee v6 is very close to be ready. For this reason we are publishing a second alpha release.

However after a few more tests, I couldn’t help but notice that there are a few problems needed to be fixed:

  • Header bar on mobile phones, including menu links
  • Dynamic menu buttons in header when selecting pictures or albums.
  • More things that I may have missed?

Anyway, if you are interested in giving a try to this second Alpha release, check it here or the alpha tag on our docker.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Second Alpha!

· ildyria · Active Development  · 1 min read

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

A week ago I did a list (see here) of things that needed to be completed before we could move further. After battling to get back the code coverage above 80%, I was able to finish the needed tick box. This also includes some missed points such as the unlocking of albums with passwords and sensitive curtains.

I would say Lychee v6 is very close to be ready. For this reason we are publishing a second alpha release.

However after a few more tests, I couldn’t help but notice that there are a few problems needed to be fixed:

  • Header bar on mobile phones, including menu links
  • Dynamic menu buttons in header when selecting pictures or albums.
  • More things that I may have missed?

Anyway, if you are interested in giving a try to this second Alpha release, check it here or the alpha tag on our docker.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-09-30-v6-header/index.html b/2024-09-30-v6-header/index.html index c29b459d..6a531c8b 100644 --- a/2024-09-30-v6-header/index.html +++ b/2024-09-30-v6-header/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Header fixes

· ildyria · Active Development  · 1 min read

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

In my previous post, I mentionned I was not happy with the header, especially on mobile devices. I am happy to say that I found a nice compromise.

in mobile view

in mobile view menu open

When switching to mobile, the long title is replaced by “Albums” and all the buttons are placed in a speed dial menu.

Similarly when logged out.

in mobile view

in mobile view

The “Return to home” Link is replaced with a house button and the long title replaced by the translated Albums.

After checking most of the functions, I noticed that we are still missing the following:

  • The support of gps tracks
  • The selection of header image in albums (plus misc I may have forgotten).
  • Easy set/unset of visible smart albums (and probably fix some v5 bugs in the unsorted one).
  • The support of Dropbox
  • More easy to the eye in the Settings page.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Header fixes

· ildyria · Active Development  · 1 min read

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

In my previous post, I mentionned I was not happy with the header, especially on mobile devices. I am happy to say that I found a nice compromise.

in mobile view

in mobile view menu open

When switching to mobile, the long title is replaced by “Albums” and all the buttons are placed in a speed dial menu.

Similarly when logged out.

in mobile view

in mobile view

The “Return to home” Link is replaced with a house button and the long title replaced by the translated Albums.

After checking most of the functions, I noticed that we are still missing the following:

  • The support of gps tracks
  • The selection of header image in albums (plus misc I may have forgotten).
  • Easy set/unset of visible smart albums (and probably fix some v5 bugs in the unsorted one).
  • The support of Dropbox
  • More easy to the eye in the Settings page.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-10-05-v6-beta/index.html b/2024-10-05-v6-beta/index.html index b6af21df..a008e495 100644 --- a/2024-10-05-v6-beta/index.html +++ b/2024-10-05-v6-beta/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Beta is Live!

· ildyria · Active Development  · 2 min read

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

In the past few days I have been working on the final touches, trying to check all the corners. The dropdown to select the hero picture is back, and the selection of tags on tag albums is also working.

Configuration of JS and CSS I added back the boxes to edit CSS and JS so that users are able to customize the look and feel of Lychee as they wish.

Configuration of the Dropbox import I also added back import from Dropbox. I removed it in the version 5, but we got some complaints that it was missing and had to add it back. This time, I took the proactive approach to directly integrate it from the start. Note that the code is not much tested in that corner as I do not use Dropbox.

That being said, today I added a new functionality. It was often requested to have a “real” slideshow mode. This is now the case 😃. You can trigger it by tapping your Space bar or clicking the play button in the header. Your Left and Right arrow keys allow you to switch to the next picture. Otherwise, just let the timer run out and the next picture will be loaded automatically.

The behaviour is very similar to the frame mode. The later is aimed to be used in a screen display and rotate randomly. In the case of the slideshow, the pictures will be displayed in order of the current album.

With this in the box, it is time to announce that the Beta is now ready. You can access it either via the alpha tag on docker, or via the release page.

As opposed to the alpha, the beta will bump your version number to 6.0.0.

Feedback on the version 6 with the new front-end are welcomed on GitHub or our Discord.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Beta is Live!

· ildyria · Active Development  · 2 min read

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

In the past few days I have been working on the final touches, trying to check all the corners. The dropdown to select the hero picture is back, and the selection of tags on tag albums is also working.

Configuration of JS and CSS I added back the boxes to edit CSS and JS so that users are able to customize the look and feel of Lychee as they wish.

Configuration of the Dropbox import I also added back import from Dropbox. I removed it in the version 5, but we got some complaints that it was missing and had to add it back. This time, I took the proactive approach to directly integrate it from the start. Note that the code is not much tested in that corner as I do not use Dropbox.

That being said, today I added a new functionality. It was often requested to have a “real” slideshow mode. This is now the case 😃. You can trigger it by tapping your Space bar or clicking the play button in the header. Your Left and Right arrow keys allow you to switch to the next picture. Otherwise, just let the timer run out and the next picture will be loaded automatically.

The behaviour is very similar to the frame mode. The later is aimed to be used in a screen display and rotate randomly. In the case of the slideshow, the pictures will be displayed in order of the current album.

With this in the box, it is time to announce that the Beta is now ready. You can access it either via the alpha tag on docker, or via the release page.

As opposed to the alpha, the beta will bump your version number to 6.0.0.

Feedback on the version 6 with the new front-end are welcomed on GitHub or our Discord.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-10-07-v6-beta2/index.html b/2024-10-07-v6-beta2/index.html index ca931a01..097d28f5 100644 --- a/2024-10-07-v6-beta2/index.html +++ b/2024-10-07-v6-beta2/index.html @@ -1 +1 @@ -Lychee - Bite-size v6: Updates and timelines

· ildyria · Active Development  · 2 min read

Bite-size v6: Updates and timelines

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

It has been a week since the release of the beta and I do get questions such as “when will we see a production build?""

This an hard to answer question. One one hand, we could merge the changes and ship 6.0.0 today. Why don’t we do it? Because there has not been a thorough review process on it the Pull Request #2504 yet.

At LycheeOrg we strive for quality, and while I am confident in my abilities, everyone has a blind spot. For this reason, I am waiting for the feedback of our Beta users, in order to fix their findings.

Over the past week, I got a lot of feedback from Tino Hager (big thanks), so I still have a few things to work on, namely:

  • : Rotation - refresh visual.
  • : Album selection when only one album exists => edge case list is empty.
  • : Drag & drop photo.
  • : Ctrl + V pasting photos to upload.
  • : Upload button when album is empty.

I already solved a lot of his previous notes, and will happily continue doing it again in the future.

Now to the question, can I already use the docker alpha branch in production? I am doing it, but I know lychee like the palm of my hand, YMMV. :)

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file +Lychee - Bite-size v6: Updates and timelines

· ildyria · Active Development  · 2 min read

Bite-size v6: Updates and timelines

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

It has been a week since the release of the beta and I do get questions such as “when will we see a production build?""

This an hard to answer question. One one hand, we could merge the changes and ship 6.0.0 today. Why don’t we do it? Because there has not been a thorough review process on it the Pull Request #2504 yet.

At LycheeOrg we strive for quality, and while I am confident in my abilities, everyone has a blind spot. For this reason, I am waiting for the feedback of our Beta users, in order to fix their findings.

Over the past week, I got a lot of feedback from Tino Hager (big thanks), so I still have a few things to work on, namely:

  • : Rotation - refresh visual.
  • : Album selection when only one album exists => edge case list is empty.
  • : Drag & drop photo.
  • : Ctrl + V pasting photos to upload.
  • : Upload button when album is empty.

I already solved a lot of his previous notes, and will happily continue doing it again in the future.

Now to the question, can I already use the docker alpha branch in production? I am doing it, but I know lychee like the palm of my hand, YMMV. :)

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta.2 is Live!

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/2024-10-14-v6-beta3/index.html b/2024-10-14-v6-beta3/index.html new file mode 100644 index 00000000..0a15fe50 --- /dev/null +++ b/2024-10-14-v6-beta3/index.html @@ -0,0 +1 @@ +Lychee - Bite-size v6: Beta.2 is Live!

· ildyria · Active Development  · 2 min read

Bite-size v6: Beta.2 is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

I got some nice and extensive feedback from Beta 1. See below the fixes and improvements that have been made in the Beta 2.

  • : Fix pictures not being deleted when clicked on the button.
  • : Fix links and bold which were invisible in light mode in Album and Photo descriptions
  • : Add link shape check on Upload via Url
  • : Dropbox upload is now set to disabled if it was empty, no more useless warning in Diagnostics.
  • : Import from server is gone from the menu (it was already gone in v5).
  • : Some labels have been updated for readability.
  • : Added a button in the middle of the screen when the album is empty to prompt the upload of pictures.
  • : Drag & Drop fixed on Upload + Full drag & drop support on album pages + Paste image support as upload on album pages.
  • : Ongoing progress of uploads is now displayed on top of the modal.
  • : Added tooltips on the action bar for photos (star, rotate, delete)
  • : In slideshow the actions buttons for photos were still visible (though unusable).
  • : Fixed the Edit photo dialog for consistent design.
  • : Improved visibility form in Albums.
  • : Add set as album header button in photo view
  • : Rotating a photo refreshes the photo.
  • : Added setting to preserve photo on upload when auto rotation is set.
  • : Added swipe left / right to switch picture.
  • : Added scroll up / down to switch picture.
  • : Fixed some Warnings as Info in Diagnostics.
  • : Fixed broken images on thumbs
  • : After upload is completed, refresh album in the background
  • : Switching from dark mode to light mode and vice-versa no longer requires reloading.
  • : Fixed Photo details colors in light mode.
  • : Do not show the Map when Map settings is disabled.
  • : Fixes error messages showing up full screen when dist/user.css and dist/custom.js do not exist.
  • : Add GET api/v2/Photo::random end point to request random pictures, this provides the full data of the photo instead of the src links for the frame.
  • : Revamped completely the User Management panel.

With this out of the pipe, it is now time to release a new Beta version. And as always, the Docker alpha tag reflects the latest changes to Version 6.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Related Posts

View All Posts »
Bite-size v6: Beta is Live!

Bite-size v6: Beta is Live!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Header fixes

Bite-size v6: Header fixes

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

Bite-size v6: Second Alpha!

Bite-size v6: Second Alpha!

Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.

\ No newline at end of file diff --git a/404.html b/404.html index 5a64ddfe..fd74d0df 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ -Lychee - Error 404

Error 404

Sorry, we couldn't find this page.

But dont worry, you can find plenty of other things on our homepage.

Back to homepage
\ No newline at end of file +Lychee - Error 404

Error 404

Sorry, we couldn't find this page.

But dont worry, you can find plenty of other things on our homepage.

Back to homepage
\ No newline at end of file diff --git a/assets/license.CTUg88x-.css b/assets/license.CTUg88x-.css deleted file mode 100644 index caf831ac..00000000 --- a/assets/license.CTUg88x-.css +++ /dev/null @@ -1 +0,0 @@ -.hero__inner{margin-left:auto;margin-right:auto;width:1200px;padding:5% 0 0 6%;overflow:hidden}.window{max-width:1168px;border-radius:6px 6px 0 0;box-shadow:0 18px 25px 10px #0003;border:1px solid rgba(0,0,0,.2)}.window__bar{align-items:center;padding:8px 12px;background:linear-gradient(180deg,#efefef,#dadada);border-radius:6px 6px 0 0;border-bottom:1px solid #b4b4b4;box-shadow:inset 0 1px 1px #fffc}.window__bar,.window__dots{display:flex}.window__dots{flex-shrink:0;padding:0 4px 0 2px}.window__dot{margin:0 8px 0 0;width:12px;height:12px;border-radius:50%;box-shadow:inset 0 0 0 1px #0000001a}.window__dot--red{background:#ff6057}.window__dot--orange{background:#ffbd2e}.window__dot--green{background:#27c93f}.window__menuitem{padding:0 4px;height:23px;background:#fff;border-radius:4px;box-shadow:0 1px #00000026}.window__button{flex-shrink:0;margin:0 1px 0 0;line-height:26px}.window__button svg{margin:2px 0 0}.window__button svg path{fill:#00000059}.window__adress{position:relative;display:flex;flex-shrink:1;margin:0 auto;justify-content:center;align-items:center;width:500px;color:#000000e6;font-family:Helvetica Neue,Helvetica;font-size:12px;text-align:center}.window__adress svg{position:absolute;top:1px;right:2px}.window__adress svg path{fill:#0009}.window__content{display:block;background:#1d1d1d}.madefor__bg{position:absolute;top:0;left:0;width:100%;height:80%;background-image:url(/assets//photographers.DsHNW6sB.jpg);background-size:cover;transform:translate3d(0,1.84571px,0)}.shape-divider-bottom{width:100%;overflow:hidden;line-height:0}.shape-divider-bottom svg{position:relative;display:block;width:calc(100% + 1.3px);height:200px}.bg-mix{background-color:#d7f0fe}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--aw-font-sans, ui-sans-serif),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;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;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}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,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--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;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--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;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:start;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6666667em;margin-bottom:1.6666667em;padding-inline-start:1em}.prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;border-radius:.3125rem;padding-top:.2222222em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-inline-start:.4444444em}.prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-inline-end:1.5em;padding-bottom:1em;padding-inline-start:1.5em}.prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;margin-bottom:.6666667em}.prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(.prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg :where(.prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:3.1111111em;margin-bottom:3.1111111em}.prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.75em;padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg :where(.prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(.prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.btn{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn{padding-left:2rem;padding-right:2rem}}.btn-primary{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn-primary:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn-primary:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn-primary:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn-primary:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn-primary{padding-left:2rem;padding-right:2rem}}.btn-primary{border-color:var(--aw-color-primary);background-color:var(--aw-color-primary);font-weight:600;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.btn-primary:hover{border-color:var(--aw-color-secondary);background-color:var(--aw-color-secondary);--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.btn-primary:is(.dark *){border-color:var(--aw-color-primary);background-color:var(--aw-color-primary);--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.btn-primary:hover:is(.dark *){border-color:var(--aw-color-secondary);background-color:var(--aw-color-secondary)}.btn-secondary{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn-secondary:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn-secondary:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn-secondary:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn-secondary:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn-secondary{padding-left:2rem;padding-right:2rem}}.btn-tertiary{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn-tertiary:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn-tertiary:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn-tertiary:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn-tertiary:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn-tertiary{padding-left:2rem;padding-right:2rem}}.btn-tertiary{border-style:none;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);color:var(--aw-color-text-muted)}.btn-tertiary:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.btn-tertiary:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.btn-tertiary:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.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}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.right-\[-21px\]{right:-21px}.right-\[-5px\]{right:-5px}.top-0{top:0}.top-\[-5px\]{top:-5px}.top-\[19px\]{top:19px}.-z-\[1\]{z-index:-1}.z-40{z-index:40}.z-\[1\]{z-index:1}.col-span-1{grid-column:span 1 / span 1}.col-span-12{grid-column:span 12 / span 12}.col-span-6{grid-column:span 6 / span 6}.-m-4{margin:-1rem}.m-auto{margin:auto}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-mb-6{margin-bottom:-1.5rem}.-ml-1\.5{margin-left:-.375rem}.-ml-2{margin-left:-.5rem}.-mr-1\.5{margin-right:-.375rem}.-mt-0\.5{margin-top:-.125rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0{margin-left:0}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-0{margin-right:0}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-auto{margin-right:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-96{margin-top:24rem}.mt-\[-40px\]{margin-top:-40px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0{height:0px}.h-0\.5{height:.125rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-24{height:6rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-80{height:20rem}.h-96{height:24rem}.h-\[1\.25rem\]{height:1.25rem}.h-\[100px\]{height:100px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-10{max-height:2.5rem}.max-h-12{max-height:3rem}.min-h-full{min-height:100%}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2\/6{width:33.333333%}.w-20{width:5rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-4\/6{width:66.666667%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-\[100px\]{width:100px}.w-\[5\.6rem\]{width:5.6rem}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-\[220px\]{min-width:220px}.min-w-full{min-width:100%}.\!max-w-full{max-width:100%!important}.max-w-10{max-width:2.5rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.basis-1\/2{flex-basis:50%}.border-collapse{border-collapse:collapse}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-75{--tw-scale-x: .75;--tw-scale-y: .75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.scroll-mt-\[72px\]{scroll-margin-top:72px}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.gap-y-8{row-gap:2rem}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.rounded-tr-lg{border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-\[\#ffffff29\]{border-color:#ffffff29}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-gray-50\/0{border-color:#f9fafb00}.border-neutral-200{--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity))}.border-primary{border-color:var(--aw-color-primary)}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-black\/10{background-color:#0000001a}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity))}.bg-neutral-400{--tw-bg-opacity: 1;background-color:rgb(163 163 163 / var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity))}.bg-primary{background-color:var(--aw-color-primary)}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity))}.bg-sky-400{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity))}.bg-sky-400\/10{background-color:#38bdf81a}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-white\/40{background-color:#fff6}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity))}.bg-\[url\(https\:\/\/img\.shields\.io\/github\/stars\/lycheeorg\/lychee\.svg\?style\=social\&label\=Stars\&maxAge\=86400\)\]{background-image:url(https://img.shields.io/github/stars/lycheeorg/lychee.svg?style=social&label=Stars&maxAge=86400)}.bg-contain{background-size:contain}.fill-sky-100{fill:#e0f2fe}.fill-sky-400{fill:#38bdf8}.fill-sky-50{fill:#f0f9ff}.\!stroke-1{stroke-width:1!important}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-1{padding:.25rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:3rem}.pb-4{padding-bottom:1rem}.pb-8{padding-bottom:2rem}.pb-\[56\.25\%\]{padding-bottom:56.25%}.pl-4{padding-left:1rem}.pr-4{padding-right:1rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.align-super{vertical-align:super}.font-heading{font-family:var(--aw-font-heading, ui-sans-serif),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-9xl{font-size:8rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[2\.6rem\]{font-size:2.6rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-tight{line-height:1.25}.tracking-\[0\.01rem\]{letter-spacing:.01rem}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-default{color:var(--aw-color-text-default)}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity))}.text-neutral-600{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity))}.text-neutral-800{--tw-text-opacity: 1;color:rgb(38 38 38 / var(--tw-text-opacity))}.text-primary{color:var(--aw-color-primary)}.text-secondary{color:var(--aw-color-secondary)}.text-sky-500{--tw-text-opacity: 1;color:rgb(14 165 233 / var(--tw-text-opacity))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.decoration-2{text-decoration-thickness:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_3px_10px_-5px_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 3px 10px -5px rgba(0,0,0,.3);--tw-shadow-colored: 0 3px 10px -5px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_30px_rgba\(0\,0\,0\,0\.1\)\]{--tw-shadow: 0 4px 30px rgba(0,0,0,.1);--tw-shadow-colored: 0 4px 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;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 rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.drop-shadow-xl{--tw-drop-shadow: drop-shadow(0 20px 13px rgb(0 0 0 / .03)) drop-shadow(0 8px 5px rgb(0 0 0 / .08));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-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}.transition-\[opacity\],.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.bg-page{background-color:var(--aw-color-bg-page)}.bg-dark{background-color:var(--aw-color-bg-page-dark)}.text-muted{color:var(--aw-color-text-muted)}#header.scroll>div:first-child{background-color:var(--aw-color-bg-page)}@media (min-width: 768px){#header.scroll>div:first-child{background-color:#ffffffe6;--tw-backdrop-blur: blur(12px);-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)}}#header.scroll>div:first-child{box-shadow:0 .375rem 1.5rem #8c98a421}.dark #header.scroll>div:first-child,#header.scroll.dark>div:first-child{border-bottom-width:1px;border-color:#6b728033;background-color:var(--aw-color-bg-page)}@media (min-width: 768px){.dark #header.scroll>div:first-child,#header.scroll.dark>div:first-child{background-color:#030621e6}}.dark #header.scroll>div:first-child,#header.scroll.dark>div:first-child{box-shadow:none}#header.expanded nav{position:fixed;top:70px;left:0;right:0;bottom:70px!important;padding:0 5px}.dropdown:focus .dropdown-menu,.dropdown:focus-within .dropdown-menu,.dropdown:hover .dropdown-menu{display:block}[astro-icon].icon-light>*{stroke-width:1.2}[astro-icon].icon-bold>*{stroke-width:2.4}[data-aw-toggle-menu] path{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-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}[data-aw-toggle-menu].expanded g>path:first-child{--tw-translate-y: 15px;--tw-translate-x: -3px;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-aw-toggle-menu].expanded g>path:last-child{--tw-translate-y: -8px;--tw-translate-x: 14px;--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dd *:first-child{margin-top:0}.dark\:prose-invert:is(.dark *){--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}@media (min-width: 1024px){.lg\:prose-xl{font-size:1.25rem;line-height:1.8}.lg\:prose-xl :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em}.lg\:prose-xl :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.lg\:prose-xl :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1.0666667em}.lg\:prose-xl :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.lg\:prose-xl :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.lg\:prose-xl :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.lg\:prose-xl :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.lg\:prose-xl :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.lg\:prose-xl :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;border-radius:.3125rem;padding-top:.25em;padding-inline-end:.4em;padding-bottom:.25em;padding-inline-start:.4em}.lg\:prose-xl :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8611111em}.lg\:prose-xl :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.1111111em;padding-inline-end:1.3333333em;padding-bottom:1.1111111em;padding-inline-start:1.3333333em}.lg\:prose-xl :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;margin-bottom:.6em}.lg\:prose-xl :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8em;margin-bottom:.8em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8em;margin-bottom:.8em}.lg\:prose-xl :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em}.lg\:prose-xl :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;padding-inline-start:1.6em}.lg\:prose-xl :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8em;margin-bottom:2.8em}.lg\:prose-xl :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556}.lg\:prose-xl :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.8888889em;padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.lg\:prose-xl :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556;margin-top:1em}.lg\:prose-xl :where(.lg\:prose-xl>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(.lg\:prose-xl>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:left-0:before{content:var(--tw-content);left:0}.before\:top-full:before{content:var(--tw-content);top:100%}.before\:z-\[-1\]:before{content:var(--tw-content);z-index:-1}.before\:border-\[3px\]:before{content:var(--tw-content);border-width:3px}.before\:border-b-transparent:before{content:var(--tw-content);border-bottom-color:transparent}.before\:border-l-green-800:before{content:var(--tw-content);--tw-border-opacity: 1;border-left-color:rgb(22 101 52 / var(--tw-border-opacity))}.before\:border-r-transparent:before{content:var(--tw-content);border-right-color:transparent}.before\:border-t-green-800:before{content:var(--tw-content);--tw-border-opacity: 1;border-top-color:rgb(22 101 52 / var(--tw-border-opacity))}.before\:content-\[\'\'\]:before{--tw-content: "";content:var(--tw-content)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:right-0:after{content:var(--tw-content);right:0}.after\:top-full:after{content:var(--tw-content);top:100%}.after\:z-\[-1\]:after{content:var(--tw-content);z-index:-1}.after\:border-\[3px\]:after{content:var(--tw-content);border-width:3px}.after\:border-b-transparent:after{content:var(--tw-content);border-bottom-color:transparent}.after\:border-l-transparent:after{content:var(--tw-content);border-left-color:transparent}.after\:border-r-green-800:after{content:var(--tw-content);--tw-border-opacity: 1;border-right-color:rgb(22 101 52 / var(--tw-border-opacity))}.after\:border-t-green-800:after{content:var(--tw-content);--tw-border-opacity: 1;border-top-color:rgb(22 101 52 / var(--tw-border-opacity))}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.first\:rounded-t:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.last\:rounded-b:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.hover\:text-black:hover{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.hover\:text-primary:hover{color:var(--aw-color-primary)}.hover\:text-sky-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-4:focus{--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)}.focus\:ring-gray-200:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity))}.group.expanded .group-\[\.expanded\]\:-translate-y-2\.5{--tw-translate-y: -.625rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:translate-y-2\.5{--tw-translate-y: .625rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:-rotate-45{--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:opacity-0{opacity:0}.prose-headings\:scroll-mt-\[80px\] :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){scroll-margin-top:80px}.prose-headings\:font-heading :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:var(--aw-font-heading, ui-sans-serif),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.prose-headings\:font-bold :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){font-weight:700}.prose-headings\:tracking-tighter :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){letter-spacing:-.05em}.prose-a\:text-blue-600 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.prose-a\:text-primary :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))){color:var(--aw-color-primary)}.prose-li\:my-0 :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){margin-top:0;margin-bottom:0}.prose-img\:rounded-md :is(:where(img):not(:where([class~=not-prose],[class~=not-prose] *))){border-radius:.375rem}.prose-img\:shadow-lg :is(:where(img):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (prefers-reduced-motion: no-preference){.motion-safe\:scroll-smooth{scroll-behavior:smooth}}.dark\:border:is(.dark *){border-width:1px}.dark\:border-b:is(.dark *){border-bottom-width:1px}.dark\:border-blue-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity))}.dark\:border-neutral-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity))}.dark\:border-slate-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity))}.dark\:border-slate-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity))}.dark\:border-slate-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity))}.dark\:bg-gray-200:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.dark\:bg-green-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.dark\:bg-neutral-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity))}.dark\:bg-neutral-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity))}.dark\:bg-sky-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(7 89 133 / var(--tw-bg-opacity))}.dark\:bg-slate-400\/50:is(.dark *){background-color:#94a3b880}.dark\:bg-slate-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity))}.dark\:bg-slate-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}.dark\:bg-slate-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity))}.dark\:bg-transparent:is(.dark *){background-color:transparent}.dark\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.dark\:text-blue-200:is(.dark *){--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.dark\:text-neutral-100:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity))}.dark\:text-neutral-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity))}.dark\:text-neutral-400:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity))}.dark\:text-neutral-400\/50:is(.dark *){color:#a3a3a380}.dark\:text-slate-200:is(.dark *){--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity))}.dark\:text-slate-300:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.dark\:text-slate-400:is(.dark *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity))}.dark\:text-slate-500:is(.dark *){--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity))}.dark\:text-slate-600:is(.dark *){--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:shadow-\[0_4px_30px_rgba\(0\,0\,0\,0\.1\)\]:is(.dark *){--tw-shadow: 0 4px 30px rgba(0,0,0,.1);--tw-shadow-colored: 0 4px 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.dark\:shadow-none:is(.dark *){--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.dark\:bg-dark:is(.dark *){background-color:var(--aw-color-bg-page-dark)}.dark\:text-muted:is(.dark *){color:var(--aw-color-text-muted)}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.dark\:hover\:text-blue-700:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity))}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.dark\:hover\:text-slate-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:focus\:ring-gray-700:focus:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity))}.dark\:prose-headings\:text-slate-300 :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.dark\:prose-a\:text-blue-400 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity))}@media (min-width: 640px){.sm\:mx-0{margin-left:0;margin-right:0}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mb-0{margin-bottom:0}.sm\:mt-0{margin-top:0}.sm\:mt-1{margin-top:.25rem}.sm\:mt-1\.5{margin-top:.375rem}.sm\:h-16{height:4rem}.sm\:w-1\/2{width:50%}.sm\:w-auto{width:auto}.sm\:max-w-md{max-width:28rem}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-center{justify-content:center}.sm\:gap-8{gap:2rem}.sm\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.sm\:gap-y-8{row-gap:2rem}.sm\:rounded-md{border-radius:.375rem}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:pl-4{padding-left:1rem}.sm\:text-center{text-align:center}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:leading-none{line-height:1}}@media (min-width: 768px){.md\:static{position:static}.md\:absolute{position:absolute}.md\:order-1{order:1}.md\:col-span-3{grid-column:span 3 / span 3}.md\:-mx-4{margin-left:-1rem;margin-right:-1rem}.md\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.md\:-mt-\[76px\]{margin-top:-76px}.md\:mb-0{margin-bottom:0}.md\:mb-12{margin-bottom:3rem}.md\:mb-16{margin-bottom:4rem}.md\:mb-20{margin-bottom:5rem}.md\:mb-8{margin-bottom:2rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:mr-8{margin-right:2rem}.md\:mt-0{margin-top:0}.md\:mt-12{margin-top:3rem}.md\:mt-3{margin-top:.75rem}.md\:mt-\[76px\]{margin-top:76px}.md\:inline-block{display:inline-block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:h-12{height:3rem}.md\:h-5{height:1.25rem}.md\:h-52{height:13rem}.md\:h-64{height:16rem}.md\:h-72{height:18rem}.md\:h-full{height:100%}.md\:w-1\/4{width:25%}.md\:w-12{width:3rem}.md\:w-5{width:1.25rem}.md\:w-auto{width:auto}.md\:min-w-\[200px\]{min-width:200px}.md\:max-w-none{max-width:none}.md\:max-w-sm{max-width:24rem}.md\:basis-1\/2{flex-basis:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-row-reverse{flex-direction:row-reverse}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-start{align-items:flex-start}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:gap-12{gap:3rem}.md\:gap-16{gap:4rem}.md\:gap-6{gap:1.5rem}.md\:gap-8{gap:2rem}.md\:gap-y-12{row-gap:3rem}.md\:gap-y-8{row-gap:2rem}.md\:self-center{align-self:center}.md\:justify-self-end{justify-self:end}.md\:justify-self-center{justify-self:center}.md\:overflow-x-auto{overflow-x:auto}.md\:overflow-y-visible{overflow-y:visible}.md\:border-r{border-right-width:1px}.md\:bg-white\/90{background-color:#ffffffe6}.md\:p-0{padding:0}.md\:p-3{padding:.75rem}.md\:p-6{padding:1.5rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}.md\:py-4{padding-top:1rem;padding-bottom:1rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:pb-16{padding-bottom:4rem}.md\:pb-20{padding-bottom:5rem}.md\:pb-8{padding-bottom:2rem}.md\:pb-\[75\%\]{padding-bottom:75%}.md\:pl-0{padding-left:0}.md\:pr-64{padding-right:16rem}.md\:pt-0{padding-top:0}.md\:pt-4{padding-top:1rem}.md\:pt-\[76px\]{padding-top:76px}.md\:text-left{text-align:left}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.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}.md\:text-\[0\.9375rem\]{font-size:.9375rem}.md\:text-\[1\.3rem\]{font-size:1.3rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}.md\:backdrop-blur-md{--tw-backdrop-blur: blur(12px);-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)}.md\:last\:border-none:last-child{border-style:none}.md\:hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.dark\:md\:border-slate-500:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity))}.dark\:md\:bg-dark:is(.dark *){background-color:var(--aw-color-bg-page-dark)}}@media (min-width: 1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:col-span-4{grid-column:span 4 / span 4}.lg\:m-0{margin:0}.lg\:my-4{margin-top:1rem;margin-bottom:1rem}.lg\:mb-0{margin-bottom:0}.lg\:ml-16{margin-left:4rem}.lg\:mr-16{margin-right:4rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:h-screen{height:100vh}.lg\:w-1\/2{width:50%}.lg\:max-w-2xl{max-width:42rem}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-\[900px\]{max-width:900px}.lg\:max-w-md{max-width:28rem}.lg\:max-w-none{max-width:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-start{justify-content:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-8{gap:2rem}.lg\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.lg\:p-8{padding:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-0{padding-top:0;padding-bottom:0}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pb-\[56\.25\%\]{padding-bottom:56.25%}.lg\:pt-0{padding-top:0}.lg\:text-left{text-align:left}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:text-5xl{font-size:3rem;line-height:1}.lg\:text-base{font-size:1rem;line-height:1.5rem}.lg\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width: 1280px){.xl\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width: 1536px){.\32xl\:right-\[-8px\]{right:-8px}.\32xl\:top-\[-10px\]{top:-10px}.\32xl\:text-\[20px\]{font-size:20px}}.ltr\:ml-auto:where([dir=ltr],[dir=ltr] *){margin-left:auto}.rtl\:left-\[-21px\]:where([dir=rtl],[dir=rtl] *){left:-21px}.rtl\:left-\[-8px\]:where([dir=rtl],[dir=rtl] *){left:-8px}.rtl\:left-auto:where([dir=rtl],[dir=rtl] *){left:auto}.rtl\:right-0:where([dir=rtl],[dir=rtl] *){right:0}.rtl\:right-auto:where([dir=rtl],[dir=rtl] *){right:auto}.rtl\:-ml-1\.5:where([dir=rtl],[dir=rtl] *){margin-left:-.375rem}.rtl\:-mr-1\.5:where([dir=rtl],[dir=rtl] *){margin-right:-.375rem}.rtl\:-mr-2:where([dir=rtl],[dir=rtl] *){margin-right:-.5rem}.rtl\:ml-0:where([dir=rtl],[dir=rtl] *){margin-left:0}.rtl\:ml-0\.5:where([dir=rtl],[dir=rtl] *){margin-left:.125rem}.rtl\:ml-1:where([dir=rtl],[dir=rtl] *){margin-left:.25rem}.rtl\:ml-2:where([dir=rtl],[dir=rtl] *){margin-left:.5rem}.rtl\:ml-4:where([dir=rtl],[dir=rtl] *){margin-left:1rem}.rtl\:ml-5:where([dir=rtl],[dir=rtl] *){margin-left:1.25rem}.rtl\:ml-auto:where([dir=rtl],[dir=rtl] *){margin-left:auto}.rtl\:mr-0:where([dir=rtl],[dir=rtl] *){margin-right:0}.rtl\:mr-0\.5:where([dir=rtl],[dir=rtl] *){margin-right:.125rem}.rtl\:mr-1:where([dir=rtl],[dir=rtl] *){margin-right:.25rem}.rtl\:mr-2:where([dir=rtl],[dir=rtl] *){margin-right:.5rem}.rtl\:mr-3:where([dir=rtl],[dir=rtl] *){margin-right:.75rem}.rtl\:mr-4:where([dir=rtl],[dir=rtl] *){margin-right:1rem}.rtl\:mr-auto:where([dir=rtl],[dir=rtl] *){margin-right:auto}.rtl\:-rotate-45:where([dir=rtl],[dir=rtl] *){--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:pl-0:where([dir=rtl],[dir=rtl] *){padding-left:0}.rtl\:pl-4:where([dir=rtl],[dir=rtl] *){padding-left:1rem}.rtl\:pr-0:where([dir=rtl],[dir=rtl] *){padding-right:0}.rtl\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}.rtl\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}@media (min-width: 640px){.rtl\:sm\:pl-0:where([dir=rtl],[dir=rtl] *){padding-left:0}.rtl\:sm\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}}@media (min-width: 768px){.rtl\:md\:ml-0:where([dir=rtl],[dir=rtl] *){margin-left:0}.rtl\:md\:mr-4:where([dir=rtl],[dir=rtl] *){margin-right:1rem}.rtl\:md\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}}@media (min-width: 1536px){.rtl\:2xl\:left-\[-10px\]:where([dir=rtl],[dir=rtl] *){left:-10px}}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-cyrillic-ext-wght-normal.DIEz8p5i.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-cyrillic-wght-normal.BmJJXa8e.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-greek-ext-wght-normal.D5AYLNiq.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-greek-wght-normal.DyIDNIyN.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-vietnamese-wght-normal._GQuwPVU.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-latin-ext-wght-normal.CN1pIXkb.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-latin-wght-normal.BgVq2Tq4.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.astro-route-announcer{position:absolute;left:0;top:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;white-space:nowrap;width:1px;height:1px}img{content-visibility:auto} diff --git a/assets/license.DLZnnSui.css b/assets/license.DLZnnSui.css new file mode 100644 index 00000000..6d932a02 --- /dev/null +++ b/assets/license.DLZnnSui.css @@ -0,0 +1 @@ +.hero__inner{margin-left:auto;margin-right:auto;width:1200px;padding:5% 0 0 6%;overflow:hidden}.window{max-width:1168px;border-radius:6px 6px 0 0;box-shadow:0 18px 25px 10px #0003;border:1px solid rgba(0,0,0,.2)}.window__bar{align-items:center;padding:8px 12px;background:linear-gradient(180deg,#efefef,#dadada);border-radius:6px 6px 0 0;border-bottom:1px solid #b4b4b4;box-shadow:inset 0 1px 1px #fffc}.window__bar,.window__dots{display:flex}.window__dots{flex-shrink:0;padding:0 4px 0 2px}.window__dot{margin:0 8px 0 0;width:12px;height:12px;border-radius:50%;box-shadow:inset 0 0 0 1px #0000001a}.window__dot--red{background:#ff6057}.window__dot--orange{background:#ffbd2e}.window__dot--green{background:#27c93f}.window__menuitem{padding:0 4px;height:23px;background:#fff;border-radius:4px;box-shadow:0 1px #00000026}.window__button{flex-shrink:0;margin:0 1px 0 0;line-height:26px}.window__button svg{margin:2px 0 0}.window__button svg path{fill:#00000059}.window__adress{position:relative;display:flex;flex-shrink:1;margin:0 auto;justify-content:center;align-items:center;width:500px;color:#000000e6;font-family:Helvetica Neue,Helvetica;font-size:12px;text-align:center}.window__adress svg{position:absolute;top:1px;right:2px}.window__adress svg path{fill:#0009}.window__content{display:block;background:#1d1d1d}.madefor__bg{position:absolute;top:0;left:0;width:100%;height:80%;background-image:url(/assets//photographers.DsHNW6sB.jpg);background-size:cover;transform:translate3d(0,1.84571px,0)}.shape-divider-bottom{width:100%;overflow:hidden;line-height:0}.shape-divider-bottom svg{position:relative;display:block;width:calc(100% + 1.3px);height:200px}.bg-mix{background-color:#d7f0fe}.dark\:bg-dark-mix:is(.dark *){background-color:#0b7ab0}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--aw-font-sans, ui-sans-serif),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;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;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}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,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--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;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--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;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:start;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6666667em;margin-bottom:1.6666667em;padding-inline-start:1em}.prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;border-radius:.3125rem;padding-top:.2222222em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-inline-start:.4444444em}.prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-inline-end:1.5em;padding-bottom:1em;padding-inline-start:1.5em}.prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;margin-bottom:.6666667em}.prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(.prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg :where(.prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:3.1111111em;margin-bottom:3.1111111em}.prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.75em;padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg :where(.prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(.prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.btn{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn{padding-left:2rem;padding-right:2rem}}.btn-primary{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn-primary:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn-primary:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn-primary:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn-primary:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn-primary{padding-left:2rem;padding-right:2rem}}.btn-primary{border-color:var(--aw-color-primary);background-color:var(--aw-color-primary);font-weight:600;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.btn-primary:hover{border-color:var(--aw-color-secondary);background-color:var(--aw-color-secondary);--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.btn-primary:is(.dark *){border-color:var(--aw-color-primary);background-color:var(--aw-color-primary);--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.btn-primary:hover:is(.dark *){border-color:var(--aw-color-secondary);background-color:var(--aw-color-secondary)}.btn-secondary{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn-secondary:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn-secondary:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn-secondary:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn-secondary:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn-secondary{padding-left:2rem;padding-right:2rem}}.btn-tertiary{display:inline-flex;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));background-color:transparent;padding:.875rem 1.5rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500;line-height:1.375;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,1,1);color:var(--aw-color-text-page)}.btn-tertiary:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.btn-tertiary:focus{--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(2px + 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);--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));--tw-ring-offset-width: 2px;--tw-ring-offset-color: #bfdbfe}.btn-tertiary:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.btn-tertiary:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}@media (min-width: 768px){.btn-tertiary{padding-left:2rem;padding-right:2rem}}.btn-tertiary{border-style:none;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);color:var(--aw-color-text-muted)}.btn-tertiary:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.btn-tertiary:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.btn-tertiary:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.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}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.right-\[-21px\]{right:-21px}.right-\[-5px\]{right:-5px}.top-0{top:0}.top-\[-5px\]{top:-5px}.top-\[19px\]{top:19px}.-z-\[1\]{z-index:-1}.z-40{z-index:40}.z-\[1\]{z-index:1}.col-span-1{grid-column:span 1 / span 1}.col-span-12{grid-column:span 12 / span 12}.col-span-6{grid-column:span 6 / span 6}.-m-4{margin:-1rem}.m-auto{margin:auto}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-mb-6{margin-bottom:-1.5rem}.-ml-1\.5{margin-left:-.375rem}.-ml-2{margin-left:-.5rem}.-mr-1\.5{margin-right:-.375rem}.-mt-0\.5{margin-top:-.125rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0{margin-left:0}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-0{margin-right:0}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-auto{margin-right:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-96{margin-top:24rem}.mt-\[-40px\]{margin-top:-40px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0{height:0px}.h-0\.5{height:.125rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-24{height:6rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-80{height:20rem}.h-96{height:24rem}.h-\[1\.25rem\]{height:1.25rem}.h-\[100px\]{height:100px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-10{max-height:2.5rem}.max-h-12{max-height:3rem}.min-h-full{min-height:100%}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2\/6{width:33.333333%}.w-20{width:5rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-4\/6{width:66.666667%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-\[100px\]{width:100px}.w-\[5\.6rem\]{width:5.6rem}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-\[220px\]{min-width:220px}.min-w-full{min-width:100%}.\!max-w-full{max-width:100%!important}.max-w-10{max-width:2.5rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.basis-1\/2{flex-basis:50%}.border-collapse{border-collapse:collapse}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-75{--tw-scale-x: .75;--tw-scale-y: .75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.scroll-mt-\[72px\]{scroll-margin-top:72px}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.gap-y-8{row-gap:2rem}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.rounded-tr-lg{border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-\[\#ffffff29\]{border-color:#ffffff29}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-gray-50\/0{border-color:#f9fafb00}.border-neutral-200{--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity))}.border-primary{border-color:var(--aw-color-primary)}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-black\/10{background-color:#0000001a}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity))}.bg-neutral-400{--tw-bg-opacity: 1;background-color:rgb(163 163 163 / var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity))}.bg-primary{background-color:var(--aw-color-primary)}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity))}.bg-sky-300{--tw-bg-opacity: 1;background-color:rgb(125 211 252 / var(--tw-bg-opacity))}.bg-sky-400{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity))}.bg-sky-400\/10{background-color:#38bdf81a}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-white\/40{background-color:#fff6}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity))}.bg-\[url\(https\:\/\/img\.shields\.io\/github\/stars\/lycheeorg\/lychee\.svg\?style\=social\&label\=Stars\&maxAge\=86400\)\]{background-image:url(https://img.shields.io/github/stars/lycheeorg/lychee.svg?style=social&label=Stars&maxAge=86400)}.bg-contain{background-size:contain}.fill-sky-100{fill:#e0f2fe}.fill-sky-400{fill:#38bdf8}.fill-sky-50{fill:#f0f9ff}.\!stroke-1{stroke-width:1!important}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-1{padding:.25rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:3rem}.pb-4{padding-bottom:1rem}.pb-8{padding-bottom:2rem}.pb-\[56\.25\%\]{padding-bottom:56.25%}.pl-4{padding-left:1rem}.pr-4{padding-right:1rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.align-super{vertical-align:super}.font-heading{font-family:var(--aw-font-heading, ui-sans-serif),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-9xl{font-size:8rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[2\.6rem\]{font-size:2.6rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-tight{line-height:1.25}.tracking-\[0\.01rem\]{letter-spacing:.01rem}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-default{color:var(--aw-color-text-default)}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity))}.text-neutral-600{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity))}.text-primary{color:var(--aw-color-primary)}.text-secondary{color:var(--aw-color-secondary)}.text-sky-500{--tw-text-opacity: 1;color:rgb(14 165 233 / var(--tw-text-opacity))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.decoration-2{text-decoration-thickness:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_3px_10px_-5px_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 3px 10px -5px rgba(0,0,0,.3);--tw-shadow-colored: 0 3px 10px -5px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_30px_rgba\(0\,0\,0\,0\.1\)\]{--tw-shadow: 0 4px 30px rgba(0,0,0,.1);--tw-shadow-colored: 0 4px 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);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 rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/20{--tw-shadow-color: rgb(0 0 0 / .2);--tw-shadow: var(--tw-shadow-colored)}.drop-shadow-xl{--tw-drop-shadow: drop-shadow(0 20px 13px rgb(0 0 0 / .03)) drop-shadow(0 8px 5px rgb(0 0 0 / .08));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-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}.transition-\[opacity\],.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.bg-page{background-color:var(--aw-color-bg-page)}.bg-dark{background-color:var(--aw-color-bg-page-dark)}.text-muted{color:var(--aw-color-text-muted)}#header.scroll>div:first-child{background-color:var(--aw-color-bg-page)}@media (min-width: 768px){#header.scroll>div:first-child{background-color:#ffffffe6;--tw-backdrop-blur: blur(12px);-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)}}#header.scroll>div:first-child{box-shadow:0 .375rem 1.5rem #8c98a421}.dark #header.scroll>div:first-child,#header.scroll.dark>div:first-child{border-bottom-width:1px;border-color:#6b728033;background-color:var(--aw-color-bg-page)}@media (min-width: 768px){.dark #header.scroll>div:first-child,#header.scroll.dark>div:first-child{background-color:#030621e6}}.dark #header.scroll>div:first-child,#header.scroll.dark>div:first-child{box-shadow:none}#header.expanded nav{position:fixed;top:70px;left:0;right:0;bottom:70px!important;padding:0 5px}.dropdown:focus .dropdown-menu,.dropdown:focus-within .dropdown-menu,.dropdown:hover .dropdown-menu{display:block}[astro-icon].icon-light>*{stroke-width:1.2}[astro-icon].icon-bold>*{stroke-width:2.4}[data-aw-toggle-menu] path{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-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}[data-aw-toggle-menu].expanded g>path:first-child{--tw-translate-y: 15px;--tw-translate-x: -3px;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-aw-toggle-menu].expanded g>path:last-child{--tw-translate-y: -8px;--tw-translate-x: 14px;--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dd *:first-child{margin-top:0}.dark\:prose-invert:is(.dark *){--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}@media (min-width: 1024px){.lg\:prose-xl{font-size:1.25rem;line-height:1.8}.lg\:prose-xl :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em}.lg\:prose-xl :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.lg\:prose-xl :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1.0666667em}.lg\:prose-xl :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.lg\:prose-xl :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.lg\:prose-xl :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.lg\:prose-xl :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.lg\:prose-xl :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.lg\:prose-xl :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;border-radius:.3125rem;padding-top:.25em;padding-inline-end:.4em;padding-bottom:.25em;padding-inline-start:.4em}.lg\:prose-xl :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8611111em}.lg\:prose-xl :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.lg\:prose-xl :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.1111111em;padding-inline-end:1.3333333em;padding-bottom:1.1111111em;padding-inline-start:1.3333333em}.lg\:prose-xl :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em;padding-inline-start:1.6em}.lg\:prose-xl :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;margin-bottom:.6em}.lg\:prose-xl :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8em;margin-bottom:.8em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(.lg\:prose-xl>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}.lg\:prose-xl :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8em;margin-bottom:.8em}.lg\:prose-xl :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em;margin-bottom:1.2em}.lg\:prose-xl :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}.lg\:prose-xl :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;padding-inline-start:1.6em}.lg\:prose-xl :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8em;margin-bottom:2.8em}.lg\:prose-xl :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556}.lg\:prose-xl :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.8888889em;padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}.lg\:prose-xl :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.lg\:prose-xl :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.lg\:prose-xl :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.lg\:prose-xl :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.lg\:prose-xl :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556;margin-top:1em}.lg\:prose-xl :where(.lg\:prose-xl>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.lg\:prose-xl :where(.lg\:prose-xl>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:left-0:before{content:var(--tw-content);left:0}.before\:top-full:before{content:var(--tw-content);top:100%}.before\:z-\[-1\]:before{content:var(--tw-content);z-index:-1}.before\:border-\[3px\]:before{content:var(--tw-content);border-width:3px}.before\:border-b-transparent:before{content:var(--tw-content);border-bottom-color:transparent}.before\:border-l-green-800:before{content:var(--tw-content);--tw-border-opacity: 1;border-left-color:rgb(22 101 52 / var(--tw-border-opacity))}.before\:border-r-transparent:before{content:var(--tw-content);border-right-color:transparent}.before\:border-t-green-800:before{content:var(--tw-content);--tw-border-opacity: 1;border-top-color:rgb(22 101 52 / var(--tw-border-opacity))}.before\:content-\[\'\'\]:before{--tw-content: "";content:var(--tw-content)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:right-0:after{content:var(--tw-content);right:0}.after\:top-full:after{content:var(--tw-content);top:100%}.after\:z-\[-1\]:after{content:var(--tw-content);z-index:-1}.after\:border-\[3px\]:after{content:var(--tw-content);border-width:3px}.after\:border-b-transparent:after{content:var(--tw-content);border-bottom-color:transparent}.after\:border-l-transparent:after{content:var(--tw-content);border-left-color:transparent}.after\:border-r-green-800:after{content:var(--tw-content);--tw-border-opacity: 1;border-right-color:rgb(22 101 52 / var(--tw-border-opacity))}.after\:border-t-green-800:after{content:var(--tw-content);--tw-border-opacity: 1;border-top-color:rgb(22 101 52 / var(--tw-border-opacity))}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.first\:rounded-t:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.last\:rounded-b:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.hover\:text-black:hover{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.hover\:text-primary:hover{color:var(--aw-color-primary)}.hover\:text-sky-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-4:focus{--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)}.focus\:ring-gray-200:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity))}.group.expanded .group-\[\.expanded\]\:-translate-y-2\.5{--tw-translate-y: -.625rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:translate-y-2\.5{--tw-translate-y: .625rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:-rotate-45{--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.expanded .group-\[\.expanded\]\:opacity-0{opacity:0}.prose-headings\:scroll-mt-\[80px\] :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){scroll-margin-top:80px}.prose-headings\:font-heading :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:var(--aw-font-heading, ui-sans-serif),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.prose-headings\:font-bold :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){font-weight:700}.prose-headings\:tracking-tighter :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){letter-spacing:-.05em}.prose-a\:text-blue-600 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.prose-a\:text-primary :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))){color:var(--aw-color-primary)}.prose-li\:my-0 :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *))){margin-top:0;margin-bottom:0}.prose-img\:rounded-md :is(:where(img):not(:where([class~=not-prose],[class~=not-prose] *))){border-radius:.375rem}.prose-img\:shadow-lg :is(:where(img):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (prefers-reduced-motion: no-preference){.motion-safe\:scroll-smooth{scroll-behavior:smooth}}.dark\:border:is(.dark *){border-width:1px}.dark\:border-b:is(.dark *){border-bottom-width:1px}.dark\:border-blue-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity))}.dark\:border-neutral-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity))}.dark\:border-slate-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity))}.dark\:border-slate-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity))}.dark\:border-slate-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity))}.dark\:bg-black:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.dark\:bg-gray-200:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.dark\:bg-green-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.dark\:bg-neutral-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity))}.dark\:bg-neutral-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity))}.dark\:bg-sky-600:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity))}.dark\:bg-sky-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(7 89 133 / var(--tw-bg-opacity))}.dark\:bg-slate-400\/50:is(.dark *){background-color:#94a3b880}.dark\:bg-slate-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity))}.dark\:bg-slate-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}.dark\:bg-slate-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity))}.dark\:bg-transparent:is(.dark *){background-color:transparent}.dark\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.dark\:fill-sky-500:is(.dark *){fill:#0ea5e9}.dark\:fill-sky-800:is(.dark *){fill:#075985}.dark\:fill-sky-950:is(.dark *){fill:#082f49}.dark\:text-blue-200:is(.dark *){--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.dark\:text-neutral-100:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity))}.dark\:text-neutral-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity))}.dark\:text-neutral-400\/50:is(.dark *){color:#a3a3a380}.dark\:text-sky-400:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity))}.dark\:text-slate-200:is(.dark *){--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity))}.dark\:text-slate-300:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.dark\:text-slate-400:is(.dark *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity))}.dark\:text-slate-500:is(.dark *){--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity))}.dark\:text-slate-600:is(.dark *){--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:shadow-\[0_4px_30px_rgba\(0\,0\,0\,0\.1\)\]:is(.dark *){--tw-shadow: 0 4px 30px rgba(0,0,0,.1);--tw-shadow-colored: 0 4px 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.dark\:shadow-none:is(.dark *){--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.dark\:bg-dark:is(.dark *){background-color:var(--aw-color-bg-page-dark)}.dark\:text-muted:is(.dark *){color:var(--aw-color-text-muted)}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.dark\:hover\:text-blue-700:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity))}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.dark\:hover\:text-slate-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:focus\:ring-gray-700:focus:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity))}.dark\:prose-headings\:text-slate-300 :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity))}.dark\:prose-a\:text-blue-400 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity))}@media (min-width: 640px){.sm\:mx-0{margin-left:0;margin-right:0}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mb-0{margin-bottom:0}.sm\:mt-0{margin-top:0}.sm\:mt-1{margin-top:.25rem}.sm\:mt-1\.5{margin-top:.375rem}.sm\:h-16{height:4rem}.sm\:w-1\/2{width:50%}.sm\:w-auto{width:auto}.sm\:max-w-md{max-width:28rem}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-center{justify-content:center}.sm\:gap-8{gap:2rem}.sm\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.sm\:gap-y-8{row-gap:2rem}.sm\:rounded-md{border-radius:.375rem}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:pl-4{padding-left:1rem}.sm\:text-center{text-align:center}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:leading-none{line-height:1}}@media (min-width: 768px){.md\:static{position:static}.md\:absolute{position:absolute}.md\:order-1{order:1}.md\:col-span-3{grid-column:span 3 / span 3}.md\:-mx-4{margin-left:-1rem;margin-right:-1rem}.md\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.md\:-mt-\[76px\]{margin-top:-76px}.md\:mb-0{margin-bottom:0}.md\:mb-12{margin-bottom:3rem}.md\:mb-16{margin-bottom:4rem}.md\:mb-20{margin-bottom:5rem}.md\:mb-8{margin-bottom:2rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:mr-8{margin-right:2rem}.md\:mt-0{margin-top:0}.md\:mt-12{margin-top:3rem}.md\:mt-3{margin-top:.75rem}.md\:mt-\[76px\]{margin-top:76px}.md\:inline-block{display:inline-block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:h-12{height:3rem}.md\:h-5{height:1.25rem}.md\:h-52{height:13rem}.md\:h-64{height:16rem}.md\:h-72{height:18rem}.md\:h-full{height:100%}.md\:w-1\/4{width:25%}.md\:w-12{width:3rem}.md\:w-5{width:1.25rem}.md\:w-auto{width:auto}.md\:min-w-\[200px\]{min-width:200px}.md\:max-w-none{max-width:none}.md\:max-w-sm{max-width:24rem}.md\:basis-1\/2{flex-basis:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-row-reverse{flex-direction:row-reverse}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-start{align-items:flex-start}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:gap-12{gap:3rem}.md\:gap-16{gap:4rem}.md\:gap-6{gap:1.5rem}.md\:gap-8{gap:2rem}.md\:gap-y-12{row-gap:3rem}.md\:gap-y-8{row-gap:2rem}.md\:self-center{align-self:center}.md\:justify-self-end{justify-self:end}.md\:justify-self-center{justify-self:center}.md\:overflow-x-auto{overflow-x:auto}.md\:overflow-y-visible{overflow-y:visible}.md\:border-r{border-right-width:1px}.md\:bg-white\/90{background-color:#ffffffe6}.md\:p-0{padding:0}.md\:p-3{padding:.75rem}.md\:p-6{padding:1.5rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}.md\:py-4{padding-top:1rem;padding-bottom:1rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:pb-16{padding-bottom:4rem}.md\:pb-20{padding-bottom:5rem}.md\:pb-8{padding-bottom:2rem}.md\:pb-\[75\%\]{padding-bottom:75%}.md\:pl-0{padding-left:0}.md\:pr-64{padding-right:16rem}.md\:pt-0{padding-top:0}.md\:pt-4{padding-top:1rem}.md\:pt-\[76px\]{padding-top:76px}.md\:text-left{text-align:left}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.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}.md\:text-\[0\.9375rem\]{font-size:.9375rem}.md\:text-\[1\.3rem\]{font-size:1.3rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}.md\:backdrop-blur-md{--tw-backdrop-blur: blur(12px);-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)}.md\:last\:border-none:last-child{border-style:none}.md\:hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.dark\:md\:border-slate-500:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity))}.dark\:md\:bg-dark:is(.dark *){background-color:var(--aw-color-bg-page-dark)}}@media (min-width: 1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:col-span-4{grid-column:span 4 / span 4}.lg\:m-0{margin:0}.lg\:my-4{margin-top:1rem;margin-bottom:1rem}.lg\:mb-0{margin-bottom:0}.lg\:ml-16{margin-left:4rem}.lg\:mr-16{margin-right:4rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:h-screen{height:100vh}.lg\:w-1\/2{width:50%}.lg\:max-w-2xl{max-width:42rem}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-\[900px\]{max-width:900px}.lg\:max-w-md{max-width:28rem}.lg\:max-w-none{max-width:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-start{justify-content:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-8{gap:2rem}.lg\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.lg\:p-8{padding:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-0{padding-top:0;padding-bottom:0}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pb-\[56\.25\%\]{padding-bottom:56.25%}.lg\:pt-0{padding-top:0}.lg\:text-left{text-align:left}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:text-5xl{font-size:3rem;line-height:1}.lg\:text-base{font-size:1rem;line-height:1.5rem}.lg\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width: 1280px){.xl\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width: 1536px){.\32xl\:right-\[-8px\]{right:-8px}.\32xl\:top-\[-10px\]{top:-10px}.\32xl\:text-\[20px\]{font-size:20px}}.ltr\:ml-auto:where([dir=ltr],[dir=ltr] *){margin-left:auto}.rtl\:left-\[-21px\]:where([dir=rtl],[dir=rtl] *){left:-21px}.rtl\:left-\[-8px\]:where([dir=rtl],[dir=rtl] *){left:-8px}.rtl\:left-auto:where([dir=rtl],[dir=rtl] *){left:auto}.rtl\:right-0:where([dir=rtl],[dir=rtl] *){right:0}.rtl\:right-auto:where([dir=rtl],[dir=rtl] *){right:auto}.rtl\:-ml-1\.5:where([dir=rtl],[dir=rtl] *){margin-left:-.375rem}.rtl\:-mr-1\.5:where([dir=rtl],[dir=rtl] *){margin-right:-.375rem}.rtl\:-mr-2:where([dir=rtl],[dir=rtl] *){margin-right:-.5rem}.rtl\:ml-0:where([dir=rtl],[dir=rtl] *){margin-left:0}.rtl\:ml-0\.5:where([dir=rtl],[dir=rtl] *){margin-left:.125rem}.rtl\:ml-1:where([dir=rtl],[dir=rtl] *){margin-left:.25rem}.rtl\:ml-2:where([dir=rtl],[dir=rtl] *){margin-left:.5rem}.rtl\:ml-4:where([dir=rtl],[dir=rtl] *){margin-left:1rem}.rtl\:ml-5:where([dir=rtl],[dir=rtl] *){margin-left:1.25rem}.rtl\:ml-auto:where([dir=rtl],[dir=rtl] *){margin-left:auto}.rtl\:mr-0:where([dir=rtl],[dir=rtl] *){margin-right:0}.rtl\:mr-0\.5:where([dir=rtl],[dir=rtl] *){margin-right:.125rem}.rtl\:mr-1:where([dir=rtl],[dir=rtl] *){margin-right:.25rem}.rtl\:mr-2:where([dir=rtl],[dir=rtl] *){margin-right:.5rem}.rtl\:mr-3:where([dir=rtl],[dir=rtl] *){margin-right:.75rem}.rtl\:mr-4:where([dir=rtl],[dir=rtl] *){margin-right:1rem}.rtl\:mr-auto:where([dir=rtl],[dir=rtl] *){margin-right:auto}.rtl\:-rotate-45:where([dir=rtl],[dir=rtl] *){--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:pl-0:where([dir=rtl],[dir=rtl] *){padding-left:0}.rtl\:pl-4:where([dir=rtl],[dir=rtl] *){padding-left:1rem}.rtl\:pr-0:where([dir=rtl],[dir=rtl] *){padding-right:0}.rtl\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}.rtl\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}@media (min-width: 640px){.rtl\:sm\:pl-0:where([dir=rtl],[dir=rtl] *){padding-left:0}.rtl\:sm\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}}@media (min-width: 768px){.rtl\:md\:ml-0:where([dir=rtl],[dir=rtl] *){margin-left:0}.rtl\:md\:mr-4:where([dir=rtl],[dir=rtl] *){margin-right:1rem}.rtl\:md\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}}@media (min-width: 1536px){.rtl\:2xl\:left-\[-10px\]:where([dir=rtl],[dir=rtl] *){left:-10px}}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-cyrillic-ext-wght-normal.DIEz8p5i.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-cyrillic-wght-normal.BmJJXa8e.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-greek-ext-wght-normal.D5AYLNiq.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-greek-wght-normal.DyIDNIyN.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-vietnamese-wght-normal._GQuwPVU.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-latin-ext-wght-normal.CN1pIXkb.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets//inter-latin-wght-normal.BgVq2Tq4.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.astro-route-announcer{position:absolute;left:0;top:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;white-space:nowrap;width:1px;height:1px}img{content-visibility:auto} diff --git a/blog/2/index.html b/blog/2/index.html index 4a3f678f..e5620ce2 100644 --- a/blog/2/index.html +++ b/blog/2/index.html @@ -1 +1 @@ -Lychee - Blog — Page 2

Lychee's Blog

Updates regarding Lychee... and other ramblings.
\ No newline at end of file +Lychee - Blog — Page 2

Lychee's Blog

Updates regarding Lychee... and other ramblings.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

\ No newline at end of file diff --git a/blog/3/index.html b/blog/3/index.html index 460beb3b..3736453b 100644 --- a/blog/3/index.html +++ b/blog/3/index.html @@ -1 +1 @@ -Lychee - Blog — Page 3

Lychee's Blog

Updates regarding Lychee... and other ramblings.
\ No newline at end of file +Lychee - Blog — Page 3

Lychee's Blog

Updates regarding Lychee... and other ramblings.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

\ No newline at end of file diff --git a/blog/4/index.html b/blog/4/index.html index c327baeb..8b4f7dac 100644 --- a/blog/4/index.html +++ b/blog/4/index.html @@ -1 +1 @@ -Lychee - Blog — Page 4

Lychee's Blog

Updates regarding Lychee... and other ramblings.
\ No newline at end of file +Lychee - Blog — Page 4

Lychee's Blog

Updates regarding Lychee... and other ramblings.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

\ No newline at end of file diff --git a/blog/5/index.html b/blog/5/index.html index 51eb96dc..c359ac25 100644 --- a/blog/5/index.html +++ b/blog/5/index.html @@ -1 +1 @@ -Lychee - Blog — Page 5

Lychee's Blog

Updates regarding Lychee... and other ramblings.
\ No newline at end of file +Lychee - Blog — Page 5

Lychee's Blog

Updates regarding Lychee... and other ramblings.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

\ No newline at end of file diff --git a/blog/index.html b/blog/index.html index 00adedb7..78e18109 100644 --- a/blog/index.html +++ b/blog/index.html @@ -1 +1 @@ -Lychee - Blog

Lychee's Blog

Updates regarding Lychee... and other ramblings.
\ No newline at end of file +Lychee - Blog

Lychee's Blog

Updates regarding Lychee... and other ramblings.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

\ No newline at end of file diff --git a/category/active-development/2/index.html b/category/active-development/2/index.html index 24a740e2..6cd81205 100644 --- a/category/active-development/2/index.html +++ b/category/active-development/2/index.html @@ -1 +1 @@ -Lychee - Category 'Active Development' — Page 2

Active Development

\ No newline at end of file +Lychee - Category 'Active Development' — Page 2

Active Development

\ No newline at end of file diff --git a/category/active-development/3/index.html b/category/active-development/3/index.html index 7c9202dd..6821e328 100644 --- a/category/active-development/3/index.html +++ b/category/active-development/3/index.html @@ -1 +1 @@ -Lychee - Category 'Active Development' — Page 3

Active Development

\ No newline at end of file +Lychee - Category 'Active Development' — Page 3

Active Development

\ No newline at end of file diff --git a/category/active-development/4/index.html b/category/active-development/4/index.html index b165670f..5d9db0d5 100644 --- a/category/active-development/4/index.html +++ b/category/active-development/4/index.html @@ -1 +1 @@ -Lychee - Category 'Active Development' — Page 4

Active Development

\ No newline at end of file +Lychee - Category 'Active Development' — Page 4

Active Development

\ No newline at end of file diff --git a/category/active-development/index.html b/category/active-development/index.html index 4131cb2c..f211e15a 100644 --- a/category/active-development/index.html +++ b/category/active-development/index.html @@ -1 +1 @@ -Lychee - Category 'Active Development'

Active Development

\ No newline at end of file +Lychee - Category 'Active Development'

Active Development

\ No newline at end of file diff --git a/category/api-documentation/index.html b/category/api-documentation/index.html index 9d085ca8..80b0bb7c 100644 --- a/category/api-documentation/index.html +++ b/category/api-documentation/index.html @@ -1 +1 @@ -Lychee - Category 'Api Documentation'

Api Documentation

\ No newline at end of file +Lychee - Category 'Api Documentation'

Api Documentation

\ No newline at end of file diff --git a/category/future/index.html b/category/future/index.html index 05e2d212..c0c80e98 100644 --- a/category/future/index.html +++ b/category/future/index.html @@ -1 +1 @@ -Lychee - Category 'Future'

Future

\ No newline at end of file +Lychee - Category 'Future'

Future

\ No newline at end of file diff --git a/category/livewire/index.html b/category/livewire/index.html index ddaa57d2..f9a0a1f5 100644 --- a/category/livewire/index.html +++ b/category/livewire/index.html @@ -1 +1 @@ -Lychee - Category 'Livewire'

Livewire

\ No newline at end of file +Lychee - Category 'Livewire'

Livewire

\ No newline at end of file diff --git a/get-supporter-edition/index.html b/get-supporter-edition/index.html index 9712db5e..00610700 100644 --- a/get-supporter-edition/index.html +++ b/get-supporter-edition/index.html @@ -1 +1 @@ -Lychee - Pre-Launch Landing Page

Coming Soon...

Lychee SE

Unlock the full capabilities of Lychee with the Supporter Edition.
Get exclusive features and support the development of Lychee.

Free

Optimal choice for personal use.

Free
  • Unlimited users.
  • Unlimited albums.
  • Unlimited photos upload.
popular

Supporter Edition

Optimal choice if you would like to support the development of Lychee.

5
Per Month
  • Unlimited users.
  • Unlimited albums.
  • Unlimited photos upload.
  • Statistics on your library.
  • more to come...

the essentials and a few more

Full comparison

FeaturesFreeLychee SE
Global
Dark and Light themes
Unlimited photos upload
Unlimited number of albums
Unlimited number of users
Multiple language supported
Photo management
Full sizes and other variants
Auto rotation on import
Exif Data decoding
Localization data reverse search
Upload by chunks
Zip & download
Album management
Smart albums
Unlimited photos per album
Possibility to create an album within another album
Zip & download
Custom sorting per album
Justified/Masonry/Square photo layout
Photo layout customizable per album
Selectable hero header photo per album
Slideshow with previous & next
User management
Login with WebAuthn and Oauth
Access rights management
Cross-user Album sharing
Space usage per user
Upload Quota per user
Administration
Logs
Maintenance page
Diagnostics tools
Full Manual settings control
Statistics on your installation

FAQs

With the new Lychee SE coming soon, we understand that you must have some questions. We try to answer some of them here.

What is the difference between the Free and Supporter Edition?

The Free Edition is a great choice for personal use, offering unlimited albums, users, and photo uploads.
Lychee SE includes all the features of the Free Edition, plus some exclusive features as a thank-you for supporting the development of Lychee.

I am running an old version of Lychee and I want to upgrade to version 6.
Will I be losing features if I do not use the Supporter Edition?

No. The version 6 of Lychee is pretty much the same as version 5 but with a different front-end. It is faster, more fluid, more reactive, and less buggy. The Free version 6 has not been crippled to incentivise you to upgrade to Lychee SE. We are not in that kind of mindset. We want you to use Lychee, and we want you to be happy with it.

Is there a trial period for the Supporter Edition?

Unfortunately, we do not offer trial periods nor refunds. For this reason we recommend that you try the Free Edition first to see if Lychee fits your needs as it already comes packed with a lot of features.

How do I register my Supporter Edition?

Once you support us, you will get a personal license key that you can use in your Lychee instance to unlock the exclusive features.

Is there a limit on the number of Lychee instances I can use my license key on?

No. You can use your personal license key on as many instances of Lychee as you have.

I want to contribute to Lychee, where does my code fall between the Free and the Supporter Edition?

That is a good question, and it really boils down to what you are adding/modifying. Our general rule of thumb is that:

  • if you are adding a new feature to Lychee that is not already part of the core, we will include it in the Free Edition.
  • If you are improving a feature that is part of the Free Edition, that improvement will be included in the Free Edition.
  • If you are improving a feature that is part of Lychee SE, that feature will have to stay in Lychee SE.

It is as simple as that and any other way would not be fair to our users.

Is there a different code license between the Free and the Supporter Edition?

No. The license is the same for both editions: the MIT license. Lychee remains fully Open Source. And as crazy at it sounds, the code of the Supporter Edition is fully available on GitHub.

\ No newline at end of file +Lychee - Pre-Launch Landing Page

Coming Soon...

Lychee SE

Unlock the full capabilities of Lychee with the Supporter Edition.
Get exclusive features and support the development of Lychee.

Free

Optimal choice for personal use.

Free
  • Unlimited users.
  • Unlimited albums.
  • Unlimited photos upload.
popular

Supporter Edition

Optimal choice if you would like to support the development of Lychee.

5
Per Month
  • Unlimited users.
  • Unlimited albums.
  • Unlimited photos upload.
  • Statistics on your library.
  • Upload quota per user.
  • more to come...

the essentials and a few more

Full comparison

FeaturesFreeLychee SE
Global
Dark and Light themesv6
Unlimited photos upload
Unlimited number of albums
Unlimited number of users
Mutliple language supported
Photo management
Full sizes and other variants
Auto rotation on import
Exif Data decoding
GPS data localization
Upload by chunksv6
Zip & download
Album management
Smart albums
Unlimited photos per album
Albums within albums
Zip & download
Custom sorting per album
Justified/Masonry/Square photo layouts
Photo layout custom per album
Thumbs album aspect-ratio custom per album
Customizable Album covers
Customizable Album header photo
Slideshow with previous & nextv6
User management
Login with WebAuthn and Oauth
Access rights management per album
Cross-user sharing
Space usage per userv6
Upload quota per userv6
Admin note per userv6
Modules
Landing page
Map view
RSS Feed
Sensitive albums
Basic search functions
Frame display
Administration
Logs
Maintenance page
Diagnostics tools
Full manual settings control
Statistics on your installation v6

FAQs

With the new Lychee SE coming soon, we understand that you must have some questions. We try to answer some of them here.

What is the difference between the Free and Supporter Edition?

The Free Edition is a great choice for personal use, offering unlimited albums, users, and photo uploads.
Lychee SE includes all the features of the Free Edition, plus some exclusive features as a thank-you for supporting the development of Lychee.

I am running an old version of Lychee and I want to upgrade to version 6.
Will I be losing features if I do not use the Supporter Edition?

No. The version 6 of Lychee is pretty much the same as version 5 but with a different front-end. It is faster, more fluid, more reactive, and less buggy. The Free version 6 has not been crippled to incentivise you to upgrade to Lychee SE. We are not in that kind of mindset. We want you to use Lychee, and we want you to be happy with it.

Is there a trial period for the Supporter Edition?

Unfortunately, we do not offer trial periods nor refunds. For this reason we recommend that you try the Free Edition first to see if Lychee fits your needs as it already comes packed with a lot of features.

How do I get the Supporter Edition? How do I register it?

Once you support us via GitHub, you will get a personal license key that you can use in your Lychee instance to unlock the exclusive features. If you support us directly via Open Collective, please contact us by mail or via discord to get your personal license key.

Once you have your license key, just go into the Left menu, open the About Lychee dialog, and enter your license key in the dedicated field.

Is there a limit on the number of Lychee instances I can use my license key on?

No. You can use your personal license key on as many instances of Lychee as you have.

I want to contribute to Lychee, where does my code fall between the Free and the Supporter Edition?

That is a good question, and it really boils down to what you are adding/modifying. Our general rule of thumb is that:

  • if you are adding a new feature to Lychee that is not already part of the core, we will include it in the Free Edition.
  • If you are improving a feature that is part of the Free Edition, that improvement will be included in the Free Edition.
  • If you are improving a feature that is part of Lychee SE, that feature will have to stay in Lychee SE.

It is as simple as that and any other way would not be fair to our users.

Is there a different code license between the Free and the Supporter Edition?

No. The license is the same for both editions: the MIT license. Lychee remains fully Open Source. And as crazy at it sounds, the code of the Supporter Edition is fully available on GitHub.

\ No newline at end of file diff --git a/index.html b/index.html index de2e3b3c..e6657d82 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -LycheeOrg — Self-hosted photo-management done right.

Self-hosted photo-management done right.

Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.

Manage

Managing your photos has never been easier. Upload, move, rename, describe, delete or search your photos in seconds. All in one place, right from your browser.

Share

Sharing like it should be. One click and every photo and album is ready for the public. You can also protect albums with passwords if you want. It's under your control.

View

Look at all your images in full-screen mode, navigate forward and backward by using your keyboard or let others enjoy your photos by making them public.

Upload your photos or create new albums.

See all the information from your photo

Batch selection with Desktop-like multi-select

Share your albums or photos with your favourite service.

Open

Lychee is completely open-source. Everyone can take advantage of the work we have already done and improve it. We are open for every suggestion or help.

Secure

Your server, your data, your rules. Never depend on someone else. Lychee is a self-hosted solution, so you are in the full control of your photos.

Beautiful

Our goal was to create a web app everyone can use. Lychee works intuitive and comes with a stunning, beautiful interface.

Made for Photographers,
by Photographers.

Lychee is the perfect place to store all your photos. No storage limit, no compression, no loss in data. We even support and display your EXIF and IPTC Metadata. And if you want, you can make your photos public for your audience. With just one click.

EXIF

Get the most out of our photos. Lychee supports EXIF and IPTC Metadata. Always available one click away. Clearly listed next to all other information.

Import

Import your photos from various sources. From you local computer, server, via URL or even from your Dropbox.

Tag

Never lose one of your photos in the depth of your albums. Tag them or mark them as important. Every single photo or all selected photos at once.

25K
Downloads
3.3K
Stars
297
Forks
3.4M
Docker pulls

Lychee on Docker

Deploy in a matter of seconds with our docker-compose file.

\ No newline at end of file +LycheeOrg — Self-hosted photo-management done right.

Self-hosted photo-management done right.

Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.

Manage

Managing your photos has never been easier. Upload, move, rename, describe, delete or search your photos in seconds. All in one place, right from your browser.

Share

Sharing like it should be. One click and every photo and album is ready for the public. You can also protect albums with passwords if you want. It's under your control.

View

Look at all your images in full-screen mode, navigate forward and backward by using your keyboard or let others enjoy your photos by making them public.

Upload your photos or create new albums.

See all the information from your photo

Batch selection with Desktop-like multi-select

Share your albums or photos with your favourite service.

Open

Lychee is completely open-source. Everyone can take advantage of the work we have already done and improve it. We are open for every suggestion or help.

Secure

Your server, your data, your rules. Never depend on someone else. Lychee is a self-hosted solution, so you are in the full control of your photos.

Beautiful

Our goal was to create a web app everyone can use. Lychee works intuitive and comes with a stunning, beautiful interface.

Made for Photographers,
by Photographers.

Lychee is the perfect place to store all your photos. No storage limit, no compression, no loss in data. We even support and display your EXIF and IPTC Metadata. And if you want, you can make your photos public for your audience. With just one click.

EXIF

Get the most out of our photos. Lychee supports EXIF and IPTC Metadata. Always available one click away. Clearly listed next to all other information.

Import

Import your photos from various sources. From you local computer, server, via URL or even from your Dropbox.

Tag

Never lose one of your photos in the depth of your albums. Tag them or mark them as important. Every single photo or all selected photos at once.

25K
Downloads
3.3K
Stars
297
Forks
3.4M
Docker pulls

Lychee on Docker

Deploy in a matter of seconds with our docker-compose file.

\ No newline at end of file diff --git a/license/index.html b/license/index.html index 480eccae..04756775 100644 --- a/license/index.html +++ b/license/index.html @@ -1 +1 @@ -Lychee - License

License

The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

\ No newline at end of file +Lychee - License

License

The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

\ No newline at end of file diff --git a/rss.xml b/rss.xml index 3ded41bb..ca40c799 100644 --- a/rss.xml +++ b/rss.xml @@ -1 +1 @@ -Lychee BlogLychee is a free photo-management tool, which runs on your server or web-space. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.https://lycheeorg.github.ioBite-size v6: Updates and timelineshttps://lycheeorg.github.io/2024-10-07-v6-beta2https://lycheeorg.github.io/2024-10-07-v6-beta2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 13 Oct 2024 21:46:00 GMTBite-size v6: Beta is Live!https://lycheeorg.github.io/2024-10-05-v6-betahttps://lycheeorg.github.io/2024-10-05-v6-betaBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 05 Oct 2024 20:00:00 GMTBite-size v6: Header fixeshttps://lycheeorg.github.io/2024-09-30-v6-headerhttps://lycheeorg.github.io/2024-09-30-v6-headerBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 30 Sep 2024 22:44:00 GMTBite-size v6: Second Alpha!https://lycheeorg.github.io/2024-09-29-v6-alphahttps://lycheeorg.github.io/2024-09-29-v6-alphaBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 29 Sep 2024 23:02:00 GMTBite-size v6: Map implementationhttps://lycheeorg.github.io/2024-09-25-v6-maphttps://lycheeorg.github.io/2024-09-25-v6-mapBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 25 Sep 2024 10:28:00 GMTBite-size v6: Frame Mode and Sharinghttps://lycheeorg.github.io/2024-09-24-v6-framehttps://lycheeorg.github.io/2024-09-24-v6-frameBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 24 Sep 2024 19:44:00 GMTAbout Lychee API documentationhttps://lycheeorg.github.io/2024-09-24-v6-scramblehttps://lycheeorg.github.io/2024-09-24-v6-scrambleWith v6 at the horizon, we had to drop the support of Scramble, a library responsible for automated API documentation. We explain here the reasons which motivated such choice.Tue, 24 Sep 2024 08:00:00 GMTBite-size v6: Oauth authenticationhttps://lycheeorg.github.io/2024-09-24-v6-oauthhttps://lycheeorg.github.io/2024-09-24-v6-oauthBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 24 Sep 2024 07:44:00 GMTBite-size v6: Context menus, WebAuthn and morehttps://lycheeorg.github.io/2024-09-23-v6-multiplehttps://lycheeorg.github.io/2024-09-23-v6-multipleBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 23 Sep 2024 09:26:00 GMTBite-size v6: Photo selection and context menushttps://lycheeorg.github.io/2024-09-15-v6-menushttps://lycheeorg.github.io/2024-09-15-v6-menusBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 15 Sep 2024 19:43:00 GMTBite-size v6: Settings and coveragehttps://lycheeorg.github.io/2024-09-14-v6-settingshttps://lycheeorg.github.io/2024-09-14-v6-settingsBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 14 Sep 2024 23:59:00 GMTBite-size v6: Keybindings helphttps://lycheeorg.github.io/2024-08-31-v6-helphttps://lycheeorg.github.io/2024-08-31-v6-helpBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 31 Aug 2024 12:31:00 GMTBite-size v6: Edit photoshttps://lycheeorg.github.io/2024-08-27-v6-edit-photohttps://lycheeorg.github.io/2024-08-27-v6-edit-photoBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 27 Aug 2024 16:48:00 GMTBite-size v6: Link in Landing and Server Importhttps://lycheeorg.github.io/2024-08-18-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-18-v6-upload-dialogBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 18 Aug 2024 23:48:00 GMTBite-size v6: Upload dialoghttps://lycheeorg.github.io/2024-08-17-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-17-v6-upload-dialogBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 17 Aug 2024 16:48:00 GMTBite-size v6: Share Album panelhttps://lycheeorg.github.io/2024-08-14-v6-share-album-panelhttps://lycheeorg.github.io/2024-08-14-v6-share-album-panelBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 14 Aug 2024 11:05:00 GMTBite-size v6: Transfer Album panelhttps://lycheeorg.github.io/2024-08-11-v6-transfer-album-panelhttps://lycheeorg.github.io/2024-08-11-v6-transfer-album-panelBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 11 Aug 2024 18:00:00 GMTBite-size v6: Move Album panelhttps://lycheeorg.github.io/2024-08-10-v6-move-album-panelhttps://lycheeorg.github.io/2024-08-10-v6-move-album-panelBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 10 Aug 2024 16:15:00 GMTBite-size v6: Light modehttps://lycheeorg.github.io/2024-08-09-v6-light-modehttps://lycheeorg.github.io/2024-08-09-v6-light-modeBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 09 Aug 2024 23:57:00 GMTBite-size v6: Maintenancehttps://lycheeorg.github.io/2024-08-08-v6-maintenancehttps://lycheeorg.github.io/2024-08-08-v6-maintenanceBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Thu, 08 Aug 2024 21:57:00 GMTBite-size v6: Jobshttps://lycheeorg.github.io/2024-08-05-v6-jobshttps://lycheeorg.github.io/2024-08-05-v6-jobsBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 05 Aug 2024 21:57:00 GMTBite-size v6: Diagnosticshttps://lycheeorg.github.io/2024-08-04-v6-diagnosticshttps://lycheeorg.github.io/2024-08-04-v6-diagnosticsBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 04 Aug 2024 21:07:00 GMTBite-size v6: User managementhttps://lycheeorg.github.io/2024-08-03-v6-usershttps://lycheeorg.github.io/2024-08-03-v6-usersBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 03 Aug 2024 18:46:00 GMTBite-size v6: settings - 4https://lycheeorg.github.io/2024-08-02-v6-settings-4https://lycheeorg.github.io/2024-08-02-v6-settings-4Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 02 Aug 2024 23:52:00 GMTBite-size v6: settings - 3https://lycheeorg.github.io/2024-07-30-v6-settings-3https://lycheeorg.github.io/2024-07-30-v6-settings-3Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 30 Jul 2024 22:22:00 GMTBite-size v6: settings - 2https://lycheeorg.github.io/2024-07-29-v6-settings-2https://lycheeorg.github.io/2024-07-29-v6-settings-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 29 Jul 2024 22:22:00 GMTBite-size v6: settings - 1https://lycheeorg.github.io/2024-07-28-v6-settings-1https://lycheeorg.github.io/2024-07-28-v6-settings-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 28 Jul 2024 22:22:00 GMTBite-size v6: profile - 2https://lycheeorg.github.io/2024-07-26-v6-profile-2https://lycheeorg.github.io/2024-07-26-v6-profile-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 26 Jul 2024 22:22:00 GMTBite-size v6: profile - 1https://lycheeorg.github.io/2024-07-24-v6-profile-1https://lycheeorg.github.io/2024-07-24-v6-profile-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 24 Jul 2024 22:22:00 GMTBite-size v6: tests - 3https://lycheeorg.github.io/2024-07-23-v6-tests-3https://lycheeorg.github.io/2024-07-23-v6-tests-3Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 23 Jul 2024 22:22:00 GMTBite-size v6: tests - 2https://lycheeorg.github.io/2024-07-21-v6-tests-2https://lycheeorg.github.io/2024-07-21-v6-tests-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 21 Jul 2024 22:22:00 GMTBite-size v6: tests - 1https://lycheeorg.github.io/2024-07-18-v6-tests-1https://lycheeorg.github.io/2024-07-18-v6-tests-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Thu, 18 Jul 2024 22:22:00 GMTBite-size v6: album - 2https://lycheeorg.github.io/2024-07-17-v6-album-2https://lycheeorg.github.io/2024-07-17-v6-album-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 17 Jul 2024 22:22:00 GMTBite-size v6: album - 1https://lycheeorg.github.io/2024-07-16-v6-album-1https://lycheeorg.github.io/2024-07-16-v6-album-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 14 Jul 2024 22:22:00 GMTBite-size v6: gallery - 4https://lycheeorg.github.io/2024-07-13-v6-gallery-4https://lycheeorg.github.io/2024-07-13-v6-gallery-4Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 13 Jul 2024 22:22:00 GMTBite-size v6: gallery - 3https://lycheeorg.github.io/2024-07-12-v6-gallery-3https://lycheeorg.github.io/2024-07-12-v6-gallery-3Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 12 Jul 2024 22:22:00 GMTBite-size v6: gallery - 2https://lycheeorg.github.io/2024-07-09-v6-gallery-2https://lycheeorg.github.io/2024-07-09-v6-gallery-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 09 Jul 2024 22:22:00 GMTBite-size v6: gallery - 1https://lycheeorg.github.io/2024-07-07-v6-gallery-1https://lycheeorg.github.io/2024-07-07-v6-gallery-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 07 Jul 2024 22:22:00 GMTBite-size v6: About and galleryhttps://lycheeorg.github.io/2024-07-06-v6-abouthttps://lycheeorg.github.io/2024-07-06-v6-aboutBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 06 Jul 2024 22:22:00 GMTBite-size v6: Landing page and left menuhttps://lycheeorg.github.io/2024-07-02-v6-landing-pagehttps://lycheeorg.github.io/2024-07-02-v6-landing-pageBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 02 Jul 2024 22:22:00 GMTThe future of Lychee: what is coming next. 🚀https://lycheeorg.github.io/2024-06-29-future-of-lycheehttps://lycheeorg.github.io/2024-06-29-future-of-lycheeWhat is coming for Lychee? Where are we? What are we looking forward to?Sat, 29 Jun 2024 22:42:00 GMTLivewire performances problems 📉https://lycheeorg.github.io/2024-06-25-performance-problemshttps://lycheeorg.github.io/2024-06-25-performance-problemsA look back on Server-Side rendering performance with Livewire in Lychee v5.Tue, 25 Jun 2024 17:57:00 GMT \ No newline at end of file +Lychee BlogLychee is a free photo-management tool, which runs on your server or web-space. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.https://lycheeorg.github.ioBite-size v6: Beta.2 is Live!https://lycheeorg.github.io/2024-10-14-v6-beta3https://lycheeorg.github.io/2024-10-14-v6-beta3Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 15 Oct 2024 18:00:00 GMTBite-size v6: Updates and timelineshttps://lycheeorg.github.io/2024-10-07-v6-beta2https://lycheeorg.github.io/2024-10-07-v6-beta2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 13 Oct 2024 21:46:00 GMTBite-size v6: Beta is Live!https://lycheeorg.github.io/2024-10-05-v6-betahttps://lycheeorg.github.io/2024-10-05-v6-betaBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 05 Oct 2024 20:00:00 GMTBite-size v6: Header fixeshttps://lycheeorg.github.io/2024-09-30-v6-headerhttps://lycheeorg.github.io/2024-09-30-v6-headerBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 30 Sep 2024 22:44:00 GMTBite-size v6: Second Alpha!https://lycheeorg.github.io/2024-09-29-v6-alphahttps://lycheeorg.github.io/2024-09-29-v6-alphaBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 29 Sep 2024 23:02:00 GMTBite-size v6: Map implementationhttps://lycheeorg.github.io/2024-09-25-v6-maphttps://lycheeorg.github.io/2024-09-25-v6-mapBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 25 Sep 2024 10:28:00 GMTBite-size v6: Frame Mode and Sharinghttps://lycheeorg.github.io/2024-09-24-v6-framehttps://lycheeorg.github.io/2024-09-24-v6-frameBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 24 Sep 2024 19:44:00 GMTAbout Lychee API documentationhttps://lycheeorg.github.io/2024-09-24-v6-scramblehttps://lycheeorg.github.io/2024-09-24-v6-scrambleWith v6 at the horizon, we had to drop the support of Scramble, a library responsible for automated API documentation. We explain here the reasons which motivated such choice.Tue, 24 Sep 2024 08:00:00 GMTBite-size v6: Oauth authenticationhttps://lycheeorg.github.io/2024-09-24-v6-oauthhttps://lycheeorg.github.io/2024-09-24-v6-oauthBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 24 Sep 2024 07:44:00 GMTBite-size v6: Context menus, WebAuthn and morehttps://lycheeorg.github.io/2024-09-23-v6-multiplehttps://lycheeorg.github.io/2024-09-23-v6-multipleBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 23 Sep 2024 09:26:00 GMTBite-size v6: Photo selection and context menushttps://lycheeorg.github.io/2024-09-15-v6-menushttps://lycheeorg.github.io/2024-09-15-v6-menusBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 15 Sep 2024 19:43:00 GMTBite-size v6: Settings and coveragehttps://lycheeorg.github.io/2024-09-14-v6-settingshttps://lycheeorg.github.io/2024-09-14-v6-settingsBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 14 Sep 2024 23:59:00 GMTBite-size v6: Keybindings helphttps://lycheeorg.github.io/2024-08-31-v6-helphttps://lycheeorg.github.io/2024-08-31-v6-helpBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 31 Aug 2024 12:31:00 GMTBite-size v6: Edit photoshttps://lycheeorg.github.io/2024-08-27-v6-edit-photohttps://lycheeorg.github.io/2024-08-27-v6-edit-photoBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 27 Aug 2024 16:48:00 GMTBite-size v6: Link in Landing and Server Importhttps://lycheeorg.github.io/2024-08-18-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-18-v6-upload-dialogBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 18 Aug 2024 23:48:00 GMTBite-size v6: Upload dialoghttps://lycheeorg.github.io/2024-08-17-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-17-v6-upload-dialogBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 17 Aug 2024 16:48:00 GMTBite-size v6: Share Album panelhttps://lycheeorg.github.io/2024-08-14-v6-share-album-panelhttps://lycheeorg.github.io/2024-08-14-v6-share-album-panelBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 14 Aug 2024 11:05:00 GMTBite-size v6: Transfer Album panelhttps://lycheeorg.github.io/2024-08-11-v6-transfer-album-panelhttps://lycheeorg.github.io/2024-08-11-v6-transfer-album-panelBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 11 Aug 2024 18:00:00 GMTBite-size v6: Move Album panelhttps://lycheeorg.github.io/2024-08-10-v6-move-album-panelhttps://lycheeorg.github.io/2024-08-10-v6-move-album-panelBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 10 Aug 2024 16:15:00 GMTBite-size v6: Light modehttps://lycheeorg.github.io/2024-08-09-v6-light-modehttps://lycheeorg.github.io/2024-08-09-v6-light-modeBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 09 Aug 2024 23:57:00 GMTBite-size v6: Maintenancehttps://lycheeorg.github.io/2024-08-08-v6-maintenancehttps://lycheeorg.github.io/2024-08-08-v6-maintenanceBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Thu, 08 Aug 2024 21:57:00 GMTBite-size v6: Jobshttps://lycheeorg.github.io/2024-08-05-v6-jobshttps://lycheeorg.github.io/2024-08-05-v6-jobsBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 05 Aug 2024 21:57:00 GMTBite-size v6: Diagnosticshttps://lycheeorg.github.io/2024-08-04-v6-diagnosticshttps://lycheeorg.github.io/2024-08-04-v6-diagnosticsBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 04 Aug 2024 21:07:00 GMTBite-size v6: User managementhttps://lycheeorg.github.io/2024-08-03-v6-usershttps://lycheeorg.github.io/2024-08-03-v6-usersBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 03 Aug 2024 18:46:00 GMTBite-size v6: settings - 4https://lycheeorg.github.io/2024-08-02-v6-settings-4https://lycheeorg.github.io/2024-08-02-v6-settings-4Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 02 Aug 2024 23:52:00 GMTBite-size v6: settings - 3https://lycheeorg.github.io/2024-07-30-v6-settings-3https://lycheeorg.github.io/2024-07-30-v6-settings-3Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 30 Jul 2024 22:22:00 GMTBite-size v6: settings - 2https://lycheeorg.github.io/2024-07-29-v6-settings-2https://lycheeorg.github.io/2024-07-29-v6-settings-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Mon, 29 Jul 2024 22:22:00 GMTBite-size v6: settings - 1https://lycheeorg.github.io/2024-07-28-v6-settings-1https://lycheeorg.github.io/2024-07-28-v6-settings-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 28 Jul 2024 22:22:00 GMTBite-size v6: profile - 2https://lycheeorg.github.io/2024-07-26-v6-profile-2https://lycheeorg.github.io/2024-07-26-v6-profile-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 26 Jul 2024 22:22:00 GMTBite-size v6: profile - 1https://lycheeorg.github.io/2024-07-24-v6-profile-1https://lycheeorg.github.io/2024-07-24-v6-profile-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 24 Jul 2024 22:22:00 GMTBite-size v6: tests - 3https://lycheeorg.github.io/2024-07-23-v6-tests-3https://lycheeorg.github.io/2024-07-23-v6-tests-3Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 23 Jul 2024 22:22:00 GMTBite-size v6: tests - 2https://lycheeorg.github.io/2024-07-21-v6-tests-2https://lycheeorg.github.io/2024-07-21-v6-tests-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 21 Jul 2024 22:22:00 GMTBite-size v6: tests - 1https://lycheeorg.github.io/2024-07-18-v6-tests-1https://lycheeorg.github.io/2024-07-18-v6-tests-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Thu, 18 Jul 2024 22:22:00 GMTBite-size v6: album - 2https://lycheeorg.github.io/2024-07-17-v6-album-2https://lycheeorg.github.io/2024-07-17-v6-album-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Wed, 17 Jul 2024 22:22:00 GMTBite-size v6: album - 1https://lycheeorg.github.io/2024-07-16-v6-album-1https://lycheeorg.github.io/2024-07-16-v6-album-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 14 Jul 2024 22:22:00 GMTBite-size v6: gallery - 4https://lycheeorg.github.io/2024-07-13-v6-gallery-4https://lycheeorg.github.io/2024-07-13-v6-gallery-4Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 13 Jul 2024 22:22:00 GMTBite-size v6: gallery - 3https://lycheeorg.github.io/2024-07-12-v6-gallery-3https://lycheeorg.github.io/2024-07-12-v6-gallery-3Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Fri, 12 Jul 2024 22:22:00 GMTBite-size v6: gallery - 2https://lycheeorg.github.io/2024-07-09-v6-gallery-2https://lycheeorg.github.io/2024-07-09-v6-gallery-2Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 09 Jul 2024 22:22:00 GMTBite-size v6: gallery - 1https://lycheeorg.github.io/2024-07-07-v6-gallery-1https://lycheeorg.github.io/2024-07-07-v6-gallery-1Bite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sun, 07 Jul 2024 22:22:00 GMTBite-size v6: About and galleryhttps://lycheeorg.github.io/2024-07-06-v6-abouthttps://lycheeorg.github.io/2024-07-06-v6-aboutBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Sat, 06 Jul 2024 22:22:00 GMTBite-size v6: Landing page and left menuhttps://lycheeorg.github.io/2024-07-02-v6-landing-pagehttps://lycheeorg.github.io/2024-07-02-v6-landing-pageBite-size v6 is a series of small post showing the progress made on the development of the future version of Lychee.Tue, 02 Jul 2024 22:22:00 GMTThe future of Lychee: what is coming next. 🚀https://lycheeorg.github.io/2024-06-29-future-of-lycheehttps://lycheeorg.github.io/2024-06-29-future-of-lycheeWhat is coming for Lychee? Where are we? What are we looking forward to?Sat, 29 Jun 2024 22:42:00 GMTLivewire performances problems 📉https://lycheeorg.github.io/2024-06-25-performance-problemshttps://lycheeorg.github.io/2024-06-25-performance-problemsA look back on Server-Side rendering performance with Livewire in Lychee v5.Tue, 25 Jun 2024 17:57:00 GMT \ No newline at end of file diff --git a/sitemap-0.xml b/sitemap-0.xml index 44313724..242844c5 100644 --- a/sitemap-0.xml +++ b/sitemap-0.xml @@ -1 +1 @@ -https://lycheeorg.github.iohttps://lycheeorg.github.io/2024-06-25-performance-problemshttps://lycheeorg.github.io/2024-06-29-future-of-lycheehttps://lycheeorg.github.io/2024-07-02-v6-landing-pagehttps://lycheeorg.github.io/2024-07-06-v6-abouthttps://lycheeorg.github.io/2024-07-07-v6-gallery-1https://lycheeorg.github.io/2024-07-09-v6-gallery-2https://lycheeorg.github.io/2024-07-12-v6-gallery-3https://lycheeorg.github.io/2024-07-13-v6-gallery-4https://lycheeorg.github.io/2024-07-16-v6-album-1https://lycheeorg.github.io/2024-07-17-v6-album-2https://lycheeorg.github.io/2024-07-18-v6-tests-1https://lycheeorg.github.io/2024-07-21-v6-tests-2https://lycheeorg.github.io/2024-07-23-v6-tests-3https://lycheeorg.github.io/2024-07-24-v6-profile-1https://lycheeorg.github.io/2024-07-26-v6-profile-2https://lycheeorg.github.io/2024-07-28-v6-settings-1https://lycheeorg.github.io/2024-07-29-v6-settings-2https://lycheeorg.github.io/2024-07-30-v6-settings-3https://lycheeorg.github.io/2024-08-02-v6-settings-4https://lycheeorg.github.io/2024-08-03-v6-usershttps://lycheeorg.github.io/2024-08-04-v6-diagnosticshttps://lycheeorg.github.io/2024-08-05-v6-jobshttps://lycheeorg.github.io/2024-08-08-v6-maintenancehttps://lycheeorg.github.io/2024-08-09-v6-light-modehttps://lycheeorg.github.io/2024-08-10-v6-move-album-panelhttps://lycheeorg.github.io/2024-08-11-v6-transfer-album-panelhttps://lycheeorg.github.io/2024-08-14-v6-share-album-panelhttps://lycheeorg.github.io/2024-08-17-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-18-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-27-v6-edit-photohttps://lycheeorg.github.io/2024-08-31-v6-helphttps://lycheeorg.github.io/2024-09-14-v6-settingshttps://lycheeorg.github.io/2024-09-15-v6-menushttps://lycheeorg.github.io/2024-09-23-v6-multiplehttps://lycheeorg.github.io/2024-09-24-v6-framehttps://lycheeorg.github.io/2024-09-24-v6-oauthhttps://lycheeorg.github.io/2024-09-24-v6-scramblehttps://lycheeorg.github.io/2024-09-25-v6-maphttps://lycheeorg.github.io/2024-09-29-v6-alphahttps://lycheeorg.github.io/2024-09-30-v6-headerhttps://lycheeorg.github.io/2024-10-05-v6-betahttps://lycheeorg.github.io/2024-10-07-v6-beta2https://lycheeorg.github.io/bloghttps://lycheeorg.github.io/blog/2https://lycheeorg.github.io/blog/3https://lycheeorg.github.io/blog/4https://lycheeorg.github.io/blog/5https://lycheeorg.github.io/category/active-developmenthttps://lycheeorg.github.io/category/active-development/2https://lycheeorg.github.io/category/active-development/3https://lycheeorg.github.io/category/active-development/4https://lycheeorg.github.io/category/api-documentationhttps://lycheeorg.github.io/category/futurehttps://lycheeorg.github.io/category/livewirehttps://lycheeorg.github.io/get-supporter-editionhttps://lycheeorg.github.io/licensehttps://lycheeorg.github.io/supporthttps://lycheeorg.github.io/tag/apihttps://lycheeorg.github.io/tag/clockworkhttps://lycheeorg.github.io/tag/documentationhttps://lycheeorg.github.io/tag/front-endhttps://lycheeorg.github.io/tag/hprofhttps://lycheeorg.github.io/tag/livewirehttps://lycheeorg.github.io/tag/lycheehttps://lycheeorg.github.io/tag/lychee/2https://lycheeorg.github.io/tag/lychee/3https://lycheeorg.github.io/tag/lychee/4https://lycheeorg.github.io/tag/lychee/5https://lycheeorg.github.io/tag/scramblehttps://lycheeorg.github.io/tag/v5https://lycheeorg.github.io/tag/v6https://lycheeorg.github.io/tag/v6/2https://lycheeorg.github.io/tag/v6/3https://lycheeorg.github.io/tag/v6/4https://lycheeorg.github.io/tag/v6/5https://lycheeorg.github.io/tag/vuejshttps://lycheeorg.github.io/tag/vuejs/2https://lycheeorg.github.io/tag/vuejs/3https://lycheeorg.github.io/tag/vuejs/4 \ No newline at end of file +https://lycheeorg.github.iohttps://lycheeorg.github.io/2024-06-25-performance-problemshttps://lycheeorg.github.io/2024-06-29-future-of-lycheehttps://lycheeorg.github.io/2024-07-02-v6-landing-pagehttps://lycheeorg.github.io/2024-07-06-v6-abouthttps://lycheeorg.github.io/2024-07-07-v6-gallery-1https://lycheeorg.github.io/2024-07-09-v6-gallery-2https://lycheeorg.github.io/2024-07-12-v6-gallery-3https://lycheeorg.github.io/2024-07-13-v6-gallery-4https://lycheeorg.github.io/2024-07-16-v6-album-1https://lycheeorg.github.io/2024-07-17-v6-album-2https://lycheeorg.github.io/2024-07-18-v6-tests-1https://lycheeorg.github.io/2024-07-21-v6-tests-2https://lycheeorg.github.io/2024-07-23-v6-tests-3https://lycheeorg.github.io/2024-07-24-v6-profile-1https://lycheeorg.github.io/2024-07-26-v6-profile-2https://lycheeorg.github.io/2024-07-28-v6-settings-1https://lycheeorg.github.io/2024-07-29-v6-settings-2https://lycheeorg.github.io/2024-07-30-v6-settings-3https://lycheeorg.github.io/2024-08-02-v6-settings-4https://lycheeorg.github.io/2024-08-03-v6-usershttps://lycheeorg.github.io/2024-08-04-v6-diagnosticshttps://lycheeorg.github.io/2024-08-05-v6-jobshttps://lycheeorg.github.io/2024-08-08-v6-maintenancehttps://lycheeorg.github.io/2024-08-09-v6-light-modehttps://lycheeorg.github.io/2024-08-10-v6-move-album-panelhttps://lycheeorg.github.io/2024-08-11-v6-transfer-album-panelhttps://lycheeorg.github.io/2024-08-14-v6-share-album-panelhttps://lycheeorg.github.io/2024-08-17-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-18-v6-upload-dialoghttps://lycheeorg.github.io/2024-08-27-v6-edit-photohttps://lycheeorg.github.io/2024-08-31-v6-helphttps://lycheeorg.github.io/2024-09-14-v6-settingshttps://lycheeorg.github.io/2024-09-15-v6-menushttps://lycheeorg.github.io/2024-09-23-v6-multiplehttps://lycheeorg.github.io/2024-09-24-v6-framehttps://lycheeorg.github.io/2024-09-24-v6-oauthhttps://lycheeorg.github.io/2024-09-24-v6-scramblehttps://lycheeorg.github.io/2024-09-25-v6-maphttps://lycheeorg.github.io/2024-09-29-v6-alphahttps://lycheeorg.github.io/2024-09-30-v6-headerhttps://lycheeorg.github.io/2024-10-05-v6-betahttps://lycheeorg.github.io/2024-10-07-v6-beta2https://lycheeorg.github.io/2024-10-14-v6-beta3https://lycheeorg.github.io/bloghttps://lycheeorg.github.io/blog/2https://lycheeorg.github.io/blog/3https://lycheeorg.github.io/blog/4https://lycheeorg.github.io/blog/5https://lycheeorg.github.io/category/active-developmenthttps://lycheeorg.github.io/category/active-development/2https://lycheeorg.github.io/category/active-development/3https://lycheeorg.github.io/category/active-development/4https://lycheeorg.github.io/category/api-documentationhttps://lycheeorg.github.io/category/futurehttps://lycheeorg.github.io/category/livewirehttps://lycheeorg.github.io/get-supporter-editionhttps://lycheeorg.github.io/licensehttps://lycheeorg.github.io/supporthttps://lycheeorg.github.io/tag/apihttps://lycheeorg.github.io/tag/clockworkhttps://lycheeorg.github.io/tag/documentationhttps://lycheeorg.github.io/tag/front-endhttps://lycheeorg.github.io/tag/hprofhttps://lycheeorg.github.io/tag/livewirehttps://lycheeorg.github.io/tag/lycheehttps://lycheeorg.github.io/tag/lychee/2https://lycheeorg.github.io/tag/lychee/3https://lycheeorg.github.io/tag/lychee/4https://lycheeorg.github.io/tag/lychee/5https://lycheeorg.github.io/tag/scramblehttps://lycheeorg.github.io/tag/v5https://lycheeorg.github.io/tag/v6https://lycheeorg.github.io/tag/v6/2https://lycheeorg.github.io/tag/v6/3https://lycheeorg.github.io/tag/v6/4https://lycheeorg.github.io/tag/v6/5https://lycheeorg.github.io/tag/vuejshttps://lycheeorg.github.io/tag/vuejs/2https://lycheeorg.github.io/tag/vuejs/3https://lycheeorg.github.io/tag/vuejs/4https://lycheeorg.github.io/tag/vuejs/5 \ No newline at end of file diff --git a/support/index.html b/support/index.html index ae37d91c..939ea84d 100644 --- a/support/index.html +++ b/support/index.html @@ -1 +1 @@ -Lychee - Supporting Lychee

About Us.

We aim to maintain a free open-source photography library with high quality of code.
Being in control of our own data, our own pictures is something that we value above all.

Caos Image

Statistics.

2018
Started
2
Devs
40K
Lines of Code

Meet the team

A bird.

ildyria (Benoît Viguier)

Main dev.

A bird.

d7415 (Martin Stone)

Main reviewer.

Our values

LycheeOrg is not just producing a photo gallery,
it is also about adopting a culture of excelence.

High quality software

We pride ourselves into applying best practices in software development. This includes testing, static analysis, proper design pattern & architecture.

Open

To encourage active collaboration, Lychee strongly encourages pull requests, not just bug reports. We are also open to suggestions and new ideas for future improvements.

Ethical Practices

Lychee is all about statying in control of your data. The gallery comes out of the box without any analytics or other tracking mechanism. Your privacy is one of our priority.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on opencollective or on GitHub.

Past Contributors

We would like to thank all the contributors that helped us in the past.

A bird.

kamil4 (Kamil Iskra)

Top contributor

A bird.

nagmat84 (Matthias Nagel)

Rock star

A bird.

electerious (Tobias Reich)

Creator

A bird.

qwerty287

Top contributor

A bird.

tmp-hallenser

A bird.

LudovicRousseau

A bird.

roblandry

A bird.

alex-phillips

A bird.

hermzz (Hermann Käser)

A bird.

clementlamoureux

A bird.

bennetscience (Brian)

\ No newline at end of file +Lychee - Supporting Lychee

About Us.

We aim to maintain a free open-source photography library with high quality of code.
Being in control of our own data, our own pictures is something that we value above all.

Caos Image

Statistics.

2018
Started
2
Devs
40K
Lines of Code

Meet the team

A bird.

ildyria (Benoît Viguier)

Main dev.

A bird.

d7415 (Martin Stone)

Main reviewer.

Our values

LycheeOrg is not just producing a photo gallery,
it is also about adopting a culture of excelence.

High quality software

We pride ourselves into applying best practices in software development. This includes testing, static analysis, proper design pattern & architecture.

Open

To encourage active collaboration, Lychee strongly encourages pull requests, not just bug reports. We are also open to suggestions and new ideas for future improvements.

Ethical Practices

Lychee is all about statying in control of your data. The gallery comes out of the box without any analytics or other tracking mechanism. Your privacy is one of our priority.

Support us!

If you are using Lychee, a small token of gratitude will go a long way. You can support further development of Lychee on GitHub.

Past Contributors

We would like to thank all the contributors that helped us in the past.

A bird.

kamil4 (Kamil Iskra)

Top contributor

A bird.

nagmat84 (Matthias Nagel)

Rock star

A bird.

electerious (Tobias Reich)

Creator

A bird.

qwerty287

Top contributor

A bird.

tmp-hallenser

A bird.

LudovicRousseau

A bird.

roblandry

A bird.

alex-phillips

A bird.

hermzz (Hermann Käser)

A bird.

clementlamoureux

A bird.

bennetscience (Brian)

\ No newline at end of file diff --git a/tag/api/index.html b/tag/api/index.html index 1e152fe6..0fa84261 100644 --- a/tag/api/index.html +++ b/tag/api/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'api'

Tag: api

\ No newline at end of file +Lychee - Posts by tag 'api'

Tag: api

\ No newline at end of file diff --git a/tag/clockwork/index.html b/tag/clockwork/index.html index 0a892f4f..548ae1b3 100644 --- a/tag/clockwork/index.html +++ b/tag/clockwork/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'clockwork'

Tag: clockwork

\ No newline at end of file +Lychee - Posts by tag 'clockwork'

Tag: clockwork

\ No newline at end of file diff --git a/tag/documentation/index.html b/tag/documentation/index.html index 0ad6eb03..655baa70 100644 --- a/tag/documentation/index.html +++ b/tag/documentation/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'documentation'

Tag: documentation

\ No newline at end of file +Lychee - Posts by tag 'documentation'

Tag: documentation

\ No newline at end of file diff --git a/tag/front-end/index.html b/tag/front-end/index.html index c7d917b3..07aeb70e 100644 --- a/tag/front-end/index.html +++ b/tag/front-end/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'front-end'

Tag: front-end

\ No newline at end of file +Lychee - Posts by tag 'front-end'

Tag: front-end

\ No newline at end of file diff --git a/tag/hprof/index.html b/tag/hprof/index.html index 3e60ecae..3390e357 100644 --- a/tag/hprof/index.html +++ b/tag/hprof/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'hprof'

Tag: hprof

\ No newline at end of file +Lychee - Posts by tag 'hprof'

Tag: hprof

\ No newline at end of file diff --git a/tag/livewire/index.html b/tag/livewire/index.html index cb52bb95..4208a19c 100644 --- a/tag/livewire/index.html +++ b/tag/livewire/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'livewire'

Tag: livewire

\ No newline at end of file +Lychee - Posts by tag 'livewire'

Tag: livewire

\ No newline at end of file diff --git a/tag/lychee/2/index.html b/tag/lychee/2/index.html index 5e1a7516..a4ff8d93 100644 --- a/tag/lychee/2/index.html +++ b/tag/lychee/2/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'lychee' — Page 2

Tag: lychee

\ No newline at end of file +Lychee - Posts by tag 'lychee' — Page 2

Tag: lychee

\ No newline at end of file diff --git a/tag/lychee/3/index.html b/tag/lychee/3/index.html index 2b565fa8..974537f7 100644 --- a/tag/lychee/3/index.html +++ b/tag/lychee/3/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'lychee' — Page 3

Tag: lychee

\ No newline at end of file +Lychee - Posts by tag 'lychee' — Page 3

Tag: lychee

\ No newline at end of file diff --git a/tag/lychee/4/index.html b/tag/lychee/4/index.html index 4b2cf7b1..c3a9413c 100644 --- a/tag/lychee/4/index.html +++ b/tag/lychee/4/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'lychee' — Page 4

Tag: lychee

\ No newline at end of file +Lychee - Posts by tag 'lychee' — Page 4

Tag: lychee

\ No newline at end of file diff --git a/tag/lychee/5/index.html b/tag/lychee/5/index.html index d0ead49f..b8ca472d 100644 --- a/tag/lychee/5/index.html +++ b/tag/lychee/5/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'lychee' — Page 5

Tag: lychee

\ No newline at end of file +Lychee - Posts by tag 'lychee' — Page 5

Tag: lychee

\ No newline at end of file diff --git a/tag/lychee/index.html b/tag/lychee/index.html index 3cb15c30..836340ce 100644 --- a/tag/lychee/index.html +++ b/tag/lychee/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'lychee'

Tag: lychee

\ No newline at end of file +Lychee - Posts by tag 'lychee'

Tag: lychee

\ No newline at end of file diff --git a/tag/scramble/index.html b/tag/scramble/index.html index 23c743bf..60ded937 100644 --- a/tag/scramble/index.html +++ b/tag/scramble/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'scramble'

Tag: scramble

\ No newline at end of file +Lychee - Posts by tag 'scramble'

Tag: scramble

\ No newline at end of file diff --git a/tag/v5/index.html b/tag/v5/index.html index d2738619..1eeadc17 100644 --- a/tag/v5/index.html +++ b/tag/v5/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'v5'

Tag: v5

\ No newline at end of file +Lychee - Posts by tag 'v5'

Tag: v5

\ No newline at end of file diff --git a/tag/v6/2/index.html b/tag/v6/2/index.html index 154c326e..efa3519a 100644 --- a/tag/v6/2/index.html +++ b/tag/v6/2/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'v6' — Page 2

Tag: v6

\ No newline at end of file +Lychee - Posts by tag 'v6' — Page 2

Tag: v6

\ No newline at end of file diff --git a/tag/v6/3/index.html b/tag/v6/3/index.html index b1bfb456..296dd00d 100644 --- a/tag/v6/3/index.html +++ b/tag/v6/3/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'v6' — Page 3

Tag: v6

\ No newline at end of file +Lychee - Posts by tag 'v6' — Page 3

Tag: v6

\ No newline at end of file diff --git a/tag/v6/4/index.html b/tag/v6/4/index.html index 449181b9..ec4c59ca 100644 --- a/tag/v6/4/index.html +++ b/tag/v6/4/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'v6' — Page 4

Tag: v6

\ No newline at end of file +Lychee - Posts by tag 'v6' — Page 4

Tag: v6

\ No newline at end of file diff --git a/tag/v6/5/index.html b/tag/v6/5/index.html index 1d1af0a5..196391cf 100644 --- a/tag/v6/5/index.html +++ b/tag/v6/5/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'v6' — Page 5

Tag: v6

\ No newline at end of file +Lychee - Posts by tag 'v6' — Page 5

Tag: v6

\ No newline at end of file diff --git a/tag/v6/index.html b/tag/v6/index.html index 96d6aeb7..f182cc11 100644 --- a/tag/v6/index.html +++ b/tag/v6/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'v6'

Tag: v6

\ No newline at end of file +Lychee - Posts by tag 'v6'

Tag: v6

\ No newline at end of file diff --git a/tag/vuejs/2/index.html b/tag/vuejs/2/index.html index 2682cfb6..bf26669c 100644 --- a/tag/vuejs/2/index.html +++ b/tag/vuejs/2/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'vuejs' — Page 2

Tag: vuejs

\ No newline at end of file +Lychee - Posts by tag 'vuejs' — Page 2

Tag: vuejs

\ No newline at end of file diff --git a/tag/vuejs/3/index.html b/tag/vuejs/3/index.html index 2b741218..39823912 100644 --- a/tag/vuejs/3/index.html +++ b/tag/vuejs/3/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'vuejs' — Page 3

Tag: vuejs

\ No newline at end of file +Lychee - Posts by tag 'vuejs' — Page 3

Tag: vuejs

\ No newline at end of file diff --git a/tag/vuejs/4/index.html b/tag/vuejs/4/index.html index 3d261fba..007e4703 100644 --- a/tag/vuejs/4/index.html +++ b/tag/vuejs/4/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'vuejs' — Page 4

Tag: vuejs

\ No newline at end of file +Lychee - Posts by tag 'vuejs' — Page 4

Tag: vuejs

\ No newline at end of file diff --git a/tag/vuejs/5/index.html b/tag/vuejs/5/index.html new file mode 100644 index 00000000..1fb88c97 --- /dev/null +++ b/tag/vuejs/5/index.html @@ -0,0 +1 @@ +Lychee - Posts by tag 'vuejs' — Page 5

Tag: vuejs

\ No newline at end of file diff --git a/tag/vuejs/index.html b/tag/vuejs/index.html index 2a84b52b..14e1f9f8 100644 --- a/tag/vuejs/index.html +++ b/tag/vuejs/index.html @@ -1 +1 @@ -Lychee - Posts by tag 'vuejs'

Tag: vuejs

\ No newline at end of file +Lychee - Posts by tag 'vuejs'

Tag: vuejs

\ No newline at end of file